@dzhechkov/skills-feature-adr 1.5.7 → 1.5.10

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/.dz-manifest.json CHANGED
@@ -13,7 +13,7 @@
13
13
  },
14
14
  {
15
15
  "path": "README.md",
16
- "sha256": "4ab808507be5c64cfa7b74ef3c186145d0654cd9c2fad86229685edaac6edb10"
16
+ "sha256": "b1dbcb7b1f0f3d95bdda9f9568f65e1f78b306b2cb64e42979b1981aeadc6047"
17
17
  },
18
18
  {
19
19
  "path": "bin/cli.js",
@@ -25,7 +25,7 @@
25
25
  },
26
26
  {
27
27
  "path": "package.json",
28
- "sha256": "1efad8edf817286284ef35578e3b5046205350603b7e9cb9b979993a69f85c8a"
28
+ "sha256": "e376fe73743953ad7f0b7525e22f815ea949450fe7ea784f89d1e61bcc62ce6f"
29
29
  },
30
30
  {
31
31
  "path": "src/cli.js",
@@ -249,7 +249,7 @@
249
249
  },
250
250
  {
251
251
  "path": "templates/.claude/skills/feature-adr/scripts/check-plan-completeness.mjs",
252
- "sha256": "630eb9047258ad0333082f407cd34522e4c278650f22ef6dba1ef897ec5cce71"
252
+ "sha256": "cd2d4e05d1b61be5485c9836abdebdb00b5f4085a14f3c71126cc45d4e08fe3b"
253
253
  },
254
254
  {
255
255
  "path": "templates/.claude/skills/frontend-design/LICENSE.txt",
@@ -313,7 +313,7 @@
313
313
  },
314
314
  {
315
315
  "path": "templates/.claude/workflows/feature-adr.js",
316
- "sha256": "f5454faf9cca12a3cbef5444a3fe586823bfe2a164ab391c9589ed206a0b9b9f"
316
+ "sha256": "ef6a119466e504307116b12af3369029c13738ad6c40cc7a345d7d81834eca72"
317
317
  },
318
318
  {
319
319
  "path": "templates/lib/memory-protocol.md",
@@ -325,5 +325,5 @@
325
325
  }
326
326
  ]
327
327
  },
328
- "signature": "iuNdrUAvCEsJrxokWl6qDVTsiQJb9/v+oSUREgL2dkMEEzslnKnzYH144Cxg/qxpNZqocyHqvsH2A8I1Eu2wCQ=="
328
+ "signature": "2ltA45AgleqbKopq4ritI5XTO7YtiM/vDWxo6fNIFBYrlz+sz9ZAFSxyNOEN3KYs8uwlgmef1I1sb1wvMIgxAw=="
329
329
  }
package/README.md CHANGED
@@ -106,6 +106,26 @@ ARCHITECTURE → IMPLEMENTATION → CODE → QE → FLEET QE
106
106
  # Full protocols + 6 extra skills, up to 7 fleet QE agents
107
107
  ```
108
108
 
109
+ ### Advisory micro-recall at two decision points (v1.5.9, staged)
110
+
111
+ The workflow makes one bounded decision-local recall attempt immediately before the live Step 3
112
+ ADR-alternative choice and one immediately before the live Step 6 plan-route choice. Each attempt
113
+ asks for at most three lessons, uses a decision-specific lesson-bandit context, has a 15-second
114
+ whole-attempt ceiling, and is never retried. The Step 6 Codex-to-Claude fallback reuses the same
115
+ snapshot instead of recalling again.
116
+
117
+ This is strictly advisory. Empty output, timeout, command/parse/transport failure, an unwritable
118
+ receipt, or an unestablished application probe leaves the original stage prompt, dispatch count,
119
+ result, and verdict unchanged. There is no hard gate or runtime effectiveness threshold.
120
+
121
+ The append-only evidence lives at
122
+ `features/<slug>/.fa-state/decision-recall.jsonl`: versioned `entered`, `recalled`, `applied`, and
123
+ optional `owner-label` rows. Post-hoc analysis can derive `receipted / eligible`, outcome counts,
124
+ `applied / selected`, owner-label coverage, repeat-hit numerator/denominator, irrelevant injections,
125
+ and explicit uncounted/unknown populations. The motivating timing observation remains external
126
+ `[SRC], n=1`; the required book queries were silent on retrieval timing, so this instrumentation is
127
+ a falsifiable hypothesis, not a claim that decision-point recall is needed or effective here.
128
+
109
129
  ### The K2 plan gate runs on ANY repo, not just JS/TS ones (v1.5.0)
110
130
 
111
131
  Between Step 6 and Step 7 the pipeline runs a machine plan-completeness gate (K2). Until v1.5.0 it
@@ -169,7 +189,7 @@ refused BY NAME: `path traversal ('..' segment)`, `degenerate path segment`, `em
169
189
  `illegal character '<c>'`, `empty stem after the leading dot`. The old substring traversal test also
170
190
  rejected the ordinary filename `foo..bar.ts`; it is a segment test now.
171
191
 
172
- ### The Step-8 amendment gate runs a command instead of judging (v1.5.7)
192
+ ### The Step-8 amendment gate runs a command instead of judging (v1.5.8)
173
193
 
174
194
  Every `AM-N` row must resolve to a test found INSIDE the file the row names, and the check is
175
195
  `dz amendment-check --slug <slug> --json` rather than a paragraph asking the reviewer to confirm it.
@@ -325,14 +345,17 @@ Workflow({ scriptPath: '.claude/workflows/feature-adr.js',
325
345
  ```
326
346
 
327
347
  Omit the Codex knobs entirely for today's all-Claude behavior. The run result reports
328
- `plannerUsed` / `coderUsed` / `qeReviewerUsed` / `codexModel` / `modelsUsed` so you can see who did what.
329
-
330
- **Live model visibility in `/workflows`:** each stage's agent label is decorated with its *resolved*
331
- model — e.g. `adr · codex:gpt-5.5:xhigh`, `plan · opus` — so you see which model actually ran a stage in
332
- the live progress tree, not just in the final report. This matters because a Codex stage's auto
333
- model-badge shows the `codex:codex-rescue` Claude wrapper (the session model), never `codex`; the label
334
- text is the honest signal. A Claude fallback appears as its own distinct node (never mislabeled as Codex),
335
- and a routing-off run adds no suffix (byte-identical to today).
348
+ `plannerUsed` / `coderUsed` / `qeReviewerUsed` / `codexModel` / `modelsUsed` as a legacy routing
349
+ summary. `dispatchOutcomes` is the authoritative who-did-what ledger: it contains only settled
350
+ attempts, never pre-dispatch intent.
351
+
352
+ **Live model visibility in `/workflows`:** each stage prints a two-phase line. `▸ ... · intent`
353
+ appears before the target model starts and names the resolved model and selection reason;
354
+ `◆ ... · outcome: ...` appears only after that attempt settles. Only the latter enters `dispatchOutcomes`.
355
+ This matters because a Codex stage's auto
356
+ model-badge shows the `codex:codex-rescue` Claude wrapper (the session model), never `codex`; the
357
+ two-phase lines are the honest signal. A Claude fallback appears as its own distinct attempt (never
358
+ mislabeled as Codex), and a routing-off intent explicitly says `routing not requested`.
336
359
 
337
360
  ### Per-stage model routing — `args.models`
338
361
 
@@ -1113,6 +1136,24 @@ deliberately excluded — "skeleton first" is nonsense there.
1113
1136
 
1114
1137
  ## Status
1115
1138
 
1139
+ `1.5.10` — **staged, not published: every finished phase reports to the 📐 live panel, whatever the
1140
+ checkpoint does.** The packaged workflow's `withCheckpoint` computes the next phase label from STAGE
1141
+ COMPLETION alone, before any checkpoint branch, so `args.checkpoints:false`, an oversize or
1142
+ unserializable result, a stage with no declared artifact, and a refused persist predicate all still
1143
+ move the panel. On the common path the `dz statusline --fa-record` command RIDES the existing
1144
+ ckpt-write agent — **zero new agents** — joined by `;`, never `&&`: with `&&`, a checkpoint write
1145
+ that legitimately refuses short-circuits the phase report away while the workflow has already
1146
+ recorded that it ran, and the panel silently stops on a run that is still progressing. Only where no
1147
+ checkpoint agent is dispatched at all does the stage spend one extra effort-low `fa-phase:<stage>`
1148
+ dispatch, announced in the log. A dead or partial stage reports nothing — the panel must never claim
1149
+ progress a stage did not make. Requires `@dzhechkov/harness-cli >= 0.8.11` for the `--tier` flag and
1150
+ the second-line panel; the two workflow twins stay byte-identical (`gen-loop-blobs --check`).
1151
+
1152
+ `1.5.9` — **staged, not published: advisory decision-point micro-recall.** Step 3 ADR selection and
1153
+ Step 6 plan routing each make one top-3, 15-second, no-retry attempt inside the live checkpoint thunk.
1154
+ All recall/receipt/probe failures preserve the original dispatch. Versioned `.fa-state` receipts make
1155
+ coverage and repeat-related outcomes countable offline; no threshold controls the workflow.
1156
+
1116
1157
  `1.5.4` — **Step 5 now asks how the shipped feature will be watched.** The architecture artifact must
1117
1158
  carry a section headed exactly `Observability` answering what the feature logs, what it counts, what a
1118
1159
  failure looks like from outside, and who would notice. **"Nothing to observe" is a complete answer** —
@@ -1160,3 +1201,13 @@ Also in this release, both halves of the K2 plan-completeness gate that field us
1160
1201
  installed in the workspace was never found (`NOT-ESTABLISHED`, exit 3, the coding step never ran).
1161
1202
  New `args.workspace` pins it, the shipped call site passes it, each candidate is now labelled in the
1162
1203
  audit line, and a `K2_GATE_NOTE` fires when the two collapse onto one path.
1204
+
1205
+ ## Двухфазная строка диспатча (шаблон воркфлоу)
1206
+
1207
+ Шаблон `.claude/workflows/feature-adr.js` печатает две разные строки без флага: намерение
1208
+ `▸ <стадия> · <модель> · <причина выбора> · intent` непосредственно до запуска модели и итог
1209
+ `◆ <стадия> · <модель> · outcome: <исход>` после окончательного состояния той же ступени.
1210
+ Даже долгий или бросивший исключение запуск заранее виден человеку; при этом только итог попадает в
1211
+ `dispatchOutcomes` отчёта. Причина отказа остаётся у outcome отказавшей ступени, а intent следующего
1212
+ fallback получает нейтральную причину `fallback-rung`. Регион `stage-line` принадлежит генератору
1213
+ `gen-loop-blobs` и не правится руками.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dzhechkov/skills-feature-adr",
3
- "version": "1.5.7",
3
+ "version": "1.5.10",
4
4
  "description": "Adaptive Feature Development skill pack for Claude Code — 11-step pipeline with Complexity Router (S/M/L/XL), ADR-driven architecture, 15 agentic-qe skills, multi-agent fleet QE. Supports --full-qe, --full-qe-extended, --with-learning, and --knowledge-extractor modes.",
5
5
  "bin": {
6
6
  "skills-feature-adr": "./bin/cli.js"
@@ -42,12 +42,12 @@
42
42
  },
43
43
  "repository": {
44
44
  "type": "git",
45
- "url": "https://github.com/djd1m/dz-harness-hub.git",
45
+ "url": "git+https://github.com/djd1m/dz-harness.git",
46
46
  "directory": "packages/@dzhechkov/skills-feature-adr"
47
47
  },
48
- "homepage": "https://github.com/djd1m/dz-skill-bundles/blob/main/docs/feature-adr-team-onboarding.md",
48
+ "homepage": "https://github.com/djd1m/dz-harness/tree/main/packages/@dzhechkov/skills-feature-adr#readme",
49
49
  "bugs": {
50
- "url": "https://github.com/djd1m/dz-skill-bundles/issues"
50
+ "url": "https://github.com/djd1m/dz-harness/issues"
51
51
  },
52
52
  "peerDependencies": {
53
53
  "@dzhechkov/keysarium-core": "^1.0.0"
package/sbom.json CHANGED
@@ -35,7 +35,7 @@
35
35
  "hashes": [
36
36
  {
37
37
  "alg": "SHA-256",
38
- "content": "4ab808507be5c64cfa7b74ef3c186145d0654cd9c2fad86229685edaac6edb10"
38
+ "content": "b1dbcb7b1f0f3d95bdda9f9568f65e1f78b306b2cb64e42979b1981aeadc6047"
39
39
  }
40
40
  ]
41
41
  },
@@ -69,7 +69,7 @@
69
69
  },
70
70
  {
71
71
  "name": "dz:canonical-json-sha256-v2",
72
- "value": "1efad8edf817286284ef35578e3b5046205350603b7e9cb9b979993a69f85c8a"
72
+ "value": "e376fe73743953ad7f0b7525e22f815ea949450fe7ea784f89d1e61bcc62ce6f"
73
73
  }
74
74
  ]
75
75
  },
@@ -629,7 +629,7 @@
629
629
  "hashes": [
630
630
  {
631
631
  "alg": "SHA-256",
632
- "content": "630eb9047258ad0333082f407cd34522e4c278650f22ef6dba1ef897ec5cce71"
632
+ "content": "cd2d4e05d1b61be5485c9836abdebdb00b5f4085a14f3c71126cc45d4e08fe3b"
633
633
  }
634
634
  ]
635
635
  },
@@ -789,7 +789,7 @@
789
789
  "hashes": [
790
790
  {
791
791
  "alg": "SHA-256",
792
- "content": "f5454faf9cca12a3cbef5444a3fe586823bfe2a164ab391c9589ed206a0b9b9f"
792
+ "content": "ef6a119466e504307116b12af3369029c13738ad6c40cc7a345d7d81834eca72"
793
793
  }
794
794
  ]
795
795
  },
@@ -180,7 +180,21 @@ if (adrFiles.length === 0 && TIER_REQUIRES_ADR) {
180
180
  const adr = readFileSync(join(adrDir, f), 'utf-8');
181
181
  const confIdx = adr.search(/^##+\s*Confirmation/mi);
182
182
  if (confIdx < 0) { failures.push(`C2: ${safe(f)} has no Confirmation section`); continue; }
183
- const conf = adr.slice(confIdx);
183
+ // The section ENDS at the next heading of the same or higher level — it does not run to EOF.
184
+ // Slicing to EOF swallowed every later section, so a `Links` entry citing an existing test as
185
+ // PRECEDENT was read as this ADR's own Confirmation and demanded of the plan (measured
186
+ // 2026-08-31 on features/finding-identity-closure: reqe.test.ts, cited under
187
+ // "Implementation precedent", failed C2 while the real Confirmation test was named correctly).
188
+ // Deeper subsections stay inside: a Confirmation with ### children is one section.
189
+ const rest = adr.slice(confIdx);
190
+ const confLevel = (rest.match(/^(#+)/) || ['', '##'])[1].length;
191
+ // Search AFTER the Confirmation heading's own line — searching from the heading itself matches
192
+ // it and collapses the section to nothing, which turns a scoping fix into a gate that reports
193
+ // "Confirmation names no test file paths" for every ADR (caught by running it).
194
+ const bodyStart = rest.indexOf('\n') + 1;
195
+ const afterHeading = rest.slice(bodyStart);
196
+ const nextHeading = afterHeading.search(new RegExp('^#{1,' + confLevel + '}[^#]', 'm'));
197
+ const conf = nextHeading < 0 ? rest : rest.slice(0, bodyStart + nextHeading);
184
198
  const paths = extractCandidatePaths(conf).filter(isTestPath);
185
199
  // UNKNOWN ECOSYSTEM STAYS A FAILURE, never a WARN: a gate that downgrades itself on the one
186
200
  // repo it cannot read is a gate that is off exactly where it is needed. The remedy is named