ralphctl 0.16.0 → 0.17.1

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.
@@ -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.1",
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);
@@ -15286,7 +15319,7 @@ var validateSignalsFile = async (outputDir, contract) => {
15286
15319
  }
15287
15320
  const wrapper = current;
15288
15321
  const inner = wrapper.signals;
15289
- const defaulted = defaultMissingTimestamps(inner);
15322
+ const defaulted = renameNarrativeBodyToText(defaultMissingTimestamps(inner));
15290
15323
  const parsed = contract.signalsSchema.safeParse(defaulted);
15291
15324
  if (!parsed.success) {
15292
15325
  return Result.error(
@@ -15304,6 +15337,18 @@ var describeJsonError = (cause) => {
15304
15337
  if (cause instanceof Error) return cause.message;
15305
15338
  return String(cause);
15306
15339
  };
15340
+ var NARRATIVE_SIGNAL_KINDS = /* @__PURE__ */ new Set(["learning", "note", "decision"]);
15341
+ var renameNarrativeBodyToText = (inner) => {
15342
+ if (!Array.isArray(inner)) return inner;
15343
+ return inner.map((sig) => {
15344
+ if (typeof sig !== "object" || sig === null) return sig;
15345
+ const s = sig;
15346
+ if (typeof s.type !== "string" || !NARRATIVE_SIGNAL_KINDS.has(s.type)) return sig;
15347
+ if (typeof s.text === "string" || typeof s.body !== "string") return sig;
15348
+ const { body, ...rest } = s;
15349
+ return { ...rest, text: body };
15350
+ });
15351
+ };
15307
15352
  var defaultMissingTimestamps = (inner) => {
15308
15353
  if (!Array.isArray(inner)) return inner;
15309
15354
  const now = (/* @__PURE__ */ new Date()).toISOString();
@@ -15394,6 +15439,16 @@ var refineExampleSignals = [
15394
15439
  type: "decision",
15395
15440
  text: "Scoped export to CSV only for v1; XLSX deferred to a follow-up ticket.",
15396
15441
  timestamp: EXAMPLE_TS
15442
+ },
15443
+ {
15444
+ type: "learning",
15445
+ text: "The export path already streams; the ticket must not assume an in-memory buffer.",
15446
+ timestamp: EXAMPLE_TS
15447
+ },
15448
+ {
15449
+ type: "note",
15450
+ text: "The user ruled column ordering out of scope \u2014 captured as a deferred item rather than an AC.",
15451
+ timestamp: EXAMPLE_TS
15397
15452
  }
15398
15453
  ];
15399
15454
  var refineOutputContract = {
@@ -16420,7 +16475,12 @@ var renderPlateauDirectiveSection = (plateauBreak) => {
16420
16475
  "Step back and rethink. Re-read the task contract and the prior critique, question the assumption",
16421
16476
  "that led the earlier attempts astray, and implement a **fundamentally different** solution \u2014 a",
16422
16477
  "different design, data flow, or code path. Then verify the failing criteria directly before",
16423
- "signalling completion."
16478
+ "signalling completion.",
16479
+ "",
16480
+ "Before you choose that different approach, name which failure mode you were stuck in \u2014",
16481
+ "re-exploring code you already understood, looping on the same failing edit, over-polishing",
16482
+ "criteria that already pass, or fixing the wrong",
16483
+ 'location entirely \u2014 then change that specific behaviour, not just "try something different."'
16424
16484
  ].join("\n");
16425
16485
  };
16426
16486
 
@@ -16802,6 +16862,21 @@ var planExampleSignals = [
16802
16862
  type: "task-plan",
16803
16863
  tasksJson: '[{"name":"Wire export endpoint","ticketRef":"<ticket-uuid>","projectPath":"/abs/repo","steps":["..."],"verificationCriteria":["..."]}]',
16804
16864
  timestamp: EXAMPLE_TS2
16865
+ },
16866
+ {
16867
+ type: "decision",
16868
+ text: "Split the export work into endpoint + serializer tasks so the shared file is owned by exactly one task.",
16869
+ timestamp: EXAMPLE_TS2
16870
+ },
16871
+ {
16872
+ type: "learning",
16873
+ text: "The repo runs its integration suite from a separate config; the root test command does not cover it.",
16874
+ timestamp: EXAMPLE_TS2
16875
+ },
16876
+ {
16877
+ type: "note",
16878
+ text: "Two approved tickets touch the same route file; sequenced them via blockedBy rather than splitting the file.",
16879
+ timestamp: EXAMPLE_TS2
16805
16880
  }
16806
16881
  ];
16807
16882
  var planOutputContract = {
@@ -18501,7 +18576,7 @@ var composeCriteriaHistory = (input) => {
18501
18576
  var requireNonEmpty = (field, message) => (v) => v.trim().length === 0 ? Result.error(new ValidationError({ field, value: v, message })) : Result.ok(v);
18502
18577
  var implementPromptDef = {
18503
18578
  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.",
18579
+ 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
18580
  parameters: {
18506
18581
  taskName: {
18507
18582
  placeholder: "TASK_NAME",
@@ -18732,7 +18807,17 @@ var generatorExampleSignals = [
18732
18807
  appliesTo: "config / io layer",
18733
18808
  timestamp: EXAMPLE_TS3
18734
18809
  },
18735
- { type: "task-verified", output: "$ pnpm test\n... 42 passed", timestamp: EXAMPLE_TS3 },
18810
+ {
18811
+ type: "decision",
18812
+ text: "Centralised the parse in one helper rather than patching both call sites, to avoid future drift.",
18813
+ timestamp: EXAMPLE_TS3
18814
+ },
18815
+ {
18816
+ type: "note",
18817
+ text: "Left the unrelated typo at src/baz.ts:8 alone \u2014 out of scope for this task.",
18818
+ timestamp: EXAMPLE_TS3
18819
+ },
18820
+ { type: "task-verified", output: "$ <project test command>\n... 42 passed", timestamp: EXAMPLE_TS3 },
18736
18821
  {
18737
18822
  type: COMMIT_MESSAGE_KIND,
18738
18823
  subject: "feat(foo): add helper for bar",
@@ -20399,7 +20484,7 @@ var evaluatorExampleSignals = [
20399
20484
  dimension: "correctness",
20400
20485
  passed: false,
20401
20486
  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"
20487
+ executionEvidence: "<project test command>\n \u2717 handles empty input (expected 400, got 500)\n 1 failing"
20403
20488
  },
20404
20489
  { dimension: "completeness", passed: true, finding: "all declared steps shipped" },
20405
20490
  { dimension: "safety", passed: true, finding: "inputs validated at the request boundary" },
@@ -20407,11 +20492,25 @@ var evaluatorExampleSignals = [
20407
20492
  { dimension: "robustness", passed: true, finding: "error path retries the write once before surfacing" }
20408
20493
  ],
20409
20494
  criteria: [
20410
- { id: "C1", passed: false, evidence: "npm test exited 1 \u2014 empty-input case failed at src/foo.ts:23" },
20495
+ {
20496
+ id: "C1",
20497
+ passed: false,
20498
+ evidence: "<project test command> exited 1 \u2014 empty-input case failed at src/foo.ts:23"
20499
+ },
20411
20500
  { id: "C2", passed: true, evidence: "request boundary validates input at src/foo.ts:11" }
20412
20501
  ],
20413
20502
  critique: "Correctness: add edge-case handling for empty input at src/foo.ts:23.",
20414
20503
  timestamp: EXAMPLE_TS4
20504
+ },
20505
+ {
20506
+ type: "learning",
20507
+ text: "The suite needs a built fixture; a cold checkout fails the C1 command for reasons unrelated to the task.",
20508
+ timestamp: EXAMPLE_TS4
20509
+ },
20510
+ {
20511
+ type: "note",
20512
+ text: "C2 was checked by reading the call site \u2014 the criterion is manual, so no command was run.",
20513
+ timestamp: EXAMPLE_TS4
20415
20514
  }
20416
20515
  ];
20417
20516
  var evaluatorOutputContract = {
@@ -27833,7 +27932,14 @@ var readinessPromptDef = {
27833
27932
  partials: {
27834
27933
  HARNESS_CONTEXT: "harness-context"
27835
27934
  },
27836
- expectedSignals: ["agents-md-proposal", "setup-skill-proposal", "verify-skill-proposal", "skill-suggestions", "note"]
27935
+ expectedSignals: [
27936
+ "agents-md-proposal",
27937
+ "setup-skill-proposal",
27938
+ "verify-skill-proposal",
27939
+ "skill-suggestions",
27940
+ "note",
27941
+ "learning"
27942
+ ]
27837
27943
  };
27838
27944
  var renderCurrentTool = (tool) => tool;
27839
27945
  var renderExistingContextFile = (body) => {
@@ -27958,20 +28064,30 @@ var readinessExampleSignals = [
27958
28064
  {
27959
28065
  type: "agents-md-proposal",
27960
28066
  tag: "claude-md",
27961
- content: "# Project Context\n\n## Build & Run\n\n`pnpm dev` \u2014 runs the dev server.",
28067
+ content: "# Project Context\n\n## Build & Run\n\n`<dev server command>` \u2014 runs the dev server.",
27962
28068
  timestamp: EXAMPLE_TS6
27963
28069
  },
27964
28070
  {
27965
28071
  type: "setup-skill-proposal",
27966
- content: "# Setup\n\nRun `pnpm install` to install dependencies.",
28072
+ content: "# Setup\n\nRun `<install command>` to install dependencies.",
27967
28073
  timestamp: EXAMPLE_TS6
27968
28074
  },
27969
28075
  {
27970
28076
  type: "verify-skill-proposal",
27971
- content: "# Verify\n\nRun `pnpm verify` (typecheck + lint + test).",
28077
+ content: "# Verify\n\nRun `<verify command>` (typecheck + lint + test).",
27972
28078
  timestamp: EXAMPLE_TS6
27973
28079
  },
27974
- { type: "skill-suggestions", names: ["typescript-strict", "pnpm"], timestamp: EXAMPLE_TS6 }
28080
+ { type: "skill-suggestions", names: ["typescript-strict", "code-style-conventions"], timestamp: EXAMPLE_TS6 },
28081
+ {
28082
+ type: "learning",
28083
+ text: "The verify command lives in a workspace package script, not the repo root manifest.",
28084
+ timestamp: EXAMPLE_TS6
28085
+ },
28086
+ {
28087
+ type: "note",
28088
+ text: "No lint config found, so the proposed verify skill covers typecheck + test only.",
28089
+ timestamp: EXAMPLE_TS6
28090
+ }
27975
28091
  ];
27976
28092
  var readinessOutputContract = {
27977
28093
  schemaVersion: 1,
@@ -28287,8 +28403,7 @@ var resolveEffortForRow2 = (ai, flow) => {
28287
28403
  if (row.effort !== void 0) return row.effort;
28288
28404
  const globalEffort = ai.effort;
28289
28405
  if (globalEffort === void 0) return void 0;
28290
- if (row.provider === "openai-codex" && (globalEffort === "xhigh" || globalEffort === "max")) return "high";
28291
- return globalEffort;
28406
+ return clampEffortToProvider(globalEffort, row.provider);
28292
28407
  };
28293
28408
  var PROVIDER_INFRASTRUCTURE_ERROR_CODES = /* @__PURE__ */ new Set([ErrorCode.Probe, ErrorCode.RateLimit]);
28294
28409
  var wrapProviderContinue = (eventBus, provider, inner) => ({
@@ -28564,17 +28679,17 @@ var EXAMPLE_TS7 = "2026-05-22T10:00:00.000Z";
28564
28679
  var EXAMPLE_SIGNALS2 = [
28565
28680
  {
28566
28681
  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.",
28682
+ 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
28683
  timestamp: EXAMPLE_TS7
28569
28684
  },
28570
28685
  {
28571
28686
  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.",
28687
+ 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
28688
  timestamp: EXAMPLE_TS7
28574
28689
  },
28575
28690
  {
28576
28691
  type: "note",
28577
- text: "Skills authored from CLAUDE.md and mise.toml.",
28692
+ text: "Skills authored from the coding-agent context file and mise.toml.",
28578
28693
  timestamp: EXAMPLE_TS7
28579
28694
  }
28580
28695
  ];
@@ -29024,23 +29139,23 @@ var wrapLegacyArray8 = (raw) => {
29024
29139
  };
29025
29140
  var EXAMPLE_TS8 = "2026-05-22T10:00:00.000Z";
29026
29141
  var EXAMPLE_SIGNALS3 = [
29027
- { type: "setup-script", command: "pnpm install", timestamp: EXAMPLE_TS8 },
29142
+ { type: "setup-script", command: "<tool> install", timestamp: EXAMPLE_TS8 },
29028
29143
  {
29029
29144
  type: "verify-script",
29030
- command: "pnpm typecheck && pnpm lint && pnpm test",
29145
+ command: "<tool> typecheck && <tool> lint && <tool> test",
29031
29146
  timestamp: EXAMPLE_TS8
29032
29147
  },
29033
29148
  {
29034
29149
  type: "verify-gates",
29035
29150
  gates: [
29036
- { pathPrefix: "services/api/", command: "pnpm --filter api test" },
29037
- { pathPrefix: "services/web/", command: "pnpm --filter web test" }
29151
+ { pathPrefix: "services/api/", command: "<tool> --filter api test" },
29152
+ { pathPrefix: "services/web/", command: "<tool> --filter web test" }
29038
29153
  ],
29039
29154
  timestamp: EXAMPLE_TS8
29040
29155
  },
29041
29156
  {
29042
29157
  type: "note",
29043
- text: "Commands lifted verbatim from CLAUDE.md.",
29158
+ text: "Commands lifted verbatim from the coding-agent context file.",
29044
29159
  timestamp: EXAMPLE_TS8
29045
29160
  }
29046
29161
  ];
@@ -29584,6 +29699,21 @@ var ideateExampleSignals = [
29584
29699
  type: "ideated-tickets",
29585
29700
  outputJson: '{"requirements":"# Export CSV\\n\\n## Problem\\n\u2026","tasks":[{"name":"Wire endpoint","projectPath":"/abs/repo","steps":["\u2026"],"verificationCriteria":["\u2026"]}]}',
29586
29701
  timestamp: EXAMPLE_TS9
29702
+ },
29703
+ {
29704
+ type: "decision",
29705
+ text: "Scoped export to CSV only for v1; XLSX deferred to a follow-up ticket.",
29706
+ timestamp: EXAMPLE_TS9
29707
+ },
29708
+ {
29709
+ type: "learning",
29710
+ text: "The repo runs its integration suite from a separate config; the root test command does not cover it.",
29711
+ timestamp: EXAMPLE_TS9
29712
+ },
29713
+ {
29714
+ type: "note",
29715
+ text: "The user ruled out changing the existing download endpoint, so the new route is additive.",
29716
+ timestamp: EXAMPLE_TS9
29587
29717
  }
29588
29718
  ];
29589
29719
  var ideateOutputContract = {
@@ -30848,7 +30978,7 @@ var evaluateTriggers = (triggers, inputs) => {
30848
30978
  var PROVIDER_EFFORT_LEVELS = {
30849
30979
  "claude-code": ["low", "medium", "high", "xhigh", "max"],
30850
30980
  "github-copilot": ["none", "low", "medium", "high", "xhigh", "max"],
30851
- "openai-codex": ["minimal", "low", "medium", "high"]
30981
+ "openai-codex": ["low", "medium", "high", "xhigh", "max", "ultra"]
30852
30982
  };
30853
30983
 
30854
30984
  // src/application/ui/tui/views/flows-customize-picker.ts
@@ -36483,16 +36613,18 @@ var isPresetName = (raw) => PRESET_NAMES.includes(raw);
36483
36613
  var CLAUDE = "claude-code";
36484
36614
  var COPILOT = "github-copilot";
36485
36615
  var CODEX = "openai-codex";
36486
- var OPUS = "claude-opus-4-8";
36616
+ var OPUS = "claude-opus-5";
36487
36617
  var SONNET = "claude-sonnet-5";
36488
36618
  var HAIKU = "claude-haiku-4-5";
36489
36619
  var COPILOT_OPUS = "claude-opus-4.8";
36490
36620
  var COPILOT_SONNET = "claude-sonnet-4.6";
36491
36621
  var GPT_5_MINI2 = "gpt-5-mini";
36492
36622
  var GPT_5_4_MINI2 = "gpt-5.4-mini";
36623
+ var GPT_5_6_SOL2 = "gpt-5.6-sol";
36624
+ var GPT_5_6_TERRA = "gpt-5.6-terra";
36493
36625
  var MIXED = {
36494
36626
  effort: "high",
36495
- refine: { provider: CODEX, model: "gpt-5.5" },
36627
+ refine: { provider: CODEX, model: GPT_5_6_SOL2 },
36496
36628
  plan: { provider: COPILOT, model: COPILOT_SONNET, effort: "xhigh" },
36497
36629
  implement: {
36498
36630
  generator: { provider: CLAUDE, model: OPUS, effort: "xhigh" },
@@ -36530,16 +36662,14 @@ var COPILOT_ONLY = {
36530
36662
  };
36531
36663
  var CODEX_ONLY = {
36532
36664
  effort: "high",
36533
- refine: { provider: CODEX, model: "gpt-5.4" },
36534
- plan: { provider: CODEX, model: "gpt-5.5", effort: "high" },
36665
+ refine: { provider: CODEX, model: GPT_5_6_TERRA },
36666
+ plan: { provider: CODEX, model: GPT_5_6_SOL2, effort: "xhigh" },
36535
36667
  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" }
36668
+ generator: { provider: CODEX, model: GPT_5_6_SOL2, effort: "xhigh" },
36669
+ evaluator: { provider: CODEX, model: GPT_5_6_SOL2, effort: "xhigh" }
36540
36670
  },
36541
36671
  readiness: { provider: CODEX, model: GPT_5_4_MINI2, effort: "medium" },
36542
- ideate: { provider: CODEX, model: "gpt-5.5" },
36672
+ ideate: { provider: CODEX, model: GPT_5_6_SOL2 },
36543
36673
  createPr: { provider: CODEX, model: GPT_5_4_MINI2 }
36544
36674
  };
36545
36675
  var MIXED_ECONOMIC = {
@@ -36581,13 +36711,13 @@ var COPILOT_ECONOMIC = {
36581
36711
  var CODEX_ECONOMIC = {
36582
36712
  effort: "high",
36583
36713
  refine: { provider: CODEX, model: GPT_5_4_MINI2 },
36584
- plan: { provider: CODEX, model: "gpt-5.4", effort: "high" },
36714
+ plan: { provider: CODEX, model: GPT_5_6_TERRA, effort: "high" },
36585
36715
  implement: {
36586
- generator: { provider: CODEX, model: "gpt-5.4", effort: "high" },
36587
- evaluator: { provider: CODEX, model: "gpt-5.4", effort: "high" }
36716
+ generator: { provider: CODEX, model: GPT_5_6_TERRA, effort: "high" },
36717
+ evaluator: { provider: CODEX, model: GPT_5_6_TERRA, effort: "high" }
36588
36718
  },
36589
36719
  readiness: { provider: CODEX, model: GPT_5_4_MINI2, effort: "medium" },
36590
- ideate: { provider: CODEX, model: "gpt-5.5" },
36720
+ ideate: { provider: CODEX, model: GPT_5_6_TERRA },
36591
36721
  createPr: { provider: CODEX, model: GPT_5_4_MINI2 }
36592
36722
  };
36593
36723
  var CLAUDE_STRONG_GATE = {
@@ -36631,14 +36761,15 @@ var COPILOT_STRONG_GATE = {
36631
36761
  var CODEX_STRONG_GATE = {
36632
36762
  effort: "high",
36633
36763
  refine: { provider: CODEX, model: GPT_5_4_MINI2 },
36634
- plan: { provider: CODEX, model: "gpt-5.5", effort: "high" },
36764
+ plan: { provider: CODEX, model: GPT_5_6_SOL2, effort: "xhigh" },
36635
36765
  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" }
36766
+ // Narrowest gate of the family: terra author climbs the single default-ladder rung to the
36767
+ // sol gate.
36768
+ generator: { provider: CODEX, model: GPT_5_6_TERRA, effort: "high" },
36769
+ evaluator: { provider: CODEX, model: GPT_5_6_SOL2, effort: "xhigh" }
36639
36770
  },
36640
36771
  readiness: { provider: CODEX, model: GPT_5_4_MINI2, effort: "medium" },
36641
- ideate: { provider: CODEX, model: "gpt-5.5" },
36772
+ ideate: { provider: CODEX, model: GPT_5_6_SOL2 },
36642
36773
  createPr: { provider: CODEX, model: GPT_5_4_MINI2 }
36643
36774
  };
36644
36775
  var MIXED_FAST = {
@@ -36679,19 +36810,19 @@ var COPILOT_FAST = {
36679
36810
  };
36680
36811
  var CODEX_FAST = {
36681
36812
  effort: "low",
36682
- refine: { provider: CODEX, model: GPT_5_4_MINI2, effort: "minimal" },
36813
+ refine: { provider: CODEX, model: GPT_5_4_MINI2 },
36683
36814
  plan: { provider: CODEX, model: GPT_5_4_MINI2, effort: "low" },
36684
36815
  implement: {
36685
36816
  generator: { provider: CODEX, model: GPT_5_4_MINI2, effort: "low" },
36686
36817
  evaluator: { provider: CODEX, model: GPT_5_4_MINI2, effort: "low" }
36687
36818
  },
36688
- readiness: { provider: CODEX, model: GPT_5_4_MINI2, effort: "minimal" },
36819
+ readiness: { provider: CODEX, model: GPT_5_4_MINI2 },
36689
36820
  ideate: { provider: CODEX, model: GPT_5_4_MINI2 },
36690
- createPr: { provider: CODEX, model: GPT_5_4_MINI2, effort: "minimal" }
36821
+ createPr: { provider: CODEX, model: GPT_5_4_MINI2 }
36691
36822
  };
36692
36823
  var MIXED_FRONTIER = {
36693
36824
  effort: "max",
36694
- refine: { provider: CODEX, model: "gpt-5.5" },
36825
+ refine: { provider: CODEX, model: GPT_5_6_SOL2 },
36695
36826
  plan: { provider: CLAUDE, model: OPUS, effort: "max" },
36696
36827
  implement: {
36697
36828
  generator: { provider: CLAUDE, model: OPUS, effort: "max" },
@@ -36699,7 +36830,7 @@ var MIXED_FRONTIER = {
36699
36830
  },
36700
36831
  readiness: { provider: CLAUDE, model: OPUS, effort: "high" },
36701
36832
  ideate: { provider: CLAUDE, model: OPUS },
36702
- createPr: { provider: CODEX, model: "gpt-5.5" }
36833
+ createPr: { provider: CODEX, model: GPT_5_6_SOL2 }
36703
36834
  };
36704
36835
  var CLAUDE_FRONTIER = {
36705
36836
  effort: "max",
@@ -36726,17 +36857,16 @@ var COPILOT_FRONTIER = {
36726
36857
  createPr: { provider: COPILOT, model: COPILOT_OPUS }
36727
36858
  };
36728
36859
  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" },
36860
+ effort: "max",
36861
+ refine: { provider: CODEX, model: GPT_5_6_SOL2 },
36862
+ plan: { provider: CODEX, model: GPT_5_6_SOL2, effort: "max" },
36733
36863
  implement: {
36734
- generator: { provider: CODEX, model: "gpt-5.5", effort: "high" },
36735
- evaluator: { provider: CODEX, model: "gpt-5.5", effort: "high" }
36864
+ generator: { provider: CODEX, model: GPT_5_6_SOL2, effort: "max" },
36865
+ evaluator: { provider: CODEX, model: GPT_5_6_SOL2, effort: "max" }
36736
36866
  },
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" }
36867
+ readiness: { provider: CODEX, model: GPT_5_6_SOL2, effort: "high" },
36868
+ ideate: { provider: CODEX, model: GPT_5_6_SOL2 },
36869
+ createPr: { provider: CODEX, model: GPT_5_6_SOL2 }
36740
36870
  };
36741
36871
  var PRESETS = {
36742
36872
  mixed: { ai: MIXED, escalateOnPlateau: true },