oh-my-opencode 5.0.0-beta.34 → 5.0.0-beta.36

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 (220) hide show
  1. package/.agents/skills/codex-qa/scripts/lsp-e2e.sh +1 -3
  2. package/.agents/skills/opencode-qa/scripts/lsp-e2e.sh +1 -1
  3. package/.agents/skills/tech-debt-audit/SKILL.md +6 -76
  4. package/README.ja.md +1 -1
  5. package/README.ko.md +1 -1
  6. package/README.md +1 -1
  7. package/README.ru.md +1 -1
  8. package/README.zh-cn.md +1 -1
  9. package/THIRD-PARTY-NOTICES.md +27 -99
  10. package/dist/cli/index.js +48341 -48541
  11. package/dist/cli-node/index.js +49016 -49216
  12. package/dist/config/index.d.ts +1 -1
  13. package/dist/config/schema/hooks.d.ts +0 -1
  14. package/dist/config/schema/oh-my-opencode-config.d.ts +0 -10
  15. package/dist/config/schema.d.ts +0 -1
  16. package/dist/create-hooks.d.ts +0 -1
  17. package/dist/hooks/index.d.ts +0 -1
  18. package/dist/index.js +11675 -13718
  19. package/dist/mcp/index.d.ts +0 -4
  20. package/dist/mcp/types.d.ts +0 -1
  21. package/dist/oh-my-opencode.schema.json +1 -45
  22. package/dist/plugin/hooks/create-core-hooks.d.ts +0 -1
  23. package/dist/plugin/hooks/create-session-hooks.d.ts +1 -2
  24. package/dist/shared/omo-process-sweep.d.ts +2 -4
  25. package/dist/skills/init-deep/SKILL.md +13 -13
  26. package/dist/skills/ulw-execute/SKILL.md +9 -9
  27. package/dist/skills/ulw-plan/SKILL.md +0 -1
  28. package/dist/tui.js +44809 -44883
  29. package/package.json +16 -21
  30. package/packages/omo-codex/THIRD-PARTY-NOTICES.md +0 -17
  31. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -3
  32. package/packages/omo-codex/plugin/.mcp.json +0 -6
  33. package/packages/omo-codex/plugin/AGENTS.md +5 -5
  34. package/packages/omo-codex/plugin/README.md +1 -1
  35. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +1 -15
  36. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  37. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  38. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  39. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  40. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  41. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  42. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  43. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  44. package/packages/omo-codex/plugin/components/lcx/skills/lcx-doctor/SKILL.md +1 -1
  45. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  46. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  47. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  48. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  49. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  50. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  51. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  52. package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +1 -1
  53. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  54. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  55. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +2 -2
  56. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  57. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  58. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +0 -1
  59. package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +1 -1
  60. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +2 -2
  61. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  62. package/packages/omo-codex/plugin/components/ulw-loop/README.md +11 -1
  63. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +2 -2
  64. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.d.ts +12 -0
  65. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.js +45 -0
  66. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.d.ts +1 -0
  67. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.js +5 -0
  68. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.js +10 -3
  69. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +35 -38
  70. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +278 -193
  71. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.d.ts +5 -0
  72. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.js +7 -51
  73. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.js +39 -22
  74. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.d.ts +13 -1
  75. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.js +64 -8
  76. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.js +5 -1
  77. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +37 -18
  78. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  79. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  80. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +2 -1
  81. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-codex-validation.ts +81 -0
  82. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-reconciliation.ts +6 -0
  83. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-template.ts +10 -3
  84. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +32 -63
  85. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-aggregate.ts +7 -53
  86. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-artifacts.ts +50 -31
  87. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-fields.ts +67 -14
  88. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts +6 -1
  89. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +36 -17
  90. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-final.test.ts +26 -0
  91. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-template.test.ts +47 -2
  92. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-aggregate-basics.test.ts +258 -0
  93. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-cap-and-dedupe.test.ts +22 -0
  94. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-poisoning-cascades.test.ts +97 -0
  95. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-single-report.test.ts +241 -0
  96. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  97. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  98. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  99. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  100. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  101. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  102. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  103. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  104. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  105. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  106. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  107. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  108. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  109. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  110. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  111. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  112. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-ulw-execute-continuation.json +1 -1
  113. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  114. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  115. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  116. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  117. package/packages/omo-codex/plugin/package-lock.json +12 -146
  118. package/packages/omo-codex/plugin/package.json +1 -2
  119. package/packages/omo-codex/plugin/scripts/AGENTS.md +0 -1
  120. package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +0 -1
  121. package/packages/omo-codex/plugin/scripts/auto-update.mjs +0 -9
  122. package/packages/omo-codex/plugin/scripts/hook-status-message.mjs +0 -1
  123. package/packages/omo-codex/plugin/shared/src/config-loader.ts +2 -102
  124. package/packages/omo-codex/plugin/shared/src/config-migration.ts +0 -1
  125. package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +41 -130
  126. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +13 -13
  127. package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +1 -1
  128. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +2 -2
  129. package/packages/omo-codex/plugin/skills/ulw-execute/SKILL.md +11 -19
  130. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +2 -1
  131. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +0 -1
  132. package/packages/omo-codex/plugin/test/AGENTS.md +2 -2
  133. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +2 -21
  134. package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +1 -2
  135. package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +2 -7
  136. package/packages/omo-codex/plugin/test/auto-update.test.mjs +0 -25
  137. package/packages/omo-codex/plugin/test/bootstrap-setup.test.mjs +0 -31
  138. package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +0 -50
  139. package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +0 -1
  140. package/packages/omo-codex/plugin/test/mcp-research-servers.test.mjs +1 -3
  141. package/packages/omo-codex/scripts/install-config-git-bash.test.mjs +0 -23
  142. package/packages/omo-codex/scripts/install-dist/install-local.mjs +227 -435
  143. package/packages/omo-codex/scripts/install-git-bash-mcp-env.test.mjs +1 -25
  144. package/packages/omo-codex/scripts/install-mcp-runtime.test.mjs +0 -36
  145. package/packages/shared-skills/skills/init-deep/SKILL.md +13 -13
  146. package/packages/shared-skills/skills/ulw-execute/SKILL.md +9 -9
  147. package/packages/shared-skills/skills/ulw-plan/SKILL.md +0 -1
  148. package/dist/config/schema/codegraph.d.ts +0 -12
  149. package/dist/hooks/codegraph-bootstrap/command-runner.d.ts +0 -17
  150. package/dist/hooks/codegraph-bootstrap/hook.d.ts +0 -35
  151. package/dist/hooks/codegraph-bootstrap/index.d.ts +0 -1
  152. package/dist/hooks/codegraph-bootstrap/project-root.d.ts +0 -1
  153. package/dist/hooks/codegraph-bootstrap/status.d.ts +0 -11
  154. package/dist/mcp/codegraph.d.ts +0 -16
  155. package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +0 -58
  156. package/packages/omo-codex/plugin/components/codegraph/LICENSE +0 -21
  157. package/packages/omo-codex/plugin/components/codegraph/NODE-RUNTIME-LICENSES.md +0 -2951
  158. package/packages/omo-codex/plugin/components/codegraph/NOTICE +0 -16
  159. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +0 -12326
  160. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +0 -9908
  161. package/packages/omo-codex/plugin/components/codegraph/package.json +0 -33
  162. package/packages/omo-codex/plugin/components/codegraph/src/cache-gc.ts +0 -29
  163. package/packages/omo-codex/plugin/components/codegraph/src/cli.ts +0 -79
  164. package/packages/omo-codex/plugin/components/codegraph/src/hook-input.ts +0 -33
  165. package/packages/omo-codex/plugin/components/codegraph/src/hook-sweep.ts +0 -25
  166. package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +0 -131
  167. package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +0 -258
  168. package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +0 -310
  169. package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +0 -92
  170. package/packages/omo-codex/plugin/components/codegraph/src/post-tool-use-hook.ts +0 -34
  171. package/packages/omo-codex/plugin/components/codegraph/src/serve-invocation.ts +0 -29
  172. package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +0 -263
  173. package/packages/omo-codex/plugin/components/codegraph/src/session-start-command.ts +0 -106
  174. package/packages/omo-codex/plugin/components/codegraph/src/session-start-cooldown.ts +0 -145
  175. package/packages/omo-codex/plugin/components/codegraph/src/session-start-hook-runtime.ts +0 -22
  176. package/packages/omo-codex/plugin/components/codegraph/src/session-start-lock.ts +0 -139
  177. package/packages/omo-codex/plugin/components/codegraph/src/session-start-outcome.ts +0 -15
  178. package/packages/omo-codex/plugin/components/codegraph/src/session-start-paths.ts +0 -32
  179. package/packages/omo-codex/plugin/components/codegraph/src/session-start-project.ts +0 -109
  180. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker-result.ts +0 -148
  181. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +0 -175
  182. package/packages/omo-codex/plugin/components/codegraph/src/sweep-cli.ts +0 -81
  183. package/packages/omo-codex/plugin/components/codegraph/test/cache-gc.test.ts +0 -34
  184. package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +0 -112
  185. package/packages/omo-codex/plugin/components/codegraph/test/hook-registration.test.ts +0 -26
  186. package/packages/omo-codex/plugin/components/codegraph/test/hook-session-start-guard.test.ts +0 -160
  187. package/packages/omo-codex/plugin/components/codegraph/test/hook-store-upgrade.test.ts +0 -50
  188. package/packages/omo-codex/plugin/components/codegraph/test/hook-sweep.test.ts +0 -29
  189. package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +0 -320
  190. package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +0 -172
  191. package/packages/omo-codex/plugin/components/codegraph/test/package-runtime.test.ts +0 -91
  192. package/packages/omo-codex/plugin/components/codegraph/test/provisioned-node-guard.test.ts +0 -100
  193. package/packages/omo-codex/plugin/components/codegraph/test/serve-built-wrapper.test.ts +0 -76
  194. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge-lifecycle.test.ts +0 -133
  195. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +0 -245
  196. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-facade.test.ts +0 -69
  197. package/packages/omo-codex/plugin/components/codegraph/test/serve-node-support.test.ts +0 -43
  198. package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +0 -147
  199. package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable-idle.test.ts +0 -47
  200. package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable.test.ts +0 -175
  201. package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +0 -385
  202. package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +0 -206
  203. package/packages/omo-codex/plugin/components/codegraph/test/session-start-project.test.ts +0 -58
  204. package/packages/omo-codex/plugin/components/codegraph/test/session-start-state.test.ts +0 -104
  205. package/packages/omo-codex/plugin/components/codegraph/test/session-start-trust-boundary.test.ts +0 -65
  206. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-availability.test.ts +0 -106
  207. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-cooldown.test.ts +0 -116
  208. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +0 -258
  209. package/packages/omo-codex/plugin/components/codegraph/test/sweep-cli.test.ts +0 -56
  210. package/packages/omo-codex/plugin/components/codegraph/tsconfig.build.json +0 -13
  211. package/packages/omo-codex/plugin/components/codegraph/tsconfig.json +0 -25
  212. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-aggregate.test.ts +0 -101
  213. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +0 -18
  214. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +0 -17
  215. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/editor.mjs +0 -125
  216. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/jsonc.mjs +0 -43
  217. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/scaffold.mjs +0 -29
  218. package/packages/omo-codex/plugin/scripts/migrate-omo-sot.mjs +0 -121
  219. package/packages/omo-codex/plugin/test/component-codegraph-mcp-smoke.test.mjs +0 -76
  220. package/packages/omo-codex/plugin/test/migrate-omo-sot.test.mjs +0 -179
@@ -0,0 +1,241 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { validateQualityGate } from "../src/quality-gate.js";
3
+ import { UlwLoopError } from "../src/types.js";
4
+
5
+ describe("quality gate single report per invalid value", () => {
6
+ it("#given an empty artifact reference id #when validating #then reports only the array item defect", () => {
7
+ const gate = {
8
+ manualQa: {
9
+ by: "main-session",
10
+ status: "passed",
11
+ evidence: "qa",
12
+ surfaceEvidence: [
13
+ {
14
+ id: "surface",
15
+ criterionRef: "C001",
16
+ surface: "cli",
17
+ invocation: "run",
18
+ verdict: "passed",
19
+ artifactRefs: [""],
20
+ },
21
+ ],
22
+ adversarialCases: [
23
+ {
24
+ id: "adv",
25
+ criterionRef: "C001",
26
+ scenario: "scenario",
27
+ expectedBehavior: "reject",
28
+ verdict: "passed",
29
+ artifactRefs: [],
30
+ },
31
+ ],
32
+ artifactRefs: [{ id: "artifact", kind: "cli-transcript", description: "artifact", path: "artifact.txt" }],
33
+ },
34
+ gateReview: {
35
+ by: "category:deep",
36
+ recommendation: "APPROVE",
37
+ evidence: "review",
38
+ reportPath: "report.txt",
39
+ blockers: [],
40
+ },
41
+ iteration: { fullRerun: true, status: "passed", rerunCommands: ["test"], evidence: "rerun" },
42
+ criteriaCoverage: {
43
+ totalCriteria: 1,
44
+ passCount: 1,
45
+ originalIntent: "intent",
46
+ desiredOutcome: "outcome",
47
+ userOutcomeReview: "review",
48
+ adversarialClassesCovered: ["none"],
49
+ },
50
+ };
51
+ try {
52
+ validateQualityGate(gate, { reviewerSurface: "omo-senpi" });
53
+ throw new Error("expected validation failure");
54
+ } catch (error) {
55
+ expect(error).toBeInstanceOf(UlwLoopError);
56
+ if (!(error instanceof UlwLoopError)) throw error;
57
+ const fields = error.details?.["fields"];
58
+ const artifactFields = Array.isArray(fields)
59
+ ? fields.filter((item) => item["field"] === "manualQa.surfaceEvidence[0].artifactRefs")
60
+ : [];
61
+ expect(artifactFields).toHaveLength(1);
62
+ }
63
+ });
64
+
65
+ it("#given a malformed artifact entry #when validating #then does not derive downstream artifact defects", () => {
66
+ const gate = {
67
+ manualQa: {
68
+ by: "main-session",
69
+ status: "passed",
70
+ evidence: "qa",
71
+ surfaceEvidence: [],
72
+ adversarialCases: [],
73
+ artifactRefs: [null],
74
+ },
75
+ gateReview: {
76
+ by: "category:deep",
77
+ recommendation: "APPROVE",
78
+ evidence: "review",
79
+ reportPath: "report.txt",
80
+ blockers: [],
81
+ },
82
+ iteration: { fullRerun: true, status: "passed", rerunCommands: ["test"], evidence: "rerun" },
83
+ criteriaCoverage: {
84
+ totalCriteria: 1,
85
+ passCount: 1,
86
+ originalIntent: "intent",
87
+ desiredOutcome: "outcome",
88
+ userOutcomeReview: "review",
89
+ adversarialClassesCovered: ["none"],
90
+ },
91
+ };
92
+ try {
93
+ validateQualityGate(gate, { reviewerSurface: "omo-senpi" });
94
+ throw new Error("expected validation failure");
95
+ } catch (error) {
96
+ expect(error).toBeInstanceOf(UlwLoopError);
97
+ if (!(error instanceof UlwLoopError)) throw error;
98
+ const fields = error.details?.["fields"];
99
+ const artifactFields = Array.isArray(fields)
100
+ ? fields.filter((item) => String(item["field"]).startsWith("manualQa.artifactRefs[0]"))
101
+ : [];
102
+ expect(artifactFields).toHaveLength(1);
103
+ expect(artifactFields[0]?.["field"]).toBe("manualQa.artifactRefs[0]");
104
+ }
105
+ });
106
+
107
+ it("#given an invalid artifact kind #when validating #then does not derive compatibility defects", () => {
108
+ const gate = {
109
+ manualQa: {
110
+ by: "main-session",
111
+ status: "passed",
112
+ evidence: "qa",
113
+ surfaceEvidence: [
114
+ {
115
+ id: "surface",
116
+ criterionRef: "C001",
117
+ // A data surface accepts only data-diff, so the validator's "log" fallback
118
+ // for the invalid kind WOULD trip the compatibility check if poisoning
119
+ // were removed; a cli surface would let the fallback pass silently.
120
+ surface: "data",
121
+ invocation: "run",
122
+ verdict: "passed",
123
+ artifactRefs: ["artifact"],
124
+ },
125
+ ],
126
+ adversarialCases: [
127
+ {
128
+ id: "adv",
129
+ criterionRef: "C001",
130
+ scenario: "scenario",
131
+ expectedBehavior: "reject",
132
+ verdict: "passed",
133
+ artifactRefs: [],
134
+ },
135
+ ],
136
+ artifactRefs: [{ id: "artifact", kind: "invalid", description: "artifact", path: "artifact.txt" }],
137
+ },
138
+ gateReview: {
139
+ by: "category:deep",
140
+ recommendation: "APPROVE",
141
+ evidence: "review",
142
+ reportPath: "report.txt",
143
+ blockers: [],
144
+ },
145
+ iteration: { fullRerun: true, status: "passed", rerunCommands: ["test"], evidence: "rerun" },
146
+ criteriaCoverage: {
147
+ totalCriteria: 1,
148
+ passCount: 1,
149
+ originalIntent: "intent",
150
+ desiredOutcome: "outcome",
151
+ userOutcomeReview: "review",
152
+ adversarialClassesCovered: ["none"],
153
+ },
154
+ };
155
+ try {
156
+ validateQualityGate(gate, { reviewerSurface: "omo-senpi" });
157
+ throw new Error("expected validation failure");
158
+ } catch (error) {
159
+ expect(error).toBeInstanceOf(UlwLoopError);
160
+ if (!(error instanceof UlwLoopError)) throw error;
161
+ const fields = error.details?.["fields"];
162
+ const labels = Array.isArray(fields) ? fields.map((item) => item["field"]) : [];
163
+ expect(labels).toContain("manualQa.artifactRefs[0].kind");
164
+ expect(labels).not.toContain("manualQa.surfaceEvidence");
165
+ expect(labels).not.toContain("manualQa.surfaceEvidence[0].artifactRefs");
166
+ expect(labels.filter((label) => label === "manualQa.artifactRefs[0].kind")).toHaveLength(1);
167
+ }
168
+ });
169
+ it("#given an empty gate #when validating #then reports each missing section once", () => {
170
+ try {
171
+ validateQualityGate({}, { reviewerSurface: "omo-senpi" });
172
+ throw new Error("expected validation failure");
173
+ } catch (error) {
174
+ expect(error).toBeInstanceOf(UlwLoopError);
175
+ if (!(error instanceof UlwLoopError)) throw error;
176
+ const fields = error.details?.["fields"];
177
+ const labels = Array.isArray(fields) ? fields.map((item) => item["field"]) : [];
178
+ expect(labels).toEqual(expect.arrayContaining(["manualQa", "gateReview", "iteration", "criteriaCoverage"]));
179
+ expect(new Set(labels).size).toBe(labels.length);
180
+ }
181
+ });
182
+
183
+ it("#given a not-applicable surface verdict #when validating #then reports that verdict defect once", () => {
184
+ const gate = {
185
+ manualQa: {
186
+ by: "main-session",
187
+ status: "passed",
188
+ evidence: "qa",
189
+ surfaceEvidence: [
190
+ {
191
+ id: "surface",
192
+ criterionRef: "C001",
193
+ surface: "cli",
194
+ invocation: "run",
195
+ verdict: "not_applicable",
196
+ artifactRefs: [],
197
+ },
198
+ ],
199
+ adversarialCases: [
200
+ {
201
+ id: "adv",
202
+ criterionRef: "C001",
203
+ scenario: "scenario",
204
+ expectedBehavior: "reject",
205
+ verdict: "passed",
206
+ artifactRefs: [],
207
+ },
208
+ ],
209
+ artifactRefs: [{ id: "artifact", kind: "cli-transcript", description: "artifact", path: "artifact.txt" }],
210
+ },
211
+ gateReview: {
212
+ by: "category:deep",
213
+ recommendation: "APPROVE",
214
+ evidence: "review",
215
+ reportPath: "report.txt",
216
+ blockers: [],
217
+ },
218
+ iteration: { fullRerun: true, status: "passed", rerunCommands: ["test"], evidence: "rerun" },
219
+ criteriaCoverage: {
220
+ totalCriteria: 1,
221
+ passCount: 1,
222
+ originalIntent: "intent",
223
+ desiredOutcome: "outcome",
224
+ userOutcomeReview: "review",
225
+ adversarialClassesCovered: ["none"],
226
+ },
227
+ };
228
+ try {
229
+ validateQualityGate(gate, { reviewerSurface: "omo-senpi" });
230
+ throw new Error("expected validation failure");
231
+ } catch (error) {
232
+ expect(error).toBeInstanceOf(UlwLoopError);
233
+ if (!(error instanceof UlwLoopError)) throw error;
234
+ const fields = error.details?.["fields"];
235
+ const verdictFields = Array.isArray(fields)
236
+ ? fields.filter((item) => item["field"] === "manualQa.surfaceEvidence[0].verdict")
237
+ : [];
238
+ expect(verdictFields).toHaveLength(1);
239
+ }
240
+ });
241
+ });
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/git-bash/dist/cli.js\" hook post-compact",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.34) Resetting Git Bash MCP Reminder",
10
+ "statusMessage": "(OmO 5.0.0-beta.36) Resetting Git Bash MCP Reminder",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\git-bash\\dist\\cli.js\" hook post-compact"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/lsp/dist/cli.js\" hook post-compact",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.34) Resetting LSP Diagnostics Cache",
10
+ "statusMessage": "(OmO 5.0.0-beta.36) Resetting LSP Diagnostics Cache",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\lsp\\dist\\cli.js\" hook post-compact"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook post-compact",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.34) Resetting Project Rule Cache",
10
+ "statusMessage": "(OmO 5.0.0-beta.36) Resetting Project Rule Cache",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook post-compact"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/comment-checker/dist/cli.js\" hook post-tool-use",
9
9
  "timeout": 30,
10
- "statusMessage": "(OmO 5.0.0-beta.34) Checking Comments",
10
+ "statusMessage": "(OmO 5.0.0-beta.36) Checking Comments",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\comment-checker\\dist\\cli.js\" hook post-tool-use"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/lsp/dist/cli.js\" hook post-tool-use",
9
9
  "timeout": 60,
10
- "statusMessage": "(OmO 5.0.0-beta.34) Checking LSP Diagnostics",
10
+ "statusMessage": "(OmO 5.0.0-beta.36) Checking LSP Diagnostics",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\lsp\\dist\\cli.js\" hook post-tool-use"
12
12
  }
13
13
  ],
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/teammode/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 10,
11
- "statusMessage": "(OmO 5.0.0-beta.34) Checking Thread Title Hygiene",
11
+ "statusMessage": "(OmO 5.0.0-beta.36) Checking Thread Title Hygiene",
12
12
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\teammode\\dist\\cli.js\" hook post-tool-use"
13
13
  }
14
14
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook post-tool-use",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.34) Matching Project Rules",
10
+ "statusMessage": "(OmO 5.0.0-beta.36) Matching Project Rules",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook post-tool-use"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook pre-tool-use",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.34) Enforcing Unlimited Goal Budget",
10
+ "statusMessage": "(OmO 5.0.0-beta.36) Enforcing Unlimited Goal Budget",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook pre-tool-use"
12
12
  }
13
13
  ],
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook pre-tool-use-spawn",
10
10
  "timeout": 5,
11
- "statusMessage": "(OmO 5.0.0-beta.34) Guarding Ulw-Loop Spawns",
11
+ "statusMessage": "(OmO 5.0.0-beta.36) Guarding Ulw-Loop Spawns",
12
12
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook pre-tool-use-spawn"
13
13
  }
14
14
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/git-bash/dist/cli.js\" hook pre-tool-use",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.34) Recommending Git Bash MCP",
10
+ "statusMessage": "(OmO 5.0.0-beta.36) Recommending Git Bash MCP",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\git-bash\\dist\\cli.js\" hook pre-tool-use"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/scripts/auto-update.mjs\" hook session-start",
9
9
  "timeout": 15,
10
- "statusMessage": "(OmO 5.0.0-beta.34) Checking Auto Update",
10
+ "statusMessage": "(OmO 5.0.0-beta.36) Checking Auto Update",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\scripts\\auto-update.mjs\" hook session-start"
12
12
  }
13
13
  ],
@@ -8,7 +8,7 @@
8
8
  "command": "node \"${PLUGIN_ROOT}/components/bootstrap/dist/cli.js\" hook session-start",
9
9
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\bootstrap.ps1\"",
10
10
  "timeout": 30,
11
- "statusMessage": "(OmO 5.0.0-beta.34) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 5.0.0-beta.36) Checking Bootstrap Provisioning"
12
12
  }
13
13
  ]
14
14
  }
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook session-start",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.34) Loading Project Rules",
10
+ "statusMessage": "(OmO 5.0.0-beta.36) Loading Project Rules",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook session-start"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/telemetry/dist/cli.js\" hook session-start",
9
9
  "timeout": 15,
10
- "statusMessage": "(OmO 5.0.0-beta.34) Recording Session Telemetry",
10
+ "statusMessage": "(OmO 5.0.0-beta.36) Recording Session Telemetry",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\telemetry\\dist\\cli.js\" hook session-start"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-execute-continuation/dist/cli.js\" hook stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.34) Checking Ulw-Execute Continuation",
10
+ "statusMessage": "(OmO 5.0.0-beta.36) Checking Ulw-Execute Continuation",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-execute-continuation\\dist\\cli.js\" hook stop"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.34) Checking Ulw-Loop Resume",
10
+ "statusMessage": "(OmO 5.0.0-beta.36) Checking Ulw-Loop Resume",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook stop"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-execute-continuation/dist/cli.js\" hook subagent-stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.34) Checking Ulw-Execute Continuation",
10
+ "statusMessage": "(OmO 5.0.0-beta.36) Checking Ulw-Execute Continuation",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-execute-continuation\\dist\\cli.js\" hook subagent-stop"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/lazycodex-executor-verify/dist/cli.js\" hook subagent-stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.34) Verifying LazyCodex Executor Evidence",
10
+ "statusMessage": "(OmO 5.0.0-beta.36) Verifying LazyCodex Executor Evidence",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\lazycodex-executor-verify\\dist\\cli.js\" hook subagent-stop"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ultrawork/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.34) Checking Ultrawork Trigger",
10
+ "statusMessage": "(OmO 5.0.0-beta.36) Checking Ultrawork Trigger",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ultrawork\\dist\\cli.js\" hook user-prompt-submit"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.34) Checking Ulw-Loop Steering",
10
+ "statusMessage": "(OmO 5.0.0-beta.36) Checking Ulw-Loop Steering",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook user-prompt-submit"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.34) Loading Project Rules",
10
+ "statusMessage": "(OmO 5.0.0-beta.36) Loading Project Rules",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook user-prompt-submit"
12
12
  }
13
13
  ]