@dzhechkov/skills-feature-adr 1.5.3 → 1.5.4

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": "1e3c1a4ed97981b70a3a5099f6355556fc987e493bf478b82cabe552888d2583"
16
+ "sha256": "eb5998619673f928f02b6b462278acfc4871387e1f6495ab0b613a965611cda7"
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": "2224692687da750844ef25096d1fc41fc86d7e79743ac7a8f42bf51ba9018750"
28
+ "sha256": "8e082526415c4ce4427c51dff222c248e29ef5fbdcd17f0d957c28d621738513"
29
29
  },
30
30
  {
31
31
  "path": "src/cli.js",
@@ -145,7 +145,7 @@
145
145
  },
146
146
  {
147
147
  "path": "templates/.claude/skills/feature-adr/modules/05-architecture.md",
148
- "sha256": "2ef7cf316903f0cbb1fabe1f0e1770c22b2cb3a11a4118cac0529c25074b5e8a"
148
+ "sha256": "4d20dbc85ea5bb93ca90fd8cd089255bab9c76a912ca3ad954f3a4bb670f3c45"
149
149
  },
150
150
  {
151
151
  "path": "templates/.claude/skills/feature-adr/modules/06-implementation-plan.md",
@@ -313,7 +313,7 @@
313
313
  },
314
314
  {
315
315
  "path": "templates/.claude/workflows/feature-adr.js",
316
- "sha256": "a4e277040b42646d9bc1b06f78e32aa11f118a924f1626be67640f87ede8b292"
316
+ "sha256": "a6ff055d50f4eb5790dab36deee188e880eec1362188ec16a5504710294d87c3"
317
317
  },
318
318
  {
319
319
  "path": "templates/lib/memory-protocol.md",
@@ -325,5 +325,5 @@
325
325
  }
326
326
  ]
327
327
  },
328
- "signature": "uUN7yuKgSOed/hE0xooh1K788NcAFhnvsh92AHcu4oHn/uMZurn0VnktfhsUDHUv3jR8F6bMoKgrb/F6dHrvCQ=="
328
+ "signature": "4u6AmuuLsokLePBMiy6Gg9ETVwszE2NVE2fArT62nFcJSWPEd06QhKu4eb2/awzNjH4bhY3HXbacMZsS7B7gBA=="
329
329
  }
package/README.md CHANGED
@@ -169,7 +169,7 @@ refused BY NAME: `path traversal ('..' segment)`, `degenerate path segment`, `em
169
169
  `illegal character '<c>'`, `empty stem after the leading dot`. The old substring traversal test also
170
170
  rejected the ordinary filename `foo..bar.ts`; it is a segment test now.
171
171
 
172
- ### The Step-8 amendment gate runs a command instead of judging (v1.5.3)
172
+ ### The Step-8 amendment gate runs a command instead of judging (v1.5.4)
173
173
 
174
174
  Every `AM-N` row must resolve to a test found INSIDE the file the row names, and the check is
175
175
  `dz amendment-check --slug <slug> --json` rather than a paragraph asking the reviewer to confirm it.
@@ -1113,7 +1113,27 @@ deliberately excluded — "skeleton first" is nonsense there.
1113
1113
 
1114
1114
  ## Status
1115
1115
 
1116
- `1.5.3` — **the workflow stops crashing on the way into Step 7.** `1.5.3` shipped a workflow that
1116
+ `1.5.4` — **Step 5 now asks how the shipped feature will be watched.** The architecture artifact must
1117
+ carry a section headed exactly `Observability` answering what the feature logs, what it counts, what a
1118
+ failure looks like from outside, and who would notice. **"Nothing to observe" is a complete answer** —
1119
+ a pure refactor or a CI-only gate genuinely emits nothing, and a check that cannot express a true fact
1120
+ gets switched off. What is not acceptable is leaving the question unanswered. MEASURED before the
1121
+ change: the word appeared nowhere in the pipeline's prompts, and ZERO of 107 architecture artifacts
1122
+ carried such a section, while two fully-written observability skills (818 and 946 lines) sat
1123
+ unreachable because nothing called them. `dz score` reports the answer as a discipline — descriptive,
1124
+ never a gate, because the whole existing corpus predates the requirement.
1125
+
1126
+ Also in the bundled workflow: the K2 gate stops GUESSING the workspace. When it was not pinned, the
1127
+ workspace candidate was taken from the gate agent's own working directory, which against an external
1128
+ target repo resolved to that repo — so the candidate silently became a duplicate of the repo
1129
+ candidate and a skill installed in the workspace was never found (`NOT-ESTABLISHED`, exit 3, the
1130
+ coding step never ran). New `args.workspace` pins it, the shipped call site passes it, each candidate
1131
+ is labelled in the audit line, and a `K2_GATE_NOTE` fires when two collapse onto one path. And a
1132
+ pre-code probe that returns nothing no longer becomes an all-null baseline that later reads as
1133
+ "every target changed".
1134
+
1135
+
1136
+ `1.5.4` — **the workflow stops crashing on the way into Step 7.** `1.5.4` shipped a workflow that
1117
1137
  CALLED three helpers it never defined — `changeSetProbeCmd`, `parseHashProbe`, `changedFromHashes`
1118
1138
  (5 call sites, 0 definitions). `QE_SCOPE` defaults to `uncommitted`, so the guarded branch was true
1119
1139
  by default and every ultracode run that reached the coding step died with a `ReferenceError` while
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dzhechkov/skills-feature-adr",
3
- "version": "1.5.3",
3
+ "version": "1.5.4",
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"
package/sbom.json CHANGED
@@ -35,7 +35,7 @@
35
35
  "hashes": [
36
36
  {
37
37
  "alg": "SHA-256",
38
- "content": "1e3c1a4ed97981b70a3a5099f6355556fc987e493bf478b82cabe552888d2583"
38
+ "content": "eb5998619673f928f02b6b462278acfc4871387e1f6495ab0b613a965611cda7"
39
39
  }
40
40
  ]
41
41
  },
@@ -65,7 +65,7 @@
65
65
  "hashes": [
66
66
  {
67
67
  "alg": "SHA-256",
68
- "content": "2224692687da750844ef25096d1fc41fc86d7e79743ac7a8f42bf51ba9018750"
68
+ "content": "8e082526415c4ce4427c51dff222c248e29ef5fbdcd17f0d957c28d621738513"
69
69
  }
70
70
  ]
71
71
  },
@@ -365,7 +365,7 @@
365
365
  "hashes": [
366
366
  {
367
367
  "alg": "SHA-256",
368
- "content": "2ef7cf316903f0cbb1fabe1f0e1770c22b2cb3a11a4118cac0529c25074b5e8a"
368
+ "content": "4d20dbc85ea5bb93ca90fd8cd089255bab9c76a912ca3ad954f3a4bb670f3c45"
369
369
  }
370
370
  ]
371
371
  },
@@ -785,7 +785,7 @@
785
785
  "hashes": [
786
786
  {
787
787
  "alg": "SHA-256",
788
- "content": "a4e277040b42646d9bc1b06f78e32aa11f118a924f1626be67640f87ede8b292"
788
+ "content": "a6ff055d50f4eb5790dab36deee188e880eec1362188ec16a5504710294d87c3"
789
789
  }
790
790
  ]
791
791
  },
@@ -118,6 +118,32 @@ GET /api/v1/{resource}/:id
118
118
  Errors: 401, 404
119
119
  ```
120
120
 
121
+ ## Observability — a MANDATORY section of `05_architecture.md`
122
+
123
+ The artifact must carry a section headed exactly **`Observability`**, answering how anyone would
124
+ know this feature is working once it ships:
125
+
126
+ - what it **logs**, and at what level;
127
+ - what it **counts** — the one or two numbers that would move if it broke;
128
+ - what a **failure looks like from outside** — the symptom, not the stack trace;
129
+ - **who would notice**, and how.
130
+
131
+ If the feature genuinely emits nothing at runtime — a pure refactor, a doc change, a gate that only
132
+ runs in CI — write **"nothing to observe"** and say why. That is a complete answer, not a gap. What
133
+ is not acceptable is leaving the question unanswered.
134
+
135
+ The heading is read by a machine (`dz score` reports it as a discipline), so it is spelled exactly
136
+ `Observability` — the prompt above and the check derive that word from one shared constant, because
137
+ a prompt asking for one heading while a check greps another produces a gate that fails every honest
138
+ run.
139
+
140
+ **Why this section exists.** MEASURED 2026-08-25: across 107 existing `05_architecture.md` files,
141
+ ZERO carried such a section, and the word `observability` appeared nowhere in the pipeline's own
142
+ prompts. The pipeline kept five telemetry stores about itself and asked for none about what it
143
+ built. The two capable skills — `observability` (818 lines) and `observability-testing-patterns`
144
+ (946 lines) — were fully written and unreachable, because nothing called them. This section is the
145
+ call site.
146
+
121
147
  ## Write discipline (the 180-second rule)
122
148
 
123
149
  An executor that returns from a tool call and then thinks in silence past **180 seconds** is killed by the
@@ -2125,7 +2125,7 @@ if (isMplus) {
2125
2125
  designThunks.push(() => subCheckpoint('qcsd', qcsdPromptText, qcsdOpts, ['03.5_ideation_report.md'], () => designStage(qcsdPromptText, qcsdOpts, FDIR + '/03.5_ideation_report.md', 'qcsd')))
2126
2126
  designPairMeta.push({ role: 'design:qcsd', prompt: qcsdPromptText, model: modelLabel(qcsdOpts), lessons: [] })
2127
2127
  const archExtra = isLplus ? ' Also ' + FDIR + '/04_domain_model.md (DDD).' : ''
2128
- const archPromptText = (isLplus ? 'Step 4 (DDD) + ' : '') + 'Step 5 (Architecture) of /feature-adr for "' + DESC + '" (' + SLUG + '). READ the code. Write ' + FDIR + '/05_architecture.md (components, data flow, integration points, the emit/merge/wiring shape).' + archExtra + ' Return wrote[] + summary.' + WRITE_DISCIPLINE
2128
+ const archPromptText = (isLplus ? 'Step 4 (DDD) + ' : '') + 'Step 5 (Architecture) of /feature-adr for "' + DESC + '" (' + SLUG + '). READ the code. Write ' + FDIR + '/05_architecture.md (components, data flow, integration points, the emit/merge/wiring shape). It MUST carry a section headed exactly "Observability" answering how anyone would know this feature is working once it ships: what it logs, what it counts, what a failure looks like from outside, and who would notice. If the feature genuinely emits nothing at runtime — a pure refactor, a CI-only gate — say "nothing to observe" and why; that is a complete answer, not a gap. What is not acceptable is leaving the question unanswered.' + archExtra + ' Return wrote[] + summary.' + WRITE_DISCIPLINE
2129
2129
  designThunks.push(() => subCheckpoint('architecture', archPromptText, archOpts, ['05_architecture.md'].concat(isLplus ? ['04_domain_model.md'] : []), () => designStage(archPromptText, archOpts, FDIR + '/05_architecture.md', 'architecture')))
2130
2130
  designPairMeta.push({ role: 'design:architecture', prompt: archPromptText, model: modelLabel(archOpts), lessons: [] })
2131
2131
  }