Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
310 commits
Select commit Hold shift + click to select a range
73b1e4a
chore(warehouse-sources): demote webhook template tests
pauldambra Oct 23, 2026
bd986a3
chore(ci): restore hogbox pr previews behind a label on dev
gantoine Oct 23, 2026
a268c6f
fix(workflows): pluralize the utm defaults apply toast
dmarchuk Oct 23, 2026
951c1c0
chore(conversations): narrow item_context type in the spf test
Piccirello Oct 23, 2026
f5d941f
feat(aio): add score history breakdowns
Radu-Raicea Oct 23, 2026
aa9fbf4
Merge remote-tracking branch 'origin/master' into feat/aio-score-brea…
Radu-Raicea Oct 23, 2026
d4d9248
test(mcp): update unit test snapshots
tests-posthog[bot] Oct 23, 2026
6adbe49
fix(queries): send retry-after on the query concurrency 429
vdekrijger Oct 23, 2026
d2bcbc0
chore(visual): update storybook baselines
posthog[bot] Oct 23, 2026
07b4be7
fix(queries): send retry-after from every concurrency 429 site
vdekrijger Oct 23, 2026
b0066b1
fix(aio): keep unicode breakdown cursors within length limit
Radu-Raicea Oct 23, 2026
b098f42
chore(aio): merge master into score history breakdowns
Radu-Raicea Oct 23, 2026
ecd4479
chore(aio): refresh history test and MCP input schema
Radu-Raicea Oct 23, 2026
e957645
chore(aio): update score breakdown branch from master
Radu-Raicea Oct 23, 2026
013b513
fix(aio): compact scorer history filters and localize periods
Radu-Raicea Oct 23, 2026
a8c2166
chore(aio): update score history branch from master
Radu-Raicea Oct 23, 2026
117b277
Merge remote-tracking branch 'origin/master' into dc-k/h1-history-tra…
danielcarletti Oct 23, 2026
a3d3bf9
feat(conversations): record why the AI support agent skipped a ticket
johncwaters Oct 23, 2026
c7bf861
feat(conversations): show AI triage skip reasons in the ticket panel
johncwaters Oct 23, 2026
2364062
fix(conversations): shorten the empty AI triage panel copy
johncwaters Oct 23, 2026
71f544a
Merge master into john/ai-triage-skip-visibility
johncwaters Oct 23, 2026
7105985
Merge master into john/ai-triage-skip-visibility
johncwaters Oct 23, 2026
3cb1bb3
fix(conversations): only label team replies as skipped_team_replied
johncwaters Oct 23, 2026
acb1d3d
Merge remote-tracking branch 'origin/john/ai-triage-skip-visibility' …
johncwaters Oct 23, 2026
b1a6fb9
chore(visual): update storybook baselines
posthog[bot] Oct 23, 2026
a84d744
Merge branch 'master' into posthog/box-plot-results-count
pauldambra Oct 25, 2026
3226d91
chore: update OpenAPI generated types
tests-posthog[bot] Oct 25, 2026
8678850
Merge branch 'master' into posthog/chore-warehouse-webhook-test-tier
pauldambra Oct 25, 2026
dd8b770
fix(cdp): give hog template test mixin a typed base for mypy
pauldambra Oct 25, 2026
badf403
feat(slack-app): invite users to book a research interview
VojtechBartos Oct 26, 2026
4206b81
feat(aio): open the drawer from overview charts and drop the ranked view
bernatixer Oct 26, 2026
e7ba4ca
feat(aio): fold overview tiles and directories into the results card
bernatixer Oct 26, 2026
470d26d
chore(aio): drop comments that restate the overview components
bernatixer Oct 26, 2026
9515279
refactor(aio): build the overview tabs and filter pills from lemon co…
bernatixer Oct 26, 2026
c06fdc6
feat(aio): keep directory tiles on the evals overview
bernatixer Oct 26, 2026
cc025b8
fix(aio): wrap the directory tile counts instead of cutting them off
bernatixer Oct 26, 2026
9a0fc0d
fix(aio): address review findings on the evals overview
bernatixer Oct 26, 2026
fdd8d5f
fix(aio): keep the view picker when an empty range hides the grid
bernatixer Oct 26, 2026
2d7e71d
fix(projects): skip billing checks when other projects remain
pawel-cebula Oct 26, 2026
83bc622
fix(subscriptions): remove repeated titles from AI Slack reports
MattPua Oct 26, 2026
6f4a25c
Merge branch 'master' into posthog/fuzzy-event-search-fallback
pauldambra Oct 26, 2026
afe9cca
fix(subscriptions): preserve code indentation after report titles
MattPua Oct 26, 2026
c8d425f
refactor(slack-app): simplify the interview invite to a plain booking…
VojtechBartos Oct 26, 2026
9fafffb
Merge branch 'master' into fix/project-deletion-billing-guard
pawel-cebula Oct 26, 2026
fa58769
chore(ci): point hogbox previews at the dev hogland host
gantoine Oct 26, 2026
6846e90
fix(taxonomy): keep fuzzy event search on the project index and off c…
pauldambra Oct 26, 2026
6b962df
build: update Browserslist db
scheduled-actions-posthog[bot] Oct 26, 2026
13cb283
feat(dashboards): add a universal result context menu
mariusandra Oct 26, 2026
d64bede
Merge remote-tracking branch 'origin/master' into feat/universal-dash…
mariusandra Oct 26, 2026
e28bdec
fix(experiments): wrap the recalculation banner and retry state on na…
jurajmajerik Oct 26, 2026
4fe5d3d
feat(data-quality): filter and page the subject catalog for mcp
posthog[bot] Oct 11, 2026
eccdcf0
fix(data-quality): take subject type choices from a labeled enum
posthog[bot] Oct 11, 2026
d20963f
feat(approvals): scope flag approval policies by the product that own…
yasen-posthog Oct 8, 2026
897643d
fix(approvals): pass the sync test policy overrides as one mapping
yasen-posthog Oct 12, 2026
c3a996d
feat(approvals): gate release conditions under the family that owns t…
yasen-posthog Oct 12, 2026
863a2ea
feat(experiments): refuse a live create when launching needs approval
yasen-posthog Oct 12, 2026
0084d74
fix(approvals): pick the holdout fallback policy by the rollout state
yasen-posthog Oct 13, 2026
d3e7590
feat(approvals): refuse an adoption that would drop a flag's approval…
yasen-posthog Oct 13, 2026
2cc7255
fix(approvals): compare adoption cover write by write, not family by …
yasen-posthog Oct 13, 2026
54ae382
refactor(approvals): name the flag write action rows
yasen-posthog Oct 13, 2026
a23eadd
fix(approvals): count a target policy only if it gates at least as much
yasen-posthog Oct 13, 2026
614e957
refactor(approvals): read the rollout flag through the shared ph_clie…
yasen-posthog Oct 13, 2026
caa82e6
fix(approvals): close the gaps review found in scoping by flag owner
yasen-posthog Oct 14, 2026
788c858
feat(approvals): let the policy editor manage experiment actions
yasen-posthog Oct 14, 2026
59e7ed8
fix(approvals): let unenforced experiment policies admit v2 flag writes
yasen-posthog Oct 14, 2026
ddbd842
fix(approvals): keep an experiment's targeting ungated, as it is today
yasen-posthog Oct 23, 2026
53783b6
fix(feature-flags): take a flag id in the facade's disable approval c…
yasen-posthog Oct 23, 2026
1c13272
fix(approvals): gate a scheduled flag change under the family that ow…
yasen-posthog Oct 23, 2026
b8e0b63
fix(approvals): answer the rollout lookup when the cache fails
yasen-posthog Oct 23, 2026
6c07bf7
fix(approvals): report an unknown rollout state and keep the holdout …
yasen-posthog Oct 23, 2026
bde5456
fix(experiments): allow a live create when the organization has no ap…
yasen-posthog Oct 23, 2026
6c7abe1
fix(approvals): link experiment requests to their flag and name what …
yasen-posthog Oct 23, 2026
304f531
fix(approvals): say that experiment.update leaves release conditions …
yasen-posthog Oct 26, 2026
c1bc0a8
fix(approvals): compare coverage write by write in the coverage report
yasen-posthog Oct 26, 2026
2d0b785
chore(approvals): check ungated writes land and sync skips per org
yasen-posthog Oct 26, 2026
27caa45
refactor(approvals): build experiment request descriptions from the f…
yasen-posthog Oct 26, 2026
9dd2083
feat(approvals): explain the policy split on the policies page
yasen-posthog Oct 26, 2026
f8261a0
fix(approvals): skip the adoption guards without the Approvals feature
yasen-posthog Oct 26, 2026
4412dbf
feat(approvals): announce the policy split like other info banners
yasen-posthog Oct 26, 2026
2e7ab82
feat(approvals): say in the banner that surveys get their own policie…
yasen-posthog Oct 26, 2026
c6e229b
fix(devbox): stop the sync from restarting stopped devboxes
ablaszkiewicz Oct 26, 2026
7daa8ac
fix(data-modeling): keep materialization on when temporal is unreachable
jakesciotto Oct 20, 2026
936276b
fix(data-modeling): promote views, report failures in recovery command
jakesciotto Oct 20, 2026
e316a93
fix(data-modeling): switch an interrupted recovery back off
jakesciotto Oct 20, 2026
3a42ce3
fix(data-modeling): run each recovery in one transaction
jakesciotto Oct 20, 2026
a802e6b
fix(data-modeling): save the recovery flag after the temporal calls
jakesciotto Oct 20, 2026
4820af0
fix(data-quality): keep the subject catalog order and search in logic
thiagosalvatore Oct 26, 2026
d5a4631
fix(aio): align score history filters and breakdowns
Radu-Raicea Oct 26, 2026
4c6e14c
chore(aio): merge master into score history branch
Radu-Raicea Oct 26, 2026
f5a4adf
fix(data-modeling): pick recovery candidates by node state
thiagosalvatore Oct 26, 2026
7a98057
fix(data-modeling): restore the refresh mode when temporal is down
thiagosalvatore Oct 26, 2026
a8ef1a8
test(mcp): update unit test snapshots
tests-posthog[bot] Oct 26, 2026
51cd402
fix(dashboards): address result menu review feedback
mariusandra Oct 26, 2026
0c414fd
Merge remote-tracking branch 'origin/master' into feat/universal-dash…
mariusandra Oct 26, 2026
eb905d0
fix(dashboards): preserve empty pie labels
mariusandra Oct 26, 2026
d7f0746
fix(aio): keep byok judge rate limits out of error tracking
carlos-marchal-ph Oct 26, 2026
b50ca99
fix(devbox): keep devbox:stop working when the sync pause or stop fails
ablaszkiewicz Oct 26, 2026
0c246b6
fix(aio): scope history coverage to paginated groups
Radu-Raicea Oct 26, 2026
1283b65
chore(aio): refresh score history branch from master
Radu-Raicea Oct 26, 2026
cf9b0cd
fix(dashboards): hide chart tooltips while result menu is open
mariusandra Oct 26, 2026
e2e3c87
Merge remote-tracking branch 'origin/master' into feat/universal-dash…
mariusandra Oct 26, 2026
5071f4d
feat(workflows): add the email sending domain wizard page
Silthus Oct 2, 2026
afa533e
test(workflows): cover domain test email outcomes in the wizard
Silthus Oct 7, 2026
fc0d77a
fix(workflows): describe a waiting domain by what is actually missing
Silthus Oct 19, 2026
5abb6d6
fix(workflows): name the root domain in dns host tips and the address…
Silthus Oct 19, 2026
7a93a55
test(workflows): add a story for records in place while the provider …
Silthus Oct 19, 2026
cc78568
fix(workflows): show which records are missing on the ready step and …
Silthus Oct 19, 2026
60157c5
fix(workflows): show the shared bounce subdomain and a provider delay…
Silthus Oct 19, 2026
077332d
fix(workflows): word the provider failure banner by whether records a…
Silthus Oct 19, 2026
2567f19
fix(workflows): render the missing settings banner as one text node
Silthus Oct 19, 2026
d886e9d
fix(workflows): let the email domain checking stories snapshot while …
meikelmosby Oct 22, 2026
9a95d21
feat(workflows): show a maildev or SES picker on the email domain ste…
meikelmosby Oct 22, 2026
e463104
feat(workflows): ask for the from name and address on the email domai…
meikelmosby Oct 22, 2026
5d339f8
fix(workflows): preview the full from line and ask for the subdomain …
meikelmosby Oct 22, 2026
02af58f
fix(workflows): label the sender fields name and email address
meikelmosby Oct 22, 2026
ce3c4c5
feat(workflows): ask for an optional default reply-to address under a…
meikelmosby Oct 22, 2026
b2e4ce6
fix(workflows): drop the example name from the sender name hint
meikelmosby Oct 22, 2026
2d3b363
fix(workflows): keep the sending domain inside the email address field
meikelmosby Oct 22, 2026
ffaf082
fix(workflows): let the remaining email domain checking stories snaps…
meikelmosby Oct 23, 2026
beddfc8
fix(dashboards): show recordings before sql in result menus
mariusandra Oct 26, 2026
fdfc349
fix(aio): reclaim narrow score history table space
Radu-Raicea Oct 26, 2026
3715398
chore(aio): merge latest master into score history branch
Radu-Raicea Oct 26, 2026
98cc3f9
fix: skip only byok 429s and let backfills retry rate limited runs
carlos-marchal-ph Oct 26, 2026
87c8565
feat(taxonomy): put fuzzy event search behind a feature flag
pauldambra Oct 26, 2026
ba5b85d
chore(visual): update storybook baselines
posthog[bot] Oct 26, 2026
1159055
feat(workflows): open the email domain wizard from channels, configur…
Silthus Oct 2, 2026
acd7c11
fix(workflows): keep email setup where the person started it
Silthus Oct 19, 2026
c72052a
fix(workflows): close the setup modal when the person opens the full …
Silthus Oct 19, 2026
47a6e28
fix(workflows): open the email domain page in a new tab from a broadcast
meikelmosby Oct 22, 2026
6cfcbf4
fix(proxy): make configure automatically work in mobile safari
Silthus Oct 7, 2026
a9e1325
feat(workflows): offer data suggestions on the domain wizard's last step
Silthus Oct 20, 2026
cd8ea7d
fix(workflows): report data suggestions as shown when their cards render
Silthus Oct 20, 2026
5b137c2
feat(workflows): replace the domain wizard's template with loaded sug…
Silthus Oct 20, 2026
5fe524a
fix(workflows): swap the next workflow lead as a whole paragraph
Silthus Oct 20, 2026
b10146b
feat(workflows): start the wizard's suggestions once a domain is picked
Silthus Oct 20, 2026
3e0e20b
refactor(workflows): make the first workflow choices one component
Silthus Oct 20, 2026
9914624
fix(workflows): keep the domain whole in the ready step heading
Silthus Oct 20, 2026
c507b19
fix(workflows): let an oversized domain wrap inside the ready heading
Silthus Oct 20, 2026
41ff6d3
fix(workflows): say first only for the first sender, and name it afte…
Silthus Oct 20, 2026
81431f3
fix(workflows): keep the organization name out of the sender when the…
Silthus Oct 20, 2026
c6c2e24
feat(workflows): offer the wizard's workflow suggestions when the org…
meikelmosby Oct 22, 2026
685835c
feat(workflows): lead the wizard's last step with the best suggestion
meikelmosby Oct 22, 2026
36d4dd1
chore(workflows): expect the organization name as the suggested sende…
meikelmosby Oct 22, 2026
d84a759
fix(workflows): report only the suggestions on screen and hold skippi…
meikelmosby Oct 22, 2026
80a60e1
chore(workflows): regenerate kea types for the suggestions layer
meikelmosby Oct 23, 2026
f1c74e5
fix(postgres): stop retrying an explicit pg_hba.conf rejection
Gilbert09 Oct 26, 2026
111b093
chore(visual): update storybook baselines
posthog[bot] Oct 26, 2026
cfeba2a
fix(dashboards): preserve snapshot links and cancel stale queries
mariusandra Oct 26, 2026
9501aba
Merge remote-tracking branch 'origin/master' into feat/universal-dash…
mariusandra Oct 26, 2026
7e8c279
chore(signals): hide github sources from manual onboarding
skoob13 Oct 26, 2026
a4f179a
fix(messaging): preserve customer.io global unsubscribes
mayteio Oct 26, 2026
51e5a0a
fix(dashboards): narrow sql menu query types
mariusandra Oct 26, 2026
5c68d06
fix(experiments): shrink the breakdown tag on metric rows
jurajmajerik Oct 26, 2026
a13dbe7
fix(data-warehouse): stop reporting google play console 503s as errors
Gilbert09 Oct 26, 2026
1022bd9
fix(messaging): stop suppression refusals dropping transactional email
mayteio Oct 26, 2026
89ebcea
fix(postgres): use invented connection details in pg_hba.conf test fi…
Gilbert09 Oct 26, 2026
ff39f9a
chore(queries): assert retry-after against the shared constant in pro…
vdekrijger Oct 26, 2026
330048c
fix(messaging): keep bounced complaint addresses blocked for transact…
mayteio Oct 26, 2026
f5c89d6
fix(messaging): treat unsubscribed=1 as a global unsubscribe in csv i…
mayteio Oct 26, 2026
341beb6
Merge branch 'master' into lucas/survey-proxy-host-guard
lucasheriques Oct 26, 2026
0a1808b
chore(replay-vision): drop the small thumbnail backfill
TueHaulund Oct 26, 2026
a3398fa
chore(visual): update storybook baselines
posthog[bot] Oct 26, 2026
1ae8da2
feat(data-modeling): open lineage zoomed in on the current model
thiagosalvatore Oct 26, 2026
a01ea21
feat(signals): launch first-report investigations after onboarding
skoob13 Oct 26, 2026
dc1b9c9
fix(signals): retry activation and retain first-report success
skoob13 Oct 26, 2026
0f73f54
feat(signals): show first-report investigation progress
skoob13 Oct 26, 2026
9a76d39
fix(signals): recover failed first-report list refreshes
skoob13 Oct 26, 2026
9c260d2
Merge branch 'master' into vasco/perf-query-retry-after
vdekrijger Oct 26, 2026
b34ee46
chore(visual): update storybook baselines
posthog[bot] Oct 26, 2026
7862472
chore(visual): update storybook baselines
posthog[bot] Oct 26, 2026
30fd301
chore(visual): update storybook baselines
posthog[bot] Oct 26, 2026
dd79a7e
chore(aio): stop reporting offline evals to braintrust
Radu-Raicea Oct 26, 2026
32fb8ad
Merge remote-tracking branch 'origin/master' into feat/aio-remove-bra…
Radu-Raicea Oct 26, 2026
f1359af
chore(aio): format migrated signals eval
Radu-Raicea Oct 26, 2026
ae27f41
Merge remote-tracking branch 'origin/master' into ab/fix/devbox-mirro…
ablaszkiewicz Oct 26, 2026
eea95aa
fix(subscriptions): restore ready status in Slack report heading
MattPua Oct 26, 2026
b0ff680
chore(aio): migrate signals eval test runner arguments
Radu-Raicea Oct 26, 2026
4231732
fix(postgres): stop retrying a Neon SSH-tunnel SNI rejection
Gilbert09 Oct 26, 2026
16d585f
Merging 7a98057fd1ed40feb04c69195b0150a3325c0074 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
72f1f9c
Merging 2e7ab8238f674ce03a36c25c62652db7fd72a3ae into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
c32f733
Merging a8ef1a860bfdd75465811bcbbaa22d8687a8a248 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
f92781e
Merging 111b093a319d13da4630ae55c1dff3dfadba0205 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
677e9cf
Merging f92781ed20bb3a6cf53537d8c0401ca85c86c338 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
062cde1
Merging f5c89d6e06ac76a210559259ad156c9ee39fe67d into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
e532052
Merging 330048cae83289d7506af6364cc33709194043c1 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
ec650fd
Merging c8d425fd43f1cff102f764eabc80ea6ec5dcb485 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
f44b175
Merging 951c1c0e933a5cfb4d369143538cc612b43b2ca6 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
1d0dcd0
Merging f44b1753df872e64603c8e18efc8ab19c059f098 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
c388532
Merging 98cc3f91a385a39fdaac382653f14e576b343b14 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
7686b1e
Merging 0a1808bb225f9b6da0680cff5377f259b9706c17 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
32ceef9
Merging acb1d3d8cbab990f0594a376d114a7c4918f3323 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
bc256e3
Merging 9c260d2f4fe01c141342abc22d1ae27ed9931ef1 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
be64005
fix(dashboards): respect drilldown recording support
mariusandra Oct 26, 2026
8c24dcd
Merge remote-tracking branch 'origin/master' into feat/universal-dash…
mariusandra Oct 26, 2026
066111b
Merging bc256e344d271d8ab3771e1590ec48a6d295bc4d into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
380a8a3
Merging 30fd301e32429a323f6717526961d3d87327857a into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
ef405e3
fix(signoz): stop retrying when the host returns a non-JSON body
Gilbert09 Oct 26, 2026
22ccde6
Merging bc256e344d271d8ab3771e1590ec48a6d295bc4d into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
afd346e
Merging ae27f41bdc386e77f07de10a59e285fb48b59b82 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
c5100a4
fix(postgres): cover direct IP hosts in the Neon SNI guidance
Gilbert09 Oct 26, 2026
dfb948b
Merging afd346e4fc9f6513346bc559b806ab50608a47dd into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
9a8b485
Merging 24dea72cda657cde75a5bc27c428a329086cdde2 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
fc4db67
Merging 3648a435bb11a314a14b6a2ef872264f75b4fb36 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
e0cbc1f
Merging eea95aa9b56c26bacaf966f53867d80ed26e033a into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
eebb916
Merge branch 'master' into dc-k/h1-history-tracking
danielcarletti Oct 26, 2026
8c6e90d
fix(data-warehouse): use master's is_history_table instead of redefin…
danielcarletti Oct 26, 2026
fcdd008
fix(postgres): stop retrying an invalid CA certificate
Gilbert09 Oct 26, 2026
597a014
fix(search): stop rebuilding command k results several times per keys…
puemos Oct 26, 2026
522f2dc
Merge branch 'master' into posthog/chore-warehouse-webhook-test-tier
pauldambra Oct 26, 2026
a62a404
Merging e0cbc1fcc773328c962e309678737f2f0af5d61c into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
d29e61b
Merging 380a8a311b1899233d96444fd187aae9e92940dc into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
f83b999
Merging a268c6f7932ae956ae1a2f6a42293e150911226c into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
35701f2
Merging a5c85a758e16566047f67538f0e46fac9a601a48 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
035d0af
Merging 8c24dcdad4f862ac4c8cd6191581f241435b63c9 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
6432887
chore(visual): update storybook baselines
posthog[bot] Oct 26, 2026
c73943b
Merging 035d0af7b5a6f101155d5b105aa3d854d6563f6f into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
d4ae9e2
Merging 341beb68b4ea4639b1949ebbadbe0055c4699f26 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
6cea8c6
Merging 035d0af7b5a6f101155d5b105aa3d854d6563f6f into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
7823bc4
Merging e28bdec9c6f07293b317f5d3eb742b4a646dd5cd into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
9a679ae
Merging d4ae9e25d80a83eec266a6ad6cd4b1285f048fcf into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
5254f8e
Merging b0ff6802a5d0faaeed408e09e28b06f5f1ecb0e2 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
e1239ae
Merging fcdd008fd96212eda11d23e733f6dcd4dceb92e0 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
da056a5
Merging ef405e3d4604bc4fe943a842031658c2d3146714 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
74c48ba
Merging c5100a448f103050be2647f149fab6f7a762dfd1 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
8a7b4fe
Merging 74c48baa81945e9961a61ac70357087c19f7a7c4 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
6d6f802
Merging 7823bc44d9b03a9792e136b9e7db25e31a3ce833 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
358e486
Merging a13dbe715fe30003474153c70bfb25e2aa8e72f7 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
ea1bc5e
Merging 89ebcea66e0f8fa6e0452a4a0427565de76b4322 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
3931c42
Merging 8c6e90d54b7a3ef85fb28bf31c87c4c217c0b726 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
23238fe
Merging 522f2dc7c8fd97a09e7d842d868ea5dc7fea8761 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
a8e4581
Merge branch 'master' into feat/aio-score-breakdown-plan
Radu-Raicea Oct 26, 2026
1f6448a
Merge branch 'master' into fix/project-deletion-billing-guard
pawel-cebula Oct 26, 2026
4493229
Merging 23238fefbab9784fe00f6f3e8518e0291d53af3c into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
f2ff774
Merging 6432887fcc8fc0e4d7fbeac5789385168a5794aa into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
aa7a2ed
Merging 9a76d390e9093808f9d41cf733fbb6c5d2d56669 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
3e9f104
Merging 7e8c279d1d9871a9e5ad6ae73c03dd69710065a8 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
1304389
Merging 597a0149f4ebbd5aa711cb330e3eaa80ed5ae24d into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
bedaef5
Merging 13043890a6e5322b1cb9ba3ca0242577ce70048a into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
bffbe3c
Merging b34ee4670dd78cf7fe00bd8b3a32135f9ec33146 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
dea7979
fix(data-warehouse): stop reporting bing webmaster tools IP throttlin…
Gilbert09 Oct 26, 2026
10afe05
Merging bffbe3c869690f87a53bd64d35a13f2ba3fd4003 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
abd557f
Merging 3226d914874f4160e0ed343b50351579f1718d9b into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
45b0713
Merging a8e458110ae3d9f693594a5d2e6ef191f3aa5568 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
ada80af
Merging 1f6448a85a9c11fe785139d860c40788bac0b578 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
fd1a552
Merging ada80af366c47a6b3b7aaace767bed3528dbebc7 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
e3d8f6e
Merging 6b962dfc9c784a364e9cbb52de7a819b43ccd3d8 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
692d0ab
Merging fa587691084d715cd515279d22e523e706dc63a2 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
827e666
Merging dea797949a7beab9cfe7072a8a4133c3dc82efc3 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
98b5553
Merging 827e6662f6a85c6e287e71c82888229864884012 into trunk-temp/pr-1…
trunk-io[bot] Oct 26, 2026
d16bd8c
Merging 87c85653d44990b7cd14ce9d39c06a90871d3fa7 into trunk-temp/pr-1…
trunk-io[bot] Oct 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
31 changes: 31 additions & 0 deletions .github/scripts/post-ci-sections.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { describe, it } from 'node:test'

import { buildDocsPreviewSection } from './post-docs-preview-section.mjs'
import { buildHobbySection } from './post-hobby-section.mjs'
import { buildHogboxPreviewSection } from './post-hogbox-preview-section.mjs'
import { buildTrunkLaneSection, parseCrossLane, postTrunkLaneSection } from './post-trunk-lane-section.mjs'

const commonHobby = {
Expand Down Expand Up @@ -153,6 +154,36 @@ describe('CI report section builders', () => {
assert.match(section.body, /actions\/runs\/42/)
})

for (const testCase of [
{
name: 'claims the PR frontend only when it was swapped in',
frontendSwapped: true,
expected: /\*\*and\*\* frontend/,
},
{
name: 'says the frontend is unchanged when it was not swapped in',
frontendSwapped: false,
expected: /frontend unchanged by this PR/,
},
]) {
it(testCase.name, () => {
const section = buildHogboxPreviewSection({
state: 'ready',
sha: '1234567890abcdef',
runUrl: 'https://github.com/PostHog/posthog/actions/runs/42',
url: 'https://preview.example.com',
boxId: 'box-1',
penId: 'None',
consoleHost: 'console.example.com',
frontendSwapped: testCase.frontendSwapped,
})
assert.equal(section.status, 'ok')
assert.match(section.summary, /https:\/\/preview\.example\.com/)
assert.match(section.body, testCase.expected)
assert.doesNotMatch(section.body, /console\/fleet\/pens/)
})
}

it('moves a hobby preview through setup, ready, and failed states', () => {
const initial = buildHobbySection({ state: 'initial', ...commonHobby })
const ready = buildHobbySection({
Expand Down
105 changes: 105 additions & 0 deletions .github/scripts/post-hogbox-preview-section.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
#!/usr/bin/env node
import { pathToFileURL } from 'node:url'

import { postSection, updateSectionIfPresent } from '../../frontend/bin/ci-report/update-ci-report.mjs'

const LEGACY_PREFIXES = ['<!-- hogbox-preview-comment -->']

export function buildHogboxPreviewSection({
state,
sha = '',
runUrl,
url,
boxId,
penId,
consoleHost,
frontendSwapped,
readySeconds,
}) {
const commit = sha.slice(0, 7)

if (state === 'building') {
return {
status: 'info',
summary: 'building',
body: [
"Spinning up PostHog for this PR on a hogland hogbox. This section updates in place when it's ready (usually a few minutes).",
'',
`<sub>commit \`${commit}\` &middot; <a href="${runUrl}">build log</a></sub>`,
].join('\n'),
}
}

if (state === 'failed') {
return {
status: 'fail',
summary: 'build failed',
body: [
`The preview didn't come up for commit \`${commit}\`. See the **[build log](${runUrl})** for the failing step. It'll retry on the next push.`,
'',
'<sub>Previews are optional and never block merging. A failure here is often a hogland or tailnet hiccup rather than anything in your PR, so the check stays green and this section is the status.</sub>',
].join('\n'),
}
}

if (state === 'torn-down') {
return {
status: 'info',
summary: 'torn down',
body: 'The preview for this PR was torn down because the `hogbox-preview` label was removed. Add the label again to bring it back.',
}
}

if (state !== 'ready') {
throw new Error(`Unknown hogbox preview section state: ${state}`)
}

// A backend-only preview serves the :master SPA, so only claim the PR's frontend when it was swapped in.
const running = frontendSwapped
? "this PR's backend **and** frontend, on the PostHog `:master` base"
: "this PR's backend on the PostHog `:master` base (frontend unchanged by this PR)"
// The CLI parser can surface a missing pen id as the literal string 'None'.
const adminUrl =
consoleHost && penId && penId !== 'None' ? `https://${consoleHost}/console/fleet/pens/${penId}` : null
const readyIn = readySeconds ? ` &middot; ready in ${readySeconds}s (push → usable)` : ''

return {
status: 'ok',
summary: `ready, <a href="${url}">open the preview</a>`,
body: [
`### [▶ Open the preview](${url})`,
'',
'| | |',
'|--|--|',
'| 🔑 **Login** | `test@posthog.com` / `12345678` (demo data) |',
`| 🧩 **Running** | ${running} |`,
'| 🔗 **Link** | **stable across rebuilds**: a re-push swaps the box underneath, the URL stays |',
'| 🔒 **Access** | tailnet only (PostHog VPN) |',
...(adminUrl ? [`| 🛠️ **Admin** | [inspect & debug state in hogland](${adminUrl}) |`] : []),
'| 💤 **Idle** | sleeps after ~30 min idle (snapshot to S3, zero node cost) and wakes on your next visit in ~30s, behind a brief "waking up" screen |',
'',
`<sub>commit \`${commit}\` &middot; box \`${boxId}\`${readyIn} &middot; <a href="${runUrl}">build log</a> &middot; rebuilds on every push, torn down on close</sub>`,
].join('\n'),
}
}

async function main() {
const [state] = process.argv.slice(2)
const section = buildHogboxPreviewSection({
state,
sha: process.env.SHA,
runUrl: `${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}/actions/runs/${process.env.GITHUB_RUN_ID}`,
url: process.env.URL,
boxId: process.env.BOX,
penId: process.env.PEN,
consoleHost: process.env.CONSOLE_HOST,
frontendSwapped: process.env.SWAP === 'true',
readySeconds: process.env.READY_SECONDS,
})
const post = state === 'torn-down' ? updateSectionIfPresent : postSection
await post({ id: 'hogbox-preview', ...section }, { legacyPrefixes: LEGACY_PREFIXES })
}

if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
await main()
}
14 changes: 14 additions & 0 deletions .github/scripts/trunk-impacted-targets.js
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,9 @@ const DESKTOP = 'desktop'
// from services/mcp sources. The same pair STANDALONE_TREES gives cli/ itself.
const CLI_ARTIFACTS = 'cli-artifacts'

// The hogbox preview-environment workflows, which read the hogbox tooling.
const HOGBOX_PREVIEW = 'hogbox-preview'

// Bot, report, sync, and canary workflows plus the scripts they run. None of
// them is a required check, so a break costs a bot action rather than a merge
// gate, and one shared lane keeps a script and the workflow that runs it
Expand Down Expand Up @@ -319,6 +322,10 @@ const TRIPWIRE_RULES = [
// the rust lanes on top of deploy: those PR checks parse it, even though
// only the image builds act on what it maps.
['.github/rust-images.yml', [RUST, DEPLOY]],
// The hogbox preview environment gates no check, and its deploys read the
// hogbox tooling, which owns a lane already.
['.github/workflows/hogbox-preview-env.yml', HOGBOX_PREVIEW],
['.github/workflows/hogbox-preview-cleanup.yml', HOGBOX_PREVIEW],
// CI scripts held to the workflows that run them: the backend test-timing
// pair and the IDOR coverage check run only in ci-backend and its timing
// workflow, while report_test_timings is read by the backend, frontend,
Expand Down Expand Up @@ -1728,6 +1735,11 @@ function addHobbyLane(targets) {
return true
}

function addHogboxPreviewLane(targets) {
targets.add('tools:hogbox-preview')
return true
}

function addCliArtifactLanes(targets) {
targets.add('cli')
targets.add('svc:mcp')
Expand Down Expand Up @@ -1857,6 +1869,7 @@ const DOMAIN_LANES = new Map([
[FULLSTACK, addFullstackLanes],
[DEPLOY, addDeployLane],
[HOBBY, addHobbyLane],
[HOGBOX_PREVIEW, addHogboxPreviewLane],
[CLI_ARTIFACTS, addCliArtifactLanes],
[DESKTOP, addDesktopLanes],
[REPO_AUTOMATION, laneOf('repo-automation')],
Expand Down Expand Up @@ -2979,6 +2992,7 @@ module.exports = {
DESKTOP,
FULLSTACK,
HOBBY,
HOGBOX_PREVIEW,
JAVASCRIPT,
NATIVE_BINDING_CONSUMER_LANES,
NODE,
Expand Down
7 changes: 7 additions & 0 deletions .github/scripts/trunk-impacted-targets.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -827,6 +827,12 @@ test('the cli workflow and the reusable release plan share the cli lane', () =>
}
})

test('the hogbox preview workflows keep the hogbox tooling lane', () => {
for (const file of ['.github/workflows/hogbox-preview-env.yml', '.github/workflows/hogbox-preview-cleanup.yml']) {
assert.deepEqual(computeTargets([file], CONTEXT), ['tools:hogbox-preview'], file)
}
})

test('the mcp ui-apps workflow claims the product-surface readers', () => {
assert.deepEqual(
computeTargets(['.github/workflows/ci-mcp-ui-apps.yml'], CONTEXT),
Expand Down Expand Up @@ -1330,6 +1336,7 @@ test('every target the rules can emit appears in the enumerated universe', () =>
'.github/workflows/ci-hobby.yml',
'.github/workflows/ci-oauth-proxy.yml',
'.github/workflows/ci-agent-skills.yml',
'.github/workflows/hogbox-preview-env.yml',
'.github/workflows/ci-cli.yml',
'bin/hobby-ci.py',
'Dockerfile.llm-analytics',
Expand Down
81 changes: 81 additions & 0 deletions .github/workflows/hogbox-preview-cleanup.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
name: Hogbox Preview Cleanup

# Daily backstop sweep: destroy hogbox previews (box + pen) whose PR has closed
# but whose fast-path teardown didn't fire or failed — that fast path is
# pr-closed.yml (on close) and the label-removal job in hogbox-preview-env.yml.
#
# Why its own file and not a job in pr-cleanup.yml (where hobby's stale-sweep
# lives): pr-cleanup.yml is a *reusable* workflow — pr-closed.yml calls it with
# only `deployments: write`. A job that mints a hogland OIDC token needs
# `id-token: write`, which exceeds that capped call and fails the caller's run at
# startup. So the hogbox sweep lives here, on its own triggers, where it can hold
# the permission it needs.

on:
schedule:
# Daily at 03:15 UTC (staggered just after pr-cleanup.yml's 03:00 sweep).
- cron: '15 3 * * *'
workflow_dispatch:
inputs:
dry_run:
description: 'Dry run (list closed-PR previews, destroy nothing)'
type: boolean
default: true

permissions:
contents: read
id-token: write # OIDC for the tailnet join + hogplane token

env:
HOG_HOST: https://hogland-dev.hedgehog-kitefin.ts.net
HOG_OIDC_AUDIENCE: hogland.dev.posthog.dev

jobs:
cleanup-hogbox-preview:
name: Reap stale hogbox previews
if: github.repository == 'PostHog/posthog'
runs-on: ubuntu-24.04
timeout-minutes: 15
steps:
# Pin to the default branch: the sweep runs the tool with the hogland
# token, and a workflow_dispatch from a non-master ref would otherwise
# run that ref's tool code in credential scope — same rule as every
# other credentialed job in this family.
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ github.event.repository.default_branch }}
- name: Connect to Tailscale (tag:hogland-ci)
uses: tailscale/github-action@306e68a486fd2350f2bfc3b19fcd143891a4a2d8 # v4.1.2
with:
oauth-client-id: ${{ vars.TS_HOGLAND_CI_CLIENT_ID }}
audience: ${{ vars.TS_HOGLAND_CI_AUDIENCE }}
tags: tag:hogland-ci
- name: Mint hogland OIDC token
# Retry + empty-token guard, matching the other mint sites: `curl |
# jq` takes jq's exit (which succeeds on empty input), so without the
# guard a transient OIDC outage would pass an empty token and the
# sweep would no-op silently instead of reaping stale previews.
run: |
token=""
for attempt in 1 2 3; do
token=$(curl -sf -H "Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" \
"${ACTIONS_ID_TOKEN_REQUEST_URL}&audience=${HOG_OIDC_AUDIENCE}" | jq -r '.value') || token=""
[ -n "$token" ] && [ "$token" != "null" ] && break
echo "::warning::OIDC mint attempt ${attempt} failed; retrying"
[ "$attempt" -lt 3 ] && sleep 5
done
[ -n "$token" ] && [ "$token" != "null" ] || { echo "::error::OIDC mint failed after 3 attempts"; exit 1; }
echo "::add-mask::$token"
echo "HOG_TOKEN=$token" >> "$GITHUB_ENV"
# uv (repo convention): --no-project skips the monorepo sync, --with
# pins the first-party SDK (exempted from the 7-day soak in [tool.uv]).
- uses: ./.github/actions/setup-uv
with:
enable-cache: false
- name: Reap previews for closed PRs
working-directory: tools/hogbox-preview
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_REPOSITORY: ${{ github.repository }}
DRY_RUN: ${{ inputs.dry_run || 'false' }}
run: uv run --no-project --with posthog-hogland==0.3.0 --python 3.12 python -m hogbox_preview --host "$HOG_HOST" cleanup-stale
Loading
Loading