agentic-sdlc-wizard 1.36.1 → 1.37.0

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.
@@ -13,7 +13,7 @@
13
13
  "name": "sdlc-wizard",
14
14
  "source": ".",
15
15
  "description": "SDLC enforcement for AI agents — TDD, planning, self-review, CI shepherd",
16
- "version": "1.36.1",
16
+ "version": "1.37.0",
17
17
  "author": {
18
18
  "name": "Stefan Ayala"
19
19
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sdlc-wizard",
3
- "version": "1.36.1",
3
+ "version": "1.37.0",
4
4
  "description": "SDLC enforcement for AI agents — TDD, planning, self-review, CI shepherd",
5
5
  "author": {
6
6
  "name": "Stefan Ayala",
package/CHANGELOG.md CHANGED
@@ -4,6 +4,27 @@ All notable changes to the SDLC Wizard.
4
4
 
5
5
  > **Note:** This changelog is for humans to read. Don't manually apply these changes - just run the wizard ("Check for SDLC wizard updates") and it handles everything automatically.
6
6
 
7
+ ## [1.37.0] - 2026-04-24
8
+
9
+ ### Changed
10
+
11
+ - **`monthly-research.yml` workflow deleted** (ROADMAP #231 Phase 1, PR #235). 519 lines + 4 claude-code-action steps removed. Zero merged artifacts in 30d while burning $11-23/month in Anthropic API. Research now happens inline in a Claude Code session, not on a scheduled cron. All 17 `test_monthly_*` assertions in `tests/test-workflow-triggers.sh` stubbed with `n/a per #231 Phase 1` pattern (165/165 tests still green). Live docs (CI_CD.md, ARCHITECTURE.md, plans/AUTO_SELF_UPDATE.md) mark monthly-research REMOVED; historical audit tables intentionally preserved. Codex cross-model review: 3-round, 9/10 CERTIFIED.
12
+
13
+ - **`model-effort-check.sh` loud WARNING below xhigh** (ROADMAP #217, PR #236). Closed the coherence gap between the docs (`max` preferred, `xhigh` floor) and the hook behavior. Previously the hook treated any effort ≠ xhigh as "upgrade available" — including `max` (the preferred default), which was backwards. New behavior:
14
+ - `effort=max` or `xhigh` → silent (at or above floor)
15
+ - `effort=high/medium/low` or unset → LOUD WARNING block: `WARNING` marker, SDLC compliance mention, `/effort max` primary recommendation, `/effort xhigh` floor alternative, `opus[1m]` model reminder
16
+ - Removed duplicate effort/model check from `instructions-loaded-check.sh` — single source of truth is now `model-effort-check.sh`. Regression test asserts the dupe doesn't come back.
17
+ - 2 new TDD tests + 1 regression test. Updated `test_hooks_recommend_opus_1m_alias` for single-source-of-truth. 119/119 hook tests pass.
18
+ - Codex cross-model review: 3-round, 10/10 CERTIFIED.
19
+
20
+ ### Roadmap
21
+
22
+ - **#232 added**: `/update-wizard` should mimic `claude update` UX — detect stale npm CLI and offer to refresh before applying in-session file updates. User call-out 2026-04-24.
23
+
24
+ ### Removed
25
+
26
+ - `.github/workflows/monthly-research.yml` (519 lines, 4 claude-code-action steps, 0 merged artifacts in 30d).
27
+
7
28
  ## [1.36.1] - 2026-04-23
8
29
 
9
30
  ### Changed
@@ -117,7 +138,7 @@ All notable changes to the SDLC Wizard.
117
138
  - `run_init_split` test helper captures stdout/stderr separately with explicit exit code
118
139
  - 9 new CLI tests, 5 new hook tests; Codex xhigh 4-round review: 9/10 CERTIFIED
119
140
  - Model/effort upgrade detection at session start (#179, #180)
120
- - SessionStart hook nudges when configured `effortLevel` is below `xhigh` recommendation
141
+ - SessionStart hook nudges when configured `effortLevel` is below `xhigh` (wording superseded by #217 on 2026-04-24: `max` preferred, `xhigh` floor)
121
142
  - Reads `.claude/settings.local.json` → `.claude/settings.json` → `$HOME/.claude/settings.json` precedence
122
143
  - Non-blocking (`exit 0`); asks Claude to compare recommended model against its own system prompt
123
144
  - `claude-opus-4-6` defaults bumped to `claude-opus-4-7` in `pr-review.yml`, `evaluate.sh`, `sdp-score.sh`, `pairwise-compare.sh`
@@ -137,7 +158,7 @@ All notable changes to the SDLC Wizard.
137
158
  - Default: opus-4-7 + xhigh (matches CC's new default)
138
159
  - 3 new tests (39 total model-comparison tests)
139
160
  - `xhigh` effort level documented in wizard (#178)
140
- - New effort table: high → xhigh (recommended for coding) max
161
+ - New effort table: high → xhigh → max (xhigh was called "recommended for coding" here; superseded by #217 on 2026-04-24: `max` is preferred, `xhigh` is the floor)
141
162
  - Opus 4.7 changes: stricter effort adherence, budget_tokens deprecated, 64k+ max_tokens guidance
142
163
  - Benchmark ceiling effect audit documented in wizard
143
164
  - Cross-model audit (Codex GPT-5.4, xhigh) rated benchmark 2/10 NOT CERTIFIED
@@ -1107,16 +1107,18 @@ For Claude to be effective at SDLC enforcement, your project should have these d
1107
1107
  1. Go to: `Settings > Branches > Add rule`
1108
1108
  2. Branch name pattern: `main` (or `master`)
1109
1109
  3. Enable the settings above (solo or team, as appropriate)
1110
- 4. Add required status checks: `validate`, `e2e-quick-check`
1110
+ 4. Add required status checks: `validate` (E2E is advisory — see note below)
1111
1111
  5. Save changes
1112
1112
 
1113
+ > **Note (ROADMAP #212 Option 1, April 2026):** We no longer require `e2e-quick-check` as a blocking check. It burned Anthropic API credits on every PR, and branch protection pinned to GitHub Actions made local-maintainer check-run satisfaction impossible. E2E now runs advisory-only via `tests/e2e/local-shepherd.sh` on the maintainer's Max subscription. See `ROADMAP.md` #212 for the full rationale.
1114
+
1113
1115
  **How to enable (CLI — solo dev):**
1114
1116
  ```bash
1115
1117
  gh api repos/OWNER/REPO/branches/main/protection --method PUT --input - << 'EOF'
1116
1118
  {
1117
1119
  "required_status_checks": {
1118
1120
  "strict": true,
1119
- "contexts": ["validate", "e2e-quick-check"]
1121
+ "contexts": ["validate"]
1120
1122
  },
1121
1123
  "enforce_admins": false,
1122
1124
  "required_pull_request_reviews": null,
@@ -1131,7 +1133,7 @@ gh api repos/OWNER/REPO/branches/main/protection --method PUT --input - << 'EOF'
1131
1133
  {
1132
1134
  "required_status_checks": {
1133
1135
  "strict": true,
1134
- "contexts": ["validate", "e2e-quick-check"]
1136
+ "contexts": ["validate"]
1135
1137
  },
1136
1138
  "enforce_admins": true,
1137
1139
  "required_pull_request_reviews": {
@@ -2713,7 +2715,7 @@ If deployment fails or post-deploy verification catches issues:
2713
2715
 
2714
2716
  **SDLC.md:**
2715
2717
  ```markdown
2716
- <!-- SDLC Wizard Version: 1.36.1 -->
2718
+ <!-- SDLC Wizard Version: 1.37.0 -->
2717
2719
  <!-- Setup Date: [DATE] -->
2718
2720
  <!-- Completed Steps: step-0.1, step-0.2, step-0.4, step-1, step-2, step-3, step-4, step-5, step-6, step-7, step-8, step-9 -->
2719
2721
  <!-- Git Workflow: [PRs or Solo] -->
@@ -3465,11 +3467,12 @@ Use an independent AI model from a different company as a code reviewer. The aut
3465
3467
 
3466
3468
  **Why this works:** Two AI systems from different companies (e.g., Claude writes, GPT reviews) provide adversarial diversity. They have fundamentally different training, different failure modes, and different strengths. What one misses, the other catches.
3467
3469
 
3468
- **Use the best model at the deepest reasoning.** This is your quality gate — don't economize on it. Always use the latest, most capable model available (currently GPT-5.4) at maximum reasoning effort (`xhigh`). Cheaper/faster models miss things. The whole point is catching what the authoring model couldn't.
3470
+ **Use the best model at the deepest reasoning.** This is your quality gate — don't economize on it. Always use the latest, most capable model available (**GPT-5.5 if you have access**, otherwise GPT-5.4) at maximum reasoning effort (`xhigh` — this is non-negotiable, lower settings miss subtle errors). Cheaper/faster models miss things. The whole point is catching what the authoring model couldn't.
3469
3471
 
3470
3472
  **Prerequisites:**
3471
3473
  - Codex CLI installed: `npm i -g @openai/codex`
3472
3474
  - OpenAI API key configured: `export OPENAI_API_KEY=...`
3475
+ - Codex CLI picks up your OpenAI account's best available model automatically. If you have GPT-5.5 access, `codex exec` uses it; otherwise it falls back to GPT-5.4. No config change needed on your side.
3473
3476
  - This is a local workflow tool — not required for CI/CD
3474
3477
 
3475
3478
  **The Protocol:**
@@ -3774,7 +3777,7 @@ Walk through updates? (y/n)
3774
3777
  Store wizard state in `SDLC.md` as metadata comments (invisible to readers, parseable by Claude):
3775
3778
 
3776
3779
  ```markdown
3777
- <!-- SDLC Wizard Version: 1.36.1 -->
3780
+ <!-- SDLC Wizard Version: 1.37.0 -->
3778
3781
  <!-- Setup Date: 2026-01-24 -->
3779
3782
  <!-- Completed Steps: step-0.1, step-0.2, step-1, step-2, step-3, step-4, step-5, step-6, step-7, step-8, step-9 -->
3780
3783
  <!-- Git Workflow: PRs -->
package/README.md CHANGED
@@ -110,6 +110,28 @@ Layer 1: PHILOSOPHY
110
110
  | **Pre-tool TDD hooks** | Before source edits, a hook reminds Claude to write tests first. CI scoring checks whether it actually followed TDD |
111
111
  | **Self-evolving loop** | Weekly/monthly external research + local CI shepherd loop — you approve, the system gets better |
112
112
 
113
+ ## Optional: Cross-Model Review (Codex)
114
+
115
+ Claude can't grade its own homework. Have a **different AI from a different company** review Claude's work — different training, different blind spots, different biases. We use OpenAI's Codex CLI, and it's **three commands to set up**:
116
+
117
+ ```bash
118
+ npm i -g @openai/codex
119
+ export OPENAI_API_KEY=sk-...
120
+ codex --version # confirm ready
121
+ ```
122
+
123
+ That's it. Codex picks up your OpenAI account's best available model automatically — **if you have GPT-5.5, it uses GPT-5.5; otherwise GPT-5.4**. No model config needed.
124
+
125
+ **How to use it:** after Claude's self-review passes, write a one-file mission brief and run:
126
+
127
+ ```bash
128
+ codex exec -c 'model_reasoning_effort="xhigh"' -s danger-full-access \
129
+ -o .reviews/latest-review.md \
130
+ "Read .reviews/handoff.json and review per the checklist. Output findings + CERTIFIED or NOT CERTIFIED."
131
+ ```
132
+
133
+ `xhigh` reasoning is **non-negotiable** — lower settings miss subtle bugs. See [CLAUDE_CODE_SDLC_WIZARD.md](CLAUDE_CODE_SDLC_WIZARD.md#cross-model-review-loop-optional) for the full protocol (handoff format, round-2 dialogue loop, preflight docs). Real-world: this catches P0/P1 issues in 2-3 out of 10 reviews that Claude's self-review rated as clean.
134
+
113
135
  ## How It Works
114
136
 
115
137
  **Think Iron Man:** Jarvis is nothing without Tony Stark. Tony Stark is still Tony Stark. But together? They make Iron Man. This SDLC is your suit - you build it over time, improve it for your needs, and it makes you both better.
@@ -123,23 +123,10 @@ if command -v codex > /dev/null 2>&1 && [ -d "$PROJECT_DIR/.reviews" ]; then
123
123
  fi
124
124
  fi
125
125
 
126
- # Model/effort upgrade check (non-blocking, best-effort)
127
- RECOMMENDED_MODEL="opus[1m]"
128
- RECOMMENDED_EFFORT="xhigh"
129
- if command -v jq > /dev/null 2>&1; then
130
- EFFORT=""
131
- PROJ="${CLAUDE_PROJECT_DIR:-$PROJECT_DIR}"
132
- for f in "$PROJ/.claude/settings.local.json" "$PROJ/.claude/settings.json" "$HOME/.claude/settings.json"; do
133
- if [ -f "$f" ]; then
134
- val=$(jq -r '.effortLevel // empty' "$f" 2>/dev/null)
135
- if [ -n "$val" ]; then EFFORT="$val"; break; fi
136
- fi
137
- done
138
- if [ -n "$EFFORT" ] && [ "$EFFORT" != "$RECOMMENDED_EFFORT" ]; then
139
- echo "Upgrade available: effort $EFFORT → $RECOMMENDED_EFFORT (run: /effort $RECOMMENDED_EFFORT)"
140
- echo "Recommended model: $RECOMMENDED_MODEL (run: /model $RECOMMENDED_MODEL)"
141
- fi
142
- fi
126
+ # Model/effort upgrade check is delegated to hooks/model-effort-check.sh
127
+ # (single source of truth per ROADMAP #217). Don't duplicate the logic here —
128
+ # this hook and model-effort-check.sh both fire on SessionStart, so two checks
129
+ # would double-print the nudge and risk drifting out of sync.
143
130
 
144
131
  # Dual-channel install check (#181) — nudge when CLI skills + Claude plugin both present
145
132
  if [ -d "$PROJECT_DIR/.claude/skills/update" ]; then
@@ -1,12 +1,19 @@
1
1
  #!/bin/bash
2
- # SessionStart hook — nudges user when effort level is below recommended
3
- # and tells Claude the recommended model so it can compare against its own
4
- # CC does NOT expose the model to hooks, so model nudge relies on Claude
5
- # seeing this output and comparing against its system prompt
6
- # Non-blocking: always exits 0
2
+ # SessionStart hook — effort/model nudge.
3
+ #
4
+ # Behavior (per ROADMAP #217):
5
+ # effort=max -> silent (preferred default, above floor)
6
+ # effort=xhigh -> silent (minimum floor on Opus 4.7)
7
+ # effort=high|medium|low (or unset) -> LOUD WARNING:
8
+ # Opus 4.7 needs xhigh floor for SDLC compliance (TDD, self-review, deep reasoning).
9
+ # Recommends `/effort max`. Also reminds about recommended model `opus[1m]`.
10
+ #
11
+ # CC does not expose the current model to hooks, so the model nudge is emitted as
12
+ # guidance for Claude to compare against its own system prompt.
13
+ #
14
+ # Non-blocking: always exits 0.
7
15
 
8
16
  RECOMMENDED_MODEL="opus[1m]"
9
- RECOMMENDED_EFFORT="xhigh"
10
17
 
11
18
  # Drain stdin (SessionStart sends JSON but model field isn't in it)
12
19
  cat > /dev/null
@@ -27,17 +34,29 @@ for f in "$project_dir/.claude/settings.local.json" "$project_dir/.claude/settin
27
34
  fi
28
35
  done
29
36
 
30
- nudge=""
31
-
32
- if [ -n "$effort" ] && [ "$effort" != "$RECOMMENDED_EFFORT" ]; then
33
- nudge="effort: $effort → $RECOMMENDED_EFFORT (run: /effort $RECOMMENDED_EFFORT)"
37
+ # At or above floor — silent.
38
+ case "$effort" in
39
+ max|xhigh)
40
+ exit 0
41
+ ;;
42
+ esac
43
+
44
+ # Below floor OR unset — LOUD warning.
45
+ # Note: test_model_effort_size_cap asserts output < 500 chars. Keep copy terse.
46
+ if [ -z "$effort" ]; then
47
+ effort_display="unset"
48
+ else
49
+ effort_display="$effort"
34
50
  fi
35
51
 
36
- if [ -n "$nudge" ]; then
37
- echo "Upgrade available:"
38
- echo " $nudge"
39
- echo " recommended model: $RECOMMENDED_MODEL (run: /model $RECOMMENDED_MODEL)"
40
- echo " (Claude: compare recommended model against your current model — nudge user if different)"
41
- fi
52
+ echo "=============================================================================="
53
+ echo " WARNING: effort '$effort_display' breaks SDLC compliance on Opus 4.7."
54
+ echo " Below xhigh = shallow reasoning, skipped TDD, dropped self-review."
55
+ echo ""
56
+ echo " Run: /effort max (preferred, full SDLC compliance)"
57
+ echo " Or: /effort xhigh (minimum floor)"
58
+ echo ""
59
+ echo " recommended model: $RECOMMENDED_MODEL (run: /model $RECOMMENDED_MODEL)"
60
+ echo "=============================================================================="
42
61
 
43
62
  exit 0
@@ -22,19 +22,57 @@ ROOT="${CLAUDE_PROJECT_DIR:-$PWD}"
22
22
  HOLD_REASONS=""
23
23
 
24
24
  # Check 1: Codex review mid-cycle
25
- # Self-heal: if handoff has a pr_number and gh reports that PR as MERGED,
26
- # the handoff is a stale artifact from a closed review treat as implicit
27
- # CERTIFIED so a forgotten status field doesn't permanently block /compact.
25
+ # Self-heal paths (ordered by preference):
26
+ # (a) #209: handoff has pr_number + gh reports PR MERGED implicit CERTIFIED (silent)
27
+ # (b) #229: handoff has no pr_number but mtime > SDLC_HANDOFF_STALE_DAYS days
28
+ # → implicit CERTIFIED with WARN (the handoff predates #209 or was never
29
+ # PR-linked; blocking forever over a forgotten artifact is worse UX than
30
+ # the bug we're preventing). Default threshold: 14 days.
28
31
  HANDOFF="$ROOT/.reviews/handoff.json"
32
+ # Validate SDLC_HANDOFF_STALE_DAYS as non-negative integer. Anything else
33
+ # (empty, "foo", "-3", "10.5") silently falls back to 14 — we don't want a
34
+ # typo in the user's env to leak a bash arithmetic error to stderr every
35
+ # time the hook runs (caught by Codex P2 review of PR #227).
36
+ STALE_DAYS_RAW="${SDLC_HANDOFF_STALE_DAYS:-14}"
37
+ case "$STALE_DAYS_RAW" in
38
+ ''|*[!0-9]*) STALE_DAYS=14 ;;
39
+ *) STALE_DAYS="$STALE_DAYS_RAW" ;;
40
+ esac
41
+ STALE_WARN=""
29
42
  if [ -f "$HANDOFF" ]; then
30
43
  STATUS=$(grep -o '"status"[[:space:]]*:[[:space:]]*"[^"]*"' "$HANDOFF" 2>/dev/null | head -1 | sed 's/.*"\([^"]*\)"$/\1/')
31
44
  case "$STATUS" in
32
45
  PENDING_REVIEW|PENDING_RECHECK)
33
46
  PR_NUMBER=$(grep -o '"pr_number"[[:space:]]*:[[:space:]]*[0-9][0-9]*' "$HANDOFF" 2>/dev/null | head -1 | grep -o '[0-9][0-9]*$')
34
47
  HEALED=0
35
- if [ -n "$PR_NUMBER" ] && command -v gh >/dev/null 2>&1; then
36
- PR_STATE=$(gh pr view "$PR_NUMBER" --json state --jq .state 2>/dev/null)
37
- [ "$PR_STATE" = "MERGED" ] && HEALED=1
48
+ if [ -n "$PR_NUMBER" ]; then
49
+ # Path (a): PR-linked self-heal (#209). Applies regardless of mtime
50
+ # an OPEN PR with old mtime is still a live review.
51
+ if command -v gh >/dev/null 2>&1; then
52
+ PR_STATE=$(gh pr view "$PR_NUMBER" --json state --jq .state 2>/dev/null)
53
+ [ "$PR_STATE" = "MERGED" ] && HEALED=1
54
+ fi
55
+ else
56
+ # Path (b): stale-handoff auto-expire (#229). Only when no pr_number
57
+ # — we must not short-circuit PR-linked reviews.
58
+ # Try GNU stat first (Linux: `-c %Y` gives mtime, BSD stat errors out
59
+ # so `||` fires). Then BSD stat (macOS: `-f %m` gives mtime). The
60
+ # reverse order fails on Linux because `stat -f` on GNU means
61
+ # `--file-system` and dumps filesystem info to stdout (non-error).
62
+ MTIME=$(stat -c %Y "$HANDOFF" 2>/dev/null || stat -f %m "$HANDOFF" 2>/dev/null)
63
+ # Numeric guard: if stat fails both flavors or returns junk, skip
64
+ # the stale-check entirely and fall through to HOLD (safe default).
65
+ case "$MTIME" in
66
+ ''|*[!0-9]*) ;;
67
+ *)
68
+ NOW=$(date +%s)
69
+ AGE_DAYS=$(( (NOW - MTIME) / 86400 ))
70
+ if [ "$AGE_DAYS" -ge "$STALE_DAYS" ]; then
71
+ HEALED=1
72
+ STALE_WARN="WARN: handoff.json is ${STATUS} and ${AGE_DAYS}d old with no pr_number — treating as stale CERTIFIED (override: set SDLC_HANDOFF_STALE_DAYS or close out the review)."
73
+ fi
74
+ ;;
75
+ esac
38
76
  fi
39
77
  if [ "$HEALED" -ne 1 ]; then
40
78
  HOLD_REASONS="${HOLD_REASONS} - Codex review is ${STATUS}. Round-1 evidence lives in this context — compacting now loses what round-2 needs to re-verify.
@@ -72,4 +110,7 @@ if [ -n "$HOLD_REASONS" ]; then
72
110
  exit 2
73
111
  fi
74
112
 
113
+ # Stale-handoff unblock: emit a one-line WARN so the user knows the hook
114
+ # self-healed over an abandoned PENDING artifact (but still allow /compact).
115
+ [ -n "$STALE_WARN" ] && echo "$STALE_WARN" >&2
75
116
  exit 0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentic-sdlc-wizard",
3
- "version": "1.36.1",
3
+ "version": "1.37.0",
4
4
  "description": "SDLC enforcement for Claude Code — hooks, skills, and wizard setup in one command",
5
5
  "bin": {
6
6
  "sdlc-wizard": "cli/bin/sdlc-wizard.js"
@@ -42,9 +42,16 @@ TodoWrite([
42
42
  { content: "Cross-model review (if configured — see below)", status: "pending", activeForm: "Running cross-model review" },
43
43
  { content: "Scope guard: only changes related to task? No legacy/fallback code left?", status: "pending", activeForm: "Checking scope and legacy code" },
44
44
  // CI FEEDBACK LOOP (if CI monitoring enabled in setup - skip if no CI)
45
+ // NOTE (meta-repo only, ROADMAP #212 Option 1, 2026-04-24): this repo no
46
+ // longer runs e2e simulation in CI. Only `validate` blocks merge. For E2E
47
+ // signal on a PR, checkout the PR locally and run:
48
+ // bash tests/e2e/local-shepherd.sh <PR>
49
+ // which scores on Max subscription and posts an advisory check-run.
50
+ // Consumer repos still use their own CI as configured.
45
51
  { content: "Commit and push to remote", status: "pending", activeForm: "Pushing to remote" },
46
52
  { content: "Watch CI - fix failures, iterate until green (max 2x)", status: "pending", activeForm: "Watching CI" },
47
53
  { content: "Read CI review - implement valid suggestions, iterate until clean", status: "pending", activeForm: "Addressing CI review feedback" },
54
+ { content: "Meta-repo only: run local shepherd if PR needs E2E score (optional)", status: "pending", activeForm: "Running local shepherd" },
48
55
  { content: "Post-deploy verification (if deploy task — see Deployment Tasks)", status: "pending", activeForm: "Verifying deployment" },
49
56
  // FINAL
50
57
  { content: "Present summary: changes, tests, CI status", status: "pending", activeForm: "Presenting final summary" },
@@ -46,9 +46,10 @@ Parse all CHANGELOG entries between the user's installed version and the latest.
46
46
 
47
47
  ```
48
48
  Installed: 1.24.0
49
- Latest: 1.36.1
49
+ Latest: 1.37.0
50
50
 
51
51
  What changed:
52
+ - [1.37.0] `monthly-research.yml` workflow deleted (ROADMAP #231 Phase 1) — 0 merged artifacts in 30d while burning $11-23/month; research happens inline now. `model-effort-check.sh` loud WARNING below xhigh (#217) — max preferred, xhigh floor; duplicate effort nudge in `instructions-loaded-check.sh` removed; single source of truth. Both changes Codex-certified.
52
53
  - [1.36.1] Repo renamed `agentic-ai-sdlc-wizard` → `claude-sdlc-wizard` (matches sibling pattern; npm package unchanged); `npm pkg fix` metadata cleanup; slug migration across docs/tests/configs
53
54
  - [1.36.0] CC 2.1.118 `/usage` canonical + aliases, Tier 2 dead-gate fix (#215), score-history max_score correctness (#211), setup-bun regression guard (#210), post-mortem learnings (#220-222), GPT-5.5 adoption plan (#223), MCP-tool hooks + #198 re-verify in backlog (#218/#219)
54
55
  - [1.35.0] PreCompact seam gate + self-heal (#208/#209), effort auto-bump on LOW/FAILED/CONFUSED (#195), wizard staleness nudge (#196), Codex CI-log audit pattern, ...