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.
- package/.agents/docs/SDLC.md +15 -3
- package/.agents/docs/configuration.md +2 -0
- package/.agents/instructions.md +7 -0
- package/.agents/rules/git-conventions.md +13 -1
- package/.agents/schemas/agentrc.schema.json +12 -0
- package/.agents/scripts/boot-sweep.js +36 -4
- package/.agents/scripts/git-cleanup.js +8 -0
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +107 -30
- package/.agents/scripts/lib/config/explain.js +4 -0
- package/.agents/scripts/lib/config/runners.js +13 -2
- package/.agents/scripts/lib/config-settings-schema-delivery.js +7 -0
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -0
- package/.agents/scripts/lib/epic-plan-ideation.js +24 -3
- package/.agents/scripts/lib/feedback-loop/audit-results-graduator.js +19 -5
- package/.agents/scripts/lib/feedback-loop/code-review-graduator.js +17 -0
- package/.agents/scripts/lib/framework-version.js +210 -0
- package/.agents/scripts/lib/orchestration/context-hydration-engine.js +7 -22
- package/.agents/scripts/lib/orchestration/epic-cleanup.js +41 -5
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +34 -3
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +102 -7
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +85 -1
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +34 -3
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +71 -4
- package/.agents/scripts/lib/single-story-sweep.js +60 -5
- package/.agents/scripts/lib/story-body/story-body.js +81 -4
- package/.agents/scripts/providers/github/tickets.js +18 -1
- package/.agents/skills/core/epic-plan-consolidate/SKILL.md +7 -2
- package/.agents/skills/core/epic-plan-premortem/SKILL.md +8 -2
- package/.agents/skills/skills.index.json +3 -3
- package/.agents/skills/stack/architecture/subagent-orchestration/SKILL.md +36 -8
- package/.agents/workflows/git-cleanup.md +72 -18
- package/.agents/workflows/helpers/acceptance-self-eval.md +23 -1
- package/.agents/workflows/helpers/code-review.md +83 -7
- package/.agents/workflows/helpers/deliver-epic.md +46 -7
- package/.agents/workflows/helpers/epic-audit.md +153 -12
- package/.agents/workflows/helpers/parallel-tooling.md +9 -2
- package/.agents/workflows/helpers/plan-epic.md +32 -14
- package/.agents/workflows/loops/nightly-audit.md +9 -1
- package/docs/CHANGELOG.md +22 -0
- 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
|
|
5
|
-
|
|
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
|
|
209
|
-
|
|
210
|
-
|
|
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
|
|
244
|
-
remediation is the operator's call after reading
|
|
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
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
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
|
|
80
|
-
|
|
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,
|
|
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.
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
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.
|
|
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.**
|
|
704
|
-
|
|
705
|
-
|
|
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,
|
|
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.
|
|
748
|
-
|
|
749
|
-
|
|
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
|
|
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