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,171 +1,303 @@
|
|
|
1
1
|
---
|
|
2
2
|
description:
|
|
3
|
-
Unified planning entry point.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
and absorbs every planning flag.
|
|
3
|
+
Unified planning entry point. Interrogate → author → persist. Emits one
|
|
4
|
+
Story by default (folded Tech Spec in the Story body); splits into N>1
|
|
5
|
+
only under the default-single split policy.
|
|
7
6
|
---
|
|
8
7
|
|
|
9
|
-
# /plan
|
|
8
|
+
# /plan --seed "<text>" | --seed-file <path> | --tickets <ids>
|
|
10
9
|
|
|
11
10
|
## Role
|
|
12
11
|
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
Single planning path. `/plan` owns the full ceremony — there is no
|
|
13
|
+
Epic/Story router, no scope-triage `epic|story` verdict, and no
|
|
14
|
+
`deliveryShape`. Two operator modes only:
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
into the Epic body, then the Story backlog or a single-delivery marker).
|
|
19
|
-
- [`helpers/plan-story.md`](helpers/plan-story.md) — the standalone-Story
|
|
20
|
-
authoring path (context envelope → host-LLM draft → HITL → issue create).
|
|
16
|
+
1. **Text** — seed from chat or a file.
|
|
17
|
+
2. **Tickets** — analyze existing issue(s) into proper Stories.
|
|
21
18
|
|
|
22
|
-
|
|
23
|
-
(
|
|
24
|
-
|
|
25
|
-
path; no new classification machinery exists.
|
|
19
|
+
Audit findings become Stories via [`/audit-to-stories`](audit-to-stories.md)
|
|
20
|
+
(separate workflow), which hands off with `--emit-plan-seed` →
|
|
21
|
+
`/plan --seed-file <path>`.
|
|
26
22
|
|
|
27
23
|
## Inputs
|
|
28
24
|
|
|
29
25
|
| Invocation | Behavior |
|
|
30
26
|
| --- | --- |
|
|
31
|
-
| `/plan --
|
|
32
|
-
| `/plan <
|
|
33
|
-
| `/plan --
|
|
27
|
+
| `/plan --seed "<text>"` | Ideation from chat text: interrogate → author **one Story by default** → persist. |
|
|
28
|
+
| `/plan --seed-file <path>` | Author from on-disk notes / plan seed (e.g. audit-to-stories handoff). |
|
|
29
|
+
| `/plan --tickets 123[,456…]` | Fetch issue(s), analyze into proper Stories (prefer N=1 rewrite). |
|
|
30
|
+
|
|
31
|
+
`--body` is **not** a `/plan` entry. Persist always goes through
|
|
32
|
+
`plan-persist.js --stories …`.
|
|
34
33
|
|
|
35
34
|
## Flags
|
|
36
35
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
|
41
|
-
|
|
|
42
|
-
| `--
|
|
43
|
-
| `--
|
|
44
|
-
| `--
|
|
45
|
-
| `--
|
|
46
|
-
| `--
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
### Headless / non-interactive mode (`--yes`)
|
|
65
|
-
|
|
66
|
-
`--yes` is the headless escape hatch for an unattended driver (CI, a
|
|
67
|
-
benchmark harness, or any `claude -p` run with no human at the keyboard). It
|
|
68
|
-
is the `/plan`-side parallel of [`/deliver --yes`](deliver.md). `/plan` has
|
|
69
|
-
exactly **two** HITL STOP gates, and `--yes` deterministically auto-proceeds
|
|
70
|
-
**both** without waiting for operator input:
|
|
71
|
-
|
|
72
|
-
1. **Gate #1 — the exit of the interrogate step.** One conceptual gate with
|
|
73
|
-
a face per entry form, and `--yes` auto-proceeds all of them:
|
|
74
|
-
- On the `--idea` Epic path, the interrogate step of
|
|
75
|
-
[`helpers/plan-epic.md`](helpers/plan-epic.md) STOPs to confirm the
|
|
76
|
-
sharpened one-pager, folding in the scope-triage verdict and the
|
|
77
|
-
duplicate-candidate review.
|
|
78
|
-
- On the `--idea` Story path,
|
|
79
|
-
[`helpers/plan-story.md`](helpers/plan-story.md) Phase 2 STOPs to
|
|
80
|
-
confirm the drafted Story body.
|
|
81
|
-
- On the existing-Epic (`/plan <epicId>`) path, the interrogate step
|
|
82
|
-
STOPs to confirm the folded re-plan / clarity-refinement / advisory
|
|
83
|
-
outcomes (the Clarity Gate's refined-body diff among them).
|
|
84
|
-
|
|
85
|
-
Under `--yes` each resolves as **approved**, and a `story` /
|
|
86
|
-
`borderline` triage verdict resolves to its **Recommended** branch rather
|
|
87
|
-
than prompting the three-way choice. **The interrogation itself runs
|
|
88
|
-
exactly one bounded pass**: no operator questions are asked — facts come
|
|
89
|
-
from the codebase, and every unresolved unknown lands in the one-pager's
|
|
90
|
-
**Key Assumptions** section instead of a question, so a headless driver
|
|
91
|
-
can never hang inside a free-form interrogation. On the `--idea` Epic
|
|
92
|
-
path this bounded pass IS the seed entry (#4496): `plan-context.js
|
|
93
|
-
--seed` replaces the idea-refinement prelude, and the one-pager is
|
|
94
|
-
authored in the same batched write as the spec artifacts. The verdict / clarity
|
|
95
|
-
scoring is still recorded in chat (one line); only the *wait* is
|
|
96
|
-
suppressed — the deterministic clarity *scoring* inside the
|
|
97
|
-
`plan-context.js` envelope always runs.
|
|
98
|
-
2. **Gate #2 — the risk-routed pre-persist review.** When the authored risk
|
|
99
|
-
verdict routes to review (high risk, or the operator also passed
|
|
100
|
-
`--force-review`), [`helpers/plan-epic.md`](helpers/plan-epic.md) step 3
|
|
101
|
-
STOPs for operator approval of the assembled plan (spec, tickets, risk,
|
|
102
|
-
and `deliveryShape` in one view) before the persist CLI runs. Under
|
|
103
|
-
`--yes` this review auto-proceeds straight to the persist call, exactly
|
|
104
|
-
as on the low-risk auto-proceed branch.
|
|
105
|
-
|
|
106
|
-
**Composition.** `--yes` is orthogonal to the other planning flags and
|
|
107
|
-
composes cleanly:
|
|
108
|
-
|
|
109
|
-
- With **`--allow-over-budget`**: `--yes` suppresses the gate *waits* while
|
|
110
|
-
`--allow-over-budget` still governs the `maxTickets` over-budget persist —
|
|
111
|
-
passing `--yes` alone does **not** waive the budget gate.
|
|
112
|
-
- With the **risk-routed gate #2 skip**: when risk routing already
|
|
113
|
-
auto-proceeds the review (low-risk, no `--force-review`), `--yes` is a
|
|
114
|
-
no-op for that gate — it only *forces a proceed where the gate would
|
|
115
|
-
otherwise STOP*, it never *adds* a stop or relaxes any non-HITL validator.
|
|
116
|
-
|
|
117
|
-
**`--yes` suppresses only the HITL operator *waits* above.** It does **not**
|
|
118
|
-
relax any deterministic gate — the clarity scoring, the Tech Spec section
|
|
119
|
-
gate, the ticket validator / file-assumption / DAG / budget gates, the
|
|
120
|
-
inline readiness healthcheck, and the `agent::blocked` runtime pause all
|
|
121
|
-
behave exactly as without the flag; it is an operator-input suppressor, not
|
|
122
|
-
a validation override. A `--yes` run that hits one of those still fails
|
|
123
|
-
closed. The smaller operator-input waits folded into the two gates — the
|
|
124
|
-
duplicate-candidate review, the clarity refinement-diff confirm, and the
|
|
125
|
-
advisory critic diffs — auto-proceed for the same headless reason.
|
|
36
|
+
| Flag | Meaning |
|
|
37
|
+
| --- | --- |
|
|
38
|
+
| `--seed "<text>"` | Seed text for ideation. |
|
|
39
|
+
| `--seed-file <path>` | Pre-authored notes / plan-seed path. |
|
|
40
|
+
| `--tickets <ids>` | Comma-separated issue ids to analyze. Closed as superseded at persist (see below). |
|
|
41
|
+
| `--no-close-superseded` | Keep the `--tickets` source issues open — no supersede comment, no close. |
|
|
42
|
+
| `--force-review` | STOP at gate #2 for operator review of the assembled plan. The only thing that gates review — there is no risk-derived routing (Story #4542). |
|
|
43
|
+
| `--allow-over-budget` | Permit a plan that exceeds `maxTickets` (rare N>1). |
|
|
44
|
+
| `--yes` | Non-interactive: auto-proceed gate #1 and gate #2 HITL waits. |
|
|
45
|
+
| `--dry-run` | Author + validate without GitHub writes. Run it as a pre-pass before every real persist (see below). |
|
|
46
|
+
|
|
47
|
+
## Default-single split policy
|
|
48
|
+
|
|
49
|
+
Author **one Story** unless:
|
|
50
|
+
|
|
51
|
+
1. the pieces have **near-zero overlap** (genuinely independent capabilities), or
|
|
52
|
+
2. there is an **architectural seam** (different deployables, migration vs consumer).
|
|
53
|
+
|
|
54
|
+
Coupled work stays one Story — decompose it inside `## Slicing` as
|
|
55
|
+
intra-session checkpoints, not sibling tickets. When N>1, every acceptance
|
|
56
|
+
criterion must belong to exactly one Story; `plan-persist` runs
|
|
57
|
+
`assertAcceptancePartition` and refuses coupled splits.
|
|
58
|
+
|
|
59
|
+
**N=1 is the lean path:** one authoring prompt, folded `## Spec` in the
|
|
60
|
+
Story body, light risk/critic profile. Do not run Epic-scale decompose,
|
|
61
|
+
clarity, or reconciler ceremony for a single Story.
|
|
126
62
|
|
|
127
63
|
## Procedure
|
|
128
64
|
|
|
129
|
-
1.
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
65
|
+
### 1. Interrogate
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
node .agents/scripts/plan-context.js --seed "<seed>" \
|
|
69
|
+
--out temp/plan-<slug>/plan-context.json
|
|
70
|
+
# or: --seed-file <path>
|
|
71
|
+
# or: --tickets 123,456
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Always pass `--out temp/plan-<slug>/plan-context.json`.** The CLI writes the
|
|
75
|
+
envelope there (creating parent dirs); persist auto-discovers that file from
|
|
76
|
+
`--plan-dir` and derives the `--tickets` source ids from its `sourceTickets[]`.
|
|
77
|
+
That is what makes superseding work without anyone re-typing ids
|
|
78
|
+
(Story #4554). The envelope still goes to stdout too, so piping is unaffected.
|
|
79
|
+
|
|
80
|
+
The envelope carries docs context, codebase snapshot, BDD probe, risk
|
|
81
|
+
heuristics, the story-author system prompt, `sourceTickets[]` (`--tickets`
|
|
82
|
+
mode), and `duplicates[]` (open **Stories** whose title/body overlap the
|
|
83
|
+
seed — never Epics).
|
|
84
|
+
Under `--yes`, do not ask free-form operator questions — unresolved
|
|
85
|
+
unknowns land in Key Assumptions.
|
|
86
|
+
|
|
87
|
+
**Gate #1** — STOP to confirm the sharpened plan intent and any
|
|
88
|
+
duplicate-candidate review. Under `--yes`, auto-proceed.
|
|
89
|
+
|
|
90
|
+
### 2. Author
|
|
91
|
+
|
|
92
|
+
Write artifacts under `temp/plan-<slug>/`:
|
|
93
|
+
|
|
94
|
+
- `stories.json` — array of Story tickets (**length 1 by default**). Each
|
|
95
|
+
body uses the canonical `story-body` shape (`## Goal`, optional
|
|
96
|
+
`## Slicing`, optional `## Spec`, `## Changes`, `## Acceptance`,
|
|
97
|
+
`## Verify`, …). The Story is the single executable document: put lean
|
|
98
|
+
approach prose in `## Spec`, binding criteria in top-level
|
|
99
|
+
`acceptance[]` / `verify[]` (persist syncs them into the body). Do not
|
|
100
|
+
restate Goal/Acceptance inside Spec. Over-budget Specs fail closed —
|
|
101
|
+
split the Story or tighten Spec; never write Specs under `docs/`.
|
|
102
|
+
- optional `techspec.md` — **N===1 only** convenience when Spec was authored
|
|
103
|
+
outside the Story JSON; persist folds it into that Story's `## Spec`.
|
|
104
|
+
Forbidden for N>1 (each Story must carry its own Spec).
|
|
105
|
+
- optional `acceptance-manifest.json` — plan-level AC list (a JSON
|
|
106
|
+
`string[]`) for partition coverage when N>1. Pass it to persist as
|
|
107
|
+
`--plan-acceptance` or it is not read.
|
|
108
|
+
|
|
109
|
+
For N=1, use the envelope `systemPrompts.story` and emit one cohesive
|
|
110
|
+
Story. Split only under the policy above.
|
|
111
|
+
|
|
112
|
+
**Tickets mode — author `supersedes[]` on every Story.** In `--tickets`
|
|
113
|
+
mode each Story carries a top-level `supersedes` array claiming the source
|
|
114
|
+
issues it replaces. It is bookkeeping, not part of the Story body, so it is
|
|
115
|
+
never serialized into the markdown:
|
|
116
|
+
|
|
117
|
+
```jsonc
|
|
118
|
+
{
|
|
119
|
+
"slug": "close-superseded",
|
|
120
|
+
"supersedes": [
|
|
121
|
+
4525,
|
|
122
|
+
{ "id": 4529, "note": "The filed `--changed-only` fix is provably inert; the correction is recorded here." }
|
|
123
|
+
]
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Entries are bare issue numbers, or `{ id, note }` when the plan has
|
|
128
|
+
something to say about *that* source issue — a correction to its analysis,
|
|
129
|
+
or why it was folded in with others. The optional `note` is rendered into
|
|
130
|
+
that issue's supersede comment, so planning that materially corrects a
|
|
131
|
+
source issue records the correction on the ticket rather than emitting
|
|
132
|
+
template-only prose.
|
|
133
|
+
|
|
134
|
+
### Supersede-map partition
|
|
135
|
+
|
|
136
|
+
`plan-persist` refuses a partial supersede map **before** it creates any
|
|
137
|
+
Story (mirroring `assertAcceptancePartition`): every id passed to
|
|
138
|
+
`--tickets` must be claimed by **exactly one** Story, and no Story may
|
|
139
|
+
claim an id that was not a source ticket. With N>1 the mapping is not
|
|
140
|
+
total by default — an authored map is the only thing that can say
|
|
141
|
+
`#4525-#4528 → #4530` while `#4529 → #4531`, which a blanket "superseded by
|
|
142
|
+
this plan-run" reference could not.
|
|
143
|
+
|
|
144
|
+
### 3. Persist
|
|
145
|
+
|
|
146
|
+
**Gate #2** — when the operator passed `--force-review`, STOP for approval of
|
|
147
|
+
the assembled plan before persist. Under `--yes`, auto-proceed.
|
|
148
|
+
|
|
149
|
+
`--force-review` is the **only** thing that raises this gate. Story #4542
|
|
150
|
+
retired the risk-derived alternative: the planner authored its own risk verdict,
|
|
151
|
+
persist computed a `requiresStop` from it *after* `createStoryIssues` had already
|
|
152
|
+
run, and nothing read the result — the STOP was prose executed by the same
|
|
153
|
+
session that wrote the verdict. A gate a plan can lower for itself is not a gate.
|
|
154
|
+
|
|
155
|
+
#### Dry-run pre-pass (always)
|
|
156
|
+
|
|
157
|
+
Run persist with `--dry-run` **before** the real one. It is the same command
|
|
158
|
+
with the same flags — only the GitHub writes are suppressed:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
node .agents/scripts/plan-persist.js \
|
|
162
|
+
--stories temp/plan-<slug>/stories.json \
|
|
163
|
+
[--plan-acceptance temp/plan-<slug>/acceptance-manifest.json] \
|
|
164
|
+
[--tech-spec temp/plan-<slug>/techspec.md] \
|
|
165
|
+
--plan-dir temp/plan-<slug> \
|
|
166
|
+
--dry-run
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Every gate — ticket validator, body parse, subject-prefix, DAG, capacity,
|
|
170
|
+
budget, reachability, split-policy and supersede partitions, Spec fold —
|
|
171
|
+
runs **before** the first `createIssue`, so a dry-run exercises all of them
|
|
172
|
+
write-free. An authoring mistake surfaces here, where the fix costs one
|
|
173
|
+
re-author, instead of after `k` of `N` Stories are already live.
|
|
174
|
+
|
|
175
|
+
#### The real persist
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
node .agents/scripts/plan-persist.js \
|
|
179
|
+
--stories temp/plan-<slug>/stories.json \
|
|
180
|
+
[--plan-acceptance temp/plan-<slug>/acceptance-manifest.json] \
|
|
181
|
+
[--tech-spec temp/plan-<slug>/techspec.md] \
|
|
182
|
+
[--plan-dir temp/plan-<slug>] \
|
|
183
|
+
[--plan-context temp/plan-<slug>/plan-context.json] \
|
|
184
|
+
[--source-tickets 123,456] \
|
|
185
|
+
[--no-close-superseded] \
|
|
186
|
+
[--force-review] \
|
|
187
|
+
[--allow-over-budget]
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
Pass `--plan-acceptance` whenever step 2 wrote an `acceptance-manifest.json`
|
|
191
|
+
— it is what `assertAcceptancePartition` checks the N>1 split against.
|
|
192
|
+
|
|
193
|
+
Persist creates Story issue(s) with `type::story` (plus any sanitized
|
|
194
|
+
authored `labels[]`) and, when N>1, writes each authored `depends_on` edge
|
|
195
|
+
into the sibling's body as a `blocked by #<id>` footer — the ordering
|
|
196
|
+
`/deliver` resolves from. No batch label is applied (Story #4540 retired
|
|
197
|
+
`plan-run::<id>`). Ends by naming the exact command:
|
|
198
|
+
`/deliver <storyId> [<storyId> ...]`.
|
|
199
|
+
|
|
200
|
+
stdout is a pure JSON result; all log lines go to stderr, so a headless
|
|
201
|
+
driver can `JSON.parse` the stdout stream directly.
|
|
202
|
+
|
|
203
|
+
#### Ready means fully persisted
|
|
204
|
+
|
|
205
|
+
`agent::ready` is the **terminal** step, not part of the creating POST
|
|
206
|
+
(Story #4541). The order is: create unlabelled → upsert `story-plan-state` on
|
|
207
|
+
every Story → upsert `plan-summary` on the primary → flip every Story to
|
|
208
|
+
`agent::ready`.
|
|
209
|
+
|
|
210
|
+
This is what lets `/deliver` trust the label: a Story carrying
|
|
211
|
+
`agent::ready` always has its persist receipt on the ticket, so nothing can
|
|
212
|
+
pick it up mid-write and read a half-persisted plan.
|
|
213
|
+
|
|
214
|
+
#### Resuming a failed persist
|
|
215
|
+
|
|
216
|
+
Persist is **idempotent over the same authored artifacts**. Each created body
|
|
217
|
+
carries an invisible plan fingerprint (derived from the Story's slug +
|
|
218
|
+
title), and persist indexes the open `type::story` backlog by it before
|
|
219
|
+
creating anything.
|
|
220
|
+
|
|
221
|
+
So if a transient GitHub failure strands the run at Story `k` of `N`:
|
|
222
|
+
|
|
223
|
+
| | Behaviour |
|
|
224
|
+
| --- | --- |
|
|
225
|
+
| The `1..k-1` Stories | Live, but **not** `agent::ready` — invisible to `/deliver`, not half-delivered. |
|
|
226
|
+
| Re-running persist | Adopts them by fingerprint, creates only the missing ones, then flips the whole cohort ready. |
|
|
227
|
+
| Editing `stories.json` first | Changing a slug or title changes the fingerprint — the old issue is orphaned rather than adopted. Close it by hand. |
|
|
228
|
+
|
|
229
|
+
Just re-run the same command. Do not hand-delete the stranded issues first.
|
|
230
|
+
|
|
231
|
+
#### Temp hygiene
|
|
232
|
+
|
|
233
|
+
A terminal-success run deletes its own `--plan-dir`. Every persist also reaps
|
|
234
|
+
abandoned `temp/plan-*` directories older than 7 days, so dry-runs, failed
|
|
235
|
+
gates, and abandoned authoring sessions do not accumulate under `temp/`.
|
|
236
|
+
|
|
237
|
+
### How the source ids reach persist
|
|
238
|
+
|
|
239
|
+
In `--tickets` mode persist needs to know which ids were fetched. It resolves
|
|
240
|
+
them **envelope-first** (Story #4554):
|
|
241
|
+
|
|
242
|
+
| Channel | When it wins |
|
|
243
|
+
| --- | --- |
|
|
244
|
+
| Envelope `sourceTickets[]` | **The normal path.** Written by step 1's `--out`, then read from `--plan-context <file>` or auto-discovered at `<plan-dir>/plan-context.json`. No ids to re-type. |
|
|
245
|
+
| `--source-tickets <ids>` | Explicit **override** for hand-driven runs (no captured envelope, or deliberately narrowing the set). Wins over the envelope; a disagreement is warned about, not silently reconciled. |
|
|
246
|
+
|
|
247
|
+
The result envelope's `supersede.sourceTicketOrigin` reports which channel was
|
|
248
|
+
used (`envelope` \| `flag` \| `none`).
|
|
249
|
+
|
|
250
|
+
Every path with no envelope is **audible** — persist cannot tell a legitimate
|
|
251
|
+
`--seed` run from a `--tickets` run whose envelope was never captured, so it
|
|
252
|
+
says so rather than deciding silently:
|
|
253
|
+
|
|
254
|
+
| Situation | Behaviour |
|
|
255
|
+
| --- | --- |
|
|
256
|
+
| Neither `--plan-dir` nor `--plan-context` | **Warn** — nothing was read; only `--source-tickets` can supply ids. |
|
|
257
|
+
| Auto-discovered `<plan-dir>/plan-context.json` absent | **Warn** — degrade to `--source-tickets`; a `--seed` run legitimately has none. |
|
|
258
|
+
| Explicit `--plan-context` missing | **Fatal** — the operator named a file and meant it. |
|
|
259
|
+
| Envelope present but unparseable | **Fatal** — a corrupt envelope is not "no source tickets"; treating it as such is how a `--tickets` run used to report success having superseded nothing. |
|
|
260
|
+
|
|
261
|
+
Whichever channel supplies them, the supersede-map partition above still
|
|
262
|
+
fail-closes: a `--tickets` run whose Stories forgot `supersedes[]` is now
|
|
263
|
+
**caught** (`source ticket #N is not claimed by any Story`) instead of
|
|
264
|
+
partitioning an empty set and passing vacuously.
|
|
265
|
+
|
|
266
|
+
### Closing superseded source tickets
|
|
267
|
+
|
|
268
|
+
**Default on.** After the Stories exist, persist comments on each source
|
|
269
|
+
issue naming the specific Story that claims it — plus that Story's optional
|
|
270
|
+
per-supersede `note` — and closes it with reason **`not_planned`**
|
|
271
|
+
(`state_reason`). Nothing has shipped at persist time and the issue will not
|
|
272
|
+
be actioned in its own right, so `not_planned` is the honest reason;
|
|
273
|
+
`completed` would be a lie. This is what keeps the tracker from asserting
|
|
274
|
+
that already-planned work is still unowned, and it writes down the supersede
|
|
275
|
+
link that makes the history readable.
|
|
276
|
+
|
|
277
|
+
| Behaviour | Contract |
|
|
278
|
+
| --- | --- |
|
|
279
|
+
| Default | Comment + close every source ticket as `not_planned`. |
|
|
280
|
+
| `--no-close-superseded` | Skips all commenting and closing. Story creation is unchanged. Use it for a genuinely partial supersede — when the plan folded in only *part* of an issue and the remainder must stay open. |
|
|
281
|
+
| `--dry-run` | Posts no comment and closes nothing; reports what it would have done. |
|
|
282
|
+
| Re-run | Idempotent — the comment is keyed off a `superseded-by` structured-comment marker, and an already-closed source is skipped. |
|
|
283
|
+
| Already closed / deleted / inaccessible | Skipped and reported. Never throws. |
|
|
284
|
+
| Close-phase failure | **Never fails the run.** Stories stay created; the result envelope's `supersede` report names which tickets were and were not closed so the operator can finish by hand. |
|
|
285
|
+
|
|
286
|
+
`--seed` / `--seed-file` modes have no source tickets, so no close phase
|
|
287
|
+
runs at all.
|
|
153
288
|
|
|
154
289
|
## Constraints
|
|
155
290
|
|
|
156
|
-
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
-
|
|
160
|
-
|
|
161
|
-
- Checkout hygiene (branch sweep) and day-0 doc readiness are owned by
|
|
162
|
-
[`/git-cleanup`](git-cleanup.md) and `mandrel doctor` respectively —
|
|
163
|
-
`/plan` runs no boot sweep and no first-run preflight.
|
|
291
|
+
- `/plan` never starts delivery.
|
|
292
|
+
- No Epic ticket is opened. No reconciler. No `delivery::single` marker.
|
|
293
|
+
- Duplicate search targets open Stories (`type::story`), not Epics.
|
|
294
|
+
- Deterministic gates (ticket validator, split policy, reachability, budget)
|
|
295
|
+
still fail closed under `--yes`.
|
|
164
296
|
|
|
165
297
|
## See also
|
|
166
298
|
|
|
167
|
-
- [`/deliver`](deliver.md) —
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
- [`
|
|
171
|
-
|
|
299
|
+
- [`/deliver`](deliver.md) — delivery entry point (`/deliver <storyId>`).
|
|
300
|
+
- [`/audit-to-stories`](audit-to-stories.md) — audit findings → plan seed →
|
|
301
|
+
`/plan --seed-file`.
|
|
302
|
+
- [`core/scope-triage`](../skills/core/scope-triage/SKILL.md) — optional
|
|
303
|
+
split-advisory notes only (no routing verdict).
|
|
@@ -21,7 +21,7 @@ high-quality, triage-ready ledger. The session has four movements:
|
|
|
21
21
|
a final review of the **entire** ledger and asks any last clarifying
|
|
22
22
|
questions.
|
|
23
23
|
4. **Triage & Plan** (Phase 4) — only then does the agent route the full ledger
|
|
24
|
-
into [`/plan`](plan.md) to generate
|
|
24
|
+
into [`/plan`](plan.md) to generate Stories.
|
|
25
25
|
|
|
26
26
|
Unlike [`/qa-explore`](qa-explore.md) (where the *agent* drives open-ended
|
|
27
27
|
exploration of a named surface), `/qa-assist` is **human-led**: the human owns
|
|
@@ -45,16 +45,14 @@ never reimplements those decisions in prose.**
|
|
|
45
45
|
> triage-ready finding without breaking stride — then, when the testing pass is
|
|
46
46
|
> done, turned into a plan in one batch.
|
|
47
47
|
>
|
|
48
|
-
> **
|
|
48
|
+
> **Skills**: `core/qa-coverage-mapping`
|
|
49
49
|
|
|
50
|
-
##
|
|
50
|
+
## Role framing
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
you **never invent the signal**. The human owns what was observed; you enrich
|
|
57
|
-
it. Re-read that persona file as your first action.
|
|
52
|
+
You are the quality gatekeeper for this run: value coverage, hermetic
|
|
53
|
+
environments, and deterministic results. **Never invent the signal** — the
|
|
54
|
+
human owns what was observed; you enrich it. Apply the QA skills; there is
|
|
55
|
+
no separate persona pack.
|
|
58
56
|
|
|
59
57
|
## Slash Command
|
|
60
58
|
|
|
@@ -69,7 +67,7 @@ it. Re-read that persona file as your first action.
|
|
|
69
67
|
| `observation` | no | `"sync-commands wipes .claude on a reused name"` | An optional first observation, or a brain dump of several. **Usually omitted** — the normal launch is a bare `/qa-assist`, which does Setup and then waits. If supplied, run Setup first, then feed it in as the first intake (splitting it if it carries multiple observations). |
|
|
70
68
|
|
|
71
69
|
A bare `/qa-assist` is the expected entry point. **Do not** demand an
|
|
72
|
-
observation up front and **do not** synthesize one — the
|
|
70
|
+
observation up front and **do not** synthesize one — the QA Golden
|
|
73
71
|
Rule forbids inventing the signal. Set up, announce ready, and wait.
|
|
74
72
|
|
|
75
73
|
## Project contract
|
|
@@ -140,7 +138,7 @@ ledger is hard-gated.**
|
|
|
140
138
|
|
|
141
139
|
Goal: become the operator's QA assistant before any observation arrives.
|
|
142
140
|
|
|
143
|
-
1. Re-read the `qa-
|
|
141
|
+
1. Re-read the QA role framing and `core/qa-coverage-mapping` skill.
|
|
144
142
|
2. **Load codebase context.** Read the files in `project.docsContextFiles`
|
|
145
143
|
(architecture, decisions, patterns) and, when the testing touches UI/routing,
|
|
146
144
|
`docs/style-guide.md` / `docs/web-routes.md`. This is the context you will
|
|
@@ -226,13 +224,13 @@ every decision to the shared core helpers; never re-derive them in prose.
|
|
|
226
224
|
|
|
227
225
|
3. **Hydrate the QA context** to locate code precisely, via
|
|
228
226
|
[`qa-context-hydrator.js`](../scripts/lib/qa/qa-context-hydrator.js) — it
|
|
229
|
-
resolves the
|
|
227
|
+
resolves the source ticket body, the
|
|
230
228
|
feature-file set, the surface
|
|
231
229
|
map, and recent git log:
|
|
232
230
|
|
|
233
231
|
```js
|
|
234
232
|
import { hydrateQaContext } from '../scripts/lib/qa/qa-context-hydrator.js';
|
|
235
|
-
const context = await hydrateQaContext({
|
|
233
|
+
const context = await hydrateQaContext({ ticketNumber, githubPort, gitPort, surfaceMap });
|
|
236
234
|
```
|
|
237
235
|
|
|
238
236
|
4. **Compute the coverage verdict** for the surface the observation points at,
|
|
@@ -321,32 +319,28 @@ its transition is **explicitly operator-gated**.
|
|
|
321
319
|
import { promoteFindings } from '../scripts/lib/findings/promote-finding.js';
|
|
322
320
|
const { promotions } = await promoteFindings(ledgerItems, {
|
|
323
321
|
searchIssues, // GitHub provider, open + closed
|
|
324
|
-
createStory, // tight cluster (≤2 surfaces):
|
|
325
|
-
|
|
322
|
+
createStory, // tight cluster (≤2 surfaces): seed → /plan --seed-file
|
|
323
|
+
createPlanSeed, // broad cluster (>2 surfaces): same /plan --seed-file path (may N>1)
|
|
326
324
|
});
|
|
327
325
|
```
|
|
328
326
|
|
|
329
327
|
- **Sizing is delegated, not decided in prose.** `promoteFindings` runs
|
|
330
328
|
`clusterLedgerItems` + `targetForCluster`: a cluster spanning **≤2**
|
|
331
329
|
distinct coverage surfaces routes to `createStory`; **>2** routes to
|
|
332
|
-
`
|
|
330
|
+
`createPlanSeed`. Neither port opens an Epic ticket — both chain
|
|
331
|
+
`/plan --seed-file`. Do not re-cluster, re-size, or re-dedup in the
|
|
332
|
+
workflow —
|
|
333
333
|
[`route-finding.js`](../scripts/lib/findings/route-finding.js) /
|
|
334
334
|
[`promote-finding.js`](../scripts/lib/findings/promote-finding.js) are the
|
|
335
335
|
single implementation.
|
|
336
|
-
- **`createStory` (`/plan --
|
|
337
|
-
|
|
338
|
-
Phase
|
|
336
|
+
- **`createStory` / `createPlanSeed` (`/plan --seed-file`)** — render a
|
|
337
|
+
**redacted** plan seed from the cluster (reuse the `/audit-to-stories`
|
|
338
|
+
Phase 5a seed shape; redaction already ran in Phase 2), **stamp the
|
|
339
339
|
cluster's `fingerprintFooter(sha)` verbatim into the seed body**, then
|
|
340
|
-
chain `/plan --
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
dedups the same finding instead of re-filing it.
|
|
345
|
-
- **`createEpic` (`/plan --idea`)** — carry the cluster's
|
|
346
|
-
`fingerprintFooter(sha)` into the `/plan --idea` seed, then chain
|
|
347
|
-
`/plan --idea <seed>`. **Known limitation (not solved here):**
|
|
348
|
-
per-child-Story fingerprint propagation through full Epic decomposition is
|
|
349
|
-
*not* guaranteed — the fingerprint is carried in the Epic seed only.
|
|
340
|
+
chain `/plan --seed-file <seed>`. Prefer one Story; split only under
|
|
341
|
+
the default-single policy. The footer must survive into the issue body
|
|
342
|
+
so a later `routeFinding` dedups the same finding instead of re-filing
|
|
343
|
+
it.
|
|
350
344
|
- **A `file` disposition never opens a raw GitHub Issue.** Every `file`
|
|
351
345
|
finding flows through `promoteFindings` → `/plan`; only `defer` (carry
|
|
352
346
|
forward as backlog) and `dismiss` (non-actionable) skip the handoff.
|
|
@@ -359,8 +353,8 @@ its transition is **explicitly operator-gated**.
|
|
|
359
353
|
|
|
360
354
|
After planning, summarize: the findings recorded, the route/promotion decisions
|
|
361
355
|
(`new`/`update-existing`/`duplicate`/`regression-of-closed`), whether each
|
|
362
|
-
cluster became a Story
|
|
363
|
-
|
|
356
|
+
cluster became a Story via `/plan --seed-file`, and any `defer` backlog a
|
|
357
|
+
resumed session will pick up.
|
|
364
358
|
|
|
365
359
|
---
|
|
366
360
|
|
|
@@ -404,7 +398,7 @@ cluster became a Story (`/plan --from-notes`) or Epic (`/plan --idea`), and any
|
|
|
404
398
|
are deterministic — never re-derive them in prose.
|
|
405
399
|
- **Promote through `/plan`, never a raw Issue.** A `file`-dispositioned
|
|
406
400
|
finding is promoted via `promoteFindings`, which chains into
|
|
407
|
-
[`/plan`](plan.md) (`--
|
|
401
|
+
[`/plan`](plan.md) (`--seed-file` for a tight cluster, `--seed` for a broad
|
|
408
402
|
one) — mirroring [`/audit-to-stories`](audit-to-stories.md). `/qa-assist`
|
|
409
403
|
never opens a bare GitHub Issue for a `file` finding. The cluster's
|
|
410
404
|
`fingerprintFooter(sha)` is stamped verbatim into the seed so a future
|
|
@@ -413,7 +407,7 @@ cluster became a Story (`/plan --from-notes`) or Epic (`/plan --idea`), and any
|
|
|
413
407
|
## See also
|
|
414
408
|
|
|
415
409
|
- [`/plan`](plan.md) — the planning pipeline `/qa-assist` chains into in
|
|
416
|
-
Phase 4 (`--
|
|
410
|
+
Phase 4 (`--seed-file` / `--seed`). The plan→deliver
|
|
417
411
|
hard stop is preserved across the handoff.
|
|
418
412
|
- [`/qa-explore`](qa-explore.md) — the agent-led sibling that drives a named
|
|
419
413
|
surface and triages through the same `/plan` handoff.
|