mandrel 2.64.0 → 2.66.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/agents/acceptance-critic.md +8 -7
- package/.agents/agents/auditor.md +20 -20
- package/.agents/agents/plan-critic.md +8 -7
- package/.agents/agents/story-worker.md +7 -7
- package/.agents/audit-checklists/quality.md +3 -0
- package/.agents/docs/agentrc-reference.json +1 -9
- package/.agents/docs/configuration.md +8 -7
- package/.agents/docs/execution-reference.md +27 -5
- package/.agents/instructions.md +10 -12
- package/.agents/rules/ci-remediation.md +3 -3
- package/.agents/rules/gherkin-standards.md +3 -2
- package/.agents/rules/git-conventions-reference.md +12 -3
- package/.agents/rules/git-conventions.md +9 -7
- package/.agents/rules/testing-standards.md +8 -7
- package/.agents/runtime-deps.json +1 -1
- package/.agents/schemas/agentrc.schema.json +6 -13
- package/.agents/schemas/audit-rules.schema.json +1 -1
- package/.agents/schemas/story-deliver-terminal.schema.json +5 -0
- package/.agents/scripts/bootstrap.js +102 -91
- package/.agents/scripts/check-context-budget.js +1 -1
- package/.agents/scripts/lib/ITicketingProvider.js +1 -3
- package/.agents/scripts/lib/audit-suite/findings.js +1 -17
- package/.agents/scripts/lib/audit-suite/frontmatter.js +0 -28
- package/.agents/scripts/lib/audit-suite/index.js +0 -6
- package/.agents/scripts/lib/audit-suite/selector.js +0 -31
- package/.agents/scripts/lib/baselines/duplication-scanner.js +17 -7
- package/.agents/scripts/lib/bootstrap/agents-md-fold.js +156 -0
- package/.agents/scripts/lib/bootstrap/commit-push.js +1 -1
- package/.agents/scripts/lib/bootstrap/manifest.js +2 -2
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +91 -107
- package/.agents/scripts/lib/cli/standard-args.js +60 -76
- package/.agents/scripts/lib/cli-args.js +26 -0
- package/.agents/scripts/lib/config/gates/shared.js +3 -3
- package/.agents/scripts/lib/config/review-chain-default.js +13 -0
- package/.agents/scripts/lib/config-settings-schema-delivery.js +2 -2
- package/.agents/scripts/lib/config-settings-schema-quality.js +11 -13
- package/.agents/scripts/lib/doc-tiers.js +25 -6
- package/.agents/scripts/lib/feedback-loop/graduate-steps.js +205 -0
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +47 -782
- package/.agents/scripts/lib/feedback-loop/graduator-gh.js +449 -0
- package/.agents/scripts/lib/generated/agentrc-validator.js +1 -1
- package/.agents/scripts/lib/observability/close-telemetry.js +330 -0
- package/.agents/scripts/lib/observability/metrics-ledger.js +0 -72
- package/.agents/scripts/lib/observability/runtime-friction.js +2 -0
- package/.agents/scripts/lib/observability/signal-validator.js +17 -5
- package/.agents/scripts/lib/orchestration/code-review.js +33 -6
- package/.agents/scripts/lib/orchestration/epic-rollup.js +29 -12
- package/.agents/scripts/lib/orchestration/merge-block-class.js +20 -4
- package/.agents/scripts/lib/orchestration/merge-poll.js +41 -22
- package/.agents/scripts/lib/orchestration/plan-metrics.js +76 -63
- package/.agents/scripts/lib/orchestration/required-checks.js +147 -0
- package/.agents/scripts/lib/orchestration/review-providers/code-review.js +203 -0
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +29 -4
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +3 -2
- package/.agents/scripts/lib/orchestration/run-epilogue.js +6 -0
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +1 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +2 -12
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +370 -268
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +21 -7
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +112 -82
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +4 -0
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +393 -313
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +12 -87
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +3 -0
- package/.agents/scripts/lib/orchestration/ticket-validator.js +19 -36
- package/.agents/scripts/lib/signals/detectors/common.js +63 -51
- package/.agents/scripts/lib/templates/decomposer-prompts.js +5 -24
- package/.agents/scripts/lib/transpile.js +28 -3
- package/.agents/scripts/providers/github/issues.js +14 -23
- package/.agents/scripts/single-story-close.js +10 -2
- package/.agents/scripts/single-story-confirm-merge.js +267 -238
- package/.agents/scripts/sync-claude-agents.js +1 -1
- package/.agents/skills/core/idea-refinement/SKILL.md +6 -6
- package/.agents/skills/stack/qa/qa-harness/SKILL.md +1 -2
- package/.agents/workflows/audit-architecture.md +5 -4
- package/.agents/workflows/audit-documentation.md +5 -5
- package/.agents/workflows/audit-performance.md +10 -10
- package/.agents/workflows/audit-quality.md +42 -7
- package/.agents/workflows/helpers/acceptance-self-eval.md +9 -9
- package/.agents/workflows/helpers/audit-lens-core.md +30 -57
- package/.agents/workflows/helpers/code-review.md +15 -38
- package/.agents/workflows/helpers/deliver-digest.md +2 -2
- package/.agents/workflows/helpers/deliver-reference.md +7 -3
- package/.agents/workflows/helpers/deliver-story.md +9 -1
- package/.agents/workflows/helpers/parallel-tooling.md +16 -18
- package/.agents/workflows/helpers/plan-reference.md +9 -8
- package/.agents/workflows/mandrel-deliver.md +3 -2
- package/.agents/workflows/mandrel-plan.md +11 -7
- package/.agents/workflows/mandrel-update.md +5 -3
- package/docs/CHANGELOG.md +57 -0
- package/lib/cli/claude-code-version.js +73 -0
- package/lib/cli/doctor.js +2 -2
- package/lib/cli/guarded-sync.js +87 -0
- package/lib/cli/registry.js +9 -0
- package/lib/cli/sync-agents.js +9 -92
- package/lib/cli/sync-commands.js +9 -101
- package/lib/cli/uninstall.js +37 -9
- package/lib/migrations/index.js +2 -0
- package/lib/migrations/steps/2.65.0-fold-claude-md-into-agents-md.js +38 -0
- package/package.json +3 -2
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +0 -99
- package/.agents/scripts/lib/audit-suite/runner.js +0 -205
- package/.agents/scripts/lib/audit-suite/substitutions.js +0 -96
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +0 -37
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +0 -234
|
@@ -2,17 +2,18 @@
|
|
|
2
2
|
name: acceptance-critic
|
|
3
3
|
description: >-
|
|
4
4
|
Role-scoped boot context for a maker-blind acceptance critic. Booted on its
|
|
5
|
-
own system prompt (no
|
|
5
|
+
own system prompt (no entry-doc / instructions.md closure). Scores a delivered
|
|
6
6
|
diff against the Story's acceptance criteria and emits the verdict schema —
|
|
7
7
|
without seeing the maker's self-assessment. Dispatched by
|
|
8
8
|
helpers/deliver-story Step 1a under ceremonyProfile strict, the one profile
|
|
9
9
|
whose verdict owner is a fresh critic.
|
|
10
|
+
effort: medium
|
|
10
11
|
---
|
|
11
12
|
|
|
12
13
|
<!--
|
|
13
14
|
Shared common core — byte-identical across every `.agents/agents/*.md` role
|
|
14
|
-
context, ordered FIRST so
|
|
15
|
-
|
|
15
|
+
context, ordered FIRST so every role binds the same baseline rules (the
|
|
16
|
+
roles pin different effort levels and share no cache prefix; delta last).
|
|
16
17
|
Edit it in every role file at once —
|
|
17
18
|
tests/bootstrap/agent-shared-prefix.test.js fails on any divergence.
|
|
18
19
|
security-baseline stays inviolable and single-sourced — @-import it, never
|
|
@@ -24,15 +25,15 @@ description: >-
|
|
|
24
25
|
@../../.agents/rules/security-baseline.md
|
|
25
26
|
|
|
26
27
|
You are a **role-scoped Mandrel sub-agent** booted on this focused prompt
|
|
27
|
-
alone — no `
|
|
28
|
+
alone — no entry-doc (`AGENTS.md` / `CLAUDE.md`) closure is loaded. The security
|
|
28
29
|
baseline imported above is inviolable. Your role charter begins at the
|
|
29
30
|
role-delta marker below; the workflow prose your caller hands you supplies
|
|
30
31
|
the step-by-step. This shared core binds every role:
|
|
31
32
|
|
|
32
33
|
- **Non-interactive.** You have no input channel mid-run. Never ask
|
|
33
|
-
clarifying questions —
|
|
34
|
-
your
|
|
35
|
-
blocked/failure path instead of stalling.
|
|
34
|
+
clarifying questions — take the reading your charter most directly
|
|
35
|
+
supports, name it in your return, and when you cannot proceed, take
|
|
36
|
+
your role's blocked/failure path instead of stalling.
|
|
36
37
|
- **Absolute paths only.** Your shell's working directory is not guaranteed
|
|
37
38
|
to persist between calls; pass absolute paths for every file and script.
|
|
38
39
|
- **Anti-thrashing.** When the same error class recurs despite the same fix,
|
|
@@ -2,17 +2,18 @@
|
|
|
2
2
|
name: auditor
|
|
3
3
|
description: >-
|
|
4
4
|
Role-scoped boot context for a single read-only audit lens, booted on its own
|
|
5
|
-
system prompt (no
|
|
5
|
+
system prompt (no entry-doc / instructions.md closure). Carries the shared
|
|
6
6
|
audit machinery standalone — the read-only MUSTs, the finding-block skeleton,
|
|
7
7
|
the severity scale, and the self-cross-check bar — so a lens dispatch needs
|
|
8
8
|
only the lens's own dimensions. Dispatched as subagent_type: auditor by every
|
|
9
9
|
audit-<lens> workflow's first-class execution path.
|
|
10
|
+
effort: medium
|
|
10
11
|
---
|
|
11
12
|
|
|
12
13
|
<!--
|
|
13
14
|
Shared common core — byte-identical across every `.agents/agents/*.md` role
|
|
14
|
-
context, ordered FIRST so
|
|
15
|
-
|
|
15
|
+
context, ordered FIRST so every role binds the same baseline rules (the
|
|
16
|
+
roles pin different effort levels and share no cache prefix; delta last).
|
|
16
17
|
Edit it in every role file at once —
|
|
17
18
|
tests/bootstrap/agent-shared-prefix.test.js fails on any divergence.
|
|
18
19
|
security-baseline stays inviolable and single-sourced — @-import it, never
|
|
@@ -24,15 +25,15 @@ description: >-
|
|
|
24
25
|
@../../.agents/rules/security-baseline.md
|
|
25
26
|
|
|
26
27
|
You are a **role-scoped Mandrel sub-agent** booted on this focused prompt
|
|
27
|
-
alone — no `
|
|
28
|
+
alone — no entry-doc (`AGENTS.md` / `CLAUDE.md`) closure is loaded. The security
|
|
28
29
|
baseline imported above is inviolable. Your role charter begins at the
|
|
29
30
|
role-delta marker below; the workflow prose your caller hands you supplies
|
|
30
31
|
the step-by-step. This shared core binds every role:
|
|
31
32
|
|
|
32
33
|
- **Non-interactive.** You have no input channel mid-run. Never ask
|
|
33
|
-
clarifying questions —
|
|
34
|
-
your
|
|
35
|
-
blocked/failure path instead of stalling.
|
|
34
|
+
clarifying questions — take the reading your charter most directly
|
|
35
|
+
supports, name it in your return, and when you cannot proceed, take
|
|
36
|
+
your role's blocked/failure path instead of stalling.
|
|
36
37
|
- **Absolute paths only.** Your shell's working directory is not guaranteed
|
|
37
38
|
to persist between calls; pass absolute paths for every file and script.
|
|
38
39
|
- **Anti-thrashing.** When the same error class recurs despite the same fix,
|
|
@@ -115,13 +116,12 @@ and a surviving **Critical** halts the delivery gate:
|
|
|
115
116
|
- **Info** — the floor: a grounded observation asking for no scheduled work
|
|
116
117
|
(accepts `Informational`). Never a home for findings that fail the bar below.
|
|
117
118
|
|
|
118
|
-
## Self-cross-check bar
|
|
119
|
+
## Self-cross-check bar
|
|
119
120
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
violates) — never "this looks wrong"; **in-scope** under the scope filter; and
|
|
121
|
+
A finding goes in the report only when **all** hold: a **grounded**
|
|
122
|
+
`path:line` you actually read; **reproducible evidence** (a tool reading, a
|
|
123
|
+
quoted snippet, or a specific standard it violates) — never "this looks
|
|
124
|
+
wrong"; **in-scope** under the scope filter; and
|
|
125
125
|
an **actionable** recommendation. Drop anything resting on a sanctioned test
|
|
126
126
|
seam, an entry point / public API surface, dynamic/framework reachability, an
|
|
127
127
|
intentional documented deviation, or a formatter-governed style nit.
|
|
@@ -135,14 +135,14 @@ Beside it, carry one machine-readable tally of the findings you kept —
|
|
|
135
135
|
included, `Info` never counted. `audit-to-stories` cross-checks that line
|
|
136
136
|
against its parse and refuses a report whose tally is missing or wrong.
|
|
137
137
|
|
|
138
|
-
## Fan-out (
|
|
138
|
+
## Fan-out (operator-requested only)
|
|
139
139
|
|
|
140
|
-
When your caller dispatches you for a
|
|
141
|
-
|
|
142
|
-
that dimension and return its findings;
|
|
143
|
-
results under this self-cross-check bar.
|
|
144
|
-
|
|
145
|
-
|
|
140
|
+
By default you audit the whole lens. When your caller dispatches you for a
|
|
141
|
+
single dimension — which it does only on an explicit operator request for
|
|
142
|
+
per-dimension fan-out — audit only that dimension and return its findings;
|
|
143
|
+
the caller merges the per-dimension results under this self-cross-check bar.
|
|
144
|
+
You never dispatch sub-agents of your own: no nested fan-out, whatever the
|
|
145
|
+
lens's size.
|
|
146
146
|
|
|
147
147
|
## Return contract
|
|
148
148
|
|
|
@@ -2,17 +2,18 @@
|
|
|
2
2
|
name: plan-critic
|
|
3
3
|
description: >-
|
|
4
4
|
Role-scoped boot context for a maker-blind plan critic. Booted on its own
|
|
5
|
-
system prompt (no
|
|
5
|
+
system prompt (no entry-doc / instructions.md closure). Reviews an authored
|
|
6
6
|
plan draft (stories.json, optional techspec.md) against the pre-mortem
|
|
7
7
|
charter and returns findings, without seeing the planner's authoring
|
|
8
8
|
transcript. Dispatched on an operator-requested plan-critics.js verdict
|
|
9
9
|
when delivery.routing.roleScopedAgents is enabled (the default).
|
|
10
|
+
effort: medium
|
|
10
11
|
---
|
|
11
12
|
|
|
12
13
|
<!--
|
|
13
14
|
Shared common core — byte-identical across every `.agents/agents/*.md` role
|
|
14
|
-
context, ordered FIRST so
|
|
15
|
-
|
|
15
|
+
context, ordered FIRST so every role binds the same baseline rules (the
|
|
16
|
+
roles pin different effort levels and share no cache prefix; delta last).
|
|
16
17
|
Edit it in every role file at once —
|
|
17
18
|
tests/bootstrap/agent-shared-prefix.test.js fails on any divergence.
|
|
18
19
|
security-baseline stays inviolable and single-sourced — @-import it, never
|
|
@@ -24,15 +25,15 @@ description: >-
|
|
|
24
25
|
@../../.agents/rules/security-baseline.md
|
|
25
26
|
|
|
26
27
|
You are a **role-scoped Mandrel sub-agent** booted on this focused prompt
|
|
27
|
-
alone — no `
|
|
28
|
+
alone — no entry-doc (`AGENTS.md` / `CLAUDE.md`) closure is loaded. The security
|
|
28
29
|
baseline imported above is inviolable. Your role charter begins at the
|
|
29
30
|
role-delta marker below; the workflow prose your caller hands you supplies
|
|
30
31
|
the step-by-step. This shared core binds every role:
|
|
31
32
|
|
|
32
33
|
- **Non-interactive.** You have no input channel mid-run. Never ask
|
|
33
|
-
clarifying questions —
|
|
34
|
-
your
|
|
35
|
-
blocked/failure path instead of stalling.
|
|
34
|
+
clarifying questions — take the reading your charter most directly
|
|
35
|
+
supports, name it in your return, and when you cannot proceed, take
|
|
36
|
+
your role's blocked/failure path instead of stalling.
|
|
36
37
|
- **Absolute paths only.** Your shell's working directory is not guaranteed
|
|
37
38
|
to persist between calls; pass absolute paths for every file and script.
|
|
38
39
|
- **Anti-thrashing.** When the same error class recurs despite the same fix,
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
name: story-worker
|
|
3
3
|
description: >-
|
|
4
4
|
Role-scoped boot context for a single Story delivery child, booted on its own
|
|
5
|
-
system prompt (no
|
|
5
|
+
system prompt (no entry-doc / instructions.md closure). Carries the
|
|
6
6
|
load-bearing delivery MUSTs standalone. Dispatched by helpers/deliver-story
|
|
7
7
|
when delivery.routing.roleScopedAgents is enabled (the default).
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
<!--
|
|
11
11
|
Shared common core — byte-identical across every `.agents/agents/*.md` role
|
|
12
|
-
context, ordered FIRST so
|
|
13
|
-
|
|
12
|
+
context, ordered FIRST so every role binds the same baseline rules (the
|
|
13
|
+
roles pin different effort levels and share no cache prefix; delta last).
|
|
14
14
|
Edit it in every role file at once —
|
|
15
15
|
tests/bootstrap/agent-shared-prefix.test.js fails on any divergence.
|
|
16
16
|
security-baseline stays inviolable and single-sourced — @-import it, never
|
|
@@ -22,15 +22,15 @@ description: >-
|
|
|
22
22
|
@../../.agents/rules/security-baseline.md
|
|
23
23
|
|
|
24
24
|
You are a **role-scoped Mandrel sub-agent** booted on this focused prompt
|
|
25
|
-
alone — no `
|
|
25
|
+
alone — no entry-doc (`AGENTS.md` / `CLAUDE.md`) closure is loaded. The security
|
|
26
26
|
baseline imported above is inviolable. Your role charter begins at the
|
|
27
27
|
role-delta marker below; the workflow prose your caller hands you supplies
|
|
28
28
|
the step-by-step. This shared core binds every role:
|
|
29
29
|
|
|
30
30
|
- **Non-interactive.** You have no input channel mid-run. Never ask
|
|
31
|
-
clarifying questions —
|
|
32
|
-
your
|
|
33
|
-
blocked/failure path instead of stalling.
|
|
31
|
+
clarifying questions — take the reading your charter most directly
|
|
32
|
+
supports, name it in your return, and when you cannot proceed, take
|
|
33
|
+
your role's blocked/failure path instead of stalling.
|
|
34
34
|
- **Absolute paths only.** Your shell's working directory is not guaranteed
|
|
35
35
|
to persist between calls; pass absolute paths for every file and script.
|
|
36
36
|
- **Anti-thrashing.** When the same error class recurs despite the same fix,
|
|
@@ -21,3 +21,6 @@ Self-check your change against this lens's concerns before you ship:
|
|
|
21
21
|
- [ ] Unwired Seams — Coverage Without a Caller (mandatory).
|
|
22
22
|
- [ ] A produced-but-never-consumed artifact
|
|
23
23
|
- [ ] An optional field nothing populates
|
|
24
|
+
- [ ] Property-Based Coverage — Invariants Tested Only by Examples.
|
|
25
|
+
- [ ] Toolchain by ecosystem, never one library.
|
|
26
|
+
- [ ] Name the property.
|
|
@@ -223,17 +223,9 @@
|
|
|
223
223
|
"name": "native"
|
|
224
224
|
},
|
|
225
225
|
{
|
|
226
|
-
"name": "
|
|
226
|
+
"name": "code-review",
|
|
227
227
|
"scopes": ["story"],
|
|
228
228
|
"optional": true
|
|
229
|
-
},
|
|
230
|
-
{
|
|
231
|
-
"name": "ultrareview",
|
|
232
|
-
"scopes": ["story"],
|
|
233
|
-
"manualPrompt": true,
|
|
234
|
-
"when": {
|
|
235
|
-
"label": "risk::high"
|
|
236
|
-
}
|
|
237
229
|
}
|
|
238
230
|
],
|
|
239
231
|
"autoFixSeverity": "medium"
|
|
@@ -229,12 +229,12 @@ Everything `/mandrel-deliver` and `single-story-close` consume: worktree isolati
|
|
|
229
229
|
| `quality.navigability.routeGlobs` | No | `array<string>` | `[]` | Glob patterns (pages/**, app/**/route.ts) marking paths that add a user-facing route — the route-tree SSOT the navigability lens enumerates and the route-added routing predicate matches against. |
|
|
230
230
|
| `quality.navigability.navRegistry` | No | `array<string>` | `[]` | Tokens identifying the nav-registry SSOT the navigability lens checks every route resolves a nav door against. |
|
|
231
231
|
| `quality.navigability.journeySuite` | No | `string` | — | Path or command for the per-persona journey suite /mandrel-deliver's per-Story ceremony runs. |
|
|
232
|
-
| `mergeWatch` | No | `object` | — | Knobs consumed by the close-and-land merge wait (Story #4543). `mode` (Story #4698) selects the close-time merge posture. `maxWaitSeconds` bounds ONE invocation of the merge wait and its expiry returns a resumable `pending` terminal with no label mutation; `maxBudgetSeconds` bounds the CUMULATIVE wait across resumes (anchored at the PR's createdAt, so a resume does not restart the clock) and exhausting it is the genuine give-up that classifies and blocks. The
|
|
232
|
+
| `mergeWatch` | No | `object` | — | Knobs consumed by the close-and-land merge wait (Story #4543). `mode` (Story #4698) selects the close-time merge posture. `maxWaitSeconds` bounds ONE invocation of the merge wait and its expiry returns a resumable `pending` terminal with no label mutation; `maxBudgetSeconds` bounds the CUMULATIVE wait across resumes (anchored at the PR's createdAt, so a resume does not restart the clock) and exhausting it is the genuine give-up that classifies and blocks. The poll cadence is internal (at most 30s while checks run, at most 10s once they are green and the PR is unmerged); it and the cap of 3 behind-the-base updates are not configurable. |
|
|
233
233
|
| `mergeWatch.mode` | No | `"sync"` \| `"async"` | — | Close-time merge-wait posture (Story #4698). `sync` (default) keeps the in-close foreground merge wait unchanged. `async` caps the per-invocation wait to a short ~60s probe window — long enough to catch an instant merge and, via the head-anchored required-check predicate, an instantly-red required check — then returns the resumable `pending` terminal (exit 3) with a `nextCommand`. Opt in when slow CI makes the foreground wait routinely expire: the worker launches `nextCommand` in the background instead of burning the host tool slot polling. `maxBudgetSeconds` (the cumulative give-up) is unchanged. |
|
|
234
234
|
| `mergeWatch.maxWaitSeconds` | No | `integer` | — | Per-invocation merge-wait bound (seconds). Default 300 (5 minutes) — chosen to fit inside a single host tool invocation (~10 min ceiling) alongside the close gates that precede the wait. Expiry yields `pending` (exit 3), never a block. Headless callers with no host ceiling raise this to land in one block. |
|
|
235
235
|
| `mergeWatch.maxBudgetSeconds` | No | `integer` | `3600` | Cumulative wall-clock budget (seconds) across merge-wait resumes, anchored at the PR's createdAt. Default 3600 (60 minutes). Exhausting this classifies the block and transitions the Story to agent::blocked. |
|
|
236
236
|
| `codeReview` | No | `object` | — | Review-provider chain and on-branch remediation threshold for the /mandrel-deliver code-review ceremony. |
|
|
237
|
-
| `codeReview.providers[]` | No | `array<object>` | `[{"name":"native"},{"name":"
|
|
237
|
+
| `codeReview.providers[]` | No | `array<object>` | `[{"name":"native"},{"name":"code-review","scopes":["story"],"optional":true}]` | Review-provider chain (Story #2871). When unset or empty, falls back to this default: `native` (scoped lint + MI) then an optional story-scoped `code-review` — a low-effort `claude --print` bug review whose every finding is critical and halts close before auto-merge; hosts without the `claude` CLI skip it. `security-review` and `ultrareview` are opt-in. The orchestrator iterates inline entries in declaration order and merges their Finding[] before posting one structured comment; manual-prompt entries (e.g. ultrareview) contribute a trailing 'Manual review suggestions' section. Selecting an adapter whose probe fails hard-fails at factory construction unless declared `optional: true` in the chain. Each item has: name, scopes, optional, manualPrompt, when. |
|
|
238
238
|
| `codeReview.autoFixSeverity` | No | `"high"` \| `"medium"` | `"medium"` | 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. |
|
|
239
239
|
| `refactorStage` | No | `object` | — | Opt-in, config-gated post-green refactor checkpoint wired into story-deliver (Story #3430, Epic #3418). Strictly additive and default-OFF: when disabled, story-deliver behaves exactly as before. Advisory only — never changes existing close-validation gate semantics. |
|
|
240
240
|
| `refactorStage.enabled` | No | `boolean` | `false` | When true, story-deliver runs an advisory post-green refactor stage (core/code-review-and-quality skill, Post-Green Refactor Pass) after the suite is green. Default false — when unset the stage is skipped and close-validation gate semantics are unchanged. |
|
|
@@ -248,7 +248,7 @@ Everything `/mandrel-deliver` and `single-story-close` consume: worktree isolati
|
|
|
248
248
|
| `ci.advisoryAllowlist` | No | `array<string>` | `[]` | Story #5096. Check-run names exempt from blockOnAdvisoryFailure — a red run whose name matches exactly never blocks arming. Matching is exact; an unnamed run can never match and always blocks. |
|
|
249
249
|
| `ci.rerunAdvisory` | No | `integer` | `0` | Story #5266. How many times close may re-run a failed advisory workflow run before blocking on it, per close invocation. Default 0: close spends no CI minutes and issues no GitHub mutation on an advisory red unless asked. At n > 0 the failed run(s) are re-run within that allowance and the merge wait re-polls inside its existing budget, landing or blocking on the re-run verdict. Overridden per invocation by --rerun-advisory <n>. |
|
|
250
250
|
| `routing` | No | `object` | — | v2 delivery-spawn routing: role-scoped boot contexts and the ceremony profile. The v1 singleDelivery epic-route kill-switch was removed in Stage 6; the freshCriticSampleRate sampling floor was retired in Story #5313 and the derived-level ceremony routing in Story #5343. |
|
|
251
|
-
| `routing.roleScopedAgents` | No | `boolean` | `true` | Epic #4478 (M7-B). Kill-switch for the role-scoped boot contexts. When true (default), a converted delivery spawn (`story-worker`, `acceptance-critic`) boots on its own `.claude/agents/<role>.md` system prompt instead of re-paying the full CLAUDE.md @-import closure. When false, every converted spawn falls back to `subagent_type: general-purpose` — the instant, code-rollback-free per-consumer revert, and the universal escape for hosts that ignore `.claude/agents/`. The fallback is the full-closure agent that ran before M7-B, so flipping it off never drops a gate. |
|
|
251
|
+
| `routing.roleScopedAgents` | No | `boolean` | `true` | Epic #4478 (M7-B). Kill-switch for the role-scoped boot contexts. When true (default), a converted delivery spawn (`story-worker`, `acceptance-critic`) boots on its own `.claude/agents/<role>.md` system prompt instead of re-paying the full entry-doc (AGENTS.md or CLAUDE.md) @-import closure. When false, every converted spawn falls back to `subagent_type: general-purpose` — the instant, code-rollback-free per-consumer revert, and the universal escape for hosts that ignore `.claude/agents/`. The fallback is the full-closure agent that ran before M7-B, so flipping it off never drops a gate. |
|
|
252
252
|
| `routing.ceremonyProfile` | No | `"minimal"` \| `"standard"` \| `"strict"` | `"standard"` | Acceptance-ceremony depth — who authors the Story acceptance verdict. minimal and standard (default) = the inline self-eval, whatever the diff touches; strict = a fresh-context maker-blind critic. Review depth is a separate decision and still derives `deep` for any sensitive path (review-depth.js). |
|
|
253
253
|
| `routing.closeAndLand` | No | `boolean` | `true` | When true (default), single-story-close lands through merge in one close. Opt out per-run with --no-wait-merge. |
|
|
254
254
|
|
|
@@ -386,15 +386,16 @@ then skips `npm ci` and junctions/symlinks the donor's `node_modules`.
|
|
|
386
386
|
|
|
387
387
|
#### `delivery.codeReview` — provider chain
|
|
388
388
|
|
|
389
|
-
`providers[]` is iterated in declaration order (unset/empty →
|
|
390
|
-
|
|
389
|
+
`providers[]` is iterated in declaration order (unset/empty → `native` plus
|
|
390
|
+
an optional story-scoped `code-review`, the low-effort `claude --print` bug
|
|
391
|
+
review whose every finding is critical and halts close). Beyond the field list in the generated table: `scopes`
|
|
391
392
|
defaults to both `story` and `epic`; `when` is a label predicate (`when.label`
|
|
392
393
|
/ `when.labelAny`) that silently skips the entry when false; `manualPrompt`
|
|
393
394
|
entries contribute a one-line suggestion and do **not** affect severity counts
|
|
394
395
|
or the `halted` gate. **Cross-runtime contract:** manual-prompt providers emit
|
|
395
396
|
Markdown only and MUST NEVER throw under any host; inline providers that shell
|
|
396
|
-
out to a host-specific binary (e.g. `security-review` →
|
|
397
|
-
`claude --print
|
|
397
|
+
out to a host-specific binary (e.g. `code-review` / `security-review` →
|
|
398
|
+
`claude --print`) SHOULD be declared `optional: true` so
|
|
398
399
|
non-Claude consumers can pin the same `.agents/` version unmodified. The fix
|
|
399
400
|
budget (`maxFixAttempts` / `maxFixScopeFiles`) uses the same values for every
|
|
400
401
|
Story in a run — there is no per-Story override.
|
|
@@ -72,11 +72,12 @@ and schema mechanics are in [§ Friction telemetry](#friction-telemetry) above.
|
|
|
72
72
|
## FinOps & token budgeting (economic guardrails)
|
|
73
73
|
|
|
74
74
|
Mandrel does **not** enforce live LLM spend from response metadata. It bounds
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
Story sizing
|
|
78
|
-
stops. Consult this section when
|
|
79
|
-
|
|
75
|
+
one thing, a **fixed framework constant** rather than an operator knob that
|
|
76
|
+
**fails closed**: the assembled `/mandrel-plan` context envelope. Plan-time
|
|
77
|
+
Story sizing is not bounded (retired by Story #5312). Your host runtime
|
|
78
|
+
(editor / CLI) owns session quota and hard stops. Consult this section when
|
|
79
|
+
reasoning about why `/mandrel-plan` refused an over-ceiling envelope, or when
|
|
80
|
+
choosing the session effort and model for a command.
|
|
80
81
|
|
|
81
82
|
> **There is no configurable context budget.** `planning.context.maxBytes` /
|
|
82
83
|
> `summaryMode` were removed outright in Story #4541, along with the
|
|
@@ -126,3 +127,24 @@ over-ceiling envelope or an over-budget Story count.
|
|
|
126
127
|
nothing at plan time scores its authored mass.
|
|
127
128
|
- **Host runtime**: session billing, quota exhaustion, and operator overrides
|
|
128
129
|
are enforced by your provider (e.g. Claude Code), not by Mandrel scripts.
|
|
130
|
+
|
|
131
|
+
### Session effort and model
|
|
132
|
+
|
|
133
|
+
Effort is the operator's dial, set once per session. Pick it deliberately up
|
|
134
|
+
front, because changing effort mid-session invalidates the prompt cache for
|
|
135
|
+
everything that follows.
|
|
136
|
+
|
|
137
|
+
- **Recommended session effort.** `medium` for `/mandrel-deliver`: Stories
|
|
138
|
+
are well-scoped by construction, so delivery rarely needs more. `high` for
|
|
139
|
+
`/mandrel-plan`: a Spec defect costs a redraft or a blocked Story
|
|
140
|
+
downstream, which is dearer than the planning turn.
|
|
141
|
+
- **Role agents.** `story-worker` declares no effort and inherits the
|
|
142
|
+
session's (Story #5426). The evaluator roles (`acceptance-critic`,
|
|
143
|
+
`plan-critic`, `auditor`) pin `medium`.
|
|
144
|
+
- **Where pins live.** Effort and model pins belong only on role agents under
|
|
145
|
+
`.agents/agents/`, never in workflow or command frontmatter: a command that
|
|
146
|
+
pinned its own effort would change effort mid-session and break the prompt
|
|
147
|
+
cache.
|
|
148
|
+
- **Escalation is an operator step.** The Agent tool takes no per-call
|
|
149
|
+
effort, so no workflow can escalate on its own. Before resuming a blocked
|
|
150
|
+
Story, raise session effort one step; raise effort before switching models.
|
package/.agents/instructions.md
CHANGED
|
@@ -118,7 +118,7 @@ truncates with a note naming what was cut:
|
|
|
118
118
|
|
|
119
119
|
## 3. Core Philosophy
|
|
120
120
|
|
|
121
|
-
1. **Context First.** **Digest-first reading
|
|
121
|
+
1. **Context First.** **Digest-first reading:** never
|
|
122
122
|
ingest the whole `project.docsContextFiles` set up front — read the
|
|
123
123
|
docs digest and pull files on demand at the section it names. No
|
|
124
124
|
digest (ad hoc task, `docsContextFiles` unset, null `docsDigestPath`)
|
|
@@ -127,8 +127,10 @@ truncates with a note naming what was cut:
|
|
|
127
127
|
present. Always read the current Story's body (`## Spec` +
|
|
128
128
|
`acceptance[]` / `verify[]`); prefer targeted retrieval over broad
|
|
129
129
|
reads.
|
|
130
|
-
2. **Plan First.**
|
|
131
|
-
|
|
130
|
+
2. **Plan First.** Planned work carries its plan in the Story's
|
|
131
|
+
`## Spec`, authored via `/mandrel-plan`; an unplanned prompt takes
|
|
132
|
+
`/mandrel-deliver`'s light path, which escalates to `/mandrel-plan`
|
|
133
|
+
when its gate trips.
|
|
132
134
|
3. **Artifacts over Chat.** Write test/build/debug output to log
|
|
133
135
|
files, not into chat.
|
|
134
136
|
4. **Idempotency.** Scripts must be safe to run repeatedly.
|
|
@@ -137,16 +139,13 @@ truncates with a note naming what was cut:
|
|
|
137
139
|
|
|
138
140
|
## 4. Execution & Quality Discipline
|
|
139
141
|
|
|
140
|
-
- **Re-Plan on Failure.** If a strategy fails, STOP and re-plan.
|
|
141
142
|
- **Subagent Strategy.** Each spawn re-pays the full always-loaded
|
|
142
143
|
context — a cost decision. Prefer inline search for small lookups;
|
|
143
144
|
spawn only when the work justifies replicating context. One objective
|
|
144
145
|
per subagent; depth compounds the cost (every nested level re-pays).
|
|
145
|
-
- **
|
|
146
|
-
|
|
147
|
-
Remove unused imports, commented-out code, and dead branches before
|
|
146
|
+
- **No Dead Code.** Every edit leaves complete, runnable code. Remove
|
|
147
|
+
unused imports, commented-out code, and dead branches before
|
|
148
148
|
finalizing.
|
|
149
|
-
- **Verification.** Include explicit verification steps in every plan.
|
|
150
149
|
|
|
151
150
|
---
|
|
152
151
|
|
|
@@ -191,7 +190,6 @@ anything under it.
|
|
|
191
190
|
`/mandrel-plan` sizes each Story as a **capability slice a frontier model
|
|
192
191
|
delivers and self-verifies in one pass** — a broad footprint is normal
|
|
193
192
|
when the change is cohesive, and no plan-time ceiling scores it; do not
|
|
194
|
-
re-slice it into per-module fragments. On an out-of-scope task
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
validation.
|
|
193
|
+
re-slice it into per-module fragments. On an out-of-scope task,
|
|
194
|
+
**commit incrementally** per cohesive sub-step, and when a sub-step
|
|
195
|
+
fails validation, stop and apply § 1.I (re-plan or yield).
|
|
@@ -137,9 +137,9 @@ run — a blind fix to a suite nobody exercised is how the gap compounds.
|
|
|
137
137
|
|
|
138
138
|
`capacity` and `unreproducible-tier` name failures that are proven properties
|
|
139
139
|
of the **environment**: no commit on the branch can move the head SHA to clear
|
|
140
|
-
them, so the no-rerun rule
|
|
141
|
-
cleared it by hand. Those two verdicts — and only those
|
|
142
|
-
one rerun:
|
|
140
|
+
them, so without an allowance the no-rerun rule would strand a correct
|
|
141
|
+
delivery until a human cleared it by hand. Those two verdicts — and only those
|
|
142
|
+
two — buy exactly one rerun:
|
|
143
143
|
|
|
144
144
|
1. Reach the verdict with its required readings (§ above). A green on re-run is
|
|
145
145
|
never one of those readings.
|
|
@@ -143,8 +143,9 @@ authored:
|
|
|
143
143
|
widen the regex, updating every call site in the same PR.
|
|
144
144
|
4. **Add a new definition only when no reasonable match exists**, in the
|
|
145
145
|
correct domain directory. Never copy-paste a step implementation to support
|
|
146
|
-
a paraphrased scenario
|
|
147
|
-
|
|
146
|
+
a paraphrased scenario. A prose-only authoring pass (one whose scope
|
|
147
|
+
excludes step-definition code) records the missing step as a named gap
|
|
148
|
+
instead of writing it.
|
|
148
149
|
|
|
149
150
|
When a step is superseded, mark it deprecated and migrate every call site in
|
|
150
151
|
the same PR; do not leave two near-identical steps live.
|
|
@@ -15,7 +15,9 @@ Mandrel ships as the `mandrel` npm package, whose consumers pin an
|
|
|
15
15
|
exact lockfile version; they opt into breaks at upgrade time. Operator policy
|
|
16
16
|
for any contract change (config shape, baseline shape, schema, lifecycle
|
|
17
17
|
payload, ticket label, dispatch artifact, public API of a script) is
|
|
18
|
-
therefore
|
|
18
|
+
therefore as follows. It governs Mandrel's own framework contracts; a
|
|
19
|
+
consumer's product API keeps the expand–contract rule in
|
|
20
|
+
[`api-conventions.md`](api-conventions.md).
|
|
19
21
|
|
|
20
22
|
1. **Hard cutovers only.** Contract changes ship as a single in-tree
|
|
21
23
|
migration of every producer and consumer. There is no parallel
|
|
@@ -154,10 +156,10 @@ different hazards:
|
|
|
154
156
|
|
|
155
157
|
## Meta Labels (Retrospective Signal Routing)
|
|
156
158
|
|
|
157
|
-
|
|
159
|
+
Three `meta::*` labels route retrospective signals into durable substrates so
|
|
158
160
|
the `/mandrel-plan` Phase 0 fetcher (see
|
|
159
161
|
[`prior-feedback-fetcher.js`](../scripts/lib/feedback-loop/prior-feedback-fetcher.js))
|
|
160
|
-
can surface open feedback issues to the planner.
|
|
162
|
+
can surface open feedback issues to the planner. All three live in
|
|
161
163
|
[`label-constants.js`](../scripts/lib/label-constants.js) under the
|
|
162
164
|
`META_LABELS` export — reference them by symbol from scripts rather than
|
|
163
165
|
hard-coding the string.
|
|
@@ -180,3 +182,10 @@ project-local automation). The work is scoped to the consumer's
|
|
|
180
182
|
framework changes. Issues that span both axes should carry both labels —
|
|
181
183
|
`fetchPriorFeedback` dedupes by issue number so a dual-labeled issue
|
|
182
184
|
appears exactly once in the planner context.
|
|
185
|
+
|
|
186
|
+
### `meta::platform-gap`
|
|
187
|
+
|
|
188
|
+
Apply this label to a GitHub issue whose fault lies in a shared base
|
|
189
|
+
config, runner fleet, or cross-repo toolchain that neither the framework
|
|
190
|
+
nor the consumer owns — the `--owner platform` bucket of
|
|
191
|
+
[`ci-remediation.md`](ci-remediation.md).
|
|
@@ -16,9 +16,8 @@ Every Story lands on a dedicated **Story branch** named
|
|
|
16
16
|
`story-<storyId>`, seeded from `project.baseBranch` (`main` by default),
|
|
17
17
|
isolated in its own worktree at `.worktrees/story-<id>/`. The runtime
|
|
18
18
|
owns both via `single-story-init.js`; agents commit there only. Close
|
|
19
|
-
opens a PR against `main` (squash + required checks).
|
|
20
|
-
|
|
21
|
-
land on `story-<storyId>` directly, the
|
|
19
|
+
opens a PR against `main` (squash + required checks). Commits land on
|
|
20
|
+
`story-<storyId>` directly, the
|
|
22
21
|
subject referencing the Story via `(refs #<storyId>)` — see
|
|
23
22
|
[`.agents/instructions.md` § 5.B](../instructions.md).
|
|
24
23
|
|
|
@@ -38,15 +37,18 @@ subject referencing the Story via `(refs #<storyId>)` — see
|
|
|
38
37
|
|
|
39
38
|
## Push Validation & Reliability (MUSTs)
|
|
40
39
|
|
|
41
|
-
1.
|
|
40
|
+
1. Validate locally **before** `git push`. On a Story branch that is the
|
|
41
|
+
one credited suite run (`deliver-digest.md` § 5); close runs every
|
|
42
|
+
other gate, so do not pre-run them. Elsewhere, run the configured
|
|
43
|
+
validation commands.
|
|
42
44
|
2. Do NOT assume a push succeeded unless the output confirms the remote
|
|
43
45
|
ref was updated (`[new branch]`, `[up to date]`, `... -> ...`).
|
|
44
46
|
3. If a `pre-push` hook rejects, fix the cause and create a NEW follow-up
|
|
45
47
|
commit — never amend the rejected commit.
|
|
46
48
|
4. **Never bypass hooks** (`--no-verify`, `--no-gpg-sign`, …) without
|
|
47
|
-
explicit operator authorization.
|
|
48
|
-
|
|
49
|
-
consumer-tooling gap, **not** authorization; see
|
|
49
|
+
explicit operator authorization. A Biome zero-match failure under a
|
|
50
|
+
harness-managed worktree path is a known false negative — a
|
|
51
|
+
consumer-tooling gap, **not** authorization to bypass; see
|
|
50
52
|
[`git-conventions-reference.md` § Push Validation](git-conventions-reference.md).
|
|
51
53
|
|
|
52
54
|
## Local checkout hygiene
|
|
@@ -156,13 +156,14 @@ behaviour (`sets status to completed`, not `works`).
|
|
|
156
156
|
|
|
157
157
|
A file that passes alone but fails inside the full `npm test` suite is **test
|
|
158
158
|
pollution** — one test leaks shared state (env vars, temp files, the
|
|
159
|
-
mock-module registry, global singletons) and a later test trips on it.
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
mutation in a `t.before` / `t.after`
|
|
159
|
+
mock-module registry, global singletons) and a later test trips on it. Run
|
|
160
|
+
every matching file alone, then all together; the files that pass alone but
|
|
161
|
+
fail in the suite (**flippers**) bound the search, and bisecting them finds
|
|
162
|
+
the smallest reproducing subset. Mandrel's own repository automates this as
|
|
163
|
+
`npm run test:isolate`, which also reports leftover `process.env`
|
|
164
|
+
mutations; a consumer uses its runner's equivalent. The fix is almost
|
|
165
|
+
always missing teardown — wrap the mutation in a `t.before` / `t.after`
|
|
166
|
+
pair, or restore the prior value in
|
|
166
167
|
`try` / `finally`.
|
|
167
168
|
|
|
168
169
|
For browser-based changes, pair the cycle with runtime verification via Chrome
|
|
@@ -1180,7 +1180,7 @@
|
|
|
1180
1180
|
},
|
|
1181
1181
|
"mergeWatch": {
|
|
1182
1182
|
"type": "object",
|
|
1183
|
-
"description": "Knobs consumed by the close-and-land merge wait (Story #4543). `mode` (Story #4698) selects the close-time merge posture. `maxWaitSeconds` bounds ONE invocation of the merge wait and its expiry returns a resumable `pending` terminal with no label mutation; `maxBudgetSeconds` bounds the CUMULATIVE wait across resumes (anchored at the PR's createdAt, so a resume does not restart the clock) and exhausting it is the genuine give-up that classifies and blocks. The
|
|
1183
|
+
"description": "Knobs consumed by the close-and-land merge wait (Story #4543). `mode` (Story #4698) selects the close-time merge posture. `maxWaitSeconds` bounds ONE invocation of the merge wait and its expiry returns a resumable `pending` terminal with no label mutation; `maxBudgetSeconds` bounds the CUMULATIVE wait across resumes (anchored at the PR's createdAt, so a resume does not restart the clock) and exhausting it is the genuine give-up that classifies and blocks. The poll cadence is internal (at most 30s while checks run, at most 10s once they are green and the PR is unmerged); it and the cap of 3 behind-the-base updates are not configurable.",
|
|
1184
1184
|
"properties": {
|
|
1185
1185
|
"mode": {
|
|
1186
1186
|
"type": "string",
|
|
@@ -1215,11 +1215,12 @@
|
|
|
1215
1215
|
"type": "string",
|
|
1216
1216
|
"enum": [
|
|
1217
1217
|
"native",
|
|
1218
|
+
"code-review",
|
|
1218
1219
|
"codex",
|
|
1219
1220
|
"security-review",
|
|
1220
1221
|
"ultrareview"
|
|
1221
1222
|
],
|
|
1222
|
-
"description": "Registered provider key. Inline: native, codex, security-review. Manual-prompt: ultrareview."
|
|
1223
|
+
"description": "Registered provider key. Inline: native, code-review, codex, security-review. Manual-prompt: ultrareview."
|
|
1223
1224
|
},
|
|
1224
1225
|
"scopes": {
|
|
1225
1226
|
"type": "array",
|
|
@@ -1263,23 +1264,15 @@
|
|
|
1263
1264
|
},
|
|
1264
1265
|
"additionalProperties": false
|
|
1265
1266
|
},
|
|
1266
|
-
"description": "Review-provider chain (Story #2871). When unset or empty,
|
|
1267
|
+
"description": "Review-provider chain (Story #2871). When unset or empty, falls back to this default: `native` (scoped lint + MI) then an optional story-scoped `code-review` — a low-effort `claude --print` bug review whose every finding is critical and halts close before auto-merge; hosts without the `claude` CLI skip it. `security-review` and `ultrareview` are opt-in. The orchestrator iterates inline entries in declaration order and merges their Finding[] before posting one structured comment; manual-prompt entries (e.g. ultrareview) contribute a trailing 'Manual review suggestions' section. Selecting an adapter whose probe fails hard-fails at factory construction unless declared `optional: true` in the chain.",
|
|
1267
1268
|
"default": [
|
|
1268
1269
|
{
|
|
1269
1270
|
"name": "native"
|
|
1270
1271
|
},
|
|
1271
1272
|
{
|
|
1272
|
-
"name": "
|
|
1273
|
+
"name": "code-review",
|
|
1273
1274
|
"scopes": ["story"],
|
|
1274
1275
|
"optional": true
|
|
1275
|
-
},
|
|
1276
|
-
{
|
|
1277
|
-
"name": "ultrareview",
|
|
1278
|
-
"scopes": ["story"],
|
|
1279
|
-
"manualPrompt": true,
|
|
1280
|
-
"when": {
|
|
1281
|
-
"label": "risk::high"
|
|
1282
|
-
}
|
|
1283
1276
|
}
|
|
1284
1277
|
]
|
|
1285
1278
|
},
|
|
@@ -1367,7 +1360,7 @@
|
|
|
1367
1360
|
"properties": {
|
|
1368
1361
|
"roleScopedAgents": {
|
|
1369
1362
|
"type": "boolean",
|
|
1370
|
-
"description": "Epic #4478 (M7-B). Kill-switch for the role-scoped boot contexts. When true (default), a converted delivery spawn (`story-worker`, `acceptance-critic`) boots on its own `.claude/agents/<role>.md` system prompt instead of re-paying the full CLAUDE.md @-import closure. When false, every converted spawn falls back to `subagent_type: general-purpose` — the instant, code-rollback-free per-consumer revert, and the universal escape for hosts that ignore `.claude/agents/`. The fallback is the full-closure agent that ran before M7-B, so flipping it off never drops a gate.",
|
|
1363
|
+
"description": "Epic #4478 (M7-B). Kill-switch for the role-scoped boot contexts. When true (default), a converted delivery spawn (`story-worker`, `acceptance-critic`) boots on its own `.claude/agents/<role>.md` system prompt instead of re-paying the full entry-doc (AGENTS.md or CLAUDE.md) @-import closure. When false, every converted spawn falls back to `subagent_type: general-purpose` — the instant, code-rollback-free per-consumer revert, and the universal escape for hosts that ignore `.claude/agents/`. The fallback is the full-closure agent that ran before M7-B, so flipping it off never drops a gate.",
|
|
1371
1364
|
"default": true
|
|
1372
1365
|
},
|
|
1373
1366
|
"ceremonyProfile": {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
3
|
"$id": "https://mandrel.dev/schemas/audit-rules.schema.json",
|
|
4
4
|
"title": "AuditRulesManifest",
|
|
5
|
-
"description": "Schema describing the audit-rules.json manifest read by lib/audit-suite/selector.js and lib/audit-suite/
|
|
5
|
+
"description": "Schema describing the audit-rules.json manifest read by lib/audit-suite/selector.js and lib/audit-suite/checklist-threading.js. The manifest enumerates registered audit workflows and the triggers / substitution keys each one accepts, plus the sensitive-path classes that derive review depth from a change set.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"required": ["version", "audits"],
|
|
8
8
|
"additionalProperties": false,
|
|
@@ -204,6 +204,11 @@
|
|
|
204
204
|
},
|
|
205
205
|
"additionalProperties": false
|
|
206
206
|
},
|
|
207
|
+
"phaseDurations": {
|
|
208
|
+
"type": ["object", "null"],
|
|
209
|
+
"description": "Story #5417 — wall-clock seconds per close phase that ran (wrong-tree-guard, base-sync, close-validation, push, pull-request, code-review, auto-merge, confirm-merge, post-land). Optional and additive; absent or null when no phase was timed.",
|
|
210
|
+
"additionalProperties": { "type": "number", "minimum": 0 }
|
|
211
|
+
},
|
|
207
212
|
"timestamp": { "type": "string", "format": "date-time" }
|
|
208
213
|
},
|
|
209
214
|
"allOf": [
|