oh-my-opencode 5.0.0-beta.79 → 5.0.0-beta.80

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.
Files changed (96) hide show
  1. package/.agents/command/remove-deadcode.md +1 -1
  2. package/.agents/skills/hyperplan/SKILL.md +5 -5
  3. package/.agents/skills/remove-deadcode/SKILL.md +1 -1
  4. package/.agents/skills/security-research/SKILL.md +4 -4
  5. package/dist/cli/index.js +499 -336
  6. package/dist/cli-node/index.js +499 -336
  7. package/dist/config-migration/category-deep-split.d.ts +3 -0
  8. package/dist/config-migration/migration-plans.d.ts +1 -0
  9. package/dist/features/builtin-commands/templates/hyperplan.d.ts +1 -1
  10. package/dist/features/builtin-commands/templates/refactor-sections/team-mode-addendum.d.ts +1 -1
  11. package/dist/features/builtin-commands/templates/remove-ai-slops.d.ts +1 -1
  12. package/dist/index.js +282 -123
  13. package/dist/plugin-config/omo-config-chain.d.ts +1 -0
  14. package/dist/skills/debugging/references/methodology/02-investigate.md +5 -5
  15. package/dist/skills/refactor/SKILL.md +2 -2
  16. package/dist/skills/remove-ai-slops/SKILL.md +4 -4
  17. package/dist/skills/ulw-execute/SKILL.md +3 -2
  18. package/dist/skills/ulw-plan/references/full-workflow.md +1 -1
  19. package/dist/skills/ulw-research/SKILL.md +2 -2
  20. package/dist/tools/delegate-task/openai-categories.d.ts +6 -4
  21. package/dist/tui.js +146 -71
  22. package/package.json +14 -14
  23. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  24. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +77 -8
  25. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  26. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  27. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  28. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  29. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  30. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  31. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  32. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  33. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  34. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  35. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  36. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  37. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  38. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  39. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  40. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +63 -17
  41. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +63 -17
  42. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  43. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  44. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  45. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  46. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +1 -1
  47. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  48. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  49. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.js +3 -3
  50. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +14 -6
  51. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +2 -2
  52. package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.js +9 -1
  53. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  54. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  55. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-template.ts +3 -3
  56. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +2 -2
  57. package/packages/omo-codex/plugin/components/ulw-loop/src/surface.ts +9 -1
  58. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-template.test.ts +1 -1
  59. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +1 -1
  60. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-contract.test.ts +1 -1
  61. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  62. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  63. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  64. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  65. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  66. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  67. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  68. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  69. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  70. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  71. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  72. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  73. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  74. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  75. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  76. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  77. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  78. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  79. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  80. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  81. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  82. package/packages/omo-codex/plugin/package-lock.json +12 -12
  83. package/packages/omo-codex/plugin/package.json +1 -1
  84. package/packages/omo-codex/plugin/skills/debugging/references/methodology/02-investigate.md +5 -5
  85. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +2 -2
  86. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +4 -4
  87. package/packages/omo-codex/plugin/skills/ulw-execute/SKILL.md +3 -2
  88. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +1 -1
  89. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +2 -2
  90. package/packages/omo-codex/scripts/install-dist/install-local.mjs +167 -51
  91. package/packages/shared-skills/skills/debugging/references/methodology/02-investigate.md +5 -5
  92. package/packages/shared-skills/skills/refactor/SKILL.md +2 -2
  93. package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +4 -4
  94. package/packages/shared-skills/skills/ulw-execute/SKILL.md +3 -2
  95. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +1 -1
  96. package/packages/shared-skills/skills/ulw-research/SKILL.md +2 -2
package/dist/index.js CHANGED
@@ -19738,13 +19738,8 @@ var CATEGORY_MODEL_REQUIREMENTS = {
19738
19738
  { providers: ["openai", "openai-codex", "opencode"], model: "gpt-5.6-sol", variant: "max" }
19739
19739
  ]
19740
19740
  },
19741
- deep: {
19741
+ "deep-low": {
19742
19742
  fallbackChain: [
19743
- {
19744
- providers: ["openai", "openai-codex", "github-copilot", "opencode"],
19745
- model: "gpt-6-astra",
19746
- variant: "high"
19747
- },
19748
19743
  {
19749
19744
  providers: ["openai", "openai-codex", "github-copilot", "opencode"],
19750
19745
  model: "gpt-5.6-sol",
@@ -19752,6 +19747,15 @@ var CATEGORY_MODEL_REQUIREMENTS = {
19752
19747
  }
19753
19748
  ]
19754
19749
  },
19750
+ "deep-high": {
19751
+ fallbackChain: [
19752
+ {
19753
+ providers: ["openai", "openai-codex", "github-copilot", "opencode"],
19754
+ model: "gpt-6-astra",
19755
+ variant: "high"
19756
+ }
19757
+ ]
19758
+ },
19755
19759
  artistry: {
19756
19760
  fallbackChain: [
19757
19761
  {
@@ -19838,12 +19842,17 @@ var CATEGORY_MODEL_REQUIREMENTS = {
19838
19842
  {
19839
19843
  providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
19840
19844
  model: "claude-fable-5-1",
19841
- variant: "medium"
19845
+ variant: "low"
19842
19846
  },
19843
19847
  {
19844
19848
  providers: ["kimi-for-coding", "moonshotai", "opencode-go", "opencode"],
19845
19849
  model: "kimi-k3",
19846
- variant: "max"
19850
+ variant: "low"
19851
+ },
19852
+ {
19853
+ providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
19854
+ model: "claude-opus-4-6",
19855
+ variant: "low"
19847
19856
  }
19848
19857
  ]
19849
19858
  }
@@ -23212,6 +23221,65 @@ var OmoConfigLayerSchema = z14.object({
23212
23221
  legacy_migrations: z14.record(z14.string(), z14.unknown()).optional()
23213
23222
  }).strict();
23214
23223
 
23224
+ // packages/omo-config-core/src/schema/legacy-category-names.ts
23225
+ var LEGACY_CATEGORY_NAME_ALIASES = { deep: "deep-low" };
23226
+ function canonicalCategoryName(name) {
23227
+ return Object.hasOwn(LEGACY_CATEGORY_NAME_ALIASES, name) ? LEGACY_CATEGORY_NAME_ALIASES[name] : name;
23228
+ }
23229
+ function isRecord10(value) {
23230
+ return typeof value === "object" && value !== null && !Array.isArray(value);
23231
+ }
23232
+ function joinPath(path, segment) {
23233
+ return [...path, segment].join(".");
23234
+ }
23235
+ function canonicalizeCategoriesRecord(categories, path, renames) {
23236
+ const result = {};
23237
+ for (const [name, definition] of Object.entries(categories)) {
23238
+ const canonical = canonicalCategoryName(name);
23239
+ if (canonical === name) {
23240
+ result[name] = definition;
23241
+ continue;
23242
+ }
23243
+ const dropped = Object.hasOwn(categories, canonical);
23244
+ renames.push({ canonical, dropped, legacy: name, path: joinPath(path, name) });
23245
+ if (!dropped)
23246
+ result[canonical] = definition;
23247
+ }
23248
+ return result;
23249
+ }
23250
+ function canonicalizeValue(value, path, renames) {
23251
+ if (Array.isArray(value)) {
23252
+ return value.map((entry, index) => canonicalizeValue(entry, [...path, String(index)], renames));
23253
+ }
23254
+ if (!isRecord10(value))
23255
+ return value;
23256
+ const result = {};
23257
+ for (const [key, entry] of Object.entries(value)) {
23258
+ if (key === "categories" && isRecord10(entry)) {
23259
+ result[key] = canonicalizeCategoriesRecord(entry, [...path, key], renames);
23260
+ continue;
23261
+ }
23262
+ if (key === "category" && typeof entry === "string") {
23263
+ const canonical = canonicalCategoryName(entry);
23264
+ if (canonical !== entry) {
23265
+ renames.push({ canonical, dropped: false, legacy: entry, path: joinPath(path, key) });
23266
+ }
23267
+ result[key] = canonical;
23268
+ continue;
23269
+ }
23270
+ result[key] = canonicalizeValue(entry, [...path, key], renames);
23271
+ }
23272
+ return result;
23273
+ }
23274
+ function canonicalizeLegacyCategoryNames(document) {
23275
+ const renames = [];
23276
+ const canonicalized = isRecord10(document) ? canonicalizeValue(document, [], renames) : {};
23277
+ return { document: canonicalized, renames };
23278
+ }
23279
+ function hasLegacyCategoryNames(document) {
23280
+ return canonicalizeLegacyCategoryNames(document).renames.length > 0;
23281
+ }
23282
+
23215
23283
  // packages/omo-config-core/src/loader/loader.ts
23216
23284
  init_main();
23217
23285
 
@@ -23457,21 +23525,21 @@ function hasUnsafeUnrecognizedKey(issues) {
23457
23525
  function hasTamperedPrototype(value) {
23458
23526
  if (Array.isArray(value))
23459
23527
  return value.some((entry) => hasTamperedPrototype(entry));
23460
- if (!isRecord10(value))
23528
+ if (!isRecord11(value))
23461
23529
  return false;
23462
23530
  const prototype = Object.getPrototypeOf(value);
23463
23531
  if (prototype !== Object.prototype && prototype !== null)
23464
23532
  return true;
23465
23533
  return Object.values(value).some((entry) => hasTamperedPrototype(entry));
23466
23534
  }
23467
- function isRecord10(value) {
23535
+ function isRecord11(value) {
23468
23536
  return typeof value === "object" && value !== null && !Array.isArray(value);
23469
23537
  }
23470
23538
  function containerAt(record, path) {
23471
23539
  let container = record;
23472
23540
  for (const segment of path) {
23473
23541
  const next = container[segment];
23474
- if (!isRecord10(next))
23542
+ if (!isRecord11(next))
23475
23543
  return null;
23476
23544
  container = next;
23477
23545
  }
@@ -23573,6 +23641,15 @@ function readConfigSource(path, scope, fileSystem) {
23573
23641
  value: parsedRecord
23574
23642
  };
23575
23643
  }
23644
+ function legacyCategoryDiagnostic(path, renames) {
23645
+ const detail = renames.map((rename) => rename.dropped ? `${rename.path} ignored because ${rename.canonical} is also configured` : `${rename.path} renamed to ${rename.canonical}`).join(", ");
23646
+ return {
23647
+ kind: "deprecated-keys",
23648
+ message: `Deprecated category name in ${path}: ${detail}. Rename it; the alias is removed in a future release.`,
23649
+ path,
23650
+ issuePaths: renames.map((rename) => rename.path)
23651
+ };
23652
+ }
23576
23653
  function loadOmoConfig(options = {}) {
23577
23654
  const fileSystem = options.fileSystem ?? DEFAULT_READ_FILE_SYSTEM;
23578
23655
  const cwd = options.cwd ?? process.cwd();
@@ -23591,8 +23668,12 @@ function loadOmoConfig(options = {}) {
23591
23668
  if (loaded.diagnostic !== undefined)
23592
23669
  diagnostics.push(loaded.diagnostic);
23593
23670
  if (loaded.value !== undefined) {
23594
- layers.push({ config: loaded.value, source: loaded.source });
23595
- merged = mergeOmoConfigRecords(merged, loaded.value);
23671
+ const canonicalized = canonicalizeLegacyCategoryNames(loaded.value);
23672
+ if (canonicalized.renames.length > 0) {
23673
+ diagnostics.push(legacyCategoryDiagnostic(candidate.path, canonicalized.renames));
23674
+ }
23675
+ layers.push({ config: canonicalized.document, source: loaded.source });
23676
+ merged = mergeOmoConfigRecords(merged, canonicalized.document);
23596
23677
  }
23597
23678
  }
23598
23679
  const requestedProfile = resolveOmoProfileName({
@@ -24608,6 +24689,9 @@ function executePlan(input) {
24608
24689
  const existingSources = plan.sources.filter((source) => fileSystem.existsSync(source.path));
24609
24690
  const target = targetDocument(plan.targetPath, fileSystem);
24610
24691
  const replaceTarget = plan.mode === "replace-target";
24692
+ if (plan.shouldRun !== undefined && !plan.shouldRun(target)) {
24693
+ return { diagnostics: [], journalResumed, status: "skipped" };
24694
+ }
24611
24695
  if (!shouldRunMigration({
24612
24696
  legacySourcesExist: replaceTarget ? fileSystem.existsSync(plan.targetPath) : existingSources.length > 0,
24613
24697
  migrationId: plan.id,
@@ -25683,7 +25767,7 @@ function migrateRalphLoopConfig(config) {
25683
25767
  function validatePluginConfig(directory, environment = process.env) {
25684
25768
  const chain = loadOmoOpenCodeConfigChain(directory, environment);
25685
25769
  const views = chain.views.map((view) => parseConfigView(view.path, view.config));
25686
- const chainMessages = chain.diagnostics.map((diagnostic) => `${shortPath(diagnostic.path)}: ${diagnostic.message}`);
25770
+ const chainMessages = chain.diagnostics.filter((diagnostic) => diagnostic.kind !== "deprecated-keys").map((diagnostic) => `${shortPath(diagnostic.path)}: ${diagnostic.message}`);
25687
25771
  const messages = [...chainMessages, ...views.flatMap((view) => view.messages)];
25688
25772
  const firstFailingView = views.find((view) => view.messages.length > 0);
25689
25773
  const firstView = views[0];
@@ -26362,7 +26446,7 @@ ANTI-AI-SLOP RULES (NON-NEGOTIABLE):
26362
26446
  var KIMI_CATEGORIES = [
26363
26447
  {
26364
26448
  name: "writing",
26365
- config: { model: "anthropic/claude-fable-5-1", variant: "medium" },
26449
+ config: { model: "anthropic/claude-fable-5-1", variant: "low" },
26366
26450
  description: "Documentation, prose, technical writing",
26367
26451
  promptAppend: WRITING_CATEGORY_PROMPT_APPEND
26368
26452
  }
@@ -26410,14 +26494,24 @@ Success means:
26410
26494
 
26411
26495
  Whatever that check leaves unsettled goes in the answer as an open question with what would settle it. When the goal bundles independent problems, solve the one the others depend on and return the rest as separately delegable items.
26412
26496
  </Category_Context>`;
26413
- var DEEP_CATEGORY_PROMPT_APPEND_GPT_6_ASTRA = `<Category_Context name="deep">
26414
- The orchestrator routed this task here for depth: one goal, one deliverable, and the time to earn it. The exploration budget is generous: read every file involved, trace callers and dependencies in both directions, and fan out explore and librarian subagents in parallel for the questions a single read wave cannot answer, until you can explain the full mechanism you are about to change; an edit made before that point is the failure this category exists to prevent.
26415
-
26416
- **MUST USE \`deep\` FOR 3D GRAPHICS, COMPUTER USE, BROWSER USE, BACKEND, LOGIC, ALGORITHMS, CAPTCHA SOLVING, AND MULTIMODAL WORK.**
26497
+ var DEEP_HIGH_CATEGORY_PROMPT_APPEND_GPT = `<Category_Context name="deep-high">
26498
+ The orchestrator routed this task here because a decision in it cannot be settled from evidence alone: a trade-off, a contract other code depends on, a mechanism with no pattern to copy, or correctness that has to be argued. One goal, one deliverable, and the time to earn it. The exploration budget is generous: read every file involved, trace callers and dependencies in both directions, and fan out explore and librarian subagents in parallel for the questions a single read wave cannot answer, until you can explain the full mechanism you are about to change; an edit made before that point is the failure this category exists to prevent.
26417
26499
 
26418
26500
  The goal is the authorization. Choose how to reach it yourself, and when it lists numbered steps or phases, deliver all of them in this turn as one task; a proposal, a plan awaiting approval, a simplified version, or a proof of concept is unfinished work. When the steps turn out to be independent problems sharing no reasoning, do the one the goal centers on and return the others as separately delegable items with what you learned. A question ends your turn and hands the task back unfinished, so decide from context, record each assumption in the final message, and stop early only for a blocker you cannot route around: a missing secret, a decision only the user can make, or three materially different attempts that all failed.
26419
26501
 
26420
- Fix the cause: trace at least two levels above the symptom before settling, and prefer the change that makes the failure impossible over the guard that hides it. Depth means understanding the mechanism, so the diff stays as small as the fix allows; on greenfield work choose strong defaults and finish something you would hand to a senior engineer. Close with the delivered change, the evidence that it works, and the assumptions you made.
26502
+ Fix the cause: trace at least two levels above the symptom before settling, and prefer the change that makes the failure impossible over the guard that hides it. Depth means understanding the mechanism, so the diff stays as small as the fix allows; on greenfield work choose strong defaults and finish something you would hand to a senior engineer. Close with the delivered change, the evidence that it works, the decision you settled with the alternative you rejected, and the assumptions you made.
26503
+ </Category_Context>`;
26504
+ var DEEP_LOW_CATEGORY_PROMPT_APPEND_GPT = `<Category_Context name="deep-low">
26505
+ The orchestrator routed this task here as the default deep lane: one goal, one deliverable, decisions that the code, tests, and history can settle. Read until you can explain the mechanism you are about to change, including its callers, then act; fan out explore and librarian subagents when one read wave cannot answer a question.
26506
+
26507
+ Success means:
26508
+ - every step or phase the goal lists is delivered in this turn as one task; a plan awaiting approval, a simplified version, or a proof of concept is unfinished work;
26509
+ - the change removes the cause you traced, at least two levels above the symptom, with the diff as small as that fix allows;
26510
+ - the final message reports the change, the evidence that it works, and each assumption you decided from context, because a question ends your turn and returns the task unfinished.
26511
+
26512
+ Escalation is a complete result. When the correct choice turns out to depend on a trade-off the brief does not settle, on a contract other packages rely on, or on an argument about invariants you cannot verify by running something, stop before editing and return \`ESCALATE: deep-high\` as the first line, followed by what you read, the decision you could not settle, and the options you saw. A confident guess through that decision costs more than the escalation.
26513
+
26514
+ Stop the moment the success criteria hold; work past them is a defect. Stop early only for a blocker you cannot route around: a missing secret, a decision only the user can make, or three materially different attempts that all failed.
26421
26515
  </Category_Context>`;
26422
26516
  var UNSPECIFIED_HIGH_CATEGORY_PROMPT_APPEND_GPT_6_ASTRA = `<Category_Context name="unspecified-high">
26423
26517
  The orchestrator routed this task here because it spans systems or modules and fits no specialist category, so breadth of consideration is what this category buys. Before committing to an approach, survey the whole surface the change touches: every caller and consumer of what you will modify, sibling modules that implement the same pattern, the tests, docs, schemas, config, scripts, and CI that encode the current behavior, and the history of the area (git log and blame) for the reasons it is shaped this way. Fan out explore and librarian subagents in parallel when that surface is wider than one read wave covers.
@@ -26445,65 +26539,40 @@ Response format:
26445
26539
  - Action plan (numbered steps)
26446
26540
  - Risks and mitigations (if relevant)
26447
26541
  </Category_Context>`;
26448
- var DEEP_CATEGORY_PROMPT_APPEND = `<Category_Context>
26449
- You are working on GOAL-ORIENTED AUTONOMOUS tasks.
26450
-
26451
- You are NOT an interactive assistant. You are an autonomous problem-solver.
26452
-
26453
- **MUST USE \`deep\` FOR 3D GRAPHICS, COMPUTER USE, BROWSER USE, BACKEND, LOGIC, ALGORITHMS, CAPTCHA SOLVING, AND MULTIMODAL WORK.**
26454
-
26455
- BEFORE making ANY changes:
26456
- 1. Silently explore the codebase extensively (5-15 minutes of reading is normal)
26457
- 2. Read related files, trace dependencies, understand the full context
26458
- 3. Build a complete mental model of the problem space
26459
- 4. Do not ask clarifying questions - the goal is already defined
26542
+ var DEEP_LOW_CATEGORY_PROMPT_APPEND = `<Category_Context name="deep-low">
26543
+ You are working on a GOAL-ORIENTED AUTONOMOUS task: one goal, one deliverable, decisions the codebase can settle.
26460
26544
 
26461
- You receive a GOAL. When the goal includes numbered steps or phases, treat them as one atomic task broken into sub-steps, not as separate independent tasks. Figure out HOW to achieve it yourself. Thorough research before any action.
26545
+ Before any change, read the files involved and trace their dependencies until you can explain the mechanism you are about to modify. The goal is already defined: do not ask clarifying questions; make reasonable assumptions, record them in the final message, and proceed.
26462
26546
 
26463
- Sub-steps of ONE goal = execute all steps as phases of one atomic task.
26464
- Genuinely independent tasks = flag and refuse, require separate delegations.
26547
+ When the goal lists numbered steps or phases, execute all of them in this turn as one atomic task. Genuinely independent tasks bundled into one goal: flag them and do only the one the goal centers on.
26465
26548
 
26466
- Approach: explore extensively, understand deeply, then act decisively. Prefer comprehensive solutions over quick patches. If the goal is unclear, make reasonable assumptions and proceed.
26549
+ Escalation is a complete result. When the correct choice depends on a trade-off the brief does not settle, a contract other packages rely on, or an argument about invariants you cannot verify by running something, stop before editing and return \`ESCALATE: deep-high\` as the first line, followed by what you read, the decision you could not settle, and the options you saw.
26467
26550
 
26468
- Minimal status updates. Focus on results, not play-by-play. Report completion with summary of changes.
26551
+ Prefer the fix that removes the cause over the patch that hides the symptom. Report completion with the changes made and the evidence they work.
26469
26552
  </Category_Context>`;
26470
- var DEEP_CATEGORY_PROMPT_APPEND_GPT_5_5 = `<Category_Context name="deep">
26471
- You are operating in DEEP mode. This is the category reserved for goal-oriented autonomous work on hairy problems that reward thorough exploration and comprehensive solutions.
26472
-
26473
- **MUST USE \`deep\` FOR 3D GRAPHICS, COMPUTER USE, BROWSER USE, BACKEND, LOGIC, ALGORITHMS, CAPTCHA SOLVING, AND MULTIMODAL WORK.**
26474
-
26475
- The orchestrator chose this category because the task benefits from depth over speed. You should feel empowered to spend the time needed: five to fifteen minutes of silent exploration before the first edit is normal and correct. Rushing to implementation on a deep task is a failure mode, not a feature.
26476
-
26477
- # How deep mode adjusts the base behavior
26478
-
26479
- **Exploration budget: generous.** Read the files you need, trace dependencies both directions, fire 2-5 explore/librarian sub-agents in parallel for broader questions. Build a complete mental model before the first \`apply_patch\`. Exploration here is an investment, not overhead.
26553
+ var DEEP_HIGH_CATEGORY_PROMPT_APPEND = `<Category_Context name="deep-high">
26554
+ You are working on a GOAL-ORIENTED AUTONOMOUS task that was escalated here because a decision in it cannot be settled from evidence alone: a trade-off, a contract other code depends on, a mechanism with no pattern to copy, or correctness that has to be argued.
26480
26555
 
26481
- **Goal, not plan.** You receive a GOAL describing the desired outcome. You figure out HOW to achieve it. The orchestrator deliberately did not hand you a step-by-step plan; producing one and asking for approval is not what was asked. Execute.
26556
+ Before any change, read the files involved and trace their dependencies until you can explain the mechanism you are about to modify. The goal is already defined: do not ask clarifying questions; make reasonable assumptions, record them in the final message, and proceed.
26482
26557
 
26483
- **Atomic task treatment.** When the goal contains numbered steps or phases, treat them as sub-steps of ONE task and execute them all in this turn. Splitting them across turns is wrong unless they reveal an architectural blocker that requires the user's input. If the "steps" turn out to be genuinely independent tasks that should have been separate delegations, flag that in your final message and refuse the ones beyond scope.
26558
+ When the goal lists numbered steps or phases, execute all of them in this turn as one atomic task. Genuinely independent tasks bundled into one goal: flag them and do only the one the goal centers on.
26484
26559
 
26485
- **Root cause bias.** Prefer root-cause fixes over symptom fixes. A null check around \`foo()\` is a symptom fix; fixing whatever causes \`foo()\` to return unexpected values is the root fix. Trace at least two levels up before settling on an answer. In deep mode, you have permission (and the expectation) to do the deeper fix.
26486
-
26487
- **Ambition scaled to context.** For brand-new greenfield work, be ambitious. Choose strong defaults, avoid AI-slop aesthetics, produce something you would be proud to hand to another senior engineer. For changes in an existing codebase, be surgical and respect the existing patterns; depth does not mean invasiveness.
26488
-
26489
- **Completion bar: full delivery.** "Simplified version", "proof of concept", and "you can extend this later" are not acceptable deliveries for a deep task. The orchestrator routed here specifically for a complete solution. If you hit a genuine blocker (missing secret, design decision only the user can make, three materially different attempts all failed), document it and return; otherwise, finish the task.
26490
-
26491
- **Status cadence: sparse.** The user is not on the other side of this conversation; the orchestrator is, and they will synthesize your progress. Send commentary only at meaningful phase transitions (starting exploration, starting implementation, starting verification, hitting a genuine blocker). Do not narrate every tool call; silence during focused work is expected.
26560
+ Prefer the fix that removes the cause over the patch that hides the symptom. Report completion with the changes made, the evidence they work, and the decision you settled with the alternative you rejected.
26492
26561
  </Category_Context>`;
26562
+ function isGptDeepLaneModel(model) {
26563
+ return model !== undefined && (isGpt6Model(model) || isGpt5_5Model(model) || isGpt5_6Model(model));
26564
+ }
26493
26565
  function resolveUltrabrainCategoryPromptAppend(model) {
26494
26566
  if (model && isGpt6Model(model)) {
26495
26567
  return ULTRABRAIN_CATEGORY_PROMPT_APPEND_GPT_6_ASTRA;
26496
26568
  }
26497
26569
  return ULTRABRAIN_CATEGORY_PROMPT_APPEND;
26498
26570
  }
26499
- function resolveDeepCategoryPromptAppend(model) {
26500
- if (model && isGpt6Model(model)) {
26501
- return DEEP_CATEGORY_PROMPT_APPEND_GPT_6_ASTRA;
26502
- }
26503
- if (model && (isGpt5_5Model(model) || isGpt5_6Model(model))) {
26504
- return DEEP_CATEGORY_PROMPT_APPEND_GPT_5_5;
26505
- }
26506
- return DEEP_CATEGORY_PROMPT_APPEND;
26571
+ function resolveDeepLowCategoryPromptAppend(model) {
26572
+ return isGptDeepLaneModel(model) ? DEEP_LOW_CATEGORY_PROMPT_APPEND_GPT : DEEP_LOW_CATEGORY_PROMPT_APPEND;
26573
+ }
26574
+ function resolveDeepHighCategoryPromptAppend(model) {
26575
+ return isGptDeepLaneModel(model) ? DEEP_HIGH_CATEGORY_PROMPT_APPEND_GPT : DEEP_HIGH_CATEGORY_PROMPT_APPEND;
26507
26576
  }
26508
26577
  function resolveUnspecifiedHighCategoryPromptAppend(model) {
26509
26578
  if (model && isGpt6Model(model)) {
@@ -26535,7 +26604,10 @@ var UNSPECIFIED_HIGH_CATEGORY_PROMPT_APPEND = `<Category_Context>
26535
26604
  You are working on tasks that don't fit specific categories but require substantial effort.
26536
26605
  </Category_Context>`;
26537
26606
  var UNSPECIFIED_HIGH_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Use only when no specialist category fits and substantial effort spans systems/modules with broad impact. Use unspecified-low for contained moderate work.</Selection_Gate>`;
26538
- var GPT_FLAGSHIP_GATE_MODELS = ["gpt-6-astra", "gpt-5.6-sol"];
26607
+ var DEEP_LOW_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Route here when one subsystem plus its callers holds the mechanism and the evidence, once read, leaves one right answer. Wide but mechanical work belongs here or in a quick batch. When unsure, choose deep-low: a misrouted child returns \`ESCALATE: deep-high\` after one cheap attempt; re-spawn the same brief as deep-high with its findings.</Selection_Gate>`;
26608
+ var DEEP_HIGH_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Route here only when you can name the decision evidence cannot settle: a trade-off with no single right answer, a contract change crossing a package or process boundary, a mechanism with no in-repo pattern to copy, or correctness argued from invariants rather than observed in a test. Wide scope with easy decisions is deep-low or unspecified-high; reasoning as the deliverable is ultrabrain.</Selection_Gate>`;
26609
+ var DEEP_LOW_GATE_MODEL = "gpt-5.6-sol";
26610
+ var DEEP_HIGH_GATE_MODEL = "gpt-6-astra";
26539
26611
  var OPENAI_CATEGORIES = [
26540
26612
  {
26541
26613
  name: "ultrabrain",
@@ -26545,12 +26617,22 @@ var OPENAI_CATEGORIES = [
26545
26617
  resolvePromptAppend: resolveUltrabrainCategoryPromptAppend
26546
26618
  },
26547
26619
  {
26548
- name: "deep",
26620
+ name: "deep-low",
26621
+ config: { model: "openai/gpt-5.6-sol", variant: "medium" },
26622
+ description: "Default deep lane: one goal, one deliverable, decisions the child can settle from what it reads. **3D graphics, computer/browser use, CAPTCHA, multimodal, backend, logic, and algorithm work is routed here.** Multiple goals fan out as parallel calls.",
26623
+ callerGuidance: DEEP_LOW_CATEGORY_CALLER_GUIDANCE,
26624
+ promptAppend: DEEP_LOW_CATEGORY_PROMPT_APPEND,
26625
+ resolvePromptAppend: resolveDeepLowCategoryPromptAppend,
26626
+ requiresModel: DEEP_LOW_GATE_MODEL
26627
+ },
26628
+ {
26629
+ name: "deep-high",
26549
26630
  config: { model: "openai/gpt-6-astra", variant: "high" },
26550
- description: "**MANDATORY: USE deep FOR 3D GRAPHICS, COMPUTER USE, BROWSER USE, BACKEND, LOGIC, ALGORITHMS, CAPTCHA SOLVING, AND MULTIMODAL WORK.** Deep autonomous problem-solving for complex research. ONE goal + ONE deliverable per call \u2014 multiple goals must fan out as parallel `deep` calls, never bundled into one.",
26551
- promptAppend: DEEP_CATEGORY_PROMPT_APPEND,
26552
- resolvePromptAppend: resolveDeepCategoryPromptAppend,
26553
- requiresModel: GPT_FLAGSHIP_GATE_MODELS
26631
+ description: "Escalation deep lane: a goal whose central decision cannot be settled from evidence alone. Same one-goal, one-deliverable contract as deep-low.",
26632
+ callerGuidance: DEEP_HIGH_CATEGORY_CALLER_GUIDANCE,
26633
+ promptAppend: DEEP_HIGH_CATEGORY_PROMPT_APPEND,
26634
+ resolvePromptAppend: resolveDeepHighCategoryPromptAppend,
26635
+ requiresModel: DEEP_HIGH_GATE_MODEL
26554
26636
  },
26555
26637
  {
26556
26638
  name: "quick",
@@ -96713,7 +96795,7 @@ function getCachedVersion(options = {}) {
96713
96795
  // package.json
96714
96796
  var package_default = {
96715
96797
  name: "oh-my-opencode",
96716
- version: "5.0.0-beta.79",
96798
+ version: "5.0.0-beta.80",
96717
96799
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
96718
96800
  main: "./dist/index.js",
96719
96801
  types: "dist/index.d.ts",
@@ -96895,7 +96977,7 @@ var package_default = {
96895
96977
  zod: "^4.4.3"
96896
96978
  },
96897
96979
  devDependencies: {
96898
- "@code-yeongyu/senpi": "2026.9.19-2",
96980
+ "@code-yeongyu/senpi": "2026.9.20",
96899
96981
  "@oh-my-opencode/agents-md-core": "workspace:*",
96900
96982
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
96901
96983
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -96934,18 +97016,18 @@ var package_default = {
96934
97016
  typescript: "^7.0.2"
96935
97017
  },
96936
97018
  optionalDependencies: {
96937
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.79",
96938
- "oh-my-opencode-darwin-x64": "5.0.0-beta.79",
96939
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.79",
96940
- "oh-my-opencode-linux-arm64": "5.0.0-beta.79",
96941
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.79",
96942
- "oh-my-opencode-linux-x64": "5.0.0-beta.79",
96943
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.79",
96944
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.79",
96945
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.79",
96946
- "oh-my-opencode-windows-arm64": "5.0.0-beta.79",
96947
- "oh-my-opencode-windows-x64": "5.0.0-beta.79",
96948
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.79"
97019
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.80",
97020
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.80",
97021
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.80",
97022
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.80",
97023
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.80",
97024
+ "oh-my-opencode-linux-x64": "5.0.0-beta.80",
97025
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.80",
97026
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.80",
97027
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.80",
97028
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.80",
97029
+ "oh-my-opencode-windows-x64": "5.0.0-beta.80",
97030
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.80"
96949
97031
  },
96950
97032
  overrides: {
96951
97033
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -97762,6 +97844,16 @@ function transformReasoningUnification(document) {
97762
97844
  };
97763
97845
  }
97764
97846
 
97847
+ // packages/omo-opencode/src/config-migration/category-deep-split.ts
97848
+ var CATEGORY_DEEP_SPLIT_MIGRATION_ID = "2026-09-category-deep-split";
97849
+ function transformCategoryDeepSplit(document) {
97850
+ const { document: canonicalized, renames } = canonicalizeLegacyCategoryNames(document);
97851
+ return {
97852
+ diagnostics: renames.map((rename) => rename.dropped ? `${rename.path} removed: ${rename.canonical} is already configured` : `${rename.path} renamed to ${rename.canonical}`),
97853
+ document: canonicalized
97854
+ };
97855
+ }
97856
+
97765
97857
  // packages/omo-opencode/src/config-migration/migration-plans.ts
97766
97858
  function backupTimestamp(value) {
97767
97859
  return value ?? new Date().toISOString().replace(/[:.]/g, "-");
@@ -97828,6 +97920,18 @@ function reasoningPlan(targetPath) {
97828
97920
  transform: inspect
97829
97921
  };
97830
97922
  }
97923
+ function categoryDeepSplitPlan(targetPath) {
97924
+ const inspect = (sources) => transformCategoryDeepSplit(sources[0]?.value);
97925
+ return {
97926
+ id: CATEGORY_DEEP_SPLIT_MIGRATION_ID,
97927
+ inspect,
97928
+ mode: "replace-target",
97929
+ shouldRun: hasLegacyCategoryNames,
97930
+ sources: [],
97931
+ targetPath,
97932
+ transform: inspect
97933
+ };
97934
+ }
97831
97935
  function existingOmoConfigPath(directory, options) {
97832
97936
  const fileSystem = discoveryFileSystem(options);
97833
97937
  for (const fileName of ["omo.jsonc", "omo.json"]) {
@@ -97887,7 +97991,12 @@ function createLegacyConfigMigrationPlans(options) {
97887
97991
  }
97888
97992
  for (const plan of legacyPlans)
97889
97993
  addReasoningTarget(plan.targetPath);
97890
- return [...legacyPlans, ...[...reasoningTargets.values()].map(reasoningPlan)];
97994
+ const inPlaceTargets = [...reasoningTargets.values()];
97995
+ return [
97996
+ ...legacyPlans,
97997
+ ...inPlaceTargets.map(reasoningPlan),
97998
+ ...inPlaceTargets.map(categoryDeepSplitPlan)
97999
+ ];
97891
98000
  }
97892
98001
  // packages/omo-opencode/src/startup-migration.ts
97893
98002
  function homeDirectory(options) {
@@ -100105,7 +100214,7 @@ Everything else is parallel. Fire one \`task()\` per independent checkbox in the
100105
100214
 
100106
100215
  \`\`\`typescript
100107
100216
  task(category="quick", load_skills=[], run_in_background=false, prompt="...task A...")
100108
- task(category="deep", load_skills=["programming"], run_in_background=false, prompt="...task B...")
100217
+ task(category="deep-low", load_skills=["programming"], run_in_background=false, prompt="...task B...")
100109
100218
  task(category="quick", load_skills=["git-master"], run_in_background=false, prompt="...task C...")
100110
100219
  \`\`\`
100111
100220
 
@@ -105401,7 +105510,7 @@ REQUIRED NOW:
105401
105510
  - Ask Oracle to verify whether the original task is actually complete
105402
105511
  - Include the original task in the Oracle request
105403
105512
  - Explicitly tell Oracle to review skeptically and critically, and to look for reasons the task may still be incomplete or wrong
105404
- - If the Oracle spawn fails because its model/agent is unavailable, spawn a verifier with the identical verification instructions using task(category: "deep", load_skills=[], run_in_background=false, ...), then retry with category: "unspecified-high", then category: "unspecified-low" on the same failure; require its reply to end with the literal line \`Agent: gate-verifier\` immediately above the promise tag
105513
+ - If the Oracle spawn fails because its model/agent is unavailable, spawn a verifier with the identical verification instructions using task(category: "deep-high", load_skills=[], run_in_background=false, ...), then retry with category: "deep-low", then category: "unspecified-high", then category: "unspecified-low" on the same failure; require its reply to end with the literal line \`Agent: gate-verifier\` immediately above the promise tag
105405
105514
  - The system will inspect the Oracle session directly for the verification result
105406
105515
  - If Oracle does not verify, continue fixing the task and do not consider it complete
105407
105516
 
@@ -105417,7 +105526,7 @@ REQUIRED NOW:
105417
105526
  - Do not claim completion early or argue with the failed verification
105418
105527
  - After fixing the remaining issues, request Oracle review again using task(subagent_type="oracle", load_skills=[], run_in_background=false, ...)
105419
105528
  - Include the original task in the Oracle request and tell Oracle to review skeptically and critically
105420
- - If the Oracle spawn fails because its model/agent is unavailable, spawn a verifier with the identical verification instructions using task(category: "deep", load_skills=[], run_in_background=false, ...), then retry with category: "unspecified-high", then category: "unspecified-low" on the same failure; require its reply to end with the literal line \`Agent: gate-verifier\` immediately above the promise tag
105529
+ - If the Oracle spawn fails because its model/agent is unavailable, spawn a verifier with the identical verification instructions using task(category: "deep-high", load_skills=[], run_in_background=false, ...), then retry with category: "deep-low", then category: "unspecified-high", then category: "unspecified-low" on the same failure; require its reply to end with the literal line \`Agent: gate-verifier\` immediately above the promise tag
105421
105530
  - Only when the work is ready for review again, output: <promise>{{PROMISE}}</promise>
105422
105531
 
105423
105532
  Original task:
@@ -110385,7 +110494,7 @@ Read the Team Staffing Recommendation from Phase 4. If any required field is mis
110385
110494
 
110386
110495
  Then choose the path:
110387
110496
 
110388
- - **Team path (5.1-T)**: when the plan recommends \`team\` AND \`file_independent_steps >= 3\`. Members execute in parallel, Lead orchestrates, a \`deep\` verifier lives outside the team.
110497
+ - **Team path (5.1-T)**: when the plan recommends \`team\` AND \`file_independent_steps >= 3\`. Members execute in parallel, Lead orchestrates, a \`deep-high\` verifier lives outside the team.
110389
110498
  - **Legacy path (5.1-L)**: otherwise. Use the original 5.1 / 5.2 / 5.3 flow from above.
110390
110499
 
110391
110500
  Record the chosen path in the TodoWrite list.
@@ -110423,7 +110532,7 @@ Record the chosen path in the TodoWrite list.
110423
110532
 
110424
110533
  Rationale for this composition:
110425
110534
  - **4 workers = team mode's parallel cap.** 5+ just queues.
110426
- - **No verifier team member.** Verification needs \`deep\` reasoning (or \`unspecified-high\` fallback). In-team category routing downcasts to sisyphus-junior, which is weaker than required \u2014 the verifier runs OUTSIDE the team as a \`task(category="deep")\`.
110535
+ - **No verifier team member.** Verification needs \`deep-high\` reasoning (or \`unspecified-high\` fallback). In-team category routing downcasts to sisyphus-junior, which is weaker than required \u2014 the verifier runs OUTSIDE the team as a \`task(category="deep-high")\`.
110427
110536
  - **quick \xD7 2** for mechanical edits, **unspecified-low \xD7 2** for reasoning edits \u2014 mirrors the plan's split.
110428
110537
 
110429
110538
  **Team lifecycle** (one team, reused until Phase 6 cleanup):
@@ -110455,14 +110564,14 @@ While any team task is \`pending | claimed | in_progress\`:
110455
110564
  - On a worker completion report, immediately dispatch an **external verifier** \u2014 verification runs OUTSIDE the team because team-member category routing downcasts to sisyphus-junior:
110456
110565
  \`\`\`
110457
110566
  task(
110458
- category="deep",
110567
+ category="deep-high",
110459
110568
  load_skills=[],
110460
110569
  run_in_background=true,
110461
110570
  description="verify step <N>",
110462
110571
  prompt=<files touched + verify-spec commands + instruction to return "PASS" or "FAIL:<failing test + specific error + suggested revert hunks>">
110463
110572
  )
110464
110573
  \`\`\`
110465
- If \`deep\` is unavailable, fall back to \`category="unspecified-high"\`. Do not create a commit checkpoint until the verifier returns PASS.
110574
+ If \`deep-high\` is unavailable, fall back to \`category="unspecified-high"\`. Do not create a commit checkpoint until the verifier returns PASS.
110466
110575
  - On a verifier PASS: make the commit checkpoint for that step (see original 5.3). Proceed.
110467
110576
  - On a verifier FAIL: Lead decides:
110468
110577
  - **Retry with fix hint**: \`team_task_update(status=pending)\` on the original step + \`team_send_message(teamRunId=<id>, to=<original member>, summary="retry", body=<specific failure from verifier>)\`. Runtime reassigns.
@@ -110489,7 +110598,7 @@ Append to the 6.6 summary a "Dispatch path" line and, when team path was used, t
110489
110598
  - Do not inline the Intent Card or verify-spec into task descriptions \u2014 rely on the broadcasts.
110490
110599
  - Do not recreate the team mid-session.
110491
110600
  - Do not run tests from Lead \u2014 the external verifier owns that lane.
110492
- - Do not put \`oracle\` / \`librarian\` / \`deep\` into the team spec \u2014 oracle/librarian are team-ineligible, and \`deep\` under category routing downcasts to sisyphus-junior. Use them via \`task()\` outside the team when needed.
110601
+ - Do not put \`oracle\` / \`librarian\` / a deep lane into the team spec \u2014 oracle/librarian are team-ineligible, and a deep lane under category routing downcasts to sisyphus-junior. Use them via \`task()\` outside the team when needed.
110493
110602
  `;
110494
110603
 
110495
110604
  // packages/omo-opencode/src/features/builtin-commands/templates/refactor.ts
@@ -110988,7 +111097,7 @@ Team mode is enabled for this session. The rules below **override Phase 2-4** of
110988
111097
 
110989
111098
  Rationale for this composition:
110990
111099
  - **4 workers = team mode's parallel cap.** A fifth member just queues.
110991
- - **Reviewer is NOT a team member** \u2014 review demands stronger reasoning than category routing provides (team category members are downcast to sisyphus-junior). The reviewer runs OUTSIDE the team as a \`deep\` task; see Phase 3.
111100
+ - **Reviewer is NOT a team member** \u2014 review demands stronger reasoning than category routing provides (team category members are downcast to sisyphus-junior). The reviewer runs OUTSIDE the team as a \`deep-high\` task; see Phase 3.
110992
111101
  - **quick \xD7 3** absorbs the mass of per-file slop removal. **unspecified-low \xD7 1** is the rework lane for fixes triggered by reviewer findings.
110993
111102
 
110994
111103
  **Team lifecycle** (create once, reuse until Phase 5 cleanup):
@@ -111015,14 +111124,14 @@ While any team task is \`pending | claimed | in_progress\`:
111015
111124
  - Immediately dispatch an **external reviewer** \u2014 review runs OUTSIDE the team because team-member category routing downcasts to sisyphus-junior:
111016
111125
  \`\`\`
111017
111126
  task(
111018
- category="deep",
111127
+ category="deep-high",
111019
111128
  load_skills=[],
111020
111129
  run_in_background=true,
111021
111130
  description="slop review: <file>",
111022
111131
  prompt=<file path + full worker report + Safety/Behavior/Quality checklist + instruction to output "PASS" or "FAIL:<per-hunk rollback instructions>">
111023
111132
  )
111024
111133
  \`\`\`
111025
- If \`deep\` is unavailable in this session, fall back to \`category="unspecified-high"\`.
111134
+ If \`deep-high\` is unavailable in this session, fall back to \`category="unspecified-high"\`.
111026
111135
  - On a reviewer task returning FAIL:
111027
111136
  - Create a rework team task: \`team_task_create(subject="rework: <file>", description=<reverse-patch hunks from reviewer + "then run $omo:remove-ai-slops on remaining non-rolled-back issues only">)\`. The \`unspecified-low\` fix member claims it.
111028
111137
  - Create a new reviewer task paired to the rework completion (same incremental pattern).
@@ -111061,7 +111170,7 @@ skill(name="hyperplan")
111061
111170
 
111062
111171
  After loading the skill, follow its 7-phase workflow EXACTLY using this user request.
111063
111172
 
111064
- Roster contract: call \`team_create\` with category members \`unspecified-low\`, \`unspecified-high\`, \`ultrabrain\`, and \`artistry\`. Include \`deep\` only if the category is enabled; if \`deep\` is disabled or unavailable, retry without only that member and state the degraded roster.
111173
+ Roster contract: call \`team_create\` with category members \`unspecified-low\`, \`unspecified-high\`, \`ultrabrain\`, and \`artistry\`. Include \`deep-low\` only if the category is enabled; if \`deep-low\` is disabled or unavailable, retry without only that member and state the degraded roster.
111065
111174
 
111066
111175
  <user-request>
111067
111176
  $ARGUMENTS
@@ -131047,8 +131156,9 @@ function categoryResolutionError(error) {
131047
131156
  }
131048
131157
  async function resolveCategoryExecution(args, executorCtx, inheritedModel, systemDefaultModel) {
131049
131158
  const { client, userCategories, sisyphusJuniorModel } = executorCtx;
131050
- const categoryName = args.category;
131051
131159
  const enabledCategories = mergeCategories(userCategories);
131160
+ const requestedCategoryName = args.category;
131161
+ const categoryName = enabledCategories[requestedCategoryName] !== undefined ? requestedCategoryName : canonicalCategoryName(requestedCategoryName);
131052
131162
  const categoryExists = enabledCategories[categoryName] !== undefined;
131053
131163
  if (!categoryExists) {
131054
131164
  const allCategoryNames = Object.keys(enabledCategories).join(", ");
@@ -152711,7 +152821,7 @@ Plan Agent returns a structured work breakdown with parallel execution opportuni
152711
152821
  }
152712
152822
  function buildParallelDelegationSection(model, categories) {
152713
152823
  const isNonClaude = !model.toLowerCase().includes("claude");
152714
- const hasDelegationCategory = categories.some((category) => category.name === "deep" || category.name === "unspecified-high");
152824
+ const hasDelegationCategory = categories.some((category) => category.name === "deep-low" || category.name === "deep-high" || category.name === "unspecified-high");
152715
152825
  if (!isNonClaude || !hasDelegationCategory) {
152716
152826
  return "";
152717
152827
  }
@@ -152722,7 +152832,7 @@ function buildParallelDelegationSection(model, categories) {
152722
152832
  **MANDATORY - for ANY implementation task:**
152723
152833
 
152724
152834
  1. **ALWAYS decompose** the task into independent work units. No exceptions. Even if the task "feels small", decompose it.
152725
- 2. **ALWAYS delegate** EACH unit to a \`deep\` or \`unspecified-high\` agent in parallel (\`run_in_background=true\`).
152835
+ 2. **ALWAYS delegate** EACH unit to a \`deep-low\` or \`unspecified-high\` agent in parallel (\`run_in_background=true\`); reserve \`deep-high\` for a unit whose central decision cannot be settled from evidence.
152726
152836
  3. **NEVER work sequentially.** If 4 independent units exist, spawn 4 agents simultaneously. Not 1 at a time. Not 2 then 2.
152727
152837
  4. **NEVER implement directly** when delegation is possible. You write prompts, not code.
152728
152838
 
@@ -152858,7 +152968,8 @@ task(category="quick", load_skills=[], run_in_background=true, prompt="Redesign
152858
152968
  |---|---|
152859
152969
  | Visual design, UI, styling, animations, layout, design systems | \`visual-engineering\` |
152860
152970
  | Hard logic and architecture decisions | \`ultrabrain\` |
152861
- | 3D graphics, computer use, browser use, backend, logic, algorithms, CAPTCHA solving, multimodal, autonomous research + end-to-end implementation | \`deep\` |
152971
+ | 3D graphics, computer use, browser use, backend, logic, algorithms, CAPTCHA solving, multimodal, autonomous research + end-to-end implementation | \`deep-low\` |
152972
+ | Any of the above whose central decision cannot be settled from evidence: a trade-off, a contract crossing a package boundary, a mechanism with no in-repo pattern, correctness argued from invariants | \`deep-high\` |
152862
152973
  | Single-file typo, trivial config change | \`quick\` |
152863
152974
 
152864
152975
  **When in doubt about category, it is almost never \`quick\` or \`unspecified-*\`. Match the domain.**`;
@@ -156332,7 +156443,7 @@ Don't narrate every tool call, but don't go silent for long stretches on complex
156332
156443
 
156333
156444
  ## task (delegation)
156334
156445
 
156335
- \`task()\` is your primary lever. Use it to invoke specialist agents (\`subagent_type="oracle"|"metis"|"momus"|"explore"|"librarian"\`) or to delegate implementation to categories (\`category="visual-engineering"|"deep"|"ultrabrain"|"quick"|...\`). Every invocation needs \`load_skills\` (empty array \`[]\` is valid when no skills apply).
156446
+ \`task()\` is your primary lever. Use it to invoke specialist agents (\`subagent_type="oracle"|"metis"|"momus"|"explore"|"librarian"\`) or to delegate implementation to categories (\`category="visual-engineering"|"deep-low"|"deep-high"|"ultrabrain"|"quick"|...\`). Every invocation needs \`load_skills\` (empty array \`[]\` is valid when no skills apply).
156336
156447
 
156337
156448
  Parameters to always think about:
156338
156449
 
@@ -174068,7 +174179,7 @@ function parseWindowsProcessTable(output) {
174068
174179
  const entries = Array.isArray(parsed) ? parsed : parsed === undefined ? [] : [parsed];
174069
174180
  const processes = [];
174070
174181
  for (const entry of entries) {
174071
- if (!isRecord11(entry))
174182
+ if (!isRecord12(entry))
174072
174183
  continue;
174073
174184
  const pid = numberField(entry, "ProcessId");
174074
174185
  const ppid = numberField(entry, "ParentProcessId");
@@ -174102,7 +174213,7 @@ function stringField(record, key) {
174102
174213
  const value = record[key];
174103
174214
  return typeof value === "string" ? value : undefined;
174104
174215
  }
174105
- function isRecord11(value) {
174216
+ function isRecord12(value) {
174106
174217
  return typeof value === "object" && value !== null;
174107
174218
  }
174108
174219
 
@@ -174206,7 +174317,7 @@ async function attestLspDaemonOwner(target, deps = {}) {
174206
174317
  }
174207
174318
  }
174208
174319
  function parseLspDaemonOwner(value) {
174209
- if (!isRecord12(value))
174320
+ if (!isRecord13(value))
174210
174321
  return null;
174211
174322
  const pid = value["pid"];
174212
174323
  const nonce = value["nonce"];
@@ -174218,7 +174329,7 @@ function parseLspDaemonOwner(value) {
174218
174329
  return null;
174219
174330
  if (typeof startedAt !== "string" || startedAt.length === 0)
174220
174331
  return null;
174221
- if (!isRecord12(endpoint))
174332
+ if (!isRecord13(endpoint))
174222
174333
  return null;
174223
174334
  const kind = endpoint["kind"];
174224
174335
  const path = endpoint["path"];
@@ -174270,7 +174381,7 @@ async function pingLspDaemonOwner(endpoint, authToken) {
174270
174381
  return finish(null);
174271
174382
  try {
174272
174383
  const response = JSON.parse(line);
174273
- if (!isRecord12(response) || response["id"] !== OWNER_PING_REQUEST_ID || "error" in response) {
174384
+ if (!isRecord13(response) || response["id"] !== OWNER_PING_REQUEST_ID || "error" in response) {
174274
174385
  return finish(null);
174275
174386
  }
174276
174387
  finish(parseLspDaemonOwner(response["result"]));
@@ -174283,7 +174394,7 @@ async function pingLspDaemonOwner(endpoint, authToken) {
174283
174394
  function sameOwner(left, right) {
174284
174395
  return left.pid === right.pid && left.nonce === right.nonce && left.startedAt === right.startedAt && left.endpoint.kind === right.endpoint.kind && left.endpoint.path === right.endpoint.path && left.endpoint.dev === right.endpoint.dev && left.endpoint.ino === right.endpoint.ino;
174285
174396
  }
174286
- function isRecord12(value) {
174397
+ function isRecord13(value) {
174287
174398
  return typeof value === "object" && value !== null && !Array.isArray(value);
174288
174399
  }
174289
174400
 
@@ -174681,37 +174792,85 @@ function defaultPluginRoot() {
174681
174792
  // packages/telemetry-core/src/activity-state.ts
174682
174793
  init_atomic_write();
174683
174794
  init_xdg_data_dir();
174684
- import { existsSync as existsSync111, mkdirSync as mkdirSync26, readFileSync as readFileSync76 } from "fs";
174685
- import { basename as basename24, join as join138 } from "path";
174795
+ import { existsSync as existsSync111, mkdirSync as mkdirSync27, readFileSync as readFileSync76 } from "fs";
174796
+ import { basename as basename24, join as join139 } from "path";
174797
+
174798
+ // packages/telemetry-core/src/day-claim.ts
174799
+ import { closeSync as closeSync6, mkdirSync as mkdirSync26, openSync as openSync6, readdirSync as readdirSync33, rmSync as rmSync6 } from "fs";
174800
+ import { join as join138 } from "path";
174801
+ var CLAIM_PREFIX = "daily-active.";
174802
+ var CLAIM_SUFFIX = ".claim";
174803
+ function getTelemetryDayClaimFilePath(stateDir, dayUTC) {
174804
+ return join138(stateDir, `${CLAIM_PREFIX}${dayUTC}${CLAIM_SUFFIX}`);
174805
+ }
174806
+ function claimUtcDay(stateDir, dayUTC) {
174807
+ try {
174808
+ mkdirSync26(stateDir, { recursive: true });
174809
+ closeSync6(openSync6(getTelemetryDayClaimFilePath(stateDir, dayUTC), "wx"));
174810
+ } catch (error) {
174811
+ return error.code === "EEXIST" ? "already-claimed" : "unavailable";
174812
+ }
174813
+ pruneSupersededClaims(stateDir, dayUTC);
174814
+ return "claimed";
174815
+ }
174816
+ function pruneSupersededClaims(stateDir, dayUTC) {
174817
+ const currentClaim = `${CLAIM_PREFIX}${dayUTC}${CLAIM_SUFFIX}`;
174818
+ let entries;
174819
+ try {
174820
+ entries = readdirSync33(stateDir);
174821
+ } catch {
174822
+ return;
174823
+ }
174824
+ for (const entry of entries) {
174825
+ if (entry === currentClaim)
174826
+ continue;
174827
+ if (!entry.startsWith(CLAIM_PREFIX) || !entry.endsWith(CLAIM_SUFFIX))
174828
+ continue;
174829
+ try {
174830
+ rmSync6(join138(stateDir, entry), { force: true });
174831
+ } catch {}
174832
+ }
174833
+ }
174834
+
174835
+ // packages/telemetry-core/src/activity-state.ts
174686
174836
  var POSTHOG_ACTIVITY_STATE_FILE = "posthog-activity.json";
174837
+ var capturedDaysByStateDir = new Map;
174687
174838
  function resolveTelemetryStateDir(product, options = {}) {
174688
174839
  const dataDir = resolveXdgDataDir(product.cacheDirName, {
174689
174840
  env: options.env,
174690
174841
  osProvider: options.osProvider
174691
174842
  });
174692
- const xdgStateDir = options.env?.XDG_DATA_HOME === undefined ? undefined : join138(options.env.XDG_DATA_HOME, product.cacheDirName);
174843
+ const xdgStateDir = options.env?.XDG_DATA_HOME === undefined ? undefined : join139(options.env.XDG_DATA_HOME, product.cacheDirName);
174693
174844
  if (dataDir === xdgStateDir || xdgStateDir === undefined && basename24(dataDir) === product.cacheDirName) {
174694
174845
  return dataDir;
174695
174846
  }
174696
- return join138(dataDir, product.cacheDirName);
174847
+ return join139(dataDir, product.cacheDirName);
174697
174848
  }
174698
174849
  function getTelemetryActivityStateFilePath(stateDir) {
174699
- return join138(stateDir, POSTHOG_ACTIVITY_STATE_FILE);
174850
+ return join139(stateDir, POSTHOG_ACTIVITY_STATE_FILE);
174700
174851
  }
174701
174852
  function getDailyActiveCaptureState(input) {
174702
- const state = readPostHogActivityState(input.stateDir, input.diagnostics);
174703
174853
  const dayUTC = getUtcDayString(input.now ?? new Date);
174704
- const captureDaily = state.lastActiveDayUTC !== dayUTC;
174705
- if (captureDaily) {
174854
+ if (capturedDaysByStateDir.get(input.stateDir) === dayUTC) {
174855
+ return { dayUTC, captureDaily: false };
174856
+ }
174857
+ const state = readPostHogActivityState(input.stateDir, input.diagnostics);
174858
+ if (state.lastActiveDayUTC === dayUTC) {
174859
+ capturedDaysByStateDir.set(input.stateDir, dayUTC);
174860
+ return { dayUTC, captureDaily: false };
174861
+ }
174862
+ const claim = claimUtcDay(input.stateDir, dayUTC);
174863
+ capturedDaysByStateDir.set(input.stateDir, dayUTC);
174864
+ if (claim === "already-claimed") {
174865
+ return { dayUTC, captureDaily: false };
174866
+ }
174867
+ if (claim === "claimed") {
174706
174868
  writePostHogActivityState(input.stateDir, {
174707
174869
  ...state,
174708
174870
  lastActiveDayUTC: dayUTC
174709
174871
  }, input.diagnostics);
174710
174872
  }
174711
- return {
174712
- dayUTC,
174713
- captureDaily
174714
- };
174873
+ return { dayUTC, captureDaily: true };
174715
174874
  }
174716
174875
  function getUtcDayString(date) {
174717
174876
  return date.toISOString().slice(0, 10);
@@ -174744,7 +174903,7 @@ function readPostHogActivityState(stateDir, diagnostics) {
174744
174903
  function writePostHogActivityState(stateDir, nextState, diagnostics) {
174745
174904
  const stateFilePath = getTelemetryActivityStateFilePath(stateDir);
174746
174905
  try {
174747
- mkdirSync26(stateDir, { recursive: true });
174906
+ mkdirSync27(stateDir, { recursive: true });
174748
174907
  writeFileAtomically(stateFilePath, `${JSON.stringify(nextState, null, 2)}
174749
174908
  `);
174750
174909
  } catch (error) {
@@ -179944,7 +180103,7 @@ var TOPLEVEL_SENTINELS = [
179944
180103
  field: "window_id"
179945
180104
  }
179946
180105
  ];
179947
- function isRecord13(value) {
180106
+ function isRecord14(value) {
179948
180107
  return typeof value == "object" && value !== null && !Array.isArray(value);
179949
180108
  }
179950
180109
  function toRfc3339(timestamp) {
@@ -179966,7 +180125,7 @@ function relocateInto(properties, key, value) {
179966
180125
  properties[key] = value;
179967
180126
  }
179968
180127
  function buildV1Event(message) {
179969
- const sourceProperties = isRecord13(message.properties) ? message.properties : {};
180128
+ const sourceProperties = isRecord14(message.properties) ? message.properties : {};
179970
180129
  const properties = {
179971
180130
  ...sourceProperties
179972
180131
  };