Skip to content

feat(agents): cron trigger scheduler v0#61028

Merged
dmarticus merged 12 commits into
assfrom
ass-dylan-cron
Jun 2, 2026
Merged

feat(agents): cron trigger scheduler v0#61028
dmarticus merged 12 commits into
assfrom
ass-dylan-cron

Conversation

@dmarticus
Copy link
Copy Markdown
Contributor

Problem

TriggerSchema has had a cron variant (schedule + timezone) since the v2 cutover, but nothing has woken those agents up — the field told you when but not what to do. Eight of the agents in _APP_IDEAS.md (weekly digests, gap analysis, growth review, etc.) plus self-healing v3 are blocked behind this. The plan at docs/agent-platform/plans/cron-trigger-scheduler.md is the design.

This PR is v0 end-to-end per plan §10. Cron-fired agents now actually run, two janitor replicas can't double-fire the same minute, and authors can iterate on a cron prompt without waiting for the next real firing.

Changes

Six commits, each a discrete slice:

  1. Schema foundation (05837f1f32) — migration adds idempotency_key TEXT NULL to agent_session with a partial unique index on (application_id, idempotency_key) WHERE NOT NULL, plus a sibling trigger_metadata JSONB. TriggerSchema.cron.config gains name, prompt, external_key, catch_up (all / most_recent / skip), max_catch_up_age_seconds. Freeze-time validation in validate-spec.ts parses the schedule via cron-parser, validates timezones via Intl.DateTimeFormat, and whitelists the placeholder set ({fired_at:iso|date|week}, {schedule}, {cron_name}) on both prompt and external_key.

  2. Idempotency-aware enqueueOrResume (989a6e5f09) — new SessionQueue.findByIdempotencyKey. The enqueue path checks for a duplicate before insert and falls back on the unique-violation lookup so a race between the pre-check and the INSERT resolves to the original session id rather than throwing. The webhook trigger forwards provider-supplied idempotency headers (Idempotency-Key, X-Idempotency-Key, X-GitHub-Delivery) so Stripe / GitHub / Slack redeliveries dedupe automatically — a strict improvement over today.

  3. cronTick() scheduler (a127f7a428) — runs alongside sweepOnce on the same setInterval. Lists every live cron revision, enumerates firings in (lastTickAt, now] via cron-parser, applies the catch_up policy bounded by max_catch_up_age_seconds, expands placeholders, and fires each survivor through enqueueOrResume with idempotencyKey = cron:<rev>:<name>:<minute>. Two janitor replicas hit the same partial unique index; one wins and the other no-ops via the lookup path. lastTickAt is per-process — the unique index is the source of truth for "did we fire this minute," not any persisted clock.

  4. Manual fire endpoint + 30d sweep (ee988bc906)POST /revisions/:id/cron/fire on the janitor + fireCronManually() helper. Dedupe key shape cron-manual:<rev>:<name>:<requestId> (distinct from the scheduled form so the two never collide). Authoring loop closes: you can iterate on a cron prompt without waiting for the next firing. New clearStaleIdempotencyKeys(cutoff) on SessionQueue; sweepOnce runs it as Policy 4 with a 30-day default so the partial index stays compact.

  5. e2e coverage (50303eca92)cases/cron-trigger.test.ts drives cronTick directly against the harness's real Postgres + worker + faux pi-ai. Three cases: scheduled firing → completed session, manual fire via janitor HTTP, manual-fire dedupe round-trip. Wires revisions + bundles into the harness janitor (they were already constructed but not passed in). Exports cronTick, newCronTickState, fireCronManually from @posthog/agent-janitor's lib.ts.

  6. UI badge + MCP fire tool (caa920c304) — Django serializers expose trigger_metadata on session responses. New CronTriggerBadge on SessionDetail renders "Fired by <cron_name> at <fired_at>" with a manual pill for manually-fired sessions. New cron_fire viewset action proxies to the janitor, surfaced as MCP tool agent-applications-revisions-cron-fire-create so the concierge (and any Claude Code / Cursor user) can fire a cron through MCP.

The idempotency_key primitive (1 + 2) lands webhook double-delivery safety as an independent side effect — the same key shape that cron uses is what the webhook trigger now forwards from provider headers.

How did you test this code?

  • 80+ unit tests across spec.test.ts (13 new cron-config cases), validate-spec.test.ts (7 freeze-time cases), enqueue.test.ts (6 idempotency cases including a race-window simulation via Proxy-wrapped queue), sweep.test.ts (3 retention cases), cron-tick.test.ts (14 scheduler cases covering every catch-up mode, max-age bound, two-replica dedupe, placeholder expansion, malformed-schedule recovery, and the manual-fire helper), server.test.ts (3 route cases).
  • Django: 4 new cases in test_cron_fire.py covering the action's contract against a mocked janitor_client. Ran via hogli test against the real Django test DB — 4 passed in 189s.
  • e2e (real PG + worker + faux pi-ai): 3 cron-trigger cases in cases/cron-trigger.test.ts + 2 webhook redelivery cases in cases/webhook-mcp-trigger.test.ts. The full agent-tests suite (excluding real-inference.test.ts which fails fast without provider keys) was 156/156 green.
  • MCP catalog: snapshot suite regenerated to include the new tool — agent-applications-revisions-cron-fire-create now lands in the tool-schema snapshot suite.
  • Did not run real-inference, did not test the badge in a live browser session (rendered the storybook story; manual browser verification deferred), did not test against more than one janitor replica simultaneously (the unique-index race path is unit-tested via the Proxy-wrapped queue but not stress-tested in a multi-process scenario).

Automatic notifications

  • Publish to changelog?
  • Alert Sales and Marketing teams?

Docs update

  • docs/agent-platform/plans/cron-trigger-scheduler.md — the design doc this PR implements. Ben's last edit on it (078ce5bb89 wip — cron plan) is the version this PR is built against.
  • docs/agent-platform/plans/_TODO.md already lists cron as in-progress and assigned to me (per the audit doc commit on ass); no doc updates in this PR.

🤖 Agent context

Agent-authored (Claude Opus 4.7) via Claude Code. Tools used: Read, Edit, Write, Bash, MultiEdit, Monitor (for waiting on hogli build:openapi + Django test runs). Six commits in the history because we discussed the rollout up front and treated each as an independently reviewable slice — same pattern as the runtime-mcps PR.

Key design decisions made along the way:

  • idempotency_key is the cross-cutting primitive, not a cron-specific column. PR-2 wires it for webhook redelivery as a side effect; future triggers (Slack message dedupe, scheduled retries) compose without new schema. Stripe-shaped semantics: duplicate → no-op, return original. Distinct from external_key which is "append on collision" — the two compose orthogonally.
  • lastTickAt is per-process in memory, not persisted. Multi-replica safety comes from the partial unique index on (application_id, idempotency_key), not from any persisted clock — the plan §6 makes this deliberate. The catch-up policy handles missed firings after a restart.
  • fireCronManually lives next to cronTick rather than getting duplicated into the route handler. Same execution path means a future bug in the scheduler's seed-message construction also breaks manual fire — caught once, in one place.
  • Workspace dep @posthog/agent-ingress added to agent-janitor so the janitor calls the same enqueueOrResume chat / webhook / Slack use (plan §2 was explicit about this). The agent-shared library doesn't carry ACL / elevation logic, so extracting a third primitive would have been bigger than this PR's scope.
  • Cron-fire MCP tool annotated destructive: false, idempotent: true — firing a cron is reversible (the session can be cancelled) and the same request_id dedupes; gating it as destructive would surface a confirmation modal in clients that respect annotations, which is the wrong UX for an authoring tool.

Reviewer asks: a second pair of eyes on (1) the catch-up skip semantics — I went with "fire only if there's exactly one survivor; drop everything if there are multiple missed firings" but the plan §7 could read as "always drop missed firings, only fire the live one" — happy to flip if the latter reads better. (2) The CronTriggerBadge rendering — visual look-and-feel is Ben's call; happy to tweak.

dmarticus added 6 commits June 1, 2026 13:47
First slice of cron-trigger-scheduler.md v0. Purely additive substrate: no
firing path, no scheduler, no behaviour change. Lays the schema groundwork
so PR-2 (idempotency-aware enqueue) and PR-3 (cronTick) have something to
land on.

Schema additions:
- New migration `1780346228100_agent_session_idempotency_key.sql`: nullable
  `idempotency_key` column + partial unique index on
  `(application_id, idempotency_key) WHERE NOT NULL`, plus a sibling
  `trigger_metadata JSONB` column for the firing-context envelope.
  Semantically distinct from `external_key` — see migration header.
- `AgentSession.idempotency_key` + `trigger_metadata` on the TS interface;
  `PgSessionQueue` and all literal constructions round-trip them.
- `TriggerSchema.cron.config` extended with `name`, `prompt`, `external_key`,
  `catch_up` ('all' | 'most_recent' | 'skip'), `max_catch_up_age_seconds`
  (1s — 7d). `schedule` becomes `z.string().min(1)`. Existing
  `schedule` + `timezone` carried forward.
- `validate-spec.ts` gains four cron-specific codes
  (`invalid_cron_schedule`, `invalid_cron_timezone`, `duplicate_cron_name`,
  `unknown_cron_placeholder`), parses the schedule against `cron-parser`,
  validates the timezone against `Intl.DateTimeFormat`, and whitelists the
  `{fired_at:iso|date|week}` / `{schedule}` / `{cron_name}` placeholders
  in both `prompt` and `external_key`. `cron-parser` ^4.9.0 added as an
  agent-janitor dep — it's load-bearing here, not just in the scheduler.

Janitor `/sessions/list` response now surfaces the two new fields. Ingress
`enqueueOrResume()` writes `null` for both — PR-2 wires the upsert-on-
conflict path that actually consumes `idempotency_key`.

Tests: 47 new (13 cron-config parsing in spec.test.ts; 7 cron-validation
cases in validate-spec.test.ts; all existing tests across shared/janitor/
runner/tests still pass). Three pre-existing pre-PR test failures
(`config.test.ts` + `platform.test.ts` env-var defaults, `server.test.ts`
auth-shape) confirmed by `git stash` round-trip — unrelated to this PR.
… redelivery dedupe

Second slice of cron-trigger-scheduler.md v0. Wires the dedupe primitive
PR-1 added the column for. PR-3 (cronTick) consumes this, but the webhook
side benefits independently — Stripe / GitHub / Slack retries that
previously created duplicate sessions now no-op cleanly.

SessionQueue interface gains `findByIdempotencyKey(applicationId, key)`.
PG impl reads through the partial unique index that PR-1 created; memory
impl walks the in-memory map. Implemented on both for harness symmetry.

enqueueOrResume() flow:
- Pre-check: if `idempotencyKey` is supplied and matches an existing
  session, return that session id immediately. Stripe-shaped: the
  duplicate request's principal + seed are dropped (the original is
  source of truth).
- On insert: if the unique index fires anyway (race window between the
  pre-check and the INSERT), re-look-up by key and return the row a
  concurrent writer created. Only engaged when a key is set;
  unique-violations without a key still propagate (the bug surface
  that path was protecting against is preserved).

Webhook trigger forwards provider-supplied idempotency headers in
precedence order: `Idempotency-Key` → `X-Idempotency-Key` →
`X-GitHub-Delivery`. Namespaced as `webhook:<header value>` so a future
cron firing can never collide with a webhook key under the same agent.

Tests: 6 new unit cases in `enqueue.test.ts` (first-create, duplicate-
returns-original, trigger_metadata round-trip, idempotency-beats-
external_key composition, race-window via Proxy-wrapped queue, no-key
propagation). 2 new e2e cases in `webhook-mcp-trigger.test.ts` covering
both `Idempotency-Key` and `X-GitHub-Delivery` redelivery dedupe via
real Postgres + the unique index. All existing enqueue / webhook
tests still pass. Same 3 pre-existing ingress server.test failures
(auth.modes shape mismatch from Ben's `24e9577e17`) confirmed unrelated.
Third slice of cron-trigger-scheduler.md v0. Wires the scheduler itself.
Cron-fired agents now actually run end-to-end once a session is fired.
Authoring loop closes in PR-4 (manual fire + observability).

New `RevisionStore.listLiveCronRevisions()`. v0 strategy per plan §6: a
SQL-side JOIN on `live_revision_id` + Node-side filter on
`spec.triggers.some(t => t.type === 'cron')`. Upgrade path
(`spec @> '{"triggers": [{"type": "cron"}]}'::jsonb` + a GIN index)
documented inline for when query volume forces it.

New `services/agent-janitor/src/cron-tick.ts`:
- `cronTick(deps, state)` lists live cron revisions, enumerates firings
  via `cron-parser` within `(lastTickAt, now]`, applies the `catch_up`
  policy (`all` / `most_recent` / `skip`) bounded by
  `max_catch_up_age_seconds`, and fires each survivor through
  `enqueueOrResume()` with `idempotencyKey =
cron:<rev>:<name>:<minute>`. The unique index from PR-1 + the
  dedupe-on-conflict path from PR-2 handle two-replica racing without
  any leader-election machinery.
- `lastTickAt` is per-process state (the plan §6 deliberate choice);
  the unique index is the source of truth for "did we fire this
  minute," not any persisted clock.
- Placeholder expansion (`{fired_at:iso}`, `{fired_at:date}`,
  `{fired_at:week}`, `{cron_name}`, `{schedule}`) renders into both
  `prompt` and `external_key`. Matches the whitelist the validator
  enforces at freeze time (PR-1).
- ISO-8601 week date computed inline (no moment.js dep) including
  year-boundary 53-week edge cases.

`services/agent-janitor/src/index.ts` invokes sweep + cronTick in
parallel inside the same `setInterval`. Independent try/catch on each
so a slow / throwing tick can't starve the other.

Workspace dep `@posthog/agent-ingress` added to agent-janitor so the
janitor can call the same `enqueueOrResume` chat/webhook/Slack use —
plan §2 is explicit about reusing that primitive.

Tests: 11 new cases in `cron-tick.test.ts` covering: empty no-op,
first-tick lastTickAt init, window-match firing, `all` /
`most_recent` / `skip` catch-up modes, `max_catch_up_age_seconds`
bound, two-replica idempotency, `trigger_metadata` stamping, prompt
+ external_key placeholder expansion, malformed-schedule recovery.
Existing janitor + chat + webhook e2e all pass.
…sweep

Final v0 slice of cron-trigger-scheduler.md. Closes the authoring loop
(you can now build and validate a cron agent without waiting for a real
firing) and gives the partial unique index a retention story.

`POST /revisions/:id/cron/fire` on the janitor:
- Body { cron_name, request_id?, fired_at? } — fires the named cron via
  the same `fireCronManually()` helper that the scheduler walks, with a
  dedupe key shape `cron-manual:<rev>:<name>:<requestId>` (distinct from
  the scheduled `cron:<rev>:<name>:<minute>` so manual + scheduled
  firings at the same minute don't collide).
- Optional `request_id` makes repeated UI clicks idempotent; without
  it every call generates a fresh UUID and fires unconditionally.
- Plan §9 calls this out as load-bearing for authoring — you can't
  sanely build a cron agent if "did the prompt work?" only has an
  answer at the next real firing.

`fireCronManually()` lives next to `cronTick()` in `cron-tick.ts` and
shares the placeholder expansion + enqueueOrResume call. Renders a
`{ kind: 'cron', cron_name, schedule, fired_at, manual: true }`
metadata stamp so the session-detail UI can distinguish manual fires
from scheduled ones.

Idempotency-key retention sweep:
- New `SessionQueue.clearStaleIdempotencyKeys(cutoff)` (PG + Memory).
- New `SweepDeps.idempotencyKeyTtlMs` (default 30d, set 0 to disable);
  surfaced as `IDEMPOTENCY_KEY_TTL_MS` env on the janitor config.
- `sweepOnce` runs it as Policy 4 and reports the count on
  `SweepResult.cleared_idempotency_keys`.
- Keeps the partial unique index compact; by 30d any retry that would
  have collided has long since happened (plan §6 "Retention").

What v0 still doesn't include (intentionally — these are E.1 + Django
work, separately scoped):
- Session-detail UI badge ("fired by <cron_name> at <fired_at>") — the
  `trigger_metadata` JSONB is on the row, just needs Ben to wire the
  console.
- MCP tool `agent-applications-revisions-cron-fire-create` — Django
  side, lives in `products/agent_stack/backend/`. The HTTP endpoint
  this PR adds is what the tool will call.

Tests: 3 new sweep cases (TTL default, custom TTL, disabled), 3 new
fireCronManually cases (idempotency-key shape, request_id dedupe,
unknown cron rejection), 3 new server.test.ts route cases (success,
dedupe, 404 on unknown cron). Existing sweep + server tests updated
for the new `cleared_idempotency_keys` field in SweepResult.
Janitor 110/110, shared persistence 35/35, webhook e2e 10/10.
… flow

Pins the customer experience nothing else exercised in concert: cron tick
→ enqueueOrResume → real worker claims → runner streams faux model →
session completes with the right `trigger_metadata` + idempotency_key.
Without this, a regression in any wiring point (cron seed shape,
metadata stamp, runner-side message handling, harness setup) would slip
past the per-layer unit tests.

Three new e2e cases in `services/agent-tests/src/cases/cron-trigger.test.ts`:

- Scheduled firing: `cronTick(deps, state)` at a controlled time fires
  for the matched minute, runner completes, idempotency_key shape =
  `cron:<rev>:<name>:<minute>`, trigger_metadata stamped, prompt
  placeholder-expanded (`{fired_at:date}` → `2026-06-01`).
- Manual fire: `POST /revisions/:id/cron/fire` on the real janitor app
  enqueues + the runner completes, idempotency_key shape =
  `cron-manual:<rev>:<name>:<requestId>`, `trigger_metadata.manual` true.
- Manual-fire dedupe: two POSTs with the same `request_id` resolve to
  the same session id end-to-end (real PG unique-violation round-trip).

Required two harness changes:
- Expose `cronTick`, `newCronTickState`, `fireCronManually` from
  `agent-janitor`'s `lib.ts` so e2e cases can drive cron deterministically
  without standing up the setInterval.
- Wire `revisions` + `bundles` into the harness's `buildJanitorApp` call.
  They were already constructed in the cluster setup; the janitor just
  wasn't getting them. Unblocks `/revisions/:id/cron/fire` (and would have
  been needed eventually for any cron-related janitor endpoint).

Janitor sweep test in `cases/janitor.test.ts` updated for the
`cleared_idempotency_keys` field added in PR-4.

156/156 of the existing e2e suite still passes (excluding real-inference,
which fails fast without provider keys per harness contract).
Completes v0 of cron-trigger-scheduler.md per plan §10. Two pieces that
make the cron rollout actually usable from the human + agent surfaces:

1. **Cron fire badge on session-detail.** The session row already carries
   `trigger_metadata` JSONB from PR-1; this surfaces it.
   - Django: `trigger_metadata` field added to all three session
     serializer shapes (list summary, detail, fleet-live). Janitor was
     already including the field in its response; Django just wasn't
     declaring it. OpenAPI regenerated.
   - Frontend: `triggerMetadataToSessionTrigger()` in `apiClient.ts`
     maps the raw JSONB shape onto the typed `SessionTrigger` the
     playback consumes. New `CronTriggerBadge` component renders
     "Fired by `<cron_name>` at `<fired_at>`" with a `manual` pill
     when the firing came from the manual-fire endpoint vs the
     scheduler. `SessionTrigger.cron` extended with `cronName` +
     `manual` to carry the new fields; existing storybook fixtures
     migrated.

2. **`agent-applications-revisions-cron-fire-create` MCP tool.** Wires
   the janitor `POST /revisions/:id/cron/fire` endpoint as an MCP tool
   so the concierge (and any other MCP client) can manually fire a cron
   for authoring iteration.
   - Django: new `cron_fire` action on `AgentRevisionViewSet` proxying
     to `janitor_client.cron_fire`. Validates `cron_name` is non-empty;
     `request_id` is optional (forwards None so the janitor mints a UUID).
   - `janitor_client.py`: new `cron_fire(revision_id, cron_name,
     request_id)` method.
   - MCP definition added to `services/mcp/definitions/agent_stack.yaml`
     with `destructive: false, idempotent: true` annotations (fire is
     reversible — sessions can be cancelled — and same `request_id`
     dedupes). Generated tool catalog regenerated.

Tests: 4 new Django tests in `test_cron_fire.py` exercising the action
contract (cron_name forwarding, optional request_id, missing-name
rejection, empty-name rejection). MCP tool-schemas snapshot updated to
include the new tool. Storybook `SessionDetail > CronFire` story now
shows the badge against the existing cron fixture.

Generated artefacts regenerated via `hogli build:openapi` — touches:
- `services/agent-console/src/generated/agent-stack.api.schemas.ts`
- `services/mcp/src/{generated,tools/generated}/agent_stack*.ts`
- `services/mcp/schema/{generated-tool-definitions,tool-definitions-all}.json`
- `products/agent_stack/frontend/generated/api*.ts`
- MCP unit snapshots under `tests/unit/__snapshots__/tool-schemas/`
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

MCP UI Apps size report

App JS CSS
debug 474.9 KB 139.9 KB
action 349.4 KB 139.9 KB
action-list 357.2 KB 139.9 KB
cohort 348.5 KB 139.9 KB
cohort-list 356.2 KB 139.9 KB
error-details 369.9 KB 139.9 KB
error-issue 349.2 KB 139.9 KB
error-issue-list 357.2 KB 139.9 KB
experiment 353.7 KB 139.9 KB
experiment-list 358.0 KB 139.9 KB
experiment-results 355.8 KB 139.9 KB
feature-flag 434.3 KB 139.9 KB
feature-flag-list 438.8 KB 139.9 KB
feature-flag-testing 427.2 KB 139.9 KB
insight-actors 352.3 KB 139.9 KB
llm-costs 351.9 KB 139.9 KB
session-recording 350.2 KB 139.9 KB
session-summary 356.2 KB 139.9 KB
survey 350.0 KB 139.9 KB
survey-global-stats 354.8 KB 139.9 KB
survey-list 357.9 KB 139.9 KB
survey-stats 354.8 KB 139.9 KB
trace-span 348.8 KB 139.9 KB
trace-span-list 357.1 KB 139.9 KB
workflow 348.8 KB 139.9 KB
workflow-list 356.6 KB 139.9 KB
query-results 370.6 KB 139.9 KB
visual-review-snapshots 353.5 KB 139.9 KB

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

Size Change: 0 B

Total Size: 81 MB

ℹ️ View Unchanged
Filename Size
frontend/dist-report/decompression-worker/src/scenes/session-recordings/player/snapshot-processing/decompressionWorker 2.85 kB
frontend/dist-report/exporter/_chunks/chunk 8.44 MB
frontend/dist-report/exporter/_parent/products/actions/frontend/pages/Action 25 kB
frontend/dist-report/exporter/_parent/products/actions/frontend/pages/Actions 1.33 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/AIObservabilityScene 120 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/AIObservabilitySessionScene 19.9 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/AIObservabilityTraceScene 130 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/AIObservabilityUsers 872 B
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/clusters/AIObservabilityClusterScene 21.7 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/clusters/AIObservabilityClustersScene 55.1 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/datasets/AIObservabilityDatasetScene 21 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/datasets/AIObservabilityDatasetsScene 3.64 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/evaluations/AIObservabilityEvaluation 59.9 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/evaluations/AIObservabilityEvaluationsScene 28.2 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/evaluations/EvaluationTemplates 915 B
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/LLMASessionFeedbackDisplay 5.19 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/playground/AIObservabilityPlaygroundScene 37.8 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/prompts/LLMPromptScene 29.2 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/prompts/LLMPromptsScene 4.83 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/skills/LLMSkillScene 929 B
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/skills/LLMSkillsScene 946 B
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/tags/AIObservabilityTag 27.4 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/tags/AIObservabilityTagsScene 7.31 kB
frontend/dist-report/exporter/_parent/products/business_knowledge/frontend/scenes/BusinessKnowledgeScene 19 kB
frontend/dist-report/exporter/_parent/products/conversations/frontend/components/Assignee/CyclotronJobInputAssignee 1.67 kB
frontend/dist-report/exporter/_parent/products/conversations/frontend/components/SlaBusinessHours/CyclotronJobInputBusinessHours 3.06 kB
frontend/dist-report/exporter/_parent/products/conversations/frontend/components/TicketTags/CyclotronJobInputTicketTags 1.06 kB
frontend/dist-report/exporter/_parent/products/conversations/frontend/scenes/settings/SupportSettingsScene 1.82 kB
frontend/dist-report/exporter/_parent/products/conversations/frontend/scenes/ticket/SupportTicketScene 34.4 kB
frontend/dist-report/exporter/_parent/products/conversations/frontend/scenes/tickets/SupportTicketsScene 1.07 kB
frontend/dist-report/exporter/_parent/products/customer_analytics/frontend/CustomerAnalyticsScene 53.1 kB
frontend/dist-report/exporter/_parent/products/customer_analytics/frontend/scenes/CustomerAnalyticsConfigurationScene/CustomerAnalyticsConfigurationScene 2.65 kB
frontend/dist-report/exporter/_parent/products/customer_analytics/frontend/scenes/CustomerJourneyBuilderScene/CustomerJourneyBuilderScene 2.18 kB
frontend/dist-report/exporter/_parent/products/customer_analytics/frontend/scenes/CustomerJourneyTemplatesScene/CustomerJourneyTemplatesScene 7.86 kB
frontend/dist-report/exporter/_parent/products/data_warehouse/DataWarehouseScene 46.8 kB
frontend/dist-report/exporter/_parent/products/data_warehouse/frontend/scenes/NewSourceScene/NewSourceScene 1.12 kB
frontend/dist-report/exporter/_parent/products/data_warehouse/frontend/scenes/SchemaScene/SchemaScene 24.4 kB
frontend/dist-report/exporter/_parent/products/data_warehouse/frontend/scenes/SourceScene/SourceScene 1.06 kB
frontend/dist-report/exporter/_parent/products/data_warehouse/frontend/scenes/SourcesScene/SourcesScene 6.31 kB
frontend/dist-report/exporter/_parent/products/deployments/frontend/Deployment 4.05 kB
frontend/dist-report/exporter/_parent/products/deployments/frontend/DeploymentProject 5.58 kB
frontend/dist-report/exporter/_parent/products/deployments/frontend/Deployments 9.31 kB
frontend/dist-report/exporter/_parent/products/early_access_features/frontend/EarlyAccessFeature 1.02 kB
frontend/dist-report/exporter/_parent/products/early_access_features/frontend/EarlyAccessFeatures 3.24 kB
frontend/dist-report/exporter/_parent/products/endpoints/frontend/EndpointScene 40.6 kB
frontend/dist-report/exporter/_parent/products/endpoints/frontend/EndpointsScene 24.5 kB
frontend/dist-report/exporter/_parent/products/error_tracking/frontend/scenes/ErrorTrackingFingerprintsScene/ErrorTrackingIssueFingerprintsScene 7.41 kB
frontend/dist-report/exporter/_parent/products/error_tracking/frontend/scenes/ErrorTrackingIssueScene/ErrorTrackingIssueScene 104 kB
frontend/dist-report/exporter/_parent/products/error_tracking/frontend/scenes/ErrorTrackingScene/ErrorTrackingScene 27.1 kB
frontend/dist-report/exporter/_parent/products/feature_flags/frontend/FeatureFlagTemplatesScene 7.38 kB
frontend/dist-report/exporter/_parent/products/games/368Hedgehogs/368Hedgehogs 5.61 kB
frontend/dist-report/exporter/_parent/products/games/FlappyHog/FlappyHog 6.12 kB
frontend/dist-report/exporter/_parent/products/legal_documents/frontend/scenes/LegalDocumentNewScene 60.5 kB
frontend/dist-report/exporter/_parent/products/legal_documents/frontend/scenes/LegalDocumentsScene 5.31 kB
frontend/dist-report/exporter/_parent/products/links/frontend/LinkScene 25.2 kB
frontend/dist-report/exporter/_parent/products/links/frontend/LinksScene 4.55 kB
frontend/dist-report/exporter/_parent/products/live_debugger/frontend/LiveDebugger 19.5 kB
frontend/dist-report/exporter/_parent/products/logs/frontend/LogsScene 17.9 kB
frontend/dist-report/exporter/_parent/products/logs/frontend/scenes/LogsAlertDetailScene/LogsAlertDetailScene 17.2 kB
frontend/dist-report/exporter/_parent/products/logs/frontend/scenes/LogsAlertNotificationDetailScene/LogsAlertNotificationDetailScene 8.49 kB
frontend/dist-report/exporter/_parent/products/logs/frontend/scenes/LogsSamplingDetailScene/LogsSamplingDetailScene 5.3 kB
frontend/dist-report/exporter/_parent/products/logs/frontend/scenes/LogsSamplingNewScene/LogsSamplingNewScene 2.25 kB
frontend/dist-report/exporter/_parent/products/managed_migrations/frontend/ManagedMigration 14.9 kB
frontend/dist-report/exporter/_parent/products/mcp_analytics/frontend/MCPAnalyticsScene 40.6 kB
frontend/dist-report/exporter/_parent/products/mcp_analytics/frontend/MCPAnalyticsToolDetail 18.5 kB
frontend/dist-report/exporter/_parent/products/metrics/frontend/MetricsScene 16.2 kB
frontend/dist-report/exporter/_parent/products/product_analytics/frontend/insights/stickiness/StickinessBarChart/StickinessBarChart 3.31 kB
frontend/dist-report/exporter/_parent/products/product_analytics/frontend/insights/stickiness/StickinessLineChart/StickinessLineChart 3.14 kB
frontend/dist-report/exporter/_parent/products/product_analytics/frontend/insights/trends/TrendsBarChart/TrendsBarChart 7.36 kB
frontend/dist-report/exporter/_parent/products/product_analytics/frontend/insights/trends/TrendsLifecycleChart/TrendsLifecycleChart 4.41 kB
frontend/dist-report/exporter/_parent/products/product_analytics/frontend/insights/trends/TrendsLineChart/TrendsLineChart 4.6 kB
frontend/dist-report/exporter/_parent/products/product_analytics/frontend/insights/trends/TrendsPieChart/TrendsPieChart 4.35 kB
frontend/dist-report/exporter/_parent/products/replay_vision/frontend/observations/ReplayObservation 8.64 kB
frontend/dist-report/exporter/_parent/products/replay_vision/frontend/replay_scanners/ReplayScanner 35.3 kB
frontend/dist-report/exporter/_parent/products/replay_vision/frontend/replay_scanners/ReplayScannersScene 11.6 kB
frontend/dist-report/exporter/_parent/products/replay_vision/frontend/replay_scanners/ScannerTemplatesScene 4.59 kB
frontend/dist-report/exporter/_parent/products/revenue_analytics/frontend/RevenueAnalyticsScene 26.5 kB
frontend/dist-report/exporter/_parent/products/session_summaries/frontend/SessionGroupSummariesTable 5.05 kB
frontend/dist-report/exporter/_parent/products/session_summaries/frontend/SessionGroupSummaryScene 19.2 kB
frontend/dist-report/exporter/_parent/products/tasks/frontend/SlackTaskContextScene 8.88 kB
frontend/dist-report/exporter/_parent/products/tasks/frontend/TaskDetailScene 23.8 kB
frontend/dist-report/exporter/_parent/products/tasks/frontend/TaskTracker 14.6 kB
frontend/dist-report/exporter/_parent/products/tracing/frontend/TracingScene 60.5 kB
frontend/dist-report/exporter/_parent/products/user_interviews/frontend/UserInterview 9.32 kB
frontend/dist-report/exporter/_parent/products/user_interviews/frontend/UserInterviewResponse 7.79 kB
frontend/dist-report/exporter/_parent/products/user_interviews/frontend/UserInterviews 6.08 kB
frontend/dist-report/exporter/_parent/products/visual_review/frontend/scenes/VisualReviewIndexScene 2.56 kB
frontend/dist-report/exporter/_parent/products/visual_review/frontend/scenes/VisualReviewRunScene 44.7 kB
frontend/dist-report/exporter/_parent/products/visual_review/frontend/scenes/VisualReviewRunsScene 7.32 kB
frontend/dist-report/exporter/_parent/products/visual_review/frontend/scenes/VisualReviewSettingsScene 11.1 kB
frontend/dist-report/exporter/_parent/products/visual_review/frontend/scenes/VisualReviewSnapshotHistoryScene 13.9 kB
frontend/dist-report/exporter/_parent/products/visual_review/frontend/scenes/VisualReviewSnapshotOverviewScene 19.6 kB
frontend/dist-report/exporter/_parent/products/workflows/frontend/TemplateLibrary/MessageTemplate 16.6 kB
frontend/dist-report/exporter/_parent/products/workflows/frontend/Workflows/WorkflowScene 111 kB
frontend/dist-report/exporter/_parent/products/workflows/frontend/WorkflowsScene 60.2 kB
frontend/dist-report/exporter/src/exporter/exporter 19.7 kB
frontend/dist-report/exporter/src/exporter/scenes/ExporterDashboardScene 2.02 kB
frontend/dist-report/exporter/src/exporter/scenes/ExporterHeatmapScene 19.9 kB
frontend/dist-report/exporter/src/exporter/scenes/ExporterInsightScene 3.02 kB
frontend/dist-report/exporter/src/exporter/scenes/ExporterInterviewScene 310 kB
frontend/dist-report/exporter/src/exporter/scenes/ExporterNotebookScene 2.71 MB
frontend/dist-report/exporter/src/exporter/scenes/ExporterRecordingScene 1.13 kB
frontend/dist-report/exporter/src/exporterSharedChunkAnchors 1.19 kB
frontend/dist-report/exporter/src/lib/components/Cards/TextCard/TextCardMarkdownEditor 11.3 kB
frontend/dist-report/exporter/src/lib/components/MonacoDiffEditor 471 B
frontend/dist-report/exporter/src/lib/lemon-ui/LemonMarkdown/MermaidDiagram 2.25 kB
frontend/dist-report/exporter/src/lib/lemon-ui/LemonTextArea/LemonTextAreaMarkdown 842 B
frontend/dist-report/exporter/src/lib/lemon-ui/Link/Link 359 B
frontend/dist-report/exporter/src/lib/monaco/CodeEditorInline 832 B
frontend/dist-report/exporter/src/lib/monaco/vimMode 211 kB
frontend/dist-report/exporter/src/lib/ui/Button/ButtonPrimitives 422 B
frontend/dist-report/exporter/src/queries/nodes/WebVitals/WebVitals 7.52 kB
frontend/dist-report/exporter/src/queries/nodes/WebVitals/WebVitalsPathBreakdown 4.09 kB
frontend/dist-report/exporter/src/queries/schema 856 kB
frontend/dist-report/exporter/src/scenes/approvals/changeRequestsLogic 884 B
frontend/dist-report/exporter/src/scenes/authentication/passkeyLogic 824 B
frontend/dist-report/exporter/src/scenes/data-pipelines/event-filtering/EventFilterScene 22.2 kB
frontend/dist-report/exporter/src/scenes/data-pipelines/TransformationsScene 6.54 kB
frontend/dist-report/exporter/src/scenes/insights/views/BoxPlot/BoxPlot 5.39 kB
frontend/dist-report/exporter/src/scenes/insights/views/CalendarHeatMap/CalendarHeatMap 8.84 kB
frontend/dist-report/exporter/src/scenes/insights/views/RegionMap/RegionMap 29.8 kB
frontend/dist-report/exporter/src/scenes/insights/views/WorldMap/WorldMap 1.04 MB
frontend/dist-report/exporter/src/scenes/models/ModelsScene 19 kB
frontend/dist-report/exporter/src/scenes/models/NodeDetailScene 17 kB
frontend/dist-report/monaco-editor-worker/src/lib/monaco/workers/monacoEditorWorker 288 kB
frontend/dist-report/monaco-json-worker/src/lib/monaco/workers/monacoJsonWorker 419 kB
frontend/dist-report/monaco-typescript-worker/src/lib/monaco/workers/monacoTsWorker 7.02 MB
frontend/dist-report/posthog-app/_chunks/chunk 8.64 MB
frontend/dist-report/posthog-app/_parent/products/actions/frontend/pages/Action 25.1 kB
frontend/dist-report/posthog-app/_parent/products/actions/frontend/pages/Actions 1.4 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/AIObservabilityScene 120 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/AIObservabilitySessionScene 19.9 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/AIObservabilityTraceScene 130 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/AIObservabilityUsers 906 B
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/clusters/AIObservabilityClusterScene 21.7 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/clusters/AIObservabilityClustersScene 55.1 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/datasets/AIObservabilityDatasetScene 21 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/datasets/AIObservabilityDatasetsScene 3.67 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/evaluations/AIObservabilityEvaluation 59.9 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/evaluations/AIObservabilityEvaluationsScene 28.2 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/evaluations/EvaluationTemplates 949 B
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/LLMASessionFeedbackDisplay 5.23 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/playground/AIObservabilityPlaygroundScene 37.8 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/prompts/LLMPromptScene 29.2 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/prompts/LLMPromptsScene 4.86 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/skills/LLMSkillScene 963 B
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/skills/LLMSkillsScene 980 B
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/tags/AIObservabilityTag 27.4 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/tags/AIObservabilityTagsScene 7.34 kB
frontend/dist-report/posthog-app/_parent/products/business_knowledge/frontend/scenes/BusinessKnowledgeScene 19 kB
frontend/dist-report/posthog-app/_parent/products/conversations/frontend/components/Assignee/CyclotronJobInputAssignee 1.71 kB
frontend/dist-report/posthog-app/_parent/products/conversations/frontend/components/SlaBusinessHours/CyclotronJobInputBusinessHours 3.09 kB
frontend/dist-report/posthog-app/_parent/products/conversations/frontend/components/TicketTags/CyclotronJobInputTicketTags 1.09 kB
frontend/dist-report/posthog-app/_parent/products/conversations/frontend/scenes/settings/SupportSettingsScene 1.85 kB
frontend/dist-report/posthog-app/_parent/products/conversations/frontend/scenes/ticket/SupportTicketScene 26.6 kB
frontend/dist-report/posthog-app/_parent/products/conversations/frontend/scenes/tickets/SupportTicketsScene 1.11 kB
frontend/dist-report/posthog-app/_parent/products/customer_analytics/frontend/CustomerAnalyticsScene 51.9 kB
frontend/dist-report/posthog-app/_parent/products/customer_analytics/frontend/scenes/CustomerAnalyticsConfigurationScene/CustomerAnalyticsConfigurationScene 2.68 kB
frontend/dist-report/posthog-app/_parent/products/customer_analytics/frontend/scenes/CustomerJourneyBuilderScene/CustomerJourneyBuilderScene 2.22 kB
frontend/dist-report/posthog-app/_parent/products/customer_analytics/frontend/scenes/CustomerJourneyTemplatesScene/CustomerJourneyTemplatesScene 7.9 kB
frontend/dist-report/posthog-app/_parent/products/data_warehouse/DataWarehouseScene 1.81 kB
frontend/dist-report/posthog-app/_parent/products/data_warehouse/frontend/scenes/NewSourceScene/NewSourceScene 1.22 kB
frontend/dist-report/posthog-app/_parent/products/data_warehouse/frontend/scenes/SchemaScene/SchemaScene 24.5 kB
frontend/dist-report/posthog-app/_parent/products/data_warehouse/frontend/scenes/SourceScene/SourceScene 1.13 kB
frontend/dist-report/posthog-app/_parent/products/data_warehouse/frontend/scenes/SourcesScene/SourcesScene 6.34 kB
frontend/dist-report/posthog-app/_parent/products/deployments/frontend/Deployment 4.08 kB
frontend/dist-report/posthog-app/_parent/products/deployments/frontend/DeploymentProject 5.61 kB
frontend/dist-report/posthog-app/_parent/products/deployments/frontend/Deployments 9.35 kB
frontend/dist-report/posthog-app/_parent/products/early_access_features/frontend/EarlyAccessFeature 1.2 kB
frontend/dist-report/posthog-app/_parent/products/early_access_features/frontend/EarlyAccessFeatures 3.28 kB
frontend/dist-report/posthog-app/_parent/products/endpoints/frontend/EndpointScene 40.7 kB
frontend/dist-report/posthog-app/_parent/products/endpoints/frontend/EndpointsScene 22.4 kB
frontend/dist-report/posthog-app/_parent/products/error_tracking/frontend/scenes/ErrorTrackingFingerprintsScene/ErrorTrackingIssueFingerprintsScene 7.48 kB
frontend/dist-report/posthog-app/_parent/products/error_tracking/frontend/scenes/ErrorTrackingIssueScene/ErrorTrackingIssueScene 103 kB
frontend/dist-report/posthog-app/_parent/products/error_tracking/frontend/scenes/ErrorTrackingScene/ErrorTrackingScene 27.2 kB
frontend/dist-report/posthog-app/_parent/products/feature_flags/frontend/FeatureFlagTemplatesScene 7.42 kB
frontend/dist-report/posthog-app/_parent/products/games/368Hedgehogs/368Hedgehogs 5.65 kB
frontend/dist-report/posthog-app/_parent/products/games/FlappyHog/FlappyHog 6.16 kB
frontend/dist-report/posthog-app/_parent/products/legal_documents/frontend/scenes/LegalDocumentNewScene 60.5 kB
frontend/dist-report/posthog-app/_parent/products/legal_documents/frontend/scenes/LegalDocumentsScene 5.35 kB
frontend/dist-report/posthog-app/_parent/products/links/frontend/LinkScene 25.2 kB
frontend/dist-report/posthog-app/_parent/products/links/frontend/LinksScene 4.58 kB
frontend/dist-report/posthog-app/_parent/products/live_debugger/frontend/LiveDebugger 19.5 kB
frontend/dist-report/posthog-app/_parent/products/logs/frontend/LogsScene 17.9 kB
frontend/dist-report/posthog-app/_parent/products/logs/frontend/scenes/LogsAlertDetailScene/LogsAlertDetailScene 17.3 kB
frontend/dist-report/posthog-app/_parent/products/logs/frontend/scenes/LogsAlertNotificationDetailScene/LogsAlertNotificationDetailScene 8.53 kB
frontend/dist-report/posthog-app/_parent/products/logs/frontend/scenes/LogsSamplingDetailScene/LogsSamplingDetailScene 5.34 kB
frontend/dist-report/posthog-app/_parent/products/logs/frontend/scenes/LogsSamplingNewScene/LogsSamplingNewScene 2.29 kB
frontend/dist-report/posthog-app/_parent/products/managed_migrations/frontend/ManagedMigration 14.9 kB
frontend/dist-report/posthog-app/_parent/products/mcp_analytics/frontend/MCPAnalyticsScene 40.6 kB
frontend/dist-report/posthog-app/_parent/products/mcp_analytics/frontend/MCPAnalyticsToolDetail 18.6 kB
frontend/dist-report/posthog-app/_parent/products/metrics/frontend/MetricsScene 16.2 kB
frontend/dist-report/posthog-app/_parent/products/product_analytics/frontend/insights/stickiness/StickinessBarChart/StickinessBarChart 3.34 kB
frontend/dist-report/posthog-app/_parent/products/product_analytics/frontend/insights/stickiness/StickinessLineChart/StickinessLineChart 3.18 kB
frontend/dist-report/posthog-app/_parent/products/product_analytics/frontend/insights/trends/TrendsBarChart/TrendsBarChart 7.4 kB
frontend/dist-report/posthog-app/_parent/products/product_analytics/frontend/insights/trends/TrendsLifecycleChart/TrendsLifecycleChart 4.45 kB
frontend/dist-report/posthog-app/_parent/products/product_analytics/frontend/insights/trends/TrendsLineChart/TrendsLineChart 4.64 kB
frontend/dist-report/posthog-app/_parent/products/product_analytics/frontend/insights/trends/TrendsPieChart/TrendsPieChart 4.38 kB
frontend/dist-report/posthog-app/_parent/products/replay_vision/frontend/observations/ReplayObservation 8.68 kB
frontend/dist-report/posthog-app/_parent/products/replay_vision/frontend/replay_scanners/ReplayScanner 35.4 kB
frontend/dist-report/posthog-app/_parent/products/replay_vision/frontend/replay_scanners/ReplayScannersScene 11.6 kB
frontend/dist-report/posthog-app/_parent/products/replay_vision/frontend/replay_scanners/ScannerTemplatesScene 4.63 kB
frontend/dist-report/posthog-app/_parent/products/revenue_analytics/frontend/RevenueAnalyticsScene 26.6 kB
frontend/dist-report/posthog-app/_parent/products/session_summaries/frontend/SessionGroupSummariesTable 5.09 kB
frontend/dist-report/posthog-app/_parent/products/session_summaries/frontend/SessionGroupSummaryScene 19.3 kB
frontend/dist-report/posthog-app/_parent/products/tasks/frontend/SlackTaskContextScene 8.91 kB
frontend/dist-report/posthog-app/_parent/products/tasks/frontend/TaskDetailScene 23.9 kB
frontend/dist-report/posthog-app/_parent/products/tasks/frontend/TaskTracker 14.7 kB
frontend/dist-report/posthog-app/_parent/products/tracing/frontend/TracingScene 60.6 kB
frontend/dist-report/posthog-app/_parent/products/user_interviews/frontend/UserInterview 9.35 kB
frontend/dist-report/posthog-app/_parent/products/user_interviews/frontend/UserInterviewResponse 7.83 kB
frontend/dist-report/posthog-app/_parent/products/user_interviews/frontend/UserInterviews 6.12 kB
frontend/dist-report/posthog-app/_parent/products/visual_review/frontend/scenes/VisualReviewIndexScene 2.59 kB
frontend/dist-report/posthog-app/_parent/products/visual_review/frontend/scenes/VisualReviewRunScene 44.7 kB
frontend/dist-report/posthog-app/_parent/products/visual_review/frontend/scenes/VisualReviewRunsScene 7.36 kB
frontend/dist-report/posthog-app/_parent/products/visual_review/frontend/scenes/VisualReviewSettingsScene 11.1 kB
frontend/dist-report/posthog-app/_parent/products/visual_review/frontend/scenes/VisualReviewSnapshotHistoryScene 13.9 kB
frontend/dist-report/posthog-app/_parent/products/visual_review/frontend/scenes/VisualReviewSnapshotOverviewScene 19.6 kB
frontend/dist-report/posthog-app/_parent/products/workflows/frontend/TemplateLibrary/MessageTemplate 16.7 kB
frontend/dist-report/posthog-app/_parent/products/workflows/frontend/Workflows/WorkflowScene 104 kB
frontend/dist-report/posthog-app/_parent/products/workflows/frontend/WorkflowsScene 60.3 kB
frontend/dist-report/posthog-app/src/index 61.1 kB
frontend/dist-report/posthog-app/src/layout/panel-layout/ai-first/tabs/NavTabChat 7.19 kB
frontend/dist-report/posthog-app/src/lib/components/Cards/TextCard/TextCardMarkdownEditor 11.3 kB
frontend/dist-report/posthog-app/src/lib/components/MonacoDiffEditor 471 B
frontend/dist-report/posthog-app/src/lib/lemon-ui/LemonMarkdown/MermaidDiagram 2.29 kB
frontend/dist-report/posthog-app/src/lib/lemon-ui/LemonTextArea/LemonTextAreaMarkdown 876 B
frontend/dist-report/posthog-app/src/lib/lemon-ui/Link/Link 359 B
frontend/dist-report/posthog-app/src/lib/monaco/CodeEditorInline 866 B
frontend/dist-report/posthog-app/src/lib/monaco/vimMode 211 kB
frontend/dist-report/posthog-app/src/lib/ui/Button/ButtonPrimitives 426 B
frontend/dist-report/posthog-app/src/queries/nodes/WebVitals/WebVitals 7.55 kB
frontend/dist-report/posthog-app/src/queries/nodes/WebVitals/WebVitalsPathBreakdown 4.12 kB
frontend/dist-report/posthog-app/src/queries/schema 856 kB
frontend/dist-report/posthog-app/src/scenes/activity/explore/EventsScene 3.32 kB
frontend/dist-report/posthog-app/src/scenes/activity/explore/SessionsScene 4.72 kB
frontend/dist-report/posthog-app/src/scenes/activity/live/LiveEventsTable 5.62 kB
frontend/dist-report/posthog-app/src/scenes/agentic/AgenticAuthorize 5.87 kB
frontend/dist-report/posthog-app/src/scenes/approvals/ApprovalDetail 16.6 kB
frontend/dist-report/posthog-app/src/scenes/approvals/changeRequestsLogic 918 B
frontend/dist-report/posthog-app/src/scenes/audit-logs/AdvancedActivityLogsScene 42.1 kB
frontend/dist-report/posthog-app/src/scenes/AuthenticatedShell 165 kB
frontend/dist-report/posthog-app/src/scenes/authentication/AccountConnected 3.36 kB
frontend/dist-report/posthog-app/src/scenes/authentication/AgenticAccountMismatch 2.77 kB
frontend/dist-report/posthog-app/src/scenes/authentication/CLIAuthorize 11.8 kB
frontend/dist-report/posthog-app/src/scenes/authentication/CLILive 4.4 kB
frontend/dist-report/posthog-app/src/scenes/authentication/credential-review/CredentialReview 3.98 kB
frontend/dist-report/posthog-app/src/scenes/authentication/EmailMFAVerify 3.4 kB
frontend/dist-report/posthog-app/src/scenes/authentication/InviteSignup 15.4 kB
frontend/dist-report/posthog-app/src/scenes/authentication/Login 10.2 kB
frontend/dist-report/posthog-app/src/scenes/authentication/Login2FA 5.11 kB
frontend/dist-report/posthog-app/src/scenes/authentication/passkeyLogic 858 B
frontend/dist-report/posthog-app/src/scenes/authentication/PasswordReset 4.74 kB
frontend/dist-report/posthog-app/src/scenes/authentication/PasswordResetComplete 3.38 kB
frontend/dist-report/posthog-app/src/scenes/authentication/signup/SignupContainer 28.6 kB
frontend/dist-report/posthog-app/src/scenes/authentication/signup/verify-email/VerifyEmail 5.16 kB
frontend/dist-report/posthog-app/src/scenes/authentication/TwoFactorReset 4.41 kB
frontend/dist-report/posthog-app/src/scenes/authentication/VercelConnect 5.37 kB
frontend/dist-report/posthog-app/src/scenes/authentication/VercelLinkError 2.64 kB
frontend/dist-report/posthog-app/src/scenes/billing/AuthorizationStatus 1.1 kB
frontend/dist-report/posthog-app/src/scenes/billing/Billing 867 B
frontend/dist-report/posthog-app/src/scenes/billing/BillingSection 21.2 kB
frontend/dist-report/posthog-app/src/scenes/cohorts/Cohort 28.4 kB
frontend/dist-report/posthog-app/src/scenes/cohorts/CohortCalculationHistory 6.61 kB
frontend/dist-report/posthog-app/src/scenes/cohorts/Cohorts 9.81 kB
frontend/dist-report/posthog-app/src/scenes/coupons/Coupons 1.1 kB
frontend/dist-report/posthog-app/src/scenes/dashboard/Dashboard 1.68 kB
frontend/dist-report/posthog-app/src/scenes/dashboard/dashboards/Dashboards 19.9 kB
frontend/dist-report/posthog-app/src/scenes/dashboard/dashboards/templates/DashboardTemplateCopyScene 6.09 kB
frontend/dist-report/posthog-app/src/scenes/data-management/DataManagementScene 1.02 kB
frontend/dist-report/posthog-app/src/scenes/data-management/definition/DefinitionEdit 17.2 kB
frontend/dist-report/posthog-app/src/scenes/data-management/definition/DefinitionView 24.4 kB
frontend/dist-report/posthog-app/src/scenes/data-management/MaterializedColumns/MaterializedColumns 12 kB
frontend/dist-report/posthog-app/src/scenes/data-management/variables/SqlVariableEditScene 7.63 kB
frontend/dist-report/posthog-app/src/scenes/data-pipelines/batch-exports/BatchExportScene 61 kB
frontend/dist-report/posthog-app/src/scenes/data-pipelines/DataPipelinesNewScene 2.72 kB
frontend/dist-report/posthog-app/src/scenes/data-pipelines/DestinationsScene 3.1 kB
frontend/dist-report/posthog-app/src/scenes/data-pipelines/event-filtering/EventFilterScene 22.3 kB
frontend/dist-report/posthog-app/src/scenes/data-pipelines/legacy-plugins/LegacyPluginScene 21 kB
frontend/dist-report/posthog-app/src/scenes/data-pipelines/TransformationsScene 2.34 kB
frontend/dist-report/posthog-app/src/scenes/data-pipelines/WebScriptsScene 2.96 kB
frontend/dist-report/posthog-app/src/scenes/data-warehouse/DataWarehouseScene 1.75 kB
frontend/dist-report/posthog-app/src/scenes/data-warehouse/editor/EditorScene 1.52 kB
frontend/dist-report/posthog-app/src/scenes/debug/DebugScene 20.3 kB
frontend/dist-report/posthog-app/src/scenes/debug/hog/HogRepl 7.75 kB
frontend/dist-report/posthog-app/src/scenes/experiments/Experiment 208 kB
frontend/dist-report/posthog-app/src/scenes/experiments/Experiments 20.9 kB
frontend/dist-report/posthog-app/src/scenes/experiments/SharedMetrics/SharedMetric 6.45 kB
frontend/dist-report/posthog-app/src/scenes/experiments/SharedMetrics/SharedMetrics 923 B
frontend/dist-report/posthog-app/src/scenes/exports/ExportsScene 4.45 kB
frontend/dist-report/posthog-app/src/scenes/feature-flags/FeatureFlag 144 kB
frontend/dist-report/posthog-app/src/scenes/feature-flags/FeatureFlags 1.12 kB
frontend/dist-report/posthog-app/src/scenes/groups/Group 15.6 kB
frontend/dist-report/posthog-app/src/scenes/groups/Groups 4.29 kB
frontend/dist-report/posthog-app/src/scenes/groups/GroupsNew 7.73 kB
frontend/dist-report/posthog-app/src/scenes/health-alerts/HealthAlertsScene 4.17 kB
frontend/dist-report/posthog-app/src/scenes/health/categoryDetail/HealthCategoryDetailScene 7.64 kB
frontend/dist-report/posthog-app/src/scenes/health/HealthScene 12.8 kB
frontend/dist-report/posthog-app/src/scenes/health/pipelineStatus/PipelineStatusScene 11.5 kB
frontend/dist-report/posthog-app/src/scenes/heatmaps/scenes/heatmap/HeatmapNewScene 5.41 kB
frontend/dist-report/posthog-app/src/scenes/heatmaps/scenes/heatmap/HeatmapRecordingScene 4.31 kB
frontend/dist-report/posthog-app/src/scenes/heatmaps/scenes/heatmap/HeatmapScene 6.94 kB
frontend/dist-report/posthog-app/src/scenes/heatmaps/scenes/heatmaps/HeatmapsScene 4.27 kB
frontend/dist-report/posthog-app/src/scenes/hog-functions/HogFunctionScene 55.3 kB
frontend/dist-report/posthog-app/src/scenes/inbox/InboxScene 63.4 kB
frontend/dist-report/posthog-app/src/scenes/insights/InsightQuickStart/InsightQuickStart 5.81 kB
frontend/dist-report/posthog-app/src/scenes/insights/InsightScene 34.8 kB
frontend/dist-report/posthog-app/src/scenes/insights/views/BoxPlot/BoxPlot 5.43 kB
frontend/dist-report/posthog-app/src/scenes/insights/views/CalendarHeatMap/CalendarHeatMap 4.87 kB
frontend/dist-report/posthog-app/src/scenes/insights/views/RegionMap/RegionMap 29.8 kB
frontend/dist-report/posthog-app/src/scenes/insights/views/WorldMap/WorldMap 5.16 kB
frontend/dist-report/posthog-app/src/scenes/instance/AsyncMigrations/AsyncMigrations 13.5 kB
frontend/dist-report/posthog-app/src/scenes/instance/DeadLetterQueue/DeadLetterQueue 5.77 kB
frontend/dist-report/posthog-app/src/scenes/instance/QueryPerformance/QueryPerformance 9 kB
frontend/dist-report/posthog-app/src/scenes/instance/SystemStatus/SystemStatus 17.4 kB
frontend/dist-report/posthog-app/src/scenes/IntegrationsRedirect/IntegrationsRedirect 1.11 kB
frontend/dist-report/posthog-app/src/scenes/marketing-analytics/MarketingAnalyticsScene 42.1 kB
frontend/dist-report/posthog-app/src/scenes/max/Max 1.06 kB
frontend/dist-report/posthog-app/src/scenes/models/ModelsScene 19.1 kB
frontend/dist-report/posthog-app/src/scenes/models/NodeDetailScene 17.1 kB
frontend/dist-report/posthog-app/src/scenes/moveToPostHogCloud/MoveToPostHogCloud 4.84 kB
frontend/dist-report/posthog-app/src/scenes/new-tab/NewTabScene 1.85 kB
frontend/dist-report/posthog-app/src/scenes/notebooks/NotebookCanvasScene 3.92 kB
frontend/dist-report/posthog-app/src/scenes/notebooks/NotebookPanel/NotebookPanel 5.98 kB
frontend/dist-report/posthog-app/src/scenes/notebooks/NotebookScene 9.29 kB
frontend/dist-report/posthog-app/src/scenes/notebooks/NotebooksScene 7.98 kB
frontend/dist-report/posthog-app/src/scenes/oauth/OAuthAuthorize 1.01 kB
frontend/dist-report/posthog-app/src/scenes/onboarding/coupon/OnboardingCouponRedemption 1.58 kB
frontend/dist-report/posthog-app/src/scenes/onboarding/Onboarding 792 kB
frontend/dist-report/posthog-app/src/scenes/onboarding/sdks/SdkDoctorScene 10.2 kB
frontend/dist-report/posthog-app/src/scenes/organization/ConfirmOrganization/ConfirmOrganization 4.91 kB
frontend/dist-report/posthog-app/src/scenes/organization/Create/Create 1.03 kB
frontend/dist-report/posthog-app/src/scenes/organization/Deactivated 1.51 kB
frontend/dist-report/posthog-app/src/scenes/organization/PendingDeletion 2.48 kB
frontend/dist-report/posthog-app/src/scenes/persons/PersonScene 20.3 kB
frontend/dist-report/posthog-app/src/scenes/persons/PersonsScene 6.12 kB
frontend/dist-report/posthog-app/src/scenes/PreflightCheck/PreflightCheck 5.95 kB
frontend/dist-report/posthog-app/src/scenes/product-tours/ProductTour 275 kB
frontend/dist-report/posthog-app/src/scenes/product-tours/ProductTours 5.06 kB
frontend/dist-report/posthog-app/src/scenes/project-homepage/ProjectHomepage 19.1 kB
frontend/dist-report/posthog-app/src/scenes/project/Create/Create 1.21 kB
frontend/dist-report/posthog-app/src/scenes/resource-transfer/ResourceTransfer 9.56 kB
frontend/dist-report/posthog-app/src/scenes/saved-insights/SavedInsights 1.04 kB
frontend/dist-report/posthog-app/src/scenes/session-recordings/detail/SessionRecordingDetail 2.14 kB
frontend/dist-report/posthog-app/src/scenes/session-recordings/file-playback/SessionRecordingFilePlaybackScene 4.85 kB
frontend/dist-report/posthog-app/src/scenes/session-recordings/kiosk/SessionRecordingsKiosk 10.3 kB
frontend/dist-report/posthog-app/src/scenes/session-recordings/player/snapshot-processing/DecompressionWorkerManager 329 B
frontend/dist-report/posthog-app/src/scenes/session-recordings/playlist/SessionRecordingsPlaylistScene 5.49 kB
frontend/dist-report/posthog-app/src/scenes/session-recordings/SessionRecordings 1.15 kB
frontend/dist-report/posthog-app/src/scenes/session-recordings/settings/SessionRecordingsSettingsScene 2.35 kB
frontend/dist-report/posthog-app/src/scenes/sessions/SessionProfileScene 15.6 kB
frontend/dist-report/posthog-app/src/scenes/settings/SettingsScene 3.94 kB
frontend/dist-report/posthog-app/src/scenes/sites/Site 1.9 kB
frontend/dist-report/posthog-app/src/scenes/startups/StartupProgram 21.6 kB
frontend/dist-report/posthog-app/src/scenes/StripeConfirmInstall/StripeConfirmInstall 3.92 kB
frontend/dist-report/posthog-app/src/scenes/subscriptions/SubscriptionScene 14.4 kB
frontend/dist-report/posthog-app/src/scenes/subscriptions/SubscriptionsScene 5.23 kB
frontend/dist-report/posthog-app/src/scenes/surveys/forms/SurveyFormBuilder 1.93 kB
frontend/dist-report/posthog-app/src/scenes/surveys/Survey 1.39 kB
frontend/dist-report/posthog-app/src/scenes/surveys/Surveys 26.8 kB
frontend/dist-report/posthog-app/src/scenes/surveys/wizard/SurveyWizard 72.8 kB
frontend/dist-report/posthog-app/src/scenes/themes/CustomCssScene 3.94 kB
frontend/dist-report/posthog-app/src/scenes/toolbar-launch/ToolbarLaunch 2.85 kB
frontend/dist-report/posthog-app/src/scenes/Unsubscribe/Unsubscribe 2.04 kB
frontend/dist-report/posthog-app/src/scenes/web-analytics/SessionAttributionExplorer/SessionAttributionExplorerScene 7.01 kB
frontend/dist-report/posthog-app/src/scenes/web-analytics/WebAnalyticsScene 13.3 kB
frontend/dist-report/posthog-app/src/scenes/wizard/Wizard 4.83 kB
frontend/dist-report/posthog-app/src/sharedChunkAnchors 1.19 kB
frontend/dist-report/render-query/src/render-query/render-query 27.4 MB
frontend/dist-report/toolbar/src/toolbar/toolbar 15.7 MB

compressed-size-action

Comment thread services/agent-ingress/src/triggers/webhook.ts
@veria-ai
Copy link
Copy Markdown

veria-ai Bot commented Jun 1, 2026

PR overview

This pull request adds an initial cron trigger scheduler for agents, including janitor tick processing for scheduled trigger firings and catch-up behavior after missed runs.

There is one open security concern remaining, while one prior issue has already been addressed. The remaining issue is a resource-exhaustion risk: a high-frequency cron trigger with broad catch-up settings could cause a janitor tick to enumerate and attempt a very large number of firings after downtime. Adding a per-trigger/per-tick cap or rejecting overly frequent schedules would substantially reduce the current risk.

Open issues (1)

Fixed/addressed: 1 · PR risk: 5/10

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

🎭 Playwright report

⚠️ 2 flaky tests:

  • create experiment via wizard, add metrics, and launch (chromium)
  • launch variant-specific survey from multivariant feature flag (chromium)

These issues are not necessarily caused by your changes.
Annoyed by this comment? Help fix flakies and failures and it'll disappear!

tests-posthog Bot and others added 2 commits June 1, 2026 22:32
Veria flagged the webhook idempotency key as forgeable: an attacker
with reach to a public webhook could POST first with a guessed
provider header (e.g. a Stripe event id leaked via a log) so a later
legitimate delivery dedupes to the attacker's session and drops the
real payload. Namespacing the dedupe key with a sha256 of the parsed
body fixes this — same header + same body still collapses for
provider retries, but spoof + different body lands a separate session.
This is defence-in-depth; provider signature verification stays the
primary guard.

Also bundles the small CI-driven cleanups so the cron PR is green:
- MCP exec-tool snapshot picks up the new `agent-applications-
  revisions-cron-fire-create` tool description.
- `products/agent_stack/product.yaml` re-indented to satisfy oxfmt
  (pre-existing drift on the file, surfaced once the workflow ran
  against this branch).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
dmarticus added a commit that referenced this pull request Jun 1, 2026
Pre-existing whitespace drift on `products/agent_stack/product.yaml`
surfaced once `Frontend formatting` ran against this branch. Mirrors
the same fix landed on the sibling cron PR (#61028).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

🔍 Migration Risk Analysis

We've analyzed your migrations for potential risks.

Summary: 2 Safe | 0 Needs Review | 0 Blocked

✅ Safe

Brief or no lock, backwards compatible

agent_stack.0001_initial
  └─ #1 ✅ CreateModel
     Creating new table is safe
     model: AgentApplication
  └─ #2 ✅ CreateModel
     Creating new table is safe
     model: AgentRevision
  └─ #3 ✅ AddField
     Adding nullable field requires brief lock
     model: agentapplication, field: live_revision
  │
  └──> ℹ️  INFO:
       ℹ️  Skipped operations on newly created tables (empty tables
       don't cause lock contention).
agent_stack.0002_agentcustomtooltemplate_and_more
  └─ #1 ✅ CreateModel
     Creating new table is safe
     model: AgentCustomToolTemplate
  └─ #2 ✅ CreateModel
     Creating new table is safe
     model: AgentRevisionCustomToolTemplate
  └─ #3 ✅ CreateModel
     Creating new table is safe
     model: AgentRevisionNativeTool
  └─ #4 ✅ CreateModel
     Creating new table is safe
     model: AgentSkillTemplate
  └─ #5 ✅ CreateModel
     Creating new table is safe
     model: AgentRevisionSkillTemplate
  └─ #6 ✅ CreateModel
     Creating new table is safe
     model: AgentSkillTemplateFile
  │
  └──> ℹ️  INFO:
       ℹ️  Skipped operations on newly created tables (empty tables
       don't cause lock contention).

📚 How to Deploy These Changes Safely

AddField:

This operation acquires a brief lock but doesn't rewrite the table.

Deployment uses lock timeouts with automatic retries, so lock contention will cause retries rather than connection pile-up.

Last updated: 2026-06-01 23:05 UTC (fd32158)

…ests

Three follow-ups from the cron-trigger review:

1. Add `cron_fire` to AgentRevisionViewSet.scope_object_write_actions.
   Without it, posthog.permissions._get_required_scopes() returns None
   for the action, and any PAT/OAuth caller (i.e. the MCP transport,
   which is the only caller of the new fire tool) gets a 403 with
   "this action does not support personal API key access". Session-auth
   tests didn't catch it because they short-circuit before the scope
   check.

2. Clamp the enumeration window in cronTick BEFORE walking firings.
   cron-parser accepts 6-field sub-minute schedules and the zod schema
   does not gate them; combined with the 7-day max_catch_up_age cap,
   a paused janitor returning to life could enumerate ~604k firings
   in a single tick only to throw them away in applyCatchUp. The clamp
   keeps firings.length bounded by the cap regardless of how long the
   janitor was down. Added a regression test asserting a 7-day pause
   on `* * * * *` enumerates exactly 2 firings (= cap / minute) and
   skips zero on the catch-up discard path.

3. Pin the idempotency-key guarantees against real Postgres. The
   ingress's enqueueOrResume relies on:
   - the partial unique index throwing 23505 on duplicate (app, key),
   - NULL keys NOT colliding (partial WHERE NOT NULL),
   - key collisions scoped to application_id (multi-app safe),
   - clearStaleIdempotencyKeys nulling only rows past cutoff +
     surfacing the affected count.
   Previously only the in-memory MemorySessionQueue covered these
   behaviours. Add four PG-backed tests in pg-impls.test.ts so a
   future index change (e.g. dropping the WHERE clause, widening the
   key scope) fails loudly.
const windowFrom = lastTickAt > earliestAllowed ? lastTickAt : earliestAllowed
let firings: Date[]
try {
firings = enumerateFirings(cfg.schedule, cfg.timezone, windowFrom, now)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Medium: Unbounded cron catch-up work

An agent author can publish a cron trigger such as * * * * * * with catch_up: "all" and a 7-day max_catch_up_age_seconds, causing a janitor tick after a pause to enumerate and attempt hundreds of thousands of firings for that one trigger. Add a scheduler-side cap on firings per trigger/tick, or reject sub-minute/high-frequency schedules at validation time.

dmarticus and others added 2 commits June 2, 2026 09:03
# Conflicts:
#	pnpm-lock.yaml
#	services/mcp/tests/unit/__snapshots__/tool-schemas/activity-log-list.json
@tests-posthog
Copy link
Copy Markdown
Contributor

tests-posthog Bot commented Jun 2, 2026

Query snapshots: Backend query snapshots updated

Changes: 8 snapshots (8 modified, 0 added, 0 deleted)

What this means:

  • Query snapshots have been automatically updated to match current output
  • These changes reflect modifications to database queries or schema

Next steps:

  • Review the query changes to ensure they're intentional
  • If unexpected, investigate what caused the query to change

Review snapshot changes →

@dmarticus dmarticus merged commit 2150c8a into ass Jun 2, 2026
180 of 191 checks passed
@dmarticus dmarticus deleted the ass-dylan-cron branch June 2, 2026 16:14
dmarticus added a commit that referenced this pull request Jun 2, 2026
…tick cap

Addresses the unaddressed Veria review on #61028 (cron-tick.ts): a
high-frequency schedule with catch_up=all and a large max_catch_up_age
could fire hundreds of thousands of sessions in a single tick.

- validate-spec: reject schedules that fire more than once a minute
  (cron_schedule_too_frequent), measured from the first two firings.
- cron-tick: cap firings per trigger per tick at 100, keeping the most
  recent and logging the dropped tail (cron.tick.firings_capped).

Also corrects a pre-existing failing test (max_catch_up_age_seconds
bounds the catch-up) to match the clamp's boundary-exclusive behavior.

Generated-By: PostHog Code
Task-Id: 2799c922-58af-49d2-af31-fb1e59c74c30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants