mandrel 1.94.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +116 -99
- package/.agents/agents/acceptance-critic.md +9 -7
- package/.agents/agents/story-worker.md +45 -51
- package/.agents/audit-checklists/performance.md +1 -1
- package/.agents/docs/SDLC.md +498 -1287
- package/.agents/docs/agentrc-reference.json +185 -80
- package/.agents/docs/configuration.md +132 -190
- package/.agents/docs/execution-reference.md +51 -25
- package/.agents/docs/quality-gates.md +25 -33
- package/.agents/docs/workflows.md +8 -8
- package/.agents/instructions.md +113 -139
- package/.agents/rules/ci-remediation.md +11 -15
- package/.agents/rules/git-conventions-reference.md +48 -58
- package/.agents/rules/git-conventions.md +16 -22
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +83 -254
- package/.agents/schemas/audit-rules.json +59 -1
- package/.agents/schemas/audit-rules.schema.json +33 -1
- package/.agents/schemas/lifecycle/README.md +1 -2
- package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
- package/.agents/schemas/lifecycle/merge.flip-failed.schema.json +33 -0
- package/.agents/schemas/lifecycle/merge.unlanded.schema.json +1 -0
- package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
- package/.agents/schemas/lifecycle/story.merged.schema.json +1 -1
- package/.agents/schemas/signal-event.schema.json +3 -3
- package/.agents/schemas/story-deliver-terminal.schema.json +152 -0
- package/.agents/schemas/validation-evidence.schema.json +1 -1
- package/.agents/scripts/acceptance-eval.js +22 -66
- package/.agents/scripts/agents-bootstrap-github.js +1 -1
- package/.agents/scripts/audit-to-stories.js +7 -7
- package/.agents/scripts/boot-sweep.js +1 -1
- package/.agents/scripts/bootstrap.js +3 -3
- package/.agents/scripts/check-dead-exports.js +43 -104
- package/.agents/scripts/check-doc-links.js +2 -2
- package/.agents/scripts/check-lifecycle-lint.js +7 -10
- package/.agents/scripts/check-workflow-cli-lint.js +91 -0
- package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
- package/.agents/scripts/deliver-recover.js +122 -0
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +20 -50
- package/.agents/scripts/generate-skills-index.js +17 -1
- package/.agents/scripts/generate-workflows-doc.js +4 -4
- package/.agents/scripts/lib/ITicketingProvider.js +1 -19
- package/.agents/scripts/lib/Logger.js +6 -10
- package/.agents/scripts/lib/audit-suite/runner.js +2 -2
- package/.agents/scripts/lib/audit-suite/selector.js +328 -28
- package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
- package/.agents/scripts/lib/baselines/kernel.js +206 -18
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -15
- package/.agents/scripts/lib/baselines/reader.js +1 -6
- package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
- package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +28 -33
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
- package/.agents/scripts/lib/bootstrap/manifest.js +8 -11
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +30 -53
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +0 -2
- package/.agents/scripts/lib/checks/core-bare-clean.js +6 -3
- package/.agents/scripts/lib/checks/index.js +3 -2
- package/.agents/scripts/lib/checks/loop-health.js +12 -11
- package/.agents/scripts/lib/checks/state.js +17 -248
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +26 -24
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +3 -4
- package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +2 -2
- package/.agents/scripts/lib/checks/worktree-residue-biome.js +3 -3
- package/.agents/scripts/lib/cli/standard-args.js +13 -22
- package/.agents/scripts/lib/cli-args.js +39 -9
- package/.agents/scripts/lib/close-validation/gates.js +15 -15
- package/.agents/scripts/lib/close-validation/projections/inputs.js +7 -7
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +12 -12
- package/.agents/scripts/lib/close-validation/runner.js +13 -21
- package/.agents/scripts/lib/close-validation/telemetry.js +17 -8
- package/.agents/scripts/lib/config/ci.js +6 -31
- package/.agents/scripts/lib/config/delivery-routing.js +52 -35
- package/.agents/scripts/lib/config/explain.js +61 -48
- package/.agents/scripts/lib/config/github.js +7 -5
- package/.agents/scripts/lib/config/limits.js +29 -80
- package/.agents/scripts/lib/config/paths.js +0 -2
- package/.agents/scripts/lib/config/quality.js +12 -15
- package/.agents/scripts/lib/config/runners.js +20 -66
- package/.agents/scripts/lib/config/temp-paths.js +30 -63
- package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
- package/.agents/scripts/lib/config-resolver.js +2 -7
- package/.agents/scripts/lib/config-settings-schema-delivery.js +55 -161
- package/.agents/scripts/lib/config-settings-schema-quality.js +17 -16
- package/.agents/scripts/lib/config-settings-schema.js +100 -60
- package/.agents/scripts/lib/dead-exports-knip.js +105 -0
- package/.agents/scripts/lib/dead-exports-mode.js +51 -0
- package/.agents/scripts/lib/dependency-parser.js +3 -2
- package/.agents/scripts/lib/doc-tiers.js +2 -2
- package/.agents/scripts/lib/duplicate-search.js +242 -41
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
- package/.agents/scripts/lib/findings/promote-finding.js +23 -14
- package/.agents/scripts/lib/format-generated-json.js +97 -0
- package/.agents/scripts/lib/framework-version.js +19 -190
- package/.agents/scripts/lib/gh-exec.js +8 -0
- package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
- package/.agents/scripts/lib/git-branch-lifecycle.js +17 -180
- package/.agents/scripts/lib/git-utils.js +32 -20
- package/.agents/scripts/lib/github/framework-repo.js +6 -0
- package/.agents/scripts/lib/json-utils.js +1 -2
- package/.agents/scripts/lib/label-constants.js +10 -38
- package/.agents/scripts/lib/label-taxonomy.js +10 -55
- package/.agents/scripts/lib/observability/active-story-env.js +44 -165
- package/.agents/scripts/lib/observability/runtime-friction.js +243 -0
- package/.agents/scripts/lib/observability/signal-validator.js +4 -4
- package/.agents/scripts/lib/observability/signals-writer.js +6 -82
- package/.agents/scripts/lib/observability/source-classifier.js +5 -5
- package/.agents/scripts/lib/observability/tool-trace-hook.js +2 -12
- package/.agents/scripts/lib/onboard/init-tail.js +1 -3
- package/.agents/scripts/lib/orchestration/acceptance-clusters.js +1 -1
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +2 -2
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +105 -44
- package/.agents/scripts/lib/orchestration/code-review.js +78 -436
- package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
- package/.agents/scripts/lib/orchestration/consolidation-precondition.js +4 -4
- package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
- package/.agents/scripts/lib/orchestration/deliver-recover.js +328 -0
- package/.agents/scripts/lib/orchestration/detectors-phase.js +12 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
- package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +34 -0
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +3 -2
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +142 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +17 -19
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +86 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +37 -103
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +21 -43
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +50 -85
- package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +3 -14
- package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
- package/.agents/scripts/lib/orchestration/merge-block-class.js +77 -21
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -0
- package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
- package/.agents/scripts/lib/orchestration/plan-context.js +354 -282
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +11 -22
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +4 -8
- package/.agents/scripts/lib/orchestration/plan-metrics.js +38 -6
- package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
- package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +71 -0
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +245 -0
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +116 -0
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +432 -858
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +778 -0
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +47 -115
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +509 -0
- package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
- package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +52 -51
- package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
- package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +1 -1
- package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
- package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
- package/.agents/scripts/lib/orchestration/resolve-stories.js +344 -0
- package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
- package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
- package/.agents/scripts/lib/orchestration/review-depth.js +126 -47
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +3 -13
- package/.agents/scripts/lib/orchestration/review-providers/native.js +1 -154
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +3 -2
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +1 -1
- package/.agents/scripts/lib/orchestration/review-providers/types.js +5 -4
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +1 -1
- package/.agents/scripts/lib/orchestration/run-epilogue.js +784 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +25 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +11 -9
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +4 -4
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +86 -41
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +608 -152
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +77 -32
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +305 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +1 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +44 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +37 -4
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +2 -2
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +275 -46
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +1 -1
- package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
- package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
- package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
- package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
- package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +10 -10
- package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +28 -42
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +360 -0
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +298 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +51 -0
- package/.agents/scripts/lib/orchestration/story-plan-state.js +33 -0
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
- package/.agents/scripts/lib/orchestration/task-body-validator.js +60 -25
- package/.agents/scripts/lib/orchestration/ticket-lease.js +27 -74
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +130 -75
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +192 -377
- package/.agents/scripts/lib/orchestration/ticket-validator.js +123 -25
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +14 -72
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +45 -55
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +66 -6
- package/.agents/scripts/lib/orchestration/ticketing.js +0 -1
- package/.agents/scripts/lib/plan-phase-cleanup.js +12 -14
- package/.agents/scripts/lib/planning-corpus.js +12 -281
- package/.agents/scripts/lib/preflight-runner.js +4 -4
- package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
- package/.agents/scripts/lib/qa/qa-context-hydrator.js +5 -5
- package/.agents/scripts/lib/signals/index.js +4 -17
- package/.agents/scripts/lib/signals/read.js +35 -35
- package/.agents/scripts/lib/signals/schema.js +8 -11
- package/.agents/scripts/lib/signals/span-tree.js +7 -7
- package/.agents/scripts/lib/signals/write.js +0 -1
- package/.agents/scripts/lib/single-story/story-merged-notify.js +13 -2
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
- package/.agents/scripts/lib/skills/parse-skill.js +16 -3
- package/.agents/scripts/lib/story-adjacency.js +17 -19
- package/.agents/scripts/lib/story-body/story-body.js +130 -75
- package/.agents/scripts/lib/story-plan.js +2 -4
- package/.agents/scripts/lib/templates/decomposer-prompts.js +51 -46
- package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
- package/.agents/scripts/lib/test-env.js +14 -1
- package/.agents/scripts/lib/test-tiers.js +0 -3
- package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +25 -39
- package/.agents/scripts/lib/validation-evidence.js +32 -60
- package/.agents/scripts/lib/wave-runner/ready-set.js +38 -12
- package/.agents/scripts/lib/workspace-provisioner.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +72 -25
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +1 -2
- package/.agents/scripts/lint-issue-body.js +71 -40
- package/.agents/scripts/mandrel-update-preflight.js +1 -1
- package/.agents/scripts/notify.js +4 -3
- package/.agents/scripts/plan-context.js +102 -80
- package/.agents/scripts/plan-persist.js +230 -279
- package/.agents/scripts/plan-run-epilogue.js +142 -0
- package/.agents/scripts/post-structured-comment.js +0 -38
- package/.agents/scripts/pr-watch-with-update.js +43 -22
- package/.agents/scripts/providers/github/compose.js +0 -1
- package/.agents/scripts/providers/github/errors.js +0 -19
- package/.agents/scripts/providers/github/issues.js +13 -39
- package/.agents/scripts/providers/github/mappers.js +5 -12
- package/.agents/scripts/providers/github/sub-issues.js +0 -47
- package/.agents/scripts/providers/github/tickets.js +33 -156
- package/.agents/scripts/providers/github.js +17 -6
- package/.agents/scripts/resolve-stories.js +236 -0
- package/.agents/scripts/run-coverage.js +4 -1
- package/.agents/scripts/run-lint.js +2 -2
- package/.agents/scripts/run-verify.js +31 -2
- package/.agents/scripts/signals-view.js +25 -21
- package/.agents/scripts/single-story-close.js +178 -26
- package/.agents/scripts/single-story-confirm-merge.js +313 -24
- package/.agents/scripts/single-story-init.js +35 -30
- package/.agents/scripts/stories-wave-tick.js +85 -10
- package/.agents/scripts/story-plan.js +28 -49
- package/.agents/scripts/update-ticket-state.js +14 -65
- package/.agents/skills/core/code-review-and-quality/SKILL.md +28 -450
- package/.agents/skills/core/code-review-and-quality/reference.md +458 -0
- package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +22 -315
- package/.agents/skills/core/debugging-and-error-recovery/reference.md +323 -0
- package/.agents/skills/core/diagnose-friction/SKILL.md +14 -18
- package/.agents/skills/core/documentation-and-adrs/SKILL.md +25 -397
- package/.agents/skills/core/documentation-and-adrs/reference.md +403 -0
- package/.agents/skills/core/gates-and-baselines/SKILL.md +12 -12
- package/.agents/skills/core/idea-refinement/SKILL.md +9 -9
- package/.agents/skills/core/scope-triage/SKILL.md +31 -172
- package/.agents/skills/core/security-and-hardening/SKILL.md +22 -367
- package/.agents/skills/core/security-and-hardening/reference.md +375 -0
- package/.agents/skills/skills.index.json +3 -53
- package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +2 -4
- package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +1 -1
- package/.agents/skills/stack/qa/qa-harness/SKILL.md +1 -3
- package/.agents/starter-agentrc.json +0 -5
- package/.agents/templates/agent-protocol.md +9 -10
- package/.agents/workflows/audit-architecture.md +6 -7
- package/.agents/workflows/audit-clean-code.md +7 -7
- package/.agents/workflows/audit-dependencies.md +3 -3
- package/.agents/workflows/audit-devops.md +3 -3
- package/.agents/workflows/audit-documentation.md +9 -10
- package/.agents/workflows/audit-lighthouse.md +11 -3
- package/.agents/workflows/audit-navigability.md +13 -2
- package/.agents/workflows/audit-performance.md +5 -6
- package/.agents/workflows/audit-privacy.md +3 -3
- package/.agents/workflows/audit-quality.md +11 -12
- package/.agents/workflows/audit-security.md +4 -5
- package/.agents/workflows/audit-seo.md +13 -3
- package/.agents/workflows/audit-sre.md +3 -3
- package/.agents/workflows/audit-to-stories.md +20 -20
- package/.agents/workflows/audit-ux-ui.md +10 -3
- package/.agents/workflows/deliver.md +177 -176
- package/.agents/workflows/git-cleanup.md +5 -6
- package/.agents/workflows/git-deliver.md +1 -1
- package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
- package/.agents/workflows/helpers/acceptance-self-eval.md +35 -40
- package/.agents/workflows/helpers/code-quality-guardrails.md +7 -7
- package/.agents/workflows/helpers/code-review.md +75 -196
- package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +83 -44
- package/.agents/workflows/helpers/deliver-story.md +606 -0
- package/.agents/workflows/helpers/diagnose.md +10 -10
- package/.agents/workflows/helpers/parallel-tooling.md +3 -3
- package/.agents/workflows/helpers/signals.md +16 -16
- package/.agents/workflows/helpers/worktree-lifecycle.md +66 -86
- package/.agents/workflows/mandrel-update.md +2 -1
- package/.agents/workflows/plan.md +277 -145
- package/.agents/workflows/qa-assist.md +27 -33
- package/.agents/workflows/qa-explore.md +29 -38
- package/.agents/workflows/qa-run.md +2 -6
- package/README.md +9 -8
- package/bin/mandrel.js +12 -1
- package/docs/CHANGELOG.md +70 -0
- package/lib/cli/registry.js +262 -19
- package/lib/cli/sync-agents.js +157 -0
- package/lib/cli/sync-commands.js +115 -6
- package/lib/cli/sync.js +168 -6
- package/lib/cli/update.js +105 -8
- package/lib/cli/version-helpers.js +131 -0
- package/lib/migrations/README.md +7 -5
- package/lib/migrations/index.js +12 -8
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +100 -0
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +101 -0
- package/package.json +2 -2
- package/.agents/agents/retro.md +0 -42
- package/.agents/personas/architect.md +0 -113
- package/.agents/personas/devops-engineer.md +0 -38
- package/.agents/personas/engineer.md +0 -33
- package/.agents/personas/project-manager.md +0 -114
- package/.agents/personas/qa-engineer.md +0 -95
- package/.agents/personas/security-engineer.md +0 -111
- package/.agents/personas/technical-writer.md +0 -101
- package/.agents/schemas/dispatch-manifest.json +0 -232
- package/.agents/schemas/epic-perf-report.schema.json +0 -89
- package/.agents/schemas/epic-spec.schema.json +0 -153
- package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +0 -15
- package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.blocked.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.close.end.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.complete.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +0 -14
- package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +0 -17
- package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +0 -15
- package/.agents/schemas/lifecycle/epic.plan.end.schema.json +0 -18
- package/.agents/schemas/lifecycle/epic.plan.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +0 -16
- package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.watch.end.schema.json +0 -29
- package/.agents/schemas/lifecycle/epic.watch.start.schema.json +0 -16
- package/.agents/schemas/lifecycle/slice.end.schema.json +0 -21
- package/.agents/schemas/lifecycle/slice.heartbeat.schema.json +0 -20
- package/.agents/schemas/lifecycle/slice.start.schema.json +0 -17
- package/.agents/schemas/lifecycle/story.heartbeat.schema.json +0 -20
- package/.agents/schemas/risk-verdict.schema.json +0 -66
- package/.agents/schemas/story-perf-summary.schema.json +0 -73
- package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
- package/.agents/scripts/analyze-execution.js +0 -444
- package/.agents/scripts/bookkeeping-reconcile.js +0 -117
- package/.agents/scripts/check-prepush-recovery.js +0 -90
- package/.agents/scripts/dispatcher.js +0 -295
- package/.agents/scripts/epic-audit-prepare.js +0 -497
- package/.agents/scripts/epic-audit-recheck.js +0 -274
- package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
- package/.agents/scripts/epic-deliver-preflight.js +0 -462
- package/.agents/scripts/epic-deliver-prepare.js +0 -852
- package/.agents/scripts/epic-execute-record-wave.js +0 -449
- package/.agents/scripts/epic-plan-clarity.js +0 -211
- package/.agents/scripts/epic-plan-healthcheck.js +0 -581
- package/.agents/scripts/epic-reconcile.js +0 -625
- package/.agents/scripts/lib/baseline-snapshot.js +0 -979
- package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
- package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
- package/.agents/scripts/lib/config/lifecycle.js +0 -40
- package/.agents/scripts/lib/config/preflight.js +0 -58
- package/.agents/scripts/lib/config/retro.js +0 -77
- package/.agents/scripts/lib/epic-merge-lock.js +0 -322
- package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
- package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
- package/.agents/scripts/lib/git-merge-orchestrator.js +0 -261
- package/.agents/scripts/lib/observability/baseline-refresh-rate.js +0 -221
- package/.agents/scripts/lib/observability/hook-heartbeat.js +0 -219
- package/.agents/scripts/lib/observability/perf-aggregator.js +0 -813
- package/.agents/scripts/lib/observability/perf-report-readers.js +0 -328
- package/.agents/scripts/lib/observability/perf-report-render.js +0 -182
- package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +0 -270
- package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -539
- package/.agents/scripts/lib/orchestration/deliver-route.js +0 -173
- package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
- package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
- package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
- package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
- package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/risk-verdict.js +0 -105
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -621
- package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
- package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
- package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
- package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
- package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
- package/.agents/scripts/lib/orchestration/epic-runner/story-run-progress-writer.js +0 -400
- package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
- package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
- package/.agents/scripts/lib/orchestration/error-journal.js +0 -139
- package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
- package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
- package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
- package/.agents/scripts/lib/orchestration/lifecycle/emit-slice-lifecycle.js +0 -270
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +0 -155
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-diff.js +0 -140
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -465
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -284
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +0 -665
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
- package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
- package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
- package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
- package/.agents/scripts/lib/orchestration/plan-review-routing.js +0 -63
- package/.agents/scripts/lib/orchestration/planning-context-budget.js +0 -213
- package/.agents/scripts/lib/orchestration/planning-risk.js +0 -194
- package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +0 -56
- package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +0 -33
- package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +0 -78
- package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +0 -68
- package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +0 -118
- package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +0 -396
- package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
- package/.agents/scripts/lib/orchestration/preflight-cache.js +0 -187
- package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
- package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
- package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
- package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
- package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
- package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
- package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +0 -275
- package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
- package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
- package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
- package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
- package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
- package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
- package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
- package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
- package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
- package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
- package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
- package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
- package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
- package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
- package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
- package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
- package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
- package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -302
- package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
- package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
- package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
- package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
- package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
- package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
- package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
- package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
- package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
- package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
- package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
- package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
- package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
- package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
- package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
- package/.agents/scripts/lib/push-epic-retry.js +0 -209
- package/.agents/scripts/lib/spec/index.js +0 -36
- package/.agents/scripts/lib/spec/loader.js +0 -425
- package/.agents/scripts/lib/spec/state.js +0 -208
- package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
- package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
- package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
- package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
- package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
- package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
- package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
- package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
- package/.agents/scripts/lib/wave-runner/tick.js +0 -754
- package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
- package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
- package/.agents/scripts/lifecycle-emit.js +0 -510
- package/.agents/scripts/retro-run.js +0 -218
- package/.agents/scripts/slice-phase.js +0 -361
- package/.agents/scripts/standalone-feedback-rollup.js +0 -188
- package/.agents/scripts/story-close.js +0 -294
- package/.agents/scripts/story-init.js +0 -599
- package/.agents/scripts/story-phase.js +0 -369
- package/.agents/scripts/wave-tick.js +0 -464
- package/.agents/skills/core/analyze-execution/SKILL.md +0 -98
- package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
- package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
- package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
- package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
- package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
- package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
- package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -383
- package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
- package/.agents/workflows/helpers/deliver-epic-reference.md +0 -547
- package/.agents/workflows/helpers/deliver-epic-single.md +0 -331
- package/.agents/workflows/helpers/deliver-epic.md +0 -998
- package/.agents/workflows/helpers/deliver-stories.md +0 -450
- package/.agents/workflows/helpers/epic-audit.md +0 -189
- package/.agents/workflows/helpers/epic-deliver-story.md +0 -436
- package/.agents/workflows/helpers/epic-testing.md +0 -125
- package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
- package/.agents/workflows/helpers/plan-epic.md +0 -353
- package/.agents/workflows/helpers/plan-story.md +0 -251
- package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
- package/.agents/workflows/helpers/single-story-deliver.md +0 -557
|
@@ -1,50 +1,54 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: >-
|
|
3
|
-
Perform a comprehensive code review of a change set
|
|
4
|
-
|
|
3
|
+
Perform a comprehensive code review of a Story change set against main
|
|
4
|
+
before `/deliver` opens or merges the Story PR
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Code Review (helper)
|
|
8
8
|
|
|
9
9
|
> **Helper module.** Not a slash command. Invoked automatically from
|
|
10
|
-
> `/deliver`
|
|
11
|
-
>
|
|
12
|
-
> call this helper by hand.
|
|
10
|
+
> `/deliver` via `single-story-close.js`. To run a review directly, invoke
|
|
11
|
+
> the parent workflow — operators do not call this helper by hand.
|
|
13
12
|
|
|
14
13
|
This helper performs a comprehensive code review of a change set before it
|
|
15
|
-
is merged
|
|
14
|
+
is merged to `main`. The live v2 path is **Story scope only**:
|
|
16
15
|
|
|
17
|
-
- **Story scope** — reviews
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
- **Story scope** — reviews `main...story-<storyId>` (or
|
|
17
|
+
`project.baseBranch...story-<storyId>`) inside `single-story-close.js`
|
|
18
|
+
after the PR opens and before auto-merge. Findings post to the PR;
|
|
19
|
+
critical findings block close (`agent::blocked`).
|
|
20
|
+
|
|
21
|
+
Legacy `scope: epic` / Epic-branch review procedure (including
|
|
22
|
+
`epic-audit-prepare.js` / `epic-audit-recheck.js`) was removed with the
|
|
23
|
+
v2 Story-only cutover.
|
|
21
24
|
|
|
22
25
|
**Invariant — Story-scope review runs outside the maker's LLM context.**
|
|
23
|
-
The Story-scope review executes inside the `story-close.js`
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
the
|
|
27
|
-
|
|
28
|
-
[
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
preserve this isolation: do not move Story-scope
|
|
32
|
-
context or run it as a step of the delivering
|
|
26
|
+
The Story-scope review executes inside the `single-story-close.js` close
|
|
27
|
+
subprocess, **not** in the delivering child's (maker agent's) LLM context.
|
|
28
|
+
The close pipeline invokes it after the delivering child has exited, so
|
|
29
|
+
the change set is reviewed by a process the maker cannot influence. The
|
|
30
|
+
enforcing code path is
|
|
31
|
+
[`runStoryScopeReview`](../../scripts/lib/orchestration/single-story-close/phases/code-review.js)
|
|
32
|
+
→ shared
|
|
33
|
+
[`runStoryReviewCore`](../../scripts/lib/orchestration/story-close/phases/code-review.js).
|
|
34
|
+
A future refactor MUST preserve this isolation: do not move Story-scope
|
|
35
|
+
review into the maker's context or run it as a step of the delivering
|
|
36
|
+
child.
|
|
33
37
|
|
|
34
38
|
> **Persona**: `architect` · **Skills**: `core/code-review-and-quality`,
|
|
35
39
|
> `core/security-and-hardening`
|
|
36
40
|
|
|
37
41
|
## Argument contract
|
|
38
42
|
|
|
39
|
-
The caller passes the following arguments (
|
|
40
|
-
`scope: story
|
|
43
|
+
The caller passes the following arguments (`/deliver` passes
|
|
44
|
+
`scope: story`):
|
|
41
45
|
|
|
42
46
|
| Argument | Type | Required | Meaning |
|
|
43
47
|
| ----------- | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------ |
|
|
44
|
-
| `scope` | `"story"` \| `"epic"` | yes |
|
|
45
|
-
| `ticketId` | integer | yes | GitHub issue number of the Story (when `scope === 'story'`) or
|
|
46
|
-
| `baseRef` | string (git ref) | yes | The diff base. Story scope: `
|
|
47
|
-
| `headRef` | string (git ref) | yes | The branch tip under review. Story scope: `story-<storyId>`.
|
|
48
|
+
| `scope` | `"story"` \| `"epic"` | yes | Live path is `"story"`. `"epic"` remains only for legacy cumulative adapters. |
|
|
49
|
+
| `ticketId` | integer | yes | GitHub issue number of the Story (when `scope === 'story'`) or cumulative ticket (legacy `scope === 'epic'`). |
|
|
50
|
+
| `baseRef` | string (git ref) | yes | The diff base. Story scope: `main` (or `project.baseBranch`). Legacy cumulative scope: caller-provided base. |
|
|
51
|
+
| `headRef` | string (git ref) | yes | The branch tip under review. Story scope: `story-<storyId>`. Legacy cumulative scope: caller-provided head. |
|
|
48
52
|
| `depth` | `"light"` \| `"standard"` \| `"deep"` | no | Risk-derived review thoroughness lever. Absent → `standard`. See **Review depth** below. |
|
|
49
53
|
|
|
50
54
|
All scope-dependent behavior in this helper branches off the first four
|
|
@@ -53,19 +57,21 @@ the argument envelope.
|
|
|
53
57
|
|
|
54
58
|
### Review depth (`depth`)
|
|
55
59
|
|
|
56
|
-
`depth` is the
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
`
|
|
63
|
-
|
|
60
|
+
`depth` is the thoroughness lever introduced by Story #3876, made a live
|
|
61
|
+
consumed signal end to end by Story #3937, and re-based on an observable signal
|
|
62
|
+
by Story #4542. `runCodeReview` derives it from the diff it already enumerates,
|
|
63
|
+
via [`review-depth.js`](../../scripts/lib/orchestration/review-depth.js): the
|
|
64
|
+
changed files' intersection with the `sensitivePaths` classes registered in
|
|
65
|
+
`audit-rules.json` gives the level, their count gives the width, and
|
|
66
|
+
`resolveDepth` folds the two (a sensitive path OR a wide diff → `deep`; neither,
|
|
67
|
+
on a small diff → `light`; an unenumerable diff → `standard`). It takes no
|
|
68
|
+
planner-authored input and reads no checkpoint. `runCodeReview` forwards `depth`
|
|
69
|
+
to every provider's `runReview` input.
|
|
64
70
|
|
|
65
71
|
It is an **input-only** signal: it changes *how thorough* the review is, never
|
|
66
72
|
the findings envelope (`{ status, severity, posted, report, halted,
|
|
67
73
|
blockerReason }`) nor the posted `verification-results` structured-comment body. An
|
|
68
|
-
absent or malformed `depth` is treated as `standard`, so
|
|
74
|
+
absent or malformed `depth` is treated as `standard`, so a Story that skipped
|
|
69
75
|
`/plan` still gets a passing review with no new failure mode.
|
|
70
76
|
|
|
71
77
|
How each tier changes the review protocol:
|
|
@@ -89,17 +95,13 @@ review yourself, honor the `depth` semantics above directly.
|
|
|
89
95
|
|
|
90
96
|
## Step 0 — Resolve Context
|
|
91
97
|
|
|
92
|
-
1. Resolve `[TICKET_ID]` from `ticketId` (Story
|
|
98
|
+
1. Resolve `[TICKET_ID]` from `ticketId` (the Story for live `scope: story`).
|
|
93
99
|
2. Resolve `[BASE_REF]` from `baseRef` and `[HEAD_REF]` from `headRef`.
|
|
94
|
-
3. Fetch the
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
carry the Tech Spec.
|
|
100
|
-
4. Read the Epic body fully (including its Tech Spec sections) to
|
|
101
|
-
understand the intended
|
|
102
|
-
scope, architectural decisions, and acceptance criteria.
|
|
100
|
+
3. Fetch the Story ticket and resolve the planning context from its own
|
|
101
|
+
body: folded `## Spec` / `## Slicing`, acceptance criteria, and the
|
|
102
|
+
`story-plan-state` structured comment when present.
|
|
103
|
+
4. Read that Spec fully to understand the intended scope, architectural
|
|
104
|
+
decisions, and acceptance criteria. Do **not** look for a parent Epic.
|
|
103
105
|
|
|
104
106
|
## Step 1 — Automated Audit (Pre-Review)
|
|
105
107
|
|
|
@@ -142,57 +144,21 @@ A diff that matches no local lens adds **no** lens work (the roster is empty and
|
|
|
142
144
|
or materialization failure degrades to a skipped envelope and never blocks the
|
|
143
145
|
close.
|
|
144
146
|
|
|
145
|
-
|
|
146
|
-
[`runStoryCodeReview`](../../scripts/lib/orchestration/story-close/phases/code-review.js)
|
|
147
|
-
(Epic-attached) and
|
|
147
|
+
The live close entry point —
|
|
148
148
|
[`runStoryScopeReview`](../../scripts/lib/orchestration/single-story-close/phases/code-review.js)
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
review. This step does not apply to `scope: epic`, whose lens roster is the
|
|
154
|
-
cumulative + global + risk-routed set resolved at Epic close (Step 1b).
|
|
155
|
-
|
|
156
|
-
### Step 1b — Epic-close lens roster (`scope: epic` only, Epic #4405)
|
|
157
|
-
|
|
158
|
-
When `scope === 'epic'`, the cumulative Epic diff is walked **once** at close:
|
|
159
|
-
the Epic-close lens roster is executed as **dimensions of this same review
|
|
160
|
-
pass**, not as a separate Phase 4 walk (Story #4412 folded the standalone
|
|
161
|
-
epic-audit lens walk into this pass). Resolve and walk the roster inline:
|
|
162
|
-
|
|
163
|
-
1. Resolve the roster via [`helpers/epic-audit.md`](epic-audit.md) Step 1 —
|
|
164
|
-
run `epic-audit-prepare.js --gate gate3` and take its **`epicCloseLenses`**
|
|
165
|
-
field: the slim roster of cumulative + global + risk-routed lenses, with
|
|
166
|
-
every local-tier change-set lens excluded (routed off `resolveLensTier` in
|
|
167
|
-
[`selectEpicCloseLenses`](../../scripts/lib/orchestration/code-review.js)).
|
|
168
|
-
Local-tier concerns are already verified shift-left (write-time checklists +
|
|
169
|
-
the Story-scope local-lens pass), so they are **not** re-run here.
|
|
170
|
-
2. Materialize each rostered lens via
|
|
171
|
-
[`runAuditSuite`](../../scripts/lib/audit-suite/index.js) at the envelope's
|
|
172
|
-
`depth`, applying the `{{changedFiles}}` substitution, and walk each lens's
|
|
173
|
-
`.agents/workflows/audit-<lens>.md` procedure over the cumulative
|
|
174
|
-
`main..epic/<epicId>` diff. Global lenses (`globalLenses`, e.g.
|
|
175
|
-
`audit-navigability`) run against the WHOLE route tree, exempt from the
|
|
176
|
-
change-set narrowing.
|
|
177
|
-
3. Fold the lens findings into this pass's severity aggregate **alongside** the
|
|
178
|
-
Step 2 review pillars — one walk of the cumulative diff, one aggregate, one
|
|
179
|
-
`verification-results` comment (Step 4). An empty `epicCloseLenses` roster
|
|
180
|
-
(docs-only, or every selected lens already covered shift-left, and no
|
|
181
|
-
risk-routed lens) adds no lens dimension — the pillars still run.
|
|
182
|
-
|
|
183
|
-
This step does not apply to `scope: story` (its roster is the local-tier set of
|
|
184
|
-
Step 1a) and is skipped when `epic-audit-prepare.js` returns `degraded: true`
|
|
185
|
-
(propagate the reason and STOP, per `epic-audit.md`).
|
|
149
|
+
— reaches this pass through the shared `runStoryReviewCore` spine. Because
|
|
150
|
+
the pass lives inside the close subprocess (invoked after the delivering
|
|
151
|
+
child exits), it honors the maker-blind invariant above: a maker never runs
|
|
152
|
+
its own local-lens review.
|
|
186
153
|
|
|
187
154
|
## Step 2 — Review Pillars
|
|
188
155
|
|
|
189
156
|
For each changed file, execute a strict review against four pillars. The
|
|
190
157
|
second pillar (**Integration Review**) deliberately defers the security /
|
|
191
|
-
performance / quality / coverage sweeps to the change-set-scoped lenses —
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
duplication, not defense-in-depth.
|
|
158
|
+
performance / quality / coverage sweeps to the change-set-scoped lenses —
|
|
159
|
+
those ran shift-left in the Story-scope local-lens pass (Step 1a).
|
|
160
|
+
Re-walking those sweeps a second time in this pillar is duplication, not
|
|
161
|
+
defense-in-depth.
|
|
196
162
|
|
|
197
163
|
**Apply the `depth` lever** (see **Review depth** above) to how hard you walk
|
|
198
164
|
these pillars: at `light`, focus on Pillar 1 and reduce Pillars 2–3 to a quick
|
|
@@ -206,57 +172,27 @@ never reduced to a scan.
|
|
|
206
172
|
|
|
207
173
|
### Pillar 1: Spec Adherence
|
|
208
174
|
|
|
209
|
-
Does the implementation match the
|
|
175
|
+
Does the implementation match the Story's acceptance criteria and folded Spec?
|
|
210
176
|
|
|
211
|
-
- Compare
|
|
177
|
+
- Compare the completed Story against its stated acceptance criteria.
|
|
212
178
|
- Flag any undocumented deviations, missing features, or scope creep.
|
|
213
|
-
- Verify API contracts, data models, and interface boundaries match the
|
|
214
|
-
Spec.
|
|
179
|
+
- Verify API contracts, data models, and interface boundaries match the Spec.
|
|
215
180
|
|
|
216
181
|
### Pillar 2: Integration Review
|
|
217
182
|
|
|
218
|
-
The
|
|
219
|
-
`
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
merged into `epic/<epicId>`.
|
|
232
|
-
- Spec deviations that the per-Task commits papered over.
|
|
233
|
-
|
|
234
|
-
- **`scope: epic`** — the diff is `main..epic/<epicId>` (the cumulative
|
|
235
|
-
Epic change set). The Epic-close lens roster (`epicCloseLenses`) is walked
|
|
236
|
-
**inline as part of this pass** (Step 1b) — the cumulative diff is read once,
|
|
237
|
-
and the security, privacy, performance, code-quality, and test-coverage
|
|
238
|
-
findings the rostered lenses produce feed this pass's aggregate directly.
|
|
239
|
-
There is no separate `audit-results` comment to read (Story #4412 retired it);
|
|
240
|
-
the lens findings and the pillar findings share the single
|
|
241
|
-
`verification-results` comment this pass posts.
|
|
242
|
-
|
|
243
|
-
The integration view at epic scope is what the per-lens audits cannot
|
|
244
|
-
produce because each lens runs in isolation:
|
|
245
|
-
|
|
246
|
-
- Cross-reference 🔴 / 🟠 lens findings against the spec deviations
|
|
247
|
-
flagged in Pillar 1 — a finding that traces back to a deliberate
|
|
248
|
-
Tech-Spec decision is different from one that traces back to an
|
|
249
|
-
oversight.
|
|
250
|
-
- Look for cross-cutting concerns no single lens owns: contract drift
|
|
251
|
-
between Stories, shared-module ripple effects, boundary changes that
|
|
252
|
-
thread security and performance implications together.
|
|
253
|
-
- Note any lens finding that the operator's remediation flow should
|
|
254
|
-
bundle (e.g. one refactor closes findings from multiple lenses).
|
|
255
|
-
|
|
256
|
-
If the Epic-close roster is empty (docs-only Epic, every selected lens
|
|
257
|
-
already covered shift-left, or the pass was skipped via
|
|
258
|
-
`--skip-epic-audit` / `--skip-code-review`), record that explicitly in the
|
|
259
|
-
findings report and proceed — there is no lens dimension to integrate.
|
|
183
|
+
The diff under review is `baseRef..headRef`
|
|
184
|
+
(`main..story-<storyId>`, or the configured base branch to the Story
|
|
185
|
+
branch). The Story-scope local-lens pass (Step 1a) has already covered the
|
|
186
|
+
local-tier concerns. Lens findings and pillar findings share the single
|
|
187
|
+
`verification-results` comment this pass posts (Story #4411). The
|
|
188
|
+
integration view here focuses on cross-cutting ripple within the Story and
|
|
189
|
+
contract drift against the base branch. Look for:
|
|
190
|
+
|
|
191
|
+
- Contract drift inside the Story (one change's API edit vs. another caller
|
|
192
|
+
in the same branch).
|
|
193
|
+
- Shared-module ripple effects from this Story onto code already merged to
|
|
194
|
+
`main`.
|
|
195
|
+
- Spec deviations that individual commits papered over.
|
|
260
196
|
|
|
261
197
|
### Pillar 3: Documentation Integrity
|
|
262
198
|
|
|
@@ -333,7 +269,7 @@ prior baseline before merging.
|
|
|
333
269
|
|
|
334
270
|
Findings are **persisted as a `verification-results` structured comment on
|
|
335
271
|
the `[TICKET_ID]` issue** by `runCodeReview` (the unified findings contract of
|
|
336
|
-
Story #4411;
|
|
272
|
+
Story #4411; this single comment carries the
|
|
337
273
|
Epic-close lens findings). The target ticket is the Story when
|
|
338
274
|
`scope === 'story'` and the Epic when `scope === 'epic'`. The comment
|
|
339
275
|
is idempotent — re-runs replace the prior one — and its body includes
|
|
@@ -442,7 +378,7 @@ in-place.
|
|
|
442
378
|
structured comment for the operator to triage in Step 5.
|
|
443
379
|
2. **Leave the finding on the structured comment for Step 5.** Required
|
|
444
380
|
when the finding falls into any of the following classes:
|
|
445
|
-
- `spec-deviation` — the change diverges from the
|
|
381
|
+
- `spec-deviation` — the change diverges from the Story `## Spec`.
|
|
446
382
|
- `secrets` — credentials, tokens, or PII surfaced in the diff.
|
|
447
383
|
- `test-deletion` — coverage was removed without an explicit
|
|
448
384
|
decision in the spec.
|
|
@@ -483,63 +419,6 @@ escalating to the operator. Escalated findings remain on the `code-review`
|
|
|
483
419
|
structured comment with their reason recorded, so Step 5 (and downstream
|
|
484
420
|
consumers) see exactly why each one was not auto-remediated.
|
|
485
421
|
|
|
486
|
-
## Step 4.6 — Cross-phase re-check trigger
|
|
487
|
-
|
|
488
|
-
After the focused-fix routing in Step 4.5 completes, any host-LLM-applied
|
|
489
|
-
fix commits have modified files on `[HEAD_REF]` that the Epic-close lens
|
|
490
|
-
roster already walked (Step 1b). Some of those edits may overlap the
|
|
491
|
-
`filePatterns` of one or more lenses (e.g. a fix landing in `**/auth/*.js`
|
|
492
|
-
overlaps the `audit-security` lens). When that happens, the lens findings in
|
|
493
|
-
the `verification-results` comment are **stale for the overlapping lenses
|
|
494
|
-
only** — the non-overlapping findings remain authoritative and MUST NOT be
|
|
495
|
-
re-derived.
|
|
496
|
-
|
|
497
|
-
> **Scope note.** This cross-phase re-check applies only when
|
|
498
|
-
> `scope === 'epic'`. Story-scope reviews carry no Epic-close lens roster,
|
|
499
|
-
> so there is nothing to invalidate; skip this step entirely for
|
|
500
|
-
> `scope === 'story'`.
|
|
501
|
-
|
|
502
|
-
Invoke the re-check selector with the cumulative set of paths touched by
|
|
503
|
-
the focused-fix commits:
|
|
504
|
-
|
|
505
|
-
```powershell
|
|
506
|
-
node .agents/scripts/epic-audit-recheck.js \
|
|
507
|
-
--epic [TICKET_ID] --files <comma-separated-touched-paths>
|
|
508
|
-
```
|
|
509
|
-
|
|
510
|
-
For large touched-file lists, pass `@<file>` (where `<file>` is a
|
|
511
|
-
newline-delimited list written to `temp/`) to avoid shell argument-length
|
|
512
|
-
limits. The CLI emits a JSON envelope of the shape
|
|
513
|
-
`{ selectedAudits: [...], context: { ... } }` restricted to lenses whose
|
|
514
|
-
`filePatterns` overlap the input file list. An empty `selectedAudits`
|
|
515
|
-
array means no overlap — there is nothing to re-run and this step is a
|
|
516
|
-
no-op.
|
|
517
|
-
|
|
518
|
-
When `selectedAudits` is non-empty:
|
|
519
|
-
|
|
520
|
-
1. Re-invoke each listed lens prompt under
|
|
521
|
-
[`../audit-*.md`](../) the same way the Step 1b Epic-close walk does —
|
|
522
|
-
one lens at a time, against the current `[HEAD_REF]` tip.
|
|
523
|
-
2. **Append** a `## Cross-phase re-check` section to the **existing**
|
|
524
|
-
`verification-results` structured comment on the Epic ticket. Do **not**
|
|
525
|
-
post a new comment; the comment is idempotent and downstream consumers
|
|
526
|
-
(the code-review trim, `/deliver` Pillar 2, the retro helper)
|
|
527
|
-
read it once. The append carries the re-checked lens names, the new
|
|
528
|
-
findings (if any), and the focused-fix commit SHAs that triggered the
|
|
529
|
-
re-run, so reviewers can trace each finding back to the change set
|
|
530
|
-
that produced it.
|
|
531
|
-
3. If the re-check surfaces fresh 🔴 / 🟠 findings, route them back
|
|
532
|
-
through Step 4.5's focused-fix routing. Findings that already
|
|
533
|
-
received a focused-fix attempt in the first pass do not get a fresh
|
|
534
|
-
attempt when the cross-phase re-check resurfaces an adjacent one —
|
|
535
|
-
leave them on the `verification-results` comment for the operator.
|
|
536
|
-
|
|
537
|
-
If `selectedAudits` is empty, skip silently and proceed to Step 5. The
|
|
538
|
-
re-check trigger is **read-only signal** — it never mutates the Epic
|
|
539
|
-
branch on its own; mutations only happen if the re-invoked lenses
|
|
540
|
-
surface findings that the host LLM then converts into commits through
|
|
541
|
-
the same focused-fix routing as Step 4.5.
|
|
542
|
-
|
|
543
422
|
## Step 5 — Remediation
|
|
544
423
|
|
|
545
424
|
If the operator instructs you to fix any findings:
|
|
@@ -576,7 +455,7 @@ to the next phase of the parent workflow.
|
|
|
576
455
|
the scope is set by the caller, and reviewing against the wrong base
|
|
577
456
|
produces either a hollow review (too small a diff) or noise (too large a
|
|
578
457
|
diff that includes unrelated history).
|
|
579
|
-
- **Always** read the
|
|
458
|
+
- **Always** read the Story body and folded Spec before reviewing code. Findings without
|
|
580
459
|
spec context are noise.
|
|
581
460
|
- **Never** implement fixes unless the operator explicitly requests it. The
|
|
582
461
|
default mode is read-only audit.
|
package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md}
RENAMED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: >-
|
|
3
|
-
Reference companion to `helpers/
|
|
3
|
+
Reference companion to `helpers/deliver-story.md` — the lease and
|
|
4
4
|
sweep detail, worktree-scope warnings, CI-recovery procedures, and
|
|
5
5
|
Status-column reconciliation lifted out of the runtime core so the
|
|
6
6
|
always-ingested standalone-delivery prose stays lean. Not a slash command;
|
|
7
7
|
consulted on demand when the core file points here.
|
|
8
|
-
caller: helpers/
|
|
8
|
+
caller: helpers/deliver-story.md
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
# helpers/
|
|
11
|
+
# helpers/deliver-story — reference (lease, recovery, troubleshooting)
|
|
12
12
|
|
|
13
13
|
> **Not a slash command, not the runtime path.** This file is the
|
|
14
14
|
> reference companion to
|
|
15
|
-
> [`
|
|
15
|
+
> [`deliver-story.md`](deliver-story.md). The core file
|
|
16
16
|
> carries the step flow, commands, gate contracts, and the return contract a
|
|
17
17
|
> standalone-Story run needs; this file holds the lease/sweep mechanics, the
|
|
18
18
|
> worktree-scope safety warning, the CI-recovery procedures, and the
|
|
@@ -85,7 +85,7 @@ The sweep applies two hardening layers (Story #2011):
|
|
|
85
85
|
operator can see what was preserved.
|
|
86
86
|
- **Cross-session lock.** The sweep acquires a process-scoped lockfile
|
|
87
87
|
at `<tempRoot>/single-story-sweep.lock` before planning. On
|
|
88
|
-
contention (another `/
|
|
88
|
+
contention (another `/deliver-story` already in the sweep
|
|
89
89
|
step), this run's sweep is **skipped** with a warn log; init
|
|
90
90
|
continues normally. Stale lockfiles (mtime older than the timeout)
|
|
91
91
|
are treated as expired. The timeout defaults to 60 seconds and is
|
|
@@ -121,7 +121,7 @@ The `single-story-close.js` script, in order:
|
|
|
121
121
|
1a. **Syncs the Story branch from `origin/<baseBranch>`** before push
|
|
122
122
|
(Story #2580). Runs `git fetch origin <baseBranch>` followed by
|
|
123
123
|
`git merge --no-edit origin/<baseBranch>` inside the worktree. This
|
|
124
|
-
defends against the parallel-`/
|
|
124
|
+
defends against the parallel-`/deliver-story` race: when
|
|
125
125
|
multiple sessions run in parallel, the Story that auto-merges first
|
|
126
126
|
bumps `baseBranch`, and without this sync the lagging Stories open
|
|
127
127
|
PRs that are "behind base" and stall against branch-protection's
|
|
@@ -133,7 +133,7 @@ The `single-story-close.js` script, in order:
|
|
|
133
133
|
command set), the Story flips to `agent::blocked`, and close
|
|
134
134
|
throws. Resolve in the worktree (`git merge origin/<base>` + fix
|
|
135
135
|
conflicts + `git commit --no-edit`) and re-run
|
|
136
|
-
`/
|
|
136
|
+
`/deliver-story`.
|
|
137
137
|
- **Fetch failed** → close throws with the git stderr; no label
|
|
138
138
|
transition.
|
|
139
139
|
|
|
@@ -161,19 +161,24 @@ The `single-story-close.js` script, in order:
|
|
|
161
161
|
would strand a CLOSED issue with no merged work if the PR later failed
|
|
162
162
|
CI, went `BEHIND` base, or was closed without merging. The Story rests
|
|
163
163
|
at `agent::closing` while the PR is open with auto-merge armed; the
|
|
164
|
-
`agent::done` flip (which closes the issue) is deferred to Step 5
|
|
165
|
-
`single-story-confirm-merge.js
|
|
166
|
-
|
|
167
|
-
|
|
164
|
+
`agent::done` flip (which closes the issue) is deferred to Step 5's
|
|
165
|
+
merge confirmation — `single-story-confirm-merge.js` on a
|
|
166
|
+
`--no-wait-merge` run, or the in-close confirm phase on the
|
|
167
|
+
close-and-land default. (Step 5.5 is the Status-column resync.) A Story
|
|
168
|
+
only reaches `agent::done` once its PR to `main` is confirmed merged.
|
|
168
169
|
5. Reaps the worktree when `delivery.worktreeIsolation.reapOnSuccess`
|
|
169
170
|
is enabled.
|
|
170
171
|
6. **Releases the Story lease** (Story #3483). Clears the Story assignment
|
|
171
|
-
that init claimed so the next `/
|
|
172
|
+
that init claimed so the next `/deliver-story` run sees an
|
|
172
173
|
unclaimed ticket. The release is a no-op when the operator no longer
|
|
173
174
|
holds the claim (a later run took over via reclaim/steal), so a late
|
|
174
175
|
close never yanks a live claim away from its current owner. Best-effort:
|
|
175
|
-
a release failure is logged but does not fail an otherwise-clean close
|
|
176
|
-
the lease
|
|
176
|
+
a release failure is logged but does not fail an otherwise-clean close.
|
|
177
|
+
Note the lease does **not** expire on its own: the standalone lease is
|
|
178
|
+
fail-closed by design (it anchors its heartbeat to now, so a foreign
|
|
179
|
+
claim always reads as live regardless of the configured TTL), so a
|
|
180
|
+
claim stranded by a failed release is cleared only by `--steal` or by
|
|
181
|
+
de-assigning the ticket. The close result carries
|
|
177
182
|
`leaseReleased: <boolean>`.
|
|
178
183
|
|
|
179
184
|
`--skip-validation` bypasses Step 1 (gates). Use only when re-running
|
|
@@ -290,9 +295,8 @@ when `--pr` is omitted) and:
|
|
|
290
295
|
- **Story already `agent::done` / issue already closed** → idempotent
|
|
291
296
|
`{ action: 'noop', reason: 'already-done' }`.
|
|
292
297
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
exactly when the work has merged, never at PR-open.
|
|
298
|
+
The issue closes exactly when the work has merged, never at PR-open
|
|
299
|
+
(#2155).
|
|
296
300
|
|
|
297
301
|
---
|
|
298
302
|
|
|
@@ -348,7 +352,7 @@ GitHub deletes the **remote** branch on auto-merge (via the
|
|
|
348
352
|
`--delete-branch` flag `single-story-close.js` passes to `gh pr merge`).
|
|
349
353
|
The **local** `story-<storyId>` ref, however, lingers in the main
|
|
350
354
|
checkout until something prunes it — `single-story-init.js` runs a
|
|
351
|
-
merged-sweep at the start of every *subsequent* `/
|
|
355
|
+
merged-sweep at the start of every *subsequent* `/deliver-story`
|
|
352
356
|
invocation, but that's next-run cleanup, not end-of-run cleanup. Stale
|
|
353
357
|
local refs accumulate between sessions, clutter `git branch`, and shadow
|
|
354
358
|
the lessons the sweep is meant to surface.
|
|
@@ -387,36 +391,71 @@ up").
|
|
|
387
391
|
|
|
388
392
|
## Step 7 — Return-contract detail
|
|
389
393
|
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
394
|
+
The field-level contract is the shipped schema
|
|
395
|
+
[`story-deliver-terminal.schema.json`](../../schemas/story-deliver-terminal.schema.json)
|
|
396
|
+
(Story #4543) — not this file, and not
|
|
397
|
+
[`agents/story-worker.md`](../../agents/story-worker.md). All three used to
|
|
398
|
+
carry their own prose version; the schema is now the only definition. What
|
|
399
|
+
follows is the *judgement* around it, which a schema cannot express.
|
|
400
|
+
|
|
401
|
+
### `pending` is a real status — and it is not a park
|
|
402
|
+
|
|
403
|
+
Earlier revisions asserted "the auto-merge wait does not produce a fourth
|
|
404
|
+
status", on the reasoning that the wait is internally blocking so a run either
|
|
405
|
+
merges or blocks. That was true only while the wait was unbounded — and it was
|
|
406
|
+
never actually unbounded, because the host kills a tool invocation at ~10
|
|
407
|
+
minutes. So a close-and-land whose CI outlived that ceiling took **no**
|
|
408
|
+
terminal path at all: no event, no label, the Story parked at
|
|
409
|
+
`agent::closing`. The status the model refused to name was the one that kept
|
|
410
|
+
happening.
|
|
411
|
+
|
|
412
|
+
`pending` names it, with its own exit code (3):
|
|
413
|
+
|
|
414
|
+
- It is **resumable**: no label was mutated, no `merge.unlanded` was emitted,
|
|
415
|
+
and `nextCommand` names the one command that continues it. The cumulative
|
|
416
|
+
budget is anchored at the PR's `createdAt`, so resuming does not restart the
|
|
417
|
+
clock and the give-up bound still means something.
|
|
418
|
+
- It is **not** a park. Returning `pending` because you would rather not wait
|
|
419
|
+
is the Story #1553 / PR #1554 failure mode wearing a schema. Return it only
|
|
420
|
+
when the bound genuinely expired, or a human owns the merge.
|
|
421
|
+
|
|
422
|
+
The no-park rule is therefore unchanged in substance: a turn that ends with
|
|
423
|
+
prose ("I'll wait for the watch task…", "the next event will be its
|
|
424
|
+
completion notification…") and an unconfirmed merge is a **contract
|
|
425
|
+
violation** — the parent cannot distinguish "still working" from "done but
|
|
426
|
+
silent". What changed is that there is now an honest, machine-readable way to
|
|
427
|
+
say "not finished, here is exactly how to continue" instead of a choice
|
|
428
|
+
between lying and blocking forever.
|
|
429
|
+
|
|
430
|
+
### Exit-code compatibility note (`--no-wait-merge`)
|
|
431
|
+
|
|
432
|
+
Every close flag keeps its meaning, but the **exit code** of a
|
|
433
|
+
`--no-wait-merge` (or `--no-auto-merge` / `autoMerge: "strict"`) run changed:
|
|
434
|
+
it now exits **3** (`pending`) rather than 0, because the PR is open and a
|
|
435
|
+
human still owns the merge. Reporting `landed` would be a lie, and `landed` is
|
|
436
|
+
what exit 0 means. A wrapper that shells out and tests `exit == 0` to mean
|
|
437
|
+
"close finished" must be updated to treat 3 as the operator-merge success
|
|
438
|
+
path; `!= 0` no longer implies failure.
|
|
439
|
+
|
|
440
|
+
### Per-status judgement
|
|
441
|
+
|
|
442
|
+
- **`landed`** — the only status that means done. A `false` in `tail.*`
|
|
443
|
+
degrades the report, never the land: the merge is on the base branch, and
|
|
444
|
+
failing it because a Projects v2 mutation flaked would report a false
|
|
445
|
+
negative about work that demonstrably shipped.
|
|
446
|
+
- **`pending`** — see above.
|
|
447
|
+
- **`blocked`** — you (or the close pipeline) transitioned the Story to
|
|
448
|
+
`agent::blocked` and posted a `friction` comment. `blocked.blockClass` comes
|
|
449
|
+
from the shared classifier, never an ad hoc string, and
|
|
450
|
+
`blocked.frictionCommentId` points at the remediation.
|
|
451
|
+
- **`failed`** — an unrecoverable failure outside the blocked protocol.
|
|
452
|
+
`phase` reflects where it died.
|
|
413
453
|
|
|
414
454
|
> **Handoff discipline — report state, not process.** Populate the envelope
|
|
415
455
|
> with essential terminal state only (mirroring the fields
|
|
416
|
-
> `single-story-close.js`
|
|
456
|
+
> `single-story-close.js` already emits). Do not narrate the
|
|
417
457
|
> steps you took, and do not prescribe how the next stage should work. Prose
|
|
418
|
-
> process commentary only bloats the hydrated prompt
|
|
419
|
-
> (`delivery.maxTokenBudget` elision). When run **interactively** (no parent
|
|
458
|
+
> process commentary only bloats the hydrated prompt. When run **interactively** (no parent
|
|
420
459
|
> aggregator), this JSON envelope is optional — relay terminal state to the
|
|
421
460
|
> operator in prose instead — but the **no-park rule still holds**: never end
|
|
422
461
|
> an interactive turn with an unconfirmed merge either; block on the watch,
|