mandrel 2.0.0 → 2.2.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 +59 -28
- package/.agents/agents/acceptance-critic.md +20 -9
- package/.agents/agents/story-worker.md +45 -48
- package/.agents/audit-checklists/performance.md +1 -1
- package/.agents/docs/SDLC.md +60 -46
- package/.agents/docs/agentrc-reference.json +8 -13
- package/.agents/docs/configuration.md +33 -57
- package/.agents/docs/execution-reference.md +39 -10
- package/.agents/docs/quality-gates.md +17 -19
- package/.agents/docs/workflows.md +6 -6
- package/.agents/instructions.md +64 -79
- package/.agents/rules/ci-remediation.md +3 -3
- package/.agents/rules/gherkin-standards.md +10 -0
- package/.agents/rules/git-conventions-reference.md +42 -51
- package/.agents/schemas/acceptance-eval-verdict.schema.json +2 -2
- package/.agents/schemas/agentrc.schema.json +35 -46
- 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/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 +24 -68
- package/.agents/scripts/agents-bootstrap-github.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 +1 -1
- package/.agents/scripts/check-workflow-cli-lint.js +91 -0
- 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/audit-suite/selector.js +323 -23
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -11
- package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +28 -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 +4 -1
- package/.agents/scripts/lib/checks/index.js +1 -1
- 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 +3 -3
- 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-args.js +23 -2
- package/.agents/scripts/lib/close-validation/gates.js +13 -13
- 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/acceptance-eval.js +2 -2
- package/.agents/scripts/lib/config/delivery-routing.js +7 -6
- package/.agents/scripts/lib/config/explain.js +10 -16
- package/.agents/scripts/lib/config/github.js +7 -5
- package/.agents/scripts/lib/config/limits.js +15 -25
- package/.agents/scripts/lib/config/quality.js +11 -14
- package/.agents/scripts/lib/config/runners.js +8 -21
- package/.agents/scripts/lib/config/temp-paths.js +18 -56
- package/.agents/scripts/lib/config-settings-schema-delivery.js +34 -16
- package/.agents/scripts/lib/config-settings-schema-quality.js +9 -2
- package/.agents/scripts/lib/config-settings-schema.js +48 -22
- package/.agents/scripts/lib/dead-exports-knip.js +105 -0
- package/.agents/scripts/lib/dead-exports-mode.js +51 -0
- package/.agents/scripts/lib/duplicate-search.js +38 -7
- 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 -189
- package/.agents/scripts/lib/gh-exec.js +8 -0
- package/.agents/scripts/lib/git-branch-lifecycle.js +0 -158
- package/.agents/scripts/lib/git-utils.js +0 -14
- package/.agents/scripts/lib/json-utils.js +1 -2
- package/.agents/scripts/lib/label-constants.js +0 -15
- package/.agents/scripts/lib/label-taxonomy.js +1 -12
- package/.agents/scripts/lib/observability/active-story-env.js +42 -163
- 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 +2 -2
- package/.agents/scripts/lib/observability/tool-trace-hook.js +2 -12
- 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 +43 -45
- package/.agents/scripts/lib/orchestration/change-set.js +103 -0
- package/.agents/scripts/lib/orchestration/code-review.js +70 -191
- package/.agents/scripts/lib/orchestration/consolidation-precondition.js +3 -3
- 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/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 +9 -11
- 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/listeners/README.md +7 -3
- 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/merge-block-class.js +76 -20
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -0
- package/.agents/scripts/lib/orchestration/plan-context.js +116 -33
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +26 -36
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +31 -22
- package/.agents/scripts/lib/orchestration/plan-metrics.js +38 -6
- package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +16 -6
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +173 -25
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +116 -0
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +280 -100
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +472 -55
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +21 -16
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +509 -0
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +230 -0
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +41 -40
- package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +1 -2
- package/.agents/scripts/lib/orchestration/planning/spec-authoring-grounding.js +1 -1
- package/.agents/scripts/lib/orchestration/resolve-stories.js +344 -0
- package/.agents/scripts/lib/orchestration/retro-proposals.js +7 -7
- package/.agents/scripts/lib/orchestration/review-depth.js +105 -40
- 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/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 +374 -16
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +24 -0
- 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 +4 -13
- 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 +72 -30
- 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 +12 -8
- 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 +264 -43
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +1 -1
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +10 -10
- package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +104 -279
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +191 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +120 -0
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +360 -0
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +75 -14
- package/.agents/scripts/lib/orchestration/story-init-remote.js +12 -8
- package/.agents/scripts/lib/orchestration/story-plan-state.js +14 -29
- package/.agents/scripts/lib/orchestration/task-body-validator.js +52 -7
- package/.agents/scripts/lib/orchestration/ticket-lease.js +27 -74
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +119 -14
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +3 -4
- package/.agents/scripts/lib/orchestration/ticket-validator.js +121 -18
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +14 -47
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +19 -32
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +61 -1
- 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 -286
- package/.agents/scripts/lib/preflight-runner.js +2 -2
- 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/skills/parse-skill.js +16 -3
- package/.agents/scripts/lib/story-adjacency.js +8 -7
- package/.agents/scripts/lib/story-body/story-body.js +81 -13
- package/.agents/scripts/lib/templates/decomposer-prompts.js +15 -16
- package/.agents/scripts/lib/test-env.js +14 -1
- package/.agents/scripts/lib/test-tiers.js +0 -3
- package/.agents/scripts/lib/ticket-body-sections.js +0 -14
- package/.agents/scripts/lib/validation-evidence.js +31 -59
- package/.agents/scripts/lib/wave-runner/live-probe.js +315 -0
- package/.agents/scripts/lib/wave-runner/ready-set.js +32 -6
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +68 -19
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +1 -2
- package/.agents/scripts/plan-context.js +38 -7
- package/.agents/scripts/plan-critics.js +203 -0
- package/.agents/scripts/plan-persist.js +145 -35
- package/.agents/scripts/plan-run-epilogue.js +83 -38
- 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 +1 -11
- package/.agents/scripts/providers/github/mappers.js +5 -0
- package/.agents/scripts/providers/github/sub-issues.js +0 -47
- package/.agents/scripts/providers/github/tickets.js +33 -153
- package/.agents/scripts/providers/github.js +17 -6
- package/.agents/scripts/quality-preview.js +13 -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 +9 -10
- package/.agents/scripts/single-story-close.js +173 -18
- package/.agents/scripts/single-story-confirm-merge.js +288 -15
- package/.agents/scripts/single-story-init.js +6 -10
- package/.agents/scripts/stories-wave-tick.js +380 -53
- package/.agents/scripts/story-plan.js +3 -3
- package/.agents/scripts/update-ticket-state.js +8 -50
- 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 +3 -3
- package/.agents/skills/core/scope-triage/SKILL.md +3 -0
- 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 +2 -12
- 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/workflows/audit-architecture.md +3 -4
- package/.agents/workflows/audit-clean-code.md +4 -4
- package/.agents/workflows/audit-documentation.md +4 -5
- package/.agents/workflows/audit-lighthouse.md +8 -0
- package/.agents/workflows/audit-navigability.md +10 -0
- package/.agents/workflows/audit-performance.md +2 -3
- package/.agents/workflows/audit-quality.md +8 -9
- package/.agents/workflows/audit-security.md +1 -2
- package/.agents/workflows/audit-seo.md +10 -0
- package/.agents/workflows/audit-ux-ui.md +7 -0
- package/.agents/workflows/deliver.md +133 -45
- package/.agents/workflows/git-cleanup.md +2 -2
- package/.agents/workflows/git-deliver.md +1 -1
- package/.agents/workflows/helpers/acceptance-self-eval.md +34 -17
- package/.agents/workflows/helpers/code-quality-guardrails.md +15 -12
- package/.agents/workflows/helpers/code-review.md +14 -12
- package/.agents/workflows/helpers/deliver-story-reference.md +73 -32
- package/.agents/workflows/helpers/deliver-story.md +209 -118
- package/.agents/workflows/helpers/parallel-tooling.md +2 -2
- package/.agents/workflows/helpers/worktree-lifecycle.md +28 -32
- package/.agents/workflows/plan.md +239 -19
- package/.agents/workflows/qa-assist.md +6 -6
- package/.agents/workflows/qa-explore.md +3 -3
- package/.agents/workflows/qa-run.md +1 -5
- package/bin/mandrel.js +12 -1
- package/docs/CHANGELOG.md +62 -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 +17 -9
- 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/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +154 -0
- package/package.json +2 -2
- package/.agents/schemas/epic-perf-report.schema.json +0 -89
- 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/story.heartbeat.schema.json +0 -20
- package/.agents/schemas/risk-verdict.schema.json +0 -53
- package/.agents/schemas/story-perf-summary.schema.json +0 -73
- package/.agents/scripts/analyze-execution.js +0 -444
- package/.agents/scripts/check-prepush-recovery.js +0 -90
- 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 -187
- 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/audit-lens-routing.js +0 -128
- package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +0 -273
- package/.agents/scripts/lib/orchestration/error-journal.js +0 -139
- 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/merge-watcher.js +0 -665
- package/.agents/scripts/lib/orchestration/plan-review-routing.js +0 -63
- package/.agents/scripts/lib/orchestration/planning/risk-verdict.js +0 -104
- 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 -21
- 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 -397
- package/.agents/scripts/lib/orchestration/preflight-cache.js +0 -187
- package/.agents/scripts/lib/orchestration/resolve-plan-run.js +0 -155
- package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +0 -275
- package/.agents/scripts/lib/orchestration/story-progress/story-run-progress-writer.js +0 -400
- package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +0 -36
- package/.agents/scripts/resolve-plan-run.js +0 -117
- package/.agents/skills/core/analyze-execution/SKILL.md +0 -101
package/.agents/README.md
CHANGED
|
@@ -96,17 +96,17 @@ The bootstrap pipeline, in order:
|
|
|
96
96
|
3. **Project-side mutations.** Seeds `.agentrc.json` from
|
|
97
97
|
[`starter-agentrc.json`](starter-agentrc.json), merges the framework's
|
|
98
98
|
runtime dependencies into `package.json`, runs the install, wires the
|
|
99
|
-
|
|
100
|
-
`.claude/commands/` tree
|
|
101
|
-
|
|
102
|
-
|
|
99
|
+
system prompt (see below), gitignores derived artefacts, and runs the
|
|
100
|
+
quality-gates installer. The flat `.claude/commands/` tree is generated
|
|
101
|
+
at install time (via `prepare`) and on every `mandrel sync`/`update` —
|
|
102
|
+
see [`mandrel sync-commands`](#mandrel-sync-commands) below.
|
|
103
103
|
4. **GitHub-side mutations.** Creates the label taxonomy, branch protection,
|
|
104
104
|
and merge-method settings. Skipped with `--skip-github`. Two additional
|
|
105
105
|
mutations are **opt-in** (prompted y/N, defaulting No, or passed as flags):
|
|
106
106
|
- `--with-project-board` — provision the Projects V2 Status field and
|
|
107
107
|
custom fields on an existing board.
|
|
108
|
-
- `--with-issue-forms` — generate `.github/ISSUE_TEMPLATE/story.yml`
|
|
109
|
-
|
|
108
|
+
- `--with-issue-forms` — generate `.github/ISSUE_TEMPLATE/story.yml`
|
|
109
|
+
from the ticket-body schema.
|
|
110
110
|
|
|
111
111
|
The bootstrap is idempotent — safe to re-run; an already-configured
|
|
112
112
|
clone produces zero file mutations.
|
|
@@ -154,6 +154,7 @@ Run `mandrel --help` for a subcommand list. Each subcommand supports
|
|
|
154
154
|
| `init` | Install + configure mandrel in the current project (cold-start). | `--assume-yes`, `--skip-github`, `--dry-run` |
|
|
155
155
|
| `sync` | Re-materialize `.agents/` from the installed package payload. | `--dry-run` |
|
|
156
156
|
| `sync-commands` | Regenerate `.claude/commands/` from `.agents/workflows/`. | — |
|
|
157
|
+
| `sync-agents` | Regenerate `.claude/agents/` from `.agents/agents/`. | — |
|
|
157
158
|
| `doctor` | Run readiness checks and print per-check remedies. | — |
|
|
158
159
|
| `update` | Upgrade mandrel to the newest published version. | `--dry-run`, `--install-cmd` |
|
|
159
160
|
| `migrate` | Apply version-keyed migrations for a version range. | `--from`, `--to`, `--dry-run` |
|
|
@@ -175,13 +176,27 @@ mandrel explain --json # same report as JSON
|
|
|
175
176
|
### `mandrel sync-commands`
|
|
176
177
|
|
|
177
178
|
Regenerates the flat `.claude/commands/` projection from `.agents/workflows/`.
|
|
178
|
-
|
|
179
|
-
|
|
179
|
+
Runs automatically at install time (via the `prepare` script) and as part of
|
|
180
|
+
`mandrel sync` / `mandrel update`; doctor's `commands-in-sync` check flags a
|
|
181
|
+
hand-edited or stale tree. Refuses to project when the materialized `.agents/`
|
|
182
|
+
tree doesn't match the running CLI's own version — run `mandrel sync` first.
|
|
180
183
|
|
|
181
184
|
```bash
|
|
182
185
|
mandrel sync-commands # rebuild .claude/commands/
|
|
183
186
|
```
|
|
184
187
|
|
|
188
|
+
### `mandrel sync-agents`
|
|
189
|
+
|
|
190
|
+
Regenerates the flat `.claude/agents/` projection from `.agents/agents/` —
|
|
191
|
+
the role-scoped boot contexts (`story-worker`, `acceptance-critic`) that
|
|
192
|
+
`delivery.routing.roleScopedAgents` (default `true`) dispatches spawns
|
|
193
|
+
against. Same delegation shape, wiring, and version-match refusal as
|
|
194
|
+
`sync-commands` above.
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
mandrel sync-agents # rebuild .claude/agents/
|
|
198
|
+
```
|
|
199
|
+
|
|
185
200
|
### `mandrel uninstall`
|
|
186
201
|
|
|
187
202
|
Reverses a recorded install using the install ledger
|
|
@@ -247,6 +262,13 @@ read-when-relevant pattern skills use).
|
|
|
247
262
|
[`rules/test-seams.md`](rules/test-seams.md)) — when the task is in that
|
|
248
263
|
domain.
|
|
249
264
|
- Every `SKILL.md` under [`skills/`](skills/) — when the task hits its trigger.
|
|
265
|
+
A `SKILL.md` is itself split the same way: it leads with its **Policy
|
|
266
|
+
Capsule** (the contract, and the whole cost of activating the skill) plus
|
|
267
|
+
pointers into an on-demand `reference.md` sibling carrying the long-form
|
|
268
|
+
material. Activating a skill costs the capsule, not the essay — open a
|
|
269
|
+
`reference.md` section only when the task engages it. Routing does not
|
|
270
|
+
depend on the long-form being inline: skill descriptions live in the
|
|
271
|
+
generated [`skills/skills.index.json`](skills/skills.index.json).
|
|
250
272
|
- [`docs/execution-reference.md`](docs/execution-reference.md) — log-level and
|
|
251
273
|
token-budget reference detail lifted out of `instructions.md`.
|
|
252
274
|
|
|
@@ -280,10 +302,10 @@ For non-interactive (CI) installs, pass `--owner`, `--repo`, and
|
|
|
280
302
|
`--assume-yes`; pass `--skip-github` to defer the remote half.
|
|
281
303
|
|
|
282
304
|
After bootstrap, every Mandrel command is generated into a flat
|
|
283
|
-
`.claude/commands/` tree by `npm run sync:commands` (
|
|
284
|
-
|
|
285
|
-
`/plan`, `/deliver`, `/audit-security`. The commands load
|
|
286
|
-
environment. The [SDLC guide](docs/SDLC.md) walks end-to-end planning and
|
|
305
|
+
`.claude/commands/` tree by `npm run sync:commands` (kept current at install
|
|
306
|
+
time and on every `mandrel sync`/`update`) and loads as a bare `/<command>`
|
|
307
|
+
slash command — e.g. `/plan`, `/deliver`, `/audit-security`. The commands load
|
|
308
|
+
in every Claude Code environment. The [SDLC guide](docs/SDLC.md) walks end-to-end planning and
|
|
287
309
|
delivery; Stories pair [`/plan`](workflows/plan.md) (idea → drafted Story Issue)
|
|
288
310
|
with [`/deliver`](workflows/deliver.md) (Story Issue → merged
|
|
289
311
|
PR).
|
|
@@ -408,9 +430,9 @@ rule:
|
|
|
408
430
|
> GitHub I/O, label transitions, JSON validators, NDJSON readers,
|
|
409
431
|
> diff-vs-baseline gates, template renderers.
|
|
410
432
|
>
|
|
411
|
-
> **Prompt + judgment → make it a Skill.** Examples: composing a
|
|
412
|
-
> Spec from
|
|
413
|
-
> command, decomposing a
|
|
433
|
+
> **Prompt + judgment → make it a Skill.** Examples: composing a Story's
|
|
434
|
+
> `## Spec` from planning context, classifying friction signals from a
|
|
435
|
+
> failed shell command, decomposing a Spec into Stories.
|
|
414
436
|
|
|
415
437
|
The rule is two-sided on purpose. "Has an LLM step adjacent" is *not*
|
|
416
438
|
the signal — many deterministic scripts emit a JSON envelope that a host
|
|
@@ -424,17 +446,18 @@ The collapsed plan pipeline (`plan-context.js` → author → `plan-persist.js`,
|
|
|
424
446
|
Epic #4474) is a **split**: the deterministic halves stay as scripts, the
|
|
425
447
|
judgment middle moves to a Skill.
|
|
426
448
|
|
|
427
|
-
- **`--emit-context`** (script half) — fetches the
|
|
428
|
-
|
|
429
|
-
|
|
449
|
+
- **`--emit-context`** (script half) — fetches the seed/source tickets
|
|
450
|
+
and scrapes project docs, emits a JSON envelope. Parseable in,
|
|
451
|
+
parseable out. Stays a script.
|
|
430
452
|
- **Authoring middle** (Skill half) — given the envelope, author the
|
|
431
|
-
|
|
453
|
+
Story JSON. Pure prompt + judgment. Migrates to a Skill
|
|
432
454
|
under `.agents/skills/core/` so it ships with declarative
|
|
433
455
|
`allowed_tools` and a smoke test rather than bespoke prompt-template
|
|
434
456
|
plumbing inside a Node module.
|
|
435
457
|
- **Persist half** (script half) — given the author-provided tickets
|
|
436
|
-
JSON, validate against the schema, create
|
|
437
|
-
label
|
|
458
|
+
JSON, validate against the schema, create the `type::story` issue(s)
|
|
459
|
+
and label them `agent::ready`. Deterministic GitHub I/O + schema
|
|
460
|
+
validation. Stays a script.
|
|
438
461
|
|
|
439
462
|
The split codifies the "host LLM authors directly" pattern explicitly:
|
|
440
463
|
the prompt+judgment step gets a `description`, an
|
|
@@ -524,8 +547,8 @@ comment) is the cross-runtime contract.
|
|
|
524
547
|
The SDK barrel is `scripts/lib/orchestration/index.js`; its exports are
|
|
525
548
|
the source of truth for the public in-process surface. Key families
|
|
526
549
|
include dispatch (`dispatch-engine.js`, `manifest-builder.js`), context
|
|
527
|
-
hydration, planning state, label transitions,
|
|
528
|
-
|
|
550
|
+
hydration, planning state, label transitions, Story-close internals,
|
|
551
|
+
retro proposals, and structured error capture.
|
|
529
552
|
|
|
530
553
|
### GitHub authentication
|
|
531
554
|
|
|
@@ -578,7 +601,7 @@ environment inside the check. A finding includes `id`, `severity`,
|
|
|
578
601
|
`autoCorrectable`.
|
|
579
602
|
|
|
580
603
|
`autoCorrect: 'auto'` means the fix is local, bounded, and reversible.
|
|
581
|
-
Auto-fixes must not push to remotes, commit to `
|
|
604
|
+
Auto-fixes must not push to remotes, commit to `main`, amend
|
|
582
605
|
history, recursively delete outside `.worktrees/<id>/`, write GitHub
|
|
583
606
|
state, or read secret values. Anything requiring those operations must be
|
|
584
607
|
`refuse-and-print` with a human-run `fixCommand`.
|
|
@@ -828,7 +851,7 @@ Two operators can drive the same repository at once — for example, two
|
|
|
828
851
|
runs from clobbering one another with **two distinct coordination layers**.
|
|
829
852
|
They solve different problems and must not be confused:
|
|
830
853
|
|
|
831
|
-
- **Filesystem locks** (`
|
|
854
|
+
- **Filesystem locks** (`sweep-lock`) serialise work
|
|
832
855
|
**within a single machine/clone**. They are keyed on local process PIDs
|
|
833
856
|
and live under `.git/` (or a local lockfile path), so they do **not**
|
|
834
857
|
coordinate across clones. See
|
|
@@ -844,8 +867,16 @@ The lease primitive lives in
|
|
|
844
867
|
[`scripts/lib/orchestration/ticket-lease.js`](scripts/lib/orchestration/ticket-lease.js).
|
|
845
868
|
Rather than inventing a new state column, the lease rides the ticket's
|
|
846
869
|
existing **assignees** field: the single assignee *is* the lease owner.
|
|
847
|
-
Liveness is decided by the owner's
|
|
848
|
-
|
|
870
|
+
Liveness is decided by the owner's last-heartbeat timestamp compared against
|
|
871
|
+
a configurable TTL (`delivery.lease.ttlMs`).
|
|
872
|
+
|
|
873
|
+
> **In practice the lease always fails closed.** There is no live heartbeat
|
|
874
|
+
> source — the `story.heartbeat` emitter was structurally inert and has been
|
|
875
|
+
> deleted (A22) — so every guard anchors the owner's heartbeat to *now*,
|
|
876
|
+
> making **any** foreign claim read as live. The **stale-claim reclaim** row
|
|
877
|
+
> below is therefore unreachable in normal operation: a stranded claim is
|
|
878
|
+
> cleared with `--steal`, never by TTL expiry. The TTL and the reclaim branch
|
|
879
|
+
> remain as a seam for a caller that supplies its own `heartbeatAt`.
|
|
849
880
|
|
|
850
881
|
The model has five behaviours, all expressed through `acquireLease` /
|
|
851
882
|
`releaseLease`:
|
|
@@ -855,7 +886,7 @@ The model has five behaviours, all expressed through `acquireLease` /
|
|
|
855
886
|
| **Acquire by self-assign** | The ticket is unassigned. | The operator is written to `assignees`; the run proceeds (`reason: 'unclaimed'`). |
|
|
856
887
|
| **Re-affirm a self-held claim** | The operator already holds the lease. | No write; the run proceeds (`reason: 'already-held'`). |
|
|
857
888
|
| **Refuse-if-foreign** | A *different* operator holds the lease and their heartbeat is within the TTL (the claim is **live**). | The acquire **fails closed** — the run refuses to start and names the current owner so you know who to coordinate with (`reason: 'held'`). |
|
|
858
|
-
| **Stale-claim reclaim** | A foreign claim exists but
|
|
889
|
+
| **Stale-claim reclaim** *(unreachable — see above)* | A foreign claim exists but the caller supplied a `heartbeatAt` older than the TTL. | The lease is reassigned to the operator (`reason: 'reclaimed'`). No shipped caller supplies one, so this never fires today. |
|
|
859
890
|
| **`--steal` override** | A foreign claim is *live* and the operator passes `--steal`. | The live claim is forcibly transferred (`reason: 'stolen'`). This is the **only** way past a live foreign claim. |
|
|
860
891
|
|
|
861
892
|
On a clean completion the holder **releases** the lease (clears the
|
|
@@ -4,8 +4,9 @@ description: >-
|
|
|
4
4
|
Role-scoped boot context for a maker-blind acceptance critic. Booted on its
|
|
5
5
|
own system prompt (no CLAUDE.md / instructions.md closure). Scores a delivered
|
|
6
6
|
diff against the Story's acceptance-criteria cluster and emits the verdict
|
|
7
|
-
schema — without seeing the maker's self-assessment.
|
|
8
|
-
|
|
7
|
+
schema — without seeing the maker's self-assessment. Live under M7-B —
|
|
8
|
+
helpers/deliver-story Step 1a dispatches subagent_type: acceptance-critic
|
|
9
|
+
on the default risk-routed path.
|
|
9
10
|
---
|
|
10
11
|
|
|
11
12
|
# acceptance-critic — maker-blind acceptance evaluation
|
|
@@ -33,9 +34,20 @@ verdicts, their commit-message justifications-as-proof, or any prior verdict
|
|
|
33
34
|
file they authored. You grade the **work product**, not the homework the maker
|
|
34
35
|
turned in about it. Your only trusted inputs are:
|
|
35
36
|
|
|
36
|
-
- the
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
- the **change set** your caller hands you: the list of files this Story
|
|
38
|
+
touched, computed **once** per delivery by the shared `computeChangeSet`
|
|
39
|
+
enumerator (`.agents/scripts/lib/orchestration/change-set.js`) and threaded
|
|
40
|
+
into your spawn context. Read those files and inspect their changes to see
|
|
41
|
+
the work product. Do **not** re-derive the set yourself — re-enumerating it
|
|
42
|
+
can pick up commits that landed after your caller routed the ceremony, and
|
|
43
|
+
then you would be scoring a different change than the one you were dispatched
|
|
44
|
+
for (Story #4593). If no change set reached you, say so in your verdict
|
|
45
|
+
rather than substituting your own enumeration.
|
|
46
|
+
- the Story's inline `acceptance[]` and `verify[]` arrays, read from the
|
|
47
|
+
**Story body itself** (`gh issue view <storyId> --json body`) — its `##
|
|
48
|
+
Acceptance` / `## Verify` sections are the SSOT. The `story-init` structured
|
|
49
|
+
comment does not carry them: it reports init state (`workCwd`,
|
|
50
|
+
`dependenciesInstalled`, `remoteVerified`, …) and nothing else.
|
|
39
51
|
- the **actual output** of the `verify[]` commands you run yourself.
|
|
40
52
|
|
|
41
53
|
Treat the implementation reasoning as untrusted. Score each criterion afresh
|
|
@@ -54,7 +66,8 @@ given.
|
|
|
54
66
|
|
|
55
67
|
For each acceptance item in your cluster:
|
|
56
68
|
|
|
57
|
-
1. **Inspect the
|
|
69
|
+
1. **Inspect the change set** — read the files your caller named and look for
|
|
70
|
+
the change that would satisfy the criterion.
|
|
58
71
|
2. **Run the relevant `verify[]` commands** and consume their output as
|
|
59
72
|
**required evidence**. A criterion cannot be scored `met` without the
|
|
60
73
|
supporting `verify[]` evidence where a `verify[]` command is relevant to it.
|
|
@@ -66,12 +79,10 @@ For each acceptance item in your cluster:
|
|
|
66
79
|
a passing run records an evidence entry in the keyspace close consults:
|
|
67
80
|
|
|
68
81
|
```bash
|
|
69
|
-
# Epic-attached Story:
|
|
70
82
|
node <main-repo>/.agents/scripts/evidence-gate.js \
|
|
71
|
-
--
|
|
83
|
+
--standalone --scope-id <storyId> --gate lint \
|
|
72
84
|
--worktree <worktree> -- npm run lint
|
|
73
85
|
|
|
74
|
-
# Standalone Story (no parent Epic): use --standalone, omit --epic-id.
|
|
75
86
|
node <main-repo>/.agents/scripts/evidence-gate.js \
|
|
76
87
|
--standalone --scope-id <storyId> --gate typecheck \
|
|
77
88
|
--worktree <worktree> -- <resolved typecheck command>
|
|
@@ -3,8 +3,8 @@ name: story-worker
|
|
|
3
3
|
description: >-
|
|
4
4
|
Role-scoped boot context for a single Story delivery child, booted on its own
|
|
5
5
|
system prompt (no CLAUDE.md / instructions.md closure). Carries the
|
|
6
|
-
load-bearing delivery MUSTs standalone.
|
|
7
|
-
|
|
6
|
+
load-bearing delivery MUSTs standalone. Dispatched by helpers/deliver-story
|
|
7
|
+
when delivery.routing.roleScopedAgents is enabled (the default).
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# story-worker — Story delivery boot context
|
|
@@ -44,10 +44,10 @@ You run as a sub-agent with **no input channel** mid-run.
|
|
|
44
44
|
the **main checkout** (the worktree does not exist yet). Invoke it
|
|
45
45
|
**synchronously** with the Bash maximum timeout — a per-worktree install can
|
|
46
46
|
take several minutes; do not background it.
|
|
47
|
-
2. Capture `workCwd
|
|
48
|
-
|
|
49
|
-
**absolute** `workCwd` before doing any implementation
|
|
50
|
-
checkout's HEAD is never moved by you.
|
|
47
|
+
2. Capture `workCwd` and `dependenciesInstalled` from the init envelope (it
|
|
48
|
+
is flat — there is no `context` block). When worktree isolation is on, `cd`
|
|
49
|
+
into the printed **absolute** `workCwd` before doing any implementation
|
|
50
|
+
work. The main checkout's HEAD is never moved by you.
|
|
51
51
|
3. Every subsequent command runs against that worktree path. Because cwd may
|
|
52
52
|
reset between calls, prefer absolute paths anchored at `workCwd`.
|
|
53
53
|
|
|
@@ -60,8 +60,7 @@ git -C "<workCwd>" branch --show-current # MUST print story-<storyId>
|
|
|
60
60
|
```
|
|
61
61
|
|
|
62
62
|
If it does **not** report `story-<storyId>`, **STOP** — do not commit. Never
|
|
63
|
-
commit Story work to `main
|
|
64
|
-
worktree/branch. Re-run `single-story-init.js` (it is idempotent on partial state) to
|
|
63
|
+
commit Story work to `main` or outside the worktree/branch. Re-run `single-story-init.js` (it is idempotent on partial state) to
|
|
65
64
|
restore the branch before proceeding.
|
|
66
65
|
|
|
67
66
|
## Commit discipline
|
|
@@ -79,7 +78,7 @@ Author commits directly on `story-<storyId>` following the always-on git core
|
|
|
79
78
|
## Docs context — digest first
|
|
80
79
|
|
|
81
80
|
Do **not** re-read every file in `project.docsContextFiles`. Your caller passes
|
|
82
|
-
a `docsDigestPath` (the per-
|
|
81
|
+
a `docsDigestPath` (the per-run docs digest — a compact per-file outline:
|
|
83
82
|
path, size, heading outline with line numbers, first paragraph under each
|
|
84
83
|
`##`). Read that digest, decide which docs bear on this Story, then **pull the
|
|
85
84
|
full file on demand** (jump to the section at the line number the digest names)
|
|
@@ -89,9 +88,9 @@ mandate — read a full doc only if the Story's own context points you at one.
|
|
|
89
88
|
|
|
90
89
|
## Close gates — do not pre-run
|
|
91
90
|
|
|
92
|
-
`story-close.js` runs the canonical close-validation chain (**typecheck,
|
|
93
|
-
test, format, maintainability, coverage, crap**) before it merges. Do
|
|
94
|
-
pre-run those gates as a matter of course — running `npm run typecheck &&
|
|
91
|
+
`single-story-close.js` runs the canonical close-validation chain (**typecheck,
|
|
92
|
+
lint, test, format, maintainability, coverage, crap**) before it merges. Do
|
|
93
|
+
**not** pre-run those gates as a matter of course — running `npm run typecheck &&
|
|
95
94
|
npm run lint && npm test` as advisory pre-flight while iterating on a fix is
|
|
96
95
|
fine, but the close pipeline is the authoritative gate. The bounded acceptance
|
|
97
96
|
self-eval loop (below) may share `lint` / `typecheck` evidence with close via
|
|
@@ -102,29 +101,26 @@ self-eval loop (below) may share `lint` / `typecheck` evidence with close via
|
|
|
102
101
|
After the implementation commits land and **before** flipping to `closing`, run
|
|
103
102
|
the bounded acceptance self-eval loop (see
|
|
104
103
|
[`acceptance-self-eval.md`](../workflows/helpers/acceptance-self-eval.md)). It
|
|
105
|
-
scores the
|
|
106
|
-
|
|
104
|
+
scores the change set you computed once and injected into the critic — never
|
|
105
|
+
one the critic re-derives (Story #4593) — against **each** `acceptance[]` item,
|
|
106
|
+
and consumes the `verify[]` command output as **required evidence**. The gate
|
|
107
|
+
returns one of:
|
|
107
108
|
|
|
108
109
|
- **`proceed`** (every criterion met) → flip to `closing` and close.
|
|
109
110
|
- **`redraft`** (rounds remaining) → fix the flagged criteria, commit, re-eval.
|
|
110
111
|
- **`block`** (round cap reached, criteria still unmet) → take the blocked path.
|
|
111
112
|
Never silently proceed to close.
|
|
112
113
|
|
|
113
|
-
## Lifecycle:
|
|
114
|
-
|
|
115
|
-
- **
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
`post
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
transition the Story to `agent::blocked`, post a `friction` comment naming
|
|
124
|
-
the decision needed (or the unmet criteria and their evidence), and **exit
|
|
125
|
-
non-zero**. **Never fall silent** — a child with no heartbeat, no commit, and
|
|
126
|
-
no `agent::blocked` label is exactly the dead-child failure the watchdog is
|
|
127
|
-
built to catch.
|
|
114
|
+
## Lifecycle: progress & blocked (MUST)
|
|
115
|
+
|
|
116
|
+
- **Progress.** Relay one terse line per phase transition (e.g.
|
|
117
|
+
`Story #<id>: implementing → closing`), not a full body. Your commits on
|
|
118
|
+
`story-<id>` and these lines are the progress surface.
|
|
119
|
+
- **Blocked.** If you genuinely cannot proceed, transition the Story to
|
|
120
|
+
`agent::blocked`, post a `friction` comment naming the decision needed (or
|
|
121
|
+
the unmet criteria and their evidence), and **exit non-zero**.
|
|
122
|
+
**Never fall silent** — a child that stalls without an `agent::blocked`
|
|
123
|
+
label and no commit is indistinguishable from a dead one.
|
|
128
124
|
- **Anti-thrashing.** If you hit the same error class twice with the same fix,
|
|
129
125
|
or drift through reads without narrowing the problem, STOP: summarize what
|
|
130
126
|
recurred and either re-plan or take the blocked path. Do not paper over a
|
|
@@ -136,26 +132,27 @@ The Story's init envelope carries `remoteVerified` + `remoteProbe`. When
|
|
|
136
132
|
`remoteVerified` is `false`, transition the Story to `agent::blocked` quoting
|
|
137
133
|
`remoteProbe.detail` and stop. Implementing the Story inline outside the
|
|
138
134
|
worktree / branch / PR path — or committing it to local `main` — is expressly
|
|
139
|
-
**forbidden**. The close pipeline's push (`story-close.js`) is the only
|
|
135
|
+
**forbidden**. The close pipeline's push (`single-story-close.js`) is the only
|
|
140
136
|
sanctioned way the work lands.
|
|
141
137
|
|
|
142
138
|
## Return schema
|
|
143
139
|
|
|
144
|
-
Your
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
140
|
+
Your return contract is
|
|
141
|
+
[`story-deliver-terminal.schema.json`](../schemas/story-deliver-terminal.schema.json)
|
|
142
|
+
— the SSOT for every field (Story #4543). Fields are deliberately not
|
|
143
|
+
restated here; that duplication is what drifted.
|
|
144
|
+
|
|
145
|
+
`single-story-close.js` emits a validated envelope between its
|
|
146
|
+
`--- STORY DELIVER TERMINAL ---` markers. **Relay it**; never hand-compose
|
|
147
|
+
one. Its `status` is one of four; your exit code mirrors it:
|
|
148
|
+
|
|
149
|
+
- `landed` → 0. Merged, `agent::done`, tail attempted (a `false` in `tail.*`
|
|
150
|
+
degrades the report, not the land).
|
|
151
|
+
- `pending` → 3. **Resumable, not a failure** — the bounded merge wait
|
|
152
|
+
expired with the PR healthy, or a human owns the merge. Nothing was
|
|
153
|
+
mutated; `nextCommand` resumes it. The only sanctioned no-merge ending.
|
|
154
|
+
- `blocked` / `failed` → exit non-zero. Take the blocked path above.
|
|
155
|
+
|
|
156
|
+
Stranded? Probe, don't guess:
|
|
157
|
+
`node .agents/scripts/deliver-recover.js --story <id>` (read-only, prints
|
|
158
|
+
one next command).
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
# Performance & Bottleneck Audit — authoring checklist
|
|
8
8
|
|
|
9
|
-
> Audit hot paths, algorithmic complexity, and I/O bottlenecks in the tooling surface (`
|
|
9
|
+
> Audit hot paths, algorithmic complexity, and I/O bottlenecks in the tooling surface (`single-story-close`, dispatcher, gates); propose remediations.
|
|
10
10
|
|
|
11
11
|
Self-check your change against this lens's concerns before you ship:
|
|
12
12
|
|