mandrel 1.70.0 → 1.71.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.
Files changed (30) hide show
  1. package/.agents/README.md +6 -6
  2. package/.agents/docs/SDLC.md +4 -5
  3. package/.agents/docs/configuration.md +9 -9
  4. package/.agents/docs/workflows.md +4 -6
  5. package/.agents/schemas/qa-finding.schema.json +1 -1
  6. package/.agents/scripts/apply-quality-bootstrap.js +2 -2
  7. package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +1 -1
  8. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +1 -1
  9. package/.agents/scripts/lib/config/defaults.js +1 -1
  10. package/.agents/scripts/lib/config/sync-agentrc.js +1 -1
  11. package/.agents/scripts/lib/config-resolver.js +1 -1
  12. package/.agents/scripts/lib/qa/qa-context-hydrator.js +1 -1
  13. package/.agents/scripts/lib/qa/resolve-qa-contract.js +1 -1
  14. package/.agents/scripts/{agents-update-preflight.js → mandrel-update-preflight.js} +11 -11
  15. package/.agents/scripts/sync-agentrc.js +2 -2
  16. package/.agents/skills/skills.index.json +2 -2
  17. package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +3 -3
  18. package/.agents/skills/stack/qa/qa-harness/SKILL.md +4 -4
  19. package/.agents/workflows/git-deliver.md +298 -0
  20. package/.agents/workflows/helpers/epic-testing.md +6 -6
  21. package/.agents/workflows/helpers/{agents-sync-config.md → mandrel-sync-config.md} +5 -4
  22. package/.agents/workflows/{agents-update.md → mandrel-update.md} +8 -8
  23. package/.agents/workflows/qa-explore.md +1 -1
  24. package/.agents/workflows/{qa-run-harness.md → qa-run.md} +5 -5
  25. package/README.md +20 -0
  26. package/docs/CHANGELOG.md +11 -0
  27. package/package.json +1 -1
  28. package/.agents/workflows/git-commit-all.md +0 -15
  29. package/.agents/workflows/git-pr-all.md +0 -281
  30. package/.agents/workflows/git-push.md +0 -63
@@ -0,0 +1,298 @@
1
+ ---
2
+ description: >-
3
+ Single ad-hoc delivery command for working-tree changes. Detects the git
4
+ setup and escalates to the right terminal step — commit only, commit + push,
5
+ or commit + push + open a PR with native auto-merge — picking the default
6
+ from observable state and letting flags pin any level explicitly. Replaces
7
+ the retired git-commit-all, git-push, and git-pr-all trio.
8
+ ---
9
+
10
+ # /git-deliver [Message] [--no-push] [--pr] [--draft] [--no-auto-merge] [--branch <name>] [--base <branch>]
11
+
12
+ This workflow is the **single source of truth** for getting outstanding
13
+ working-tree changes out the door when they do not belong to a planned Epic
14
+ (typo fixes, file deletions, doc tweaks, dependency bumps, operator
15
+ housekeeping). It is the ad-hoc counterpart to the heavyweight `/deliver`
16
+ pipeline.
17
+
18
+ It replaces the retired `/git-commit-all`, `/git-push`, and `/git-pr-all`
19
+ commands: instead of choosing a command by how far you want to go, you run
20
+ one command and it **detects the git setup** and escalates to the correct
21
+ terminal step. Flags pin any level explicitly; the interactive choice prompt
22
+ fires **only** when the detected state is genuinely ambiguous, so the common
23
+ path stays non-interactive and scriptable.
24
+
25
+ > **Persona**: `devops-engineer` · **Skills**:
26
+ > `core/git-workflow-and-versioning`
27
+
28
+ ---
29
+
30
+ ## Terminal levels
31
+
32
+ | Level | Terminal action | Default trigger |
33
+ | ----- | --------------- | --------------- |
34
+ | **commit** | stage + commit on the current branch | `--no-push`, **or** no git remote is configured |
35
+ | **push** | + push the current branch to its upstream | on a feature branch (current ≠ base branch) with a remote |
36
+ | **pr** | + cut/push a feature branch, open a PR, arm auto-merge | on the base branch (a direct push would bounce off branch protection), **or** `--pr` is set |
37
+
38
+ The detection only sets the **default**. Every level is reachable by an
39
+ explicit flag, and the command **announces what it detected and which level
40
+ it is about to run** before it acts.
41
+
42
+ ---
43
+
44
+ ## Arguments
45
+
46
+ ```text
47
+ /git-deliver [Message] [--no-push] [--pr] [--draft] [--no-auto-merge] [--branch <name>] [--base <branch>]
48
+ ```
49
+
50
+ - `Message` — the commit subject. First line becomes the commit subject (and,
51
+ at the **pr** level, the PR title); if the message contains a blank line,
52
+ everything after it becomes the commit/PR body. When omitted, a timestamped
53
+ fallback (`chore: ad-hoc changes <ISO 8601>`) is used so the commit is never
54
+ unmessageable.
55
+ - `--no-push` — force the **commit** level: stage and commit only, no push.
56
+ Useful when chaining several commits or deferring the push.
57
+ - `--pr` — force the **pr** level even from a feature branch where a plain
58
+ push would otherwise be the default.
59
+ - `--draft` — (pr level) open the PR in draft state and skip arming
60
+ auto-merge. Useful when you want CI to run before flipping to
61
+ ready-for-review.
62
+ - `--no-auto-merge` — (pr level) open a normal (non-draft) PR but do not enable
63
+ GitHub's native auto-merge queue. The operator merges through the UI.
64
+ Default at the pr level is `gh pr merge --auto --squash --delete-branch`.
65
+ - `--branch <name>` — (pr level) override the auto-generated feature branch
66
+ name. When omitted, the branch is slugged from the commit subject (Step 3).
67
+ - `--base <branch>` — override the base branch used for detection and as the PR
68
+ merge target. When omitted, reads `project.baseBranch` from `.agentrc.json`
69
+ (default `main`).
70
+
71
+ ---
72
+
73
+ ## Step 0 — Detect Git Setup & Resolve Level
74
+
75
+ 1. Resolve `[BASE_BRANCH]` from `--base` or `.agentrc.json` →
76
+ `project.baseBranch` (default `main`).
77
+ 2. Read the current branch: `git rev-parse --abbrev-ref HEAD`.
78
+ 3. Verify the working tree has outstanding changes with
79
+ `git status --porcelain`. If the output is empty: **STOP** and tell the
80
+ operator there is nothing to deliver.
81
+ 4. Detect whether a remote is configured: `git remote`.
82
+ 5. Resolve the **terminal level** from flags + state:
83
+ - `--no-push` set → **commit**.
84
+ - No remote configured → **commit** (warn there is nowhere to push).
85
+ - `--pr` set → **pr**.
86
+ - Current branch equals `[BASE_BRANCH]` → **pr** (a direct push to the
87
+ protected base would be rejected, so the PR flow is the only safe path).
88
+ - Otherwise (a feature branch with a remote) → **push**.
89
+ 6. **Ambiguity gate.** Surface an interactive choice **only** when the state is
90
+ genuinely under-determined — for example a **detached HEAD**, or a feature
91
+ branch with a remote but no upstream tracking ref where pushing would need
92
+ `-u`. Present the operator the candidate levels (e.g. "push to a new
93
+ upstream" vs. "open a PR") and proceed with their pick. In every
94
+ non-ambiguous case, do **not** prompt — announce the detected level and
95
+ continue.
96
+ 7. Echo a one-line plan to the operator before acting, e.g.
97
+ `detected: on feature branch 'fix/foo' with upstream → level: push`.
98
+
99
+ ---
100
+
101
+ ## Step 1 — Compose Commit Message
102
+
103
+ If the operator passed `[Message]`, use it verbatim. Otherwise fall back to
104
+ `chore: ad-hoc changes <ISO 8601 timestamp>`.
105
+
106
+ Split the message on the first blank line:
107
+
108
+ - **Subject** — the first line; commit subject and (pr level) PR title.
109
+ - **Body** — everything after the first blank line; commit body and (pr level)
110
+ PR body. May be empty.
111
+
112
+ ---
113
+
114
+ ## Step 2 — Stage + Commit (all levels)
115
+
116
+ Stage all outstanding changes:
117
+
118
+ ```powershell
119
+ git add -A
120
+ ```
121
+
122
+ Commit:
123
+
124
+ ```powershell
125
+ git commit -m "<subject>" -m "<body>"
126
+ ```
127
+
128
+ If the body is empty, omit the second `-m`. If the pre-commit hook fails:
129
+
130
+ 1. Read the failure output.
131
+ 2. Fix the issue (run `npm run format`, fix lint errors, etc.).
132
+ 3. `git add -A` again.
133
+ 4. Re-run `git commit` — do **not** pass `--no-verify`.
134
+
135
+ **If the level is `commit`, stop here** and print the commit summary.
136
+
137
+ ---
138
+
139
+ ## Step 3 — Cut Feature Branch (pr level, from-base only)
140
+
141
+ Only when the level is **pr** *and* the current branch equals `[BASE_BRANCH]`.
142
+ Skip when already on a feature branch.
143
+
144
+ When `--branch <name>` is set, use it verbatim. Otherwise generate a branch
145
+ slug from the commit subject:
146
+
147
+ 1. Detect the Conventional Commit type prefix (`<type>(<scope>): …`). If
148
+ matched, use `<type>` as the branch namespace. Allowed types: `feat`,
149
+ `fix`, `chore`, `docs`, `refactor`, `test`, `build`, `ci`, `perf`,
150
+ `style`. Anything else (or no prefix) → `chore`.
151
+ 2. Strip the type prefix and any leading punctuation from the subject.
152
+ 3. Lowercase, replace non-alphanumeric runs with `-`, collapse repeated
153
+ hyphens, trim leading/trailing hyphens.
154
+ 4. Truncate to 50 chars on a word boundary.
155
+ 5. Combine: `<type>/<slug>`. Example: `"Delete unused files"` →
156
+ `chore/delete-unused-files`.
157
+
158
+ Cut and check out the branch **before committing** — that is, when this step
159
+ applies, run it ahead of Step 2's commit so the commit lands on the feature
160
+ branch, never on the base branch:
161
+
162
+ ```powershell
163
+ git checkout -b <branch-name>
164
+ ```
165
+
166
+ If a local branch with that name already exists, append `-2` (then `-3`, …)
167
+ until `git rev-parse --verify` returns non-zero, and check that out instead.
168
+
169
+ ---
170
+
171
+ ## Step 4 — Push (push and pr levels)
172
+
173
+ Push the current branch. At the **push** level, push to the existing upstream:
174
+
175
+ ```powershell
176
+ git push
177
+ ```
178
+
179
+ At the **pr** level (or any branch lacking an upstream), set the upstream:
180
+
181
+ ```powershell
182
+ git push -u origin <branch-name>
183
+ ```
184
+
185
+ If the pre-push hook fails:
186
+
187
+ 1. Read the failure output.
188
+ 2. Fix the offending baseline / test / lint issue in the working tree.
189
+ 3. `git add -A`, then create a **new follow-up commit** (do not amend a commit
190
+ that has already been pushed; amending an unpushed commit is fine).
191
+ 4. Re-run the push. Never bypass the hook with `--no-verify`.
192
+
193
+ If the push is rejected because the remote has work you do not have locally,
194
+ `git pull --rebase`, resolve conflicts, and push again.
195
+
196
+ **If the level is `push`, stop here** and print the push summary.
197
+
198
+ ---
199
+
200
+ ## Step 5 — Open PR (pr level)
201
+
202
+ ```powershell
203
+ gh pr create --base <BASE_BRANCH> --head <branch-name> \
204
+ --title "<subject>" --body "<body-or-default>"
205
+ ```
206
+
207
+ When the body would otherwise be empty, fall back to a single line:
208
+ `Opened via /git-deliver`. Pass `--draft` to `gh pr create` when the operator
209
+ set `--draft`. Capture the PR URL from stdout for the summary.
210
+
211
+ ---
212
+
213
+ ## Step 6 — Arm Auto-Merge (pr level, default)
214
+
215
+ Skip when `--draft` or `--no-auto-merge` is set.
216
+
217
+ ```powershell
218
+ gh pr merge <PR_NUMBER> --auto --squash --delete-branch
219
+ ```
220
+
221
+ This queues the PR to merge as soon as required checks turn green and schedules
222
+ head-branch deletion on merge. Auto-merge requires `allow_auto_merge: true` on
223
+ the repo. If `gh pr merge --auto` fails (missing repo feature, insufficient
224
+ token scope), log the failure and surface it — the PR stays open and mergeable
225
+ through the GitHub UI.
226
+
227
+ ---
228
+
229
+ ## Step 7 — Summary
230
+
231
+ Print a single block matched to the level that ran:
232
+
233
+ ```text
234
+ # commit level
235
+ ✅ Committed on <branch>: <subject>
236
+
237
+ # push level
238
+ ✅ Committed + pushed <branch> → origin: <subject>
239
+
240
+ # pr level
241
+ ✅ Opened PR #<PR_NUMBER>: <subject>
242
+ <PR_URL>
243
+ branch: <branch-name> → <BASE_BRANCH>
244
+ auto-merge: <enabled | draft | disabled>
245
+ ```
246
+
247
+ Do **not** poll CI. That is the `/deliver` Phase 7 job and is overkill for
248
+ ad-hoc changes. The operator (or GitHub's email notification) is the next
249
+ watcher.
250
+
251
+ ---
252
+
253
+ ## Troubleshooting
254
+
255
+ - **Hook failures**: Read the output, fix the underlying issue, never
256
+ `--no-verify`. The pre-push hook (lint + format + maintainability + audit +
257
+ coverage + CRAP) is the same gate every PR has to pass eventually; failing
258
+ here lets you fix it before opening the PR rather than after CI fails.
259
+ - **Branch already exists locally**: appended `-2`/`-3` per Step 3; pass
260
+ `--branch <name>` for a specific name.
261
+ - **`gh pr create` fails with "no commits between branches"**: the push did not
262
+ move the branch (e.g. it was already at the same SHA as `[BASE_BRANCH]`).
263
+ Verify `git log <BASE_BRANCH>..HEAD` shows commits before re-running.
264
+ - **PR template wins over `--body`**: if `.github/pull_request_template.md`
265
+ exists, `gh pr create --body` overrides it. For ad-hoc PRs the explicit body
266
+ is the right default.
267
+ - **Auto-merge does not fire after CI green**: confirm the PR's required checks
268
+ match the auto-merge requirements. The framework's quality gate
269
+ (`Validate and Test`) is the canonical required check.
270
+
271
+ ---
272
+
273
+ ## Constraint
274
+
275
+ - **Never** push directly to `[BASE_BRANCH]`. At the pr level Step 3's branch
276
+ cut is mandatory in from-base mode; remove it and the workflow becomes a
277
+ silent bypass of the PR-required policy.
278
+ - **Never** pass `--no-verify` to `git commit` or `git push` to bypass the
279
+ quality gate. Fix the failure at the source.
280
+ - **Never** force-push from `/git-deliver`. This workflow opens new PRs, it
281
+ does not rewrite history. Force-pushes belong to `/git-merge-pr` (with
282
+ `--force-with-lease` after a rebase) and `/deliver` Phase 7.
283
+ - **Always** prefer `--auto --squash --delete-branch` at the pr level unless
284
+ the operator opts out, so `main`'s commit history stays uniform across the
285
+ `/git-deliver` and `/deliver` surfaces.
286
+
287
+ ---
288
+
289
+ ## ⚠️ Parallel Story Execution
290
+
291
+ Do **not** use this workflow from inside a parallel story-execution context
292
+ (`/deliver #<storyId>`, `/deliver` wave dispatch). `git add -A` sweeps any
293
+ untracked files in the working tree, which in a shared working directory may
294
+ belong to another agent. In those contexts stage explicit paths only and
295
+ confirm `git branch --show-current` reports the expected `story-<id>` branch
296
+ before committing — see
297
+ [`helpers/worktree-lifecycle.md`](helpers/worktree-lifecycle.md) for the
298
+ shared-tree hazard and the worktree-isolation model that contains it.
@@ -6,12 +6,12 @@ description: QA Epic-testing workflow — ingest the agent-driven QA harness swe
6
6
 
7
7
  > **Helper module.** Not a slash command. Invoked from the QA gate during
8
8
  > `/deliver` or directly by an operator when the Epic-testing ticket
9
- > needs refreshed evidence. For ad-hoc acceptance runs use `/qa-run-harness` —
9
+ > needs refreshed evidence. For ad-hoc acceptance runs use `/qa-run` —
10
10
  > this helper owns the Epic-evidence ticket lifecycle on top of it.
11
11
 
12
12
  Gather and attach the acceptance-suite evidence that gates Epic closure. The
13
13
  evidence artifact is the **agent-driven QA harness sweep report** produced by
14
- `/qa-run-harness` (scenario pass/fail/blocked totals plus structured
14
+ `/qa-run` (scenario pass/fail/blocked totals plus structured
15
15
  findings), **not** a hand-ticked markdown checklist.
16
16
 
17
17
  > **When to run**: During the QA phase of an Epic, after all Story merges
@@ -38,13 +38,13 @@ findings), **not** a hand-ticked markdown checklist.
38
38
 
39
39
  ## Step 1 — Execute the QA Harness Sweep
40
40
 
41
- Invoke `/qa-run-harness` with the chosen selector:
41
+ Invoke `/qa-run` with the chosen selector:
42
42
 
43
43
  ```text
44
- /qa-run-harness "tag:@smoke and @risk-high"
44
+ /qa-run "tag:@smoke and @risk-high"
45
45
  ```
46
46
 
47
- The `/qa-run-harness` workflow (`.agents/workflows/qa-run-harness.md`) owns the
47
+ The `/qa-run` workflow (`.agents/workflows/qa-run.md`) owns the
48
48
  execution mechanics — `qa` contract resolution, scenario selection, browser
49
49
  navigation, and finding capture. This workflow consumes its output.
50
50
 
@@ -117,7 +117,7 @@ and deleting the checklist in the same change.
117
117
 
118
118
  ## Cross-References
119
119
 
120
- - Execution mechanics: `.agents/workflows/qa-run-harness.md`.
120
+ - Execution mechanics: `.agents/workflows/qa-run.md`.
121
121
  - Scenario authoring rules: `.agents/rules/gherkin-standards.md`.
122
122
  - Runner / fixture / trace conventions:
123
123
  `.agents/skills/stack/qa/playwright-bdd/SKILL.md`.
@@ -5,15 +5,16 @@ description: >-
5
5
  surfacing redundant keys (project values that already match framework
6
6
  defaults). The runtime layers defaults at read time, so the helper never
7
7
  auto-fills optional keys from the template. Invoked by reference from
8
- /agents-update.
8
+ /mandrel-update.
9
9
  ---
10
10
 
11
- # agents-sync-config (helper)
11
+ # mandrel-sync-config (helper)
12
12
 
13
13
  > **Not a slash command.** Lives under `.agents/workflows/helpers/` so it is
14
14
  > not projected into the mandrel plugin command tree. Invoked by reference from
15
- > [`/agents-update`](../agents-update.md) after a framework update; previously
16
- > shipped as `/agents-sync-config`. The reconciliation runs as part of the
15
+ > [`/mandrel-update`](../mandrel-update.md) after a framework update; previously
16
+ > shipped as the standalone `/agents-sync-config` command (later demoted to a
17
+ > helper, then renamed alongside `/mandrel-update`). The reconciliation runs as part of the
17
18
  > `mandrel update` upgrade path (bump → sync → migrate → doctor).
18
19
  >
19
20
  > **Configuration reference.** The full set of configurable keys, defaults,
@@ -10,7 +10,7 @@ description: >-
10
10
  stage + commit the staged lockfile bump.
11
11
  ---
12
12
 
13
- # /agents-update
13
+ # /mandrel-update
14
14
 
15
15
  > **Upgrade owner.** The mechanical upgrade is owned end to end by the
16
16
  > [`mandrel update`](../../lib/cli/update.js) CLI under the npm distribution
@@ -23,7 +23,7 @@ description: >-
23
23
 
24
24
  ## Overview
25
25
 
26
- `/agents-update` advances the consumer repo to the newest published
26
+ `/mandrel-update` advances the consumer repo to the newest published
27
27
  `mandrel` release, re-materializes `.agents/`, and regenerates the
28
28
  flat `.claude/commands/` tree (invoked as `/<name>`) against the new workflow
29
29
  set — then reconciles the consumer's own config, harness allowlist, and
@@ -105,7 +105,7 @@ day-0 failure modes — **wrong project**, a **dirty git index**, and being
105
105
  consumer repo root:
106
106
 
107
107
  ```bash
108
- node .agents/scripts/agents-update-preflight.js
108
+ node .agents/scripts/mandrel-update-preflight.js
109
109
  ```
110
110
 
111
111
  The preflight runs three checks and prints a JSON envelope
@@ -243,8 +243,8 @@ CLI's stderr names it) and run the matching manual remedy from the consumer
243
243
  repo root. These commands match the hint strings
244
244
  [`lib/cli/update.js`](../../lib/cli/update.js) emits verbatim — it is the
245
245
  single source of truth, kept in lockstep with this table by the
246
- `agents-update-recovery-drift` contract test
247
- ([`tests/bootstrap/agents-update-recovery-drift.test.js`](../../tests/bootstrap/agents-update-recovery-drift.test.js)):
246
+ `mandrel-update-recovery-drift` contract test
247
+ ([`tests/bootstrap/mandrel-update-recovery-drift.test.js`](../../tests/bootstrap/mandrel-update-recovery-drift.test.js)):
248
248
 
249
249
  | Failed phase | Manual remedy |
250
250
  | ----------------- | ------------------------------------------------------- |
@@ -319,7 +319,7 @@ The helper (Story #1995) is **default-aware** and **read-only**:
319
319
  modified.
320
320
 
321
321
  Full procedure reference:
322
- [`helpers/agents-sync-config.md`](helpers/agents-sync-config.md).
322
+ [`helpers/mandrel-sync-config.md`](helpers/mandrel-sync-config.md).
323
323
 
324
324
  If the helper prints `No changes required` with no advisories, the config
325
325
  is already in sync — carry on. If it lists `[REDUNDANT]` rows, you may
@@ -392,7 +392,7 @@ rest of the per-Epic temp tree):
392
392
  contract for the framework.
393
393
 
394
394
  A second run produces `no-change` on every install path, which is the
395
- guarantee `agents-update`'s idempotence contract requires.
395
+ guarantee `mandrel-update`'s idempotence contract requires.
396
396
 
397
397
  ## Step 3.6 — Refresh the harness permission allowlist (`/fewer-permission-prompts`)
398
398
 
@@ -431,7 +431,7 @@ auto-applied change:
431
431
  - Apply the accepted subset by editing `.claude/settings.json` and
432
432
  stage it alongside the version bump in Step 5.
433
433
 
434
- The maintenance cadence is **once per `/agents-update` invocation** —
434
+ The maintenance cadence is **once per `/mandrel-update` invocation** —
435
435
  the same operator who just ran `mandrel update` is the one with the
436
436
  freshest transcript context to review the proposed allowlist
437
437
  diff. Skipping the step is fine when the bump introduces no new
@@ -19,7 +19,7 @@ operator watches and gates.** Its human-led sibling is
19
19
  the agent scribes/enriches. No human-driven flow lives in `/qa-explore`; if you
20
20
  want to capture something *you* observed, use `/qa-assist` instead.
21
21
 
22
- Unlike [`/qa-run-harness`](qa-run-harness.md) (which steps a known set of
22
+ Unlike [`/qa-run`](qa-run.md) (which steps a known set of
23
23
  Gherkin `.feature` scenarios through a browser), `/qa-explore` is **open-ended
24
24
  exploration**: the agent probes the surface for product bugs, environment-setup
25
25
  friction, tooling/DX gaps, missing tests, and enhancement ideas — each captured
@@ -2,7 +2,7 @@
2
2
  description: Drive Gherkin scenarios through a real browser as an agent-driven QA sweep
3
3
  ---
4
4
 
5
- # /qa-run-harness
5
+ # /qa-run
6
6
 
7
7
  Execute a consumer's Gherkin `.feature` scenarios through a **real browser**
8
8
  (the chrome-devtools MCP surface), with the agent acting as the step executor
@@ -31,7 +31,7 @@ console filtering.
31
31
  ## Slash Command
32
32
 
33
33
  ```text
34
- /qa-run-harness <selector>
34
+ /qa-run <selector>
35
35
  ```
36
36
 
37
37
  ### Arguments
@@ -58,9 +58,9 @@ deterministic, `(file, line)`-sorted scenario set under the contract's
58
58
  ### Examples
59
59
 
60
60
  ```text
61
- /qa-run-harness feature:login
62
- /qa-run-harness "tag:@smoke and not @wip"
63
- /qa-run-harness domain:billing
61
+ /qa-run feature:login
62
+ /qa-run "tag:@smoke and not @wip"
63
+ /qa-run domain:billing
64
64
  ```
65
65
 
66
66
  The canonical tag taxonomy — `@smoke`, `@risk-high`, `@platform-web`,
package/README.md CHANGED
@@ -158,6 +158,26 @@ npx mandrel sync # re-materialize ./.agents/
158
158
  npx mandrel doctor # verify the install
159
159
  ```
160
160
 
161
+ ## Benchmarking
162
+
163
+ Mandrel's effectiveness is measured by a separate companion repo,
164
+ **[mandrel-bench](https://github.com/dsj1984/mandrel-bench)** — a *consumer* of
165
+ the published `mandrel` package. It pins a specific framework version,
166
+ materializes it via `mandrel sync`, and drives Mandrel's own `/plan`→`/deliver`
167
+ pipeline (plus a bare-model control) over a scenario corpus. Each run is scored
168
+ across five dimensions — Quality, Planning fidelity, and Autonomy (what the
169
+ scaffolding *buys*) versus Efficiency and Overhead ratio (what it *costs*) —
170
+ reported as distributions with a noise-band, tracking the framework's
171
+ **value-add over the bare-model baseline** across versions and models.
172
+
173
+ The benchmark lives in its own repo on purpose: holding the harness fixed while
174
+ varying the pinned `mandrel` version cleanly decouples harness-version from
175
+ framework-version, and running through the published-package + `mandrel sync`
176
+ path exercises the real consumer contract. The dependency is one-directional —
177
+ `mandrel-bench` depends on `mandrel`, never the reverse. See the
178
+ [mandrel-bench README](https://github.com/dsj1984/mandrel-bench#readme) for the
179
+ dimensions, run model, and how to benchmark a new version.
180
+
161
181
  ## Contributors
162
182
 
163
183
  Only `.agents/` is distributed to consumers — it ships inside the
package/docs/CHANGELOG.md CHANGED
@@ -2,6 +2,17 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [1.71.0](https://github.com/dsj1984/mandrel/compare/mandrel-v1.70.0...mandrel-v1.71.0) (2026-06-16)
6
+
7
+
8
+ ### ⚠ BREAKING CHANGES
9
+
10
+ * **workflows:** three operator-facing slash commands are renamed and three git commands are consolidated. Consumers must update muscle memory and any scripts: `/agents-update`→`/mandrel-update`, `/qa-run-harness`→`/qa-run`, and `/git-commit-all` / `/git-push` / `/git-pr-all`→`/git-deliver` (detection picks the old behavior by default; `--no-push` reproduces `/git-commit-all`, a feature-branch run reproduces `/git-push`, and a base-branch run or `--pr` reproduces `/git-pr-all`).
11
+
12
+ ### Changed
13
+
14
+ * **workflows:** rename agents-update→mandrel-update, qa-run-harness→qa-run; collapse 3 git commands into git-deliver ([#4209](https://github.com/dsj1984/mandrel/issues/4209)) ([fc30a3d](https://github.com/dsj1984/mandrel/commit/fc30a3d579d80fd854217e066f97899b813c6be9))
15
+
5
16
  ## [1.70.0](https://github.com/dsj1984/mandrel/compare/mandrel-v1.69.0...mandrel-v1.70.0) (2026-06-16)
6
17
 
7
18
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mandrel",
3
- "version": "1.70.0",
3
+ "version": "1.71.0",
4
4
  "description": "Claude Code-first opinionated workflow framework: instructions, personas, skills, and SDLC workflows that govern AI coding assistants.",
5
5
  "files": [
6
6
  ".agents/",
@@ -1,15 +0,0 @@
1
- ---
2
- description: Stage every untracked and modified file, then create a single conventional-commit on the current branch (no push).
3
- ---
4
-
5
- # /git-commit-all [Message]
6
-
7
- This is a compatibility alias for [`/git-push --no-push`](git-push.md) — it
8
- stages and commits all outstanding changes without pushing. See
9
- [`git-push.md`](git-push.md) for the canonical procedure, hook-failure guidance,
10
- and the parallel-execution warning.
11
-
12
- ## Constraint
13
-
14
- Follow every constraint in [`git-push.md`](git-push.md) — this alias does not
15
- relax any of them.