Issue Lifecycle
Security Notice
This extension includes AI agent skills that can modify AI assistant behavior. Review the skill files before installing.
Issue lifecycle model with 9 bundled Claude Code skills for DDD, TDD, moldable development, and parallel code review.
Drives issues from filing through triage, prior-art lookup, DDD + TDD
planning, parallel review fan-out (5 review skills), autonomous
code-review iteration (zero CRITICAL + zero HIGH gate), optional UAT/KB
harvest, and completion. State persists across sessions via the state
resource; the hydrate method writes a cheap summary resource for
long autonomous loops.
State Machine
filed ──[triage]──> triaged
triaged ──[plan]──> planned
planned ──[review_plan]──> reviewing
reviewing ──[approve_plan]──> approved
reviewing ──[reject_plan]──> planned (feedback loop)
approved ──[implement]──> writing_tests
writing_tests ──[review_tests]──> reviewing_tests
reviewing_tests ──[iterate_tests]──> writing_tests (autonomous TDD sub-loop)
reviewing_tests ──[tests_approved]──> implementing (autonomous gate)
implementing ──[verify]──> verifying
verifying ──[iterate_verification]──> implementing (autonomous loop)
verifying ──[review_code]──> code_reviewing (the ONLY path onward)
code_reviewing ──[resolve_findings]──> resolved
code_reviewing ──[iterate]──> implementing (autonomous loop)
resolved ──[iterate]──> implementing
resolved ──[attest]──> attested (optional)
resolved ──[harvest]──> harvested (optional)
resolved ──[complete]──> complete
attested ──[harvest]──> harvested
attested ──[complete]──> complete
harvested ──[complete]──> completeapprove_plan requires full matrix coverage AND zero open CRITICAL AND
zero open HIGH findings AND no reviewer FAIL verdict. tests_approved
enforces the same gate autonomously (override bypasses both dimensions).
close works from any state. start refuses to overwrite an in-flight
issue (any state other than complete/closed) unless force:true is
passed.
Pre-PR verification and attestation
verify runs the repository's declared mechanical controls (fmt, lint,
typecheck, tests) in one fan-out pass and records per-control status,
exit code, duration and runner. review_code is guarded on verifying,
so no path reaches code review without running the controls. A control
that could not be executed is recorded as error — never as a skip —
and blocks exactly as a failure does.
attest emits a manifest (commit sha, SHA-256 config checksums, control
results, per-reviewer finding counts) that CI validates in place of
re-executing the controls. It asserts every gate before writing and
refuses otherwise; it does not approve anything.
Methods
start— file a new issue (refuses to overwrite an in-flight issue unlessforce:true)triage— classify with optional confidence/regression/reproductionrecord_prior_art— record existing UAT scenarios and KB entriesrecord_reproduction— record/update the bug-reproduction outcome after triage (optional; callable from triaged or planned)plan— create/revise plan with DDD analysis, TDD strategy, review matrixreview_plan— enter plan review phaserecord_review— record one reviewer's findings (a second submission in the same round replaces, not appends)approve_plan— approve (gated on coverage + zero blocking findings + no FAIL verdict)reject_plan— reject with auto/human source trackingimplement— start TDD on a branch (enterswriting_tests)review_tests— enter test review phaseiterate_tests— loop back on test-review findings (bumps testReviewIteration)tests_approved— tests clean → write code (autonomous gate; supportsoverride_reasonfor explicit human force-approve after 5-iteration cap, bypassing both the blocking-findings and FAIL-verdict gates)verify— run every declared mechanical control in one pass (entersverifying); controls come fromagent-constraints/verification-controls.md, never hardcodediterate_verification— loop back on a failing control (bumps verificationIteration)review_code— enter code review phase (requiresverifying)resolve_findings— record resolutions keyed per matching reviewer, snapshot rounditerate— return to implementation (bumps codeReviewIteration)attest— emit the attestation manifest CI validates (entersattested)harvest— record UAT/KB improvement proposalscomplete— mark doneclose— abandon from any statehydrate— write compact summary for autonomous loops
Bundled Skills
issue-lifecycle— orchestrates the full lifecycleddd— domain-driven design building block selectiontdd— red-green-refactor workflow enforcementmoldable-dev— contextual inspectors and live-data queriesreview-code— general code reviewreview-adversarial— adversarial review (7 dimensions)review-security— OWASP-adapted security auditreview-ux— CLI output and error message reviewreview-skill— skill quality review
2026.08.31.1 — pre-PR verification + attestation
Model behavior change — model type version bumped to 2026.08.31.1. Adds
the mechanical half of the verification loop and the evidence artifact CI
validates in place of re-running it. Ships as an identity upgrades[]
migration: existing records gain verificationIteration: 1 from the schema
default, and verification / attestation stay unset until the new methods
run.
Added
verifyingstate betweenimplementingandcode_reviewing.review_codeis now guarded onverifying, so no path reaches code review without running the repository's declared controls. Everyiteratefrom the code-review loop lands inimplementingand must pass through it again.attestedstate betweenresolvedandharvested/complete.verify— runs every declared control (fmt, lint, typecheck, tests) in one fan-out pass, recording per-control status, exit code, duration, runner and a bounded stderr tail. Control specs are supplied by the caller fromagent-constraints/verification-controls.md; the model hardcodes no build command. A control that cannot be spawned iserror, and amanaged-tier control on alocalrunner isskipped— both block exactly asfaildoes, because "the tool could not evaluate this" is not evidence of a clean tree.iterate_verification— returns toimplementingon a failing control, snapshotting averificationround toreviewHistoryand bumpingverificationIteration. Mirrorsiterate/iterate_tests.attest— emits the attestation manifest: commit sha, SHA-256 checksums of every declared config input, control results, and per-reviewer open-finding counts by severity. Written both ontostateand to a dedicatedattestationresource keyed by commit sha. It re-asserts every gate before writing (verification round exists, every required control passed, no FAIL verdict, zero open CRITICAL/HIGH, every config path readable) and refuses otherwise — it asserts, it does not approve.attestationresource and theAttestationSchema/ControlSpecSchema/ControlResultSchema/VerificationSchemapublic types.hydratenow reportsverificationIterationandcontrols: {ran, total, blocking[]}so the autonomous loop can see control state without parsing the full blob.agent-constraints/verification-controls.md— the control declaration this repo runs, mirroring thedeno-checkCI job step for step.- Skill references
verification.md(Phase 4c) andattestation.md(Phase 5b);SKILL.md,state-machine.md,implementation.md,code-review.mdandautonomous-loop.mdupdated to match.
Changed
harvestacceptsresolvedandattested;completeacceptsresolved,attestedandharvested.implementation.mdStep 5 no longer tells you to track the PR externally —attestcarries a first-classprUrl, and the PR is opened after attesting, not before.- The model is no longer pure logic.
verifyspawns subprocesses andattestreads files. Both effects are injected (CommandRunner,FileReader) so tests never spawn anything, and the adversarial suite covers the new surface: controlcwdescaping the repo root, absolutecwd, spawn failure, deniedallow-run, stderr truncation, and everyattestrefusal.
| Argument | Type | Description |
|---|---|---|
| title | string | |
| description | string | |
| labels | array | |
| force | boolean | Overwrite an in-flight issue (any state other than |
| Argument | Type | Description |
|---|---|---|
| priority | enum | |
| affectedAreas | array | |
| reasoning? | string | |
| isRegression? | boolean | |
| clarifyingQuestions | array |
| Argument | Type | Description |
|---|---|---|
| uatScenarios | array | |
| kbEntries | array |
| Argument | Type | Description |
|---|---|---|
| status | enum | |
| notes? | string |
| Argument | Type | Description |
|---|---|---|
| summary | string | |
| steps | array | |
| dddAnalysis | string | Which aggregates, entities, value objects, and domain services are affected |
| testStrategy | string | What tests to write first, red-green-refactor sequence |
| potentialChallenges | array |
| Argument | Type | Description |
|---|---|---|
| reviewer | string | Skill name: review-code, review-adversarial, review-security, review-ux, review-skill |
| verdict | enum | |
| findings | array |
| Argument | Type | Description |
|---|---|---|
| reason | string | |
| source | enum |
| Argument | Type | Description |
|---|---|---|
| branch | string | |
| description | string |
| Argument | Type | Description |
|---|---|---|
| reason | string | |
| source | enum |
| Argument | Type | Description |
|---|---|---|
| override_reason? | string | When set, bypasses the blocking-findings gate as an explicit |
| Argument | Type | Description |
|---|---|---|
| controls | array | Control specs from agent-constraints/verification-controls.md |
| repoDir | string | Absolute path to the repository root the controls run against |
| runner | string | Identifier of the executing environment, e.g. 'local' or |
| Argument | Type | Description |
|---|---|---|
| reason | string | |
| source | enum |
| Argument | Type | Description |
|---|---|---|
| resolutions | record | Map of finding description → resolution action |
| Argument | Type | Description |
|---|---|---|
| reason | string | |
| source | enum |
| Argument | Type | Description |
|---|---|---|
| commitSha | string | The commit the verification ran against (git rev-parse HEAD) |
| repoDir | string | Absolute path to the repository root, for checksum computation |
| configPaths | array | Repo-relative paths whose contents are checksummed into the |
| prUrl? | string | Pull request URL, when the PR already exists |
| producedBy | string | Hostname or worker id that produced the manifest |
| Argument | Type | Description |
|---|---|---|
| uatProposals | array | |
| kbProposals | array |
| Argument | Type | Description |
|---|---|---|
| summary | string |
| Argument | Type | Description |
|---|---|---|
| reason | string |
Resources
Modified 1 skills
2026.08.02.1 — latent-bug fixes (IL-1/2/4/7) + five-suite quality
Model behavior change — model type version bumped to 2026.08.02.1 (first
release since the 2026.07.16.2 five-suite quality backfill). Real fixes for
four of the seven latent bugs triaged in the LOCAL issue-lifecycle model
issue-lifecycle-latent-bugs; three are explicitly re-affirmed as intentional
behavior, not fixed. No globalArguments or resource-schema change — the
version bump ships as an identity upgrades[] migration.
Fixed
- IL-1 —
startused to overwrite whatevercurrentheld with no read-before-write — approved plans, review history, everything — with no guard or confirmation. It now reads existing state first: a fresh instance (nocurrentyet) or one already in a terminal state (complete/closed) proceeds as before; anything else throws unless the newforce: booleanargument (defaultfalse) is passed. - IL-2 —
approve_plan/tests_approvedgated only onhasBlockingFindings(open CRITICAL/HIGH count), so a reviewer could postverdict: "FAIL"with zero findings (or all findings resolved/non-blocking) and approval would still succeed. Both methods now also call the newfailingReviewers()helper and block if any reviewer's verdict is FAIL, after the existing blocking-findings check (gate order preserved so "N CRITICAL and M HIGH" fires first when both conditions hold).tests_approved'soverride_reasonnow bypasses both gates together, as before.SUGGEST_CHANGESremains non-blocking by design — onlyFAILhard blocks, so the autonomous zero-CRITICAL/zero-HIGH loop can still converge without a human override. - IL-4 —
resolutionsis a flatRecord<string, string>keyed by finding description text; two different reviewers whose findings happened to share description text collapsed into one entry.resolve_findingsnow expands each supplied key against the current round's findings: every reviewer whose finding matches that description gets its own`${reviewer} :: ${description}`composite key. A key matching no finding is stored verbatim (legacy-safe; unaffected: empty-map callers). - IL-7 —
record_reviewappended every submission unconditionally, so recording the same reviewer twice in one round double-counted their open findings in the blocking gate. It now replaces (last-write-wins) the reviewer's earlier entry in place instead of appending a duplicate.
Kept as designed (re-affirmed, not fixed)
- IL-3 — no model-enforced iteration cap on
iterate/iterate_tests.MAX_CODE_ITERATIONS/MAX_TEST_ITERATIONSstay skill-layer policy; enforcing a cap in the pure model would couple it to skill policy and could break the humanoverride_reasonescape hatch. - IL-5 —
closehas noguardStatecall and works from any state, including terminal ones. This is intentional:closeis the abandon/escape hatch (manifest.yaml has always documented "works from any state") and an escape hatch must never itself be blockable. - IL-6 —
hydrate'ssummary.snapshotAtis stamped fresh vianow()on every call, so two calls produce two different values even thoughcurrentis never mutated.snapshotAtis a wall-clock capture stamp — it should differ per call; the property suite already proves non-mutation ofcurrentby freezing the clock (@std/testingFakeTime), which is the invariant that actually matters here.
Five-suite quality (carried from the 2026.07.16.2 backfill, updated)
extensions/models/issue_lifecycle_methods_test.ts— success + exact guardState-throw-message regression for each of the 20 model methods, a sweep pinning "No issue state found — run 'start' first" on every method butstart, and a sweep pinning the REAL (not assumed) unknown-key behavior of every method's zod arguments schema:swamp model type describe --jsonrendersadditionalProperties: false(its own JSON-Schema view), but none of the 20 methods call.strict(), so a bare.parse()silently strips an unrecognized key rather than throwing.extensions/models/issue_lifecycle_adversarial_test.ts— illegal out-of-order transitions from varied source states, malformed reviewer input (bad severity/verdict enums rejected by zod), hostile approve_plan gate combinations (missing-matrix-reviewer, combined CRITICAL+HIGH counts), corrupted-stored-state pins for the "no plan found" branches inapprove_plan/tests_approved, whitespaceoverride_reasonstill gated, and pins asserting the FIXED IL-1/IL-2/IL-4/IL-7 behavior above plus the re-affirmed IL-3/IL-5 by-design behavior.extensions/models/issue_lifecycle_coverage_test.ts— branch fill forallMatrixReviewersRecordedacross the security/ux/skill matrix dimensions,
Release 2026.07.16.2 — align model versions with manifests
Maintenance release across the @magistr extensions. For most packages this
carries no functional change: the only edit is the model's version: field,
brought back in line with its manifest version so the published model type
version and the package version no longer drift.
Functional changes in this release are limited to:
anime-cron: normalizeTitle now strips a ": subtitle" suffix and a trailing parenthesized year before comparison, fixing dedup false-misses where the torrent title carries a subtitle or year that the AniList romaji does not.
arckit: first publish. Standalone ArcKit port — a 12-phase architecture governance state machine with 65 bundled templates, driven by a bundled skill.
Also tracks three extensions (kaiten, observability-agent, music-library) that previously existed only as untracked working-tree directories, recovered from stashes.
Added 1, removed 1 models. Added 9 skills
Merge pull request #14 from umag/feat/issue-lifecycle-scenario-9-resume-eval
feat(issue-lifecycle): eval scenario-9 — resume-dispatch from the TDD sub-cycle (2026.06.12.3)
Modified 1 skills
Merge pull request #13 from umag/feat/issue-lifecycle-record-reproduction
feat(issue-lifecycle): record_reproduction method (2026.06.12.2)
Modified 1 models
Merge feat/issue-lifecycle-tdd-subcycle-docs: skills catch up with the TDD test-review sub-cycle (2026.06.12.1)
Modified 1 skills
issue-lifecycle: release 2026.05.25.3
Re-trigger after the -y publish fix (631455c). Same content as the tagged- but-unpublished .25.1/.25.2 (the 2026.05.24.x skill changes); model type version stays 2026.04.30.1.
Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
Modified 1 skills
2026.05.24 release — plan presentation + implementation discipline (skill-only; model type version unchanged at 2026.04.30.1)
Plan presentation:
- New skimmable BLUF plan format: Goal / Approach / Domain impact (4 lines) / Scope table with a DDD-role column / conditional Risks / numbered one-line Steps / Review coverage / Non-goals / Open questions.
- Front-loaded "Plan output format (always)" pointer in SKILL.md so the format applies even when a plan is produced outside the full lifecycle flow.
- Opt-in HTML-artifact escalation, Wardley maps (strategic build-vs-buy only), and DDD diagram conventions; diagrams off by default.
- Planning Step 9 and the autonomous-loop approval gate render in this format.
Implementation discipline (implementation.md Step 2):
- Anchor changes in existing code: map integration points first, reuse/extend, no parallel code paths.
- Right-size backward compatibility: no compat shims/migrations/version flags for unreleased code; new adversarial-review check enforces it at plan time.
- Explicit RED/GREEN/REFACTOR; refactor in-place, never deferred.
Validated with tessl evals (BLUF format 100/100; integrate + no-compat 100%).
Note: 2026.05.24.2 == 2026.05.24.1 content; this version adds the release notes/changelog that the .1 push omitted.
Modified 1 skills
2026.04.30.5 — TDD test sub-loop with human escalation + explicit plan display
This release wraps up the work introduced across 2026.04.30.3 / .4 (which went out without proper release notes) and adds the CI publish-flow fix that prevents future versions from shipping with empty changelog entries.
What's new since 2026.04.30.2
Phase 5 (Implementation) is now a TDD test-first state machine
implement no longer transitions straight to implementing. It enters
writing_tests, and the lifecycle enforces the TDD discipline at the
state-machine level: tests must be authored, reviewed, and cleared of
blocking findings before any production code is written.
New states:
writing_tests— author failing TDD tests (RED).reviewing_tests— tests under review.implementing(existing) — tests are clean; now write code (GREEN) and refactor.
New ReviewPhase value: test_review (alongside plan_review and
code_review). Each test-review round is snapshotted into reviewHistory
just like plan/code rounds.
New methods
review_tests— fan out reviewers fromreviewMatrixagainst the tests (writing_tests → reviewing_tests). Resets the round and stampsreviewRoundStartedAt.iterate_tests— return towriting_testsbecause findings remain; bumpstestReviewIteration, snapshots round withoutcome: "rejected_auto"or"rejected_human"persource.tests_approved— gated transitionreviewing_tests → implementing. Default autonomous gate (full matrix coverage AND zero open CRITICAL AND zero open HIGH). Accepts an optionaloverride_reasonthat bypasses the blocking-findings gate as an explicit human override after the iteration cap; matrix coverage is still enforced. The override path snapshotsoutcome: "human_override"with the reason stored inrejectReasonfor audit.
Human escalation path (cap-reached safeguard)
After 5 test-review iterations (or signature-loop detection), the autonomous loop must stop and escalate to the human. The skill presents the full iteration history and open blocking findings, then offers two explicit, audited paths:
- Human correction —
iterate_tests --input source=human --input reason="<guidance>". Counter bumps; the round snapshotsrejected_human; tests get rewritten per the human's guidance. - Human override —
tests_approved --input override_reason="<justification>". Bypasses the blocking-findings gate; matrix coverage still required; the round snapshotshuman_overridewith the reason recorded.
Explicit full plan display before approve_plan (Phase 4)
The plan must be presented to the human in full — verbatim, no compression — before approve_plan. SKILL.md now mandates an ordered display:
- Plan summary
- Every step (description, files, risks)
- Full DDD analysis
- Full TDD strategy
- Review matrix
- Potential challenges
- Aggregated review findings (every reviewer, every finding)
- Explicit approval prompt with the accepted phrases ("approve" / "approved" / "LGTM" / "ship it" / "go").
This closes a gap where the model could ask for approval after only summarizing the plan, undermining informed consent at the only true human-gated transition.
Other surface changes
record_reviewguard extended to allowreviewing_tests.hydratesummary now surfacestestReviewIterationalongsidecodeReviewIteration(so the autonomous loop can detect the cap and escalate cheaply without parsing full state).- New
ReviewOutcomevalue:human_override. - Model TypeVersion bumped to 2026.04.30.1; package version 2026.04.30.5.
Backwards compatibility
Existing recorded state parses through schema defaults
(testReviewIteration defaults to 1). Issues already past approved (in
implementing, code_reviewing, etc.) keep working; the new sub-loop
applies to any issue that re-enters via implement.
Tests
47 model tests pass (33 prior + 14 new covering the test sub-loop, the override gate, escalation paths, and the new state machine guards).
Why .3 / .4 changelogs were sparse
2026.04.30.3 was auto-published by CI immediately after the code push,
and the CI publish step did not pass --release-notes — so the
swamp.club changelog entry for .3 was empty. 2026.04.30.4 was a manual
republish to attach notes, but the page still shows .3's empty entry in
the "Previous Versions" section because per-version notes are immutable
once published.
The CI workflow has now been updated to read HEAD's commit message and
pass it as --release-notes on every auto-publish, so future versions
will always carry notes derived from the version-bump commit.
TDD test sub-loop in implementation phase, with human escalation after the 5-iteration cap.
Highlights since 2026.04.30.2:
- New states: writing_tests, reviewing_tests. New ReviewPhase: test_review.
- New methods:
- review_tests — fan-out reviewers against TDD tests (writing_tests → reviewing_tests).
- iterate_tests — loop back on test-review findings (reviewing_tests → writing_tests); bumps testReviewIteration; snapshots outcome rejected_auto/rejected_human.
- tests_approved — gate transitioning reviewing_tests → implementing. Default autonomous gate (matrix coverage + zero CRITICAL + zero HIGH). New optional override_reason bypasses the blocking-findings gate as an explicit human override after the 5-iteration cap; snapshots outcome=human_override with the reason in rejectReason for audit.
- implement now enters writing_tests (not implementing) so production code is only written after the test-review round comes back clean.
- record_review guard extended to allow reviewing_tests.
- hydrate summary now surfaces testReviewIteration alongside codeReviewIteration.
- New ReviewOutcome value: human_override.
Skill instructions (issue-lifecycle/SKILL.md):
- Phase 4 now mandates explicit, full-content plan display before approve_plan: summary, every step (with files/risks), DDD analysis, TDD strategy, review matrix, potentialChallenges, aggregated review findings — all verbatim, no compression — followed by an explicit approval prompt.
- Phase 5 documents the autonomous TDD sub-loop and the cap-reached escalation path: when testReviewIteration >= 5 (or signature loop detected), the skill must surface the iteration history and open findings to the human and offer two explicit, audited paths — iterate_tests source=human (correction) or tests_approved override_reason=… (force-approve).
Tests: 47 passing (33 prior + 14 new covering the test sub-loop, override gate, and escalation paths).
Backwards compatibility: existing recorded state parses through schema defaults (testReviewIteration default = 1). Any in-flight issue still in implementing/code_reviewing continues to work; the new sub-loop applies to issues that re-enter via implement.
Modified 1 models
Restructure to monorepo layout. Add repository field, root README as additionalFile, improved manifest description with state machine and method docs.
updated labels
Initial publish: issue lifecycle model (v2026.04.09.1) with prior-art lookup, DDD+TDD planning, autonomous code-review iteration, UAT/KB harvest, and hydrate summary resource. Bundled with 9 user skills: issue-lifecycle, ddd, tdd, moldable-dev, review-code/adversarial/security/ux/skill.
- Has README or module doc2/2earned
- README has a code example1/1earned
- README is substantive1/1earned
- Most symbols documented1/1earned
- No slow types (deprecated)1/1earned
- Dependencies pass trust audit2/2earned
- Has description1/1earned
- Platform support declared (or universal)2/2earned
- License declared1/1earned
- Verified public repository2/2earned