@dzhechkov/skills-feature-adr 1.3.64 → 1.3.65

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": "b3095a1ad16fe17c103fb167e2844dabfe61f2a67dde3f797521c7916f41ddb3"
16
+ "sha256": "4a887b8fe2a52c75be7189ddeef4393dc2a8a872d747bdbde3caba94488960dd"
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": "98aaa022a135e9cf92c534e191c96bdcd0254bf1ea8d7aba42745a82071ad4c2"
28
+ "sha256": "1f95669ddfb76990bfeb0e1be603c27651f47a9233020ed10c37e8705543b688"
29
29
  },
30
30
  {
31
31
  "path": "scripts/sync-templates.js",
@@ -317,7 +317,7 @@
317
317
  },
318
318
  {
319
319
  "path": "templates/.claude/workflows/feature-adr.js",
320
- "sha256": "e02d770867542d0d1505baca64c3008ff1bbc0048b291bd30be7ccc41bdc06a1"
320
+ "sha256": "8afa77bb421ea4052eec0feab5f49edc1f2b1cea69238971f8ef1b3c8328a483"
321
321
  },
322
322
  {
323
323
  "path": "templates/lib/memory-protocol.md",
@@ -345,5 +345,5 @@
345
345
  }
346
346
  ]
347
347
  },
348
- "signature": "ac1qFz1SL9en2rAGmTGAYgsXlnlNG7tX3LCKhQFdt0nngZoLWW3LIT9pXBKrSAwKLAsqLXc1EVcmx2fmupeyAg=="
348
+ "signature": "3OT+p3Tm5tBnn9T2RKEPlCnhCiaemKAOraeoPA4zYR28p1MpACnkeEmVyXPpwnqhG/a6uD/AjC/DrRuihMdHCw=="
349
349
  }
package/README.md CHANGED
@@ -274,8 +274,13 @@ Workflow({ scriptPath: '.claude/workflows/feature-adr.js',
274
274
 
275
275
  > Note: under the override, coder **and** QE both run on Codex — the cross-model self-QE guard is
276
276
  > consciously suspended (a Claude QE reviewer is exactly the agent that dies under limit pressure). The
277
- > ` (usage-switched)` suffix + `usageEvents` keep it auditable; re-run an independent QE after limits
278
- > reset if the switch fired during Step 8.
277
+ > ` (usage-switched)` suffix + `usageEvents` keep it auditable and since v1.3.65 the suspension is a
278
+ > **machine debt**, not a note: the run writes `features/<slug>/.fa-state/reqe-due.json` (idempotent,
279
+ > run-stamped, crash-resume-safe) and returns `reqeDue: true`; after limits reset, `dz usage` shows a
280
+ > `re-QE due:` line, `dz reqe --slug <s>` prints the cross-family review brief, and
281
+ > `dz reqe --slug <s> --done --report <f>` settles FAIL-CLOSED — only against an existing graded
282
+ > report, never the run's own 08_qe_report.md (real-path and inode compared). RU: «перепроверь другой
283
+ > семьёй потом» стало долгом на диске с полным жизненным циклом.
279
284
 
280
285
  ---
281
286
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dzhechkov/skills-feature-adr",
3
- "version": "1.3.64",
3
+ "version": "1.3.65",
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": "b3095a1ad16fe17c103fb167e2844dabfe61f2a67dde3f797521c7916f41ddb3"
38
+ "content": "4a887b8fe2a52c75be7189ddeef4393dc2a8a872d747bdbde3caba94488960dd"
39
39
  }
40
40
  ]
41
41
  },
@@ -65,7 +65,7 @@
65
65
  "hashes": [
66
66
  {
67
67
  "alg": "SHA-256",
68
- "content": "98aaa022a135e9cf92c534e191c96bdcd0254bf1ea8d7aba42745a82071ad4c2"
68
+ "content": "1f95669ddfb76990bfeb0e1be603c27651f47a9233020ed10c37e8705543b688"
69
69
  }
70
70
  ]
71
71
  },
@@ -795,7 +795,7 @@
795
795
  "hashes": [
796
796
  {
797
797
  "alg": "SHA-256",
798
- "content": "e02d770867542d0d1505baca64c3008ff1bbc0048b291bd30be7ccc41bdc06a1"
798
+ "content": "8afa77bb421ea4052eec0feab5f49edc1f2b1cea69238971f8ef1b3c8328a483"
799
799
  }
800
800
  ]
801
801
  },
@@ -1002,7 +1002,11 @@ const qeModel = resolveStageModel('qe')
1002
1002
  // Single tested source of truth (feature-adr-routing.ts:qeShouldUseCodex) — closes the self-QE hole where
1003
1003
  // the legacy qeReviewer='codex' knob used to re-route QE back to codex even when the CODER was codex.
1004
1004
  if (MODELS.qe === undefined && QE_REVIEWER === 'codex' && coderIsCodex()) log('QE: coder is codex — enforcing cross-model Claude QE (ignoring qeReviewer=codex to avoid self-review)')
1005
- const qeIsCodex = qeShouldUseCodex()
1005
+ // reqe QE #3: the usage override can resolve the QE stage to codex EVEN when qeShouldUseCodex()
1006
+ // (which reads the pre-override config) says claude — dispatching that through the "claude" branch
1007
+ // would run the stub wrapper AND mislabel qeReviewerUsed='claude' (a codex-on-codex review recorded
1008
+ // as cross-family). The resolved agentType is the truth; either signal routes the codex branch.
1009
+ const qeIsCodex = qeShouldUseCodex() || (qeModel && qeModel.agentType === 'codex:codex-rescue')
1006
1010
  const qeClaudeModel = qeIsCodex ? {} : qeModel
1007
1011
  const qeClaudeOpts = mergeOpts({ label: stageLabel('qe:brutal', qeClaudeModel), phase: 'QE', agentType: 'qe-code-reviewer', schema: QE }, qeClaudeModel)
1008
1012
  // qe checkpoint: COMPOSITE (verdict + reviewer identity) keyed on the CODE stage's result — a re-coded
@@ -1056,6 +1060,38 @@ if (qeStage && qeStage.modelUsed) modelsUsed.qe = qeStage.modelUsed + (resumedSt
1056
1060
  const claimGate = step8ClaimGate(qe && qe.claimCheck ? qe.claimCheck : null)
1057
1061
  log(claimGate.note)
1058
1062
 
1063
+ // ── re-QE debt emission (backlog 6b40e667) — mirror of harness-core/src/reqe.ts ──
1064
+ // The cross-model guard was consciously SUSPENDED when the usage override made coder and QE the
1065
+ // same family (FR-2.9). Record that as a machine DEBT (features/<slug>/.fa-state/reqe-due.json) so
1066
+ // `dz reqe` / `dz usage` surface it after limits reset — a doc instruction on the weakest detection
1067
+ // layer becomes a fact on disk. Emitted ONLY for the actual same-family-under-override case: a
1068
+ // switch that kept cross-family QE, or the codex-unavailable Claude belt (no override), creates no
1069
+ // debt. A RESUMED qe never re-emits (the original run emitted; a settlement must not be clobbered).
1070
+ let reqeDue = false
1071
+ {
1072
+ const reqeFamOf = function (s) { return /codex|gpt|openai/i.test(String(s || '')) ? 'openai' : 'claude' }
1073
+ const qeLabel = String(modelsUsed.qe || '')
1074
+ if (/\(usage-switched\)/.test(qeLabel) && reqeFamOf(coderUsed) === reqeFamOf(qeReviewerUsed)) {
1075
+ reqeDue = true
1076
+ const reqeDebt = { schema: 'reqe-due-1', slug: SLUG, coderFamily: reqeFamOf(coderUsed), qeFamily: reqeFamOf(qeReviewerUsed), qeGrade: (qe && qe.grade) ? String(qe.grade) : null, reason: 'usage-switched self-review: Step-8 QE ran on the coder’s own family under the limit override (FR-2.9)', emittedAt: null, runStamp: qeHash }
1077
+ // IDEMPOTENT + VERIFIED (reqe QE #2 + r2 #2/#3): a RESUMED qe re-runs this block (the original
1078
+ // run may have died between the qe checkpoint and this write), but: an existing due file is
1079
+ // never clobbered; a settlement blocks re-emission ONLY when it carries THIS run's runStamp (an
1080
+ // OLD settlement must not immunize the slug against a FRESH run's debt); the write itself is
1081
+ // noclobber `set -C` (O_EXCL — a concurrent emitter or a planted/dangling symlink cannot be
1082
+ // written through). The agent echoes the written file back; an unverifiable write is logged
1083
+ // LOUDLY, and reqeDue stays true in the result either way.
1084
+ const dueQ = shq(FDIR + '/.fa-state/reqe-due.json')
1085
+ const emitCmd = 'if [ -e ' + dueQ + ' ]; then echo REQE-EXISTS; elif grep -qs ' + shq(qeHash) + ' ' + shq(FDIR + '/.fa-state') + '/reqe-settled*.json 2>/dev/null; then echo REQE-SETTLED-THIS-RUN; else mkdir -p ' + shq(FDIR + '/.fa-state') + ' && printf %s ' + shq(JSON.stringify(reqeDebt)) + ' | sed "s/\\"emittedAt\\":null/\\"emittedAt\\":\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\"/" | (set -C; cat > ' + dueQ + ') && cat ' + dueQ + '; fi'
1086
+ const emitOut = await agent('Run EXACTLY this one shell command via your Bash tool and return its stdout VERBATIM, nothing else: ' + emitCmd, { label: 'reqe:emit', phase: 'QE', effort: 'low' })
1087
+ const emitText = String(emitOut || '')
1088
+ if (/REQE-SETTLED-THIS-RUN/.test(emitText)) log('re-QE debt: THIS run’s debt was already settled — not re-opened')
1089
+ else if (/REQE-EXISTS/.test(emitText)) log('re-QE debt: already recorded for ' + SLUG + ' — not overwritten')
1090
+ else if (emitText.indexOf('reqe-due-1') !== -1) log('re-QE DEBT recorded: Step-8 ran same-family under the usage override — after limits reset run `dz reqe --slug ' + SLUG + '` for the independent cross-family pass')
1091
+ else log('re-QE debt write UNVERIFIED (agent returned no readback) — the debt may be missing on disk; reqeDue=true is still reported, record it manually via features/' + SLUG + '/.fa-state/reqe-due.json')
1092
+ }
1093
+ }
1094
+
1059
1095
  // ── AUTO-COST outcome recording (feature learned-cost-routing) ──
1060
1096
  // The two-phase label lands here: every auto-cost stage that produced an artifact records a PROVISIONAL (i);
1061
1097
  // the CODE stage's authoritative gate (ii) is the Step-8 QE grade (A/B = pass) — a produced-but-gate-FAILED
@@ -1275,6 +1311,7 @@ return {
1275
1311
  selfLearning: 'recall@Step0 + teach@Step8 (mandatory)',
1276
1312
  resumedStages: resumedStages,
1277
1313
  checkpointing: CHECKPOINTS_ON ? RESUME_MODE : 'off',
1314
+ reqeDue: reqeDue,
1278
1315
  brain: BRAIN,
1279
1316
  polymorphism: POLY.hasManifest ? POLY.report : null,
1280
1317
  claimGate: claimGate,