Relationships
#2734 gatorwalk-factory: drive a swamp-extensions Lab issue end to end through the swamp-club adapter (gap 1)
Opened by skunk-ape · 9/29/2026· Shipped 9/29/2026
Part of the gatorwalk-factory rebuild (gatorwalk-factory/ in swamp-extensions). Read gatorwalk-factory/README.md and DESIGN.md ("Trackers", "The swamp-club Lab adapter", "The projection publisher") first. This closes gap 1 in lifecycles/swamp-extensions.md: the lifecycle cannot act on swamp-club.
Goal
A gatorwalk work item can drive a swamp-extensions Lab issue end to end, doing what issue-lifecycle does to the Lab, so the issue looks the same to anyone reading it there. issue-lifecycle stays as it is and keeps driving every other issue. Do not change issue-lifecycle.
What issue-lifecycle does, and what gatorwalk lacks
The reference is the root copy extensions/models/issue_lifecycle.ts with _lib/swamp_club.ts and _lib/lifecycle_recorder.ts, which is the one this repo runs (not issue-lifecycle/extensions/...).
| Lab action | issue-lifecycle | gatorwalk today |
|---|---|---|
| Status | PATCH at triage, approve, ship and complete | Covered: publish plus projection.status |
| Assign on start | best-effort | Covered: assign |
| Post the attestation | post_attestation |
Covered: adapter post_attestation |
| Ripple | only the contributor thank-you | Covered as comment |
Lifecycle entries (POST /api/v1/lab/issues/{n}/lifecycle: step, targetStatus, summary, emoji, payload, isVerbose) |
one per method, about 25 step names | Missing. publish posts ripples only |
Issue type (PATCH {type}) at triage |
yes | Missing |
| Full fetch (body, comments, type, author, authorId) | stored at start, used by triage and notify | Partial: number, title, status, assignees |
| Author vs team for the thank-you | fail-closed roster lookup | Missing |
Scope
- Adapter (
@swamp/gatorwalk-factory/swamp-club):- a
set_typemethod; - a full
fetch_issue(body, comments, type, author, authorId); - a team-membership check for an issue's author, fail-closed like issue-lifecycle's;
- a lifecycle-entry writer. Keep the tracker contract and the conformance suite honest. If a method is Lab-only, say how it sits beside the shared contract.
- a
- Lifecycle entries through
publish. Journal events project to structured lifecycle entries, idempotent through the delivery ledger like the existing comments. The one-writer rule holds:publishstays the only writer of status, and a stage requests transitions rather than moving the ticket. - Wiring
swamp-extensions.yaml:triagesets the type;attestposts through the adapter and records the id it returns;notifychecks the roster and posts the ripple through the adapter. A stage has one work block. Choose, and justify, whether these stay interactive stages where the agent calls the adapter, or becomemode: methodstages (none exist yet in a bundled lifecycle). Update the file header, the mapping, and the skill's driving reference.
- Guard against two drivers.
claimrefuses an issue that already has an issue-lifecycle instance (@swamp/issue-lifecycle, namedissue-<N>) in the repo, with a clear message. This is a read-only check from gatorwalk's side.
Questions to bring back before building
- Lifecycle entry step names: reuse issue-lifecycle's names (
triage_started,classified,plan_generated,verification_passed,attestation_posted,pr_linked,shipped, ...) so the Lab history reads the same, or project gatorwalk's own events under its own names. Coordinator lean: reuse issue-lifecycle's where an event matches. - Whether the attestation check stays in CI only.
validate-attestationalready reads the attestation from the Lab by commit. The lean is yes, with no read-back in the lifecycle.
Sequencing
#2730 is editing swamp-extensions.yaml now, and #2732 (per-stage complete exits) follows it. Do scope items 1, 2 and 4 first. Rebase onto #2730 before the wiring in item 3.
Done when
- The adapter methods exist, with unit tests against the Lab fake and conformance coverage.
publishwrites lifecycle entries idempotently. A re-run posts nothing new.swamp-extensions.yamldrives type, attestation and thank-you through the adapter, and gap 1 is marked resolved in the mapping.claimrefuses an issue that issue-lifecycle has an instance for.- A real-engine integration test drives a work item against the Lab fake from claim to notify and checks the entries, the type, the status sequence and the ripple.
Out of scope
- Any change to issue-lifecycle.
- Migrating in-flight issues between drivers.
- Gap 7 (restart semantics) and gap 3 (where a workflow lives).
Shipped
Click a lifecycle step above to view its details.
system commented 9/29/2026, 8:58:43 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/29/2026, 9:02:15 PM
Decisions from Seth on the two questions in this issue:
- Lifecycle entry step names: reuse issue-lifecycle's step names wherever a gatorwalk event matches one, so the Lab history reads the same.
- Attestation check: it stays in CI only (
validate-attestation). The lifecycle does no read-back.
Sign in to post a ripple.