Relationships
⊘ blocks #2818#2805 gatorwalk-factory: saved scenarios next to a lifecycle, run by validate
Opened by skunk-ape · 9/30/2026· Shipped 9/30/2026
Part of the gatorwalk-factory studio (gatorwalk-factory/ in swamp-extensions). Read gatorwalk-factory/README.md and DESIGN.md first. Design proposal (decisions recorded 2026-09-30): https://claude.ai/artifact/BNCKp7w3G3Q8VdmnCDDWHP. Prototype, with its source under source/ (read it with the Artifact tool): https://claude.ai/artifact/1wAxrpUqZ47FAjE4fU9idD. Both links are private to the maintainer.
Goal
A lifecycle can be tested before anyone runs work on it. Saved scenarios sit next to the lifecycle, and validate runs them in-process on the real engine, so CI and any author catch a lifecycle change that breaks a known path. For now, in-process on committingStore(memoryStore()) is good enough; revisit with data.
Format
lifecycles/<name>.scenarios/<scenario>.yaml, where <name> is the lifecycle file's basename. One engine call per step:
scenario: plan-churn
lifecycle: swamp-extensions
description: The fifth plan revision hits the cycle limit; a person grants one more pass.
externalRefs: { swamp-club: "2801" }
steps:
- record: { evidence: classification }
payload: { type: feature, confidence: high, reasoning: A new list method }
- move: feature
- move: revise
manual: true
expect: { refused: "cycle override for 'plan'" }
- wait: 3600
note: The run sits at the cycle limit until someone looks
- override: { stage: plan, note: one more pass }
- approve: abandon-confirmation
- move: abandon
- expect: { stage: abandoned }- Verbs:
record(artifact or evidence, withpayload),approve,decline,move(manual: trueis a person's go),override(a cycle override),wait(seconds on the simulated clock), and a bareexpect: { stage }. expect: { refused: "<text>" }: the step must be refused, and its reason must contain the text (an empty string means any refusal). This pins gate messages.- Clock: one second per engine reading plus each
wait. Actors: records and automatic moves are an agent; approvals, overrides and manual moves are a person.
Scope
_lib/scenario.ts: a zod schema for the file, and the runner. Start from the prototype'ssource/src/sim.ts, which already passes both swamp-extensions scenarios on the real engine. The runner must stay free of Deno APIs, because the studio runs it in the browser. It returns one frame per step: the committed run, readiness fromevaluateTransitions,computeMetrics, and the outcome.validateruns every scenario of the holder's lifecycle and reports each unexpected step with its file and step index. Any unexpected step failsvalidate.- Convert the pure walks in
lifecycles_test.tsinto scenario files that the test runs. The prototype'ssource/scenarios/swamp-extensions.bug-to-done.yamlis the "a bug walks triage to done" test, transcribed. Keep in code only the assertions that inspect CEL results. - Document the format in the README and DESIGN.md ("Saved scenarios"), and in the skill: the agent writes scenario files (decided 2026-09-30), so the skill says where they go, the verbs, and to run
validateafter writing one.
Acceptance
validateon swamp-extensions runs its scenarios and passes; breaking a gate message makes it fail and name the step.- Unit tests cover each verb,
expectboth ways, and a malformed file.
Needs: #2803. Blocks: Simulate mode.
Shipped
Click a lifecycle step above to view its details.
system commented 9/30/2026, 3:48:14 PM
Classified automatically when this issue was filed.
- Source: Extensions
If you feel this classification is incorrect, add a ripple to tell us so.
skunk-ape commented 9/30/2026, 4:04:46 PM
Re-scoped. Seth decided on 2026-09-30 that the studio views and simulates but never edits: "Edits should come from the agent... I just don't think we should go down the road of having users create or edit by hand." The agent writes lifecycles and scenarios as files, and the local page reloads them. This issue already fit that. One line was added: the skill now documents the scenario format too, because the agent is the one that writes scenario files.
Sign in to post a ripple.