mandrel 1.86.0 โ†’ 1.88.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 (40) hide show
  1. package/.agents/docs/SDLC.md +15 -3
  2. package/.agents/docs/configuration.md +2 -0
  3. package/.agents/instructions.md +7 -0
  4. package/.agents/rules/git-conventions.md +13 -1
  5. package/.agents/schemas/agentrc.schema.json +12 -0
  6. package/.agents/scripts/boot-sweep.js +36 -4
  7. package/.agents/scripts/git-cleanup.js +8 -0
  8. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +107 -30
  9. package/.agents/scripts/lib/config/explain.js +4 -0
  10. package/.agents/scripts/lib/config/runners.js +13 -2
  11. package/.agents/scripts/lib/config-settings-schema-delivery.js +7 -0
  12. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -0
  13. package/.agents/scripts/lib/epic-plan-ideation.js +24 -3
  14. package/.agents/scripts/lib/feedback-loop/audit-results-graduator.js +19 -5
  15. package/.agents/scripts/lib/feedback-loop/code-review-graduator.js +17 -0
  16. package/.agents/scripts/lib/framework-version.js +210 -0
  17. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +7 -22
  18. package/.agents/scripts/lib/orchestration/epic-cleanup.js +41 -5
  19. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +34 -3
  20. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +102 -7
  21. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +85 -1
  22. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +34 -3
  23. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +71 -4
  24. package/.agents/scripts/lib/single-story-sweep.js +60 -5
  25. package/.agents/scripts/lib/story-body/story-body.js +81 -4
  26. package/.agents/scripts/providers/github/tickets.js +18 -1
  27. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +7 -2
  28. package/.agents/skills/core/epic-plan-premortem/SKILL.md +8 -2
  29. package/.agents/skills/skills.index.json +3 -3
  30. package/.agents/skills/stack/architecture/subagent-orchestration/SKILL.md +36 -8
  31. package/.agents/workflows/git-cleanup.md +72 -18
  32. package/.agents/workflows/helpers/acceptance-self-eval.md +23 -1
  33. package/.agents/workflows/helpers/code-review.md +83 -7
  34. package/.agents/workflows/helpers/deliver-epic.md +46 -7
  35. package/.agents/workflows/helpers/epic-audit.md +153 -12
  36. package/.agents/workflows/helpers/parallel-tooling.md +9 -2
  37. package/.agents/workflows/helpers/plan-epic.md +32 -14
  38. package/.agents/workflows/loops/nightly-audit.md +9 -1
  39. package/docs/CHANGELOG.md +22 -0
  40. package/package.json +1 -1
@@ -1,8 +1,10 @@
1
1
  ---
2
2
  description: >-
3
3
  Run smart change-set audits at Epic finalize. Consumes the epic-audit-prepare
4
- envelope, dispatches each selected lens inline via runAuditSuite, and posts
5
- an audit-results structured comment back onto the Epic ticket.
4
+ envelope, dispatches each selected lens (inline, or via a single
5
+ audit-orchestrator sub-agent that fans the lenses out as parallel level-2
6
+ agents) through runAuditSuite, and posts an audit-results structured comment
7
+ back onto the Epic ticket.
6
8
  ---
7
9
 
8
10
  # Epic Audit (helper)
@@ -197,6 +199,62 @@ After the runner returns:
197
199
  ๐ŸŸก Medium / ๐ŸŸข Suggestion). Hold the aggregate for Step 3
198
200
  (auto-fix) and Step 4 (the `audit-results` structured comment).
199
201
 
202
+ ### Optional: delegate the roster walk to an audit-orchestrator sub-agent
203
+
204
+ The Step 2 loop above walks the `selectedAudits` roster **serially in the
205
+ host's own context**. When the roster carries more than one lens, `/deliver`
206
+ Phase 4 MAY instead delegate the whole walk to a **single audit-orchestrator
207
+ sub-agent** โ€” one level-1 `Agent` call (`subagent_type: general-purpose`) โ€” that:
208
+
209
+ 1. Receives the **already-selected** `selectedAudits` roster, the run's
210
+ `depth`, and the prepare envelope's substitution payload. It does **not**
211
+ re-run `selectAudits` and does **not** widen the roster โ€” the roster is
212
+ fixed upstream by Step 1 (see the Constraints below).
213
+ 2. Fans the roster out as **parallel level-2 agents, one per lens** (nested
214
+ `Agent` dispatch โ€” verified depth 2, announced max depth 5, per
215
+ [#2870](https://github.com/dsj1984/mandrel/issues/2870) and the
216
+ "Flat Story dispatch by design" note in
217
+ [`deliver-epic.md`](deliver-epic.md)). Each level-2 agent executes exactly
218
+ one lens's workflow procedure at the run's `depth`, isolated from the main
219
+ context.
220
+ 3. Collects the per-lens findings, **aggregates them by severity** (๐Ÿ”ด / ๐ŸŸ  /
221
+ ๐ŸŸก / ๐ŸŸข), and returns **only the aggregated audit-results** to the host โ€”
222
+ the per-lens reasoning transcripts stay in the level-2 leaves and never
223
+ enter the main context. The host resumes at Step 3 (remediation routing)
224
+ with the aggregate exactly as if it had walked the roster itself, and Step 4
225
+ posts the identical `audit-results` comment.
226
+
227
+ This delegation is a **cross-lens parallelization of the roster walk only**. It
228
+ is orthogonal to โ€” and MUST NOT be conflated with โ€” the *per-lens execution
229
+ strategy*:
230
+
231
+ - **The per-lens cost/precision gate is preserved.** Each level-2 lens agent
232
+ still runs its own lens at whatever strategy that lens's cost/precision gate
233
+ dictates (`docs/roadmap.md` ยง "The per-lens cost / precision gate"): an
234
+ orchestrated lens fans its own analysis dimensions out under
235
+ `runAuditOrchestration`, a sequential-only lens runs turn-by-turn. Fanning
236
+ the *roster* out in parallel changes **which context** runs a lens, never
237
+ **how** that lens runs internally, so no per-lens cost gate is bypassed or
238
+ altered.
239
+ - **The "do not batch-convert the sequential-only lenses" rule is preserved.**
240
+ The seven sequential-only lenses (`audit-dependencies`, `audit-devops`,
241
+ `audit-sre`, `audit-privacy`, `audit-seo`, `audit-ux-ui`,
242
+ `audit-lighthouse`) stay sequential **inside** their level-2 agent.
243
+ Dispatching them as parallel level-2 agents is **not** a batch-conversion of
244
+ their internal execution โ€” a sequential-only lens remains sequential-only
245
+ (`docs/roadmap.md` ยง "Remaining orchestration surface"). Generalizing any of
246
+ those lenses to orchestrated is still a separate, gated, lens-by-lens
247
+ decision that this roster fan-out neither performs nor pre-empts.
248
+
249
+ Weigh the whole subtree's token cost before delegating
250
+ ([`.agents/instructions.md` ยง 4](../../instructions.md) โ€” cost compounds with
251
+ nesting depth): the level-1 orchestrator plus one level-2 agent per lens
252
+ re-pays the always-loaded context at each level. For a single-lens roster the
253
+ serial host walk is cheaper; the delegation pays off when several lenses fan
254
+ out at once. Either path produces the identical Step 4 `audit-results` comment,
255
+ so the delegation is a performance/context-isolation choice, never a change to
256
+ what gets audited or reported.
257
+
200
258
  If a future Story lifts per-lens execution out of the host-LLM walk
201
259
  into the CLI itself, the runner will populate `findings[]` and this
202
260
  section will collapse to a "read the structured findings off the
@@ -205,9 +263,32 @@ envelope" bullet. Until then, the host LLM is the gate.
205
263
  ## Step 3 โ€” Remediation Routing (host LLM, no automated loop)
206
264
 
207
265
  There is **no runtime auto-fix function** at this phase. The host LLM is
208
- the executor: it inspects the aggregated ๐Ÿ”ด / ๐ŸŸ  findings from Step 2 and
209
- either applies a focused fix on the Epic branch or escalates the finding
210
- to the operator via the `audit-results` comment in Step 4.
266
+ the executor: it inspects the aggregated findings from Step 2 and either
267
+ applies a focused fix on the Epic branch or escalates the finding to the
268
+ operator via the `audit-results` comment in Step 4.
269
+
270
+ ### Resolve the remediation threshold (Story #4399)
271
+
272
+ Read `delivery.epicAudit.autoFixSeverity` from the resolved `.agentrc.json`
273
+ (default **`medium`**; the resolver in
274
+ [`config/runners.js`](../../scripts/lib/config/runners.js) supplies the
275
+ default when the key is absent). The threshold governs **which severities
276
+ route into on-branch remediation** โ€” it never changes the halting rule
277
+ (a surviving ๐Ÿ”ด still stops Phase 4 in Step 4) or the escalation classes:
278
+
279
+ - **`medium`** (default) โ€” route ๐Ÿ”ด Critical, ๐ŸŸ  High, **and ๐ŸŸก Medium**
280
+ findings into remediation. ๐ŸŸข Suggestions still graduate to follow-up
281
+ issues (never auto-fixed).
282
+ - **`high`** โ€” route only ๐Ÿ”ด Critical and ๐ŸŸ  High findings into
283
+ remediation, reproducing the pre-4399 behavior exactly. ๐ŸŸก Medium and
284
+ ๐ŸŸข Suggestion findings graduate to follow-up issues untouched.
285
+
286
+ This is a hard cutover per
287
+ [`rules/git-conventions.md`](../../rules/git-conventions.md) ยง Contract
288
+ Cutovers โ€” there is no back-compat flag; `high` is opt-in to the old
289
+ routing, `medium` is the shipped default.
290
+
291
+ ### ๐Ÿ”ด / ๐ŸŸ  findings โ€” per-finding ceremony (unchanged)
211
292
 
212
293
  For each ๐Ÿ”ด / ๐ŸŸ  finding, the host LLM MUST decide between two paths:
213
294
 
@@ -239,10 +320,42 @@ For each ๐Ÿ”ด / ๐ŸŸ  finding, the host LLM MUST decide between two paths:
239
320
  attempt (the equivalent of the prior loop's
240
321
  `validation-regression` / `thrash-detected` exits).
241
322
 
323
+ ### ๐ŸŸก Medium findings โ€” batched per-lens ceremony (only when `autoFixSeverity: medium`)
324
+
325
+ When the threshold is `medium`, remediate the fixable ๐ŸŸก Medium findings
326
+ in a **batch keyed by owning lens** rather than the per-finding ceremony
327
+ above โ€” the per-finding rescan is disproportionate for the volume of
328
+ Mediums a wide change set surfaces:
329
+
330
+ 1. Group the fixable Mediums by their owning lens. A Medium is fixable on
331
+ the same terms as a ๐ŸŸ  (clean remediation, no escalation class); a
332
+ Medium that falls into any escalation class (`spec-deviation`,
333
+ `secrets`, `test-deletion`, `scope-exceeded`) routes to Step 4
334
+ untouched exactly like a ๐ŸŸ .
335
+ 2. For each lens, call `assert-branch.js --expected [EPIC_BRANCH]`, stage
336
+ explicit paths only, and make **one focused conventional commit per
337
+ lens** carrying all that lens's Medium fixes
338
+ (`fix(<scope>): <description> (audit findings batch)`).
339
+ 3. The bounded-attempt semantics extend to the batch: each finding in the
340
+ batch gets **at most one** attempt, and a lens's batch commit that
341
+ would exceed `delivery.epicAudit.maxFixScopeFiles` routes that lens's
342
+ findings to escalation (`scope-exceeded`) instead of committing.
343
+ 4. After **all** lens batches are committed, run a **single** validation
344
+ pass (`npm run lint` plus the relevant `npm test` slice) and a
345
+ **single** rescan of the **overlapping lenses only** (re-invoke
346
+ `run-audit-suite.js` for the lenses whose findings were touched).
347
+ Confirm the batched findings are gone. If a batched finding survives
348
+ the rescan or validation regresses, route the surviving finding(s) to
349
+ escalation and record the attempt context in Step 4.
350
+
351
+ Record every remediated finding (๐ŸŸ  or ๐ŸŸก) in the **"Fixed on-branch"**
352
+ section of the `audit-results` comment (Step 4) so it does not graduate to
353
+ a follow-up issue.
354
+
242
355
  Do not invent a programmatic retry budget. The host LLM applies *at most
243
- one* focused-fix attempt per finding before escalating; any further
244
- remediation is the operator's call after reading the `audit-results`
245
- comment.
356
+ one* focused-fix attempt per finding (or per batched finding) before
357
+ escalating; any further remediation is the operator's call after reading
358
+ the `audit-results` comment.
246
359
 
247
360
  Escalated findings flow through to Step 4 unchanged with their
248
361
  escalation reason recorded โ€” the audit pass does not delete them, it
@@ -274,12 +387,40 @@ The body MUST include:
274
387
  - a link to the per-lens artifact files under `<auditOutputDir>` so the
275
388
  operator (and downstream retro) can re-read the full prompt body.
276
389
 
390
+ ### The `## Fixed on-branch` section (Story #4399)
391
+
392
+ Findings that Step 3 remediated on the Epic branch MUST be rendered under a
393
+ dedicated **`## Fixed on-branch`** heading, **not** under their lens's
394
+ open-findings group. This is the contract seam that keeps remediated
395
+ findings from spawning ghost follow-up issues: the
396
+ [`audit-results` graduator](../../scripts/lib/feedback-loop/audit-results-graduator.js)
397
+ skips every entry inside this section (both because a fixed entry is
398
+ rendered with a **โœ… prefix** โ€” so it carries no leading severity emoji the
399
+ parser would match โ€” and because the parser has an explicit
400
+ Fixed-on-branch section guard).
401
+
402
+ Render each fixed finding as a `โœ…`-prefixed line naming its original
403
+ severity, the file path in backticks, and the remediating commit SHA, e.g.:
404
+
405
+ ```markdown
406
+ ## Fixed on-branch
407
+
408
+ - โœ… ๐ŸŸก Medium (audit-clean-code): `.agents/scripts/foo.js` โ€” dead branch removed (a1b2c3d)
409
+ - โœ… ๐ŸŸ  High (audit-security): `src/api/users.js` โ€” ownership check added (d4e5f6a)
410
+ ```
411
+
412
+ Open (escalated / unfixed) findings stay under their lens heading with
413
+ their leading severity emoji so the graduator still files them.
414
+
277
415
  ### Severity gating
278
416
 
279
- - **Any ๐Ÿ”ด Critical Blocker** โ†’ STOP. Relay to the operator and let
280
- `/deliver` Phase 4 record a manual intervention.
281
- - **Only ๐ŸŸ /๐ŸŸก/๐ŸŸข** โ†’ log as non-blocking and return to `/deliver`
282
- Phase 5 (code-review).
417
+ The gate is unchanged by the threshold โ€” it keys off the **surviving**
418
+ (unfixed) findings after Step 3:
419
+
420
+ - **Any surviving ๐Ÿ”ด Critical Blocker** โ†’ STOP. Relay to the operator and
421
+ let `/deliver` Phase 4 record a manual intervention.
422
+ - **Only ๐ŸŸ /๐ŸŸก/๐ŸŸข surviving** โ†’ log as non-blocking and return to
423
+ `/deliver` Phase 5 (code-review).
283
424
 
284
425
  ## Constraints
285
426
 
@@ -76,8 +76,15 @@ If a unit of work is both long (Rule 2) and independent (Rule 1 or 3),
76
76
  prefer the higher-numbered rule โ€” the parallelism gain compounds the
77
77
  background-shell gain. Concretely: dispatch the `Agent` calls in one turn
78
78
  (Rule 3), and **inside** each sub-agent let it apply Rule 2 to its own
79
- long-running shells. The host does not need to micromanage the child's
80
- shell strategy.
79
+ long-running shells โ€” and, within the supported nesting depth budget
80
+ (verified depth 2, announced max depth 5; see
81
+ [#2870](https://github.com/dsj1984/mandrel/issues/2870)), let it apply
82
+ **Rule 3** to its own independent sub-units as well, not only Rule 2
83
+ background shells. A sub-agent is a full orchestrator at its own level:
84
+ recursive `Agent` fan-out is available to it, so the host does not need to
85
+ micromanage the child's shell **or** dispatch strategy. Mind the depth
86
+ budget and the compounding cost โ€” every nesting level re-pays the
87
+ always-loaded context (see [`instructions.md` ยง 4](../../instructions.md)).
81
88
 
82
89
  ## Constraints
83
90
 
@@ -683,26 +683,36 @@ node .agents/scripts/epic-plan-spec-validate.js \
683
683
 
684
684
  3. **Phase 8.3 โ€” Holistic Consolidation (HITL diff gate)**: After the
685
685
  draft `temp/epic-[Epic_ID]/tickets.json` exists and **before** the persist
686
- call below, activate the
686
+ call below, **dispatch a genuine fresh-context sub-agent** (`Agent` tool,
687
+ `subagent_type: general-purpose`) whose task is to read the
687
688
  [`epic-plan-consolidate`](../../skills/core/epic-plan-consolidate/SKILL.md)
688
- skill with `[Epic_ID]` as input. This is a **separate critic pass with
689
- fresh context** (not a self-review appended to the author skill): it reads
690
- the draft array plus the Epic body (which carries the Tech Spec
691
- sections), reconciles the draft against
689
+ skill and execute its procedure with `[Epic_ID]` as input. Dispatching the critic
690
+ as a sub-agent โ€” **not** activating the skill inline in your authoring
691
+ turn โ€” is what makes it a **separate critic pass with fresh context**: the
692
+ sub-agent does not inherit the conversation that authored the draft, so it
693
+ cannot grade its own homework (the same nested-dispatch mechanic the
694
+ acceptance self-eval loop uses, now that the sub-agent depth limit is
695
+ lifted โ€” see [`.agents/instructions.md` ยง 4](../../instructions.md)). The
696
+ sub-agent reads the draft array plus the Epic body (which carries the Tech
697
+ Spec sections), reconciles the draft against
692
698
  the Tech Spec `## Delivery Slicing` target, and emits a **consolidated**
693
699
  `tickets.json` plus a human-readable
694
700
  `temp/epic-[Epic_ID]/consolidation-report.md`. Its operations are
695
701
  scope-preserving only โ€” **merge sibling Stories and rewire
696
702
  `depends_on`** โ€” and it MUST NOT add scope or invent tickets; it
697
703
  consolidates fragmented slices by merging them into a cohesive Story,
698
- never by splitting one. It runs **before** the deterministic
704
+ never by splitting one. The sub-agent **never writes to GitHub**: it emits
705
+ only the two temp artifacts and returns control to this operator session.
706
+ It runs **before** the deterministic
699
707
  validator (step 7), so the validator re-checks its output and the critic
700
708
  cannot emit an invalid plan.
701
709
 
702
710
  **Show the operator the consolidation report (the before/after diff +
703
- rationale) before persisting.** Consolidation is never auto-applied without
704
- review: on operator approval, persist the consolidated `tickets.json`; on
705
- rejection, persist the draft instead. This is a sub-step of Phase 8 โ€” it
711
+ rationale) before persisting.** The HITL diff-confirm and the persist call
712
+ both run here in the **operator session**, never inside the sub-agent โ€”
713
+ consolidation is never auto-applied without review: on operator approval,
714
+ persist the consolidated `tickets.json`; on rejection, persist the draft
715
+ instead. This is a sub-step of Phase 8 โ€” it
706
716
  does **not** renumber the top-level lifecycle phases (9โ€“12).
707
717
 
708
718
  4. **Phase 8.4 โ€” Reachability Completeness Critic (HITL diff gate, F6)**:
@@ -742,11 +752,17 @@ node .agents/scripts/epic-plan-spec-validate.js \
742
752
  invalid addition cannot reach GitHub.
743
753
 
744
754
  5. **Phase 8.5 โ€” Planning Pre-Mortem Critic (code-reading, F9)**: After the
745
- reachability critic (8.4) and **before** the persist call below, activate the
755
+ reachability critic (8.4) and **before** the persist call below, **dispatch a
756
+ genuine fresh-context sub-agent** (`Agent` tool,
757
+ `subagent_type: general-purpose`) whose task is to read the
746
758
  [`epic-plan-premortem`](../../skills/core/epic-plan-premortem/SKILL.md)
747
- skill with `[Epic_ID]` as input. This is a **fresh-context critic** sibling
748
- to `epic-plan-consolidate`: it reads the drafted `tickets.json`, the Epic
749
- body (with its folded Tech Spec sections), **and the actual cited code
759
+ skill and execute its procedure with `[Epic_ID]` as input. Like the 8.3
760
+ consolidate pass, dispatching the critic as a sub-agent โ€” **not** activating
761
+ the skill inline in your authoring turn โ€” is what makes it a genuine
762
+ **fresh-context critic** sibling to `epic-plan-consolidate`: the sub-agent
763
+ does not inherit the authoring conversation, so its code-reading review is
764
+ independent of the draft it grades. It reads the drafted `tickets.json`, the
765
+ Epic body (with its folded Tech Spec sections), **and the actual cited code
750
766
  surfaces** (the files each Story's
751
767
  `changes[]` / `references[]` name), then emits predicted-rework findings โ€”
752
768
  unverifiable acceptance criteria, over- or under-specified Stories, and
@@ -756,7 +772,9 @@ node .agents/scripts/epic-plan-spec-validate.js \
756
772
  Unlike the consolidate critic it is **not** scope-preserving-only: it may
757
773
  recommend splitting an under-specified Story or tightening an AC. But it
758
774
  **never writes to GitHub** and never persists `tickets.json` โ€” it only emits
759
- the report. Its findings are shown in the **same Phase 8 HITL diff**, and on
775
+ the report and returns control to this operator session. Its findings are
776
+ shown in the **same Phase 8 HITL diff** (which stays in the operator
777
+ session), and on
760
778
  operator approval the author re-runs (Step 2) on the findings **before** the
761
779
  persist call. The critic runs **before** the deterministic validator (step
762
780
  7), so the persist below is the single GitHub write for the whole phase.
@@ -32,7 +32,15 @@ Each scheduled run:
32
32
  (`/audit-security`, `/audit-clean-code`, `/audit-dependencies`,
33
33
  `/audit-quality`, and any others the project relies on). Each audit writes a
34
34
  structured `temp/audits/audit-*-results.md` report โ€” that is the canonical
35
- artifact this loop consumes, not free-form prose.
35
+ artifact this loop consumes, not free-form prose. Because these audits are
36
+ **independent** of one another, a scheduled run **may fan them out to
37
+ parallel sub-agents** (one per audit) rather than walking them serially โ€”
38
+ the same cross-lens parallelization `/deliver` Phase 4 uses (see
39
+ [`../helpers/epic-audit.md` ยง "Optional: delegate the roster walk to an
40
+ audit-orchestrator sub-agent"](../helpers/epic-audit.md)). Each sub-agent
41
+ returns only its structured report; the scheduler/host owns the fan-out just
42
+ as it owns the cadence, and each per-audit strategy (sequential or
43
+ orchestrated) is unchanged by running under its own sub-agent.
36
44
  2. **Diff against the prior night.** Compare the fresh findings against the last
37
45
  sweep's reports and against already-open Issues. A finding seen before is
38
46
  not new signal; only genuinely fresh or regressed findings warrant a record.
package/docs/CHANGELOG.md CHANGED
@@ -2,6 +2,28 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [1.88.0](https://github.com/dsj1984/mandrel/compare/mandrel-v1.87.0...mandrel-v1.88.0) (2026-07-08)
6
+
7
+
8
+ ### Added
9
+
10
+ * **delivery:** threshold-aware auto-fix remediates Medium findings on-branch (refs [#4399](https://github.com/dsj1984/mandrel/issues/4399)) ([#4400](https://github.com/dsj1984/mandrel/issues/4400)) ([34964b3](https://github.com/dsj1984/mandrel/commit/34964b3665852bf43081f6d893430ff9a0a1f630))
11
+
12
+ ## [1.87.0](https://github.com/dsj1984/mandrel/compare/mandrel-v1.86.0...mandrel-v1.87.0) (2026-07-08)
13
+
14
+
15
+ ### Added
16
+
17
+ * **boot-sweep:** report content-merged branches and align sweep docs ([#4396](https://github.com/dsj1984/mandrel/issues/4396)) ([#4398](https://github.com/dsj1984/mandrel/issues/4398)) ([8c9c938](https://github.com/dsj1984/mandrel/commit/8c9c938d34c0bcbdaeb607f5a148261925a58622))
18
+ * Epic [#4385](https://github.com/dsj1984/mandrel/issues/4385) ([#4392](https://github.com/dsj1984/mandrel/issues/4392)) ([0999dca](https://github.com/dsj1984/mandrel/commit/0999dcac00a708bca0d1a9664f46d8f79c9ffe11))
19
+ * **git-cleanup:** detect content-merged branches and surface silent skips (refs [#4395](https://github.com/dsj1984/mandrel/issues/4395)) ([#4397](https://github.com/dsj1984/mandrel/issues/4397)) ([a5ddabf](https://github.com/dsj1984/mandrel/commit/a5ddabf41f25a75cb5b63e0f51ed05e8dcfcf81d))
20
+ * **planning:** stamp authoring Mandrel version onto Epic and Story bodies (refs [#4382](https://github.com/dsj1984/mandrel/issues/4382)) ([#4383](https://github.com/dsj1984/mandrel/issues/4383)) ([db3de0a](https://github.com/dsj1984/mandrel/commit/db3de0a9302a8f3aa97b06ad74af04879aaba53a))
21
+
22
+
23
+ ### Fixed
24
+
25
+ * branchCleaner false-blocks a successfully-merged Epic when local branches are already reaped ([#4393](https://github.com/dsj1984/mandrel/issues/4393)) ([#4394](https://github.com/dsj1984/mandrel/issues/4394)) ([83a5604](https://github.com/dsj1984/mandrel/commit/83a5604b55aab470d9c4c08ee9d66b4b181af81a))
26
+
5
27
  ## [1.86.0](https://github.com/dsj1984/mandrel/compare/mandrel-v1.85.0...mandrel-v1.86.0) (2026-07-07)
6
28
 
7
29
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mandrel",
3
- "version": "1.86.0",
3
+ "version": "1.88.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/",