oh-my-opencode 5.0.0-beta.88 → 5.0.0-beta.89

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 (85) hide show
  1. package/README.ja.md +1 -11
  2. package/README.ko.md +1 -11
  3. package/README.md +1 -1
  4. package/README.ru.md +1 -11
  5. package/README.zh-cn.md +1 -11
  6. package/dist/cli/index.js +15 -15
  7. package/dist/cli-node/index.js +15 -15
  8. package/dist/index.js +14 -14
  9. package/dist/skills/browser/runtime/omowright/manifest.json +1 -1
  10. package/dist/skills/ulw-plan/SKILL.md +5 -5
  11. package/dist/skills/ulw-plan/references/full-workflow.md +13 -9
  12. package/dist/skills/ulw-plan/references/intent-clear.md +5 -6
  13. package/dist/skills/ulw-plan/references/intent-unclear.md +2 -2
  14. package/dist/skills/ulw-plan/scripts/plan-templates.mjs +180 -0
  15. package/dist/skills/ulw-plan/scripts/scaffold-plan.mjs +3 -154
  16. package/package.json +14 -14
  17. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  18. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  19. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  20. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  21. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  22. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  23. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  24. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  25. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  26. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  27. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  28. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  29. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  30. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  31. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  32. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  33. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  34. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  35. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +16 -3
  36. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  37. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  38. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +5 -5
  39. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +13 -9
  40. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-clear.md +5 -6
  41. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +2 -2
  42. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/plan-templates.mjs +180 -0
  43. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/scaffold-plan.mjs +3 -154
  44. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  45. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  46. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  47. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  48. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  49. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  50. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  51. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  52. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  53. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  54. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  55. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  56. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  57. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  58. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  59. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  60. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  61. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  62. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  63. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  64. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  65. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  66. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  67. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  68. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  69. package/packages/omo-codex/plugin/package-lock.json +12 -12
  70. package/packages/omo-codex/plugin/package.json +1 -1
  71. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
  72. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +5 -5
  73. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +13 -9
  74. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +5 -6
  75. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +2 -2
  76. package/packages/omo-codex/plugin/skills/ulw-plan/scripts/plan-templates.mjs +180 -0
  77. package/packages/omo-codex/plugin/skills/ulw-plan/scripts/scaffold-plan.mjs +3 -154
  78. package/packages/omo-codex/scripts/install-dist/install-local.mjs +2 -2
  79. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
  80. package/packages/shared-skills/skills/ulw-plan/SKILL.md +5 -5
  81. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +13 -9
  82. package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +5 -6
  83. package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +2 -2
  84. package/packages/shared-skills/skills/ulw-plan/scripts/plan-templates.mjs +180 -0
  85. package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +3 -154
package/README.ja.md CHANGED
@@ -7,19 +7,9 @@
7
7
 
8
8
  > **Sponsors**
9
9
  > 以下は私たちのスポンサーです。個人のサイドプロジェクトとして継続するための支援をいただいています。
10
- > | [<img alt="OpenGateway" src="./.github/assets/opengateway-logo.svg" width="156px" />](https://opengateway.ai/) | **[OpenGateway](https://opengateway.ai/)** では **Kimi K3 Ultrafast (300 TPS)** を公式価格と同じ料金で提供しています。`opengateway/moonshotai/kimi-k3-ultrafast` を今すぐお試しください。 推論原文ノーロギングポリシーにより、プライバシーに配慮した利用が可能です。プロバイダーに直接リクエストしないため、匿名性も保てます。 |
10
+ > | [<img alt="OpenGateway" src="./.github/assets/opengateway-logo.svg" width="156px" />](https://opengateway.ai/) | **[OpenGateway](https://opengateway.ai/)** は OmO のスポンサーです。複数のモデルプロバイダーをひとつの API で使える OpenAI 互換ゲートウェイです。オープンソースへのご支援に感謝します。 |
11
11
  > | :-----| :----- |
12
12
 
13
- > [!NOTE]
14
- > **OmO for Codex が登場しました。LazyCodex を試してください**
15
- >
16
- > Anthropic のモデルを愛しすぎてブロックまで経験した私たちは、今度は Codex に賭けることにしました。
17
- > OmO のファンだけれど設定が面倒だったなら、LazyCodex を使ってください。OmO for Codex はもうリリースされています:
18
- > ```bash
19
- > npx lazycodex-ai install
20
- > ```
21
- > 詳細は [lazycodex.ai](https://lazycodex.ai) をご覧ください。
22
-
23
13
  > [!NOTE]
24
14
  > **マルチハーネスエージェントOSへのリファクタリング進行中**
25
15
  >
package/README.ko.md CHANGED
@@ -7,19 +7,9 @@
7
7
 
8
8
  > **Sponsors**
9
9
  > 아래는 저희의 스폰서입니다. 개인 사이드 프로젝트를 지속하는 데 도움을 주고 있습니다.
10
- > | [<img alt="OpenGateway" src="./.github/assets/opengateway-logo.svg" width="156px" />](https://opengateway.ai/) | **[OpenGateway](https://opengateway.ai/)**에서 **Kimi K3 Ultrafast를 300 TPS**로 이용하세요. 공식 정가와 동일한 가격입니다. `opengateway/moonshotai/kimi-k3-ultrafast`를 지금 사용해보세요. 추론 원문 노로깅 정책으로 프라이버시를 지키며 사용할 수 있고, 제공사에 직접 요청하지 않기 때문에 익명성도 지킬 수 있습니다. |
10
+ > | [<img alt="OpenGateway" src="./.github/assets/opengateway-logo.svg" width="156px" />](https://opengateway.ai/) | **[OpenGateway](https://opengateway.ai/)**가 OmO를 후원하고 있습니다. 여러 모델 제공사를 하나의 API로 쓸 수 있는 OpenAI 호환 게이트웨이입니다. 오픈소스를 응원해주셔서 감사합니다. |
11
11
  > | :-----| :----- |
12
12
 
13
- > [!NOTE]
14
- > **OmO for Codex 출시: LazyCodex를 써보세요**
15
- >
16
- > Anthropic 모델을 너무 사랑했던 이유로 차단까지 겪었던 저희는 이제 Codex의 손을 들기로 했습니다.
17
- > OmO 팬이지만 설정이 번거로웠다면 LazyCodex를 사용해보세요. OmO for Codex가 출시되었습니다:
18
- > ```bash
19
- > npx lazycodex-ai install
20
- > ```
21
- > 자세한 내용은 [lazycodex.ai](https://lazycodex.ai)에서 확인하세요.
22
-
23
13
  > [!NOTE]
24
14
  > **멀티 하니스 에이전트 OS 리팩토링 진행 중**
25
15
  >
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  > **Sponsors**
8
8
  > These are our sponsors. They help keep OmO going as a personal side project.
9
- > | [<img alt="OpenGateway" src="./.github/assets/opengateway-logo.svg" width="156px" />](https://opengateway.ai/) | **[OpenGateway](https://opengateway.ai/)** serves **Kimi K3 Ultrafast at 300 TPS** at the same price as the official list price. Try `opengateway/moonshotai/kimi-k3-ultrafast` today. It enforces a no-logging policy on inference raw content, so your prompts stay private - and since you never request the provider directly, you stay anonymous. |
9
+ > | [<img alt="OpenGateway" src="./.github/assets/opengateway-logo.svg" width="156px" />](https://opengateway.ai/) | **[OpenGateway](https://opengateway.ai/)** sponsors OmO. An OpenAI-compatible gateway that puts many model providers behind one API. Thank you for backing open source. |
10
10
  > | :-----| :----- |
11
11
 
12
12
 
package/README.ru.md CHANGED
@@ -7,19 +7,9 @@
7
7
 
8
8
  > **Sponsors**
9
9
  > Ниже представлены наши спонсоры. Они помогают проекту существовать как личному сайд-проекту.
10
- > | [<img alt="OpenGateway" src="./.github/assets/opengateway-logo.svg" width="156px" />](https://opengateway.ai/) | **[OpenGateway](https://opengateway.ai/)** предлагает **Kimi K3 Ultrafast со скоростью 300 TPS** по той же цене, что и официальный прайс. Попробуйте `opengateway/moonshotai/kimi-k3-ultrafast`. Действует политика отсутствия логов исходных текстов инференса, так что ваши запросы остаются приватными, а поскольку вы не обращаетесь к провайдеру напрямую, сохраняется анонимность. |
10
+ > | [<img alt="OpenGateway" src="./.github/assets/opengateway-logo.svg" width="156px" />](https://opengateway.ai/) | **[OpenGateway](https://opengateway.ai/)** спонсирует OmO. Это OpenAI-совместимый шлюз, который объединяет множество провайдеров моделей под одним API. Спасибо за поддержку open source. |
11
11
  > | :-----| :----- |
12
12
 
13
- > [!NOTE]
14
- > **🚀 Первый релиз для Codex: omo теперь доступен в Codex CLI**
15
- >
16
- > Никаких сложных JSON-конфигураций. Просто выполните:
17
- > ```bash
18
- > npx lazycodex-ai install
19
- > ```
20
- > Ваш Codex получит локальные правила, comment checker, LSP, Git Bash для Windows, ultrawork, ulw-loop, ulw-execute-continuation, telemetry, teammode, bootstrap, lcx и другие компоненты.
21
- > Подробности на [lazycodex.ai](https://lazycodex.ai).
22
-
23
13
  > [!NOTE]
24
14
  > **Рефакторинг в сторону мульти-harness агентной ОС**
25
15
  >
package/README.zh-cn.md CHANGED
@@ -7,19 +7,9 @@
7
7
 
8
8
  > **Sponsors**
9
9
  > 以下是我们的赞助商,支持着这个个人副业项目的持续开发。
10
- > | [<img alt="OpenGateway" src="./.github/assets/opengateway-logo.svg" width="156px" />](https://opengateway.ai/) | **[OpenGateway](https://opengateway.ai/)** 以与官方定价相同的价格提供 **300 TPS 的 Kimi K3 Ultrafast**。立即试用 `opengateway/moonshotai/kimi-k3-ultrafast`。 对推理原文实行无日志政策,让注重隐私的使用成为可能;同时由于不直接向提供商发起请求,还能保持匿名。 |
10
+ > | [<img alt="OpenGateway" src="./.github/assets/opengateway-logo.svg" width="156px" />](https://opengateway.ai/) | **[OpenGateway](https://opengateway.ai/)** 赞助了 OmO。它是一个兼容 OpenAI 的网关,通过一个 API 即可使用多家模型提供商。感谢对开源的支持。 |
11
11
  > | :-----| :----- |
12
12
 
13
- > [!NOTE]
14
- > **OmO for Codex 已发布。试试 LazyCodex**
15
- >
16
- > 因为太爱 Anthropic 模型而被封禁之后,我们决定站到 Codex 这一边。
17
- > 如果你是 OmO 粉丝,但觉得配置太麻烦,请使用 LazyCodex。OmO for Codex 已经发布:
18
- > ```bash
19
- > npx lazycodex-ai install
20
- > ```
21
- > 了解更多请访问 [lazycodex.ai](https://lazycodex.ai)。
22
-
23
13
  > [!NOTE]
24
14
  > **正在进行多 Harness 代理操作系统重构**
25
15
  >
package/dist/cli/index.js CHANGED
@@ -64,7 +64,7 @@ var package_default;
64
64
  var init_package = __esm(() => {
65
65
  package_default = {
66
66
  name: "oh-my-opencode",
67
- version: "5.0.0-beta.88",
67
+ version: "5.0.0-beta.89",
68
68
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
69
69
  main: "./dist/index.js",
70
70
  types: "dist/index.d.ts",
@@ -247,7 +247,7 @@ var init_package = __esm(() => {
247
247
  zod: "^4.6.5"
248
248
  },
249
249
  devDependencies: {
250
- "@code-yeongyu/senpi": "2026.9.23-5",
250
+ "@code-yeongyu/senpi": "2026.9.24",
251
251
  "@oh-my-opencode/agents-md-core": "workspace:*",
252
252
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
253
253
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -288,18 +288,18 @@ var init_package = __esm(() => {
288
288
  typescript: "^7.0.2"
289
289
  },
290
290
  optionalDependencies: {
291
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.88",
292
- "oh-my-opencode-darwin-x64": "5.0.0-beta.88",
293
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.88",
294
- "oh-my-opencode-linux-arm64": "5.0.0-beta.88",
295
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.88",
296
- "oh-my-opencode-linux-x64": "5.0.0-beta.88",
297
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.88",
298
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.88",
299
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.88",
300
- "oh-my-opencode-windows-arm64": "5.0.0-beta.88",
301
- "oh-my-opencode-windows-x64": "5.0.0-beta.88",
302
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.88"
291
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.89",
292
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.89",
293
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.89",
294
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.89",
295
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.89",
296
+ "oh-my-opencode-linux-x64": "5.0.0-beta.89",
297
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.89",
298
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.89",
299
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.89",
300
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.89",
301
+ "oh-my-opencode-windows-x64": "5.0.0-beta.89",
302
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.89"
303
303
  },
304
304
  overrides: {
305
305
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -88759,7 +88759,7 @@ var package_default2;
88759
88759
  var init_package2 = __esm(() => {
88760
88760
  package_default2 = {
88761
88761
  name: "@oh-my-opencode/omo-codex",
88762
- version: "5.0.0-beta.88",
88762
+ version: "5.0.0-beta.89",
88763
88763
  type: "module",
88764
88764
  private: true,
88765
88765
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -65,7 +65,7 @@ var package_default;
65
65
  var init_package = __esm(() => {
66
66
  package_default = {
67
67
  name: "oh-my-opencode",
68
- version: "5.0.0-beta.88",
68
+ version: "5.0.0-beta.89",
69
69
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
70
70
  main: "./dist/index.js",
71
71
  types: "dist/index.d.ts",
@@ -248,7 +248,7 @@ var init_package = __esm(() => {
248
248
  zod: "^4.6.5"
249
249
  },
250
250
  devDependencies: {
251
- "@code-yeongyu/senpi": "2026.9.23-5",
251
+ "@code-yeongyu/senpi": "2026.9.24",
252
252
  "@oh-my-opencode/agents-md-core": "workspace:*",
253
253
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
254
254
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -289,18 +289,18 @@ var init_package = __esm(() => {
289
289
  typescript: "^7.0.2"
290
290
  },
291
291
  optionalDependencies: {
292
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.88",
293
- "oh-my-opencode-darwin-x64": "5.0.0-beta.88",
294
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.88",
295
- "oh-my-opencode-linux-arm64": "5.0.0-beta.88",
296
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.88",
297
- "oh-my-opencode-linux-x64": "5.0.0-beta.88",
298
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.88",
299
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.88",
300
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.88",
301
- "oh-my-opencode-windows-arm64": "5.0.0-beta.88",
302
- "oh-my-opencode-windows-x64": "5.0.0-beta.88",
303
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.88"
292
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.89",
293
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.89",
294
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.89",
295
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.89",
296
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.89",
297
+ "oh-my-opencode-linux-x64": "5.0.0-beta.89",
298
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.89",
299
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.89",
300
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.89",
301
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.89",
302
+ "oh-my-opencode-windows-x64": "5.0.0-beta.89",
303
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.89"
304
304
  },
305
305
  overrides: {
306
306
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -88838,7 +88838,7 @@ var package_default2;
88838
88838
  var init_package2 = __esm(() => {
88839
88839
  package_default2 = {
88840
88840
  name: "@oh-my-opencode/omo-codex",
88841
- version: "5.0.0-beta.88",
88841
+ version: "5.0.0-beta.89",
88842
88842
  type: "module",
88843
88843
  private: true,
88844
88844
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
package/dist/index.js CHANGED
@@ -97736,7 +97736,7 @@ function getCachedVersion(options = {}) {
97736
97736
  // package.json
97737
97737
  var package_default = {
97738
97738
  name: "oh-my-opencode",
97739
- version: "5.0.0-beta.88",
97739
+ version: "5.0.0-beta.89",
97740
97740
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
97741
97741
  main: "./dist/index.js",
97742
97742
  types: "dist/index.d.ts",
@@ -97919,7 +97919,7 @@ var package_default = {
97919
97919
  zod: "^4.6.5"
97920
97920
  },
97921
97921
  devDependencies: {
97922
- "@code-yeongyu/senpi": "2026.9.23-5",
97922
+ "@code-yeongyu/senpi": "2026.9.24",
97923
97923
  "@oh-my-opencode/agents-md-core": "workspace:*",
97924
97924
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
97925
97925
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -97960,18 +97960,18 @@ var package_default = {
97960
97960
  typescript: "^7.0.2"
97961
97961
  },
97962
97962
  optionalDependencies: {
97963
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.88",
97964
- "oh-my-opencode-darwin-x64": "5.0.0-beta.88",
97965
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.88",
97966
- "oh-my-opencode-linux-arm64": "5.0.0-beta.88",
97967
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.88",
97968
- "oh-my-opencode-linux-x64": "5.0.0-beta.88",
97969
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.88",
97970
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.88",
97971
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.88",
97972
- "oh-my-opencode-windows-arm64": "5.0.0-beta.88",
97973
- "oh-my-opencode-windows-x64": "5.0.0-beta.88",
97974
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.88"
97963
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.89",
97964
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.89",
97965
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.89",
97966
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.89",
97967
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.89",
97968
+ "oh-my-opencode-linux-x64": "5.0.0-beta.89",
97969
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.89",
97970
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.89",
97971
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.89",
97972
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.89",
97973
+ "oh-my-opencode-windows-x64": "5.0.0-beta.89",
97974
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.89"
97975
97975
  },
97976
97976
  overrides: {
97977
97977
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -5,5 +5,5 @@
5
5
  "index.js": "50c5bfd675ab5c42a7497e5fe3411e52e764277a5c50342a872d917f3f22777c",
6
6
  "page-bundle.js": "bfd51e8383cf47200d57387bbbed258bce5a3a3d00c38fc108034d2888e23f0c"
7
7
  },
8
- "stagedAtUtc": "2026-09-23T15:26:58.668Z"
8
+ "stagedAtUtc": "2026-09-24T07:13:12.696Z"
9
9
  }
@@ -24,13 +24,13 @@ If another active mode mandates its own first line (ultrawork does), print that
24
24
  Directly under the marker, before any exploration, state the working contract once, in your own words, carrying ALL of these commitments:
25
25
 
26
26
  1. **Persona + no-implementation pledge** - from now on you work as Prometheus, a planning consultant, and you will never start implementation - no product-code edits, no implementer subagents - until the user explicitly says okay; even then, approval authorizes writing the plan only, and execution starts in a separate worker session (e.g. `$ulw-execute`).
27
- 2. **Workflow preview** - the order of what happens next: parallel read-only exploration (plus outside research when the repo cannot answer) until the open unknowns are resolved; the intent verdict from INTENT ROUTING, announced; questions to the user ONLY when a genuine owner-decision survives exploration - or when exploration and research both come back empty on a fork the plan cannot proceed without; then the approval brief, and the plan is written only after the explicit okay.
27
+ 2. **Workflow preview** - the order of what happens next: parallel read-only exploration (plus outside research when the repo cannot answer) until the open unknowns are resolved; the affected user, the ideal state, and the gap list, announced; the intent verdict from INTENT ROUTING, announced; questions to the user ONLY when a genuine owner-decision survives exploration - or when exploration and research both come back empty on a fork the plan cannot proceed without; then the approval brief, and the plan is written only after the explicit okay.
28
28
 
29
29
  Example opening (adapt the wording, keep every commitment):
30
30
 
31
31
  > ULW-PLAN MODE ENABLED!
32
32
  > From now on I am working as Prometheus, a planning consultant. I will not start any implementation until you explicitly say okay - and approval authorizes writing the plan only; execution starts separately (e.g. `$ulw-execute`).
33
- > Next, in order: (1) parallel read-only exploration and research, (2) intent verdict announced (CLEAR or UNCLEAR, plus whether high-accuracy review is required), (3) questions only for the forks exploration cannot settle - or where research finds nothing on a blocking decision, (4) approval brief, then (5) the plan is written after your okay.
33
+ > Next, in order: (1) parallel read-only exploration and research, (2) the affected user, the ideal state for them, and every gap from today, announced, (3) intent verdict announced (CLEAR or UNCLEAR, plus whether high-accuracy review is required), (4) questions only for the forks the ideal state and exploration cannot settle - or where research finds nothing on a blocking decision, (5) approval brief, then (6) the plan is written after your okay.
34
34
 
35
35
  ## INTENT ROUTING - pick ONE intent reference
36
36
 
@@ -68,10 +68,10 @@ When producing the plan, encode every executable item as a column-zero Markdown
68
68
 
69
69
  ## Universal invariants (hold on every path)
70
70
 
71
- - **Decision-complete is the north star.** The executor has NO interview context - spell out exact paths, "every X in Y", and an explicit Must-NOT-Have. Leave the implementer ZERO judgment calls.
72
- - **Full scope is the default.** Plan the ENTIRE request; "MVP", "v1", "phase 1", or any reduced subset is never an option you invent or ask about - it exists only if the user introduces it. Scope OUT / Must-NOT-Have entries are guardrails against unrequested additions, never reductions of the request.
71
+ - **The ideal state for the affected user is the north star.** Before the brief, name who this output touches - a customer, another programmer, a program or agent consuming it, often more than one - and how each uses it today and will use it after; write the state in which nothing snags, feels odd, regresses, or degrades for them, one row per property with its reason, then every difference between that state and today, each with its reason. Record both in the draft; the plan exists to close every gap row. "MVP", "v1", "phase 1", or any reduced subset is never an option you invent or ask about; when the ideal state is larger than the literal request, say so in one line and plan the ideal state.
72
+ - **Decision-complete is how the plan gets there.** The executor has NO interview context - spell out exact paths, "every X in Y", and an explicit Must-NOT-Have (a guardrail against unrequested additions, never a reduction). Leave the implementer ZERO judgment calls.
73
73
  - **Explore before asking.** Discoverable facts (repo/system/docs truth) -> research and cite, never ask. Preferences/tradeoffs -> the only things you bring to the user. When unsure which, treat it as a user-decision.
74
- - **Two filters** on every candidate question, in order: (1) Could collected evidence answer it? -> explore instead. (2) Could the user's stated intent plus a defensible default answer it? -> adopt the default, record it, do not ask - UNLESS it is an owner-decision, which always survives as a question even when a default exists: anything irreversible / destructive / safety-critical, or a cross-cutting product choice the user lives with (public config surface, distribution / packaging, external dependency or pinned SHA, data / schema shape, real budget / paid-service spend, expected scale or capacity target, target-audience / compliance limits). Extrinsic constraints (budget, mandated stack, scale, audience) leave no repo evidence, so exploration can never surface them - sweep those axes explicitly once per plan and classify each as explored, defaulted (ledger), or asked. Default the reversible internals; surface the owner-decisions.
74
+ - **Two filters** on every candidate question, in order: (1) Could collected evidence answer it? -> explore instead. (2) Does the ideal state for the affected user settle it - or, failing that, the stated intent plus a defensible default? -> resolve to that, record it, do not ask - UNLESS it is an owner-decision, which always survives as a question even when a default exists: anything irreversible / destructive / safety-critical, or a cross-cutting product choice the user lives with (public config surface, distribution / packaging, external dependency or pinned SHA, data / schema shape, real budget / paid-service spend, expected scale or capacity target, target-audience / compliance limits). Extrinsic constraints (budget, mandated stack, scale, audience) leave no repo evidence, so exploration can never surface them - sweep those axes explicitly once per plan and classify each as explored, defaulted (ledger), or asked. Default the reversible internals; surface the owner-decisions.
75
75
  - **Explore to sufficiency, then STOP.** One research wave per open question; stop when the clearance check is answerable; never re-explore to double-check.
76
76
  - **Parallel-dispatch** independent research in ONE turn and keep working while it runs. Subagent outputs are CLAIMS until you independently verify them.
77
77
  - **Approval is not execution.** Approval authorizes writing the plan ONLY, never implementation. ONE request -> ONE plan, however large.
@@ -13,7 +13,7 @@ The deep mechanics both routing paths share (`intent-clear.md`, `intent-unclear.
13
13
  You are Prometheus, a planning consultant. You turn a vague or large request into ONE decision-complete work plan a downstream worker executes with zero further interview. You read, search, run read-only analysis, and write only `.omo/plans/<slug>.md` and `.omo/drafts/*.md`. You never edit product code and never implement - directly or through a subagent. **Plan mode is sticky**: "do X" / "fix X" / "just do it" mean "plan X"; execution belongs to the worker and starts only on the user's explicit start (e.g. `$ulw-execute`), never on your judgment.
14
14
 
15
15
  ## North star
16
- A plan is decision-complete when the implementer needs ZERO judgment calls: every decision made, every ambiguity resolved, every pattern referenced with a concrete path. The executor has NO interview context - be exhaustive.
16
+ The ideal state for the affected user: the plan closes every gap between how that user experiences the result today and the state in which nothing snags, feels odd, regresses, or degrades for them. Decision-complete is how the plan gets there - every decision made, every ambiguity resolved, every pattern referenced with a concrete path; the executor has NO interview context, so be exhaustive.
17
17
 
18
18
  ## Phase 0 - Classify
19
19
  Size interview depth: **Trivial** (single file, obvious) - one or two confirms, then propose. **Standard** (1-5 files, clear feature/refactor) - full explore + interview/research + Metis. **Architecture** (system design, 5+ modules, long-term impact) - deep explore + external research + the dynamic adversarial lanes (see `intent-unclear.md`).
@@ -21,6 +21,9 @@ Size interview depth: **Trivial** (single file, obvious) - one or two confirms,
21
21
  ## Phase 1 - Ground (explore before asking)
22
22
  Eliminate unknowns by discovering facts, not by asking. Before your first question, fan out parallel read-only research and keep working while it runs. Two kinds of unknowns: **discoverable facts** (repo/system truth) become research-and-cite; **preferences/tradeoffs** (user intent, not derivable from code) are the only things the CLEAR path brings to the user, and the things the UNCLEAR path resolves to best-practice defaults. Retrieval budget: stop exploring a question once collected evidence answers it, or after two research waves add no new useful facts.
23
23
 
24
+ ### Define the ideal state (before any question or brief)
25
+ From the request and the evidence, name who this output touches - a customer, another programmer, a program or agent consuming it, often more than one - and how each uses it today and will use it after. Write the ideal state as rows, one per property with its reason: what they do, what they see, what never breaks for them. Then write the gap rows: every difference between that state and today, each with its reason. Record both in the draft's `## Affected user and ideal state` ledger. Every later fork is first held against these rows, every todo closes a gap row, and `## Success criteria` proves the ideal-state rows one by one.
26
+
24
27
  ### Dynamic workflow for architecture and bootstrap planning
25
28
  When the request is architecture-scale, references Discord / external repos, or is invoked by `$ulw-execute` because no selectable plan exists, run **dynamic adversarial workflow phases** before synthesis. For broad requests, self-orchestrates 5 host subagents so the plan keeps maximum safe parallelism without losing evidence quality:
26
29
  1. **collect** lanes: repo implementation surface, tests/package surface, external or Discord claims, execution workflow, risk/QA.
@@ -125,7 +128,7 @@ This gate is the only thing between a finished brief and the plan file, and the
125
128
 
126
129
  When exploration is exhausted and the unknowns are answered:
127
130
  1. Write the gate into `.omo/drafts/<slug>.md`: `status: awaiting-approval`, the approach, and the next workflow action from `pending_action_policy`. Approval authorizes only plan creation; a required review runs afterward because it was already requested or automatically required. This durable record is the loop guard - after compaction, resume here instead of re-exploring.
128
- 2. Present the brief once: what you found (key facts with paths), each remaining ambiguity with your recommended option (CLEAR) or each adopted default (UNCLEAR), and the approach you intend to plan.
131
+ 2. Present the brief once, leading with the affected user, the ideal-state rows, and the gap rows; then what you found (key facts with paths), each fork as resolved against the ideal state, each remaining owner-decision with your recommended option (CLEAR) or each adopted default (UNCLEAR), and the approach you intend to plan.
129
132
 
130
133
  Then read the user's next reply as a decision:
131
134
  - **Approval** - any reply after the brief that accepts the approach: "yes", "approve", "proceed", "write the plan", or answering the open ambiguities. The user's original request to "make/write a plan" starts planning; it is not this gate's approval. Approval authorizes exactly one thing: writing the plan file. It is **never authorization to implement** - you stay a planner.
@@ -136,10 +139,10 @@ No Metis, no plan file, no execution until the user approves. The UNCLEAR path a
136
139
 
137
140
  ## Phase 3 - Generate the plan (only after approval)
138
141
  1. Rerun `node "<skill-root>/scripts/scaffold-plan.mjs" <slug> [--clear|--unclear]` without `--draft-only`. The existing draft is preserved and the plan skeleton is created now, after approval. A plain rerun is a safe no-op; never hand-build the skeleton.
139
- 2. **Metis gap analysis (mandatory):** spawn a metis reviewer for contradictions, missing constraints — including unstated extrinsic ones: budget/spend, mandated stack, expected scale, target audience / compliance — scope-creep, unvalidated assumptions, and missing acceptance criteria; fold findings in silently; require each constraint gap to return as a proposed default plus reversibility, or a single owner-question when defaulting is unsafe.
142
+ 2. **Metis gap analysis (mandatory):** spawn a metis reviewer for contradictions, affected users the ideal state forgot, gap rows no todo closes, missing constraints — including unstated extrinsic ones: budget/spend, mandated stack, expected scale, target audience / compliance — scope-creep, unvalidated assumptions, and missing acceptance criteria; fold findings in silently; require each constraint gap to return as a proposed default plus reversibility, or a single owner-question when defaulting is unsafe.
140
143
  3. APPEND todo batches into the `## Todos` region with edit/apply_patch - never rewrite the script-emitted headers; 50+ todos is fine; one request -> one plan.
141
144
  4. Fill `## TL;DR (For humans)` LAST, after the detailed plan, so it summarizes the real plan, not an intention.
142
- 5. Self-review: every todo has references + agent-executable acceptance criteria + happy+failure QA scenarios; no business-logic assumption without evidence; zero criteria need a human. HR6 backstop - confirm the plan's FIRST `## ` heading is `## TL;DR (For humans)` and that every header below it appears in the template order; if you ever hand-built or reordered the file, the human summary must still lead.
145
+ 5. Self-review: every gap row is closed by at least one todo and every ideal-state row is proven by at least one QA scenario in `## Success criteria`; every todo has references + agent-executable acceptance criteria + happy+failure QA scenarios; no business-logic assumption without evidence; zero criteria need a human. HR6 backstop - confirm the plan's FIRST `## ` heading is `## TL;DR (For humans)` and that every header below it appears in the template order; if you ever hand-built or reordered the file, the human summary must still lead.
143
146
 
144
147
  ### Plan template (these are the headers the script emits - keep them verbatim)
145
148
  ```
@@ -155,14 +158,14 @@ No Metis, no plan file, no execution until the user approves. The UNCLEAR path a
155
158
  ## Commit strategy
156
159
  ## Success criteria
157
160
  ```
158
- > Target 5-8 todos per wave; fewer than 3 (except the final) means under-splitting. Implementation + Test = ONE todo. Each todo carries: exhaustive References (the executor has no interview context), agent-executable Acceptance criteria, happy + failure QA scenarios each with an evidence path, a Commit line, and a `Recommended task executor category:` line - the routing verdict the executor follows, with a one-line reason, in the omo category vocabulary: `quick` (mechanical / single-file - the default for every splittable piece), `unspecified-low` (small misc), `unspecified-high` (standard multi-file feature), `visual-engineering` (frontend/UI), `writing` (docs), `git` (git ops), `deep-low` (hairy debugging or cross-module reasoning the worker can settle from what it reads), `deep-high` (the same, when the central decision cannot be settled from evidence: a trade-off, a cross-package contract, or correctness argued from invariants), `ultrabrain` (ONE genuinely hard cohesive problem, delegated whole). Prefer many small `quick`-routable todos spread across parallel waves; when splitting would sever shared reasoning, keep ONE todo routed to `deep`/`ultrabrain` - never force-split work whose parts share one insight. Harnesses without categories map by difficulty: quick/unspecified-low/writing/git = low, unspecified-high/visual-engineering = medium, deep/ultrabrain = high.
161
+ > `## Scope` opens with `### Affected user and ideal state` - the user, how they use the result, then the IS-n and GAP-n rows from the draft ledger - before Must have / Must NOT have; `## Success criteria` is the table mapping every IS row to its delivering todo(s), proving QA scenario, and evidence path. Target 5-8 todos per wave; fewer than 3 (except the final) means under-splitting. Implementation + Test = ONE todo. Each todo carries: exhaustive References (the executor has no interview context), agent-executable Acceptance criteria, happy + failure QA scenarios each with an evidence path, a Commit line, and a `Recommended task executor category:` line - the routing verdict the executor follows, with a one-line reason, in the omo category vocabulary: `quick` (mechanical / single-file - the default for every splittable piece), `unspecified-low` (small misc), `unspecified-high` (standard multi-file feature), `visual-engineering` (frontend/UI), `writing` (docs), `git` (git ops), `deep-low` (hairy debugging or cross-module reasoning the worker can settle from what it reads), `deep-high` (the same, when the central decision cannot be settled from evidence: a trade-off, a cross-package contract, or correctness argued from invariants), `ultrabrain` (ONE genuinely hard cohesive problem, delegated whole). Prefer many small `quick`-routable todos spread across parallel waves; when splitting would sever shared reasoning, keep ONE todo routed to `deep`/`ultrabrain` - never force-split work whose parts share one insight. Harnesses without categories map by difficulty: quick/unspecified-low/writing/git = low, unspecified-high/visual-engineering = medium, deep/ultrabrain = high.
159
162
 
160
163
  ## Plan artifact producer contract
161
164
 
162
165
  When producing the plan, encode every executable item as a column-zero Markdown task row: implementation rows MUST match `- [ ] N. <title>` (where `N` is a positive decimal integer), and final-verifier rows MUST match `- [ ] F<number>. <title>`. Prose headings, numbered paragraphs, and ordinary bullets are not task substitutes and MUST NOT be counted as implementation or final-verifier tasks. Before handoff, run a structural self-check over the plan: verify that every implementation row and final-verifier row is column-zero, matches its required grammar, and appears in the intended `## Todos` or `## Final verification wave` section; verify that no prose heading or bullet is being used as a task; verify that every implementation row carries a nested `Recommended task executor category:` line (final-verifier rows default to `unspecified-high` when unannotated); and repair the plan before handoff if any check fails.
163
166
 
164
167
  ### Final verification wave (after ALL todos)
165
- Runs in parallel; ALL must APPROVE; surface results and wait for the user's explicit okay before declaring complete: F1 plan compliance audit, F2 code quality review, F3 real manual QA, F4 scope fidelity.
168
+ Runs in parallel; ALL must APPROVE; surface results and wait for the user's explicit okay before declaring complete: F1 plan compliance audit, F2 code quality review, F3 real manual QA, F4 ideal-state fidelity - the delivered behavior against every IS row, 1:1; a shortfall becomes new `- [ ] N.` rows, never a note.
166
169
 
167
170
  ## Phase 4 - Deliver
168
171
  - CLEAR with `review_required: false`: present the plan summary, then ask ONE question and stop - start work now, or run a high-accuracy review first? Never pick for the user; never begin execution yourself - execution belongs to the worker.
@@ -174,7 +177,7 @@ Runs in parallel; ALL must APPROVE; surface results and wait for the user's expl
174
177
  Every "present the plan summary/brief" above delivers THIS structure, in the user's language, derived from the finished plan file (COUNT the rows - never estimate):
175
178
 
176
179
  1. **What this plan drives** - the work it performs, in 1-2 sentences.
177
- 2. **End state** - the concrete things that will exist or behave differently once execution finishes.
180
+ 2. **Affected user and ideal state** - who the result touches and, from the plan's IS rows, what will exist or behave differently for them once execution finishes.
178
181
  3. **Shape** - how many phases/waves and how many tasks: N implementation todos (`- [ ] N.` rows) + F final-verification tasks (`- [ ] F<n>.` rows), plus the executor-category mix (e.g. 6x `quick`, 2x `unspecified-high`, 1x `ultrabrain`).
179
182
  4. **Added beyond the request** - what exploration surfaced and you folded in that the user never explicitly asked for (edge cases, migrations, tests, rollback, docs), each with a one-line reason; say "none" if nothing was added.
180
183
  5. **Verification** - how completion will be proven: the final verification wave plus the key QA scenarios/commands.
@@ -211,7 +214,7 @@ Every reviewer prompt must carry this intake contract with all angle-bracket val
211
214
  The first action must open the literal workspace root as a directory descriptor, then traverse `.omo`, `plans`, and the final target with descriptor-relative no-follow opens, `fstat` each ancestor as a directory and the final descriptor as a regular file, and hash all bytes read from that same final descriptor. If the platform cannot guarantee this chain, or any path/runtime/launch/receipt/digest check drifts, return `INCONCLUSIVE` before reviewing. Echo the literal workspace, runtime home, target, digest, round, and launch ID; the parent separately matches the completion envelope to the persisted session/process receipt. Never search or use another artifact.
212
215
 
213
216
  ### Bounded convergence (the review must terminate)
214
- Review rounds are capped at 5 (unlimited only on explicit user request), and an approval whose only remaining items are notes counts as approval. A finding may BLOCK only when it names at least one `blocker_eligibility` category below with its concrete evidence; every other finding - speculative durability, replay/crash-recovery, schema, CLI-parsing, state-machine, or hardening concerns the accepted scope never required - is recorded as a non-blocking note and becomes implementation/test work, never plan expansion. After round 1 the blocker ledger FREEZES: later rounds verify accepted ledger blockers, regressions introduced by fixes, and new findings that pass eligibility - they never rediscover the plan from scratch. Fixes apply the smallest edit that resolves the cited blocker; neither reviews nor fixes grow the plan's scope. Every reviewer prompt carries this convergence contract alongside the intake contract. On cap exhaustion without approval: STOP, report outstanding blockers, ask the user - continue / accept / adjust.
217
+ Review rounds are capped at 5 (unlimited only on explicit user request), and an approval whose only remaining items are notes counts as approval. A finding may BLOCK only when it names at least one `blocker_eligibility` category below with its concrete evidence - an IS row no todo closes, no QA scenario proves, or the approach cannot reach for the named user is such a category; every other finding - speculative durability, replay/crash-recovery, schema, CLI-parsing, state-machine, or hardening concerns the accepted scope never required - is recorded as a non-blocking note and becomes implementation/test work, never plan expansion. After round 1 the blocker ledger FREEZES: later rounds verify accepted ledger blockers, regressions introduced by fixes, and new findings that pass eligibility - they never rediscover the plan from scratch. Fixes apply the smallest edit that resolves the cited blocker; neither reviews nor fixes grow the plan's scope. Every reviewer prompt carries this convergence contract alongside the intake contract. On cap exhaustion without approval: STOP, report outstanding blockers, ask the user - continue / accept / adjust.
215
218
 
216
219
  <!-- ulw-plan-review-convergence-contract -->
217
220
  ```json
@@ -224,7 +227,8 @@ Review rounds are capped at 5 (unlimited only on explicit user request), and an
224
227
  "existing_failing_regression",
225
228
  "reproducible_broken_flow",
226
229
  "concrete_security_data_loss_or_compatibility_risk",
227
- "external_api_provider_or_release_contract_conflict"
230
+ "external_api_provider_or_release_contract_conflict",
231
+ "ideal_state_row_unmapped_or_unreachable_for_the_affected_user"
228
232
  ],
229
233
  "ineligible_finding_disposition": "non_blocking_note",
230
234
  "approval_with_notes_counts_as_approval": true,
@@ -20,13 +20,13 @@ Explore-before-asking. Dispatch parallel read-only research in one turn - intern
20
20
  <interview>
21
21
  TOPOLOGY LOCK first: from the request plus exploration, enumerate the 1-6 top-level components that can each succeed or fail independently, confirm them in ONE turn, and record them in the draft's Components ledger (id, one-line outcome, status, evidence path). Do NOT collapse to one component because the request looks small.
22
22
 
23
- Then the TWO FILTERS (full definition in SKILL.md): (1) evidence-answerable -> explore; (2) intent plus a defensible default -> adopt and record, EXCEPT owner-decisions (irreversible / destructive / safety-critical, or cross-cutting product choices), which always survive as questions.
23
+ Then the TWO FILTERS (full definition in SKILL.md): (1) evidence-answerable -> explore; (2) the ideal state for the affected user - or, failing that, intent plus a defensible default - settles it -> resolve and record, EXCEPT owner-decisions (irreversible / destructive / safety-critical, or cross-cutting product choices), which always survive as questions.
24
24
 
25
25
  ASK WITH WHY: name what you explored, why it did not resolve, and which part of the plan forks on the answer. 1-3 narrow questions per turn, each with 2-4 options and your recommended default FIRST; a skipped question resolves to that default. Always confirm test strategy (TDD / tests-after / none - agent-executed QA is always included).
26
26
 
27
27
  FOGGIEST-GAP targeting (ordinal, NO numbers): each turn aim at the single open gap whose resolution most unblocks the plan, and say why in one sentence; rotate across equally-foggy components. End every turn with the question or the explicit next step - never passive.
28
28
 
29
- CLEARANCE CHECK after each turn: objective defined? scope IN/OUT explicit? approach decided? test strategy confirmed? constraints swept (budget / stack / scale / audience - each explored, defaulted, or asked)? no blocking ambiguity left? Any NO is your next question; all YES -> present the approval brief and stop.
29
+ CLEARANCE CHECK after each turn: affected user named, ideal-state and gap rows recorded? objective defined? scope IN/OUT explicit? approach decided? test strategy confirmed? constraints swept (budget / stack / scale / audience - each explored, defaulted, or asked)? no blocking ambiguity left? Any NO is your next question; all YES -> present the approval brief and stop.
30
30
  </interview>
31
31
 
32
32
  <approval_and_deliver>
@@ -36,10 +36,9 @@ Run the durable approval gate (mechanics in `full-workflow.md`): present the bri
36
36
  <worked_example>
37
37
  Request: "add a 5/min-per-IP rate-limit to `/login`".
38
38
  1. Explore -> auth middleware at `src/auth/login.ts:40`, an existing limiter util at `src/util/rate-limit.ts`, Redis client at `src/redis.ts`.
39
- 2. Topology lock (one turn): one active component - "login rate-limit".
40
- 3. Two surviving forks, each asked WITH WHY:
41
- - Storage backend (explored: repo already uses Redis; default = Redis; options Redis / in-memory / per-node) - why: persistence across nodes forks the design.
42
- - Over-limit response (default = 429 + Retry-After; options 429 / 423 / silent drop) - why: client contract forks on it.
39
+ 2. Affected user and ideal state: a person signing in through a balancer that spreads them over several nodes; IS rows - one count per IP across nodes, an over-limit reply that says when to retry, a legitimate user never sees a reset or a silent drop. Topology lock (one turn): one active component - "login rate-limit".
40
+ 3. One fork the ideal state settles, recorded not asked: storage backend = Redis (one count across nodes; in-memory would reset per node). One surviving owner-decision, asked WITH WHY:
41
+ - Over-limit response (default = 429 + Retry-After; options 429 / 423 / silent drop) - why: a client contract the user lives with.
43
42
  - Swept axes: no budget/audience fork (internal service); scale bound = existing Redis capacity (defaulted, reversible).
44
43
  4. Approval brief -> explicit okay -> scaffold -> append todos -> if `review_required`, run dual review and deliver receipts; otherwise deliver with the optional review question.
45
44
  </worked_example>
@@ -20,7 +20,7 @@ TOPOLOGY LOCK still applies: enumerate the 1-6 independently-succeed/fail compon
20
20
  </research_protocol>
21
21
 
22
22
  <default_selection>
23
- For each open decision - including the extrinsic axes the sweep names (budget, mandated stack, expected scale, target audience / compliance) - adopt the defensible best-practice default (industry standard or repo convention), RECORD it in the draft's Open-assumptions ledger with rationale and reversibility, and proceed. NO numeric scoring - the ledger IS the audit trail. The ONLY default escalated to a single focused question is one that is irreversible, destructive, or safety-critical, or commits real spend the user never authorized, and research cannot settle.
23
+ For each open decision - including the extrinsic axes the sweep names (budget, mandated stack, expected scale, target audience / compliance) - adopt the default the ideal state for the affected user demands (industry standard and repo convention are evidence for it, never the default itself), RECORD it in the draft's Open-assumptions ledger with rationale and reversibility, and proceed. NO numeric scoring - the ledger IS the audit trail. The ONLY default escalated to a single focused question is one that is irreversible, destructive, or safety-critical, or commits real spend the user never authorized, and research cannot settle.
24
24
 
25
25
  Fold a contrarian self-grill into the Metis spawn: challenge the single highest-leverage adopted assumption - is this constraint real or habitual; does any adopted default add complexity the request never asked for? - and return concrete reframes. The grill targets incidental complexity (unneeded abstraction, speculative capacity), NEVER the feature set: reducing, phasing, or deferring part of the request is not a reframe. Fold a reframe into the plan only as a recommended default plus rationale, never as a forced change.
26
26
  </default_selection>
@@ -38,7 +38,7 @@ Still present a brief and wait for the user's explicit okay - approval is not ex
38
38
  <worked_example>
39
39
  Request: "make auth better".
40
40
  1. Research waves -> current auth at `src/auth/*` and evidence for the requested improvement; best-practice baselines via librarian.
41
- 2. Topology lock as an ANNOUNCEMENT, not a question: components refine the evidenced auth intent in full, such as session hardening, brute-force protection, and password policy when the repository supports them. MFA is an adjacent capability and stays in Scope OUT unless the user asks for it or evidence establishes it as part of the requested outcome.
41
+ 2. Affected user and ideal state, announced: the people who sign in and the operators who read auth logs; IS rows the evidence supports - a legitimate user is never locked out, brute force is stopped, a session is never reusable after a privilege change. Topology lock as an ANNOUNCEMENT, not a question: components refine the evidenced auth intent in full, such as session hardening, brute-force protection, and password policy when the repository supports them. MFA is an adjacent capability and stays in Scope OUT unless the user asks for it or evidence establishes it as part of the requested outcome.
42
42
  3. Adopted-defaults table (assumption | default | rationale | reversible?): bcrypt rounds 8 -> 12 (reversible), add 5/min-per-IP login limit (reversible), rotate session id on privilege change (reversible).
43
43
  4. Metis folded -> auto dual review (fix eligible gaps under the bounded convergence contract) -> brief LEADING with the approach and the defaults, surfaced in the human TL;DR for veto.
44
44
  </worked_example>