Relationships
⊘ blocks #2818#2803 gatorwalk-factory: the lifecycle holder reads its lifecycle from lifecycles/<name>.yaml
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
One copy of each lifecycle, at lifecycles/<name>.yaml in the repo, where people look for it. Today a lifecycle lives in two places: pasted by hand under globalArguments in the holder's definition (models/@swamp/gatorwalk-factory/lifecycle/<holder>.yaml, as the driving skill instructs), and as a source file under gatorwalk-factory's lifecycles/. Nothing syncs them, and they drift from the first edit.
Decision
The holder's globalArguments become { lifecycle: <repo-relative path> } (option B in the proposal). There are no users before launch, so the inline form is removed rather than kept beside the path.
Scope
HolderArgumentsSchemabecomes{ lifecycle: string }. The path is resolved againstctx.repoDir. Refuse, with the path in the message: an absolute path, one that resolves outside the repo (after following symlinks), one not ending in.yaml/.yml, and one that does not exist.validate,design_pageandnew_keyread the file, and so do the work item'sstartandreset repin=true. Pinning is unchanged:startstill pins the parsed lifecycle and its digest into the work item's data, and every later method reads that pinned copy, so editing the file never changes a running work item.- On a remote worker or a serve-hosted holder, where the repo file is absent, fail with a clear message: start the work item where the repo is. Remote holders are out of scope until needed.
- New holder method
init --from <starter>copies a bundled lifecycle (build-swamp-extension,swamp-extensions, ...) to the holder's path, and refuses to overwrite an existing file. The setup becomes:swamp model create @swamp/gatorwalk-factory/lifecycle team --global-arg lifecycle=lifecycles/team.yaml, thenswamp model method run team init --from build-swamp-extension. How the starters ship is part of this issue: gatorwalk-factory has no manifest until go-live (no_manifest_test.ts), so resolve them relative to the model module in source mode. - Update the skill (
references/driving.md, "Set up a lifecycle holder"), the README,integration/harness.ts,lifecycles_test.ts, the fakes, and DESIGN.md: a new section "Where a lifecycle lives" with the decision and why (one copy;startpins, so only start, validate, design_page and the studio read the file; remote holders later). The README's${{ }}caveat changes too: swamp no longer evaluates the lifecycle's text. - Templates: assume #2767 has removed them; do not carry
applyforward.
Acceptance
- The integration suite creates a holder with
--global-arg lifecycle=lifecycles/x.yaml, runsinit --from,validateanddesign_page, and starts a work item on it. - Editing the file after
startleaves the running work item on its pinned copy;reset repin=trueadopts the new file. - A path outside the repo, a missing file, and a non-YAML path are each refused with the path named.
Blocks: saved scenarios, and the studio model type.
Shipped
Click a lifecycle step above to view its details.
system commented 9/30/2026, 3:48:04 PM
Classified automatically when this issue was filed.
- Source: Extensions
If you feel this classification is incorrect, add a ripple to tell us so.
Sign in to post a ripple.