baro-ai 0.70.7 → 0.70.8

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/dist/cli.mjs CHANGED
@@ -47767,7 +47767,7 @@ exactly this shape:
47767
47767
  {"action":"split"|"prereq"|"rewire"|"skip"|"abort",
47768
47768
  "reason":"\u2026",
47769
47769
  "added":[ { "id":"S?","priority":N,"title":"\u2026","description":"\u2026",
47770
- "dependsOn":["\u2026"], "acceptance":["\u2026"], "model":"sonnet" } ],
47770
+ "dependsOn":["\u2026"], "acceptance":["\u2026"] } ],
47771
47771
  "removed":["S?"],
47772
47772
  "modifiedDeps":[{"id":"S?","newDependsOn":["\u2026"]}]}
47773
47773
 
@@ -47777,18 +47777,22 @@ Rules:
47777
47777
  - "modifiedDeps" rewires a story's dependsOn \u2014 use to repoint dependents
47778
47778
  of a removed story to a replacement.
47779
47779
  - "abort" \u2192 empty added/removed/modifiedDeps arrays.
47780
- - TIER every added story with "model" ("haiku" | "sonnet" | "opus"),
47781
- the same way the planner does \u2014 by blast radius, not raw difficulty:
47782
- * "haiku" \u2192 mechanical, single-concern, nothing important breaks
47783
- * "sonnet" \u2192 one contained feature/module
47784
- * "opus" \u2192 cross-cutting / schema / wiring / a DAG hub
47785
- ESCALATION: the failing story already burned its retries at the tier
47786
- shown ("Tier that just failed"). Its replacement(s) must NOT repeat
47787
- that tier unless you are splitting it into genuinely smaller pieces.
47788
- When you keep the same scope (rewire / prereq replacement), bump the
47789
- tier UP one step (haiku\u2192sonnet\u2192opus). When you split (action "split"),
47790
- each child gets the tier its own (smaller) blast radius warrants \u2014
47791
- often lower, but a still-complex child stays "opus".
47780
+ - MODEL: LEAVE "model" UNSET on the stories you add \u2014 they run on the
47781
+ default (cheaper) model, which is exactly what split children want.
47782
+ Do NOT use planner tier names ("haiku"/"sonnet"/"opus") \u2014 the story
47783
+ model is not chosen by tier here; it is either the default or an
47784
+ explicit escalation route (below).
47785
+ - ESCALATION vs SPLIT \u2014 the failing story already burned its retries on
47786
+ the model shown ("Model that just failed"). Two ways to recover:
47787
+ * SPLIT (preferred): if it was TOO BROAD \u2014 too many files/concerns
47788
+ for one session \u2014 break it into smaller, focused stories and
47789
+ leave their "model" unset (they stay on the cheaper model). A
47790
+ smaller, sharper story is usually what a stuck run actually needs.
47791
+ * ESCALATE (sparingly): if the story was already RIGHT-SIZED but
47792
+ genuinely needs a more capable model, set that ONE story's "model"
47793
+ to the exact ESCALATION ROUTE printed in the failure context
47794
+ below. That runs it on the stronger model. Only escalate when the
47795
+ scope is already tight \u2014 never as a reflex.
47792
47796
  - Output ONLY the JSON object, nothing else.`;
47793
47797
  var Surgeon = class extends BaseObserver {
47794
47798
  opts;
@@ -47803,7 +47807,8 @@ var Surgeon = class extends BaseObserver {
47803
47807
  claudeBin: opts.claudeBin ?? "claude",
47804
47808
  timeoutMs: opts.timeoutMs ?? 9e4,
47805
47809
  snapshot: opts.snapshot,
47806
- resolveRoute: opts.resolveRoute
47810
+ resolveRoute: opts.resolveRoute,
47811
+ escalationRoute: opts.escalationRoute
47807
47812
  };
47808
47813
  }
47809
47814
  /** Resolves once every in-flight LLM evaluation has completed. */
@@ -47842,7 +47847,7 @@ var Surgeon = class extends BaseObserver {
47842
47847
  */
47843
47848
  async evaluateWithLlm(failure) {
47844
47849
  const snap = this.opts.snapshot();
47845
- const prompt = buildSurgeonPrompt(snap, failure, this.opts.resolveRoute);
47850
+ const prompt = buildSurgeonPrompt(snap, failure, this.opts.resolveRoute, this.opts.escalationRoute);
47846
47851
  try {
47847
47852
  const { stdout } = await execFileAsync3(
47848
47853
  this.opts.claudeBin,
@@ -47892,7 +47897,7 @@ var Surgeon = class extends BaseObserver {
47892
47897
  }
47893
47898
  }
47894
47899
  };
47895
- function buildSurgeonPrompt(snap, failure, resolveRoute) {
47900
+ function buildSurgeonPrompt(snap, failure, resolveRoute, escalationRoute) {
47896
47901
  const storyLines = snap.stories.map(
47897
47902
  (s2) => ` - ${s2.id} ${s2.passes ? "[passed]" : "[pending]"} ${s2.model ? `<tier:${s2.model}> ` : ""}"${s2.title}" deps=${JSON.stringify(s2.dependsOn)}`
47898
47903
  ).join("\n");
@@ -47915,6 +47920,12 @@ function buildSurgeonPrompt(snap, failure, resolveRoute) {
47915
47920
  ] : [],
47916
47921
  `Attempts: ${failure.attempts}`,
47917
47922
  `Error: ${failure.error ?? "(no reason captured)"}`,
47923
+ ...escalationRoute ? [
47924
+ "",
47925
+ `# Escalation route`,
47926
+ `To ESCALATE a right-sized story onto the stronger model, set that story's "model" to EXACTLY: ${escalationRoute}`,
47927
+ `Otherwise leave "model" unset \u2014 added stories run on the default (cheaper) model. Prefer splitting a too-broad story over escalating.`
47928
+ ] : [],
47918
47929
  "",
47919
47930
  `# Decide`,
47920
47931
  `Output the replan JSON per the rules in your system prompt.`
@@ -47964,7 +47975,8 @@ var SurgeonCodex = class extends BaseObserver {
47964
47975
  codexBin: opts.codexBin ?? "codex",
47965
47976
  timeoutMs: opts.timeoutMs ?? 3e5,
47966
47977
  snapshot: opts.snapshot,
47967
- resolveRoute: opts.resolveRoute
47978
+ resolveRoute: opts.resolveRoute,
47979
+ escalationRoute: opts.escalationRoute
47968
47980
  };
47969
47981
  }
47970
47982
  async idle() {
@@ -47988,7 +48000,7 @@ var SurgeonCodex = class extends BaseObserver {
47988
48000
  }
47989
48001
  async evaluateWithLlm(failure) {
47990
48002
  const snap = this.opts.snapshot();
47991
- const userPrompt = buildSurgeonPrompt(snap, failure, this.opts.resolveRoute);
48003
+ const userPrompt = buildSurgeonPrompt(snap, failure, this.opts.resolveRoute, this.opts.escalationRoute);
47992
48004
  const prompt = `${SURGEON_SYSTEM_PROMPT}
47993
48005
 
47994
48006
  ${userPrompt}`;
@@ -48061,7 +48073,8 @@ var SurgeonOpenAI = class extends BaseObserver {
48061
48073
  maxReplans: opts.maxReplans ?? Infinity,
48062
48074
  model: opts.model ?? "gpt-5.5",
48063
48075
  snapshot: opts.snapshot,
48064
- resolveRoute: opts.resolveRoute
48076
+ resolveRoute: opts.resolveRoute,
48077
+ escalationRoute: opts.escalationRoute
48065
48078
  };
48066
48079
  this.model = pickModel3(this.opts.model);
48067
48080
  }
@@ -48093,7 +48106,7 @@ var SurgeonOpenAI = class extends BaseObserver {
48093
48106
  */
48094
48107
  async evaluate(failure) {
48095
48108
  const snap = this.opts.snapshot();
48096
- const userPrompt = buildSurgeonPrompt(snap, failure, this.opts.resolveRoute);
48109
+ const userPrompt = buildSurgeonPrompt(snap, failure, this.opts.resolveRoute, this.opts.escalationRoute);
48097
48110
  const context = ModelContext.create("surgeon").addContextItem(SystemMessageItem.create(SURGEON_SYSTEM_PROMPT)).addContextItem(UserMessageItem.create(userPrompt));
48098
48111
  try {
48099
48112
  const round = await runInferenceRound(context, this.model);
@@ -48151,7 +48164,8 @@ var SurgeonOpenCode = class extends BaseObserver {
48151
48164
  opencodeBin: opts.opencodeBin ?? "opencode",
48152
48165
  timeoutMs: opts.timeoutMs ?? 3e5,
48153
48166
  snapshot: opts.snapshot,
48154
- resolveRoute: opts.resolveRoute
48167
+ resolveRoute: opts.resolveRoute,
48168
+ escalationRoute: opts.escalationRoute
48155
48169
  };
48156
48170
  }
48157
48171
  async idle() {
@@ -48175,7 +48189,7 @@ var SurgeonOpenCode = class extends BaseObserver {
48175
48189
  }
48176
48190
  async evaluateWithLlm(failure) {
48177
48191
  const snap = this.opts.snapshot();
48178
- const userPrompt = buildSurgeonPrompt(snap, failure, this.opts.resolveRoute);
48192
+ const userPrompt = buildSurgeonPrompt(snap, failure, this.opts.resolveRoute, this.opts.escalationRoute);
48179
48193
  const prompt = `${SURGEON_SYSTEM_PROMPT}
48180
48194
 
48181
48195
  ${userPrompt}`;
@@ -48231,7 +48245,8 @@ var SurgeonPi = class extends BaseObserver {
48231
48245
  piBin: opts.piBin ?? "pi",
48232
48246
  timeoutMs: opts.timeoutMs ?? 3e5,
48233
48247
  snapshot: opts.snapshot,
48234
- resolveRoute: opts.resolveRoute
48248
+ resolveRoute: opts.resolveRoute,
48249
+ escalationRoute: opts.escalationRoute
48235
48250
  };
48236
48251
  }
48237
48252
  async idle() {
@@ -48255,7 +48270,7 @@ var SurgeonPi = class extends BaseObserver {
48255
48270
  }
48256
48271
  async evaluateWithLlm(failure) {
48257
48272
  const snap = this.opts.snapshot();
48258
- const userPrompt = buildSurgeonPrompt(snap, failure, this.opts.resolveRoute);
48273
+ const userPrompt = buildSurgeonPrompt(snap, failure, this.opts.resolveRoute, this.opts.escalationRoute);
48259
48274
  const prompt = `${SURGEON_SYSTEM_PROMPT}
48260
48275
 
48261
48276
  ${userPrompt}`;
@@ -48552,16 +48567,20 @@ async function orchestrate(config) {
48552
48567
  return null;
48553
48568
  }
48554
48569
  } : void 0;
48570
+ const surgeonEscalationModel = config.surgeonModel ?? (surgeonLlm === "openai" ? "gpt-5.5" : surgeonLlm === "claude" ? "opus" : void 0);
48571
+ const escalationRoute = surgeonEscalationModel && !config.storyModel ? `${surgeonLlm}:${surgeonEscalationModel}` : void 0;
48555
48572
  if (surgeonLlm === "openai") {
48556
48573
  surgeon = new SurgeonOpenAI({
48557
48574
  snapshot,
48558
48575
  resolveRoute,
48576
+ escalationRoute,
48559
48577
  model: config.surgeonModel ?? "gpt-5.5"
48560
48578
  });
48561
48579
  } else if (surgeonLlm === "codex") {
48562
48580
  surgeon = new SurgeonCodex({
48563
48581
  snapshot,
48564
48582
  resolveRoute,
48583
+ escalationRoute,
48565
48584
  useLlm: config.surgeonUseLlm ?? true,
48566
48585
  model: config.surgeonModel
48567
48586
  });
@@ -48569,6 +48588,7 @@ async function orchestrate(config) {
48569
48588
  surgeon = new SurgeonOpenCode({
48570
48589
  snapshot,
48571
48590
  resolveRoute,
48591
+ escalationRoute,
48572
48592
  useLlm: config.surgeonUseLlm ?? true,
48573
48593
  model: config.surgeonModel
48574
48594
  });
@@ -48576,6 +48596,7 @@ async function orchestrate(config) {
48576
48596
  surgeon = new SurgeonPi({
48577
48597
  snapshot,
48578
48598
  resolveRoute,
48599
+ escalationRoute,
48579
48600
  useLlm: config.surgeonUseLlm ?? true,
48580
48601
  model: config.surgeonModel
48581
48602
  });
@@ -48583,6 +48604,7 @@ async function orchestrate(config) {
48583
48604
  surgeon = new Surgeon({
48584
48605
  snapshot,
48585
48606
  resolveRoute,
48607
+ escalationRoute,
48586
48608
  useLlm: config.surgeonUseLlm ?? false,
48587
48609
  model: config.surgeonModel ?? "opus"
48588
48610
  });