@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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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.
|
|
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`
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
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.
|
|
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
|
|
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-
|
|
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-
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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
|
-
|
|
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
|