Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
391 commits
Select commit Hold shift + click to select a range
f99c647
fix(ingestion-consumer): bound and parallelize worker readiness probes
jose-sequeira Aug 26, 2026
6891935
chore(ingestion-consumer): cover passive health on failed sends
jose-sequeira Aug 26, 2026
20b82a7
chore(ci): install protoc for the rust ingestion consumer e2e job
jose-sequeira Aug 26, 2026
1801193
Merge branch 'master' into posthog/task-run-panel-debug-logs-toggle
skoob13 Aug 26, 2026
43d52c1
fix(bigquery): close backtick before INFORMATION_SCHEMA in get_columns
Gilbert09 Aug 26, 2026
f8db51b
fix(ingestion-consumer): fence lane on oldest un-acked sub-batch dead…
posthog[bot] Aug 26, 2026
a9c1272
chore(devex): drop the get_model recipe for core test fixtures
webjunkie Aug 26, 2026
fb7493f
perf(ingestion-consumer): use Arc<str> for the lane worker metric label
posthog[bot] Aug 26, 2026
d706a41
Merge branch 'master' into posthog/rename-reviewhog-to-posthog-review
sortafreel Aug 26, 2026
510f7fc
fix(ingestion-consumer): keep fenced lanes ordered under out-of-order…
jose-sequeira Aug 26, 2026
6468cd4
Merge branch 'master' into tom/integration-secrets-request-logging
Gilbert09 Aug 26, 2026
4b0e9d4
feat(data-warehouse): scaffold Lovable and Zenchef sources
Gilbert09 Aug 26, 2026
d0ab04a
chore: update OpenAPI generated types
tests-posthog[bot] Aug 26, 2026
fdb5272
Merge branch 'master' into tom/integration-secrets-request-logging
Gilbert09 Aug 26, 2026
fdd8011
Merge branch 'master' into posthog/scaffold-lovable-zenchef-sources
Gilbert09 Aug 26, 2026
07b177c
Merge branch 'master' into tom/integration-secrets-request-logging
Gilbert09 Aug 26, 2026
e408d46
fix(data-warehouse): regenerate Kea logic types for Lovable and Zenchef
Gilbert09 Aug 26, 2026
f357846
fix(posthog_ai): give the NonStaff story a box to screenshot
skoob13 Aug 26, 2026
193b0b5
chore(phai): document how products integrate with posthog ai
skoob13 Aug 26, 2026
328ea9e
fix(data-warehouse): write warehouse group properties directly instea…
Gilbert09 Aug 26, 2026
afed8f2
Merge branch 'master' into posthog/scaffold-lovable-zenchef-sources
Gilbert09 Aug 26, 2026
30b1429
Merge remote-tracking branch 'origin/master' into worktree-phai-integ…
skoob13 Aug 26, 2026
f2ff8ed
Merge branch 'master' into posthog/rename-reviewhog-to-posthog-review
sortafreel Aug 26, 2026
7cc980c
chore(phai): tighten the integration skill from review
skoob13 Aug 26, 2026
af53210
fix(data-warehouse): send group property updates through capture with…
Gilbert09 Aug 26, 2026
d6b4ce0
chore(deps): Update posthog-js to 1.420.0
posthog-js-upgrader[bot] Aug 26, 2026
97bb476
Merge master into posthog/scaffold-lovable-zenchef-sources
Gilbert09 Aug 26, 2026
5bbceb4
feat(replay): collect images from more replay fields
robbie-c Aug 26, 2026
2b81d48
Merge remote-tracking branch 'origin/master' into codex/expand-replay…
robbie-c Aug 26, 2026
5f1fd61
chore(visual): update storybook baselines
posthog[bot] Aug 26, 2026
3279962
fix(ingestion-consumer): enqueue lane sends under the dispatcher lock
jose-sequeira Aug 26, 2026
afa3eed
Merge master into posthog/scaffold-lovable-zenchef-sources
Gilbert09 Aug 26, 2026
136ceff
feat(replay): measure image references by property
robbie-c Aug 26, 2026
93872f5
Merge remote-tracking branch 'origin/master' into codex/expand-replay…
robbie-c Aug 26, 2026
815dbc4
chore(ingestion-consumer): split the lane stream loop along its seams
jose-sequeira Aug 26, 2026
854af2a
fix(support): point "Request a feature" at the idea form
joethreepwood Aug 26, 2026
fe10ff2
fix(replay): scrub images in CSS custom properties
robbie-c Aug 26, 2026
6103dd7
Merge branch 'master' into posthog/support-request-feature-deep-link
joethreepwood Aug 26, 2026
46e0171
fix(session-replay): count scrub time in poison budget
robbie-c Aug 26, 2026
493df25
chore(devex): keep the fixture guidance generic and on one sentence p…
webjunkie Aug 26, 2026
b9b4e63
chore(devex): point the scan's fixture guidance at the facade too
webjunkie Aug 26, 2026
3ac6fb3
chore(review-hog): move desktop feed hint rename to its own PR
sortafreel Aug 26, 2026
c446391
Merge branch 'master' into posthog/subscription-wizard
MattPua Aug 26, 2026
9be5056
Merge branch 'master' of https://github.com/PostHog/posthog into reec…
ReeceJones Aug 26, 2026
c12c7fa
revert snapshot change
ReeceJones Aug 26, 2026
a156d47
Merge master into posthog/scaffold-lovable-zenchef-sources
Gilbert09 Aug 26, 2026
51ead5b
Merge branch 'master' into reece/fix-other-table-property-access-control
ReeceJones Aug 26, 2026
20e1146
chore(devex): make the test-import guidance module-aware and pin the …
webjunkie Aug 26, 2026
b14ff0c
fix(cdp): hide destinations empty state when batch exports exist
rossgray Aug 26, 2026
2d77ed9
Merge branch 'master' into posthog/support-request-feature-deep-link
joethreepwood Aug 26, 2026
e09241e
chore(visual): update storybook baselines
posthog[bot] Aug 26, 2026
f20b971
Merge branch 'master' into posthog/cohort-run-cleanup
gustavohstrassburger Aug 26, 2026
ec7487a
fix(subscriptions): initialize wizard logic with props
MattPua Aug 26, 2026
b93cb5d
chore(ingestion-consumer): rename gRPC lanes to worker streams
jose-sequeira Aug 26, 2026
b1d8e76
test(backend): update query snapshots
tests-posthog[bot] Aug 26, 2026
9a819e2
Merge master into posthog/scaffold-lovable-zenchef-sources
Gilbert09 Aug 26, 2026
34a9d57
fix(ingestion-consumer): split oversized sub-batches on the gRPC stream
jose-sequeira Aug 26, 2026
ee3ba0c
chore(mcp): satisfy oxlint in the skill telemetry integration test
DanielVisca Aug 26, 2026
320987e
Merge remote-tracking branch 'origin/master' into wt/feat-signals-sla…
andrewm4894 Aug 26, 2026
64a4e0e
Merge remote-tracking branch 'origin/master' into batch-exports/surfa…
tomasfarias Aug 26, 2026
0962383
fix(data-warehouse): make the custom REST source findable by "http" a…
Gilbert09 Aug 26, 2026
16cea5b
chore(mcp): say why the skill telemetry e2e test never runs in CI
DanielVisca Aug 26, 2026
a5a9477
fix(data-quality): withhold suite check runs that read a denied subject
thiagosalvatore Aug 20, 2026
7a84ed1
chore(data-quality): drop redundant test helper docstring
posthog[bot] Aug 26, 2026
3fd706d
fix(data-quality): judge a run's history by what it could read, not w…
thiagosalvatore Aug 26, 2026
cc90a9d
Merge branch 'master' into posthog/mcp-skill-usage-telemetry
DanielVisca Aug 26, 2026
2502173
Merge branch 'master' into posthog/subscription-wizard
MattPua Aug 26, 2026
5c80821
Merge branch 'master' into reece/fix-other-table-property-access-control
ReeceJones Aug 26, 2026
7de0293
Merge branch 'master' into posthog/rename-reviewhog-to-posthog-review
sortafreel Aug 26, 2026
f17cbf7
Merge branch 'master' into tom/integration-secrets-request-logging
Gilbert09 Aug 26, 2026
2bb97f2
Merge branch 'master' into posthog/support-request-feature-deep-link
joethreepwood Aug 26, 2026
6d8770e
Merge branch 'master' into posthog/fix-bigquery-information-schema-ba…
Gilbert09 Aug 26, 2026
8256bd3
Merge master into posthog/scaffold-lovable-zenchef-sources
Gilbert09 Aug 26, 2026
8c7b154
test(backend): update query snapshots
tests-posthog[bot] Aug 26, 2026
fa4ce4c
Merge branch 'master' into posthog-js-upgrade
turnipdabeets Aug 26, 2026
7e4ae03
fix(hogli): keep uv's dist/.gitignore out of the release
rnegron Aug 26, 2026
4f5a7d5
chore(mcp): regenerate the taxonomy JSON for the new skill properties
DanielVisca Aug 26, 2026
716662b
fix(mcp-analytics): draw tool session buckets per tool, not from one …
DanielVisca Aug 26, 2026
0a360f5
fix(desktop): give onboarding concierge read access
adboio Aug 26, 2026
8599f21
fix(desktop): hand off unsupported onboarding changes
adboio Aug 26, 2026
a6d8491
fix(desktop): route onboarding through posthog exec
adboio Aug 26, 2026
bd0feca
fix(desktop): document posthog exec in cloud prompts
adboio Aug 26, 2026
9680e30
fix(desktop): simplify onboarding mcp guidance
adboio Aug 26, 2026
56c14d0
fix(desktop): document onboarding mcp call flow
adboio Aug 26, 2026
5fcec32
fix(desktop): ground concierge answers in docs
adboio Aug 26, 2026
31497ca
fix(desktop): order concierge guidance clearly
adboio Aug 26, 2026
4e4a541
Merge branch 'master' into posthog/mcp-intent-clustering-representation
DanielVisca Aug 26, 2026
d93748e
feat(deletions): dispatch each target to the cluster that stores it
orian Aug 26, 2026
65c0a5b
test(backend): update query snapshots
tests-posthog[bot] Aug 26, 2026
60729b3
test(backend): update query snapshots
tests-posthog[bot] Aug 26, 2026
f8b7087
Merge branch 'master' into tom/dwh-group-props-direct-write
Gilbert09 Aug 26, 2026
9cf1649
feat(data-warehouse): sync id-like binary columns as hex on the arrow…
danielcarletti Aug 26, 2026
ad7c88b
Merge branch 'master' into claude/bigquery-schema-sync-d56bc0
danielcarletti Aug 26, 2026
753e4d3
Merge branch 'master' into posthog/cohort-run-cleanup
gustavohstrassburger Aug 26, 2026
700a721
Merge remote-tracking branch 'origin/master' into wt/feat-signals-sla…
andrewm4894 Aug 26, 2026
7a418b7
chore(deps): Update posthog-go to 1.24.2
posthog-js-upgrader[bot] Aug 26, 2026
6c53307
Merge branch 'master' into tom/integration-secrets-request-logging
Gilbert09 Aug 26, 2026
edae558
fix(subscriptions): show tabbed stories
MattPua Aug 26, 2026
0adfe94
test(backend): update query snapshots
tests-posthog[bot] Aug 26, 2026
36333b6
Merge branch 'master' into posthog/dwh-custom-source-search-keywords
Gilbert09 Aug 26, 2026
ca75231
Merge remote-tracking branch 'origin/master' into wt/feat-signals-sla…
andrewm4894 Aug 26, 2026
ba2b502
fix(visual-review): heal only baselines the run rendered
webjunkie Aug 26, 2026
df456f5
fix(visual-review): read the baseline at the commit under test
webjunkie Aug 26, 2026
3bd71da
feat(error-tracking): polish issue metadata controls
hpouillot Aug 25, 2026
91eea22
feat(error-tracking): refine issue list volume metadata
hpouillot Aug 26, 2026
b67e0c3
feat(error-tracking): refine assignee menus
hpouillot Aug 26, 2026
9e98b0e
chore(visual): update storybook baselines
posthog[bot] Aug 26, 2026
6090659
fix(error-tracking): isolate issue assignee picker
hpouillot Aug 26, 2026
92c2923
fix(error-tracking): update assignee logic types
hpouillot Aug 26, 2026
f39e43c
chore(visual): update storybook baselines
posthog[bot] Aug 26, 2026
88191fa
chore(visual): restore storybook baselines
hpouillot Aug 26, 2026
ff33044
chore(visual): update storybook baselines
posthog[bot] Aug 26, 2026
0a1bf95
refactor(cdp): derive destinations list and empty state from one sour…
rossgray Aug 26, 2026
adc89df
chore: auto-resolve conflicts with master
MattPua Aug 26, 2026
c10a5b7
fix(visual-review): compare from the ref the baseline was read at
webjunkie Aug 26, 2026
d8053ad
refactor(cdp): inline the destinations empty-state check
rossgray Aug 26, 2026
243e9da
Merge branch 'master' into codex/expand-replay-image-sources
robbie-c Aug 26, 2026
e2deffe
Merge branch 'master' into codex/fix-image-scrub-poison-budget
robbie-c Aug 26, 2026
1be2b29
feat(feature-flags): expose approval change request on scheduled changes
JamesPatrickGill Aug 24, 2026
ceb97de
feat(feature-flags): show approval state on the flag schedule tab
JamesPatrickGill Aug 24, 2026
0362d07
fix(feature-flags): tag denied approvals on recurring schedules
JamesPatrickGill Aug 24, 2026
5100b5f
fix(feature-flags): pending-approval toast for paired schedules, revi…
JamesPatrickGill Aug 25, 2026
d39aa26
fix(visual-review): keep the removal gate outside the merge queue
webjunkie Aug 26, 2026
785352e
fix(feature-flags): add change_request to edit-logic test fixture
JamesPatrickGill Aug 26, 2026
4c1ba5a
chore(visual): update storybook baselines
posthog[bot] Aug 26, 2026
10fd0d0
fix(replay): continue CSS scan after escaped URL
robbie-c Aug 26, 2026
e189cc6
fix(dashboards): filter dashboards by clicked tag
MattPua Aug 26, 2026
6c55919
fix(data-quality): judge run history by identity, not by a name anyon…
thiagosalvatore Aug 26, 2026
b3dadc9
chore(data-warehouse): fold the three binary hex conversions into one…
danielcarletti Aug 26, 2026
e787e11
fix(replay): bound malformed CSS recovery
robbie-c Aug 26, 2026
0c4acf8
fix(signals): expire delivery renders and post with the current Slack…
andrewm4894 Aug 26, 2026
eccb959
fix(tasks): stop showing "Keeping CI green" when the loop is off
tatoalo Aug 26, 2026
643b20a
feat(batch-exports): filter runs by status in the API
rossgray Aug 26, 2026
667dcfb
chore(batch-exports): explain why ordering is read off the request
rossgray Aug 26, 2026
8b14f60
chore(batch-exports): label the assertions in the status filter test
rossgray Aug 26, 2026
144af81
test(batch-exports): cover date filters ignoring the other ordering's…
rossgray Aug 26, 2026
691fa11
fixup: use a physically realistic run in the date-filter test
rossgray Aug 26, 2026
a543345
test(batch-exports): add ordering coverage to the date-filter test
rossgray Aug 26, 2026
eb5e3bb
feat(batch-exports): filter runs by status in the UI
rossgray Aug 26, 2026
b06ef49
feat(batch-exports): fold billing into failed and simplify group labels
rossgray Aug 26, 2026
9063d78
fix(batch-exports): make the runs Storybook mock honor the status filter
rossgray Aug 26, 2026
ad8e058
chore(visual): update storybook baselines
posthog[bot] Aug 26, 2026
8a2cd1f
fix(annotations): accept a soft-deleted parent only when it is alread…
phillram Aug 26, 2026
480a52f
chore(data-warehouse): convert binary keys chunk by chunk
danielcarletti Aug 26, 2026
498a4ef
Merge branch 'master' into claude/bigquery-schema-sync-d56bc0
danielcarletti Aug 26, 2026
da6285a
refactor(access-control): rename the flag to read_only_mcp_access
a-lider Aug 26, 2026
6be1364
chore(tasks): bake a warm rust target dir into the dev-stack image
tatoalo Aug 26, 2026
7a18fa2
Merge remote-tracking branch 'origin/master' into alex/feat/access-ce…
a-lider Aug 26, 2026
1721a61
Merge master into posthog/scaffold-lovable-zenchef-sources
Gilbert09 Aug 26, 2026
e20c369
fix(data-warehouse): keep wide binary keys on 64-bit offsets when hex…
danielcarletti Aug 26, 2026
ce1b4bc
Merging b398c8d6598d032ccd01b3c0c010b2d990c9eef5 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
ea1b7e1
Merging f8b7087d9748937ce482cdc8b5dab4e825084213 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
03cc5e7
Merging 64a4e0e54d713397fa07bb67ceb1c90f5090873a into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
fc20940
Merging a4e5fcd891e3fd41f19f20ecb07fd2b4442a274b into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
076faac
Merging fc20940954e50271d0ee2efc61a5c45f4e6f21a0 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
580dab6
Merging 31497cae243498a6b9740bacbcff21db34c25d27 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
d790dbb
Merging 154d1cec870368d50121bd16bedfffdc3f0839c5 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
c901de3
Merging d39aa26c0dbc29286ac79045f9f1e151743e2a3e into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
a7f18d2
fix(mcp): record the skill only when the read succeeded
DanielVisca Aug 26, 2026
e6e0a3c
Merge branch 'master' into posthog/dwh-custom-source-search-keywords
Gilbert09 Aug 26, 2026
07b398e
Merging d790dbb636a99a81fe240e4e643128eb7d4b2f35 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
86bb32b
Merging ea1b7e1f3071a4dd4424b707de80430487cd6a2d into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
123e337
Merging c901de3c2380daae0b84ff2a3d1b11733d7d4a72 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
82bcad9
Merging e787e11cd948b47cf828beabc79393da21cac5ce into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
fb3d9aa
Merging 7a418b7b4e80fb7217f109ed9f362c61bb4e4bbd into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
270bf3c
Merging fb3d9aad4196394ca96ee594432229844feeb007 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
8c41d6c
Merging 7e4ae03bb155cccc1a94f02e0aed080693992cbc into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
f921034
Merging 45b45384922d9c2f84ad5112eba1b7a58fcc171b into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
3031894
Merging f9210348a3f5017eb367dff7407243e8e6ae7dff into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
08e3ef8
Merging 6c53307f44007bffbc31adb87e3e9fb8019e7bae into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
442e8be
Merging 6d8770ecb90dd82ea9545b46dca933a8f0aa666c into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
91ab38a
test(backend): update query snapshots
tests-posthog[bot] Aug 26, 2026
bbc761d
Merging 442e8be2b8283d180a99a2ac1f2f984b4c5dcecb into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
9f3beba
Merging e8778cf340d023e7e6d686fd41371dce09915884 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
77e55f7
Merging 0adfe94319191151c80da644cd1bb0ab9f976059 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
d91a1d6
Merging 77e55f71a4a58763b4095ecfc2d981c871e9e214 into trunk-temp/pr-7…
trunk-io[bot] Aug 26, 2026
2d0ac9e
Merging 8c7b15483a0cf500f0bb3e15c540dd4126680b03 into trunk-temp/pr-7…
trunk-io[bot] Aug 26, 2026
e3d9052
Merging d096e7d20159b5b0bdbabc78f09ba72d30cd2ec3 into trunk-temp/pr-7…
trunk-io[bot] Aug 26, 2026
6000f77
Merging e3d90520dfd1e33a93265e88b71fba347c423fcb into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
22f39d0
Merging 7de02931cd1cea5e08b7a347807c64b2d4ee572b into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
8bc0faa
Merging 5f1fd61c919dd534f1fce63ae8f5574d5c5f447a into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
2548edd
Merging 8bc0faa8099853b21216679ad814f0d93d6a707b into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
fd607eb
Merging b453016d4803bd9ccce17a251468de8458dbcc91 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
48b8ade
Merging ce5e3d48774f3be035c0e79ba7bf31bfdb19298a into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
b18d813
Merging 48b8ade1818ddbbbf1db18de512ad802e384369c into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
5efd8b7
Merging 34a9d573aa165e399c13121670c25bd3801ee001 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
6cbc3fd
Merging adc89dfa0d9f9f9eae6ba8084d2063fc3d1c9064 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
5f30fbe
Merging 6cbc3fda75f180e5e1380879db5d000006818d34 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
6d0af3c
Merging 4c1ba5a76f8e3cc391ad63f0ee8a9b3971e6391e into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
eb13024
Merging 2bb97f2dd69756581970f8edd2875d145bf8065c into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
a9194d4
Merging 6cbc3fda75f180e5e1380879db5d000006818d34 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
d2567a5
Merging e2deffe9a1e1d816aa42a31c92648755e454e80b into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
639be79
Merging eb130248543b959f4dbebf2b0c012e8684b56783 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
3302dd3
Merging e189cc6979f171821dae8b49bd907c46fef302fb into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
773ebe0
fix(metrics): give the first chart bucket its whole interval
DanielVisca Aug 26, 2026
c0a5ed2
fix(data-warehouse): guard only merge keys against a binary to text c…
danielcarletti Aug 26, 2026
b289ed3
fix(rbac): fail closed in queryset filter when resource access is none
a-lider Aug 25, 2026
ae7c3ca
feat(logs): declare pattern and pattern_version in the log record schema
jonmcwest Aug 26, 2026
5e49ba9
feat(logs): stamp the masked pattern onto the log record
jonmcwest Aug 26, 2026
937833a
fix(logs,tracing): stop attribute row buttons stacking duplicate filters
jzhu13 Aug 26, 2026
c50b46e
chore(rbac): fail closed in the queryset oracle and hogql guard model
a-lider Aug 26, 2026
239623d
chore(rbac): stop test fixtures relying on the fail-open filter
a-lider Aug 26, 2026
56ed1d6
fix(search): leave out objects the user has no resource access to
a-lider Aug 26, 2026
87ea3eb
chore(engineering-analytics): drop an unused import left by the rebase
a-lider Aug 26, 2026
535d0fb
Merge branch 'master' into posthog-js-upgrade
turnipdabeets Aug 26, 2026
cccbbd8
chore(rbac): clarify comments and drop the PR reference
a-lider Aug 26, 2026
01b56ff
Merging 20e114663814981d13c932670b28df49064b0d93 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
915e4cf
Merging 0c4acf89babe194b9990c7546a47a19d507abde8 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
c2d1d90
Merging 915e4cf1cb823d77a380a8fe851cc9eaf5b64422 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
d75a972
Merging 3302dd3d18053edaa2695103f50fcbb4654e0281 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
1e3c979
Merging eccb9598c4abdbbda4a955bb2b0fb5a02fbe9f41 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
b22c81e
Merging 1efe53707ece320b9abdf3ce5ef77ab460779eb1 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
7bfe5fd
Merging b22c81e72f6c4261330b1decdb709c571ac1af47 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
ab1d042
Merging 6c55919d65e1edec541f5f4c30c2ea40c848ef02 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
3bb25d5
Merging 8a2cd1fb55a076e70beca3259e98b6584860c870 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
2607465
Merging 3bb25d5d6368d77a32d65cee3c3f148afc661eb8 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
d250b3d
Merging ad8e0581ba9567af560d3e45a5eb6c35d492e35a into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
47d9a4b
Merging 9063d78b51ac9ee5dd801259591227facbf4f009 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
0d24f74
Merging 3bb25d5d6368d77a32d65cee3c3f148afc661eb8 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
34dc144
Merging 6be1364fcc36a08d6235222c4283f933ce7e5df5 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
205f376
Merging 47d9a4bc034ffccabee5be7ffba1be17b6db6935 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
4ef725a
Merging 34dc144ace7e4dec7a14afed1f2f0e70950ac549 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
ae5fc08
Merging 1721a6170712578d71b0de7da837245f5b711e31 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
6482e9c
Merging 7cc980c19b8dc2e45aefd2688753b8dd268e45be into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
ecacb93
Merging 6482e9c955b6865a9c03abc904604cc02e44a33c into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
aa54e49
Merging e6e0a3ca0c5155e258e9304c499c462a134883af into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
adf0b0d
Merging a7f18d265a1a319738285bf6522d25450a4ff69b into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
a886d67
Merging d2567a50bed98e6aff435ca98bf20d4e4154d8a6 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
c2bd483
Merging 5e49ba99d811db1188b4072c125cec3dd2ddee85 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
d9c1fda
fix(logs,tracing): make a redundant attribute row click a true no-op
jzhu13 Aug 26, 2026
c20e138
Merging adf0b0d8089c63d3409aa089038625bebebc4eff into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
4d8197d
Merging c2bd483e6a3cfe30e721bc800fd9e63dbc9f433a into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
2a01a55
Merging 773ebe04885d82a22b280ede60359b0c8d16769b into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
befb364
Merging acd03c0082c3940b08e6477f18112c1139dad97c into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
92d8ab7
Merging befb36465b8b49f25180be65f99de7b651df56a7 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
bb253a5
Merging befb36465b8b49f25180be65f99de7b651df56a7 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
2cc380a
Merging 4e4a5413a025f81b37a6b52c92384ab8e49f4472 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
8203e6f
Merging 742a559456d27bd54fc2d5c8591264ef087a5cde into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
1d00c86
Merging 753e4d3a32b1e9256f751562da2cb74d8c652126 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
c34b5c5
Merging 1d00c866c37bf4b31dbd9a661b7d2681308adf79 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
b851649
Merging 8203e6fb84df5f9cd41c7173a0b58600b477e433 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
f3e3178
Merging 91ab38a1af1c359cc814647ed86a9faa1257ba24 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
96c469c
Merging 535d0fbf2d55a9d6b7a42d32a7ead2ada2abfe52 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
9d0ca18
Merging 96c469c4e3e7fea7036136aaac341f4748e5a579 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
b4c02c1
Merging c0a5ed242ec566cda6f0661ddc8cc9a48381201c into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
e14084a
Merging cccbbd85225bf0b0eb8401f7869f068ba4fdd0a1 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
6e9abc8
Merging 96c469c4e3e7fea7036136aaac341f4748e5a579 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
2100436
Merging e14084ac89806c5f99b35b33006d477615d6e385 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
b06edbc
Merging 785352ea554ebcf7593ed912fe3660d5b3ec19ce into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
3d747a4
Merging d9c1fdac0522a4ff6fbc3ab0c356cbfd69dc6ae8 into trunk-temp/pr-8…
trunk-io[bot] Aug 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions .depot/workflows/ci-backend.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@
# shards fall back to the union .test_durations
# - actions/cache reads/writes route to Depot Cache, not GitHub Actions Cache,
# so shared keys with canonical (schema, uv, pnpm) do not collide
# - hypothesis constants cache: the restore and save steps mirror canonical verbatim, but the
# save only fires on master test-matrix runs and the shadow skips those, so the Depot Cache
# entry only exists after a master workflow_dispatch. Sampled PR shards run cold (they rebuild
# the pool, as canonical did before this cache existed) until then: bounded, documented, and
# harmless because the shadow never gates merges.
# - GITHUB_TOKEN / OTEL_SERVICE_NAME neutralized (ambient on Depot, not on GHA)
# - Three data-modeling tests deselected (Depot-only MinIO 403 quarantine)
# - COMPOSE_PROJECT_NAME pinned to posthog because bin/wait-for-docker filters by that
Expand Down Expand Up @@ -135,6 +140,10 @@ env:
# and HEAD (push) key computations below can't drift.
# ci-e2e-playwright.yml, ci-dagster.yml, ci-mcp.yml and ci-rust-flags-integration.yml restore by the same key; keep their copies in sync when bumping.
SCHEMA_CACHE_EPOCH: v2
# Hypothesis constants cache epoch. Bump to abandon every shared entry at once
# (key is posthog-hypothesis-constants-<version>-<epoch>-<isoyear>-<isoweek>); used by
# the Django test shards below.
HYPOTHESIS_CONSTANTS_EPOCH: v1
SECRET_KEY: '6b01eee4f945ca25045b5aab440b953461faf08693a9abbf1166dc7c6b9772da' # unsafe - for testing only
COMPOSE_PROJECT_NAME: posthog
DATABASE_URL: 'postgres://posthog:posthog@localhost:5432/posthog'
Expand Down Expand Up @@ -2005,6 +2014,37 @@ jobs:
key: posthog-segment-durations-${{ github.run_id }}
restore-keys: |
posthog-segment-durations-
- name: Compute hypothesis constants cache key
# hypothesis builds its constants pool of property-test inputs by
# AST-parsing every local module in sys.modules. It caches the result
# in .hypothesis/constants under a hash of each source file, so the
# pool is content-addressed: restoring a stale copy is safe, because a
# changed file reads as a miss and rebuilds. CI otherwise pays the full
# parse on every shard's pytest collection (about 10 s per shard).
id: hyp-constants-key
shell: bash
run: |
# The key includes the installed hypothesis version because the
# entry format is an implementation detail, and rotates weekly so
# entries for deleted or rewritten files expire. The restore prefix
# covers the gap until the first master run of a new week saves.
hyp_version=$(python -c "import hypothesis; print(hypothesis.__version__)")
prefix="posthog-hypothesis-constants-${hyp_version}-${HYPOTHESIS_CONSTANTS_EPOCH}-"
{
echo "key=${prefix}$(date -u +%G-%V)"
echo "restore_prefix=${prefix}"
} >> "$GITHUB_OUTPUT"
- name: Restore hypothesis constants cache
id: hyp-constants
uses: actions/cache/restore@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
with:
# Constants only. Do NOT add .hypothesis/examples: the example
# database decides which inputs property tests replay, so reusing
# one across runs changes what the tests check.
path: .hypothesis/constants
key: ${{ steps.hyp-constants-key.outputs.key }}
restore-keys: |
${{ steps.hyp-constants-key.outputs.restore_prefix }}
# Tests
- name: Set snapshot update flags
if: ${{ needs.changes.outputs.backend == 'true' && (needs.detect-snapshot-mode.outputs.mode == 'update' || matrix.person-on-events) }}
Expand Down Expand Up @@ -2261,6 +2301,27 @@ jobs:
else
exit $exit_code
fi
- name: Save hypothesis constants cache
# One Core shard per master run writes the weekly entry: a save from
# every shard would race on the same key and churn the shared cache
# budget. cache-hit != 'true' skips the save once this week's entry
# exists, which keeps later master runs cheap.
# continue-on-error: overlapping master runs at week rollover fail its
# reservation check when an earlier run has saved the same key, and a
# cache miss must never red a green run.
continue-on-error: true
if: |
github.ref == 'refs/heads/master' &&
matrix.segment == 'Core' &&
matrix.group == 1 &&
!matrix.person-on-events &&
!matrix.new-events-schema &&
!matrix.compat &&
steps.hyp-constants.outputs.cache-hit != 'true'
uses: actions/cache/save@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
with:
path: .hypothesis/constants
key: ${{ steps.hyp-constants-key.outputs.key }}
# Post tests
- name: Show docker compose logs on failure
if: failure() && (needs.changes.outputs.backend == 'true' && steps.run-core-tests.outcome != 'failure' && steps.run-temporal-tests.outcome != 'failure')
Expand Down
59 changes: 59 additions & 0 deletions .github/workflows/ci-backend.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,10 @@ env:
# between the merge-base (PR) and HEAD (push) key computations below.
# ci-e2e-playwright.yml, ci-dagster.yml, ci-mcp.yml and ci-rust-flags-integration.yml restore by the same key; keep their copies in sync when bumping.
SCHEMA_CACHE_EPOCH: v2
# Hypothesis constants cache epoch. Bump to abandon every shared entry at once
# (key is posthog-hypothesis-constants-<version>-<epoch>-<isoyear>-<isoweek>); used by
# the Django test shards below.
HYPOTHESIS_CONSTANTS_EPOCH: v1
SECRET_KEY: '6b01eee4f945ca25045b5aab440b953461faf08693a9abbf1166dc7c6b9772da' # unsafe - for testing only
DATABASE_URL: 'postgres://posthog:posthog@localhost:5432/posthog'
REDIS_URL: 'redis://localhost'
Expand Down Expand Up @@ -2970,6 +2974,39 @@ jobs:
restore-keys: |
posthog-segment-durations-

- name: Compute hypothesis constants cache key
# hypothesis builds its constants pool of property-test inputs by
# AST-parsing every local module in sys.modules. It caches the result
# in .hypothesis/constants under a hash of each source file, so the
# pool is content-addressed: restoring a stale copy is safe, because a
# changed file reads as a miss and rebuilds. CI otherwise pays the full
# parse on every shard's pytest collection (about 10 s per shard).
id: hyp-constants-key
shell: bash
run: |
# The key includes the installed hypothesis version because the
# entry format is an implementation detail, and rotates weekly so
# entries for deleted or rewritten files expire. The restore prefix
# covers the gap until the first master run of a new week saves.
hyp_version=$(python -c "import hypothesis; print(hypothesis.__version__)")
prefix="posthog-hypothesis-constants-${hyp_version}-${HYPOTHESIS_CONSTANTS_EPOCH}-"
{
echo "key=${prefix}$(date -u +%G-%V)"
echo "restore_prefix=${prefix}"
} >> "$GITHUB_OUTPUT"

- name: Restore hypothesis constants cache
id: hyp-constants
uses: actions/cache/restore@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
with:
# Constants only. Do NOT add .hypothesis/examples: the example
# database decides which inputs property tests replay, so reusing
# one across runs changes what the tests check.
path: .hypothesis/constants
key: ${{ steps.hyp-constants-key.outputs.key }}
restore-keys: |
${{ steps.hyp-constants-key.outputs.restore_prefix }}

- name: Download the run's sharding plan snapshot
# Pin every attempt to the plan turbo-discover snapshotted (rationale on
# that step); a missing snapshot falls back to the floating caches above.
Expand Down Expand Up @@ -3326,6 +3363,28 @@ jobs:
exit $exit_code
fi

- name: Save hypothesis constants cache
# One Core shard per master run writes the weekly entry: a save from
# every shard would race on the same key and churn the shared cache
# budget. cache-hit != 'true' skips the save once this week's entry
# exists, which keeps later master runs cheap.
# continue-on-error: overlapping master runs at week rollover fail its
# reservation check when an earlier run has saved the same key, and a
# cache miss must never red a green run.
continue-on-error: true
if: |
github.ref == 'refs/heads/master' &&
matrix.segment == 'Core' &&
matrix.group == 1 &&
!matrix.person-on-events &&
!matrix.new-events-schema &&
!matrix.compat &&
steps.hyp-constants.outputs.cache-hit != 'true'
uses: actions/cache/save@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
with:
path: .hypothesis/constants
key: ${{ steps.hyp-constants-key.outputs.key }}

# Post tests
- name: Show docker compose logs on failure
if: failure() && (needs.changes.outputs.backend == 'true' && steps.run-core-tests.outcome != 'failure' && steps.run-temporal-tests.outcome != 'failure')
Expand Down
4 changes: 2 additions & 2 deletions ee/hogai/context/entity_search/context.py
Original file line number Diff line number Diff line change
Expand Up @@ -395,8 +395,8 @@ async def list_feature_flags(
def _list_feature_flags_sync(
self, limit: int = 100, offset: int = 0, active_filter: str | None = None
) -> tuple[list[dict[str, Any]], int]:
# Resource-level gate: filter_queryset_by_access_level only prunes object-level denials, so a
# role without feature flag access would still see flags here (also reachable via list_data).
# Stricter than filter_queryset_by_access_level's fail-closed baseline: a caller without
# feature flag access gets nothing, not even flags they created (also reachable via list_data).
if not self.user_access_control.check_access_level_for_resource("feature_flag", "viewer"):
return [], 0

Expand Down
5 changes: 1 addition & 4 deletions frontend/src/lib/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2401,10 +2401,7 @@ const api = {
): Promise<CountedPaginatedResponse<ScheduledChangeType>> {
return await new ApiRequest().featureFlagScheduledChanges(teamId, featureFlagId).get()
},
async createScheduledChange(
teamId: TeamType['id'],
data: any
): Promise<{ scheduled_change: ScheduledChangeType }> {
async createScheduledChange(teamId: TeamType['id'], data: any): Promise<ScheduledChangeType> {
return await new ApiRequest().featureFlagCreateScheduledChange(teamId).create({ data })
},
async deleteScheduledChange(
Expand Down
116 changes: 114 additions & 2 deletions frontend/src/scenes/feature-flags/FeatureFlagSchedule.test.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,22 @@
import { MOCK_DEFAULT_BASIC_USER, MOCK_DEFAULT_PROJECT } from 'lib/api.mock'

import '@testing-library/jest-dom'

import { act, cleanup, render, screen } from '@testing-library/react'
import { act, cleanup, fireEvent, render, screen } from '@testing-library/react'
import { BindLogic, Provider } from 'kea'

import { dayjs } from 'lib/dayjs'

import { useMocks } from '~/mocks/jest'
import { initKeaTests } from '~/test/init'
import { FeatureFlagType, ScheduledChangeOperationType } from '~/types'
import {
FeatureFlagType,
RecurrenceInterval,
ScheduledChangeModels,
ScheduledChangeOperationType,
ScheduledChangeRequestState,
ScheduledChangeType,
} from '~/types'

import { NEW_FLAG, featureFlagLogic } from './featureFlagLogic'
import FeatureFlagSchedule from './FeatureFlagSchedule'
Expand Down Expand Up @@ -150,6 +159,109 @@ describe('FeatureFlagSchedule', () => {
expect(screen.getByText(new RegExp(expectedText))).toBeInTheDocument()
})

describe('approval visibility', () => {
const makeScheduledChange = (overrides: Partial<ScheduledChangeType>): ScheduledChangeType => ({
id: 1,
team_id: MOCK_DEFAULT_PROJECT.id,
record_id: 1,
model_name: ScheduledChangeModels.FeatureFlag,
payload: { operation: ScheduledChangeOperationType.UpdateStatus, value: true },
scheduled_at: '2030-01-01T00:00:00Z',
executed_at: null,
failure_reason: null,
created_at: '2026-01-01T00:00:00Z',
created_by: MOCK_DEFAULT_BASIC_USER,
is_recurring: false,
recurrence_interval: null,
cron_expression: null,
last_executed_at: null,
end_date: null,
change_request: null,
...overrides,
})

// useMocks trips the hooks naming lint inside named helpers, so each test registers
// its own mock before calling this.
const renderWithSchedules = (): void => {
renderSchedule(
buildFeatureFlag({ active: false, rolloutPercentage: 100 }),
ScheduledChangeOperationType.UpdateStatus
)
act(() => {
featureFlagLogic(logicProps).actions.loadScheduledChanges()
})
}

const schedulesMock = (
schedules: ScheduledChangeType[]
): Record<string, () => [number, { results: ScheduledChangeType[] }]> => ({
[`/api/projects/${MOCK_DEFAULT_PROJECT.id}/scheduled_changes`]: () => [200, { results: schedules }],
})

it('shows the Needs approval tag and an approval link for a pending gated schedule', async () => {
useMocks({
get: schedulesMock([
makeScheduledChange({
change_request: { id: 'cr-pending', state: ScheduledChangeRequestState.Pending },
}),
]),
})
renderWithSchedules()

expect(await screen.findByText('Needs approval')).toBeInTheDocument()
const link = screen.getByText('View approval request').closest('a')
// The router prefixes links with the current project path, so match the suffix only.
expect(link?.getAttribute('href')).toMatch(/\/approvals\/cr-pending$/)
})

it.each([
{ state: ScheduledChangeRequestState.Rejected, expectedTag: 'Rejected' },
{ state: ScheduledChangeRequestState.Expired, expectedTag: 'Approval expired' },
])('lists a $state one-time schedule in history with a $expectedTag tag', async ({ state, expectedTag }) => {
useMocks({ get: schedulesMock([makeScheduledChange({ change_request: { id: 'cr-denied', state } })]) })
renderWithSchedules()

fireEvent.click(await screen.findByText('History (1)'))

expect(await screen.findByText(expectedTag)).toBeInTheDocument()
expect(screen.queryByText('Active & upcoming')).not.toBeInTheDocument()
})

it.each([
{ state: ScheduledChangeRequestState.Rejected, expectedTag: 'Rejected' },
{ state: ScheduledChangeRequestState.Expired, expectedTag: 'Approval expired' },
])(
'keeps a recurring schedule with a $state approval active but tags it $expectedTag',
async ({ state, expectedTag }) => {
useMocks({
get: schedulesMock([
makeScheduledChange({
is_recurring: true,
recurrence_interval: RecurrenceInterval.Daily,
change_request: { id: 'cr-recurring', state },
}),
]),
})
renderWithSchedules()

expect(await screen.findByText(expectedTag)).toBeInTheDocument()
expect(screen.getByText('Active & upcoming')).toBeInTheDocument()
expect(screen.queryByText(/^History \(/)).not.toBeInTheDocument()
// The link is the way to unblock a stalled recurring schedule.
expect(screen.getByText('View approval request')).toBeInTheDocument()
}
)

it('shows the failure reason as visible text on an errored schedule', async () => {
const failureReason = 'Feature flag not found (will retry automatically, 2 attempts remaining)'
useMocks({ get: schedulesMock([makeScheduledChange({ failure_reason: failureReason })]) })
renderWithSchedules()

expect(await screen.findByText('Error')).toBeInTheDocument()
expect(screen.getByText(failureReason)).toBeVisible()
})
})

it.each([
{
name: 'another operation',
Expand Down
Loading
Loading