@mmerterden/multi-agent-pipeline 16.2.2 → 16.3.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/CHANGELOG.md
CHANGED
|
@@ -16,6 +16,23 @@ Internal file-layout changes that don't affect the slash-command surface are sti
|
|
|
16
16
|
|
|
17
17
|
## [Unreleased]
|
|
18
18
|
|
|
19
|
+
## [16.3.0] - 2026-08-24
|
|
20
|
+
|
|
21
|
+
Three defects the 16.2.0 review named but did not close, plus one it caused.
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
|
|
25
|
+
- **A section body ran past its own section.** `sectionBody` closed on the next heading at the same depth, so a sub-section that is the last of its parent had no terminator and swallowed everything up to the next sibling. In practice 13.1 ran into Section 14 and the Locked 24 check audited the Files-to-Add rows as concept-table rows, failing a correct document with three errors. It closes on any shallower heading now. Found by running a realistic template-conforming document through the gate, which is something the 16.2.0 fixtures never did: every one of them happened to put the concept table last.
|
|
26
|
+
|
|
27
|
+
### Added
|
|
28
|
+
|
|
29
|
+
- **`smoke-state-keys-declared.sh`** - every `state` root a phase doc names must be declared in `agent-state.schema.json`. 16.2.0 fixed `lastAnalysisDigest` by adding a sentence telling Phase 1 to persist it, which is the same shape as the bug it fixed: a contract asserted in prose with nothing checking it. This checks the half a machine can. The twenty roots the schema never declared are held in an explicit grandfather list that may shrink and never grow, and the gate fails if a grandfathered key gets declared and stays on the list.
|
|
30
|
+
- **`smoke-doc-model-claims.sh`** - a model named in a README phase line must be the model the persona file declares. Both READMEs credited Phase 1 to Opus for several releases while `explorer.md` had said `sonnet` all along. 16.2.1 fixed the two lines; this fixes the class. Proven against the original regression by putting it back.
|
|
31
|
+
|
|
32
|
+
### Known
|
|
33
|
+
|
|
34
|
+
- Both new gates read declarations, not behaviour. Nothing verifies that Phase 1 actually writes the digest at runtime, or that a Turkish document comes out clearer for the humanizer rules. Those are model instructions, and a gate over prose can only check that the instruction is present and self-consistent.
|
|
35
|
+
|
|
19
36
|
## [16.2.2] - 2026-08-24
|
|
20
37
|
|
|
21
38
|
### Fixed
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mmerterden/multi-agent-pipeline",
|
|
3
|
-
"version": "16.
|
|
3
|
+
"version": "16.3.0",
|
|
4
4
|
"description": "8-phase AI development pipeline with full orchestration on Claude Code, Copilot CLI and Codex CLI. Analysis, planning, TDD, CLI-aware parallel review with consensus surfacing + Fable triage, default-FAIL evidence gates, secret + intent guards, per-phase cost ledger, persistent learnings memory, wiki generation, commit automation. Token-preserving uninstall.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "index.js",
|
|
@@ -95,10 +95,15 @@ function parseFrontMatter(text) {
|
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
function sectionBody(lines, keywords, level = 2) {
|
|
98
|
-
|
|
98
|
+
// Opened by a heading at exactly `level`; closed by the next heading at that
|
|
99
|
+
// level OR ANY SHALLOWER one. A sub-section that is the last of its parent has
|
|
100
|
+
// no sibling after it, so terminating only on equal depth runs the body into
|
|
101
|
+
// the following section and audits its rows as if they belonged here.
|
|
102
|
+
const open = new RegExp(`^#{${level}}\\s+\\d+(\\.\\d+)*\\.?\\s`);
|
|
103
|
+
const close = new RegExp(`^#{1,${level}}\\s`);
|
|
99
104
|
let start = -1;
|
|
100
105
|
for (let i = 0; i < lines.length; i++) {
|
|
101
|
-
if (
|
|
106
|
+
if (open.test(lines[i]) && keywords.some((k) => lines[i].includes(k))) {
|
|
102
107
|
start = i;
|
|
103
108
|
break;
|
|
104
109
|
}
|
|
@@ -106,7 +111,7 @@ function sectionBody(lines, keywords, level = 2) {
|
|
|
106
111
|
if (start < 0) return null;
|
|
107
112
|
let end = lines.length;
|
|
108
113
|
for (let i = start + 1; i < lines.length; i++) {
|
|
109
|
-
if (
|
|
114
|
+
if (close.test(lines[i])) {
|
|
110
115
|
end = i;
|
|
111
116
|
break;
|
|
112
117
|
}
|