mandrel 1.70.0 → 1.72.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 (34) 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/orchestration/lifecycle/listeners/automerge-predicate.js +35 -5
  13. package/.agents/scripts/lib/qa/qa-context-hydrator.js +1 -1
  14. package/.agents/scripts/lib/qa/resolve-qa-contract.js +1 -1
  15. package/.agents/scripts/{agents-update-preflight.js → mandrel-update-preflight.js} +11 -11
  16. package/.agents/scripts/sync-agentrc.js +2 -2
  17. package/.agents/skills/skills.index.json +2 -2
  18. package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +3 -3
  19. package/.agents/skills/stack/qa/qa-harness/SKILL.md +4 -4
  20. package/.agents/workflows/git-deliver.md +298 -0
  21. package/.agents/workflows/helpers/epic-testing.md +6 -6
  22. package/.agents/workflows/helpers/{agents-sync-config.md → mandrel-sync-config.md} +5 -4
  23. package/.agents/workflows/helpers/plan-epic.md +51 -8
  24. package/.agents/workflows/helpers/plan-story.md +18 -2
  25. package/.agents/workflows/{agents-update.md → mandrel-update.md} +8 -8
  26. package/.agents/workflows/plan.md +71 -3
  27. package/.agents/workflows/qa-explore.md +1 -1
  28. package/.agents/workflows/{qa-run-harness.md → qa-run.md} +5 -5
  29. package/README.md +20 -0
  30. package/docs/CHANGELOG.md +23 -0
  31. package/package.json +1 -1
  32. package/.agents/workflows/git-commit-all.md +0 -15
  33. package/.agents/workflows/git-pr-all.md +0 -281
  34. package/.agents/workflows/git-push.md +0 -63
@@ -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,29 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [1.72.0](https://github.com/dsj1984/mandrel/compare/mandrel-v1.71.0...mandrel-v1.72.0) (2026-06-17)
6
+
7
+
8
+ ### Added
9
+
10
+ * **plan:** add a headless/non-interactive flag to suppress the ideation one-pager + Phase-7 review gate ([#4223](https://github.com/dsj1984/mandrel/issues/4223)) ([#4226](https://github.com/dsj1984/mandrel/issues/4226)) ([9ffa355](https://github.com/dsj1984/mandrel/commit/9ffa35543f897199c096ad45a568de39b0424ba7))
11
+
12
+
13
+ ### Fixed
14
+
15
+ * **deliver:** fail open on unparseable code-review severity bullets in auto-merge gate (refs [#4222](https://github.com/dsj1984/mandrel/issues/4222)) ([#4224](https://github.com/dsj1984/mandrel/issues/4224)) ([ca949bd](https://github.com/dsj1984/mandrel/commit/ca949bd7d98eea440571db6636f8be2f2128c3b9))
16
+
17
+ ## [1.71.0](https://github.com/dsj1984/mandrel/compare/mandrel-v1.70.0...mandrel-v1.71.0) (2026-06-16)
18
+
19
+
20
+ ### ⚠ BREAKING CHANGES
21
+
22
+ * **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`).
23
+
24
+ ### Changed
25
+
26
+ * **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))
27
+
5
28
  ## [1.70.0](https://github.com/dsj1984/mandrel/compare/mandrel-v1.69.0...mandrel-v1.70.0) (2026-06-16)
6
29
 
7
30
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mandrel",
3
- "version": "1.70.0",
3
+ "version": "1.72.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.
@@ -1,281 +0,0 @@
1
- ---
2
- description: >-
3
- Stage all outstanding changes, commit, push to a feature branch, and open a
4
- pull request with native auto-merge enabled.
5
- ---
6
-
7
- # /git-pr-all [Message] [--draft] [--no-auto-merge] [--branch <name>] [--base <branch>]
8
-
9
- This workflow is the **ad-hoc PR ergonomics** counterpart to the heavyweight
10
- `/deliver` pipeline. Use it when you have outstanding changes that do not
11
- belong to a planned Epic (typo fixes, file deletions, doc tweaks, dependency
12
- bumps, operator housekeeping) and you want a single command to take them from
13
- the working tree to a PR queued for auto-merge.
14
-
15
- It composes the three steps that used to live in
16
- [`/git-commit-all`](git-commit-all.md), [`/git-push`](git-push.md), and a
17
- manual `gh pr create` — no more dance, no more manually slugging branch
18
- names. Quality gates remain enforced by the existing pre-push hook; this
19
- workflow does not bypass them.
20
-
21
- > **When to run**: After making changes on `main` (or any base branch) that
22
- > are too small or too out-of-band for `/plan` + `/deliver` but
23
- > still need to land via the PR-required flow.
24
- >
25
- > **Persona**: `devops-engineer` · **Skills**:
26
- > `core/git-workflow-and-versioning`
27
-
28
- ---
29
-
30
- ## Arguments
31
-
32
- ```text
33
- /git-pr-all [Message] [--draft] [--no-auto-merge] [--branch <name>] [--base <branch>]
34
- ```
35
-
36
- - `Message` — the commit subject. First line becomes the PR title; if
37
- the message contains a blank line, everything after the blank line
38
- becomes the PR body. When omitted, an interactive prompt is suppressed
39
- and a timestamped fallback (`chore: ad-hoc changes <ISO>`) is used.
40
- - `--draft` — open the PR in draft state and skip the auto-merge enable
41
- step. Useful when you want CI to run before flipping to ready-for-review.
42
- - `--no-auto-merge` — open a normal (non-draft) PR but do not enable
43
- GitHub's native auto-merge queue. The operator merges through the UI
44
- when ready. Default behaviour is `gh pr merge --auto --squash --delete-branch`.
45
- - `--branch <name>` — override the auto-generated feature branch name.
46
- When omitted, the branch is slugged from the commit subject (see
47
- Step 2).
48
- - `--base <branch>` — override the merge target. When omitted, reads
49
- `project.baseBranch` from `.agentrc.json` (default `main`).
50
-
51
- ---
52
-
53
- ## Step 0 — Resolve Context
54
-
55
- 1. Resolve `[BASE_BRANCH]` from `--base` or `.agentrc.json` →
56
- `project.baseBranch` (default `main`).
57
- 2. Read the current branch with `git rev-parse --abbrev-ref HEAD`.
58
- 3. Determine the operating mode:
59
- - **`from-base` mode** — current branch equals `[BASE_BRANCH]`. The
60
- workflow must cut a feature branch in Step 2 before committing.
61
- - **`from-feature` mode** — current branch is anything else. The
62
- workflow commits + pushes to the existing branch in Step 3 and
63
- opens (or updates) a PR from it.
64
- 4. Verify the working tree has outstanding changes with
65
- `git status --porcelain`. If the output is empty: **STOP** and tell
66
- the operator there is nothing to PR.
67
-
68
- ---
69
-
70
- ## Step 1 — Compose Commit Message
71
-
72
- If the operator passed `[Message]`, use it verbatim. Otherwise, fall back
73
- to `chore: ad-hoc changes <ISO 8601 timestamp>` so the commit is never
74
- unmessageable.
75
-
76
- Split the message on the first blank line:
77
-
78
- - **Subject** — the first line, used as the commit subject AND the PR
79
- title.
80
- - **Body** — everything after the first blank line, used as the commit
81
- body AND the PR body. May be empty.
82
-
83
- ---
84
-
85
- ## Step 2 — Cut Feature Branch (from-base mode only)
86
-
87
- Skip this step in `from-feature` mode — the branch already exists.
88
-
89
- When `--branch <name>` is set, use it verbatim. Otherwise generate a
90
- branch slug from the commit subject:
91
-
92
- 1. Detect the Conventional Commit type prefix (`<type>(<scope>): …`).
93
- If matched, use `<type>` as the branch namespace. Allowed types:
94
- `feat`, `fix`, `chore`, `docs`, `refactor`, `test`, `build`, `ci`,
95
- `perf`, `style`. Anything else (or no prefix) → `chore`.
96
- 2. Strip the type prefix and any leading punctuation from the subject.
97
- 3. Lowercase, replace non-alphanumeric runs with `-`, collapse repeated
98
- hyphens, trim leading/trailing hyphens.
99
- 4. Truncate to 50 chars on a word boundary.
100
- 5. Combine: `<type>/<slug>`. Example: `"Delete unused files"` →
101
- `chore/delete-unused-files`. `"fix(observability): drop stale handler"`
102
- → `fix/observability-drop-stale-handler`.
103
-
104
- Cut and check out the branch:
105
-
106
- ```powershell
107
- git checkout -b <branch-name>
108
- ```
109
-
110
- If a local branch with that name already exists: pick a fresh name by
111
- appending `-2` (then `-3`, etc.) until `git rev-parse --verify` returns
112
- non-zero, and check that out instead.
113
-
114
- ---
115
-
116
- ## Step 3 — Stage + Commit
117
-
118
- Stage all outstanding changes:
119
-
120
- ```powershell
121
- git add -A
122
- ```
123
-
124
- > **Why `-A` and not explicit paths?** `/git-pr-all` is operator-driven
125
- > (not parallel-agent-driven), so the single-tree assumption that
126
- > blocks `git add .` inside `/deliver` does not apply here. See
127
- > the parallel-execution warning at the bottom of this file.
128
-
129
- Commit:
130
-
131
- ```powershell
132
- git commit -m "<subject>" -m "<body>"
133
- ```
134
-
135
- If the body is empty, omit the second `-m`. If the pre-commit hook
136
- fails:
137
-
138
- 1. Read the failure output.
139
- 2. Fix the issue (run `npm run format`, fix lint errors, etc.).
140
- 3. `git add -A` again.
141
- 4. Re-run `git commit` (do **not** pass `--no-verify`).
142
-
143
- ---
144
-
145
- ## Step 4 — Push with Upstream
146
-
147
- Push the branch and set its upstream so subsequent pushes do not need
148
- the explicit ref:
149
-
150
- ```powershell
151
- git push -u origin <branch-name>
152
- ```
153
-
154
- If the pre-push hook fails:
155
-
156
- 1. Read the failure output.
157
- 2. Fix the offending baseline / test / lint issue in the working tree.
158
- 3. `git add -A`, `git commit --amend --no-edit` (the original commit
159
- has not been pushed yet, so amend is safe).
160
- 4. Re-run the push.
161
-
162
- If the pre-push hook is correctly blocking a real regression, fix the
163
- regression — never bypass the hook with `--no-verify`.
164
-
165
- ---
166
-
167
- ## Step 5 — Open PR
168
-
169
- ```powershell
170
- gh pr create --base <BASE_BRANCH> --head <branch-name> \
171
- --title "<subject>" --body "<body-or-default>"
172
- ```
173
-
174
- When `--body` would otherwise be empty, fall back to a single line:
175
- `Opened via /git-pr-all`. Pass `--draft` to `gh pr create` when the
176
- operator set the `--draft` flag.
177
-
178
- Capture the resulting PR URL from `gh pr create`'s stdout for the
179
- final summary.
180
-
181
- ---
182
-
183
- ## Step 6 — Enable Auto-Merge (default)
184
-
185
- Skip this step when `--draft` or `--no-auto-merge` is set.
186
-
187
- ```powershell
188
- gh pr merge <PR_NUMBER> --auto --squash --delete-branch
189
- ```
190
-
191
- This queues the PR for merge as soon as required checks turn green and
192
- schedules deletion of the head branch on merge. Auto-merge requires
193
- `allow_auto_merge: true` on the repo (set by `/agents-bootstrap-github`,
194
- Story #1239).
195
-
196
- If `gh pr merge --auto` fails (missing repo feature, insufficient
197
- token scope), log the failure and surface it to the operator — the PR
198
- itself remains open and mergeable through the GitHub UI.
199
-
200
- ---
201
-
202
- ## Step 7 — Summary
203
-
204
- Print a single block to the operator:
205
-
206
- ```text
207
- ✅ Opened PR #<PR_NUMBER>: <subject>
208
- <PR_URL>
209
- branch: <branch-name> → <BASE_BRANCH>
210
- auto-merge: <enabled | draft | disabled>
211
- ```
212
-
213
- Do **not** poll CI. That is the `/deliver` Phase 7 job and is
214
- overkill for ad-hoc changes. The operator (or GitHub's email
215
- notification) is the next watcher.
216
-
217
- ---
218
-
219
- ## Troubleshooting
220
-
221
- - **Hook failures**: Treat the same way `/git-push` does — read the
222
- output, fix the underlying issue, never `--no-verify`. The pre-push
223
- hook (lint + format + maintainability + audit + coverage + CRAP) is
224
- the same gate every PR has to pass eventually; failing here lets you
225
- fix it before opening the PR rather than after CI fails.
226
- - **Branch already exists locally**: appended `-2`/`-3` per Step 2; this
227
- is the same behaviour `gh repo` uses. If you want a specific name,
228
- pass `--branch <name>` explicitly.
229
- - **`gh pr create` fails with "no commits between branches"**: the push
230
- in Step 4 did not actually move the branch (e.g., it was already at
231
- the same SHA as `[BASE_BRANCH]`). Verify `git log <BASE_BRANCH>..HEAD`
232
- shows commits before re-running.
233
- - **PR template wins over `--body`**: if `.github/pull_request_template.md`
234
- exists, `gh pr create --body` overrides it. To opt into the template
235
- flow, drop the `--body` flag in Step 5 and pass `--editor` instead —
236
- but that requires an interactive session. For ad-hoc PRs the explicit
237
- body is the right default.
238
- - **Auto-merge does not fire after CI green**: confirm the PR's required
239
- checks match the auto-merge requirements. The framework's quality gate
240
- (`Validate and Test`) is the canonical required check; other checks
241
- may be informational. Use the GitHub UI's "Merge when ready" surface
242
- to inspect the queue state.
243
-
244
- ---
245
-
246
- ## Constraint
247
-
248
- - **Never** push directly to `[BASE_BRANCH]`. Step 2's branch cut is
249
- mandatory in `from-base` mode; remove it and the workflow becomes a
250
- silent bypass of the PR-required policy.
251
- - **Never** pass `--no-verify` to `git commit` or `git push` to bypass
252
- the quality gate. Fix the failure at the source.
253
- - **Never** force-push from `/git-pr-all`. This workflow is for opening
254
- new PRs, not for rewriting history. Force-pushes belong to
255
- `/git-merge-pr` (with `--force-with-lease` after a rebase) and
256
- `/deliver` Phase 7 (with the operator's explicit context).
257
- - **Always** delete the head branch on merge (Step 6's
258
- `--delete-branch` flag handles this for `--auto` mode; for
259
- `--no-auto-merge` PRs the operator is responsible for the cleanup).
260
- - **Always** prefer `--auto --squash --delete-branch` unless the
261
- operator explicitly opts out. The squash + auto-merge default gives
262
- the same merge ergonomics `/deliver` produces, so main's commit
263
- history stays uniform across both surfaces.
264
-
265
- ---
266
-
267
- ## ⚠️ Parallel Story Execution
268
-
269
- Do **not** use this workflow from inside a parallel story-execution
270
- context (`/deliver #<storyId>`, `/deliver` wave dispatch).
271
- `git add -A` sweeps any untracked files in the working tree, which in
272
- a shared working directory may belong to another agent. In those
273
- contexts stage explicit paths only and confirm
274
- `git branch --show-current` reports the expected `story-<id>` branch
275
- before committing — see
276
- [`helpers/worktree-lifecycle.md`](helpers/worktree-lifecycle.md) for the
277
- shared-tree hazard and the worktree-isolation model that contains it.
278
-
279
- The same warning applies to any workflow that calls `git add .` or
280
- `git add -A`; this is not unique to `/git-pr-all` (see
281
- [`git-push.md`](git-push.md) for the canonical version).
@@ -1,63 +0,0 @@
1
- ---
2
- description: Commit all outstanding changes then push to the remote repository.
3
- ---
4
-
5
- # /git-push [Message] [--no-push]
6
-
7
- This workflow is the single source of truth for "stage + commit [+ push]"
8
- ergonomics. It accepts an optional `[Message]` and an optional `--no-push` flag.
9
-
10
- - **Default mode** — stage all outstanding changes, commit, then push the
11
- current branch to its upstream remote.
12
- - **`--no-push` mode** — stage and commit only. Useful when you want to chain
13
- several commits or defer the push. `/git-commit-all` is a compatibility alias
14
- that maps to this mode.
15
-
16
- ## Steps
17
-
18
- 1. **Stage Changes**: Stage all new, modified, and deleted files.
19
-
20
- ```powershell
21
- git add .
22
- ```
23
-
24
- 2. **Commit Changes**: Commit the staged changes. If no message is provided, a
25
- generic timestamped message will be used.
26
-
27
- ```powershell
28
- git commit -m "[Message]"
29
- ```
30
-
31
- 3. **Push to Remote** _(skip when `--no-push` is set)_: Push the current branch
32
- to the upstream repository.
33
-
34
- ```powershell
35
- git push
36
- ```
37
-
38
- ## Troubleshooting
39
-
40
- - **Hook Failures**: If `git commit` or `git push` fails due to Husky/pre-commit
41
- hooks (e.g., linting, formatting, or test failures), you MUST analyze the
42
- error output, fix the issues in the codebase, and then re-run the failed
43
- command.
44
- - **Upstream Conflicts**: If the push is rejected because the remote contains
45
- work that you do not have locally, pull the latest changes first
46
- (`git pull --rebase`) and resolve any conflicts before pushing again.
47
-
48
- ## Constraint
49
-
50
- Never use `--no-verify` to bypass quality gates. If a hook fails, identify and
51
- fix the root cause (e.g., run `npm run format` or fix lint errors) before
52
- attempting to commit or push again.
53
-
54
- ## ⚠️ Parallel Story Execution
55
-
56
- Do **not** use this workflow from inside a parallel story-execution context
57
- (`/deliver #<storyId>`). `git add .` sweeps any untracked files in the
58
- working tree, which in a shared working directory may belong to another agent.
59
- In that context, stage explicit paths only and confirm
60
- `git branch --show-current` reports the expected `story-<id>` branch before
61
- committing — see
62
- [`helpers/worktree-lifecycle.md`](helpers/worktree-lifecycle.md) for the
63
- shared-tree hazard and the worktree-isolation model that contains it.