@tekyzinc/gsd-t 5.20.15 → 5.21.10

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/CHANGELOG.md CHANGED
@@ -2,6 +2,31 @@
2
2
 
3
3
  All notable changes to GSD-T are documented here. Updated with each release.
4
4
 
5
+ ## [5.21.10] - 2026-09-22
6
+
7
+ ### Changed — the top tier now points at Opus 5.5
8
+
9
+ The `opus` tier alias resolved to `claude-opus-5`. It now resolves to
10
+ `claude-opus-5-5`, so every high-stakes stage (solution-space probe, partition
11
+ probe, competition producers and judge, pre-mortem, Red Team, both debug cycles)
12
+ runs Opus 5.5. Only the concrete model id changed: the three-tier shape, the
13
+ stage-to-tier map, and the relaxed fresh-context judge-blindness invariant are
14
+ untouched.
15
+
16
+ - `bin/gsd-t-model-tier-policy.cjs`: `MODEL_IDS.opus` → `claude-opus-5-5`; the
17
+ thinking-omission predicate still matches no current tier model
18
+ - `.gsd-t/contracts/model-tier-policy-contract.md`: → v2.1.0, alias table and
19
+ Updated line; the v2.0.0 note kept under `## Previously`
20
+ - `templates/workflows/gsd-t-{phase,verify,debug}.workflow.js`,
21
+ `templates/prompts/blind-adversary-subagent.md`: model id in the stage comments
22
+ - `templates/CLAUDE-global.md`, `README.md`, `commands/gsd-t-{help,status}.md`:
23
+ the documented `opus` = model id
24
+ - `test/m85-model-tier-policy.test.js`, `test/m86-policy-profiles.test.js`,
25
+ `test/m90-tier-policy-lint.test.js`: expected id; the drifted-literal negative
26
+ test still fails on a mismatch
27
+
28
+ No migration. A project picks the new id on its next `gsd-t update-all`.
29
+
5
30
  ## [5.20.15] - 2026-09-21
6
31
 
7
32
  ### Changed — phases must be contiguous; the Team Mix title row is the phase name only
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # GSD-T: Contract-Driven Development for Claude Code
2
2
 
3
- **v5.20.15** - A methodology for reliable, parallelizable development using Claude Code with optional Agent Teams support.
3
+ **v5.21.10** - A methodology for reliable, parallelizable development using Claude Code with optional Agent Teams support.
4
4
 
5
5
  **Eliminates context rot** — task-level fresh dispatch (one subagent per task, ~10-20% context each) means compaction never triggers.
6
6
  **Compaction-proof debug loops** — `gsd-t headless --debug-loop` runs test-fix-retest cycles as separate `claude -p` sessions. A JSONL debug ledger persists all hypothesis/fix/learning history across fresh sessions. Anti-repetition preamble injection prevents retrying failed hypotheses. Escalation tiers (sonnet → opus → human) and a hard iteration ceiling enforced externally.
@@ -17,7 +17,7 @@
17
17
  **Real-Time Agent Dashboard** — `gsd-t-stream-feed-server.js` serves a streaming UI at `127.0.0.1:7842` that renders all workers' stream-json output as a continuous feed with task/wave banners, duration + usage chips, token corner bar, localStorage filters, and replay via `WS /feed?from=N`. Dashboard auto-starts idempotently on each spawn (`scripts/gsd-t-dashboard-autostart.cjs`). Port is project-scoped via `projectScopedDefaultPort(projectDir)` so multi-project workflows do not clobber each other.
18
18
  **Rigorous User-Journey Coverage + Anti-Drift Test Quality** — `bin/journey-coverage.cjs` regex listener detector + `gsd-t check-coverage` CLI + `scripts/hooks/pre-commit-journey-coverage` commit gate blocks viewer-source commits when uncovered listeners exist. Journey specs in `e2e/journeys/` use functional assertions (zero `toBeVisible`-only tests) per the E2E Test Quality Standard in CLAUDE.md.
19
19
  **Universal Playwright Bootstrap + Deterministic UI Enforcement (M50)** — three executable enforcement layers: (1) `bin/playwright-bootstrap.cjs` + `bin/ui-detection.cjs` - idempotent installer detects package manager, installs `@playwright/test` + chromium, scaffolds `e2e/`; (2) Workflow runtime runs `playwright-bootstrap.cjs::installPlaywright()` before any E2E stage when `hasUI && !hasPlaywright`; install failure halts with `blocked-needs-human`; (3) `scripts/hooks/pre-commit-playwright-gate` (opt-in via `gsd-t doctor --install-hooks`) blocks viewer-source commits when staged files are newer than `.gsd-t/.last-playwright-pass`. The `gsd-t setup-playwright [path]` subcommand handles manual install.
20
- **Surgical model selection** — models are assigned haiku/sonnet/opus per phase (**Fable removed 2026-07-24**; `opus` = **claude-opus-5**). **Single-source tier policy:** `bin/gsd-t-model-tier-policy.cjs` is the SINGLE source of truth; every high-stakes stage (solution-space probe, partition probe, competition judge, pre-mortem, Red Team, competition producers, debug both cycles) runs Opus 5. Opus 5 shipped at the same price as Opus 4.8 but >2× its coding score, so Fable's cost premium is no longer justified. The M82 judge-blindness invariant is relaxed to "fresh independent context" — producers and judge both run opus. Drift is mechanically enforced by the M71-family lint (`test/m85-workflow-tier-policy-lint.test.js`). **M86 model profiles:** `bin/gsd-t-model-profile.cjs` adds a per-project SECOND dimension — three named profiles (`standard` / `pro` / `premium`) that dial which stages run on Opus vs. Sonnet.
20
+ **Surgical model selection** — models are assigned haiku/sonnet/opus per phase (**Fable removed 2026-07-24**; `opus` = **claude-opus-5-5**). **Single-source tier policy:** `bin/gsd-t-model-tier-policy.cjs` is the SINGLE source of truth; every high-stakes stage (solution-space probe, partition probe, competition judge, pre-mortem, Red Team, competition producers, debug both cycles) runs Opus 5. Opus 5 shipped at the same price as Opus 4.8 but >2× its coding score, so Fable's cost premium is no longer justified. The M82 judge-blindness invariant is relaxed to "fresh independent context" — producers and judge both run opus. Drift is mechanically enforced by the M71-family lint (`test/m85-workflow-tier-policy-lint.test.js`). **M86 model profiles:** `bin/gsd-t-model-profile.cjs` adds a per-project SECOND dimension — three named profiles (`standard` / `pro` / `premium`) that dial which stages run on Opus vs. Sonnet.
21
21
  **Token Telemetry** — `gsd-t-calibration-hook.js` records token usage per spawn to `.gsd-t/token-metrics.jsonl` (18-field rows). `gsd-t-token-aggregator.js` aggregates across tasks for the `/gsd-t-metrics` view. Use the native Claude Code `/context` command for live in-session context percentage.
22
22
  **Quality North Star** — projects define a `## Quality North Star` section in CLAUDE.md (1–3 sentences, e.g., "This is a published npm library. Every public API must be intuitive and backward-compatible."). `gsd-t-init` auto-detects preset (library/web-app/cli) from package.json signals; `gsd-t-setup` configures it for existing projects. Subagents read it as a quality lens; absent = silent skip (backward compatible).
23
23
  **Design Brief Artifact** — during partition, UI/frontend projects (React, Vue, Svelte, Flutter, Tailwind) automatically get `.gsd-t/contracts/design-brief.md` with color palette, typography, spacing system, component patterns, and tone/voice. Non-UI projects skip silently. User-customized briefs are preserved. Referenced in plan phase for visual consistency.
@@ -18,16 +18,16 @@
18
18
  * Frozen map: tier alias → concrete model id.
19
19
  * Consumers MUST import from here — never re-hardcode these strings.
20
20
  *
21
- * THREE tiers (Fable removed 2026-07-24): `opus` is now `claude-opus-5` — the
21
+ * THREE tiers (Fable removed 2026-07-24): `opus` is now `claude-opus-5-5` — the
22
22
  * default top tier. Opus 5 shipped at the SAME price as Opus 4.8 ($5/$25 per M
23
23
  * tokens) but >2× its coding score and within 0.5% of Fable 5 at max effort, so
24
24
  * the Fable cost premium ($10/$50 — double Opus 5) is no longer justified. Every
25
- * stage formerly on `fable` OR `opus` (4.8) now runs `opus` = claude-opus-5.
25
+ * stage formerly on `fable` OR `opus` (4.8) now runs `opus` = claude-opus-5-5.
26
26
  *
27
27
  * @type {Readonly<{opus: string, sonnet: string, haiku: string}>}
28
28
  */
29
29
  const MODEL_IDS = Object.freeze({
30
- opus: 'claude-opus-5',
30
+ opus: 'claude-opus-5-5',
31
31
  sonnet: 'claude-sonnet-4-6',
32
32
  haiku: 'claude-haiku-4-5-20251001',
33
33
  });
@@ -38,7 +38,7 @@ const MODEL_IDS = Object.freeze({
38
38
 
39
39
  /**
40
40
  * Frozen map: stage key → tier alias.
41
- * Fable removed 2026-07-24: all 7 stages resolve to `opus` (= claude-opus-5).
41
+ * Fable removed 2026-07-24: all 7 stages resolve to `opus` (= claude-opus-5-5).
42
42
  * The M82 competition judge-blindness invariant is RELAXED from "different model"
43
43
  * to "fresh independent context" — producers AND judge both run Opus 5 (fresh
44
44
  * contexts remove memory-bias; the modest residual taste/blind-spot bias is
@@ -67,7 +67,7 @@ const STAGE_TIERS = Object.freeze({
67
67
  *
68
68
  * This predicate existed for `claude-fable-5`, which returned HTTP 400 when the
69
69
  * explicit thinking-disabled parameter was sent. Fable was removed 2026-07-24;
70
- * NO current tier model (opus=claude-opus-5, sonnet, haiku) is known to require
70
+ * NO current tier model (opus=claude-opus-5-5, sonnet, haiku) is known to require
71
71
  * omission — Opus 5 and Sonnet 5 default `effort:high` on the API and accept the
72
72
  * thinking params normally. Kept as a single-home predicate (callers still import
73
73
  * it) so a future model that needs omission is added HERE, never re-hardcoded.
@@ -116,7 +116,7 @@ function resolve(stageKey) {
116
116
  * standard — cost-leanest: the high-stakes reasoning stages run sonnet,
117
117
  * only the probes stay opus.
118
118
  * pro — mid: red-team + pre-mortem + debug-cycle-2 → opus; the rest sonnet.
119
- * premium — full opus posture: all 6 designated stages → opus (= claude-opus-5).
119
+ * premium — full opus posture: all 6 designated stages → opus (= claude-opus-5-5).
120
120
  *
121
121
  * competition-producers is held at opus in ALL profiles (always opus-5). The
122
122
  * former judge≠producers blindness clamp is REMOVED — the invariant is now
@@ -161,8 +161,8 @@ const INJECTABLE_STAGES = Object.freeze([
161
161
  'debug-cycle-2',
162
162
  ]);
163
163
 
164
- /** The HELD producers model id (always opus = claude-opus-5). */
165
- const PRODUCERS_MODEL_ID = MODEL_IDS.opus; // claude-opus-5
164
+ /** The HELD producers model id (always opus = claude-opus-5-5). */
165
+ const PRODUCERS_MODEL_ID = MODEL_IDS.opus; // claude-opus-5-5
166
166
 
167
167
  /**
168
168
  * Resolves the concrete model id for a given stage key under a profile,
@@ -536,7 +536,7 @@ Use these when user asks for help on a specific command:
536
536
  - **Contract**: `.gsd-t/contracts/plan-hardening-contract.md` v1.0.0 STABLE.
537
537
 
538
538
  ### model-tier-policy (M85)
539
- - **Summary**: SINGLE source of truth for GSD-T model-tier assignments. Publishes the authoritative tier set (haiku/sonnet/opus — **Fable removed 2026-07-24**; `opus` = claude-opus-5) and the 7 designated stage→tier mappings (all → opus). Opus 5 shipped at the same price as Opus 4.8 but >2× its coding score, so every stage formerly on Fable OR Opus 4.8 now runs Opus 5. The M82 competition judge-blindness invariant is RELAXED to "fresh independent context" — producers AND judge both run opus. A M71-family lint (`test/m85-workflow-tier-policy-lint.test.js`) proves every workflow `model:` literal matches the policy — a drifted literal FAILS the lint (mandatory negative test).
539
+ - **Summary**: SINGLE source of truth for GSD-T model-tier assignments. Publishes the authoritative tier set (haiku/sonnet/opus — **Fable removed 2026-07-24**; `opus` = claude-opus-5-5) and the 7 designated stage→tier mappings (all → opus). Opus 5 shipped at the same price as Opus 4.8 but >2× its coding score, so every stage formerly on Fable OR Opus 4.8 now runs Opus 5. The M82 competition judge-blindness invariant is RELAXED to "fresh independent context" — producers AND judge both run opus. A M71-family lint (`test/m85-workflow-tier-policy-lint.test.js`) proves every workflow `model:` literal matches the policy — a drifted literal FAILS the lint (mandatory negative test).
540
540
  - **Files**: `bin/gsd-t-model-tier-policy.cjs` (zero external deps — installer invariant).
541
541
  - **Use when**: Any phase that needs to resolve a concrete model id from a stage key at invoke time (M69 pattern). Workflows NEVER `require` this module (sandbox ban) — they use hard-coded tier alias literals the lint proves match the policy.
542
542
  - **CLI**: `gsd-t model-tier-policy resolve <stageKey> [--json]`. Emits `{ok, stageKey, tier, model, requiresThinkingOmitted}`. Exit 0 resolved · 1 unknown stage key.
@@ -88,7 +88,7 @@ The **Model Profile** line MUST always name the active profile — never blank,
88
88
  - If the file is absent, display the global default by name with the `(default)` marker: `Model Profile: premium (default)`.
89
89
  - If the file is present but malformed or contains an unknown profile, display: `Model Profile: premium (default, config-error)` — never silently promote to the most expensive posture.
90
90
 
91
- Profiles control which workflow stages run on Opus vs. Sonnet (Fable removed 2026-07-24 — `opus` = claude-opus-5):
91
+ Profiles control which workflow stages run on Opus vs. Sonnet (Fable removed 2026-07-24 — `opus` = claude-opus-5-5):
92
92
  - `standard` — probes opus; high-stakes stages (judge/pre-mortem/red-team/debug-cycle-2) sonnet (cost-leanest)
93
93
  - `pro` — probes + pre-mortem + red-team + debug-cycle-2 opus; judge sonnet
94
94
  - `premium` — all 6 designated stages opus (full posture, global default)
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tekyzinc/gsd-t",
3
- "version": "5.20.15",
4
- "description": "GSD-T: Contract-Driven Development for Claude Code — 54 slash commands with headless-by-default workflow spawning, unattended supervisor relay with event stream, graph-powered code analysis, real-time agent dashboard, task telemetry, doc-ripple enforcement, backlog management, impact analysis, test sync, milestone archival, and PRD generation",
3
+ "version": "5.21.10",
4
+ "description": "GSD-T: Contract-Driven Development for Claude Code \u2014 54 slash commands with headless-by-default workflow spawning, unattended supervisor relay with event stream, graph-powered code analysis, real-time agent dashboard, task telemetry, doc-ripple enforcement, backlog management, impact analysis, test sync, milestone archival, and PRD generation",
5
5
  "author": "Tekyz, Inc.",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -263,7 +263,7 @@ Every GSD-T project gets TWO logging streams scaffolded by default at `gsd-t-ini
263
263
  Every code-producing phase ends with `gsd-t-verify.workflow.js`, which runs three orthogonal validators as `parallel()` `agent()` stages with schema-validated output. Per `.gsd-t/contracts/orthogonal-validation-contract.md` v1.0.0 STABLE, they are declared orthogonal objective functions — no collapse, no substitution, no transitive trust.
264
264
 
265
265
  - **`/code-review ultra`** — cooperative correctness + cleanup. Severity: `important` / `nit` / `pre-existing`. Skippable via `args.skipUltra=true` + `args.skipUltraReason`. `skipUltra=true` is INELIGIBLE for `VERIFIED`.
266
- - **Red Team** — adversarial / security / boundaries. Non-skippable. Protocol: `templates/prompts/red-team-subagent.md`. Verdict: `FAIL` (any CRITICAL or HIGH bug — blocks completion) or `GRUDGING-PASS` (exhaustive search, nothing found). CRITICAL/HIGH bugs get up to 2 fix cycles before deferral. Runs on `model: "opus"` (= claude-opus-5; Fable removed 2026-07-24).
266
+ - **Red Team** — adversarial / security / boundaries. Non-skippable. Protocol: `templates/prompts/red-team-subagent.md`. Verdict: `FAIL` (any CRITICAL or HIGH bug — blocks completion) or `GRUDGING-PASS` (exhaustive search, nothing found). CRITICAL/HIGH bugs get up to 2 fix cycles before deferral. Runs on `model: "opus"` (= claude-opus-5-5; Fable removed 2026-07-24).
267
267
  - **QA** — test execution + shallow-test detection + contract compliance. Non-skippable. Protocol: `templates/prompts/qa-subagent.md`. Writes ZERO feature code. Any shallow E2E test blocks phase completion. Runs on `model: "sonnet"`.
268
268
 
269
269
  When `.gsd-t/contracts/design-contract.md` or `.gsd-t/contracts/design/` exists, a fourth stage runs Design Verification (protocol: `templates/prompts/design-verify-subagent.md`) — opens a browser, compares the build against the design, returns a structured element-by-element MATCH/DEVIATION schema. Deviations block completion.
@@ -272,13 +272,13 @@ Synthesis stage merges results without category collapse. Verdict: `VERIFIED` /
272
272
 
273
273
  ## Model Display (MANDATORY)
274
274
 
275
- **Each Workflow `agent()` call declares its model explicitly** via the `model:` option (`"haiku"` / `"sonnet"` / `"opus"` — **Fable removed 2026-07-24**; `opus` = claude-opus-5). The Workflow runtime emits a `⚙ [{model}] {label}` line per stage in `/workflows`, giving the user real-time visibility into which model handles each operation.
275
+ **Each Workflow `agent()` call declares its model explicitly** via the `model:` option (`"haiku"` / `"sonnet"` / `"opus"` — **Fable removed 2026-07-24**; `opus` = claude-opus-5-5). The Workflow runtime emits a `⚙ [{model}] {label}` line per stage in `/workflows`, giving the user real-time visibility into which model handles each operation.
276
276
 
277
277
  **Model assignments:**
278
278
  - `model: "haiku"` — strictly mechanical tasks: run test suites and report counts, check file existence, validate JSON structure, branch guard checks
279
279
  - `model: "sonnet"` — mid-tier reasoning: routine code changes, standard refactors, test writing, QA evaluation, straightforward synthesis
280
280
  - `model: "opus"` — high-stakes reasoning: architecture decisions, security analysis, complex debugging, cross-module refactors, quality judgment on critical paths
281
- - **Fable removed 2026-07-24** — `opus` (= claude-opus-5) is the top tier and the default for every high-stakes stage: solution-space probe, partition probe, competition judge, pre-mortem, Red Team, competition producers, debug both cycles. Opus 5 shipped at the same price as Opus 4.8 but >2× its coding score, so every stage formerly on Fable OR Opus 4.8 now runs Opus 5. The M82 competition judge-blindness invariant is RELAXED to "fresh independent context" — producers AND judge both run `opus` (fresh contexts remove memory-bias; the modest residual taste/blind-spot bias is accepted for a stronger judge). **Single source of truth for tier assignments:** `bin/gsd-t-model-tier-policy.cjs` + `.gsd-t/contracts/model-tier-policy-contract.md`. The M71-family lint (`test/m85-workflow-tier-policy-lint.test.js`) proves every workflow `model:` literal matches the policy and a drifted literal FAILS the lint (mandatory negative test).
281
+ - **Fable removed 2026-07-24** — `opus` (= claude-opus-5-5) is the top tier and the default for every high-stakes stage: solution-space probe, partition probe, competition judge, pre-mortem, Red Team, competition producers, debug both cycles. Opus 5 shipped at the same price as Opus 4.8 but >2× its coding score, so every stage formerly on Fable OR Opus 4.8 now runs Opus 5. The M82 competition judge-blindness invariant is RELAXED to "fresh independent context" — producers AND judge both run `opus` (fresh contexts remove memory-bias; the modest residual taste/blind-spot bias is accepted for a stronger judge). **Single source of truth for tier assignments:** `bin/gsd-t-model-tier-policy.cjs` + `.gsd-t/contracts/model-tier-policy-contract.md`. The M71-family lint (`test/m85-workflow-tier-policy-lint.test.js`) proves every workflow `model:` literal matches the policy and a drifted literal FAILS the lint (mandatory negative test).
282
282
 
283
283
  **Context budget:** Workflow scripts receive a `budget` global (`budget.total`, `budget.spent()`, `budget.remaining()`) tied to the user's per-turn token target. Use it for dynamic loops (`while (budget.total && budget.remaining() > 50_000) { ... }`) or to scale fleet size. Opus 4.7/4.8 ship 1M context windows; the legacy meter at `bin/token-budget.cjs` was retired in M61 — use native `/context` for live in-session usage.
284
284
 
@@ -4,7 +4,7 @@
4
4
  **Report concisely:** verdict/answer first, no preamble. Gloss every code/jargon term (e.g. `M93-D2` = milestone 93, domain 2) in plain words on first use. Bullets over paragraphs. Expand only if asked.
5
5
  <!-- /reader-contract -->
6
6
 
7
- **Model:** `opus` (= claude-opus-5; Fable removed 2026-07-24 — highest-leverage judgment; separate context from the proposing agent)
7
+ **Model:** `opus` (= claude-opus-5-5; Fable removed 2026-07-24 — highest-leverage judgment; separate context from the proposing agent)
8
8
 
9
9
  **Framing:** You are reviewing someone ELSE's architectural design — you did NOT propose it and have no attachment to it. Your goal is to find the **fatal flaw** in the premise being challenged, before a single line of code is committed to that premise. This framing (independent reviewer, not the author) is essential for escaping self-preference bias: the proposing agent's prior context makes it systematically less able to see its own premise's failures (source: https://arxiv.org/abs/2310.08118 — LLM self-evaluation is biased toward confirming prior outputs; https://arxiv.org/abs/2404.13076 — blind adversarial framing surfaces failures that self-critique misses).
10
10
 
@@ -57,7 +57,7 @@ const _args = (typeof args === "string") ? (() => { try { return JSON.parse(args
57
57
  // Default to {} so the premium fallback literals apply when no invoker injects overrides.
58
58
  // overrides values are CONCRETE model ids (resolver envelope); the bare literals below
59
59
  // are tier ALIASES. The sandbox runtime accepts BOTH forms in model: — proven live for
60
- // the tier alias resolves to claude-opus-5 (Fable removed 2026-07-24).
60
+ // the tier alias resolves to claude-opus-5-5 (Fable removed 2026-07-24).
61
61
  const overrides = (_args.overrides && typeof _args.overrides === "object") ? _args.overrides : {};
62
62
  const _CLI_ENVELOPE_SCHEMA = {
63
63
  type: "object", required: ["ok", "exitCode"], additionalProperties: true,
@@ -83,7 +83,7 @@ const _args = (typeof args === "string") ? (() => { try { return JSON.parse(args
83
83
  // (preserves byte-identical M85 behavior for callers that have not been updated yet).
84
84
  // overrides values are CONCRETE model ids (resolver envelope); the bare literals below
85
85
  // are tier ALIASES. The sandbox runtime accepts BOTH forms in model: — proven live for
86
- // the tier alias resolves to claude-opus-5 (Fable removed 2026-07-24).
86
+ // the tier alias resolves to claude-opus-5-5 (Fable removed 2026-07-24).
87
87
  const overrides = (_args.overrides && typeof _args.overrides === "object") ? _args.overrides : {};
88
88
  // `envelope` is typed as an OBJECT (or null), not "any".
89
89
  //
@@ -57,7 +57,7 @@ const _args = (typeof args === "string") ? (() => { try { return JSON.parse(args
57
57
  // Default to {} so the premium fallback literals apply when no invoker injects overrides.
58
58
  // overrides values are CONCRETE model ids (resolver envelope); the bare literals below
59
59
  // are tier ALIASES. The sandbox runtime accepts BOTH forms in model: — proven live for
60
- // the tier alias resolves to claude-opus-5 (Fable removed 2026-07-24).
60
+ // the tier alias resolves to claude-opus-5-5 (Fable removed 2026-07-24).
61
61
  const overrides = (_args.overrides && typeof _args.overrides === "object") ? _args.overrides : {};
62
62
  const _CLI_ENVELOPE_SCHEMA = {
63
63
  type: "object", required: ["ok", "exitCode"], additionalProperties: true,