feat(gatorwalk-factory): lifecycle entries carry issue-lifecycle's versions, counts and attempts (swamp-club #2772) #423

Merged
seth merged 2 commits from cue/2772-gatorwalk-factory-lifecycle into main 2026-10-01 18:42:09 +00:00
Owner

Closes swamp-club #2772.

A gatorwalk tracker entry's summary can now say what issue-lifecycle's entries say: which plan version was reviewed and approved, how many findings a review had, and which pull request attempt failed.

What changed

  • Summary values (_lib/engine/entry_summary.ts): {{$cycle}} (the attempt, on a stage re-entered per try), {{$version}}, {{$version.<product>}} (for an approval, the version in the approval's own products snapshot), {{$input.<name>}} and {{count <field> [key=value]}}. A fixed set, not CEL; every name is checked when the factory definition is saved, against the trigger, the product's schema (the findings contract for kind: findings) and the stage's bindings.
  • Triggers: on: dispatch (a stage entry's first dispatch, when bindings are resolved, so verification_started can name its commit and branch) and on: { transition: <name> } (leaving the stage by it, so attest.complete / merge.complete can post complete). An advance can now be two entries; the transition's is written under its own ledger key (-transition suffix).
  • Examples: build-swamp-extension declares entries that use them; a new test publishes a run of it to the built-in tracker. starter and minimal needed nothing.
  • Docs: DESIGN.md (publisher), README, driving.md (swamp data get <key> artifact-<name> --version <version> reads an earlier plan, gatorwalk's answer to issue-lifecycle's review --input version).

Former "Close" rows

The comparison doc was removed in #2842, so here is how each row closes:

issue-lifecycle entry gatorwalk summary now
plan_revised "(v2) — feedback round 1" {{$version}} and {{$cycle}}
adversarial_review "(plan v2): 1 critical, 0 high" {{$version.plan}}, {{count findings severity=critical}}
plan_approved "(v2)" {{$version.plan}} on the approve trigger
code_conformance_review counts {{count steps status=deviated}} etc.
verification_started commit and branch on: dispatch with {{$input.commit}}, {{$input.branch}}
verification_passed / _failed step count via {{count ...}}; failureReason is a factory-definition field
pr_linked / pr_merged / pr_failed "(attempt N)" {{$cycle}} of the pull-request stage
complete from a transition on: { transition: complete }

Testing

  • Unit tests for the parser, validation, projection (two entries per advance, era-scoped versions), the studio lanes, and an issue-lifecycle-shaped run against the swamp-club Lab fake: it shows "Plan revised (v2)", "(plan v2): 1 critical, 0 high", "Plan approved (v2)", the commit and branch, "(attempt 2)", and complete before done, and a re-run makes no request.
  • verify-build and verify-reviews pass; attestation posted for the head commit.

🤖 Generated with Claude Code

Closes swamp-club #2772. A gatorwalk tracker entry's summary can now say what issue-lifecycle's entries say: which plan version was reviewed and approved, how many findings a review had, and which pull request attempt failed. ## What changed - **Summary values** (`_lib/engine/entry_summary.ts`): `{{$cycle}}` (the attempt, on a stage re-entered per try), `{{$version}}`, `{{$version.<product>}}` (for an approval, the version in the approval's own products snapshot), `{{$input.<name>}}` and `{{count <field> [key=value]}}`. A fixed set, not CEL; every name is checked when the factory definition is saved, against the trigger, the product's schema (the findings contract for `kind: findings`) and the stage's bindings. - **Triggers**: `on: dispatch` (a stage entry's first dispatch, when bindings are resolved, so `verification_started` can name its commit and branch) and `on: { transition: <name> }` (leaving the stage by it, so `attest.complete` / `merge.complete` can post `complete`). An advance can now be two entries; the transition's is written under its own ledger key (`-transition` suffix). - **Examples**: `build-swamp-extension` declares entries that use them; a new test publishes a run of it to the built-in tracker. `starter` and `minimal` needed nothing. - **Docs**: DESIGN.md (publisher), README, driving.md (`swamp data get <key> artifact-<name> --version <version>` reads an earlier plan, gatorwalk's answer to issue-lifecycle's `review --input version`). ## Former "Close" rows The comparison doc was removed in #2842, so here is how each row closes: | issue-lifecycle entry | gatorwalk summary now | | --- | --- | | `plan_revised` "(v2) — feedback round 1" | `{{$version}}` and `{{$cycle}}` | | `adversarial_review` "(plan v2): 1 critical, 0 high" | `{{$version.plan}}`, `{{count findings severity=critical}}` | | `plan_approved` "(v2)" | `{{$version.plan}}` on the approve trigger | | `code_conformance_review` counts | `{{count steps status=deviated}}` etc. | | `verification_started` commit and branch | `on: dispatch` with `{{$input.commit}}`, `{{$input.branch}}` | | `verification_passed` / `_failed` | step count via `{{count ...}}`; `failureReason` is a factory-definition field | | `pr_linked` / `pr_merged` / `pr_failed` "(attempt N)" | `{{$cycle}}` of the pull-request stage | | `complete` from a transition | `on: { transition: complete }` | ## Testing - Unit tests for the parser, validation, projection (two entries per advance, era-scoped versions), the studio lanes, and an issue-lifecycle-shaped run against the swamp-club Lab fake: it shows "Plan revised (v2)", "(plan v2): 1 critical, 0 high", "Plan approved (v2)", the commit and branch, "(attempt 2)", and `complete` before `done`, and a re-run makes no request. - verify-build and verify-reviews pass; attestation posted for the head commit. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
A tracker entry's summary now reads what issue-lifecycle computes for its
entries, from the event as well as the payload: {{$cycle}} (the attempt, on
a stage re-entered for each try), {{$version}}, {{$version.<product>}} (for
an approval, the version in its products snapshot), {{$input.<name>}} on the
new dispatch trigger, and {{count <field> [key=value]}}. Every name is
checked when the factory definition is saved.

Two new triggers: on dispatch (a stage entry's first dispatch, when bindings
are resolved) and on { transition } (leaving the stage by it), so a complete
exit posts complete. An advance can now be two entries; the transition's is
written under its own ledger key.

build-swamp-extension declares entries that use them, and a Lab-fake test
drives an issue-lifecycle-shaped run through a revised plan and a second
pull request.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Merge remote-tracking branch 'origin/main' into cue/2772-gatorwalk-factory-lifecycle
All checks were successful
CI / Review Integrity (pull_request) Successful in 51s
CI / Validate Attestation (pull_request) Successful in 49s
78fd89deb5
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
seth merged commit 1a256d7c61 into main 2026-10-01 18:42:09 +00:00
seth deleted branch cue/2772-gatorwalk-factory-lifecycle 2026-10-01 18:42:09 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
swamp-club/swamp-extensions!423
No description provided.