monitoring-a-wizard-release
Skill200 starsChanged 10 days agoMITView on GitHub
Write the plan before you test the release candidate. Post it on the release PR. Then check it after the merge. For each metric, write the insight you will watch, the baseline from the previous version, and the change that counts as a regression. Cover these five: Split each one by version. Also split by program_id, harness, and model when the release touches them. All of these fired in the last 14 days. Every wizard event carries runid, version, build,…
We split this skill into the rules it gives an agent
5 rules. About 0 are common, 3 are distinctive, and 2 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 17
Write the plan before you test the release candidate.
- Very specific: line 42
All of these fired in the last 14 days.
- Distinctive: line 160
Do not compare this week with last week.
- Distinctive: line 165
Check again at 24 hours, when completion, duration, and cost have enough runs.
- Very specific: line 167
Wait for about 300 runs of the new version on posthog-integration before you trust a completion or cost change.
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Monitoring a wizard release
Write the plan before you test the release candidate. Post it on the release PR. Then check it after the merge.
The plan
For each metric, write the insight you will watch, the baseline from the previous version, and the change that counts as a regression. Cover these five:
- Usage. Runs started per program.
- Run duration. p50 and p90 wall clock per run.
- Cost. LLM cost per run.
- Completion rate. Runs started that finish with
status = success. - Outcomes. Success, cancelled, and error, with errors split by error code.
Split each one by version. Also split by program_id, harness, and model
when the release touches them.
Filters for every query
build = prod. Other values aredev,ci, andheadless.- Person
emaildoes not contain@posthog.com. program_idwhen the release touches one program.
Key events
All of these fired in the last 14 days. Every wizard event carries run_id,
version, build, run_surface, program_id, and command.
| Event | Use it for | Properties that matter |
wizard: started | Runs started | program_id, version, run_id |
wizard: auth complete | Runs past login | program_id, version |
wizard: switchboard resolved | Runner choice per run | harness (pi, anthropic), sequence (orchestrator, linear), model |
setup wizard finished | The one terminal event | status (success, cancelled, error), run_phase |
wizard: orchestrator run finished | Orchestrator run shape | total_duration_ms, tasks_total, tasks_failed, retried_task_count |
wizard: orchestrator task failed | Failed tasks | type (task type), error |
wizard: agent aborted | Aborted runs | failure_mode, duration_seconds |
$exception | Failures by code | error_code (PHW_*, see error catalog) |
$ai_generation | LLM cost | $ai_total_cost_usd, $ai_product (wizard:<program>), run_id |
wizard: mcp complete | MCP install after the run | mcp_outcome, mcp_newly_installed_clients, mcp_already_installed_clients, mcp_failed_clients, version |
Traps:
wizard: agent completedfires once per task under the orchestrator. Itsduration_msis task time, not run time. Never use it to count runs.wizard: agent startedfires before login, so it is not a sign that work began.$ai_generationhasrun_idbut noversion. Join it towizard: startedonrun_idto get cost per version.- The orchestrator sets
model = chosen-per-task. Per-task models are onwizard: orchestrator task models. - There is no context mill version property.
wizard: mcp completecounts coding agents only, and reports the first install attempt. A retry from the results screen fireswizard: mcp install retriedwithclientandsuccess. AI assistants (Claude Desktop/Web, ChatGPT) are counted bywizard: mcp assistant opened.- Since the MCP step started installing in every detected coding agent,
mcp_outcome = skippedis close to zero (there is no picker to decline) andmcp_installed_clientslists every detected coding agent instead of the ones a user ticked. Compare these within a version, not across that release.
Insights to build or reuse
| Metric | Build | Regression |
| Usage | Trend, wizard: started total count, breakdown program_id, daily | A program drops to near zero, or runs fall with no outside cause |
| Completion | Funnel wizard: started → wizard: auth complete → setup wizard finished where status = success, 2 hour window, breakdown version | Last step drops more than 3 points against the previous version |
| Outcomes | Trend, setup wizard finished total count, breakdown status, then a second trend on $exception with breakdown error_code | Error share rises, or a new PHW_* code shows up |
| Duration | Trend on wizard: orchestrator run finished, p50 and p90 of total_duration_ms, breakdown version | p50 or p90 up more than 20% |
| Cost | SQL below, or the cost by program tile | Cost per run up more than 20% |
| Orchestrator | Trend on wizard: orchestrator task failed, breakdown type | One task type starts failing |
One query covers runs, outcomes, and cost per version. Change the window and the program as needed:
WITH runs AS (
SELECT toString(properties.run_id) AS run_id,
argMin(toString(properties.version), timestamp) AS version,
argMin(toString(properties.program_id), timestamp) AS program
FROM events
WHERE timestamp >= now() - INTERVAL 7 DAY
AND event = 'wizard: started' AND properties.build = 'prod'
GROUP BY run_id),
fin AS (
SELECT toString(properties.run_id) AS run_id,
argMax(toString(properties.status), timestamp) AS status
FROM events
WHERE timestamp >= now() - INTERVAL 7 DAY AND event = 'setup wizard finished'
GROUP BY run_id),
cost AS (
SELECT toString(properties.run_id) AS run_id,
sum(toFloat(properties.$ai_total_cost_usd)) AS usd
FROM events
WHERE timestamp >= now() - INTERVAL 7 DAY AND event = '$ai_generation'
AND toString(properties.$ai_product) LIKE 'wizard:%'
GROUP BY run_id)
SELECT r.version, count() AS runs,
round(countIf(f.status = 'success') / count() * 100, 1) AS success_pct,
round(countIf(f.status = 'error') / count() * 100, 1) AS error_pct,
round(countIf(f.status = 'cancelled') / count() * 100, 1) AS cancelled_pct,
round(avgIf(c.usd, c.usd > 0), 2) AS cost_per_run_usd
FROM runs AS r
LEFT JOIN fin AS f ON f.run_id = r.run_id
LEFT JOIN cost AS c ON c.run_id = r.run_id
WHERE r.program = 'posthog-integration'
GROUP BY r.version
HAVING runs > 50
ORDER BY r.version DESCAbout 10% of runs send no setup wizard finished, so the three shares do not
add up to 100.
Starting points
- Wizard v2 overview. Usage by program, abort count, task completions, and AI cost by program.
- wizard-switchboard.
Completion, duration, and cost by runner arm, and orchestrator internals. Its
filters fix the start date to 2026-07-22 and the program to
posthog-integration. Set your own date range.
Tiles that are broken or misleading, as of 2026-10-15:
| Tile | Problem |
| Onboarding Wizard AI cost (copy) | Zero since 2026-09-21. It filters on the old ai_product = wizard tag |
| Wizard cost per user | Zero since 2026-09-28 |
| Agent started by workflow | workflow is no longer set, so every run is "None" |
| Next wizard usage by version | wizard interaction has almost stopped firing |
| Wizard Run Duration | Averages agent completed, which is task time under the orchestrator |
| Wizard Run Duration (copy) | Counts aborts longer than 15 minutes. It does not show a duration |
| Funnel: anthropic sdk | One person since July. The anthropic linear arm barely runs |
| Remarks: orchestrator runs | Returns no rows |
| Run duration by arm | The baseline arm has about 20 runs. Use the orchestrator row only |
Compare versions
- Break down by
version, or filter to the new version and the previous one. The previous version is your baseline. - New versions roll out as users run
npx @posthog/wizard@latest, so the old version keeps running for days. Compare the two versions over the same days. Do not compare this week with last week. - For a context mill release, the wizard version does not change. Compare the same wizard version before and after the release time. Add an annotation at the release time so it shows on every chart.
- Watch closely for the first 4 hours: usage, error share, and new error codes. Check again at 24 hours, when completion, duration, and cost have enough runs. Close the plan after 3 days if nothing moved.
- Wait for about 300 runs of the new version on
posthog-integrationbefore you trust a completion or cost change. Smaller programs need a longer window.
In this repository8 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- e2e-tests/test-applications/react-native-test-app/.cursor/rules/posthog-integration.mdcCursor rule
- adding-framework-supportSkill
- adding-skill-programSkill
- exploring-the-wizardSkill
- ink-tuiSkill
- wizard-developmentSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

