ralphctl 0.16.0 → 0.17.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.
package/README.md CHANGED
@@ -433,7 +433,7 @@ Run `ralphctl <command> --help` for flag-level detail.
433
433
 
434
434
  **Further reading:**
435
435
  [AI Agent Harnesses: A Field Guide](https://lukasgrigis.dev/blog/guides/agent-harnesses/) — Lukas Grigis
436
- | [Harness Engineering for Coding Agent Users](https://martinfowler.com/articles/harness-engineering.html) — Martin Fowler (April 2026)
436
+ | [Harness Engineering for Coding Agent Users](https://martinfowler.com/articles/harness-engineering.html) — Birgitta Böckeler, martinfowler.com (April 2026)
437
437
  | [Harness Design for Long-Running Application Development](https://www.anthropic.com/engineering/harness-design-long-running-apps) — Anthropic Engineering
438
438
 
439
439
  ---
@@ -624,6 +624,7 @@ var CLAUDE_MODELS = [
624
624
  "claude-sonnet-5",
625
625
  "claude-opus-4-8",
626
626
  "claude-opus-4-8[1m]",
627
+ "claude-opus-5",
627
628
  "claude-fable-5",
628
629
  "claude-fable-5[1m]"
629
630
  ];
@@ -631,12 +632,12 @@ var isClaudeModel = (s) => CLAUDE_MODELS.includes(s);
631
632
 
632
633
  // src/domain/value/settings-models/codex.ts
633
634
  var CODEX_MODELS = [
635
+ "gpt-5.6-sol",
636
+ "gpt-5.6-terra",
637
+ "gpt-5.6-luna",
634
638
  "gpt-5.5",
635
639
  "gpt-5.4",
636
640
  "gpt-5.4-mini",
637
- "gpt-5.3-codex-spark",
638
- "gpt-5.3-codex",
639
- "gpt-5.2",
640
641
  "codex-auto-review"
641
642
  ];
642
643
  var isCodexModel = (s) => CODEX_MODELS.includes(s);
@@ -650,13 +651,17 @@ var COPILOT_MODELS = [
650
651
  "gpt-5.4-mini",
651
652
  "gpt-5.4-nano",
652
653
  "gpt-5.5",
654
+ "gpt-5.6-sol",
655
+ "gpt-5.6-terra",
656
+ "gpt-5.6-luna",
653
657
  // Anthropic
654
658
  "claude-haiku-4.5",
655
659
  "claude-opus-4.5",
656
660
  "claude-opus-4.6",
657
- "claude-opus-4.6-fast",
658
661
  "claude-opus-4.7",
659
662
  "claude-opus-4.8",
663
+ "claude-opus-4.8-fast",
664
+ "claude-opus-5",
660
665
  "claude-fable-5",
661
666
  "claude-sonnet-4.5",
662
667
  "claude-sonnet-4.6",
@@ -666,8 +671,11 @@ var COPILOT_MODELS = [
666
671
  "gemini-3-flash",
667
672
  "gemini-3.1-pro-preview",
668
673
  "gemini-3.5-flash",
674
+ "gemini-3.6-flash",
669
675
  // Microsoft
670
676
  "mai-code-1-flash",
677
+ // Moonshot
678
+ "kimi-k2.7-code",
671
679
  // Fine-tuned
672
680
  "raptor-mini-preview"
673
681
  ];
@@ -680,14 +688,16 @@ var FLOW_IDS = ["refine", "plan", "implement", "readiness", "ideate", "createPr"
680
688
  var CURRENT_SCHEMA_VERSION = 2;
681
689
  var LogLevelSchema = z.enum(["silent", "debug", "info", "warn", "error"]);
682
690
  var PROVIDER_CLAUDE_CODE = "claude-code";
691
+ var PROVIDER_GITHUB_COPILOT = "github-copilot";
692
+ var PROVIDER_OPENAI_CODEX = "openai-codex";
683
693
  var AiProviderSchema = z.enum([
684
694
  PROVIDER_CLAUDE_CODE,
685
- "github-copilot",
686
- "openai-codex"
695
+ PROVIDER_GITHUB_COPILOT,
696
+ PROVIDER_OPENAI_CODEX
687
697
  ]);
688
698
  var ClaudeEffortSchema = z.enum(["low", "medium", "high", "xhigh", "max"]);
689
699
  var CopilotEffortSchema = z.enum(["none", "low", "medium", "high", "xhigh", "max"]);
690
- var CodexEffortSchema = z.enum(["minimal", "low", "medium", "high"]);
700
+ var CodexEffortSchema = z.enum(["low", "medium", "high", "xhigh", "max", "ultra"]);
691
701
  var GlobalEffortSchema = z.enum(["low", "medium", "high", "xhigh", "max"]);
692
702
  var CustomModelStringSchema = z.string().trim().min(1, "model id must be a non-empty trimmed string");
693
703
  var ClaudeModelSchema = z.union([z.enum(CLAUDE_MODELS), CustomModelStringSchema]);
@@ -699,12 +709,12 @@ var ClaudeFlowRowSchema = z.object({
699
709
  effort: ClaudeEffortSchema.optional()
700
710
  });
701
711
  var CopilotFlowRowSchema = z.object({
702
- provider: z.literal("github-copilot"),
712
+ provider: z.literal(PROVIDER_GITHUB_COPILOT),
703
713
  model: CopilotModelSchema,
704
714
  effort: CopilotEffortSchema.optional()
705
715
  });
706
716
  var CodexFlowRowSchema = z.object({
707
- provider: z.literal("openai-codex"),
717
+ provider: z.literal(PROVIDER_OPENAI_CODEX),
708
718
  model: CodexModelSchema,
709
719
  effort: CodexEffortSchema.optional()
710
720
  });
@@ -739,35 +749,43 @@ var seedLegacyCreatePrRow = (ai) => {
739
749
  if (!("provider" in refine)) return ai;
740
750
  return { ...aiObj, createPr: { ...refine } };
741
751
  };
742
- var RETIRED_CLAUDE_OPUS = "claude-opus-4-7";
743
- var SUCCESSOR_CLAUDE_OPUS = "claude-opus-4-8";
744
- var migrateRetiredOpusRow = (row) => {
752
+ var RETIRED_MODEL_REMAPS = [
753
+ { provider: PROVIDER_CLAUDE_CODE, from: "claude-opus-4-7", to: "claude-opus-4-8" },
754
+ { provider: PROVIDER_GITHUB_COPILOT, from: "claude-opus-4.6-fast", to: "claude-opus-4.8-fast" },
755
+ { provider: PROVIDER_OPENAI_CODEX, from: "gpt-5.2", to: "gpt-5.5" },
756
+ { provider: PROVIDER_OPENAI_CODEX, from: "gpt-5.3-codex", to: "gpt-5.5" },
757
+ { provider: PROVIDER_OPENAI_CODEX, from: "gpt-5.3-codex-spark", to: "gpt-5.5" }
758
+ ];
759
+ var RETIRED_CODEX_EFFORT = "minimal";
760
+ var migrateStaleRow = (row) => {
745
761
  if (typeof row !== "object" || row === null) return row;
746
- const rowObj = row;
747
- if (rowObj["provider"] === PROVIDER_CLAUDE_CODE && rowObj["model"] === RETIRED_CLAUDE_OPUS) {
748
- return { ...rowObj, model: SUCCESSOR_CLAUDE_OPUS };
762
+ let next = row;
763
+ const remap = RETIRED_MODEL_REMAPS.find((r) => next["provider"] === r.provider && next["model"] === r.from);
764
+ if (remap !== void 0) next = { ...next, model: remap.to };
765
+ if (next["provider"] === PROVIDER_OPENAI_CODEX && next["effort"] === RETIRED_CODEX_EFFORT) {
766
+ next = { ...next, effort: "low" };
749
767
  }
750
- return row;
768
+ return next;
751
769
  };
752
- var migrateRetiredClaudeOpus = (ai) => {
770
+ var migrateStaleAiRows = (ai) => {
753
771
  if (typeof ai !== "object" || ai === null) return ai;
754
772
  const aiObj = ai;
755
773
  const next = { ...aiObj };
756
774
  for (const flow of ["refine", "plan", "readiness", "ideate", "createPr"]) {
757
- if (flow in next) next[flow] = migrateRetiredOpusRow(next[flow]);
775
+ if (flow in next) next[flow] = migrateStaleRow(next[flow]);
758
776
  }
759
777
  const implement = next["implement"];
760
778
  if (typeof implement === "object" && implement !== null) {
761
779
  const implObj = implement;
762
780
  next["implement"] = {
763
781
  ...implObj,
764
- generator: migrateRetiredOpusRow(implObj["generator"]),
765
- evaluator: migrateRetiredOpusRow(implObj["evaluator"])
782
+ generator: migrateStaleRow(implObj["generator"]),
783
+ evaluator: migrateStaleRow(implObj["evaluator"])
766
784
  };
767
785
  }
768
786
  return next;
769
787
  };
770
- var promoteLegacyAiRows = (ai) => migrateRetiredClaudeOpus(seedLegacyCreatePrRow(promoteLegacyImplementRow(ai)));
788
+ var promoteLegacyAiRows = (ai) => migrateStaleAiRows(seedLegacyCreatePrRow(promoteLegacyImplementRow(ai)));
771
789
  var healHarnessCrossKnobs = (harness) => {
772
790
  if (typeof harness !== "object" || harness === null) return harness;
773
791
  const h = harness;
@@ -993,9 +1011,10 @@ var uniqueProvidersFromAi = (ai) => {
993
1011
 
994
1012
  // src/business/settings/defaults.ts
995
1013
  var CLAUDE_SONNET = "claude-sonnet-5";
996
- var CLAUDE_OPUS = "claude-opus-4-8";
1014
+ var CLAUDE_OPUS = "claude-opus-5";
997
1015
  var GPT_5_MINI = "gpt-5-mini";
998
1016
  var GPT_5_4_MINI = "gpt-5.4-mini";
1017
+ var GPT_5_6_SOL = "gpt-5.6-sol";
999
1018
  var DEFAULT_MODELS_BY_PROVIDER = {
1000
1019
  "claude-code": {
1001
1020
  refine: CLAUDE_SONNET,
@@ -1017,13 +1036,12 @@ var DEFAULT_MODELS_BY_PROVIDER = {
1017
1036
  },
1018
1037
  "openai-codex": {
1019
1038
  refine: GPT_5_4_MINI,
1020
- plan: "gpt-5.5",
1021
- // `gpt-5.3-codex` is deprecated for ChatGPT sign-in — the "reset implement to Codex" path
1022
- // rides the frontier default `gpt-5.5` instead, matching the CODEX_ONLY preset decision so
1023
- // the everyday autonomous loop works under ChatGPT auth and sits at the top of the ladder.
1024
- implement: "gpt-5.5",
1039
+ plan: GPT_5_6_SOL,
1040
+ // `gpt-5.6-sol` is the codex flagship (codex CLI ≥ 0.145); it tops the Codex escalation
1041
+ // ladder, so the reset-to-codex implement default and the ladder top stay aligned.
1042
+ implement: GPT_5_6_SOL,
1025
1043
  readiness: GPT_5_4_MINI,
1026
- ideate: "gpt-5.5",
1044
+ ideate: GPT_5_6_SOL,
1027
1045
  createPr: GPT_5_4_MINI
1028
1046
  }
1029
1047
  };
@@ -1045,7 +1063,7 @@ var DEFAULT_SETTINGS = {
1045
1063
  ...defaultAiSettingsForProvider("claude-code"),
1046
1064
  implement: {
1047
1065
  generator: { provider: "claude-code", model: CLAUDE_OPUS },
1048
- evaluator: { provider: "openai-codex", model: "gpt-5.5" }
1066
+ evaluator: { provider: "openai-codex", model: GPT_5_6_SOL }
1049
1067
  }
1050
1068
  },
1051
1069
  harness: {
@@ -3038,10 +3056,10 @@ var resolveWritableRoots = (session) => {
3038
3056
  };
3039
3057
 
3040
3058
  // src/domain/value/settings-models/suspended-models.ts
3041
- var SUSPENDED_MODELS = ["claude-fable-5", "claude-fable-5[1m]"];
3059
+ var SUSPENDED_MODELS = [];
3042
3060
  var isSuspendedModel = (s) => SUSPENDED_MODELS.includes(s);
3043
3061
  var SUSPENSION_NOTE = "suspended";
3044
- var suspendedModelMessage = (model) => `'${model}' is temporarily suspended by Anthropic (2026-06-12 export-control directive on Fable 5 / Mythos 5) \u2014 pick another model until access is restored`;
3062
+ var suspendedModelMessage = (model) => `'${model}' is temporarily suspended by its provider \u2014 pick another model until access is restored`;
3045
3063
 
3046
3064
  // src/integration/ai/providers/_engine/bounded-tail.ts
3047
3065
  var STDERR_TAIL_CAP = 16384;
@@ -3494,6 +3512,8 @@ var CONTEXT_WINDOW = {
3494
3512
  // Sonnet 5 always runs at its native 1M window on the Anthropic API — no `[1m]` selector, so
3495
3513
  // the bare id carries the 1M figure directly.
3496
3514
  "claude-sonnet-5": 1e6,
3515
+ // Opus 5 — natively 1M in Claude Code — no `[1m]` selector; the bare id carries the figure.
3516
+ "claude-opus-5": 1e6,
3497
3517
  // `[1m]` is Claude Code's 1M-token long-context selector — the window IS the id suffix.
3498
3518
  "claude-opus-4-8[1m]": 1e6,
3499
3519
  "claude-fable-5[1m]": 1e6
@@ -6004,7 +6024,7 @@ var createNpmVersionChecker = (deps) => {
6004
6024
  // package.json
6005
6025
  var package_default = {
6006
6026
  name: "ralphctl",
6007
- version: "0.16.0",
6027
+ version: "0.17.0",
6008
6028
  description: "Agent harness for long-running AI coding tasks \u2014 orchestrates Claude Code, GitHub Copilot, and OpenAI Codex across repositories",
6009
6029
  homepage: "https://github.com/lukas-grigis/ralphctl",
6010
6030
  type: "module",
@@ -6120,18 +6140,25 @@ var CLI_METADATA = {
6120
6140
 
6121
6141
  // src/business/task/escalation-map.ts
6122
6142
  var DEFAULT_ESCALATION_MAP = {
6123
- // Claude (Claude-Code / Codex dash-form) — Haiku → Sonnet 5 → Opus; Sonnet 4.6 still climbs.
6143
+ // Claude (Claude-Code dash-form) — Haiku → Sonnet 5 → Opus 5; legacy tiers chain through their
6144
+ // own generation (Sonnet 4.6 → Opus 4.8 → Opus 5) and converge at the flagship.
6124
6145
  "claude-haiku-4-5": "claude-sonnet-5",
6125
- "claude-sonnet-5": "claude-opus-4-8",
6146
+ "claude-sonnet-5": "claude-opus-5",
6126
6147
  "claude-sonnet-4-6": "claude-opus-4-8",
6127
- // Claude (Copilot dot-form) — Haiku → Sonnet 4.6 → Opus (Sonnet 5 shares the dash-form key above).
6148
+ "claude-opus-4-8": "claude-opus-5",
6149
+ // Claude (Copilot dot-form) — Haiku → Sonnet 4.6 → Opus 4.8. Opus 4.8 is deliberately the
6150
+ // dot-form top: claude-opus-5 is plan-gated on Copilot, so the default ladder never steers a
6151
+ // mid-task spawn into a model many accounts cannot use (add a rung via escalationMap to opt in).
6128
6152
  "claude-haiku-4.5": "claude-sonnet-4.6",
6129
6153
  "claude-sonnet-4.6": "claude-opus-4.8",
6130
- // Copilot/Codex GPT — mini variants step up to their full-tier frontier, and the
6131
- // economic full tier (`gpt-5.4`) climbs to the flagship.
6154
+ // Copilot/Codex GPT — minis step to the 5.5 full tier; the 5.5/5.4 generation chains into the
6155
+ // 5.6 family; within 5.6, luna → terra → sol (sol is the flagship top rung).
6132
6156
  "gpt-5-mini": "gpt-5.5",
6133
6157
  "gpt-5.4-mini": "gpt-5.5",
6134
- "gpt-5.4": "gpt-5.5"
6158
+ "gpt-5.4": "gpt-5.5",
6159
+ "gpt-5.5": "gpt-5.6-sol",
6160
+ "gpt-5.6-luna": "gpt-5.6-terra",
6161
+ "gpt-5.6-terra": "gpt-5.6-sol"
6135
6162
  };
6136
6163
  var mergeEscalationMap = (user) => ({
6137
6164
  ...DEFAULT_ESCALATION_MAP,
@@ -6155,7 +6182,9 @@ var escalationLadderCyclicFrom = (map, start) => {
6155
6182
  return false;
6156
6183
  };
6157
6184
  var EFFORT_ESCALATION_TARGET = "high";
6185
+ var CODEX_EFFORT_ESCALATION_TARGET = "xhigh";
6158
6186
  var EFFORT_AT_OR_ABOVE_TARGET = /* @__PURE__ */ new Set(["high", "xhigh", "max"]);
6187
+ var CODEX_EFFORT_AT_OR_ABOVE_TARGET = /* @__PURE__ */ new Set(["xhigh", "max", "ultra"]);
6159
6188
  var EFFORT_CAPABLE_PROVIDERS = /* @__PURE__ */ new Set([
6160
6189
  "claude-code",
6161
6190
  "github-copilot",
@@ -6179,8 +6208,12 @@ var claudeEffortRung = (model, currentEffort) => {
6179
6208
  var nextEffortRung = (provider, model, currentEffort) => {
6180
6209
  if (provider === void 0 || !EFFORT_CAPABLE_PROVIDERS.has(provider)) return void 0;
6181
6210
  if (provider === "claude-code") return claudeEffortRung(model, currentEffort);
6182
- if (currentEffort !== void 0 && EFFORT_AT_OR_ABOVE_TARGET.has(currentEffort)) return void 0;
6183
- return EFFORT_ESCALATION_TARGET;
6211
+ if (provider === "github-copilot") {
6212
+ if (currentEffort !== void 0 && EFFORT_AT_OR_ABOVE_TARGET.has(currentEffort)) return void 0;
6213
+ return EFFORT_ESCALATION_TARGET;
6214
+ }
6215
+ if (currentEffort !== void 0 && CODEX_EFFORT_AT_OR_ABOVE_TARGET.has(currentEffort)) return void 0;
6216
+ return CODEX_EFFORT_ESCALATION_TARGET;
6184
6217
  };
6185
6218
 
6186
6219
  // src/integration/ai/skills/_engine/filesystem-skills-adapter.ts
@@ -13978,7 +14011,7 @@ var resolveEffortForRow = (row, globalEffort) => {
13978
14011
  return _floorForProvider(globalEffort, row.provider);
13979
14012
  };
13980
14013
  var clampEffortToProvider = (effort, provider) => {
13981
- if (provider === "openai-codex" && (effort === "xhigh" || effort === "max")) return "high";
14014
+ if (provider === "openai-codex" && effort === "max") return "xhigh";
13982
14015
  return effort;
13983
14016
  };
13984
14017
  var _floorForProvider = (effort, provider) => clampEffortToProvider(effort, provider);
@@ -16420,7 +16453,12 @@ var renderPlateauDirectiveSection = (plateauBreak) => {
16420
16453
  "Step back and rethink. Re-read the task contract and the prior critique, question the assumption",
16421
16454
  "that led the earlier attempts astray, and implement a **fundamentally different** solution \u2014 a",
16422
16455
  "different design, data flow, or code path. Then verify the failing criteria directly before",
16423
- "signalling completion."
16456
+ "signalling completion.",
16457
+ "",
16458
+ "Before you choose that different approach, name which failure mode you were stuck in \u2014",
16459
+ "re-exploring code you already understood, looping on the same failing edit, over-polishing",
16460
+ "criteria that already pass, or fixing the wrong",
16461
+ 'location entirely \u2014 then change that specific behaviour, not just "try something different."'
16424
16462
  ].join("\n");
16425
16463
  };
16426
16464
 
@@ -18501,7 +18539,7 @@ var composeCriteriaHistory = (input) => {
18501
18539
  var requireNonEmpty = (field, message) => (v) => v.trim().length === 0 ? Result.error(new ValidationError({ field, value: v, message })) : Result.ok(v);
18502
18540
  var implementPromptDef = {
18503
18541
  templateName: "implement",
18504
- description: "One-shot task execution. The agent reads the task body, runs the verify script, and emits harness signals; the harness snapshots those signals into progress.md.",
18542
+ description: "One-shot task execution. The agent reads the task body and emits harness signals; the harness runs the verify script as the post-task gate and snapshots the signals into progress.md.",
18505
18543
  parameters: {
18506
18544
  taskName: {
18507
18545
  placeholder: "TASK_NAME",
@@ -18732,7 +18770,7 @@ var generatorExampleSignals = [
18732
18770
  appliesTo: "config / io layer",
18733
18771
  timestamp: EXAMPLE_TS3
18734
18772
  },
18735
- { type: "task-verified", output: "$ pnpm test\n... 42 passed", timestamp: EXAMPLE_TS3 },
18773
+ { type: "task-verified", output: "$ <project test command>\n... 42 passed", timestamp: EXAMPLE_TS3 },
18736
18774
  {
18737
18775
  type: COMMIT_MESSAGE_KIND,
18738
18776
  subject: "feat(foo): add helper for bar",
@@ -20399,7 +20437,7 @@ var evaluatorExampleSignals = [
20399
20437
  dimension: "correctness",
20400
20438
  passed: false,
20401
20439
  finding: "C1 command exited 1: empty-input test failed at src/foo.ts:23",
20402
- executionEvidence: "npm test -- src/foo.test.ts\n \u2717 handles empty input (expected 400, got 500)\n 1 failing"
20440
+ executionEvidence: "<project test command>\n \u2717 handles empty input (expected 400, got 500)\n 1 failing"
20403
20441
  },
20404
20442
  { dimension: "completeness", passed: true, finding: "all declared steps shipped" },
20405
20443
  { dimension: "safety", passed: true, finding: "inputs validated at the request boundary" },
@@ -20407,7 +20445,11 @@ var evaluatorExampleSignals = [
20407
20445
  { dimension: "robustness", passed: true, finding: "error path retries the write once before surfacing" }
20408
20446
  ],
20409
20447
  criteria: [
20410
- { id: "C1", passed: false, evidence: "npm test exited 1 \u2014 empty-input case failed at src/foo.ts:23" },
20448
+ {
20449
+ id: "C1",
20450
+ passed: false,
20451
+ evidence: "<project test command> exited 1 \u2014 empty-input case failed at src/foo.ts:23"
20452
+ },
20411
20453
  { id: "C2", passed: true, evidence: "request boundary validates input at src/foo.ts:11" }
20412
20454
  ],
20413
20455
  critique: "Correctness: add edge-case handling for empty input at src/foo.ts:23.",
@@ -27833,7 +27875,14 @@ var readinessPromptDef = {
27833
27875
  partials: {
27834
27876
  HARNESS_CONTEXT: "harness-context"
27835
27877
  },
27836
- expectedSignals: ["agents-md-proposal", "setup-skill-proposal", "verify-skill-proposal", "skill-suggestions", "note"]
27878
+ expectedSignals: [
27879
+ "agents-md-proposal",
27880
+ "setup-skill-proposal",
27881
+ "verify-skill-proposal",
27882
+ "skill-suggestions",
27883
+ "note",
27884
+ "learning"
27885
+ ]
27837
27886
  };
27838
27887
  var renderCurrentTool = (tool) => tool;
27839
27888
  var renderExistingContextFile = (body) => {
@@ -27958,20 +28007,20 @@ var readinessExampleSignals = [
27958
28007
  {
27959
28008
  type: "agents-md-proposal",
27960
28009
  tag: "claude-md",
27961
- content: "# Project Context\n\n## Build & Run\n\n`pnpm dev` \u2014 runs the dev server.",
28010
+ content: "# Project Context\n\n## Build & Run\n\n`<dev server command>` \u2014 runs the dev server.",
27962
28011
  timestamp: EXAMPLE_TS6
27963
28012
  },
27964
28013
  {
27965
28014
  type: "setup-skill-proposal",
27966
- content: "# Setup\n\nRun `pnpm install` to install dependencies.",
28015
+ content: "# Setup\n\nRun `<install command>` to install dependencies.",
27967
28016
  timestamp: EXAMPLE_TS6
27968
28017
  },
27969
28018
  {
27970
28019
  type: "verify-skill-proposal",
27971
- content: "# Verify\n\nRun `pnpm verify` (typecheck + lint + test).",
28020
+ content: "# Verify\n\nRun `<verify command>` (typecheck + lint + test).",
27972
28021
  timestamp: EXAMPLE_TS6
27973
28022
  },
27974
- { type: "skill-suggestions", names: ["typescript-strict", "pnpm"], timestamp: EXAMPLE_TS6 }
28023
+ { type: "skill-suggestions", names: ["typescript-strict", "code-style-conventions"], timestamp: EXAMPLE_TS6 }
27975
28024
  ];
27976
28025
  var readinessOutputContract = {
27977
28026
  schemaVersion: 1,
@@ -28287,8 +28336,7 @@ var resolveEffortForRow2 = (ai, flow) => {
28287
28336
  if (row.effort !== void 0) return row.effort;
28288
28337
  const globalEffort = ai.effort;
28289
28338
  if (globalEffort === void 0) return void 0;
28290
- if (row.provider === "openai-codex" && (globalEffort === "xhigh" || globalEffort === "max")) return "high";
28291
- return globalEffort;
28339
+ return clampEffortToProvider(globalEffort, row.provider);
28292
28340
  };
28293
28341
  var PROVIDER_INFRASTRUCTURE_ERROR_CODES = /* @__PURE__ */ new Set([ErrorCode.Probe, ErrorCode.RateLimit]);
28294
28342
  var wrapProviderContinue = (eventBus, provider, inner) => ({
@@ -28564,17 +28612,17 @@ var EXAMPLE_TS7 = "2026-05-22T10:00:00.000Z";
28564
28612
  var EXAMPLE_SIGNALS2 = [
28565
28613
  {
28566
28614
  type: SETUP_SKILL_PROPOSAL,
28567
- content: "This repo pins tool versions with mise. Before editing anything, run mise install to activate the exact versions declared in mise.toml. Then run the project install command documented in CLAUDE.md to hydrate the dependency tree.",
28615
+ content: "This repo pins tool versions with mise. Before editing anything, run mise install to activate the exact versions declared in mise.toml. Then run the project install command documented in the coding-agent context file to hydrate the dependency tree.",
28568
28616
  timestamp: EXAMPLE_TS7
28569
28617
  },
28570
28618
  {
28571
28619
  type: VERIFY_SKILL_PROPOSAL,
28572
- content: "Verification runs three gates in sequence documented in CLAUDE.md: typecheck, lint, then tests. A failure in any gate stops the chain; read the first failing gate output \u2014 later gates have not run yet.",
28620
+ content: "Verification runs three gates in sequence documented in the coding-agent context file: typecheck, lint, then tests. A failure in any gate stops the chain; read the first failing gate output \u2014 later gates have not run yet.",
28573
28621
  timestamp: EXAMPLE_TS7
28574
28622
  },
28575
28623
  {
28576
28624
  type: "note",
28577
- text: "Skills authored from CLAUDE.md and mise.toml.",
28625
+ text: "Skills authored from the coding-agent context file and mise.toml.",
28578
28626
  timestamp: EXAMPLE_TS7
28579
28627
  }
28580
28628
  ];
@@ -29024,23 +29072,23 @@ var wrapLegacyArray8 = (raw) => {
29024
29072
  };
29025
29073
  var EXAMPLE_TS8 = "2026-05-22T10:00:00.000Z";
29026
29074
  var EXAMPLE_SIGNALS3 = [
29027
- { type: "setup-script", command: "pnpm install", timestamp: EXAMPLE_TS8 },
29075
+ { type: "setup-script", command: "<tool> install", timestamp: EXAMPLE_TS8 },
29028
29076
  {
29029
29077
  type: "verify-script",
29030
- command: "pnpm typecheck && pnpm lint && pnpm test",
29078
+ command: "<tool> typecheck && <tool> lint && <tool> test",
29031
29079
  timestamp: EXAMPLE_TS8
29032
29080
  },
29033
29081
  {
29034
29082
  type: "verify-gates",
29035
29083
  gates: [
29036
- { pathPrefix: "services/api/", command: "pnpm --filter api test" },
29037
- { pathPrefix: "services/web/", command: "pnpm --filter web test" }
29084
+ { pathPrefix: "services/api/", command: "<tool> --filter api test" },
29085
+ { pathPrefix: "services/web/", command: "<tool> --filter web test" }
29038
29086
  ],
29039
29087
  timestamp: EXAMPLE_TS8
29040
29088
  },
29041
29089
  {
29042
29090
  type: "note",
29043
- text: "Commands lifted verbatim from CLAUDE.md.",
29091
+ text: "Commands lifted verbatim from the coding-agent context file.",
29044
29092
  timestamp: EXAMPLE_TS8
29045
29093
  }
29046
29094
  ];
@@ -30848,7 +30896,7 @@ var evaluateTriggers = (triggers, inputs) => {
30848
30896
  var PROVIDER_EFFORT_LEVELS = {
30849
30897
  "claude-code": ["low", "medium", "high", "xhigh", "max"],
30850
30898
  "github-copilot": ["none", "low", "medium", "high", "xhigh", "max"],
30851
- "openai-codex": ["minimal", "low", "medium", "high"]
30899
+ "openai-codex": ["low", "medium", "high", "xhigh", "max", "ultra"]
30852
30900
  };
30853
30901
 
30854
30902
  // src/application/ui/tui/views/flows-customize-picker.ts
@@ -36483,16 +36531,18 @@ var isPresetName = (raw) => PRESET_NAMES.includes(raw);
36483
36531
  var CLAUDE = "claude-code";
36484
36532
  var COPILOT = "github-copilot";
36485
36533
  var CODEX = "openai-codex";
36486
- var OPUS = "claude-opus-4-8";
36534
+ var OPUS = "claude-opus-5";
36487
36535
  var SONNET = "claude-sonnet-5";
36488
36536
  var HAIKU = "claude-haiku-4-5";
36489
36537
  var COPILOT_OPUS = "claude-opus-4.8";
36490
36538
  var COPILOT_SONNET = "claude-sonnet-4.6";
36491
36539
  var GPT_5_MINI2 = "gpt-5-mini";
36492
36540
  var GPT_5_4_MINI2 = "gpt-5.4-mini";
36541
+ var GPT_5_6_SOL2 = "gpt-5.6-sol";
36542
+ var GPT_5_6_TERRA = "gpt-5.6-terra";
36493
36543
  var MIXED = {
36494
36544
  effort: "high",
36495
- refine: { provider: CODEX, model: "gpt-5.5" },
36545
+ refine: { provider: CODEX, model: GPT_5_6_SOL2 },
36496
36546
  plan: { provider: COPILOT, model: COPILOT_SONNET, effort: "xhigh" },
36497
36547
  implement: {
36498
36548
  generator: { provider: CLAUDE, model: OPUS, effort: "xhigh" },
@@ -36530,16 +36580,14 @@ var COPILOT_ONLY = {
36530
36580
  };
36531
36581
  var CODEX_ONLY = {
36532
36582
  effort: "high",
36533
- refine: { provider: CODEX, model: "gpt-5.4" },
36534
- plan: { provider: CODEX, model: "gpt-5.5", effort: "high" },
36583
+ refine: { provider: CODEX, model: GPT_5_6_TERRA },
36584
+ plan: { provider: CODEX, model: GPT_5_6_SOL2, effort: "xhigh" },
36535
36585
  implement: {
36536
- // gpt-5.3-codex is deprecated for ChatGPT sign-in — implement now rides the frontier
36537
- // default so the everyday autonomous loop keeps working under ChatGPT auth.
36538
- generator: { provider: CODEX, model: "gpt-5.5", effort: "high" },
36539
- evaluator: { provider: CODEX, model: "gpt-5.5", effort: "high" }
36586
+ generator: { provider: CODEX, model: GPT_5_6_SOL2, effort: "xhigh" },
36587
+ evaluator: { provider: CODEX, model: GPT_5_6_SOL2, effort: "xhigh" }
36540
36588
  },
36541
36589
  readiness: { provider: CODEX, model: GPT_5_4_MINI2, effort: "medium" },
36542
- ideate: { provider: CODEX, model: "gpt-5.5" },
36590
+ ideate: { provider: CODEX, model: GPT_5_6_SOL2 },
36543
36591
  createPr: { provider: CODEX, model: GPT_5_4_MINI2 }
36544
36592
  };
36545
36593
  var MIXED_ECONOMIC = {
@@ -36581,13 +36629,13 @@ var COPILOT_ECONOMIC = {
36581
36629
  var CODEX_ECONOMIC = {
36582
36630
  effort: "high",
36583
36631
  refine: { provider: CODEX, model: GPT_5_4_MINI2 },
36584
- plan: { provider: CODEX, model: "gpt-5.4", effort: "high" },
36632
+ plan: { provider: CODEX, model: GPT_5_6_TERRA, effort: "high" },
36585
36633
  implement: {
36586
- generator: { provider: CODEX, model: "gpt-5.4", effort: "high" },
36587
- evaluator: { provider: CODEX, model: "gpt-5.4", effort: "high" }
36634
+ generator: { provider: CODEX, model: GPT_5_6_TERRA, effort: "high" },
36635
+ evaluator: { provider: CODEX, model: GPT_5_6_TERRA, effort: "high" }
36588
36636
  },
36589
36637
  readiness: { provider: CODEX, model: GPT_5_4_MINI2, effort: "medium" },
36590
- ideate: { provider: CODEX, model: "gpt-5.5" },
36638
+ ideate: { provider: CODEX, model: GPT_5_6_TERRA },
36591
36639
  createPr: { provider: CODEX, model: GPT_5_4_MINI2 }
36592
36640
  };
36593
36641
  var CLAUDE_STRONG_GATE = {
@@ -36631,14 +36679,15 @@ var COPILOT_STRONG_GATE = {
36631
36679
  var CODEX_STRONG_GATE = {
36632
36680
  effort: "high",
36633
36681
  refine: { provider: CODEX, model: GPT_5_4_MINI2 },
36634
- plan: { provider: CODEX, model: "gpt-5.5", effort: "high" },
36682
+ plan: { provider: CODEX, model: GPT_5_6_SOL2, effort: "xhigh" },
36635
36683
  implement: {
36636
- // Narrowest gate of the family: gpt-5.4 author climbs the single rung to the gpt-5.5 gate.
36637
- generator: { provider: CODEX, model: "gpt-5.4", effort: "high" },
36638
- evaluator: { provider: CODEX, model: "gpt-5.5", effort: "high" }
36684
+ // Narrowest gate of the family: terra author climbs the single default-ladder rung to the
36685
+ // sol gate.
36686
+ generator: { provider: CODEX, model: GPT_5_6_TERRA, effort: "high" },
36687
+ evaluator: { provider: CODEX, model: GPT_5_6_SOL2, effort: "xhigh" }
36639
36688
  },
36640
36689
  readiness: { provider: CODEX, model: GPT_5_4_MINI2, effort: "medium" },
36641
- ideate: { provider: CODEX, model: "gpt-5.5" },
36690
+ ideate: { provider: CODEX, model: GPT_5_6_SOL2 },
36642
36691
  createPr: { provider: CODEX, model: GPT_5_4_MINI2 }
36643
36692
  };
36644
36693
  var MIXED_FAST = {
@@ -36679,19 +36728,19 @@ var COPILOT_FAST = {
36679
36728
  };
36680
36729
  var CODEX_FAST = {
36681
36730
  effort: "low",
36682
- refine: { provider: CODEX, model: GPT_5_4_MINI2, effort: "minimal" },
36731
+ refine: { provider: CODEX, model: GPT_5_4_MINI2 },
36683
36732
  plan: { provider: CODEX, model: GPT_5_4_MINI2, effort: "low" },
36684
36733
  implement: {
36685
36734
  generator: { provider: CODEX, model: GPT_5_4_MINI2, effort: "low" },
36686
36735
  evaluator: { provider: CODEX, model: GPT_5_4_MINI2, effort: "low" }
36687
36736
  },
36688
- readiness: { provider: CODEX, model: GPT_5_4_MINI2, effort: "minimal" },
36737
+ readiness: { provider: CODEX, model: GPT_5_4_MINI2 },
36689
36738
  ideate: { provider: CODEX, model: GPT_5_4_MINI2 },
36690
- createPr: { provider: CODEX, model: GPT_5_4_MINI2, effort: "minimal" }
36739
+ createPr: { provider: CODEX, model: GPT_5_4_MINI2 }
36691
36740
  };
36692
36741
  var MIXED_FRONTIER = {
36693
36742
  effort: "max",
36694
- refine: { provider: CODEX, model: "gpt-5.5" },
36743
+ refine: { provider: CODEX, model: GPT_5_6_SOL2 },
36695
36744
  plan: { provider: CLAUDE, model: OPUS, effort: "max" },
36696
36745
  implement: {
36697
36746
  generator: { provider: CLAUDE, model: OPUS, effort: "max" },
@@ -36699,7 +36748,7 @@ var MIXED_FRONTIER = {
36699
36748
  },
36700
36749
  readiness: { provider: CLAUDE, model: OPUS, effort: "high" },
36701
36750
  ideate: { provider: CLAUDE, model: OPUS },
36702
- createPr: { provider: CODEX, model: "gpt-5.5" }
36751
+ createPr: { provider: CODEX, model: GPT_5_6_SOL2 }
36703
36752
  };
36704
36753
  var CLAUDE_FRONTIER = {
36705
36754
  effort: "max",
@@ -36726,17 +36775,16 @@ var COPILOT_FRONTIER = {
36726
36775
  createPr: { provider: COPILOT, model: COPILOT_OPUS }
36727
36776
  };
36728
36777
  var CODEX_FRONTIER = {
36729
- // Codex ceiling — global stays `high` so nothing implies a `max` codex row.
36730
- effort: "high",
36731
- refine: { provider: CODEX, model: "gpt-5.5" },
36732
- plan: { provider: CODEX, model: "gpt-5.5", effort: "high" },
36778
+ effort: "max",
36779
+ refine: { provider: CODEX, model: GPT_5_6_SOL2 },
36780
+ plan: { provider: CODEX, model: GPT_5_6_SOL2, effort: "max" },
36733
36781
  implement: {
36734
- generator: { provider: CODEX, model: "gpt-5.5", effort: "high" },
36735
- evaluator: { provider: CODEX, model: "gpt-5.5", effort: "high" }
36782
+ generator: { provider: CODEX, model: GPT_5_6_SOL2, effort: "max" },
36783
+ evaluator: { provider: CODEX, model: GPT_5_6_SOL2, effort: "max" }
36736
36784
  },
36737
- readiness: { provider: CODEX, model: "gpt-5.5", effort: "high" },
36738
- ideate: { provider: CODEX, model: "gpt-5.5" },
36739
- createPr: { provider: CODEX, model: "gpt-5.5" }
36785
+ readiness: { provider: CODEX, model: GPT_5_6_SOL2, effort: "high" },
36786
+ ideate: { provider: CODEX, model: GPT_5_6_SOL2 },
36787
+ createPr: { provider: CODEX, model: GPT_5_6_SOL2 }
36740
36788
  };
36741
36789
  var PRESETS = {
36742
36790
  mixed: { ai: MIXED, escalateOnPlateau: true },
package/dist/cli.mjs CHANGED
@@ -2,5 +2,5 @@
2
2
 
3
3
  // src/index.ts
4
4
  process.env.NODE_ENV ??= "production";
5
- var { runCli } = await import("./cli-KZ4IYDKB.mjs");
5
+ var { runCli } = await import("./cli-CCNZ2VKB.mjs");
6
6
  await runCli(process.argv);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "packageVersion": "0.16.0",
4
- "generatedAt": "2026-07-18T13:59:00.834Z",
3
+ "packageVersion": "0.17.0",
4
+ "generatedAt": "2026-07-27T15:30:39.020Z",
5
5
  "assets": [
6
6
  "agent-definitions/ralphctl-evaluator.md",
7
7
  "agent-definitions/ralphctl-generator.md",
@@ -47,14 +47,14 @@ break the shared lockfile.
47
47
 
48
48
  ## Architecture
49
49
 
50
- - Clean Architecture: `domain → business → integration → application`. No reverse imports.
51
- - No barrel files (`index.ts` re-exports) — every import names its symbol explicitly.
50
+ - <your layering rule> — e.g. which modules may import which, and which direction is forbidden.
51
+ - <your module-boundary rule> — e.g. no barrel re-export files; every import names its symbol explicitly.
52
52
 
53
53
  ## Conventions
54
54
 
55
- - Business operations return a `Result` type — do not throw for domain errors.
56
- - All file writes go through the atomic-write helper in `business/io/`; direct `fs.writeFile`
57
- is banned from business code.
55
+ - <your error-handling convention> — e.g. return a typed result instead of throwing for domain errors.
56
+ - <your I/O convention> — e.g. all writes go through one shared helper; direct filesystem calls
57
+ are banned elsewhere.
58
58
 
59
59
  ## Security
60
60