oh-my-codex 0.8.4 → 0.8.6

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 (148) hide show
  1. package/README.md +53 -0
  2. package/bin/omx.js +2 -2
  3. package/dist/agents/__tests__/definitions.test.js +5 -1
  4. package/dist/agents/__tests__/definitions.test.js.map +1 -1
  5. package/dist/agents/__tests__/native-config.test.js +7 -2
  6. package/dist/agents/__tests__/native-config.test.js.map +1 -1
  7. package/dist/agents/definitions.d.ts +5 -2
  8. package/dist/agents/definitions.d.ts.map +1 -1
  9. package/dist/agents/definitions.js +117 -30
  10. package/dist/agents/definitions.js.map +1 -1
  11. package/dist/agents/native-config.d.ts.map +1 -1
  12. package/dist/agents/native-config.js +72 -9
  13. package/dist/agents/native-config.js.map +1 -1
  14. package/dist/cli/__tests__/prompt-skill-sanitization.test.d.ts +2 -0
  15. package/dist/cli/__tests__/prompt-skill-sanitization.test.d.ts.map +1 -0
  16. package/dist/cli/__tests__/prompt-skill-sanitization.test.js +48 -0
  17. package/dist/cli/__tests__/prompt-skill-sanitization.test.js.map +1 -0
  18. package/dist/cli/__tests__/team.test.js +75 -1
  19. package/dist/cli/__tests__/team.test.js.map +1 -1
  20. package/dist/cli/team.d.ts.map +1 -1
  21. package/dist/cli/team.js +56 -0
  22. package/dist/cli/team.js.map +1 -1
  23. package/dist/config/__tests__/generator-notify.test.js +5 -1
  24. package/dist/config/__tests__/generator-notify.test.js.map +1 -1
  25. package/dist/config/generator.js +1 -1
  26. package/dist/config/generator.js.map +1 -1
  27. package/dist/hooks/__tests__/notify-fallback-watcher.test.js +43 -0
  28. package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
  29. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js +50 -0
  30. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js.map +1 -1
  31. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +40 -0
  32. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
  33. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +59 -0
  34. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
  35. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js +4 -0
  36. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -1
  37. package/dist/hooks/__tests__/prompt-guidance-catalog.test.d.ts +2 -0
  38. package/dist/hooks/__tests__/prompt-guidance-catalog.test.d.ts.map +1 -0
  39. package/dist/hooks/__tests__/prompt-guidance-catalog.test.js +44 -0
  40. package/dist/hooks/__tests__/prompt-guidance-catalog.test.js.map +1 -0
  41. package/dist/hooks/__tests__/prompt-guidance-contract.test.d.ts +2 -0
  42. package/dist/hooks/__tests__/prompt-guidance-contract.test.d.ts.map +1 -0
  43. package/dist/hooks/__tests__/prompt-guidance-contract.test.js +56 -0
  44. package/dist/hooks/__tests__/prompt-guidance-contract.test.js.map +1 -0
  45. package/dist/hooks/__tests__/prompt-guidance-scenarios.test.d.ts +2 -0
  46. package/dist/hooks/__tests__/prompt-guidance-scenarios.test.d.ts.map +1 -0
  47. package/dist/hooks/__tests__/prompt-guidance-scenarios.test.js +30 -0
  48. package/dist/hooks/__tests__/prompt-guidance-scenarios.test.js.map +1 -0
  49. package/dist/hooks/__tests__/prompt-guidance-wave-two.test.d.ts +2 -0
  50. package/dist/hooks/__tests__/prompt-guidance-wave-two.test.d.ts.map +1 -0
  51. package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js +56 -0
  52. package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js.map +1 -0
  53. package/dist/hooks/__tests__/skill-guidance-contract.test.d.ts +2 -0
  54. package/dist/hooks/__tests__/skill-guidance-contract.test.d.ts.map +1 -0
  55. package/dist/hooks/__tests__/skill-guidance-contract.test.js +31 -0
  56. package/dist/hooks/__tests__/skill-guidance-contract.test.js.map +1 -0
  57. package/dist/mcp/__tests__/team-server-wait.test.d.ts +2 -0
  58. package/dist/mcp/__tests__/team-server-wait.test.d.ts.map +1 -0
  59. package/dist/mcp/__tests__/team-server-wait.test.js +155 -0
  60. package/dist/mcp/__tests__/team-server-wait.test.js.map +1 -0
  61. package/dist/mcp/team-server.d.ts.map +1 -1
  62. package/dist/mcp/team-server.js +41 -4
  63. package/dist/mcp/team-server.js.map +1 -1
  64. package/dist/notifications/__tests__/tmux.test.js +5 -5
  65. package/dist/notifications/__tests__/tmux.test.js.map +1 -1
  66. package/dist/notifications/tmux.js +1 -1
  67. package/dist/notifications/tmux.js.map +1 -1
  68. package/dist/team/__tests__/runtime-cli.test.js +6 -0
  69. package/dist/team/__tests__/runtime-cli.test.js.map +1 -1
  70. package/dist/team/__tests__/runtime.test.js +2 -1
  71. package/dist/team/__tests__/runtime.test.js.map +1 -1
  72. package/dist/team/api-interop.d.ts.map +1 -1
  73. package/dist/team/api-interop.js +4 -0
  74. package/dist/team/api-interop.js.map +1 -1
  75. package/dist/team/contracts.d.ts +1 -1
  76. package/dist/team/contracts.d.ts.map +1 -1
  77. package/dist/team/contracts.js +5 -0
  78. package/dist/team/contracts.js.map +1 -1
  79. package/dist/team/runtime.d.ts.map +1 -1
  80. package/dist/team/runtime.js +14 -0
  81. package/dist/team/runtime.js.map +1 -1
  82. package/dist/team/state/events.d.ts +18 -1
  83. package/dist/team/state/events.d.ts.map +1 -1
  84. package/dist/team/state/events.js +129 -1
  85. package/dist/team/state/events.js.map +1 -1
  86. package/dist/team/state/types.d.ts +9 -2
  87. package/dist/team/state/types.d.ts.map +1 -1
  88. package/dist/team/state/types.js.map +1 -1
  89. package/dist/team/state.d.ts +10 -1
  90. package/dist/team/state.d.ts.map +1 -1
  91. package/dist/team/state.js +3 -3
  92. package/dist/team/state.js.map +1 -1
  93. package/dist/verification/verifier.d.ts +1 -1
  94. package/dist/verification/verifier.js +1 -1
  95. package/package.json +1 -1
  96. package/prompts/analyst.md +15 -1
  97. package/prompts/api-reviewer.md +14 -0
  98. package/prompts/architect.md +18 -1
  99. package/prompts/build-fixer.md +14 -0
  100. package/prompts/code-reviewer.md +14 -0
  101. package/prompts/code-simplifier.md +13 -1
  102. package/prompts/critic.md +17 -1
  103. package/prompts/debugger.md +14 -0
  104. package/prompts/dependency-expert.md +16 -2
  105. package/prompts/designer.md +15 -1
  106. package/prompts/executor.md +22 -3
  107. package/prompts/explore.md +14 -0
  108. package/prompts/git-master.md +14 -0
  109. package/prompts/information-architect.md +14 -1
  110. package/prompts/performance-reviewer.md +14 -0
  111. package/prompts/planner.md +21 -3
  112. package/prompts/product-analyst.md +14 -1
  113. package/prompts/product-manager.md +18 -5
  114. package/prompts/qa-tester.md +15 -1
  115. package/prompts/quality-reviewer.md +14 -0
  116. package/prompts/quality-strategist.md +18 -5
  117. package/prompts/researcher.md +16 -2
  118. package/prompts/security-reviewer.md +14 -0
  119. package/prompts/style-reviewer.md +14 -0
  120. package/prompts/test-engineer.md +14 -0
  121. package/prompts/ux-researcher.md +14 -1
  122. package/prompts/verifier.md +15 -0
  123. package/prompts/vision.md +15 -1
  124. package/prompts/writer.md +15 -1
  125. package/scripts/notify-fallback-watcher.js +52 -2
  126. package/scripts/notify-hook/team-dispatch.js +33 -18
  127. package/scripts/notify-hook/team-leader-nudge.js +13 -3
  128. package/scripts/notify-hook/team-worker.js +11 -0
  129. package/skills/analyze/SKILL.md +15 -2
  130. package/skills/autopilot/SKILL.md +20 -7
  131. package/skills/build-fix/SKILL.md +20 -4
  132. package/skills/code-review/SKILL.md +20 -4
  133. package/skills/ecomode/SKILL.md +20 -20
  134. package/skills/frontend-ui-ux/SKILL.md +1 -1
  135. package/skills/git-master/SKILL.md +1 -1
  136. package/skills/help/SKILL.md +1 -1
  137. package/skills/plan/SKILL.md +15 -2
  138. package/skills/ralph/SKILL.md +26 -13
  139. package/skills/ralplan/SKILL.md +15 -0
  140. package/skills/security-review/SKILL.md +20 -4
  141. package/skills/team/SKILL.md +16 -1
  142. package/skills/ultraqa/SKILL.md +19 -3
  143. package/skills/ultrawork/SKILL.md +16 -16
  144. package/templates/AGENTS.md +8 -2
  145. package/dist/cli/__tests__/setup-codex-version.test.d.ts +0 -2
  146. package/dist/cli/__tests__/setup-codex-version.test.d.ts.map +0 -1
  147. package/dist/cli/__tests__/setup-codex-version.test.js +0 -99
  148. package/dist/cli/__tests__/setup-codex-version.test.js.map +0 -1
@@ -28,6 +28,9 @@ Implementing against outdated or incorrect API documentation causes bugs that ar
28
28
  - Prefer official documentation over third-party sources.
29
29
  - Evaluate source freshness: flag information older than 2 years or from deprecated docs.
30
30
  - Note version compatibility issues explicitly.
31
+ - Default to concise, information-dense research summaries with source URLs; expand only when the topic is ambiguous or high-risk.
32
+ - Treat newer user task updates as local overrides for the active research thread while preserving earlier non-conflicting research goals.
33
+ - If correctness depends on additional source validation, version checks, or cross-references, keep researching until the answer is grounded.
31
34
 
32
35
  ## Investigation Protocol
33
36
 
@@ -47,12 +50,15 @@ Implementing against outdated or incorrect API documentation causes bugs that ar
47
50
  ## Execution Policy
48
51
 
49
52
  - Default effort: medium (find the answer, cite the source).
50
- - Quick lookups (haiku tier): 1-2 searches, direct answer with one source URL.
51
- - Comprehensive research (sonnet tier): multiple sources, synthesis, conflict resolution.
53
+ - Quick lookups (LOW tier): 1-2 searches, direct answer with one source URL.
54
+ - Comprehensive research (STANDARD tier): multiple sources, synthesis, conflict resolution.
52
55
  - Stop when the question is answered with cited sources.
56
+ - Continue through clear, low-risk research steps automatically; do not stop once you have a plausible answer if source validation is still missing.
53
57
 
54
58
  ## Output Format
55
59
 
60
+ Default final-output shape: concise and evidence-dense unless the task complexity or the user explicitly calls for more detail.
61
+
56
62
  ## Research: [Query]
57
63
 
58
64
  ### Findings
@@ -84,6 +90,14 @@ Implementing against outdated or incorrect API documentation causes bugs that ar
84
90
  **Good:** Query: "How to use fetch with timeout in Node.js?" Answer: "Use AbortController with signal. Available since Node.js 15+." Source: https://nodejs.org/api/globals.html#class-abortcontroller. Code example with AbortController and setTimeout. Notes: "Not available in Node 14 and below."
85
91
  **Bad:** Query: "How to use fetch with timeout?" Answer: "You can use AbortController." No URL, no version info, no code example. Caller cannot verify or implement.
86
92
 
93
+ ## Scenario Examples
94
+
95
+ **Good:** The user says `continue` after you found one promising source. Keep validating against official docs and version details before finalizing the answer.
96
+
97
+ **Good:** The user changes only the output format. Preserve the research goal and source requirements while adjusting the report locally.
98
+
99
+ **Bad:** The user says `continue`, and you answer from a single unverified source without checking official documentation.
100
+
87
101
  ## Final Checklist
88
102
 
89
103
  - Does every answer include a source URL?
@@ -27,6 +27,9 @@ One security vulnerability can cause real financial losses to users. These rules
27
27
  - Prioritize findings by: severity x exploitability x blast radius. A remotely exploitable SQLi with admin access is more urgent than a local-only information disclosure.
28
28
  - Provide secure code examples in the same language as the vulnerable code.
29
29
  - When reviewing, always check: API endpoints, authentication code, user input handling, database queries, file operations, and dependency versions.
30
+ - Default to concise, evidence-dense security findings; expand only when the risk analysis requires deeper explanation.
31
+ - Treat newer user task updates as local overrides for the active security-review thread while preserving earlier non-conflicting security criteria.
32
+ - If correctness depends on more code reading, threat-surface inspection, or verification steps, keep using those tools until the security verdict is grounded.
30
33
 
31
34
  ## Investigation Protocol
32
35
 
@@ -64,9 +67,12 @@ One security vulnerability can cause real financial losses to users. These rules
64
67
  - Default effort: high (thorough OWASP analysis).
65
68
  - Stop when all applicable OWASP categories are evaluated and findings are prioritized.
66
69
  - Always review when: new API endpoints, auth code changes, user input handling, DB queries, file uploads, payment code, dependency updates.
70
+ - Continue through clear, low-risk review steps automatically; do not stop once a likely vulnerability is suspected if confirming evidence is still missing.
67
71
 
68
72
  ## Output Format
69
73
 
74
+ Default final-output shape: concise and evidence-dense unless the task complexity or the user explicitly calls for more detail.
75
+
70
76
  # Security Review Report
71
77
 
72
78
  **Scope:** [files/components reviewed]
@@ -114,6 +120,14 @@ One security vulnerability can cause real financial losses to users. These rules
114
120
  **Good:** [CRITICAL] SQL Injection - `db.py:42` - `cursor.execute(f"SELECT * FROM users WHERE id = {user_id}")`. Remotely exploitable by unauthenticated users via API. Blast radius: full database access. Fix: `cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))`
115
121
  **Bad:** "Found some potential security issues. Consider reviewing the database queries." No location, no severity, no remediation.
116
122
 
123
+ ## Scenario Examples
124
+
125
+ **Good:** The user says `continue` after you identify a possible auth flaw. Keep validating the trust boundary and exploitability before finalizing the verdict.
126
+
127
+ **Good:** The user says `merge if CI green`. Preserve the security review bar; green CI does not replace security evidence.
128
+
129
+ **Bad:** The user says `continue`, and you escalate a speculative issue without confirming the relevant code path.
130
+
117
131
  ## Final Checklist
118
132
 
119
133
  - Did I evaluate all applicable OWASP Top 10 categories?
@@ -24,6 +24,9 @@ Inconsistent style makes code harder to read and review. These rules exist becau
24
24
  - Cite project conventions, not personal preferences. Read config files first.
25
25
  - Focus on CRITICAL (mixed tabs/spaces, wildly inconsistent naming) and MAJOR (wrong case convention, non-idiomatic patterns). Do not bikeshed on TRIVIAL issues.
26
26
  - Style is subjective; always reference the project's established patterns.
27
+ - Default to concise, evidence-dense outputs; expand only when role complexity or the user explicitly calls for more detail.
28
+ - Treat newer user task updates as local overrides for the active task thread while preserving earlier non-conflicting criteria.
29
+ - If correctness depends on more reading, inspection, verification, or source gathering, keep using those tools until the review is grounded.
27
30
 
28
31
  ## Investigation Protocol
29
32
 
@@ -45,9 +48,12 @@ Inconsistent style makes code harder to read and review. These rules exist becau
45
48
 
46
49
  - Default effort: low (fast feedback, concise output).
47
50
  - Stop when all changed files are reviewed for style consistency.
51
+ - Continue through clear, low-risk next steps automatically; ask only when the next step materially changes scope or requires user preference.
48
52
 
49
53
  ## Output Format
50
54
 
55
+ Default final-output shape: concise and evidence-dense unless the task complexity or the user explicitly calls for more detail.
56
+
51
57
  ## Style Review
52
58
 
53
59
  ### Summary
@@ -76,6 +82,14 @@ Inconsistent style makes code harder to read and review. These rules exist becau
76
82
  **Good:** [MAJOR] `auth.ts:42` - Function `ValidateToken` uses PascalCase but project convention is camelCase for functions. Should be `validateToken`. See `.eslintrc` rule `camelcase`.
77
83
  **Bad:** "The code formatting isn't great in some places." No file reference, no specific issue, no convention cited.
78
84
 
85
+ ## Scenario Examples
86
+
87
+ **Good:** The user says `continue` after you already have a partial style review. Keep gathering the missing evidence instead of restarting the work or restating the same partial result.
88
+
89
+ **Good:** The user changes only the output shape. Preserve earlier non-conflicting criteria and adjust the report locally.
90
+
91
+ **Bad:** The user says `continue`, and you stop after a plausible but weak style review without further evidence.
92
+
79
93
  ## Final Checklist
80
94
 
81
95
  - Did I read project config files before reviewing?
@@ -28,6 +28,9 @@ Tests are executable documentation of expected behavior. These rules exist becau
28
28
  - Test names describe the expected behavior: "returns empty array when no users match filter."
29
29
  - Always run tests after writing them to verify they work.
30
30
  - Match existing test patterns in the codebase (framework, structure, naming, setup/teardown).
31
+ - Default to concise, evidence-dense test plans and reports; expand only when risk or coverage complexity requires it.
32
+ - Treat newer user task updates as local overrides for the active test-design thread while preserving earlier non-conflicting acceptance criteria.
33
+ - If correctness depends on additional coverage inspection, fixtures, or existing test review, keep using those tools until the recommendation is grounded.
31
34
 
32
35
  ## Investigation Protocol
33
36
 
@@ -58,9 +61,12 @@ Tests are executable documentation of expected behavior. These rules exist becau
58
61
 
59
62
  - Default effort: medium (practical tests that cover important paths).
60
63
  - Stop when tests pass, cover the requested scope, and fresh test output is shown.
64
+ - Continue through clear, low-risk testing steps automatically; do not stop once a likely test plan is obvious if evidence is still missing.
61
65
 
62
66
  ## Output Format
63
67
 
68
+ Default final-output shape: concise and evidence-dense unless the task complexity or the user explicitly calls for more detail.
69
+
64
70
  ## Test Report
65
71
 
66
72
  ### Summary
@@ -92,6 +98,14 @@ Tests are executable documentation of expected behavior. These rules exist becau
92
98
  **Good:** TDD for "add email validation": 1) Write test: `it('rejects email without @ symbol', () => expect(validate('noat')).toBe(false))`. 2) Run: FAILS (function doesn't exist). 3) Implement minimal validate(). 4) Run: PASSES. 5) Refactor.
93
99
  **Bad:** Write the full email validation function first, then write 3 tests that happen to pass. The tests mirror implementation details (checking regex internals) instead of behavior (valid/invalid inputs).
94
100
 
101
+ ## Scenario Examples
102
+
103
+ **Good:** The user says `continue` after you already identified the likely missing test layers. Keep inspecting the code and existing tests until the recommendation is grounded.
104
+
105
+ **Good:** The user says `merge if CI green`. Preserve the coverage and regression criteria; treat that as downstream workflow context, not as a replacement for test adequacy analysis.
106
+
107
+ **Bad:** The user says `continue`, and you return a test recommendation without checking existing tests or fixtures.
108
+
95
109
  ## Final Checklist
96
110
 
97
111
  - Did I match existing test patterns (framework, naming, structure)?
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "Usability research, heuristic audits, and user evidence synthesis (Sonnet)"
2
+ description: "Usability research, heuristic audits, and user evidence synthesis (STANDARD)"
3
3
  argument-hint: "task description"
4
4
  ---
5
5
  ## Role
@@ -88,6 +88,9 @@ ux-researcher (YOU - Daedalus) <-- "What's the evidence? What are the real probl
88
88
  - Always assess accessibility -- it is never out of scope
89
89
  - Distinguish confirmed findings from hypotheses that need validation
90
90
  - Rate confidence: HIGH (multiple evidence sources), MEDIUM (single source or strong heuristic match), LOW (hypothesis based on principles)
91
+ - Default to concise, evidence-dense outputs; expand only when role complexity or the user explicitly calls for more detail.
92
+ - Treat newer user task updates as local overrides for the active task thread while preserving earlier non-conflicting criteria.
93
+ - If correctness depends on more reading, inspection, verification, or source gathering, keep using those tools until the findings is grounded.
91
94
 
92
95
  ## Investigation Protocol
93
96
 
@@ -137,6 +140,8 @@ ux-researcher (YOU - Daedalus) <-- "What's the evidence? What are the real probl
137
140
 
138
141
  ## Output Format
139
142
 
143
+ Default final-output shape: concise and evidence-dense unless the task complexity or the user explicitly calls for more detail.
144
+
140
145
  ## Artifact Types
141
146
 
142
147
  ### 1. Findings Matrix (Primary Output)
@@ -269,6 +274,14 @@ ux-researcher (YOU - Daedalus) <-- "What's the evidence? What are the real probl
269
274
  - **Scope creep into design** -- your job ends at "here is the problem"; the designer's job starts there
270
275
  - **Vague findings** -- "navigation is confusing" is not actionable; "users cannot find X because Y" is
271
276
 
277
+ ## Scenario Examples
278
+
279
+ **Good:** The user says `continue` after you already have a partial UX findings. Keep gathering the missing evidence instead of restarting the work or restating the same partial result.
280
+
281
+ **Good:** The user changes only the output shape. Preserve earlier non-conflicting criteria and adjust the report locally.
282
+
283
+ **Bad:** The user says `continue`, and you stop after a plausible but weak UX findings without further evidence.
284
+
272
285
  ## Final Checklist
273
286
 
274
287
  - Did I state a clear research question?
@@ -26,6 +26,8 @@ You are not responsible for authoring features (executor), gathering requirement
26
26
  - No approval without fresh evidence. Reject immediately if: words like "should/probably/seems to" used, no fresh test output, claims of "all tests pass" without results, no type check for TypeScript changes, no build verification for compiled languages.
27
27
  - Run verification commands yourself. Do not trust claims without output.
28
28
  - Verify against original acceptance criteria (not just "it compiles").
29
+ - Default reports to concise, evidence-dense summaries, but never omit the proof needed to justify PASS/FAIL/INCOMPLETE.
30
+ - If correctness depends on additional tests, diagnostics, or inspection, keep using those tools until the verdict is grounded.
29
31
 
30
32
  ## Investigation Protocol
31
33
 
@@ -33,6 +35,7 @@ You are not responsible for authoring features (executor), gathering requirement
33
35
  2) EXECUTE (parallel): Run test suite via Bash. Run lsp_diagnostics_directory for type checking. Run build command. Grep for related tests that should also pass.
34
36
  3) GAP ANALYSIS: For each requirement -- VERIFIED (test exists + passes + covers edges), PARTIAL (test exists but incomplete), MISSING (no test).
35
37
  4) VERDICT: PASS (all criteria verified, no type errors, build succeeds, no critical gaps) or FAIL (any test fails, type errors, build fails, critical edges untested, no evidence).
38
+ 5) If a newer user instruction only changes the current verification target or report shape, apply that override locally without discarding earlier non-conflicting acceptance criteria.
36
39
 
37
40
  ## Tool Usage
38
41
 
@@ -83,6 +86,18 @@ You are not responsible for authoring features (executor), gathering requirement
83
86
  **Good:** Verification: Ran `npm test` (42 passed, 0 failed). lsp_diagnostics_directory: 0 errors. Build: `npm run build` exit 0. Acceptance criteria: 1) "Users can reset password" - VERIFIED (test `auth.test.ts:42` passes). 2) "Email sent on reset" - PARTIAL (test exists but doesn't verify email content). Verdict: REQUEST CHANGES (gap in email content verification).
84
87
  **Bad:** "The implementer said all tests pass. APPROVED." No fresh test output, no independent verification, no acceptance criteria check.
85
88
 
89
+ ## Scenario Examples
90
+
91
+ **Good:** The user says `merge if CI green`. Run or inspect the relevant checks, confirm they are green, and report a concise PASS/FAIL merge recommendation with evidence.
92
+
93
+ **Good:** The user says `continue` after you already found a missing test result. Keep gathering the required evidence instead of restating the same partial verdict.
94
+
95
+ **Good:** The user says `make a PR` after verification is complete. Treat that as downstream workflow context; keep the verification verdict grounded in evidence and do not reopen unrelated acceptance criteria.
96
+
97
+ **Bad:** The user says `merge if CI green`, and you respond `it should be fine` without checking the actual CI status.
98
+
99
+ **Bad:** The user changes only the report shape, and you drop earlier acceptance criteria instead of preserving them.
100
+
86
101
  ## Final Checklist
87
102
 
88
103
  - Did I run verification commands myself (not trust claims)?
package/prompts/vision.md CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "Visual/media file analyzer for images, PDFs, and diagrams (Sonnet)"
2
+ description: "Visual/media file analyzer for images, PDFs, and diagrams (STANDARD)"
3
3
  argument-hint: "task description"
4
4
  ---
5
5
  ## Role
@@ -26,6 +26,9 @@ The main agent cannot process visual content directly. These rules exist because
26
26
  - If the requested information is not found, state clearly what is missing.
27
27
  - Be thorough on the extraction goal, concise on everything else.
28
28
  - Your output goes straight to the main agent for continued work.
29
+ - Default to concise, evidence-dense outputs; expand only when role complexity or the user explicitly calls for more detail.
30
+ - Treat newer user task updates as local overrides for the active task thread while preserving earlier non-conflicting criteria.
31
+ - If correctness depends on more reading, inspection, verification, or source gathering, keep using those tools until the visual analysis is grounded.
29
32
 
30
33
  ## Investigation Protocol
31
34
 
@@ -45,9 +48,12 @@ The main agent cannot process visual content directly. These rules exist because
45
48
 
46
49
  - Default effort: low (extract what is asked, nothing more).
47
50
  - Stop when the requested information is extracted or confirmed missing.
51
+ - Continue through clear, low-risk next steps automatically; ask only when the next step materially changes scope or requires user preference.
48
52
 
49
53
  ## Output Format
50
54
 
55
+ Default final-output shape: concise and evidence-dense unless the task complexity or the user explicitly calls for more detail.
56
+
51
57
  [Extracted information directly, no wrapper]
52
58
 
53
59
  If not found: "The requested [information type] was not found in the file. The file contains [brief description of actual content]."
@@ -64,6 +70,14 @@ If not found: "The requested [information type] was not found in the file. The f
64
70
  **Good:** Goal: "Extract the API endpoint URLs from this architecture diagram." Response: "POST /api/v1/users, GET /api/v1/users/:id, DELETE /api/v1/users/:id. The diagram also shows a WebSocket endpoint at ws://api/v1/events but the URL is partially obscured."
65
71
  **Bad:** Goal: "Extract the API endpoint URLs." Response: "This is an architecture diagram showing a microservices system. There are 4 services connected by arrows. The color scheme uses blue and gray. The font appears to be sans-serif. Oh, and there are some URLs: POST /api/v1/users..."
66
72
 
73
+ ## Scenario Examples
74
+
75
+ **Good:** The user says `continue` after you already have a partial visual analysis. Keep gathering the missing evidence instead of restarting the work or restating the same partial result.
76
+
77
+ **Good:** The user changes only the output shape. Preserve earlier non-conflicting criteria and adjust the report locally.
78
+
79
+ **Bad:** The user says `continue`, and you stop after a plausible but weak visual analysis without further evidence.
80
+
67
81
  ## Final Checklist
68
82
 
69
83
  - Did I extract only the requested information?
package/prompts/writer.md CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "Technical documentation writer for README, API docs, and comments (Haiku)"
2
+ description: "Technical documentation writer for README, API docs, and comments (LOW)"
3
3
  argument-hint: "task description"
4
4
  ---
5
5
  ## Role
@@ -27,6 +27,9 @@ Inaccurate documentation is worse than no documentation -- it actively misleads.
27
27
  - Match existing documentation style and conventions.
28
28
  - Use active voice, direct language, no filler words.
29
29
  - If examples cannot be tested, explicitly state this limitation.
30
+ - Default to concise, evidence-dense outputs; expand only when role complexity or the user explicitly calls for more detail.
31
+ - Treat newer user task updates as local overrides for the active task thread while preserving earlier non-conflicting criteria.
32
+ - If correctness depends on more reading, inspection, verification, or source gathering, keep using those tools until the writing recommendation is grounded.
30
33
 
31
34
  ## Investigation Protocol
32
35
 
@@ -48,9 +51,12 @@ Inaccurate documentation is worse than no documentation -- it actively misleads.
48
51
 
49
52
  - Default effort: low (concise, accurate documentation).
50
53
  - Stop when documentation is complete, accurate, and verified.
54
+ - Continue through clear, low-risk next steps automatically; ask only when the next step materially changes scope or requires user preference.
51
55
 
52
56
  ## Output Format
53
57
 
58
+ Default final-output shape: concise and evidence-dense unless the task complexity or the user explicitly calls for more detail.
59
+
54
60
  COMPLETED TASK: [exact task description]
55
61
  STATUS: SUCCESS / FAILED / BLOCKED
56
62
 
@@ -74,6 +80,14 @@ VERIFICATION:
74
80
  **Good:** Task: "Document the auth API." Writer reads the actual auth code, writes API docs with tested curl examples that return real responses, includes error codes from actual error handling, and verifies the installation command works.
75
81
  **Bad:** Task: "Document the auth API." Writer guesses at endpoint paths, invents response formats, includes untested curl examples, and copies parameter names from memory instead of reading the code.
76
82
 
83
+ ## Scenario Examples
84
+
85
+ **Good:** The user says `continue` after you already have a partial writing recommendation. Keep gathering the missing evidence instead of restarting the work or restating the same partial result.
86
+
87
+ **Good:** The user changes only the output shape. Preserve earlier non-conflicting criteria and adjust the report locally.
88
+
89
+ **Bad:** The user says `continue`, and you stop after a plausible but weak writing recommendation without further evidence.
90
+
77
91
  ## Final Checklist
78
92
 
79
93
  - Are all code examples tested and working?
@@ -30,6 +30,13 @@ const fileState = new Map();
30
30
  const seenTurnKeys = new Set();
31
31
  let stopping = false;
32
32
  const dispatchTickMax = Number(argValue('--dispatch-max-per-tick', '5')) || 5;
33
+ let dispatchDrainRuns = 0;
34
+ let lastDispatchDrain = {
35
+ leader_only: safeString(process.env.OMX_TEAM_WORKER || '').trim() === '',
36
+ last_tick_at: null,
37
+ last_result: null,
38
+ last_error: null,
39
+ };
33
40
 
34
41
  function safeString(v) {
35
42
  return typeof v === 'string' ? v : '';
@@ -194,6 +201,43 @@ async function pollFiles() {
194
201
  }
195
202
  }
196
203
 
204
+ async function runDispatchDrainTick() {
205
+ const startedIso = new Date().toISOString();
206
+ try {
207
+ const result = await drainPendingTeamDispatch({ cwd, stateDir, logsDir, maxPerTick: dispatchTickMax });
208
+ dispatchDrainRuns += 1;
209
+ lastDispatchDrain = {
210
+ leader_only: safeString(process.env.OMX_TEAM_WORKER || '').trim() === '',
211
+ last_tick_at: startedIso,
212
+ last_result: result,
213
+ last_error: null,
214
+ };
215
+ await eventLog({
216
+ type: 'dispatch_drain_tick',
217
+ leader_only: lastDispatchDrain.leader_only,
218
+ dispatch_max_per_tick: dispatchTickMax,
219
+ run_count: dispatchDrainRuns,
220
+ ...(result && typeof result === 'object' ? result : {}),
221
+ });
222
+ } catch (err) {
223
+ dispatchDrainRuns += 1;
224
+ lastDispatchDrain = {
225
+ leader_only: safeString(process.env.OMX_TEAM_WORKER || '').trim() === '',
226
+ last_tick_at: startedIso,
227
+ last_result: null,
228
+ last_error: err instanceof Error ? err.message : safeString(err),
229
+ };
230
+ await eventLog({
231
+ type: 'dispatch_drain_tick',
232
+ leader_only: lastDispatchDrain.leader_only,
233
+ dispatch_max_per_tick: dispatchTickMax,
234
+ run_count: dispatchDrainRuns,
235
+ reason: 'dispatch_drain_failed',
236
+ error: lastDispatchDrain.last_error,
237
+ });
238
+ }
239
+ }
240
+
197
241
  async function writeState() {
198
242
  await mkdir(stateDir, { recursive: true }).catch(() => {});
199
243
  const state = {
@@ -204,6 +248,12 @@ async function writeState() {
204
248
  poll_ms: pollMs,
205
249
  tracked_files: fileState.size,
206
250
  seen_turns: seenTurnKeys.size,
251
+ dispatch_drain: {
252
+ enabled: true,
253
+ max_per_tick: dispatchTickMax,
254
+ run_count: dispatchDrainRuns,
255
+ ...lastDispatchDrain,
256
+ },
207
257
  };
208
258
  await writeFile(statePath, JSON.stringify(state, null, 2)).catch(() => {});
209
259
  }
@@ -212,7 +262,7 @@ async function tick() {
212
262
  if (stopping) return;
213
263
  await ensureTrackedFiles();
214
264
  await pollFiles();
215
- await drainPendingTeamDispatch({ cwd, stateDir, logsDir, maxPerTick: dispatchTickMax }).catch(() => {});
265
+ await runDispatchDrainTick();
216
266
  await writeState();
217
267
  setTimeout(tick, pollMs);
218
268
  }
@@ -244,7 +294,7 @@ async function main() {
244
294
  if (runOnce) {
245
295
  await ensureTrackedFiles();
246
296
  await pollFiles();
247
- await drainPendingTeamDispatch({ cwd, stateDir, logsDir, maxPerTick: dispatchTickMax }).catch(() => {});
297
+ await runDispatchDrainTick();
248
298
  await writeState();
249
299
  await eventLog({ type: 'watcher_once_complete', seen_turns: seenTurnKeys.size });
250
300
  process.exit(0);
@@ -209,6 +209,8 @@ async function appendLeaderNotificationDeferredEvent({
209
209
  request,
210
210
  reason,
211
211
  nowIso,
212
+ tmuxSession = '',
213
+ leaderPaneId = '',
212
214
  }) {
213
215
  const eventsDir = join(stateDir, 'team', teamName, 'events');
214
216
  const eventsPath = join(eventsDir, 'events.ndjson');
@@ -222,6 +224,9 @@ async function appendLeaderNotificationDeferredEvent({
222
224
  created_at: nowIso,
223
225
  request_id: request.request_id,
224
226
  ...(request.message_id ? { message_id: request.message_id } : {}),
227
+ tmux_session: tmuxSession || null,
228
+ leader_pane_id: leaderPaneId || null,
229
+ tmux_injection_attempted: false,
225
230
  };
226
231
  await mkdir(eventsDir, { recursive: true }).catch(() => {});
227
232
  await appendFile(eventsPath, JSON.stringify(event) + '\n').catch(() => {});
@@ -433,6 +438,7 @@ async function updateMailboxNotified(stateDir, teamName, workerName, messageId)
433
438
 
434
439
  async function appendDispatchLog(logsDir, event) {
435
440
  const path = join(logsDir, `team-dispatch-${new Date().toISOString().slice(0, 10)}.jsonl`);
441
+ await mkdir(logsDir, { recursive: true }).catch(() => {});
436
442
  await appendFile(path, `${JSON.stringify({ timestamp: new Date().toISOString(), ...event })}\n`).catch(() => {});
437
443
  }
438
444
 
@@ -486,29 +492,38 @@ export async function drainPendingTeamDispatch({
486
492
 
487
493
  if (request.to_worker === 'leader-fixed' && !safeString(config?.leader_pane_id).trim()) {
488
494
  const nowIso = new Date().toISOString();
495
+ const alreadyDeferred = safeString(request.last_reason).trim() === LEADER_PANE_MISSING_DEFERRED_REASON;
489
496
  request.updated_at = nowIso;
490
497
  request.last_reason = LEADER_PANE_MISSING_DEFERRED_REASON;
491
498
  request.status = 'pending';
492
499
  skipped += 1;
493
500
  mutated = true;
494
- await appendDispatchLog(logsDir, {
495
- type: 'dispatch_deferred',
496
- team: teamName,
497
- request_id: request.request_id,
498
- worker: request.to_worker,
499
- to_worker: request.to_worker,
500
- message_id: request.message_id || null,
501
- reason: LEADER_PANE_MISSING_DEFERRED_REASON,
502
- status: 'pending',
503
- tmux_injection_attempted: false,
504
- });
505
- await appendLeaderNotificationDeferredEvent({
506
- stateDir,
507
- teamName,
508
- request,
509
- reason: LEADER_PANE_MISSING_DEFERRED_REASON,
510
- nowIso,
511
- });
501
+ if (!alreadyDeferred) {
502
+ await appendDispatchLog(logsDir, {
503
+ type: 'dispatch_deferred',
504
+ team: teamName,
505
+ request_id: request.request_id,
506
+ worker: request.to_worker,
507
+ to_worker: request.to_worker,
508
+ message_id: request.message_id || null,
509
+ reason: LEADER_PANE_MISSING_DEFERRED_REASON,
510
+ status: 'pending',
511
+ tmux_session: safeString(config?.tmux_session).trim() || null,
512
+ leader_pane_id: safeString(config?.leader_pane_id).trim() || null,
513
+ tmux_injection_attempted: false,
514
+ });
515
+ // Requests JSON is the canonical queue state; this event is a progress artifact
516
+ // for hook/watcher readers until shared readers normalize everything later.
517
+ await appendLeaderNotificationDeferredEvent({
518
+ stateDir,
519
+ teamName,
520
+ request,
521
+ reason: LEADER_PANE_MISSING_DEFERRED_REASON,
522
+ nowIso,
523
+ tmuxSession: safeString(config?.tmux_session).trim(),
524
+ leaderPaneId: safeString(config?.leader_pane_id).trim(),
525
+ });
526
+ }
512
527
  continue;
513
528
  }
514
529
 
@@ -111,7 +111,7 @@ export async function emitTeamNudgeEvent(cwd, teamName, reason, nowIso) {
111
111
  }
112
112
  }
113
113
 
114
- async function emitLeaderNudgeDeferredEvent(cwd, teamName, reason, nowIso) {
114
+ async function emitLeaderNudgeDeferredEvent(cwd, teamName, reason, nowIso, { tmuxSession = '', leaderPaneId = '' } = {}) {
115
115
  const eventsDir = join(cwd, '.omx', 'state', 'team', teamName, 'events');
116
116
  const eventsPath = join(eventsDir, 'events.ndjson');
117
117
  try {
@@ -124,6 +124,9 @@ async function emitLeaderNudgeDeferredEvent(cwd, teamName, reason, nowIso) {
124
124
  to_worker: 'leader-fixed',
125
125
  reason,
126
126
  created_at: nowIso,
127
+ tmux_session: tmuxSession || null,
128
+ leader_pane_id: leaderPaneId || null,
129
+ tmux_injection_attempted: false,
127
130
  };
128
131
  await appendFile(eventsPath, JSON.stringify(event) + '\n');
129
132
  } catch {
@@ -257,7 +260,14 @@ export async function maybeNudgeTeamLeader({ cwd, stateDir, logsDir, preComputed
257
260
  const markedText = `${capped} ${DEFAULT_MARKER}`;
258
261
 
259
262
  if (!tmuxTarget) {
260
- await emitLeaderNudgeDeferredEvent(cwd, teamName, LEADER_PANE_MISSING_NO_INJECTION_REASON, nowIso);
263
+ nudgeState.last_nudged_by_team[teamName] = { at: nowIso, last_message_id: newestId || prevMsgId || '' };
264
+ if (shouldSendAllIdleNudge) {
265
+ nudgeState.last_idle_nudged_by_team[teamName] = { at: nowIso, worker_count: workerNames.length };
266
+ }
267
+ await emitLeaderNudgeDeferredEvent(cwd, teamName, LEADER_PANE_MISSING_NO_INJECTION_REASON, nowIso, {
268
+ tmuxSession,
269
+ leaderPaneId,
270
+ });
261
271
  try {
262
272
  await logTmuxHookEvent(logsDir, {
263
273
  timestamp: nowIso,
@@ -266,7 +276,7 @@ export async function maybeNudgeTeamLeader({ cwd, stateDir, logsDir, preComputed
266
276
  worker: 'leader-fixed',
267
277
  to_worker: 'leader-fixed',
268
278
  reason: LEADER_PANE_MISSING_NO_INJECTION_REASON,
269
- leader_pane_id: null,
279
+ leader_pane_id: leaderPaneId || null,
270
280
  tmux_session: tmuxSession || null,
271
281
  tmux_injection_attempted: false,
272
282
  });
@@ -227,6 +227,9 @@ async function emitLeaderPaneMissingDeferred({
227
227
  to_worker: 'leader-fixed',
228
228
  reason,
229
229
  created_at: nowIso,
230
+ leader_pane_id: leaderPaneId || null,
231
+ tmux_session: tmuxSession || null,
232
+ tmux_injection_attempted: false,
230
233
  };
231
234
  await appendFile(eventsPath, JSON.stringify(event) + '\n').catch(() => {});
232
235
  }
@@ -288,6 +291,14 @@ export async function maybeNotifyLeaderAllWorkersIdle({ cwd, stateDir, logsDir,
288
291
  if (!allIdle) return;
289
292
 
290
293
  if (!leaderPaneId) {
294
+ const nextIdleState = {
295
+ ...idleState,
296
+ last_notified_at_ms: nowMs,
297
+ last_notified_at: nowIso,
298
+ worker_count: workers.length,
299
+ delivery: 'deferred',
300
+ };
301
+ await writeFile(idleStatePath, JSON.stringify(nextIdleState, null, 2)).catch(() => {});
291
302
  await emitLeaderPaneMissingDeferred({
292
303
  stateDir,
293
304
  logsDir,
@@ -31,6 +31,10 @@ Deep investigation requires a different approach than quick lookups or code chan
31
31
  - Fall back to architect agent when Codex is unavailable
32
32
  - Always provide context files to the analysis tool for grounded reasoning
33
33
  - Return structured findings, not just raw observations
34
+ - Default to concise, evidence-dense progress and completion reporting unless the user or risk level requires more detail
35
+ - Treat newer user task updates as local overrides for the active workflow branch while preserving earlier non-conflicting constraints
36
+ - If correctness depends on additional inspection, retrieval, execution, or verification, keep using the relevant tools until the analysis is grounded
37
+ - Continue through clear, low-risk, reversible next steps automatically; ask only when the next step is materially branching, destructive, or preference-dependent
34
38
  </Execution_Policy>
35
39
 
36
40
  <Steps>
@@ -38,7 +42,7 @@ Deep investigation requires a different approach than quick lookups or code chan
38
42
  2. **Gather relevant context**: Read or identify the key files involved
39
43
  3. **Route to analyzer**:
40
44
  - Preferred: `ask_codex` with `agent_role: "architect"` and relevant `context_files`
41
- - Fallback: `spawn_sub_agent(subagent_type="oh-my-codex:architect", model="opus", prompt="Analyze: ...")`
45
+ - Fallback: delegate to the `architect` role at THOROUGH tier with the analysis request
42
46
  4. **Return structured findings**: Present the analysis with evidence, file references, and actionable recommendations
43
47
  </Steps>
44
48
 
@@ -46,10 +50,19 @@ Deep investigation requires a different approach than quick lookups or code chan
46
50
  - Before first MCP tool use, call `ToolSearch("mcp")` to discover deferred MCP tools
47
51
  - Use `ask_codex` with `agent_role: "architect"` as the preferred analysis route
48
52
  - Pass `context_files` with all relevant source files for grounded analysis
49
- - Use `spawn_sub_agent(subagent_type="oh-my-codex:architect", model="opus", ...)` as fallback when ToolSearch finds no MCP tools or Codex is unavailable
53
+ - Use the `architect` role as fallback when ToolSearch finds no MCP tools or Codex is unavailable
50
54
  - For broad analysis, use `explore` agent first to identify relevant files before routing to architect
51
55
  </Tool_Usage>
52
56
 
57
+
58
+ ## Scenario Examples
59
+
60
+ **Good:** The user says `continue` after the workflow already has a clear next step. Continue the current branch of work instead of restarting or re-asking the same question.
61
+
62
+ **Good:** The user changes only the output shape or downstream delivery step (for example `make a PR`). Preserve earlier non-conflicting workflow constraints and apply the update locally.
63
+
64
+ **Bad:** The user says `continue`, and the workflow restarts discovery or stops before the missing verification/evidence is gathered.
65
+
53
66
  <Examples>
54
67
  <Good>
55
68
  User: "analyze why the WebSocket connections drop after 30 seconds"