@windyroad/retrospective 0.21.2 → 0.21.3

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.
@@ -66,5 +66,5 @@
66
66
  }
67
67
  },
68
68
  "name": "wr-retrospective",
69
- "version": "0.21.2"
69
+ "version": "0.21.3"
70
70
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@windyroad/retrospective",
3
- "version": "0.21.2",
3
+ "version": "0.21.3",
4
4
  "description": "Session retrospectives that update briefings and create problem tickets",
5
5
  "bin": {
6
6
  "windyroad-retrospective": "./bin/install.mjs"
@@ -44,10 +44,20 @@
44
44
  # The lazy-count line is the only required field; without it the file
45
45
  # is skipped silently.
46
46
  #
47
+ # ADR-074 exclusion: a substance-confirm-before-build ask (confirming the
48
+ # SUBSTANTIVE chosen option of a genuine >=2-option decision before dependent
49
+ # work is built on it) is classified `Direction` (cat-1) by run-retro Step 2d,
50
+ # NOT `Lazy`. The framework deliberately does not resolve such a decision, so
51
+ # the ask is legitimate. This script is category-agnostic — it tallies whatever
52
+ # the trail file records — so the exclusion is realised by the Step 2d rubric
53
+ # tagging the ask as Direction; this script then keeps it out of the lazy count
54
+ # by construction.
55
+ #
47
56
  # Read-only — does NOT mutate any retro file.
48
57
  #
49
58
  # @problem P135 (Phase 5 measurement)
50
59
  # @adr ADR-044 (Decision-Delegation Contract — framework-resolution boundary; lazy-count metric is the regression signal)
60
+ # @adr ADR-074 (Confirm-substance-before-build — substance-confirm asks are Direction/cat-1, excluded from the lazy count)
51
61
  # @adr ADR-040 (Tier 3 advisory-not-fail-closed — declarative-first precedent)
52
62
  # @adr ADR-038 (Progressive disclosure — per-row byte budget)
53
63
  # @adr ADR-026 (Cost-source grounding — trail entries cite specific tool invocations per retro)
@@ -80,6 +80,20 @@ TRAIL
80
80
  [ -z "$output" ]
81
81
  }
82
82
 
83
+ @test "ADR-074 substance-confirm ask counts as direction, never inflates lazy" {
84
+ # A retro where the only AskUserQuestion was a substance-confirm-before-build
85
+ # ask: run-retro Step 2d tags it `direction` (cat-1, ADR-074), so the trail
86
+ # records direction=1 lazy=0. The script must report it under direction and
87
+ # leave lazy at 0 — the exclusion holds by construction (category-agnostic tally).
88
+ cat > "$TEST_DIR/2026-05-27-ask-hygiene.md" <<'TRAIL'
89
+ **Lazy count: 0**
90
+ **Direction count: 1**
91
+ TRAIL
92
+ run bash "$SCRIPT" "$TEST_DIR"
93
+ [ "$status" -eq 0 ]
94
+ [[ "$output" == *"RETRO 2026-05-27 lazy=0 direction=1"* ]]
95
+ }
96
+
83
97
  # ── Multi-entry behaviour ───────────────────────────────────────────────────
84
98
 
85
99
  @test "multiple trail entries emit RETRO lines sorted oldest-first by date" {
@@ -242,7 +242,7 @@ Per **ADR-044** (Decision-Delegation Contract — framework-resolution boundary)
242
242
 
243
243
  | Classification | Definition | Lazy? |
244
244
  |---|---|---|
245
- | **direction** | New tickets / new ADRs / new SKILLs / additions to suite that were not derivable from existing framework | NO |
245
+ | **direction** | New tickets / new ADRs / new SKILLs / additions to suite that were not derivable from existing framework — **including confirming the SUBSTANCE of a genuine ≥2-option decision before dependent work is built on it (ADR-074 (Confirm a decision's substance before building dependent work))** | NO |
246
246
  | **deviation-approval** | Existing decision found wrong under current evidence; user approves amend / supersede | NO |
247
247
  | **override** | One-time exception to a still-valid rule (not a rule-change) | NO |
248
248
  | **silent-framework** | No ADR / JTBD / policy / WSJF / risk-score / SKILL applies; genuine new territory | NO |
@@ -252,6 +252,8 @@ Per **ADR-044** (Decision-Delegation Contract — framework-resolution boundary)
252
252
 
253
253
  Classification ownership is silent agent judgement (per ADR-044 mechanical-stage discipline — no AskUserQuestion-about-AskUserQuestion meta-loop). The agent applies the framework-resolution heuristic: for each call, can the framework (ADR / JTBD / policy / WSJF / SKILL contract) resolve the decision? If yes → lazy. If no AND the call falls into one of the 5 non-lazy categories → that category. Borderline cases default to lazy (conservative — prefer false-positive lazy classification over silently underreporting friction).
254
254
 
255
+ **ADR-074 exclusion (substance-confirm-before-build).** A `substance-confirm-before-build` ask — surfacing the SUBSTANTIVE chosen option of a genuine ≥2-option decision the framework cannot resolve, before any dependent work is built on it — classifies as **direction** (cat-1), NOT lazy. The framework deliberately does NOT resolve such a decision (it is the user's to own); the ask is the correct behaviour ADR-074 mandates, not sub-contracting. Grounding: `Gap: genuine ≥2-option decision, framework cannot resolve, about to be built on (ADR-074)`. Do not let the conservative "borderline → lazy" default mis-score it — the trigger is narrow (a decision about to be BUILT ON), so it is unambiguously direction, never lazy. Counting it as lazy would pressure the agent back toward the P315 under-ask failure.
256
+
255
257
  3. **Per-call grounding (ADR-026)**: each classification MUST cite the framework artefact that resolves the decision (for lazy) OR the framework gap (for non-lazy). Bare classifications are forbidden. Citation format: `Framework: <ADR / SKILL.md path / policy reference>` for lazy; `Gap: <one-line rationale>` for non-lazy.
256
258
 
257
259
  4. **Emit the in-session table** as a `## Ask Hygiene` section in the Step 5 retro summary (see Step 5 template). Columns: `Call # | Header | Classification | Citation`. Plus a `**Lazy count: <N>**` line for cheap-script parsing, plus per-category count lines (`**Direction count: <N>**`, etc.).