agentic-sdlc-wizard 1.77.0 → 1.78.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.77.0",
16
+ "version": "1.78.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.77.0",
3
+ "version": "1.78.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,16 @@ 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.78.0] - 2026-06-02
8
+
9
+ ### Changed
10
+
11
+ - **Bumped recommended model from Opus 4.7 → Opus 4.8** (closes #365). Opus 4.8 launched 2026-05-28; day 5 in-the-wild sentiment settled positive, proof-of-life via `claude --print --model claude-opus-4-8` confirmed reachability, and the `opus[1m]` alias auto-resolves to latest Opus on CC v2.1.154+ (no settings.json template change needed — alias does the work). Updated prose across `SDLC.md` (Recommended Model row + effort warning), `CLAUDE_CODE_SDLC_WIZARD.md` (~11 mentions in effort table + autocompact + mixed-mode tier + 1M-context section), `skills/sdlc/SKILL.md`, `skills/setup/SKILL.md` (mixed-mode + flagship tier suggestions), `skills/update/SKILL.md`, `hooks/model-effort-check.sh` (warning text), and `cli/lib/repo-complexity.js` (tier comments). Min CC bumped v2.1.111+ → v2.1.154+ (required to resolve `opus[1m]` to 4.8). Effort semantics preserved — strict effort behavior introduced in 4.7 carried forward to 4.8, so `max` remains the recommended default and `xhigh` the floor.
12
+
13
+ ### Notes
14
+
15
+ - **Un-run gates 2+3 tracked as post-deploy follow-up obligations on #365.** Gate 2 (A/B coder quality vs 4.7 on real PRs) and Gate 3 (dogfood for 24h before bump) were both deferred. If real-world use surfaces the system-card-flagged regressions for 4.8 — prompt-injection +60% on Gray Swan, file-deletion tendency, or eval-awareness affecting wizard output — revert via a single PR that flips the 4.7↔4.8 prose. Settings.json template unchanged means revert is prose-only.
16
+
7
17
  ## [1.77.0] - 2026-05-24
8
18
 
9
19
  ### Added
@@ -241,7 +241,7 @@ When Anthropic provides official plugins or tools that handle something:
241
241
  | **Claude Code v2.1.69+** | Required for InstructionsLoaded hook, skill directory variable, and Tasks system |
242
242
  | **Git repository** | Files should be committed for team sharing |
243
243
 
244
- **Blank repos (no CLAUDE.md, no code):** The wizard works on empty repos. Run `npx agentic-sdlc-wizard init` — it installs hooks, skills, and the wizard doc. On first session, the hooks detect missing SDLC files and redirect to `/setup-wizard`, which generates CLAUDE.md, SDLC.md, TESTING.md, and ARCHITECTURE.md interactively. You do NOT need to run Claude's built-in `/init` first — the setup wizard handles everything.
244
+ **Blank repos (no CLAUDE.md, no code):** The wizard works on empty repos. Run `npx -y agentic-sdlc-wizard@latest init` — it installs hooks, skills, and the wizard doc. (The `@latest` pin guards against stale npx caches per #358.) On first session, the hooks detect missing SDLC files and redirect to `/setup-wizard`, which generates CLAUDE.md, SDLC.md, TESTING.md, and ARCHITECTURE.md interactively. You do NOT need to run Claude's built-in `/init` first — the setup wizard handles everything.
245
245
 
246
246
  ---
247
247
 
@@ -249,26 +249,26 @@ When Anthropic provides official plugins or tools that handle something:
249
249
 
250
250
  Claude Code's **effort level** controls how much thinking the model does before responding. Higher effort = deeper reasoning but more tokens.
251
251
 
252
- > ⚠️ **On Opus 4.7, effort below `xhigh` breaks SDLC compliance in practice.** Unlike 4.6, Opus 4.7 respects effort levels *strictly* — at `high` or below it scopes work tighter (shallow reasoning, skipped TDD, no self-review) rather than going above-and-beyond. Treat the table below accordingly: **`max` is the recommended default, `xhigh` is the floor**, `high` or below is for trivial grep/search subagents only.
252
+ > ⚠️ **On Opus 4.8, effort below `xhigh` breaks SDLC compliance in practice.** Inherited from 4.7, Opus 4.8 respects effort levels *strictly* — at `high` or below it scopes work tighter (shallow reasoning, skipped TDD, no self-review) rather than going above-and-beyond. Treat the table below accordingly: **`max` is the recommended default, `xhigh` is the floor**, `high` or below is for trivial grep/search subagents only.
253
253
 
254
254
  | Level | When to Use | How to Set |
255
255
  |-------|-------------|------------|
256
- | `high` or below | **Not for SDLC work on Opus 4.7.** Only for trivial grep/search subagents or one-shot questions that don't require planning | `effort: high` in a specific subagent frontmatter only |
257
- | `xhigh` | **Floor for SDLC work on Opus 4.7.** Long-running tasks, repeated tool calls, deep exploration. Claude Code defaults to this on Opus 4.7 | `/effort xhigh` or set in skill frontmatter |
258
- | `max` | **Recommended default for Opus 4.7 SDLC work.** Multi-file changes, architecture decisions, debugging, cross-model reviews, any task touching wizard/skill/CI code | `/effort max` (session only — resets next session) |
259
-
260
- **Effort level changes in Opus 4.7 (April 2026):**
261
- - **`xhigh` is new** — sits between `high` and `max`, designed for coding and agentic work (30+ minute tasks with token budgets in the millions)
262
- - **Claude Code now defaults to `xhigh`** on Opus 4.7 for all plans
263
- - **Opus 4.7 respects effort levels more strictly** than 4.6 — at lower levels it scopes work tighter instead of going above and beyond. If you see shallow reasoning, raise effort rather than prompting around it
264
- - **`budget_tokens` is deprecated** on Opus 4.7 — use adaptive thinking with effort instead
256
+ | `high` or below | **Not for SDLC work on Opus 4.8.** Only for trivial grep/search subagents or one-shot questions that don't require planning | `effort: high` in a specific subagent frontmatter only |
257
+ | `xhigh` | **Floor for SDLC work on Opus 4.8.** Long-running tasks, repeated tool calls, deep exploration. Claude Code defaults to this on Opus 4.7+ | `/effort xhigh` or set in skill frontmatter |
258
+ | `max` | **Recommended default for Opus 4.8 SDLC work.** Multi-file changes, architecture decisions, debugging, cross-model reviews, any task touching wizard/skill/CI code | `/effort max` (session only — resets next session) |
259
+
260
+ **Strict effort behavior (Opus 4.7+, carried forward to 4.8):**
261
+ - **`xhigh` was introduced in 4.7** — sits between `high` and `max`, designed for coding and agentic work (30+ minute tasks with token budgets in the millions)
262
+ - **Claude Code defaults to `xhigh`** on Opus 4.7+ for all plans
263
+ - **Opus 4.7+ respects effort levels more strictly** than 4.6 — at lower levels it scopes work tighter instead of going above and beyond. If you see shallow reasoning, raise effort rather than prompting around it
264
+ - **`budget_tokens` is deprecated** on Opus 4.7+ — use adaptive thinking with effort instead
265
265
  - When running at `xhigh` or `max`, set a large `max_tokens` (64k+) so the model has room to think across subagents and tool calls
266
266
 
267
267
  **Why `high` was the previous default:** Claude Code uses **adaptive thinking** to dynamically allocate reasoning budget per turn. On Pro and Max plans, the default effort level was **medium (85)**, which causes the model to under-allocate reasoning on complex multi-step tasks — leading to shallow analysis, missed edge cases, and "lazy" outputs. This was [confirmed by Anthropic engineer Boris Cherny](https://github.com/anthropics/claude-code/issues/42796) and is documented at [code.claude.com](https://code.claude.com/docs/en/model-config). API, Team, and Enterprise plans default to high effort and are not affected.
268
268
 
269
269
  **Don't rely on the CC default — set effort yourself.** Anthropic's [2026-04-23 post-mortem](https://www.anthropic.com/engineering/april-23-postmortem) is independent third-party evidence that CC has flipped reasoning_effort defaults across versions (high → medium → xhigh/high). The default has changed before and will change again. The wizard's `model-effort-check.sh` hook nudges to `xhigh`/`max` at session start specifically because the in-product default is not load-bearing — it can shift release-to-release without notice. Set `/effort max` explicitly every session you do SDLC work, and treat any "I assumed the default was X" reasoning as a bug.
270
270
 
271
- The `/sdlc` skill sets `effort: high` in its frontmatter as a baseline, overriding the medium default on every SDLC invocation. **On Opus 4.7, run `/effort max` at session start** — the frontmatter is a floor, not a ceiling, and `max` is where SDLC-compliant work actually happens on 4.7.
271
+ The `/sdlc` skill sets `effort: high` in its frontmatter as a baseline, overriding the medium default on every SDLC invocation. **On Opus 4.8, run `/effort max` at session start** — the frontmatter is a floor, not a ceiling, and `max` is where SDLC-compliant work actually happens on 4.8.
272
272
 
273
273
  **Nuclear option — disable adaptive thinking entirely:** Set `CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING=1` in your environment or settings.json `env` block. This forces a fixed reasoning budget per turn instead of letting the model dynamically allocate. Use this if you observe persistent quality issues even with `effort: high`. See [Claude Code model config docs](https://code.claude.com/docs/en/model-config) for details.
274
274
 
@@ -966,7 +966,7 @@ Override the default auto-compact threshold with environment variables. These ar
966
966
  | `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` | Trigger compaction at this % of context capacity (1-100) | ~95% |
967
967
  | `CLAUDE_CODE_AUTO_COMPACT_WINDOW` | Override context capacity in tokens (useful for 1M models) | Model default |
968
968
 
969
- **Opt-in (issue #198):** The SDLC Wizard CLI ships `.claude/settings.json` with **no** `model` or `env` pin so Claude Code's auto-mode stays enabled. The setup skill's Step 9.5 asks whether to opt into `"model": "opus[1m]"` + `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE=30` (tuned for the 1M window — compacts at ~300K). Default answer is **No**. Pinning the model at the top level tells Claude Code you've explicitly chosen a model and turns off per-turn model auto-selection — a real tradeoff, so we ask. Power users who want guaranteed Opus 4.7 + 1M context answer yes.
969
+ **Opt-in (issue #198):** The SDLC Wizard CLI ships `.claude/settings.json` with **no** `model` or `env` pin so Claude Code's auto-mode stays enabled. The setup skill's Step 9.5 asks whether to opt into `"model": "opus[1m]"` + `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE=30` (tuned for the 1M window — compacts at ~300K). Default answer is **No**. Pinning the model at the top level tells Claude Code you've explicitly chosen a model and turns off per-turn model auto-selection — a real tradeoff, so we ask. Power users who want guaranteed Opus 4.8 + 1M context answer yes.
970
970
 
971
971
  To opt in by hand, edit `.claude/settings.json`:
972
972
 
@@ -1021,13 +1021,13 @@ Claude Code supports both 200K and 1M context windows. **`opus[1m]` is an opt-in
1021
1021
  **Why `opus[1m]` is opt-in (issue #198):**
1022
1022
  - **Pinning disables auto-mode.** Max-plan users pay for Claude Code's per-turn model selection (Sonnet for cheap tasks, Opus for hard ones, plus weekly-limit smoothing). A top-level `model` gives that up.
1023
1023
  - **The 1M headroom has to earn it.** If your typical session stays under 150K, you're giving up auto-mode for headroom you're not using.
1024
- - **Power users who want guaranteed Opus 4.7 + 1M** — go ahead, it's a real win for long shepherding sessions. Just make it a conscious choice, not a silent default.
1024
+ - **Power users who want guaranteed Opus 4.8 + 1M** — go ahead, it's a real win for long shepherding sessions. Just make it a conscious choice, not a silent default.
1025
1025
 
1026
- **Opt in when:** you routinely cross 100K tokens in a single session (plan → TDD → review → CI shepherd on one feature), you want Opus 4.7 specifically (not Sonnet), and you're OK losing auto-mode.
1026
+ **Opt in when:** you routinely cross 100K tokens in a single session (plan → TDD → review → CI shepherd on one feature), you want Opus 4.8 specifically (not Sonnet), and you're OK losing auto-mode.
1027
1027
 
1028
1028
  **Stay on auto-mode (default) when:** you're unsure, your work is mixed short/long, or you want Claude Code to do the model math for you.
1029
1029
 
1030
- **How to opt in:** run `/model opus[1m]` in your session (transient), or set `"model": "opus[1m]"` in `.claude/settings.json` (persistent). Requires Claude Code v2.1.111+ for Opus 4.7. The setup wizard's Step 9.5 also asks once, with default No.
1030
+ **How to opt in:** run `/model opus[1m]` in your session (transient), or set `"model": "opus[1m]"` in `.claude/settings.json` (persistent). Requires Claude Code v2.1.154+ for Opus 4.8 (the `opus[1m]` alias auto-resolves to the latest Opus). The setup wizard's Step 9.5 also asks once, with default No.
1031
1031
 
1032
1032
  **How to opt out:** remove the `model` line from `.claude/settings.json`, or run `/model` and pick "Default (recommended)".
1033
1033
 
@@ -1037,14 +1037,14 @@ Claude Code supports both 200K and 1M context windows. **`opus[1m]` is an opt-in
1037
1037
 
1038
1038
  ### Mixed-Mode Tier (Sonnet coder + Opus reviewer, roadmap #233)
1039
1039
 
1040
- For trivial / blank / config-only / CRUD-style repos, full Opus 4.7 on every turn is overkill on the coder leg. The **mixed-mode tier** pins `model: "sonnet[1m]"` for in-session work while keeping the cross-model review layer (Codex / external reviewer) at the flagship — so the reviewer still catches what Sonnet missed.
1040
+ For trivial / blank / config-only / CRUD-style repos, full Opus 4.8 on every turn is overkill on the coder leg. The **mixed-mode tier** pins `model: "sonnet[1m]"` for in-session work while keeping the cross-model review layer (Codex / external reviewer) at the flagship — so the reviewer still catches what Sonnet missed.
1041
1041
 
1042
1042
  **The split:**
1043
1043
 
1044
1044
  | Layer | Mixed-mode tier | Flagship tier |
1045
1045
  |-------|----------------|---------------|
1046
1046
  | Coder (in-session CC) | `model: "sonnet[1m]"` | `model: "opus[1m]"` |
1047
- | Cross-model reviewer (Codex etc.) | gpt-5.5 xhigh (or Opus 4.7 max via Bash) | gpt-5.5 xhigh (or Opus 4.7 max via Bash) |
1047
+ | Cross-model reviewer (Codex etc.) | gpt-5.5 xhigh (or Opus 4.8 max via Bash) | gpt-5.5 xhigh (or Opus 4.8 max via Bash) |
1048
1048
  | Effort floor (CC session) | xhigh; max preferred | xhigh; max preferred |
1049
1049
 
1050
1050
  The reviewer always stays at flagship — the whole point of mixed-mode is that adversarial review catches Sonnet's blind spots, so weakening the review leg defeats the savings.
@@ -1058,7 +1058,7 @@ The reviewer always stays at flagship — the whole point of mixed-mode is that
1058
1058
  **When to stay flagship:**
1059
1059
  - Stakes-flagged repo: anywhere `.env` / `secrets/` / `credentials/` exists. Force flagship even if LOC is tiny — leaks are catastrophic
1060
1060
  - Architecture work, debugging non-obvious bugs, security review, anything where the *coder's* judgment matters as much as the reviewer's
1061
- - Long shepherd sessions (plan → TDD → review → CI loop) — they cross 100K tokens regularly and Opus 4.7 fits the window better in a single thread
1061
+ - Long shepherd sessions (plan → TDD → review → CI loop) — they cross 100K tokens regularly and Opus 4.8 fits the window better in a single thread
1062
1062
 
1063
1063
  **Auto-detection:** the setup wizard runs `cli/lib/repo-complexity.js` against the target repo and suggests the tier. Stakes flag (`.env` / `secrets/`) forces complex regardless of size. The user always picks the final answer — the heuristic is a hint, not a gate.
1064
1064
 
@@ -2366,6 +2366,8 @@ PLANNING → DOCS → TDD RED → TDD GREEN → Tests Pass → Self-Review
2366
2366
 
2367
2367
  > **Always append `< /dev/null`** to `codex exec` calls run from background, hooks, CI, or any non-interactive parent. Without it, codex blocks on stdin reads even when the prompt is given as an argument — the process sits at S/0% CPU indefinitely with a 0-byte `-o` output file (the file is only written on completion, so a hang gives zero visibility). Validated on codex-cli 0.130.0 / macOS 14, 2026-05-15. For live progress, use `scripts/codex-review-with-progress.sh` instead.
2368
2368
 
2369
+ > **Always launch codex via `run_in_background: true` on the Bash tool.** The Bash tool clamps `timeout` to 600000 ms (10 min) regardless of the value passed, and force-kills the foreground process at that wall. Multi-artifact bundle reviews (release reviews per the checklist below, multi-finding rechecks, etc.) routinely run 6–30 minutes — they need background mode to complete. The wrapper `scripts/codex-review.sh` already has a 30-min stall watchdog (`STALL_SECONDS=1800`) as the real timeout control. A foreground call killed mid-review plus the Stop-hook re-invocation loop can burn 60+ minutes of session compute on what should be a single 7-minute run (issue #364, 2026-05-27 incident). The general rule: **any long-running wrapper invoked through the CC Bash tool — codex, slow builds, long test suites — should use `run_in_background: true` unconditionally and let the wrapper's own stall watchdog be the timeout authority.**
2370
+
2369
2371
  3. If CERTIFIED → proceed to CI. If NOT CERTIFIED → go to Round 2.
2370
2372
 
2371
2373
  ### Round 2+: Dialogue Loop
@@ -2981,7 +2983,7 @@ If deployment fails or post-deploy verification catches issues:
2981
2983
 
2982
2984
  **SDLC.md:**
2983
2985
  ```markdown
2984
- <!-- SDLC Wizard Version: 1.77.0 -->
2986
+ <!-- SDLC Wizard Version: 1.78.0 -->
2985
2987
  <!-- Setup Date: [DATE] -->
2986
2988
  <!-- 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 -->
2987
2989
  <!-- Git Workflow: [PRs or Solo] -->
@@ -3802,6 +3804,8 @@ codex exec \
3802
3804
 
3803
3805
  > **Always append `< /dev/null`** to `codex exec` calls run from background, hooks, CI, or any non-interactive parent. Without it, codex blocks on stdin reads even when the prompt is given as an argument — the process sits at S/0% CPU indefinitely with a 0-byte `-o` output file. Validated on codex-cli 0.130.0 / macOS 14, 2026-05-15. For live progress visibility, use `scripts/codex-review-with-progress.sh` instead.
3804
3806
 
3807
+ > **Always launch via `run_in_background: true` on the Bash tool.** Same reason as the parallel callout in the Cross-Model Review Loop section above — Bash tool clamps `timeout` to 600000 ms (10 min) regardless of the value passed and force-kills foreground at the wall. Multi-artifact bundle reviews need background mode to complete. See issue #364 (2026-05-27 incident: 70 min session compute on a 7-min review).
3808
+
3805
3809
  4. If CERTIFIED → done. If NOT CERTIFIED → enter the dialogue loop.
3806
3810
 
3807
3811
  **The Dialogue Loop (Round 2+):**
package/README.md CHANGED
@@ -12,8 +12,9 @@ A **self-evolving Software Development Life Cycle (SDLC) enforcement system for
12
12
 
13
13
  Run from your terminal or from inside Claude Code (`!` prefix):
14
14
  ```bash
15
- npx agentic-sdlc-wizard init
15
+ npx -y agentic-sdlc-wizard@latest init
16
16
  ```
17
+ The `@latest` pin forces npm to fetch the newest version. Without it, `npx` may serve a stale CLI from your local cache (#358); `init` also nudges if it detects a gap.
17
18
  Then start (or restart) Claude Code — type `/exit` then `claude` to reload hooks. Setup auto-invokes on first prompt — Claude reads the wizard doc, scans your project, and generates bespoke CLAUDE.md, SDLC.md, TESTING.md, and ARCHITECTURE.md. No manual commands needed.
18
19
 
19
20
  <details>
@@ -242,7 +243,7 @@ This isn't the only Claude Code SDLC tool. Here's an honest comparison:
242
243
  | **Evaluation** | 95% CI, CUSUM, SDP, Tier 1/2 | Configuration testing | skilltest framework |
243
244
  | **CI Shepherd** | Local CI fix loop | No | No |
244
245
  | **Auto-updates** | Weekly CC + community scan | No | No |
245
- | **Install** | `npx agentic-sdlc-wizard init` | npm install | npm install |
246
+ | **Install** | `npx -y agentic-sdlc-wizard@latest init` | npm install | npm install |
246
247
  | **Philosophy** | Lightweight, prove-it-or-delete | Scale and optimization | Documentation-first |
247
248
 
248
249
  **Our unique strengths:** Statistical rigor (CUSUM + 95% CI), SDP scoring (model quality vs SDLC compliance), CI shepherd loop, Prove-It A/B pipeline, comprehensive automated test suite, dogfooding enforcement.
package/cli/init.js CHANGED
@@ -25,6 +25,7 @@ const FILES = [
25
25
  { src: 'hooks/instructions-loaded-check.sh', dest: '.claude/hooks/instructions-loaded-check.sh', executable: true, base: REPO_ROOT },
26
26
  { src: 'hooks/model-effort-check.sh', dest: '.claude/hooks/model-effort-check.sh', executable: true, base: REPO_ROOT },
27
27
  { src: 'hooks/precompact-seam-check.sh', dest: '.claude/hooks/precompact-seam-check.sh', executable: true, base: REPO_ROOT },
28
+ { src: 'hooks/goal-confidence-check.sh', dest: '.claude/hooks/goal-confidence-check.sh', executable: true, base: REPO_ROOT },
28
29
  // #254 Bug 1: shared helper sourced by all hooks above. Must ship — without
29
30
  // it, hooks emit "_find-sdlc-root.sh: No such file or directory" + the
30
31
  // SDLC root walk-up logic is silently dead.
@@ -283,6 +284,79 @@ function invalidateVersionCache({ dryRun }) {
283
284
  return true;
284
285
  }
285
286
 
287
+ // #358: Nudge the user if their CLI is behind npm latest. Stale-npx-cache
288
+ // is the quiet onboarding bug — `npx agentic-sdlc-wizard init` (no @latest
289
+ // pin) serves whatever version is cached on disk, sometimes months old.
290
+ // Reuses the SDLC_WIZARD_CACHE_DIR/latest-version cache that the
291
+ // instructions-loaded hook already populates (#64/#196), so up-to-date users
292
+ // pay zero extra latency.
293
+ function maybeEmitStaleCliNudge() {
294
+ const semverRe = /^(\d+)\.(\d+)\.(\d+)$/;
295
+ const cmp = (a, b) => {
296
+ const am = a.match(semverRe);
297
+ const bm = b.match(semverRe);
298
+ if (!am || !bm) return 0;
299
+ for (let i = 1; i <= 3; i++) {
300
+ const ai = parseInt(am[i], 10);
301
+ const bi = parseInt(bm[i], 10);
302
+ if (ai < bi) return -1;
303
+ if (ai > bi) return 1;
304
+ }
305
+ return 0;
306
+ };
307
+
308
+ let current;
309
+ try {
310
+ current = require('../package.json').version;
311
+ } catch (_) {
312
+ return;
313
+ }
314
+ if (!semverRe.test(current)) return;
315
+
316
+ const cacheDir = process.env.SDLC_WIZARD_CACHE_DIR
317
+ || path.join(os.homedir(), '.cache', 'sdlc-wizard');
318
+ const cacheFile = path.join(cacheDir, 'latest-version');
319
+ let latest = null;
320
+
321
+ // Try cache first (24h TTL, valid semver, #239 sanity check: cached
322
+ // "latest" must be >= installed — older value means poisoned, refetch).
323
+ if (fs.existsSync(cacheFile)) {
324
+ try {
325
+ const stat = fs.statSync(cacheFile);
326
+ const ageMs = Date.now() - stat.mtimeMs;
327
+ if (ageMs < 86400 * 1000) {
328
+ const content = fs.readFileSync(cacheFile, 'utf8').trim();
329
+ if (semverRe.test(content) && cmp(content, current) >= 0) {
330
+ latest = content;
331
+ }
332
+ }
333
+ } catch (_) { /* unreadable — fall through to npm fetch */ }
334
+ }
335
+
336
+ // Cache miss / stale / poisoned → npm fetch (5s timeout, write on success)
337
+ if (latest === null) {
338
+ try {
339
+ const { execSync } = require('child_process');
340
+ const fetched = execSync('npm view agentic-sdlc-wizard version 2>/dev/null', {
341
+ encoding: 'utf8',
342
+ timeout: 5000,
343
+ }).trim();
344
+ if (semverRe.test(fetched)) {
345
+ latest = fetched;
346
+ try {
347
+ fs.mkdirSync(cacheDir, { recursive: true });
348
+ fs.writeFileSync(cacheFile, latest);
349
+ } catch (_) { /* best-effort cache write */ }
350
+ }
351
+ } catch (_) { /* offline or npm unavailable — silent */ }
352
+ }
353
+
354
+ if (latest && cmp(current, latest) < 0) {
355
+ console.log(`\n ${YELLOW}STALE${RESET} agentic-sdlc-wizard CLI ${current} in use; npm latest is ${latest}.`);
356
+ console.log(` Recommended: rerun with ${CYAN}npx -y agentic-sdlc-wizard@latest init${RESET} to install the newest hooks/skills.`);
357
+ }
358
+ }
359
+
286
360
  function init(targetDir, { force = false, dryRun = false, preserveCustomized = false } = {}) {
287
361
  if (!dryRun && !force) {
288
362
  const pluginPaths = detectPluginInstall();
@@ -302,6 +376,8 @@ function init(targetDir, { force = false, dryRun = false, preserveCustomized = f
302
376
  }
303
377
  }
304
378
 
379
+ maybeEmitStaleCliNudge();
380
+
305
381
  const ops = planOperations(targetDir, { force, preserveCustomized });
306
382
 
307
383
  if (dryRun) {
@@ -1,8 +1,8 @@
1
1
  // Roadmap #233: repo complexity heuristic for mixed-mode tier selection.
2
2
  //
3
3
  // Output: { tier: 'simple' | 'complex', score: <number>, signals: [...] }
4
- // - 'simple' → setup wizard suggests mixed-mode (Sonnet 4.6 coder + Opus 4.7 reviewer)
5
- // - 'complex' → setup wizard suggests full flagship (Opus 4.7 everywhere)
4
+ // - 'simple' → setup wizard suggests mixed-mode (Sonnet 4.6 coder + Opus 4.8 reviewer)
5
+ // - 'complex' → setup wizard suggests full flagship (Opus 4.8 everywhere)
6
6
  // Cross-model review (Codex / external) always stays at the flagship tier
7
7
  // regardless of coder selection — see CLAUDE_CODE_SDLC_WIZARD.md.
8
8
  //
@@ -7,6 +7,10 @@
7
7
  {
8
8
  "type": "command",
9
9
  "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/sdlc-prompt-check.sh"
10
+ },
11
+ {
12
+ "type": "command",
13
+ "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/goal-confidence-check.sh"
10
14
  }
11
15
  ]
12
16
  }
@@ -0,0 +1,82 @@
1
+ #!/bin/bash
2
+ # /goal SDLC discipline gate (ROADMAP #360).
3
+ #
4
+ # UserPromptSubmit hook. When the user invokes `/goal <condition>`, scan the
5
+ # prior assistant text for a HIGH 95% confidence statement AND check the
6
+ # condition for a DLC binding (`/sdlc`, `/gdlc`, `/ldlc`, etc.). Emit loud
7
+ # warnings on either gap so the SDLC-discipline gap surfaces BEFORE the goal
8
+ # evaluator starts rubber-stamping flailing as progress.
9
+ #
10
+ # PR #355 (v1.77.0) added the guidance text in skills/sdlc/SKILL.md. This
11
+ # hook is the enforcement layer per #360. Non-blocking soft nudge — same
12
+ # pattern as model-effort-check.sh.
13
+
14
+ HOOK_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
15
+ source "$HOOK_DIR/_find-sdlc-root.sh"
16
+
17
+ # Plugin + project copies both register this hook → plugin yields (#236).
18
+ dedupe_plugin_or_project "${BASH_SOURCE[0]}" || exit 0
19
+
20
+ # Must be invoked via hook (stdin JSON), not interactively.
21
+ [ -t 0 ] && exit 0
22
+ STDIN_JSON=$(cat)
23
+ [ -z "$STDIN_JSON" ] && exit 0
24
+ command -v jq > /dev/null 2>&1 || exit 0
25
+
26
+ PROMPT=$(printf '%s' "$STDIN_JSON" | jq -r '.prompt // empty' 2>/dev/null) || exit 0
27
+ [ -z "$PROMPT" ] && exit 0
28
+
29
+ # Only act on `/goal <condition>` invocations. `/goal` alone (status) and
30
+ # `/goal clear` (reset) must stay silent — those aren't discipline events.
31
+ case "$PROMPT" in
32
+ "/goal") exit 0 ;;
33
+ "/goal "[[:space:]]*) exit 0 ;;
34
+ "/goal clear") exit 0 ;;
35
+ "/goal clear "*) exit 0 ;;
36
+ "/goal "*) ;;
37
+ *) exit 0 ;;
38
+ esac
39
+
40
+ CONDITION="${PROMPT#/goal }"
41
+
42
+ # === Confidence gate ===
43
+ # Read transcript_path, slurp JSONL, find last assistant message with text
44
+ # content, scan for HIGH-95% confidence pattern. Silent on missing/unreadable
45
+ # transcript — better to under-warn than crash a soft nudge.
46
+ TRANSCRIPT_PATH=$(printf '%s' "$STDIN_JSON" | jq -r '.transcript_path // empty' 2>/dev/null) || TRANSCRIPT_PATH=""
47
+ HAS_CONFIDENCE=0
48
+ if [ -n "$TRANSCRIPT_PATH" ] && [ -r "$TRANSCRIPT_PATH" ]; then
49
+ LAST_ASSISTANT_TEXT=$(jq -rs '
50
+ [.[] | select(.type == "assistant")]
51
+ | last
52
+ | if . == null then ""
53
+ else (.message.content // []) | map(select(.type == "text") | .text) | join("\n")
54
+ end
55
+ ' "$TRANSCRIPT_PATH" 2>/dev/null) || LAST_ASSISTANT_TEXT=""
56
+ if printf '%s' "$LAST_ASSISTANT_TEXT" | grep -qiE 'HIGH \(?95%|confidence:?[[:space:]]+HIGH|HIGH[[:space:]]+95%|95%[[:space:]]+confidence'; then
57
+ HAS_CONFIDENCE=1
58
+ fi
59
+ fi
60
+
61
+ if [ "$HAS_CONFIDENCE" -eq 0 ]; then
62
+ echo ""
63
+ echo "!! /GOAL CONFIDENCE GATE: prior turn did not state HIGH 95% confidence !!"
64
+ echo " The /goal Haiku evaluator rubber-stamps flailing as progress below 95%."
65
+ echo " Recommendation: /goal clear → do research → state HIGH 95% confidence → re-issue /goal."
66
+ echo " (Source: skills/sdlc/SKILL.md Long-Running Goals section, ROADMAP #360.)"
67
+ echo ""
68
+ fi
69
+
70
+ # === DLC binding gate ===
71
+ # Condition MUST name a DLC (`/sdlc`, `/gdlc`, `/ldlc`, etc.) so the
72
+ # evaluator anchors on "doing it right" not just "doing it".
73
+ if ! printf '%s' "$CONDITION" | grep -qiE '/[a-z]+dlc'; then
74
+ echo ""
75
+ echo "!! /GOAL DLC-BINDING GATE: condition does not name a DLC (/sdlc, /gdlc, /ldlc) !!"
76
+ echo " The evaluator needs a discipline anchor to judge 'doing it right' vs flailing."
77
+ echo " Recommendation: rewrite condition to include 'following /sdlc' (or /gdlc/etc)."
78
+ echo " (Source: skills/sdlc/SKILL.md Long-Running Goals section, ROADMAP #360.)"
79
+ echo ""
80
+ fi
81
+
82
+ exit 0
package/hooks/hooks.json CHANGED
@@ -7,6 +7,10 @@
7
7
  {
8
8
  "type": "command",
9
9
  "command": "${CLAUDE_PLUGIN_ROOT}/hooks/sdlc-prompt-check.sh"
10
+ },
11
+ {
12
+ "type": "command",
13
+ "command": "${CLAUDE_PLUGIN_ROOT}/hooks/goal-confidence-check.sh"
10
14
  }
11
15
  ]
12
16
  }
@@ -3,9 +3,9 @@
3
3
  #
4
4
  # Behavior (per ROADMAP #217):
5
5
  # effort=max -> silent (preferred default, above floor)
6
- # effort=xhigh -> silent (minimum floor on Opus 4.7)
6
+ # effort=xhigh -> silent (minimum floor on Opus 4.8)
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).
8
+ # Opus 4.8 needs xhigh floor for SDLC compliance (TDD, self-review, deep reasoning).
9
9
  # Recommends `/effort max`. Also reminds about recommended model `opus[1m]`.
10
10
  #
11
11
  # CC does not expose the current model to hooks, so the model nudge is emitted as
@@ -57,7 +57,7 @@ else
57
57
  fi
58
58
 
59
59
  echo "=============================================================================="
60
- echo " WARNING: effort '$effort_display' breaks SDLC compliance on Opus 4.7."
60
+ echo " WARNING: effort '$effort_display' breaks SDLC compliance on Opus 4.8."
61
61
  echo " Below xhigh = shallow reasoning, skipped TDD, dropped self-review."
62
62
  echo ""
63
63
  echo " Run: /effort max (preferred, full SDLC compliance)"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentic-sdlc-wizard",
3
- "version": "1.77.0",
3
+ "version": "1.78.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"
@@ -114,7 +114,7 @@ Native `/goal <condition>` (**v2.1.143+**). Haiku evaluator re-checks transcript
114
114
 
115
115
  ## Recommended Model
116
116
 
117
- **Opt-in: `opus[1m]` (Opus 4.7 with 1M context).** `/model opus[1m]` at the start of non-trivial sessions — understand the tradeoff (issue #198). A top-level `model` pin in `.claude/settings.json` disables CC's per-turn auto-selection; pin only when you need 1M headroom. Requires CC v2.1.111+.
117
+ **Opt-in: `opus[1m]` (Opus 4.8 with 1M context).** `/model opus[1m]` at the start of non-trivial sessions — understand the tradeoff (issue #198). A top-level `model` pin in `.claude/settings.json` disables CC's per-turn auto-selection; pin only when you need 1M headroom. Requires CC v2.1.154+.
118
118
 
119
119
  **Pair with `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE=30` when you opt in.** Without it, the default fires at ~76K on 1M. **Pick ONE — do NOT set both `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE=30` AND `CLAUDE_CODE_AUTO_COMPACT_WINDOW=400000`** — they compound to 30% × 400K = 120K trigger ≈ 12% of 1M, fires almost immediately (#207). See wizard "Autocompact Tuning" for details.
120
120
 
@@ -130,18 +130,20 @@ The loop goes back to PLANNING, not TDD RED. Run `/code-review`; issues at confi
130
130
 
131
131
  ## Cross-Model Review (If Configured)
132
132
 
133
- **When to run:** high-stakes changes (auth, payments, data), releases/publishes, complex refactors. **When to skip:** trivial changes, time-sensitive hotfixes, risk < review cost. **Prerequisites:** Codex CLI (`npm i -g @openai/codex`) + OpenAI API key. **Reviewer at flagship tier (#233):** even when project pins `sonnet[1m]`, reviewer runs `gpt-5.5` / Opus 4.7 max — adversarial diversity is the point.
133
+ **When to run:** high-stakes changes (auth, payments, data), releases/publishes, complex refactors. **When to skip:** trivial changes, time-sensitive hotfixes, risk < review cost. **Prerequisites:** Codex CLI (`npm i -g @openai/codex`) + OpenAI API key. **Reviewer at flagship tier (#233):** even when project pins `sonnet[1m]`, reviewer runs `gpt-5.5` / Opus 4.8 max — adversarial diversity is the point.
134
134
 
135
135
  PROTOCOL is universal across domains; only `review_instructions` and `verification_checklist` change.
136
136
 
137
137
  1. **Preflight** (`.reviews/preflight-{review_id}.md`) — what you already checked: `/code-review` passed, tests passing, manual verifications, known limits. Reduces reviewer findings to 0-1/round.
138
- 2. **Mission-first handoff** (`.reviews/handoff.json`) — required JSON keys: `"review_id"`, `"status": "PENDING_REVIEW"`, `"round": 1`, `"mission"` / `"success"` / `"failure"` (2-3 sentences each — without them you get "looks good"), `"files_changed"`, `"verification_checklist"` — the **verification checklist** is specific items with file:line refs (NOT a generic "review this"), `"review_instructions"`, `"preflight_path"`. Optional `"pr_number":` opts into the PreCompact self-heal (#209): if PR is MERGED, `/compact` treats handoff as implicit CERTIFIED.
139
- 3. **Run reviewer:** `codex exec -c 'model_reasoning_effort="xhigh"' -s danger-full-access -o .reviews/latest-review.md "<prompt>" < /dev/null`. Always `xhigh`. **Always append `< /dev/null`** codex blocks on stdin reads from non-interactive parents (background, hooks, CI, CC Bash tool); without the redirect it hangs at S/0% CPU indefinitely. CC sandbox blocks Codex's Rust binary (`SCDynamicStore`) use `dangerouslyDisableSandbox: true` on Bash; Codex has its own sandbox. xhigh runs take 1-5 min; for a heartbeat use `scripts/codex-review-with-progress.sh` (already redirects child stdin).
138
+ 2. **Mission-first handoff** (`.reviews/handoff.json`) — required keys: `"review_id"`, `"status": "PENDING_REVIEW"`, `"round": 1`, `"mission"`/`"success"`/`"failure"` (without them you get "looks good"), `"files_changed"`, `"verification_checklist"` (verification checklist with file:line refs NOT generic), `"review_instructions"`, `"preflight_path"`. Optional `"pr_number":` opts into PreCompact self-heal (#209: PR MERGED implicit CERTIFIED).
139
+ 3. **Run reviewer:** `codex exec -c 'model_reasoning_effort="xhigh"' -s danger-full-access -o .reviews/latest-review.md "<prompt>" < /dev/null`. Always `xhigh`. Bash tool requires `run_in_background: true` + `dangerouslyDisableSandbox: true`; append `< /dev/null` always. **Why:** `< /dev/null` prevents codex stdin-hang at S/0% CPU; `run_in_background: true` avoids the Bash 10-min (`600000` ms) `timeout` cap that force-kills foreground codex (multi-artifact bundles take 5–30 min). xhigh 1–30 min; wrapper's `STALL_SECONDS=1800` is the real control. Heartbeat: `scripts/codex-review-with-progress.sh`. Foreground burned 70 min on a 7-min review (#364).
140
140
  4. **Dialogue loop:** per-finding response (`{"finding": "1", "action": "FIXED|DISPUTED|ACCEPTED", "summary": "..."}` in `.reviews/response.json`). Bump round, set status `PENDING_RECHECK`, add `fixes_applied` (numbered, file:line). Recheck prompt: "TARGETED RECHECK. FIXED → verify certify condition. DISPUTED → ACCEPT if sound, REJECT with reasoning. ACCEPTED → verify applied. No new findings unless P0."
141
141
 
142
- **Convergence:** 2 rounds sweet spot, 3 max (research: 14 repos + 7 papers). After 3 still NOT CERTIFIED → escalate.
142
+ **Convergence:** 2 rounds sweet spot, 3 max. After 3 NOT CERTIFIED → escalate.
143
143
 
144
- **Multi-reviewer:** parallel reviewers respond per-reviewer (different blind spots, no shared anchoring). **Non-code domains:** same handoff + add `"audience"`/`"stakes"` keys.
144
+ **Enforcement:** `hooks/goal-confidence-check.sh` warns when `/goal` skips the 95%-confidence or DLC-binding gates (#360).
145
+
146
+ **Multi-reviewer:** respond to each reviewer independently (no shared anchoring). **Non-code domains:** add `"audience"`/`"stakes"` keys to handoff.
145
147
 
146
148
  ### Release Review Focus
147
149
 
@@ -247,8 +247,8 @@ The output is JSON: `{ tier: "simple" | "complex", score, signals }`. Use the re
247
247
  > How do you want to configure the model for this repo?
248
248
  >
249
249
  > - **[N] No pin (default, recommended for most repos):** Leaves auto-mode enabled. Claude Code picks the model per turn. Compaction follows upstream defaults. Simplest, lowest friction.
250
- > - **[m] Mixed-mode** *(suggested for **simple** tier — roadmap #233):* Pins `model: "sonnet[1m]"` for the coder (Sonnet 4.6 with 1M context). The cross-model review layer (Codex / external reviewer) **always stays at the flagship** (Opus 4.7 max or gpt-5.5 xhigh) regardless. Saves cost/quota on simple repos; reviewer catches what Sonnet misses. Requires comfort with losing per-turn auto-selection.
251
- > - **[f] Flagship full** *(suggested for **complex** / stakes-flagged tier):* Pins `model: "opus[1m]"` (Opus 4.7 with 1M context) and sets `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE=30`. Long SDLC sessions cross 100K tokens regularly; the 1M window gives headroom and 30% autocompact fires at ~300K. Requires Claude Code v2.1.111+.
250
+ > - **[m] Mixed-mode** *(suggested for **simple** tier — roadmap #233):* Pins `model: "sonnet[1m]"` for the coder (Sonnet 4.6 with 1M context). The cross-model review layer (Codex / external reviewer) **always stays at the flagship** (Opus 4.8 max or gpt-5.5 xhigh) regardless. Saves cost/quota on simple repos; reviewer catches what Sonnet misses. Requires comfort with losing per-turn auto-selection.
251
+ > - **[f] Flagship full** *(suggested for **complex** / stakes-flagged tier):* Pins `model: "opus[1m]"` (Opus 4.8 with 1M context) and sets `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE=30`. Long SDLC sessions cross 100K tokens regularly; the 1M window gives headroom and 30% autocompact fires at ~300K. Requires Claude Code v2.1.154+.
252
252
  >
253
253
  > `[N/m/f]`
254
254
 
@@ -93,9 +93,10 @@ Parse CHANGELOG entries between the user's installed version and latest. Present
93
93
 
94
94
  ```
95
95
  Installed: 1.42.0
96
- Latest: 1.77.0
96
+ Latest: 1.78.0
97
97
 
98
98
  What changed:
99
+ - [1.78.0] Opus 4.7 → 4.8 model recommendation (#365) + min CC v2.1.154+.
99
100
  - [1.77.0] release-dry-run.yml + cc-version-drift.yml (#350) + /goal SDLC gates (95% + DLC binding).
100
101
  - [1.76.0] /goal /sdlc wrapper (#347) + CC v2.1.150 feature adoption + ROADMAP demand-signal gate (4 excise, 4 kill).
101
102
  - [1.75.1] release-workflow fix — Node 22 → 24 (ships npm 11.x), dropped flaky `npm install -g` self-upgrade (hit MODULE_NOT_FOUND on v1.75.0 publish). Explicit npm-version guard.
@@ -104,7 +105,6 @@ What changed:
104
105
  - [1.73.0] precompact stale REBASE_HEAD fix + 15 stale artifact deletes (-460 LOC).
105
106
  - [1.72.0] #323 closed — customization-aware `check` recommendation + new `--preserve-customized` flag. `init --force --preserve-customized` skips CUSTOMIZED files (action `PRESERVE`), still OVERWRITEs MATCH and CREATEs MISSING. Default `init --force` unchanged. 10 tests.
106
107
  - [1.71.0–1.69.0] token-bloat sweep #236 — BASELINE + TDD CHECK fire once per `session_id` (-12K, -0.5-1.5K); sdlc-skill Cross-Model Review trimmed.
107
- - [1.68.0–1.65.0] roadmap hygiene — five paperwork closes: #97 Anthropic Policy NO-GO + AAR-paper validating parallel; #99 AutoGPT NO-GO; #95 Nous NO-GO; #243 token-history liveness verified; #210 Node-24 false-green; #235 Thoughtworks AI Evals NO-GO. **6/6 external-product audits NO-GO** (continues #76, #77). Research write-ups in `.reviews/research-*.md`.
108
108
  - [1.64.0] XDLC ecosystem cross-references — README, wizard doc, and ROADMAP now cross-reference all three sibling packages (`agentic-sdlc-wizard`, `codex-sdlc-wizard`, `claude-gdlc-wizard`). New "Ecosystem (Sibling Projects)" section in README. 3 new doc-consistency tests prevent drift.
109
109
  - [1.63.0] cache-cost observability closeout (#204 absorbed by #220) — token-spike test gains explicit cache-miss + negative-control coverage. "Cache-Cost Surprises" docs added (10-20× silent blowups from mid-session CLAUDE.md edits, idle pruning).
110
110
  - [1.62.0] roadmap hygiene + #211 backfill — closes paperwork-stale rows. Backfilled 5 corrupted `score-history.jsonl` rows from `max_score:10` → `:11` (UI scenarios). Codex strategic review confirmed scope.
@@ -170,7 +170,7 @@ Check user's `.claude/settings.json`:
170
170
  1. **`model: "opus[1m]"` AND `env.CLAUDE_AUTOCOMPACT_PCT_OVERRIDE: "30"`** — likely the old wizard-installed pair, not an intentional choice. Ask:
171
171
  > Your `.claude/settings.json` pins `model: "opus[1m]"` with `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE=30`. This pair was the wizard default in 1.31.0–1.33.x, but it disables Claude Code's auto-mode (issue #198).
172
172
  > - **Remove the pin** (recommended) — keeps auto-mode enabled
173
- > - **Keep the pin** — guaranteed Opus 4.7 + 1M, OK with no auto-selection
173
+ > - **Keep the pin** — guaranteed Opus 4.8 + 1M, OK with no auto-selection
174
174
  > Remove, keep, or decide later? `[r/k/l]`
175
175
 
176
176
  2. **Only one of the two fields matches** — treat as intentional customization. Do not prompt.