mandrel 2.37.0 → 2.38.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 +16 -16
- package/.agents/agents/plan-critic.md +1 -1
- package/.agents/docs/SDLC.md +40 -40
- package/.agents/docs/configuration.md +16 -16
- package/.agents/docs/execution-reference.md +3 -3
- package/.agents/docs/quality-gates.md +2 -2
- package/.agents/docs/workflows.md +6 -6
- package/.agents/instructions.md +5 -5
- package/.agents/rules/changelog-style.md +3 -3
- package/.agents/rules/ci-remediation.md +1 -1
- package/.agents/rules/git-conventions-reference.md +4 -4
- package/.agents/schemas/agentrc.schema.json +9 -9
- package/.agents/schemas/story-deliver-terminal.schema.json +2 -2
- package/.agents/schemas/validation-evidence.schema.json +1 -1
- package/.agents/scripts/acceptance-eval.js +1 -1
- package/.agents/scripts/apply-quality-bootstrap.js +1 -1
- package/.agents/scripts/audit-to-stories.js +2 -2
- package/.agents/scripts/check-doc-links.js +32 -4
- package/.agents/scripts/check-test-temp-hygiene.js +1 -1
- package/.agents/scripts/check-workflow-cli-lint.js +1 -1
- package/.agents/scripts/deliver-light.js +10 -10
- package/.agents/scripts/deliver-recover.js +1 -1
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +1 -1
- package/.agents/scripts/generate-workflows-doc.js +1 -1
- package/.agents/scripts/lib/audit-suite/selector.js +1 -1
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +1 -1
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +1 -1
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +5 -5
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +1 -1
- package/.agents/scripts/lib/bdd-runner-detect.js +1 -1
- package/.agents/scripts/lib/bdd-scenario-budget.js +1 -1
- package/.agents/scripts/lib/bdd-scenario-scanner.js +3 -3
- package/.agents/scripts/lib/bdd-step-index.js +1 -1
- package/.agents/scripts/lib/bootstrap/branch-protection.js +1 -1
- package/.agents/scripts/lib/bootstrap/commit-push.js +2 -2
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +1 -1
- package/.agents/scripts/lib/checks/core-bare-clean.js +1 -1
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +1 -1
- package/.agents/scripts/lib/cli-args.js +1 -1
- package/.agents/scripts/lib/command-header.js +1 -1
- package/.agents/scripts/lib/config/delivery-routing.js +1 -1
- package/.agents/scripts/lib/config/explain.js +1 -1
- package/.agents/scripts/lib/config/runners.js +2 -2
- package/.agents/scripts/lib/config/runtime.js +1 -1
- package/.agents/scripts/lib/config/temp-paths.js +2 -2
- package/.agents/scripts/lib/config-settings-schema-delivery.js +3 -3
- package/.agents/scripts/lib/config-settings-schema-quality.js +6 -6
- package/.agents/scripts/lib/config-settings-schema.js +3 -3
- package/.agents/scripts/lib/duplicate-search.js +1 -1
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +4 -4
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
- package/.agents/scripts/lib/findings/classify-finding.js +1 -1
- package/.agents/scripts/lib/findings/promote-finding.js +12 -12
- package/.agents/scripts/lib/findings/route-finding.js +2 -2
- package/.agents/scripts/lib/generated/agentrc-validator.js +1 -1
- package/.agents/scripts/lib/git-branch-lifecycle.js +2 -2
- package/.agents/scripts/lib/label-constants.js +2 -2
- package/.agents/scripts/lib/label-taxonomy.js +1 -1
- package/.agents/scripts/lib/onboard/init-tail.js +4 -4
- package/.agents/scripts/lib/onboard/scaffold-docs.js +2 -2
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +1 -1
- package/.agents/scripts/lib/orchestration/code-review.js +4 -4
- package/.agents/scripts/lib/orchestration/complexity-gate.js +5 -5
- package/.agents/scripts/lib/orchestration/deliver-recover.js +3 -3
- package/.agents/scripts/lib/orchestration/docs-digest.js +3 -3
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +2 -2
- package/.agents/scripts/lib/orchestration/light-backstop.js +1 -1
- package/.agents/scripts/lib/orchestration/light-escalation.js +6 -6
- package/.agents/scripts/lib/orchestration/light-suitability.js +19 -19
- package/.agents/scripts/lib/orchestration/plan-context.js +4 -4
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +2 -2
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +2 -2
- package/.agents/scripts/lib/orchestration/plan-metrics.js +1 -1
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +1 -1
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +3 -3
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +6 -6
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +16 -16
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +3 -3
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +6 -6
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +7 -7
- package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +1 -1
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +3 -3
- package/.agents/scripts/lib/orchestration/remote-verifier.js +2 -2
- package/.agents/scripts/lib/orchestration/resolve-stories.js +4 -4
- package/.agents/scripts/lib/orchestration/run-epilogue.js +2 -2
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +2 -2
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +1 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +5 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +3 -3
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +2 -2
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +1 -1
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +14 -12
- package/.agents/scripts/lib/orchestration/ticket-validator.js +1 -1
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +3 -3
- package/.agents/scripts/lib/plan-phase-cleanup.js +1 -1
- package/.agents/scripts/lib/signals/schema.js +1 -1
- package/.agents/scripts/lib/story-adjacency.js +2 -2
- package/.agents/scripts/lib/templates/decomposer-prompts.js +1 -1
- package/.agents/scripts/lib/ticket-body-sections.js +1 -1
- package/.agents/scripts/lib/util/concurrent-map.js +1 -1
- package/.agents/scripts/lib/util/parse-id-list.js +1 -1
- package/.agents/scripts/lib/wave-runner/live-probe.js +4 -4
- package/.agents/scripts/lib/wave-runner/ready-set.js +1 -1
- package/.agents/scripts/lib/workflow-closure.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +2 -2
- package/.agents/scripts/lint-issue-body.js +3 -3
- package/.agents/scripts/plan-context.js +4 -4
- package/.agents/scripts/plan-critics.js +2 -2
- package/.agents/scripts/plan-persist.js +2 -2
- package/.agents/scripts/plan-run-epilogue.js +2 -2
- package/.agents/scripts/providers/github/board-add.js +1 -1
- package/.agents/scripts/providers/github/errors.js +1 -1
- package/.agents/scripts/providers/github/tickets.js +6 -6
- package/.agents/scripts/resolve-stories.js +3 -3
- package/.agents/scripts/resync-status-column.js +1 -1
- package/.agents/scripts/run-lint.js +1 -1
- package/.agents/scripts/single-story-close.js +2 -2
- package/.agents/scripts/single-story-init.js +5 -5
- package/.agents/scripts/stories-wave-tick.js +8 -8
- package/.agents/skills/core/idea-refinement/SKILL.md +5 -5
- package/.agents/skills/core/scope-triage/SKILL.md +3 -3
- package/.agents/skills/skills.index.json +1 -1
- package/.agents/skills/stack/qa/qa-harness/SKILL.md +1 -1
- package/.agents/workflows/audit-data-model.md +1 -1
- package/.agents/workflows/audit-documentation.md +2 -2
- package/.agents/workflows/audit-to-stories.md +11 -11
- package/.agents/workflows/git-deliver.md +4 -4
- package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-review.md +4 -4
- package/.agents/workflows/helpers/deliver-light.md +26 -26
- package/.agents/workflows/helpers/deliver-reference.md +15 -7
- package/.agents/workflows/helpers/deliver-story-reference.md +9 -4
- package/.agents/workflows/helpers/deliver-story.md +6 -7
- package/.agents/workflows/helpers/diagnose.md +2 -2
- package/.agents/workflows/helpers/parallel-tooling.md +1 -1
- package/.agents/workflows/helpers/plan-reference.md +9 -9
- package/.agents/workflows/helpers/qa-core.md +8 -8
- package/.agents/workflows/helpers/worktree-lifecycle.md +6 -6
- package/.agents/workflows/{deliver.md → mandrel-deliver.md} +15 -19
- package/.agents/workflows/{plan.md → mandrel-plan.md} +9 -9
- package/.agents/workflows/memory-consolidate.md +4 -4
- package/.agents/workflows/prototype.md +3 -3
- package/.agents/workflows/qa-assist.md +12 -12
- package/.agents/workflows/qa-explore.md +6 -6
- package/.agents/workflows/qa-run.md +1 -1
- package/README.md +7 -7
- package/docs/CHANGELOG.md +11 -0
- package/lib/cli/doctor.js +1 -1
- package/lib/cli/init.js +1 -1
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +1 -1
- package/package.json +1 -1
|
@@ -95,7 +95,7 @@ signature is worth naming:
|
|
|
95
95
|
**Invariant (stated in the core): the delivering flow owns tidying the local
|
|
96
96
|
checkout — reaping its own merged refs and fast-forwarding the base branch.
|
|
97
97
|
`/git-cleanup` is a recovery tool, not a routine chore.** The outcome every
|
|
98
|
-
delivering flow (`/deliver`, `/git-deliver`) guarantees, with the mechanics
|
|
98
|
+
delivering flow (`/mandrel-deliver`, `/git-deliver`) guarantees, with the mechanics
|
|
99
99
|
owned by `boot-sweep.js` / `git-cleanup.js`:
|
|
100
100
|
|
|
101
101
|
- **`main` is fast-forwarded** by the flow itself in its cleanup phase, so the
|
|
@@ -104,7 +104,7 @@ owned by `boot-sweep.js` / `git-cleanup.js`:
|
|
|
104
104
|
- **Merged local refs are reaped** at the next workflow boot's protected sweep
|
|
105
105
|
(`boot-sweep.js`) — every local branch whose PR is already merged, skipping
|
|
106
106
|
any candidate with unpushed work, a dirty worktree, or a still-open parent
|
|
107
|
-
ticket. `/plan` and `/git-deliver` widen the sweep's `--include` scope beyond
|
|
107
|
+
ticket. `/mandrel-plan` and `/git-deliver` widen the sweep's `--include` scope beyond
|
|
108
108
|
the default `story-*` to their own branch namespaces at their boot call site.
|
|
109
109
|
- **Content-merged branches are report-only.** A branch detected only via the
|
|
110
110
|
weaker content-equivalence signal (`detectedBy: 'content-merged'` — content
|
|
@@ -149,13 +149,13 @@ different hazards:
|
|
|
149
149
|
- **Recognition signature**: close aborts naming stray files in the main
|
|
150
150
|
checkout that intersect the Story's diff. **Resolution**: relocate those
|
|
151
151
|
edits under the worktree, restore the main checkout
|
|
152
|
-
(`git -C <main-repo> checkout -- <files>`), then re-run `/deliver <storyId>`.
|
|
152
|
+
(`git -C <main-repo> checkout -- <files>`), then re-run `/mandrel-deliver <storyId>`.
|
|
153
153
|
Never `git reset --hard` or `git checkout --force` to clear the way.
|
|
154
154
|
|
|
155
155
|
## Meta Labels (Retrospective Signal Routing)
|
|
156
156
|
|
|
157
157
|
Two `meta::*` labels route retrospective signals into durable substrates so
|
|
158
|
-
the `/plan` Phase 0 fetcher (see
|
|
158
|
+
the `/mandrel-plan` Phase 0 fetcher (see
|
|
159
159
|
[`prior-feedback-fetcher.js`](../scripts/lib/feedback-loop/prior-feedback-fetcher.js))
|
|
160
160
|
can surface open feedback issues to the planner. Both labels live in
|
|
161
161
|
[`label-constants.js`](../scripts/lib/label-constants.js) under the
|
|
@@ -298,7 +298,7 @@
|
|
|
298
298
|
},
|
|
299
299
|
"planning": {
|
|
300
300
|
"type": "object",
|
|
301
|
-
"description": "Inputs to `/plan`: risk escalation heuristics, ceremony-lite routing, and the cross-Story conflict-finding severity gates.",
|
|
301
|
+
"description": "Inputs to `/mandrel-plan`: risk escalation heuristics, ceremony-lite routing, and the cross-Story conflict-finding severity gates.",
|
|
302
302
|
"properties": {
|
|
303
303
|
"riskHeuristics": {
|
|
304
304
|
"oneOf": [
|
|
@@ -440,7 +440,7 @@
|
|
|
440
440
|
},
|
|
441
441
|
"delivery": {
|
|
442
442
|
"type": "object",
|
|
443
|
-
"description": "Everything `/deliver` and `single-story-close` consume: execution timeouts, worktree isolation, runner concurrency, docs freshness, signals, quality gates, merge/CI watch, review ceremony, and the feedback loop.",
|
|
443
|
+
"description": "Everything `/mandrel-deliver` and `single-story-close` consume: execution timeouts, worktree isolation, runner concurrency, docs freshness, signals, quality gates, merge/CI watch, review ceremony, and the feedback loop.",
|
|
444
444
|
"properties": {
|
|
445
445
|
"execution": {
|
|
446
446
|
"type": "object",
|
|
@@ -521,12 +521,12 @@
|
|
|
521
521
|
},
|
|
522
522
|
"deliverRunner": {
|
|
523
523
|
"type": "object",
|
|
524
|
-
"description": "Bounded-concurrency knob for the /deliver fan-out.",
|
|
524
|
+
"description": "Bounded-concurrency knob for the /mandrel-deliver fan-out.",
|
|
525
525
|
"properties": {
|
|
526
526
|
"concurrencyCap": {
|
|
527
527
|
"type": "integer",
|
|
528
528
|
"minimum": 1,
|
|
529
|
-
"description": "Maximum ready Stories dispatched by /deliver at once. Default 3. Moderate by design — keeps host-quota consumption predictable while allowing a small ready-set fan-out. Set 1 for strictly sequential delivery; raise further on hosts with adequate parallel-agent quota. See deliver.md for the sequencing model and throughput tradeoff.",
|
|
529
|
+
"description": "Maximum ready Stories dispatched by /mandrel-deliver at once. Default 3. Moderate by design — keeps host-quota consumption predictable while allowing a small ready-set fan-out. Set 1 for strictly sequential delivery; raise further on hosts with adequate parallel-agent quota. See deliver.md for the sequencing model and throughput tradeoff.",
|
|
530
530
|
"default": 3
|
|
531
531
|
},
|
|
532
532
|
"footprintGuard": {
|
|
@@ -1628,7 +1628,7 @@
|
|
|
1628
1628
|
},
|
|
1629
1629
|
"navigability": {
|
|
1630
1630
|
"type": "object",
|
|
1631
|
-
"description": "Navigability lens + journey-suite config (Epic #4131, F2/F3/F1/F4). Read by audit-suite/selector.js (route globs) and /deliver's per-Story ceremony (journey suite). Opt-in: absent or empty routeGlobs degrades to a silent no-op.",
|
|
1631
|
+
"description": "Navigability lens + journey-suite config (Epic #4131, F2/F3/F1/F4). Read by audit-suite/selector.js (route globs) and /mandrel-deliver's per-Story ceremony (journey suite). Opt-in: absent or empty routeGlobs degrades to a silent no-op.",
|
|
1632
1632
|
"properties": {
|
|
1633
1633
|
"routeGlobs": {
|
|
1634
1634
|
"type": "array",
|
|
@@ -1648,7 +1648,7 @@
|
|
|
1648
1648
|
},
|
|
1649
1649
|
"journeySuite": {
|
|
1650
1650
|
"type": "string",
|
|
1651
|
-
"description": "Path or command for the per-persona journey suite /deliver's per-Story ceremony runs."
|
|
1651
|
+
"description": "Path or command for the per-persona journey suite /mandrel-deliver's per-Story ceremony runs."
|
|
1652
1652
|
}
|
|
1653
1653
|
},
|
|
1654
1654
|
"additionalProperties": false
|
|
@@ -1692,7 +1692,7 @@
|
|
|
1692
1692
|
},
|
|
1693
1693
|
"codeReview": {
|
|
1694
1694
|
"type": "object",
|
|
1695
|
-
"description": "Review-provider chain plus bounded-retry knobs for the /deliver code-review ceremony.",
|
|
1695
|
+
"description": "Review-provider chain plus bounded-retry knobs for the /mandrel-deliver code-review ceremony.",
|
|
1696
1696
|
"properties": {
|
|
1697
1697
|
"providers": {
|
|
1698
1698
|
"type": "array",
|
|
@@ -1780,7 +1780,7 @@
|
|
|
1780
1780
|
"maxFixAttempts": {
|
|
1781
1781
|
"type": "integer",
|
|
1782
1782
|
"minimum": 0,
|
|
1783
|
-
"description": "Maximum auto-fix retry attempts per finding in /deliver Phase 5 (code-review). 0 disables auto-fix. Default 3.",
|
|
1783
|
+
"description": "Maximum auto-fix retry attempts per finding in /mandrel-deliver Phase 5 (code-review). 0 disables auto-fix. Default 3.",
|
|
1784
1784
|
"default": 3
|
|
1785
1785
|
},
|
|
1786
1786
|
"maxFixScopeFiles": {
|
|
@@ -1792,7 +1792,7 @@
|
|
|
1792
1792
|
"autoFixSeverity": {
|
|
1793
1793
|
"type": "string",
|
|
1794
1794
|
"enum": ["high", "medium"],
|
|
1795
|
-
"description": "Severity threshold for on-branch remediation in /deliver Phase 5 (code-review). `medium` (default) routes 🔴/🟠/🟡 findings into the host-LLM focused-fix routing (Mediums batched per lens: one commit per lens, a single validation + rescan at the end) while 🟢 suggestions still graduate to follow-up issues; `high` reproduces the pre-4399 Critical/High-only routing. Hard cutover — no back-compat flag.",
|
|
1795
|
+
"description": "Severity threshold for on-branch remediation in /mandrel-deliver Phase 5 (code-review). `medium` (default) routes 🔴/🟠/🟡 findings into the host-LLM focused-fix routing (Mediums batched per lens: one commit per lens, a single validation + rescan at the end) while 🟢 suggestions still graduate to follow-up issues; `high` reproduces the pre-4399 Critical/High-only routing. Hard cutover — no back-compat flag.",
|
|
1796
1796
|
"default": "medium"
|
|
1797
1797
|
}
|
|
1798
1798
|
},
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
},
|
|
22
22
|
"status": {
|
|
23
23
|
"type": "string",
|
|
24
|
-
"description": "landed — the PR merged, the Story is agent::done, and the post-land tail was attempted. pending — a bounded wait expired with the PR still in flight; NO label was mutated and no merge.unlanded event was emitted, so the run is resumable via nextCommand. blocked — a classified hard block; the Story carries agent::blocked and blocked.blockClass names the class. failed — a phase crashed; phase names which one. escalated — the /deliver-light suitability gate refused an over-scope prompt under --yes; nothing was created and the session ENDS here, nextCommand naming the /plan invocation that owns the work instead.",
|
|
24
|
+
"description": "landed — the PR merged, the Story is agent::done, and the post-land tail was attempted. pending — a bounded wait expired with the PR still in flight; NO label was mutated and no merge.unlanded event was emitted, so the run is resumable via nextCommand. blocked — a classified hard block; the Story carries agent::blocked and blocked.blockClass names the class. failed — a phase crashed; phase names which one. escalated — the /deliver-light suitability gate refused an over-scope prompt under --yes; nothing was created and the session ENDS here, nextCommand naming the /mandrel-plan invocation that owns the work instead.",
|
|
25
25
|
"enum": ["landed", "pending", "blocked", "failed", "escalated"]
|
|
26
26
|
},
|
|
27
27
|
"phase": {
|
|
@@ -173,7 +173,7 @@
|
|
|
173
173
|
},
|
|
174
174
|
"nextCommand": {
|
|
175
175
|
"type": ["string", "null"],
|
|
176
|
-
"description": "The single command that advances this work from where it stopped, or null when status === \"landed\" and nothing remains. Shares its vocabulary with deliver-recover.js so recovery and normal resumption speak one language. For status escalated it is the /plan invocation the operator runs in a FRESH session — the one case where the command is a slash command rather than a script, because the work needs planning, not resumption.",
|
|
176
|
+
"description": "The single command that advances this work from where it stopped, or null when status === \"landed\" and nothing remains. Shares its vocabulary with deliver-recover.js so recovery and normal resumption speak one language. For status escalated it is the /mandrel-plan invocation the operator runs in a FRESH session — the one case where the command is a slash command rather than a script, because the work needs planning, not resumption.",
|
|
177
177
|
"minLength": 1
|
|
178
178
|
},
|
|
179
179
|
"elapsedSeconds": { "type": "number", "minimum": 0 },
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "validation-evidence",
|
|
4
4
|
"title": "Validation Evidence",
|
|
5
|
-
"description": "Per-scope record of which validation gates have passed against which commit SHA. Written by lib/validation-evidence.js under the per-Epic temp tree at temp/run-<id>/validation-evidence.json (Epic-scoped) or temp/run-<id>/stories/story-<storyId>/validation-evidence.json (Story-scoped). Standalone Stories (no parent Epic) use a storyId-anchored keyspace at temp/standalone/stories/story-<storyId>/validation-evidence.json. All paths are gitignored via temp/. Consumed by close-validation, epic-code-review, the acceptance self-eval critic, and /deliver Phase 3 (close-validation) to skip identical re-runs against an already-validated tree. The `storyId` field carries the scope id and equals the epic id for Epic-scoped records.",
|
|
5
|
+
"description": "Per-scope record of which validation gates have passed against which commit SHA. Written by lib/validation-evidence.js under the per-Epic temp tree at temp/run-<id>/validation-evidence.json (Epic-scoped) or temp/run-<id>/stories/story-<storyId>/validation-evidence.json (Story-scoped). Standalone Stories (no parent Epic) use a storyId-anchored keyspace at temp/standalone/stories/story-<storyId>/validation-evidence.json. All paths are gitignored via temp/. Consumed by close-validation, epic-code-review, the acceptance self-eval critic, and /mandrel-deliver Phase 3 (close-validation) to skip identical re-runs against an already-validated tree. The `storyId` field carries the scope id and equals the epic id for Epic-scoped records.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"required": ["storyId", "schemaVersion", "records"],
|
|
8
8
|
"properties": {
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
* and the resolved, undisableable round cap
|
|
21
21
|
* (`delivery.acceptanceEval.maxRounds`, clamped to `[1, ceiling]`).
|
|
22
22
|
* 3. Emit one per-criterion `acceptance-eval` signal into the retro /
|
|
23
|
-
* feedback substrate so the retro and `/plan` Phase 0 feedback
|
|
23
|
+
* feedback substrate so the retro and `/mandrel-plan` Phase 0 feedback
|
|
24
24
|
* fetch can see which acceptance items needed rework and the round
|
|
25
25
|
* count.
|
|
26
26
|
* 4. Print a single JSON envelope and exit:
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
*
|
|
21
21
|
* Story #5007 retired the second step. `migrateBaselinesLayout` relocated
|
|
22
22
|
* per-Epic ratchet snapshots into `temp/epic/<id>/baselines/` on the contract
|
|
23
|
-
* that `/deliver` reaps that namespace on merge — a mechanism the Story-only
|
|
23
|
+
* that `/mandrel-deliver` reaps that namespace on merge — a mechanism the Story-only
|
|
24
24
|
* v2 model deleted, so the migration moved dead data into a namespace no code
|
|
25
25
|
* path writes, reads, or reaps. Its one residual hygiene value (getting the
|
|
26
26
|
* committed `baselines/epic/` tree out of version control) survives as
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* stdout when --json is set).
|
|
14
14
|
*
|
|
15
15
|
* --emit-plan-seed --plan <plan.json> --out <path>
|
|
16
|
-
* Read the plan envelope from disk, render the `/plan --seed`
|
|
16
|
+
* Read the plan envelope from disk, render the `/mandrel-plan --seed`
|
|
17
17
|
* seed markdown, persist to --out.
|
|
18
18
|
*
|
|
19
19
|
* --emit-stories --plan <plan.json>
|
|
@@ -844,7 +844,7 @@ runAsCli(import.meta.url, main, {
|
|
|
844
844
|
flags: [
|
|
845
845
|
['--scan', 'Print the grouped, deduplicated plan as JSON.'],
|
|
846
846
|
['--auto', 'Run the full scan → file pipeline and print the summary.'],
|
|
847
|
-
['--emit-plan-seed', 'Emit a /plan --seed-file document.'],
|
|
847
|
+
['--emit-plan-seed', 'Emit a /mandrel-plan --seed-file document.'],
|
|
848
848
|
['--emit-stories', 'Emit the Story drafts as JSON.'],
|
|
849
849
|
[
|
|
850
850
|
'--wire-edges',
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
//
|
|
20
20
|
// 3. No active doc mentions any retired slash command. The retired-command
|
|
21
21
|
// blocklist is seeded with `agents-bootstrap-github`,
|
|
22
|
-
// `single-story-plan` (renamed to `/plan`), and `mandrel`
|
|
22
|
+
// `single-story-plan` (renamed to `/mandrel-plan`), and `mandrel`
|
|
23
23
|
// (retired in favor of the generated `.agents/docs/workflows.md`
|
|
24
24
|
// catalog) and takes precedence over the workflow-resolution check —
|
|
25
25
|
// a retired token is always a non-zero exit even if a stale workflow
|
|
@@ -61,6 +61,18 @@ export const RETIRED_COMMANDS = new Set([
|
|
|
61
61
|
'git-merge-pr',
|
|
62
62
|
]);
|
|
63
63
|
|
|
64
|
+
// Command spellings a *historical* record may still name, keyed by the file
|
|
65
|
+
// allowed to name them. A decisions log that cannot quote the name a command
|
|
66
|
+
// had is a broken record: an ADR describes the world as it was, so freezing
|
|
67
|
+
// its prose is the point. Scoped per-file and per-token rather than
|
|
68
|
+
// allowlisted globally — everywhere else these are simply wrong, and a typo
|
|
69
|
+
// like `/mandrl-plan` must still fail here. Story #5126 renamed `/plan` →
|
|
70
|
+
// `/mandrel-plan` and `/deliver` → `/mandrel-deliver`; the ADRs that decided
|
|
71
|
+
// the Story-only model still name them as they were called then.
|
|
72
|
+
export const SUPERSEDED_COMMAND_SPELLINGS = new Map([
|
|
73
|
+
['docs/decisions.md', new Set(['plan', 'deliver'])],
|
|
74
|
+
]);
|
|
75
|
+
|
|
64
76
|
// Tokens that look like `/foo` in prose but are not slash commands. Tokens
|
|
65
77
|
// are stored WITHOUT the leading slash. The list focuses on common URL path
|
|
66
78
|
// fragments and on-disk path roots that appear in tutorial prose. The
|
|
@@ -379,6 +391,20 @@ export function extractSlashTokens(masked) {
|
|
|
379
391
|
|
|
380
392
|
// --- Per-file check --------------------------------------------------------
|
|
381
393
|
|
|
394
|
+
/**
|
|
395
|
+
* The slash tokens `relFile` may name without resolving to a workflow: the
|
|
396
|
+
* global allowlist, plus any superseded spelling this particular file is
|
|
397
|
+
* allowed to quote.
|
|
398
|
+
*
|
|
399
|
+
* @param {string} relFile Repo-relative path of the file being checked.
|
|
400
|
+
* @returns {Set<string>} Tokens to skip, stored without the leading slash.
|
|
401
|
+
*/
|
|
402
|
+
function slashAllowlistFor(relFile) {
|
|
403
|
+
const superseded = SUPERSEDED_COMMAND_SPELLINGS.get(relFile);
|
|
404
|
+
if (!superseded) return SLASH_ALLOWLIST;
|
|
405
|
+
return new Set([...SLASH_ALLOWLIST, ...superseded]);
|
|
406
|
+
}
|
|
407
|
+
|
|
382
408
|
export function checkFile(absPath, repoRoot) {
|
|
383
409
|
const violations = [];
|
|
384
410
|
const source = fs.readFileSync(absPath, 'utf8');
|
|
@@ -454,14 +480,16 @@ export function checkFile(absPath, repoRoot) {
|
|
|
454
480
|
}
|
|
455
481
|
}
|
|
456
482
|
|
|
457
|
-
// 3. Slash-command resolution. Skip retired hits (already reported)
|
|
458
|
-
// allowlisted tokens
|
|
483
|
+
// 3. Slash-command resolution. Skip retired hits (already reported),
|
|
484
|
+
// allowlisted tokens, and a superseded spelling in the one file allowed
|
|
485
|
+
// to quote it (SUPERSEDED_COMMAND_SPELLINGS). A command is valid if it resolves to a top-level
|
|
459
486
|
// workflow file OR to a helpers/ module (helpers are not projected into
|
|
460
487
|
// the `.claude/commands/` tree but are still legitimate named workflows
|
|
461
488
|
// that parent workflows invoke by prose reference).
|
|
489
|
+
const slashAllowlist = slashAllowlistFor(relFile);
|
|
462
490
|
for (const { token, line } of slashTokens) {
|
|
463
491
|
if (RETIRED_COMMANDS.has(token)) continue;
|
|
464
|
-
if (
|
|
492
|
+
if (slashAllowlist.has(token)) continue;
|
|
465
493
|
// Namespaced loop commands (`/loops:<name>`, Story #4289) resolve to a
|
|
466
494
|
// loop unit under `.agents/workflows/loops/<name>.md`. Split on the `:`
|
|
467
495
|
// and resolve the namespaced path rather than a flat `loops:<name>.md`.
|
|
@@ -422,7 +422,7 @@ export function findReservedIdStreamFiles(tempDir) {
|
|
|
422
422
|
* the **repository-root** temp tree (Story #4892).
|
|
423
423
|
*
|
|
424
424
|
* Resolution matters more than it looks: every writer anchors a relative
|
|
425
|
-
* `tempRoot` to the *main checkout* (so a Story worktree and its `/deliver`
|
|
425
|
+
* `tempRoot` to the *main checkout* (so a Story worktree and its `/mandrel-deliver`
|
|
426
426
|
* host converge on one ledger), so a guard that scanned `cwd` would scan an
|
|
427
427
|
* empty worktree tree and pass vacuously on the very tree it is meant to
|
|
428
428
|
* protect. `resolveRoot` is the injection seam for tests.
|
|
@@ -136,7 +136,7 @@ export function toParagraphs(lines) {
|
|
|
136
136
|
* heading (inclusive) — i.e. the section is *about* that script, so the
|
|
137
137
|
* table is restating its surface.
|
|
138
138
|
*
|
|
139
|
-
* A slash command's own argument table (`/plan`, `/deliver`) has no script
|
|
139
|
+
* A slash command's own argument table (`/mandrel-plan`, `/mandrel-deliver`) has no script
|
|
140
140
|
* behind it — nothing owns those flags but the workflow prose itself — so
|
|
141
141
|
* condition 2 leaves it alone by design.
|
|
142
142
|
*
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* A **thin entry point, not a second delivery engine.** It runs the
|
|
7
7
|
* suitability gate, authors a minimal receipt `type::story`, and then hands off
|
|
8
|
-
* to the SAME engine scripts `/deliver` uses:
|
|
8
|
+
* to the SAME engine scripts `/mandrel-deliver` uses:
|
|
9
9
|
*
|
|
10
10
|
* suitability gate → inline receipt Story → single-story-init.js
|
|
11
11
|
* → (agent implements + self-evals) → diff backstop
|
|
@@ -38,9 +38,9 @@
|
|
|
38
38
|
* envelope with status `escalated` and **ends the session**. Before that it was
|
|
39
39
|
* an ordinary gate envelope plus exit 2 — a warning a caller could walk past,
|
|
40
40
|
* and one mandrel-bench 2.13.0 light-arm run did exactly that: it read the
|
|
41
|
-
* escalation, invoked `/plan` in the same session, and delivered. In-session
|
|
41
|
+
* escalation, invoked `/mandrel-plan` in the same session, and delivered. In-session
|
|
42
42
|
* planning under-decomposed (ONE Story against the scenario's 3-5 contract,
|
|
43
|
-
* where a fresh `/plan` session on the identical seed authored four), so
|
|
43
|
+
* where a fresh `/mandrel-plan` session on the identical seed authored four), so
|
|
44
44
|
* escalation silently produced the outcome the guard exists to prevent.
|
|
45
45
|
* {@link module:lib/orchestration/story-deliver-terminal.buildEscalationTerminal}
|
|
46
46
|
* carries the guarantees the schema then enforces.
|
|
@@ -88,7 +88,7 @@ Usage:
|
|
|
88
88
|
deliver-light.js --backstop --story <id>
|
|
89
89
|
|
|
90
90
|
The thin /deliver-light entry point: suitability gate → inline receipt Story →
|
|
91
|
-
the same single-story-init.js / single-story-close.js engine /deliver uses.
|
|
91
|
+
the same single-story-init.js / single-story-close.js engine /mandrel-deliver uses.
|
|
92
92
|
|
|
93
93
|
The gate judges EFFORT and RISK, not artifact counts: N instances of one
|
|
94
94
|
mechanical edit is one kind at N sites. It rejects only clearly-epic work; the
|
|
@@ -102,9 +102,9 @@ Gate options:
|
|
|
102
102
|
--kinds <csv> Distinct KINDS of change (default: one per assumption, so
|
|
103
103
|
N same-shaped edits count once).
|
|
104
104
|
--magnitude <m> Coarse effort bucket: trivial | moderate | substantial
|
|
105
|
-
(default moderate; substantial routes to /plan).
|
|
105
|
+
(default moderate; substantial routes to /mandrel-plan).
|
|
106
106
|
--uncertainty <u> determined (the request fixes the shape) | needs-design
|
|
107
|
-
(default determined; needs-design routes to /plan).
|
|
107
|
+
(default determined; needs-design routes to /mandrel-plan).
|
|
108
108
|
--route <r> Ledgered model verdict route: lite | full.
|
|
109
109
|
--reason <text> Recorded reason for a lite verdict (required for lite).
|
|
110
110
|
--amends <#id> Mark this as an amendment of an existing issue.
|
|
@@ -125,7 +125,7 @@ Backstop options:
|
|
|
125
125
|
change's IMPLEMENTATION half by magnitude (changed lines +
|
|
126
126
|
file sprawl); test/doc/baseline companions are exempt from
|
|
127
127
|
the counts but still matched for sensitive paths. A block
|
|
128
|
-
emits a nextCommand recycling the receipt through /plan.
|
|
128
|
+
emits a nextCommand recycling the receipt through /mandrel-plan.
|
|
129
129
|
--story <id> Story issue number whose story-<id> branch to diff.
|
|
130
130
|
|
|
131
131
|
--pretty Pretty-print the JSON envelope.
|
|
@@ -280,7 +280,7 @@ export async function createLightReceipt({
|
|
|
280
280
|
}
|
|
281
281
|
|
|
282
282
|
/**
|
|
283
|
-
* The engine hand-off — the SAME scripts `/deliver` uses. Named here as
|
|
283
|
+
* The engine hand-off — the SAME scripts `/mandrel-deliver` uses. Named here as
|
|
284
284
|
* commands, never reimplemented: this is the whole of deliver-light's
|
|
285
285
|
* relationship to worktree/branch/lease/PR/merge mechanics.
|
|
286
286
|
*
|
|
@@ -397,7 +397,7 @@ export async function runGateMode(values, deps = {}) {
|
|
|
397
397
|
if (values.yes === true && hasOperatorOverride(values)) {
|
|
398
398
|
process.stderr.write(HELP);
|
|
399
399
|
throw new Error(
|
|
400
|
-
'[deliver-light] --operator-proceed-light is attended-only and cannot be combined with --yes: an unattended run has no operator whose answer this is, and over-scope must fail closed to /plan',
|
|
400
|
+
'[deliver-light] --operator-proceed-light is attended-only and cannot be combined with --yes: an unattended run has no operator whose answer this is, and over-scope must fail closed to /mandrel-plan',
|
|
401
401
|
);
|
|
402
402
|
}
|
|
403
403
|
|
|
@@ -423,7 +423,7 @@ export async function runGateMode(values, deps = {}) {
|
|
|
423
423
|
});
|
|
424
424
|
emitTerminalFn(envelope);
|
|
425
425
|
Logger.warn(
|
|
426
|
-
`[deliver-light] ESCALATED to /plan — this session ENDS here; run ${envelope.nextCommand} in a FRESH session: ${gate.outcome.reasons.join('; ')}`,
|
|
426
|
+
`[deliver-light] ESCALATED to /mandrel-plan — this session ENDS here; run ${envelope.nextCommand} in a FRESH session: ${gate.outcome.reasons.join('; ')}`,
|
|
427
427
|
);
|
|
428
428
|
return exitCodeForTerminal(envelope);
|
|
429
429
|
}
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* is the thing they cannot act on.
|
|
13
13
|
*
|
|
14
14
|
* The strand this exists for above all others is the **merged-but-label-stale**
|
|
15
|
-
* Story: a `/deliver` re-run refuses it outright, because
|
|
15
|
+
* Story: a `/mandrel-deliver` re-run refuses it outright, because
|
|
16
16
|
* `single-story-init.js` hard-errors on an already-closed Story. Before this
|
|
17
17
|
* surface, that Story had no automated way back.
|
|
18
18
|
*
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* any still-stuck entries by enumerating the processes holding handles
|
|
9
9
|
* inside the worktree path and terminating them.
|
|
10
10
|
*
|
|
11
|
-
* Invoked by `/deliver` and `/plan`
|
|
11
|
+
* Invoked by `/mandrel-deliver` and `/mandrel-plan`
|
|
12
12
|
* (via `drainPendingCleanupAtBoot` → `worktree-sweep.js`), and
|
|
13
13
|
* `story-close` so the pending-cleanup ledger drains automatically
|
|
14
14
|
* across the sprint lifecycle. Operators can also run it standalone:
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* evidence-gate.js — evidence-aware wrapper around a single shell gate.
|
|
5
5
|
*
|
|
6
|
-
* Tech Spec #819 §"Evidence record (Story 7)" — `/deliver` Phase 3
|
|
6
|
+
* Tech Spec #819 §"Evidence record (Story 7)" — `/mandrel-deliver` Phase 3
|
|
7
7
|
* (close-validation) runs `npm run lint` and `npm test` against the Epic
|
|
8
8
|
* branch before opening the PR.
|
|
9
9
|
* If the same gate has already passed against the current `git rev-parse
|
|
@@ -93,7 +93,7 @@ export function renderWorkflowsDoc(catalog, loopCatalog = []) {
|
|
|
93
93
|
'Every command file lives at `.agents/workflows/<name>.md` and is projected',
|
|
94
94
|
'into a flat `.claude/commands/` tree by `npm run sync:commands` (kept',
|
|
95
95
|
'current at install time and on every `mandrel sync`/`update`) so it shows',
|
|
96
|
-
'up as a bare `/<name>` slash command (e.g. `/deliver`). The projection',
|
|
96
|
+
'up as a bare `/<name>` slash command (e.g. `/mandrel-deliver`). The projection',
|
|
97
97
|
'writes only `.claude/commands/<name>.md` — there is no plugin manifest and no',
|
|
98
98
|
'marketplace listing. The commands load in every Claude Code environment.',
|
|
99
99
|
'',
|
|
@@ -701,7 +701,7 @@ export function changeSetLacksSiblingTest(changedFiles) {
|
|
|
701
701
|
* callers MUST pass the requested Epic's own branch ref (e.g.
|
|
702
702
|
* `refs/heads/epic/<id>`) so the change set is pinned to that Epic's branch
|
|
703
703
|
* rather than whatever HEAD the shared checkout happens to sit on. Under two
|
|
704
|
-
* concurrent `/deliver` runs sharing one checkout, diffing against
|
|
704
|
+
* concurrent `/mandrel-deliver` runs sharing one checkout, diffing against
|
|
705
705
|
* `HEAD` silently resolves the *other* Epic's change set (Story #3362). When
|
|
706
706
|
* `headRef` cannot be resolved in the repo, the selector returns a
|
|
707
707
|
* `degraded: true` envelope (or hard-fails in gate-mode) instead of diffing
|
|
@@ -140,7 +140,7 @@ const AUDIT_STORY_AXIS_LABELS = Object.freeze([
|
|
|
140
140
|
name: AGENT_LABELS.READY,
|
|
141
141
|
color: hex(LABEL_COLORS.AGENT),
|
|
142
142
|
description:
|
|
143
|
-
'Parking state — frozen dispatch manifest exists; awaiting local /deliver',
|
|
143
|
+
'Parking state — frozen dispatch manifest exists; awaiting local /mandrel-deliver',
|
|
144
144
|
},
|
|
145
145
|
{
|
|
146
146
|
name: RISK_LABELS.HIGH,
|
|
@@ -292,7 +292,7 @@ export function buildStoryBody({ group, edges = [], issueByGroupKey = null }) {
|
|
|
292
292
|
};
|
|
293
293
|
|
|
294
294
|
// The `---` / `blocked by #N` footer is the canonical serializer's own, so
|
|
295
|
-
// the body round-trips through `parse()` and `/deliver`'s resolver reads the
|
|
295
|
+
// the body round-trips through `parse()` and `/mandrel-deliver`'s resolver reads the
|
|
296
296
|
// ordering from the same place it reads every other Story's.
|
|
297
297
|
const canonicalSections = serialize(storyBody, {
|
|
298
298
|
includeFooter: storyBody.depends_on.length > 0,
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* lib/audit-to-stories/seed-from-findings.js
|
|
3
3
|
*
|
|
4
|
-
* Build the `/plan --seed`-shaped one-pager markdown that the audit-to-
|
|
5
|
-
* stories Single-plan grouping path emits for `/plan` to consume.
|
|
4
|
+
* Build the `/mandrel-plan --seed`-shaped one-pager markdown that the audit-to-
|
|
5
|
+
* stories Single-plan grouping path emits for `/mandrel-plan` to consume.
|
|
6
6
|
*
|
|
7
7
|
* The seed renders the canonical one-pager sections so the authoring
|
|
8
8
|
* pass can sharpen it without having to invent context:
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* - Recommended Direction (rollup of recommendations by dimension)
|
|
11
11
|
* - Key Assumptions (carries the source-report links forward)
|
|
12
12
|
* - MVP Scope (the proposed Stories, one bullet per group)
|
|
13
|
-
* - Key Files (explicit file paths so `/plan` authoring has concrete
|
|
13
|
+
* - Key Files (explicit file paths so `/mandrel-plan` authoring has concrete
|
|
14
14
|
* anchors)
|
|
15
15
|
* - Not Doing (out-of-scope items by convention)
|
|
16
16
|
*
|
|
@@ -97,8 +97,8 @@ function formatMVPScope(groups) {
|
|
|
97
97
|
const dims = g.dimensions.join(' / ');
|
|
98
98
|
const file = g.files[0] ? ` (\`${g.files[0]}\`)` : '';
|
|
99
99
|
// Carry each group's fingerprint (and location-based semantic-key)
|
|
100
|
-
// footer into the seed so a Story authored from it via `/plan` inherits
|
|
101
|
-
// the dedup identity — without this the recommended `/plan --seed-file`
|
|
100
|
+
// footer into the seed so a Story authored from it via `/mandrel-plan` inherits
|
|
101
|
+
// the dedup identity — without this the recommended `/mandrel-plan --seed-file`
|
|
102
102
|
// path is invisible to the next sweep's dedup (Story #4626). The footers
|
|
103
103
|
// are HTML comments, so they never render in the visible one-pager but
|
|
104
104
|
// stay machine-readable for the dedup probe.
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* edges**. Both halves are written:
|
|
18
18
|
*
|
|
19
19
|
* 1. The **body footer** (`---` / `blocked by #N`) — canonical, parsed by
|
|
20
|
-
* `/deliver`'s resolver, and the fallback when the dependencies API is
|
|
20
|
+
* `/mandrel-deliver`'s resolver, and the fallback when the dependencies API is
|
|
21
21
|
* unavailable.
|
|
22
22
|
* 2. The **native `blocked_by` relation** — visible in the GitHub UI,
|
|
23
23
|
* readable without parsing markdown, and settable by an operator later.
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* The verification is **static**: we inspect `package.json` for a known BDD
|
|
14
14
|
* runner dependency, and consult a small lookup table of which runners
|
|
15
15
|
* support which pending/skip tag. We do not boot the runner. This keeps
|
|
16
|
-
* `/plan` Phase 7 hermetic and offline.
|
|
16
|
+
* `/mandrel-plan` Phase 7 hermetic and offline.
|
|
17
17
|
*
|
|
18
18
|
* **Workspace awareness (Story #2956).** In a pnpm / npm / yarn monorepo the
|
|
19
19
|
* BDD runner is rarely a root devDependency — it lives in the workspace
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* bdd-scenario-budget.js — envelope byte budget for the `bddScenarios`
|
|
3
|
-
* `/plan` context-envelope field (Story #4977).
|
|
3
|
+
* `/mandrel-plan` context-envelope field (Story #4977).
|
|
4
4
|
*
|
|
5
5
|
* `bdd-scenario-scanner.js`'s `scanBddScenarios` stays a faithful, uncapped
|
|
6
6
|
* index of the project's `.feature` corpus — that scan is also used
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* bdd-scenario-scanner.js — Gherkin scenario index for /plan Phase 7.
|
|
2
|
+
* bdd-scenario-scanner.js — Gherkin scenario index for /mandrel-plan Phase 7.
|
|
3
3
|
*
|
|
4
4
|
* Story #2637 (sibling to #2636's file-assumption gate; the #2634 and #2635
|
|
5
5
|
* planner-grounding siblings were retired in Story #4811). The Acceptance
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* alone — it never inspects the consumer project's existing `.feature`
|
|
9
9
|
* files. Planned ACs frequently duplicate scenarios that already exist or
|
|
10
10
|
* re-specify behaviour the codebase already proves; the duplication is
|
|
11
|
-
* only discovered (at best) during `/deliver` or (at worst) after
|
|
11
|
+
* only discovered (at best) during `/mandrel-deliver` or (at worst) after
|
|
12
12
|
* a redundant PR ships.
|
|
13
13
|
*
|
|
14
14
|
* `scanBddScenarios` walks every configured feature root, parses each
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
* have a matching scenario.
|
|
22
22
|
*
|
|
23
23
|
* Determinism is load-bearing: the matcher is keyword-based, not
|
|
24
|
-
* embedding-based, so re-running `/plan` against the same
|
|
24
|
+
* embedding-based, so re-running `/mandrel-plan` against the same
|
|
25
25
|
* acceptance spec produces the same disposition annotations.
|
|
26
26
|
*/
|
|
27
27
|
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* 1. **Discovery** — which files under a scope's `stepRoots` hold step
|
|
10
10
|
* definitions, and which `.feature` files sit under its `featureRoots`.
|
|
11
11
|
* Feature discovery is delegated to `listFeatureFiles` in
|
|
12
|
-
* `bdd-scenario-scanner.js` rather than copied: /plan's scenario index and
|
|
12
|
+
* `bdd-scenario-scanner.js` rather than copied: /mandrel-plan's scenario index and
|
|
13
13
|
* this gate must agree on what counts as a feature file, and two walkers
|
|
14
14
|
* would eventually disagree.
|
|
15
15
|
* 2. **Matching** — turn each definition's Cucumber expression or regular
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* - `enforce_admins: true` — admins do not bypass the prGate suite.
|
|
8
8
|
* - `required_pull_request_reviews.required_approving_review_count: 0` —
|
|
9
9
|
* CI is the gate; the operator monitors and iterates the open PR
|
|
10
|
-
* to green via `/deliver`'s Phase 7 watch loop.
|
|
10
|
+
* to green via `/mandrel-deliver`'s Phase 7 watch loop.
|
|
11
11
|
*
|
|
12
12
|
* Behaviour rules
|
|
13
13
|
* ---------------
|
|
@@ -112,8 +112,8 @@ export function buildManualInstructions({ stagePaths, baseBranch }) {
|
|
|
112
112
|
` git push -u origin ${baseBranch}`,
|
|
113
113
|
'',
|
|
114
114
|
'Story delivery runs in git worktrees that check out tracked files only,',
|
|
115
|
-
'so the .agents/ wiring MUST be committed before any /deliver or',
|
|
116
|
-
'/deliver run — otherwise the worktree has no scripts and breaks.',
|
|
115
|
+
'so the .agents/ wiring MUST be committed before any /mandrel-deliver or',
|
|
116
|
+
'/mandrel-deliver run — otherwise the worktree has no scripts and breaks.',
|
|
117
117
|
].join('\n');
|
|
118
118
|
}
|
|
119
119
|
|
|
@@ -325,7 +325,7 @@ function renderConformanceWorkflow() {
|
|
|
325
325
|
# Generated by agents-bootstrap-github. Runs the canonical story-body parser
|
|
326
326
|
# against human-opened type::story issues and comments when the
|
|
327
327
|
# body does not round-trip, instead of letting the supported human entry
|
|
328
|
-
# points (e.g. /plan from an existing Epic ID) fail silently later. The lint
|
|
328
|
+
# points (e.g. /mandrel-plan from an existing Epic ID) fail silently later. The lint
|
|
329
329
|
# informs; it never fails the issue. Re-run /agents-bootstrap-github to refresh.
|
|
330
330
|
name: Issue Body Conformance
|
|
331
331
|
|
|
@@ -26,7 +26,7 @@ export default {
|
|
|
26
26
|
severity: 'blocker',
|
|
27
27
|
// 'npm-test' keeps the test-wrapper preflight's refusal claim true: a
|
|
28
28
|
// poisoned shared config is caught before a suite (or N concurrent
|
|
29
|
-
// /deliver workers) inherits it, not only at close/retro time (#4580).
|
|
29
|
+
// /mandrel-deliver workers) inherits it, not only at close/retro time (#4580).
|
|
30
30
|
scope: ['story-close', 'retro', 'npm-test'],
|
|
31
31
|
autoCorrect: 'refuse-and-print',
|
|
32
32
|
detect(state) {
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*
|
|
12
12
|
* Scope: 'story-close', 'retro'. The check runs at every
|
|
13
13
|
* preflight surface that has the opportunity to invoke Story init —
|
|
14
|
-
* primarily `/deliver`'s init step — and surfaces as a retro audit
|
|
14
|
+
* primarily `/mandrel-deliver`'s init step — and surfaces as a retro audit
|
|
15
15
|
* signal if the failure mode resurfaces during a sprint.
|
|
16
16
|
*
|
|
17
17
|
* The check is `refuse-and-print`. Auto-rewriting an orchestration call
|
|
@@ -253,7 +253,7 @@ export function parseSprintArgs(
|
|
|
253
253
|
process.env.AGENT_WORKTREE_ROOT ||
|
|
254
254
|
null,
|
|
255
255
|
recutOf: parseTicketId(values['recut-of']),
|
|
256
|
-
// Story #4253: pre-resolved Epic linkage threaded by the /deliver
|
|
256
|
+
// Story #4253: pre-resolved Epic linkage threaded by the /mandrel-deliver
|
|
257
257
|
// fan-out so `single-story-init.js` can skip redundant Epic lookups when
|
|
258
258
|
// the parent already threaded Epic context (pre-v2; field retained for
|
|
259
259
|
// CLI compatibility).
|
|
@@ -36,7 +36,7 @@ export function applyHeader(content, header) {
|
|
|
36
36
|
* True when a workflow opts out of slash-command projection via a
|
|
37
37
|
* `command: false` key in its YAML frontmatter (#4482). Used for dual-use
|
|
38
38
|
* lens files (e.g. `audit-security.md`) that stay in
|
|
39
|
-
* the payload as `/deliver` audit-suite prompts but must NOT surface as
|
|
39
|
+
* the payload as `/mandrel-deliver` audit-suite prompts but must NOT surface as
|
|
40
40
|
* standalone slash commands because the host ships a native equivalent.
|
|
41
41
|
*
|
|
42
42
|
* Both `sync-claude-commands.js` (projection + orphan-reap) and the
|
|
@@ -36,7 +36,7 @@ export const DELIVERY_ROUTING_DEFAULTS = Object.freeze({
|
|
|
36
36
|
/** @type {'minimal'|'standard'|'strict'} */
|
|
37
37
|
ceremonyProfile: 'standard',
|
|
38
38
|
/**
|
|
39
|
-
* When true (default), attended `/deliver` lands through merge in one
|
|
39
|
+
* When true (default), attended `/mandrel-deliver` lands through merge in one
|
|
40
40
|
* close (`--wait-merge` semantics) instead of stopping at `agent::closing`.
|
|
41
41
|
* Operators opt out per-run with `--no-wait-merge`.
|
|
42
42
|
*/
|
|
@@ -266,7 +266,7 @@ const PREFIX_MEANINGS = Object.freeze([
|
|
|
266
266
|
const BLOCK_MEANINGS = Object.freeze({
|
|
267
267
|
project: 'Project identity, paths, and command configuration.',
|
|
268
268
|
github: 'GitHub provider identity and merge/notification policy.',
|
|
269
|
-
planning: 'Inputs and guardrails for /plan.',
|
|
269
|
+
planning: 'Inputs and guardrails for /mandrel-plan.',
|
|
270
270
|
delivery: 'Execution, isolation, quality, and CI settings for delivery.',
|
|
271
271
|
qa: 'Agent-driven QA harness contract.',
|
|
272
272
|
});
|