lazycodex-ai 5.1.62 → 5.1.64

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 (276) hide show
  1. package/dist/cli/index.js +1598 -284
  2. package/dist/cli/service-auth/closed-device-login.fixture.d.ts +1 -0
  3. package/dist/cli/service-auth/credential-lock.d.ts +8 -2
  4. package/dist/cli/service-auth/keychain-helper/access.d.ts +27 -0
  5. package/dist/cli/service-auth/keychain-helper/approval-cache.d.ts +51 -0
  6. package/dist/cli/service-auth/keychain-helper/client.d.ts +68 -0
  7. package/dist/cli/service-auth/keychain-helper/creator-handoff.d.ts +31 -0
  8. package/dist/cli/service-auth/keychain-helper/darwin-backend.d.ts +75 -0
  9. package/dist/cli/service-auth/keychain-helper/darwin-read.d.ts +46 -0
  10. package/dist/cli/service-auth/keychain-helper/darwin-store.d.ts +28 -0
  11. package/dist/cli/service-auth/keychain-helper/fake-keychain.test-support.d.ts +85 -0
  12. package/dist/cli/service-auth/keychain-helper/location.d.ts +28 -0
  13. package/dist/cli/service-auth/keychain-helper/migration.d.ts +20 -0
  14. package/dist/cli/service-auth/keychain-helper/owner-marker.d.ts +7 -0
  15. package/dist/cli/service-auth/keychain-helper/pin.d.ts +20 -0
  16. package/dist/cli/service-auth/keychain-helper/process-copy.test-support.d.ts +3 -0
  17. package/dist/cli/service-auth/keychain-helper/process-state.d.ts +19 -0
  18. package/dist/cli/service-auth/keychain-helper/prompt-lock.d.ts +14 -0
  19. package/dist/cli/service-auth/keychain-helper/recovery.d.ts +34 -0
  20. package/dist/cli/service-auth/keychain-helper/runtime-capabilities.d.ts +13 -0
  21. package/dist/cli/service-auth/keychain-helper/secrets-gate.d.ts +4 -0
  22. package/dist/cli/service-auth/keychain-helper/signature.d.ts +17 -0
  23. package/dist/cli/service-auth/keychain-helper/store-binding.d.ts +46 -0
  24. package/dist/cli/service-auth/keystore.d.ts +18 -3
  25. package/dist/cli/service-auth/session.d.ts +2 -2
  26. package/dist/cli-node/index.js +1598 -284
  27. package/package.json +1 -1
  28. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  29. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  30. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  31. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  32. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  33. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  34. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  35. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  36. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  37. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  38. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  39. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  40. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  41. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  42. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  43. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  44. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  45. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  46. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +2 -0
  47. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  48. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  49. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +1 -1
  50. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +2 -2
  51. package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +1 -1
  52. package/packages/omo-codex/plugin/components/ulw-execute-continuation/directive.md +1 -1
  53. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  54. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  55. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +2 -0
  56. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  57. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  58. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +1 -1
  59. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/define-goal.md +1 -1
  60. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +10 -10
  61. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  62. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  63. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  64. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  65. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  66. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  67. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  68. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  69. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  70. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  71. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  72. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  73. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  74. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  75. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  76. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  77. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  78. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  79. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  80. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  81. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  82. package/packages/omo-codex/plugin/package-lock.json +12 -12
  83. package/packages/omo-codex/plugin/package.json +1 -1
  84. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +6 -3
  85. package/packages/omo-codex/plugin/skills/ast-grep/AGENTS.md +2 -2
  86. package/packages/omo-codex/plugin/skills/ast-grep/README.md +4 -4
  87. package/packages/omo-codex/plugin/skills/ast-grep/SKILL.md +10 -8
  88. package/packages/omo-codex/plugin/skills/ast-grep/references/cli.md +4 -3
  89. package/packages/omo-codex/plugin/skills/ast-grep/references/patterns.md +5 -5
  90. package/packages/omo-codex/plugin/skills/ast-grep/references/pitfalls.md +3 -3
  91. package/packages/omo-codex/plugin/skills/ast-grep/references/recipes.md +6 -4
  92. package/packages/omo-codex/plugin/skills/ast-grep/references/yaml-rules.md +3 -3
  93. package/packages/omo-codex/plugin/skills/ast-grep/scripts/ast_grep_helper.py +3 -3
  94. package/packages/omo-codex/plugin/skills/browser/SKILL.md +2 -3
  95. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
  96. package/packages/omo-codex/plugin/skills/coding-agent-sessions/AGENTS.md +1 -1
  97. package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +2 -1
  98. package/packages/omo-codex/plugin/skills/data-scientist/SKILL.md +8 -6
  99. package/packages/omo-codex/plugin/skills/data-scientist/references/placement.md +9 -5
  100. package/packages/omo-codex/plugin/skills/data-scientist/references/uv-setup.md +3 -3
  101. package/packages/omo-codex/plugin/skills/data-scientist/references/visualization.md +19 -4
  102. package/packages/omo-codex/plugin/skills/debugging/SKILL.md +5 -5
  103. package/packages/omo-codex/plugin/skills/debugging/references/methodology/02-investigate.md +2 -2
  104. package/packages/omo-codex/plugin/skills/debugging/references/methodology/06-fix.md +2 -0
  105. package/packages/omo-codex/plugin/skills/debugging/references/methodology/09-cleanup.md +2 -2
  106. package/packages/omo-codex/plugin/skills/debugging/references/methodology/partial-runtime-evidence.md +1 -1
  107. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/bundled-js-binary.md +1 -1
  108. package/packages/omo-codex/plugin/skills/debugging/references/runtimes/native-binary.md +1 -1
  109. package/packages/omo-codex/plugin/skills/debugging/references/tools/browser-qa.md +1 -2
  110. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +2 -2
  111. package/packages/omo-codex/plugin/skills/frontend/references/design/design-system-architecture.md +1 -1
  112. package/packages/omo-codex/plugin/skills/frontend/references/design/print-paged-media.md +1 -1
  113. package/packages/omo-codex/plugin/skills/frontend/references/perfection/README.md +0 -1
  114. package/packages/omo-codex/plugin/skills/frontend/references/perfection/react-perf-tooling.md +27 -8
  115. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/lighthouse-audit.py +0 -1
  116. package/packages/omo-codex/plugin/skills/git-master/SKILL.md +12 -2
  117. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +1 -1
  118. package/packages/omo-codex/plugin/skills/lsp-setup/SKILL.md +24 -15
  119. package/packages/omo-codex/plugin/skills/lsp-setup/references/bash/README.md +3 -3
  120. package/packages/omo-codex/plugin/skills/lsp-setup/references/c-cpp/README.md +2 -2
  121. package/packages/omo-codex/plugin/skills/lsp-setup/references/csharp/README.md +2 -2
  122. package/packages/omo-codex/plugin/skills/lsp-setup/references/dart/README.md +2 -2
  123. package/packages/omo-codex/plugin/skills/lsp-setup/references/elixir/README.md +2 -2
  124. package/packages/omo-codex/plugin/skills/lsp-setup/references/go/README.md +2 -2
  125. package/packages/omo-codex/plugin/skills/lsp-setup/references/haskell/README.md +2 -2
  126. package/packages/omo-codex/plugin/skills/lsp-setup/references/java/README.md +3 -3
  127. package/packages/omo-codex/plugin/skills/lsp-setup/references/julia/README.md +3 -3
  128. package/packages/omo-codex/plugin/skills/lsp-setup/references/kotlin/README.md +4 -4
  129. package/packages/omo-codex/plugin/skills/lsp-setup/references/lua/README.md +2 -2
  130. package/packages/omo-codex/plugin/skills/lsp-setup/references/php/README.md +3 -3
  131. package/packages/omo-codex/plugin/skills/lsp-setup/references/python/README.md +13 -12
  132. package/packages/omo-codex/plugin/skills/lsp-setup/references/ruby/README.md +2 -2
  133. package/packages/omo-codex/plugin/skills/lsp-setup/references/rust/README.md +2 -2
  134. package/packages/omo-codex/plugin/skills/lsp-setup/references/swift/README.md +4 -4
  135. package/packages/omo-codex/plugin/skills/lsp-setup/references/terraform/README.md +2 -2
  136. package/packages/omo-codex/plugin/skills/lsp-setup/references/typescript/README.md +3 -3
  137. package/packages/omo-codex/plugin/skills/lsp-setup/references/yaml/README.md +2 -2
  138. package/packages/omo-codex/plugin/skills/lsp-setup/references/zig/README.md +2 -2
  139. package/packages/omo-codex/plugin/skills/lsp-setup/scripts/detect-lsp.ts +1 -1
  140. package/packages/omo-codex/plugin/skills/lsp-setup/scripts/lsp-server-table.ts +3 -2
  141. package/packages/omo-codex/plugin/skills/programming/SKILL.md +5 -5
  142. package/packages/omo-codex/plugin/skills/programming/references/code-smells.md +2 -2
  143. package/packages/omo-codex/plugin/skills/programming/references/go/README.md +3 -3
  144. package/packages/omo-codex/plugin/skills/programming/references/python/README.md +8 -8
  145. package/packages/omo-codex/plugin/skills/programming/references/python/data-processing.md +9 -9
  146. package/packages/omo-codex/plugin/skills/programming/references/rust-ub/README.md +3 -3
  147. package/packages/omo-codex/plugin/skills/programming/references/typescript/README.md +5 -5
  148. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/new-project.ts +1 -1
  149. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +35 -35
  150. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +6 -6
  151. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +2 -2
  152. package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +10 -7
  153. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +4 -4
  154. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/README.md +2 -2
  155. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/career.md +1 -1
  156. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/social.md +1 -1
  157. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/web.md +4 -4
  158. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +2 -1
  159. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +16 -17
  160. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/fallback.md +10 -6
  161. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/jina.md +12 -12
  162. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/naver.md +3 -3
  163. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/playwright.md +1 -1
  164. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/rss.md +1 -1
  165. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/tls-impersonate.md +12 -7
  166. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +2 -0
  167. package/packages/omo-codex/plugin/skills/ulw-execute/SKILL.md +9 -6
  168. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +1 -1
  169. package/packages/omo-codex/plugin/skills/ulw-loop/references/define-goal.md +1 -1
  170. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +10 -10
  171. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +1 -1
  172. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +2 -2
  173. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +2 -2
  174. package/packages/omo-codex/plugin/skills/ulw-research/references/deliverable-phase.md +5 -5
  175. package/packages/omo-codex/plugin/skills/ulw-research/references/report-visualization.md +2 -2
  176. package/packages/omo-codex/plugin/skills/ulw-research/references/research-collection.md +2 -2
  177. package/packages/omo-codex/plugin/skills/ulw-research/references/unit-rules.md +2 -2
  178. package/packages/omo-codex/plugin/skills/visual-qa/AGENTS.md +1 -1
  179. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +5 -5
  180. package/packages/omo-codex/plugin/skills/visual-qa/references/browser-setup.md +4 -2
  181. package/packages/omo-codex/plugin/test/sync-skills-codex-compatibility.test.mjs +2 -0
  182. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +7 -3
  183. package/packages/omo-codex/scripts/install-dist/install-local.mjs +2 -2
  184. package/packages/prompts-core/prompts/ultrawork/codex.md +2 -0
  185. package/packages/shared-skills/skills/ast-grep/AGENTS.md +2 -2
  186. package/packages/shared-skills/skills/ast-grep/README.md +4 -4
  187. package/packages/shared-skills/skills/ast-grep/SKILL.md +10 -8
  188. package/packages/shared-skills/skills/ast-grep/references/cli.md +4 -3
  189. package/packages/shared-skills/skills/ast-grep/references/patterns.md +5 -5
  190. package/packages/shared-skills/skills/ast-grep/references/pitfalls.md +3 -3
  191. package/packages/shared-skills/skills/ast-grep/references/recipes.md +6 -4
  192. package/packages/shared-skills/skills/ast-grep/references/yaml-rules.md +3 -3
  193. package/packages/shared-skills/skills/ast-grep/scripts/ast_grep_helper.py +3 -3
  194. package/packages/shared-skills/skills/browser/SKILL.md +2 -3
  195. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
  196. package/packages/shared-skills/skills/coding-agent-sessions/AGENTS.md +1 -1
  197. package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +2 -1
  198. package/packages/shared-skills/skills/data-scientist/SKILL.md +8 -6
  199. package/packages/shared-skills/skills/data-scientist/references/placement.md +9 -5
  200. package/packages/shared-skills/skills/data-scientist/references/uv-setup.md +3 -3
  201. package/packages/shared-skills/skills/data-scientist/references/visualization.md +19 -4
  202. package/packages/shared-skills/skills/debugging/SKILL.md +5 -5
  203. package/packages/shared-skills/skills/debugging/references/methodology/02-investigate.md +2 -2
  204. package/packages/shared-skills/skills/debugging/references/methodology/06-fix.md +2 -0
  205. package/packages/shared-skills/skills/debugging/references/methodology/09-cleanup.md +2 -2
  206. package/packages/shared-skills/skills/debugging/references/methodology/partial-runtime-evidence.md +1 -1
  207. package/packages/shared-skills/skills/debugging/references/runtimes/bundled-js-binary.md +1 -1
  208. package/packages/shared-skills/skills/debugging/references/runtimes/native-binary.md +1 -1
  209. package/packages/shared-skills/skills/debugging/references/tools/browser-qa.md +1 -2
  210. package/packages/shared-skills/skills/frontend/SKILL.md +2 -2
  211. package/packages/shared-skills/skills/frontend/references/design/design-system-architecture.md +1 -1
  212. package/packages/shared-skills/skills/frontend/references/design/print-paged-media.md +1 -1
  213. package/packages/shared-skills/skills/frontend/references/perfection/README.md +0 -1
  214. package/packages/shared-skills/skills/frontend/references/perfection/react-perf-tooling.md +27 -8
  215. package/packages/shared-skills/skills/frontend/scripts/perfection/lighthouse-audit.py +0 -1
  216. package/packages/shared-skills/skills/git-master/SKILL.md +12 -2
  217. package/packages/shared-skills/skills/init-deep/SKILL.md +1 -1
  218. package/packages/shared-skills/skills/lsp-setup/SKILL.md +24 -15
  219. package/packages/shared-skills/skills/lsp-setup/references/bash/README.md +3 -3
  220. package/packages/shared-skills/skills/lsp-setup/references/c-cpp/README.md +2 -2
  221. package/packages/shared-skills/skills/lsp-setup/references/csharp/README.md +2 -2
  222. package/packages/shared-skills/skills/lsp-setup/references/dart/README.md +2 -2
  223. package/packages/shared-skills/skills/lsp-setup/references/elixir/README.md +2 -2
  224. package/packages/shared-skills/skills/lsp-setup/references/go/README.md +2 -2
  225. package/packages/shared-skills/skills/lsp-setup/references/haskell/README.md +2 -2
  226. package/packages/shared-skills/skills/lsp-setup/references/java/README.md +3 -3
  227. package/packages/shared-skills/skills/lsp-setup/references/julia/README.md +3 -3
  228. package/packages/shared-skills/skills/lsp-setup/references/kotlin/README.md +4 -4
  229. package/packages/shared-skills/skills/lsp-setup/references/lua/README.md +2 -2
  230. package/packages/shared-skills/skills/lsp-setup/references/php/README.md +3 -3
  231. package/packages/shared-skills/skills/lsp-setup/references/python/README.md +13 -12
  232. package/packages/shared-skills/skills/lsp-setup/references/ruby/README.md +2 -2
  233. package/packages/shared-skills/skills/lsp-setup/references/rust/README.md +2 -2
  234. package/packages/shared-skills/skills/lsp-setup/references/swift/README.md +4 -4
  235. package/packages/shared-skills/skills/lsp-setup/references/terraform/README.md +2 -2
  236. package/packages/shared-skills/skills/lsp-setup/references/typescript/README.md +3 -3
  237. package/packages/shared-skills/skills/lsp-setup/references/yaml/README.md +2 -2
  238. package/packages/shared-skills/skills/lsp-setup/references/zig/README.md +2 -2
  239. package/packages/shared-skills/skills/lsp-setup/scripts/detect-lsp.ts +1 -1
  240. package/packages/shared-skills/skills/lsp-setup/scripts/lsp-server-table.ts +3 -2
  241. package/packages/shared-skills/skills/programming/SKILL.md +5 -5
  242. package/packages/shared-skills/skills/programming/references/code-smells.md +2 -2
  243. package/packages/shared-skills/skills/programming/references/go/README.md +3 -3
  244. package/packages/shared-skills/skills/programming/references/python/README.md +8 -8
  245. package/packages/shared-skills/skills/programming/references/python/data-processing.md +9 -9
  246. package/packages/shared-skills/skills/programming/references/rust-ub/README.md +3 -3
  247. package/packages/shared-skills/skills/programming/references/typescript/README.md +5 -5
  248. package/packages/shared-skills/skills/programming/scripts/typescript/new-project.ts +1 -1
  249. package/packages/shared-skills/skills/refactor/SKILL.md +35 -35
  250. package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +6 -6
  251. package/packages/shared-skills/skills/review-work/SKILL.md +2 -2
  252. package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +10 -7
  253. package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +4 -4
  254. package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/README.md +2 -2
  255. package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/career.md +1 -1
  256. package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/social.md +1 -1
  257. package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/web.md +4 -4
  258. package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +2 -1
  259. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +16 -17
  260. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/fallback.md +10 -6
  261. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/jina.md +12 -12
  262. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/naver.md +3 -3
  263. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/playwright.md +1 -1
  264. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/rss.md +1 -1
  265. package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/tls-impersonate.md +12 -7
  266. package/packages/shared-skills/skills/ulw-execute/SKILL.md +9 -6
  267. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +1 -1
  268. package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +2 -2
  269. package/packages/shared-skills/skills/ulw-research/SKILL.md +3 -3
  270. package/packages/shared-skills/skills/ulw-research/references/deliverable-phase.md +5 -5
  271. package/packages/shared-skills/skills/ulw-research/references/report-visualization.md +2 -2
  272. package/packages/shared-skills/skills/ulw-research/references/research-collection.md +2 -2
  273. package/packages/shared-skills/skills/ulw-research/references/unit-rules.md +2 -2
  274. package/packages/shared-skills/skills/visual-qa/AGENTS.md +1 -1
  275. package/packages/shared-skills/skills/visual-qa/SKILL.md +5 -5
  276. package/packages/shared-skills/skills/visual-qa/references/browser-setup.md +4 -2
@@ -21,7 +21,7 @@ curl -s -H "Authorization: Bearer ${JINA_API_KEY}" "https://r.jina.ai/{URL}"
21
21
  ### JSON 구조화 출력
22
22
 
23
23
  ```bash
24
- curl -H "Accept: application/json" "https://r.jina.ai/{URL}"
24
+ curl -H "Authorization: Bearer ${JINA_API_KEY}" -H "Accept: application/json" "https://r.jina.ai/{URL}"
25
25
  ```
26
26
 
27
27
  반환: `data.{title, description, url, content, metadata, external, usage}`
@@ -31,7 +31,7 @@ curl -H "Accept: application/json" "https://r.jina.ai/{URL}"
31
31
  ### CSS 선택자 타겟팅
32
32
 
33
33
  ```bash
34
- curl -H "X-Target-Selector: .article-body" "https://r.jina.ai/{URL}"
34
+ curl -H "Authorization: Bearer ${JINA_API_KEY}" -H "X-Target-Selector: .article-body" "https://r.jina.ai/{URL}"
35
35
  ```
36
36
 
37
37
  네비게이션/풋터 제거, 본문만 추출. 커뮤니티 게시판에서 특히 효과적.
@@ -39,7 +39,7 @@ curl -H "X-Target-Selector: .article-body" "https://r.jina.ai/{URL}"
39
39
  ### SPA 스트리밍 모드
40
40
 
41
41
  ```bash
42
- curl -H "Accept: text/event-stream" "https://r.jina.ai/{URL}"
42
+ curl -H "Authorization: Bearer ${JINA_API_KEY}" -H "Accept: text/event-stream" "https://r.jina.ai/{URL}"
43
43
  ```
44
44
 
45
45
  JS 로딩 완료까지 대기. 동적 콘텐츠가 완전히 렌더링된 최종 버전 반환.
@@ -47,7 +47,7 @@ JS 로딩 완료까지 대기. 동적 콘텐츠가 완전히 렌더링된 최종
47
47
  ### 스크린샷
48
48
 
49
49
  ```bash
50
- curl -H "X-Respond-With: screenshot" "https://r.jina.ai/{URL}"
50
+ curl -H "Authorization: Bearer ${JINA_API_KEY}" -H "X-Respond-With: screenshot" "https://r.jina.ai/{URL}"
51
51
  ```
52
52
 
53
53
  GCS 서명 URL 반환 (4시간 유효). 비주얼 검증 용도.
@@ -55,7 +55,7 @@ GCS 서명 URL 반환 (4시간 유효). 비주얼 검증 용도.
55
55
  ### PDF 처리
56
56
 
57
57
  ```bash
58
- curl -s "https://r.jina.ai/https://example.com/file.pdf"
58
+ curl -s -H "Authorization: Bearer ${JINA_API_KEY}" "https://r.jina.ai/https://example.com/file.pdf"
59
59
  ```
60
60
 
61
61
  PDF → 마크다운 자동 변환. 페이지 수 메타데이터 포함.
@@ -63,33 +63,33 @@ PDF → 마크다운 자동 변환. 페이지 수 메타데이터 포함.
63
63
  ### 쿠키 전달 (인증 사이트)
64
64
 
65
65
  ```bash
66
- curl -H "X-Set-Cookie: session=abc123" "https://r.jina.ai/{URL}"
66
+ curl -H "Authorization: Bearer ${JINA_API_KEY}" -H "X-Set-Cookie: session=abc123" "https://r.jina.ai/{URL}"
67
67
  ```
68
68
 
69
69
  ### 링크 보존
70
70
 
71
71
  ```bash
72
- curl -H "X-With-Links: true" "https://r.jina.ai/{URL}"
72
+ curl -H "Authorization: Bearer ${JINA_API_KEY}" -H "X-With-Links: true" "https://r.jina.ai/{URL}"
73
73
  ```
74
74
 
75
75
  ### 캐시 제어
76
76
 
77
77
  ```bash
78
78
  # 캐시 우회 (실시간 필요 시)
79
- curl -H "X-No-Cache: true" "https://r.jina.ai/{URL}"
79
+ curl -H "Authorization: Bearer ${JINA_API_KEY}" -H "X-No-Cache: true" "https://r.jina.ai/{URL}"
80
80
 
81
81
  # 캐시 TTL 지정 (초)
82
- curl -H "X-Cache-Tolerance: 600" "https://r.jina.ai/{URL}"
82
+ curl -H "Authorization: Bearer ${JINA_API_KEY}" -H "X-Cache-Tolerance: 600" "https://r.jina.ai/{URL}"
83
83
  ```
84
84
 
85
85
  ### 순수 텍스트 / 원본 HTML
86
86
 
87
87
  ```bash
88
88
  # body.innerText만
89
- curl -H "X-Respond-With: text" "https://r.jina.ai/{URL}"
89
+ curl -H "Authorization: Bearer ${JINA_API_KEY}" -H "X-Respond-With: text" "https://r.jina.ai/{URL}"
90
90
 
91
91
  # 원본 HTML
92
- curl -H "X-Respond-With: html" "https://r.jina.ai/{URL}"
92
+ curl -H "Authorization: Bearer ${JINA_API_KEY}" -H "X-Respond-With: html" "https://r.jina.ai/{URL}"
93
93
  ```
94
94
 
95
95
  ## 검증된 성공 사이트
@@ -131,6 +131,6 @@ curl -H "X-Respond-With: html" "https://r.jina.ai/{URL}"
131
131
  Jina JSON 모드의 `external.alternate`에서 사이트의 RSS URL이 자동 노출됨:
132
132
 
133
133
  ```bash
134
- curl -H "Accept: application/json" "https://r.jina.ai/{URL}" | \
134
+ curl -H "Authorization: Bearer ${JINA_API_KEY}" -H "Accept: application/json" "https://r.jina.ai/{URL}" | \
135
135
  python3 -c "import sys,json; print(json.load(sys.stdin)['data'].get('external',{}))"
136
136
  ```
@@ -26,10 +26,10 @@ Jina Reader로 완전 접근 가능.
26
26
 
27
27
  ```bash
28
28
  # 기사 목록
29
- curl -s "https://r.jina.ai/https://news.naver.com/"
29
+ curl -s -H "Authorization: Bearer ${JINA_API_KEY}" "https://r.jina.ai/https://news.naver.com/"
30
30
 
31
31
  # 개별 기사
32
- curl -s "https://r.jina.ai/https://n.news.naver.com/article/{press_id}/{article_id}"
32
+ curl -s -H "Authorization: Bearer ${JINA_API_KEY}" "https://r.jina.ai/https://n.news.naver.com/article/{press_id}/{article_id}"
33
33
  ```
34
34
 
35
35
  ## 네이버 증권
@@ -37,7 +37,7 @@ curl -s "https://r.jina.ai/https://n.news.naver.com/article/{press_id}/{article_
37
37
  Jina Reader로 실시간 주가, 주요 뉴스 접근.
38
38
 
39
39
  ```bash
40
- curl -s "https://r.jina.ai/https://finance.naver.com/item/main.naver?code={종목코드}"
40
+ curl -s -H "Authorization: Bearer ${JINA_API_KEY}" "https://r.jina.ai/https://finance.naver.com/item/main.naver?code={종목코드}"
41
41
  ```
42
42
 
43
43
  ## 네이버 금융 시세 (비공식, 무인증)
@@ -65,7 +65,7 @@ bun install
65
65
  ### 호출 (engine 내부)
66
66
 
67
67
  ```python
68
- from insane_search.engine.executor import run_playwright_fallback
68
+ from engine.executor import run_playwright_fallback # 스킬 디렉터리에서 실행 (패키지는 engine/)
69
69
 
70
70
  attempt, html = run_playwright_fallback(
71
71
  "https://example.com/path",
@@ -13,7 +13,7 @@ python3 -c "import feedparser" 2>/dev/null || pip install feedparser -q
13
13
  Jina Reader JSON 모드로 사이트의 RSS URL을 자동 탐지:
14
14
 
15
15
  ```bash
16
- curl -sH "Accept: application/json" "https://r.jina.ai/{URL}" | \
16
+ curl -s -H "Authorization: Bearer ${JINA_API_KEY}" -H "Accept: application/json" "https://r.jina.ai/{URL}" | \
17
17
  python3 -c "import sys,json; print(json.load(sys.stdin)['data'].get('external',{}).get('alternate',[]))"
18
18
  ```
19
19
 
@@ -59,11 +59,11 @@ def cffi_fetch(url, locale="ko-KR"):
59
59
 
60
60
  generic alias는 항상 최신 버전으로 해석된다. **2026년에 chrome99 같은 옛 버전은 WAF가 의심하므로 generic alias 사용 권장.**
61
61
 
62
- | Alias | 해석 (2026.04) | 용도 |
62
+ | Alias | 해석 (v0.15.0) | 용도 |
63
63
  |-------|---------------|------|
64
- | `safari` | safari260 | **한국 사이트 최적** (쿠팡, 에펨코리아) |
64
+ | `safari` | safari2601 | **한국 사이트 최적** (쿠팡, 에펨코리아) |
65
65
  | `chrome` | chrome146 | 범용 (Cloudflare, Akamai) |
66
- | `firefox` | firefox135 | chrome/safari 실패 시 대안 |
66
+ | `firefox` | firefox147 | chrome/safari 실패 시 대안 |
67
67
  | `chrome_android` | chrome131_android | 모바일 API 엔드포인트 |
68
68
  | `safari_ios` | safari260_ios | iOS 모바일 |
69
69
 
@@ -71,15 +71,20 @@ generic alias는 항상 최신 버전으로 해석된다. **2026년에 chrome99
71
71
  <summary>핀 버전 전체 (클릭)</summary>
72
72
 
73
73
  ```
74
+ edge99, edge101,
74
75
  chrome99, chrome100, chrome101, chrome104, chrome107, chrome110,
75
76
  chrome116, chrome119, chrome120, chrome123, chrome124, chrome131,
76
77
  chrome133a, chrome136, chrome142, chrome145, chrome146,
77
- chrome131_android, edge99, edge101,
78
- safari15_3, safari15_5, safari17_0, safari17_2_ios,
79
- safari18_0, safari18_0_ios, safari260, safari260_ios,
80
- firefox133, firefox135
78
+ chrome99_android, chrome131_android,
79
+ safari153, safari155, safari170, safari172_ios,
80
+ safari180, safari180_ios, safari184, safari184_ios,
81
+ safari260, safari2601, safari260_ios,
82
+ firefox133, firefox135, firefox144, firefox147,
83
+ tor145
81
84
  ```
82
85
 
86
+ 구 표기(`safari15_3`, `safari15_5`, `safari17_0`, `safari17_2_ios`, `safari18_0`, `safari18_0_ios`, `safari18_4`, `safari18_4_ios`)는 deprecated alias로 아직 받는다.
87
+
83
88
  </details>
84
89
 
85
90
  ## WAF별 최적 전략
@@ -8,6 +8,8 @@ argument-hint: "[plan-name] [--worktree <absolute-path>] [--make-pr] [--ship]"
8
8
 
9
9
  **YOU DO NOT WRITE CODE. YOU DO NOT EDIT PRODUCT FILES. YOU DO NOT RUN QA YOURSELF. EVERY unit of implementation, test, QA, and review work MUST be delegated to a spawned subagent. NO EXCEPTIONS.** Your hands touch only plan selection, `.omo/` state (Boulder, ledger, plan checkboxes), decomposition, dispatch, verdicts, and evidence records. About to edit a product file or run an implementation command yourself? **STOP. SPAWN A WORKER INSTEAD.** Orchestrate at **MAXIMUM PARALLELISM**: every independent unit runs concurrently; only named dependencies serialize.
10
10
 
11
+ This rule binds the root of a ulw-execute run, including its Final Verification Wave and any `review-work` pass run inside it: a worker runs every QA scenario, and you judge the artifacts it captured. Outside a ulw-execute run (a bare ultrawork run, a ulw-loop final gate, a standalone `review-work`), the session that owns the run runs the final real-surface QA itself.
12
+
11
13
  ## Codex Harness Tool Compatibility
12
14
 
13
15
  Translate any OpenCode-only tool name in an inherited example to its Codex equivalent:
@@ -103,7 +105,7 @@ Every phase (plan wave) runs in its own task-owned worktree with its own goal: b
103
105
  Solo orchestration with parallel background workers is the default topology. Decide once, when the wave's lanes are known, and record the verdict in the ledger:
104
106
 
105
107
  - **Independent lanes -> parallel workers.** Separate files, no shared contract: one parallel spawn burst; no team.
106
- - **Dependency-ordered lanes -> one `workflow` run per wave.** Sub-tasks with real ordering between them (C needs A and B finished first) and a harness with a native `workflow` tool: dispatch the wave as ONE run (one producer node per lane plus a verification node); recover inside it with `retry`/`amend`/`send`; let the run's settle wake you instead of arming per-lane watchers; the next wave is a NEW run (or `amend` when only the definition changed) — never one graph for the whole plan. When the harness lists the `mass-ulw` skill, read its `SKILL.md` and `references/planning.md` IN FULL before defining any graph.
108
+ - **Dependency-ordered lanes -> one `workflow` run per wave.** Sub-tasks with real ordering between them (C needs A and B finished first) and a harness with a native `workflow` tool: dispatch the wave as ONE run (one producer node per lane plus a verification node); recover inside it with `retry`/`amend`/`send`; let the run's settle wake you instead of arming per-lane watchers; the next wave is a NEW run (use `amend` only to re-run the current wave after its definition changed) — never one graph for the whole plan. When the harness lists the `mass-ulw` skill, read its `SKILL.md` and `references/planning.md` IN FULL before defining any graph.
107
109
  - **Overlapping lanes -> a team.** The lanes touch the same module or contract AND running them concurrently actually finishes sooner: stand up a team (where the harness has one) so one lane's discoveries relay through you mid-flight.
108
110
  - **PR-mode independent lanes -> a worktree per lane.** Under `--make-pr`/`--ship`, when a wave holds independent checkboxes, give each lane its own branch and task-owned worktree, delivered as its own PR.
109
111
 
@@ -143,7 +145,6 @@ When the plan annotates a todo with `Recommended task executor category:`, follo
143
145
  | `unspecified-high` (medium) | standard features across a few files with known patterns |
144
146
  | `visual-engineering` (medium) | frontend, UI/UX, styling, animation |
145
147
  | `writing` (low) | documentation and prose |
146
- | `git` (low) | git operations |
147
148
  | `deep-low` (medium) | hairy debugging, research-heavy or subtle cross-module work the worker can settle from what it reads |
148
149
  | `deep-high` (high) | the same, when the central decision cannot be settled from evidence: a trade-off, a cross-package contract, or correctness argued from invariants |
149
150
  | `ultrabrain` (high) | ONE genuinely hard, logic-heavy problem — hand it the goal, not step-by-step instructions |
@@ -153,6 +154,8 @@ Sizing is a two-branch decision made per checkbox, before dispatch:
153
154
  - **Splittable work splits.** When the checkbox decomposes into independent pieces, dispatch them as a swarm of `quick`/`unspecified-low` workers in ONE parallel burst — many small cheap workers in parallel beat one large delegation.
154
155
  - **Cohesive hard work stays whole.** When splitting would sever shared reasoning (one algorithm, one migration, one subtle bug), send the WHOLE problem to `deep-low`, `deep-high` or `ultrabrain` as ONE delegation. Never force-split work whose parts share one insight.
155
156
 
157
+ Git operations are not a category: route them to a `quick` worker and name the `git-master` skill in its brief (`load_skills` where the spawn tool takes it).
158
+
156
159
  Each sub-task message must include:
157
160
 
158
161
  1. Goal and exact files or directories in scope.
@@ -164,7 +167,7 @@ Each sub-task message must include:
164
167
  - Terminal / TUI: drive a real pty; `tmux send-keys` is fine for a boot/behavior smoke, but color/layout/CJK evidence goes through the xterm.js web terminal below, NEVER `tmux capture-pane`.
165
168
  - Browser use: omowright from js eval (staged in the `browser` skill) — the owned engine (`connectPipe` on a task-owned profile, `connectCloakProfile` for bot-scored targets) for unauthenticated pages, the attached engine (`connectBrowserSkill()` in the user's signed-in browser) when the page needs their login; never a clone of or a launch against the live profile.
166
169
  - Computer use: OS-level GUI automation against the running desktop app when the surface is not a page.
167
- - TUI visual evidence: when a TUI claim needs visual QA or PR proof, run `bun script/qa/web-terminal-visual-qa.mjs --command "<cmd>" --input "{Enter}" --evidence-dir <dir>` (real pty rendered through xterm.js in Chrome) and attach `terminal.png` plus `metadata.json`.
170
+ - TUI visual evidence: when a TUI claim needs visual QA or PR proof, run `bun script/qa/web-terminal-visual-qa.mjs --title "<surface>" --command "<cmd>" --input "{Enter}" --evidence-dir <dir>` (real pty rendered through xterm.js in Chrome) and attach `terminal.png` plus `metadata.json`.
168
171
  6. The adversarial classes that apply to this sub-task (from the 9 ultraqa classes) and how each is probed.
169
172
  7. Required artifact path and cleanup receipt.
170
173
  8. Tool-use expectations: batch independent tool calls in parallel; when the harness exposes a code-execution surface (eval), use it for multi-call steps instead of one-by-one calls.
@@ -209,10 +212,10 @@ A worker done claim is never final: each implementation sub-task returns a `Done
209
212
 
210
213
  Rules:
211
214
  - `confirmed` is the only pass verdict. `false-positive`, `needs-fix`, and `needs-human-review` all block checkbox completion.
212
- - The verifier must be independent from the executor: use the harness's gate reviewer (see the harness compatibility section) or a fresh reviewer worker on a strong model, or root only when root did not implement or materially rewrite that task.
215
+ - The verifier must be independent from the executor: use the harness's gate reviewer (see the harness compatibility section) or a fresh reviewer worker on a strong model. Root never verifies; it records the verifier's verdict.
213
216
  - A worker done claim must be independently verified before it becomes checkbox completion.
214
217
  - On a non-confirmed verdict, append the feedback to the ledger with the attempt number and its failure signature (the failing check plus its first error line, with volatile values stripped: temp-dir paths, timestamps, process and run ids, durations). Attempts count per checkbox across all its sub-tasks and re-splits, timed from its first dispatch (`checkpoint_opened_at`). STOP when the same signature repeats on consecutive attempts, on the third failed attempt, or 4 hours after the first dispatch (a plan may change these numbers, never remove the stop). Check the 4-hour bound also when a lane's watcher fires or the turn resumes without a verdict; when it has passed, cancel that lane and stop the same way: mark the checkbox `- [~]` (the plan grammar's blocked state) with a one-line gap naming what is unmet and the last evidence, mark every checkbox that depends on it, directly or through another `[~]` row, `- [~]` with the gap `blocked by <id>`, close the todo of every row marked `[~]` here labelled `blocked: <gap>`, append an `unmet` ledger entry listing what each attempt changed, and continue in the same turn with the next checkpoint that depends on none of them, or with Completion when none remains. Otherwise leave the checkbox `- [ ]` and re-dispatch the executor with the exact failure.
215
- - A `[~]` row counts as closed, never as a met dependency: Phase 3 skips it, Completion starts once every top-level row is `[x]` or `[~]`, and the `ORCHESTRATION COMPLETE` block names each `[~]` row with its gap. Final Verification Wave rows are never dependents of a `[~]` row: they verify the landed work and report each `[~]` row as a known gap, which alone never fails a final-wave row. A `[~]` gap is never re-queued as a new checkbox in this run, by the blast-radius rule or by a final-wave verdict; the one harness-repair follow-up in the next rule is the only exception.
218
+ - A `[~]` row counts as closed, never as a met dependency: Phase 3 skips it, Completion starts once every top-level row is `[x]` or `[~]`, and the `ORCHESTRATION COMPLETE` block names each `[~]` row with its gap; a block with any `[~]` row is a partial-delivery report, never a success claim, and the run's goal is reported unmet. Final Verification Wave rows are never dependents of a `[~]` row: they verify the landed work and report each `[~]` row as a known gap, which alone never fails a final-wave row. A `[~]` gap is never re-queued as a new checkbox in this run, by the blast-radius rule or by a final-wave verdict; the one harness-repair follow-up in the next rule is the only exception.
216
219
  - The verifier sets `failure_class`. A `harness` failure (the runner, fixture, CI job or environment failed and the product behavior was never exercised) gets one repair dispatch inside the checkpoint, which does not count as an attempt; when it recurs, stop as above with the harness gap named and append the harness repair once as a follow-up checkbox; a harness-repair follow-up that stops is reported, not re-appended.
217
220
  - The verifier must probe the applicable adversarial keys, including `stale_state`, `dirty_worktree`, and `misleading_success_output`, before allowing `FullyDone`.
218
221
 
@@ -230,7 +233,7 @@ Only after verification passes:
230
233
  When all top-level checkboxes in `## TODOs` and `## Final Verification Wave` are complete:
231
234
 
232
235
  1. Run the plan's final verification commands.
233
- 2. For PR/branch work, finish the lifecycle from the last phase's worktree: sync `.omo/` state back to the main repo, create or update the PR, wait for review/verification gates, merge by default unless explicitly opted out, and remove the worktree only after successful merge or explicit handoff. Finish directory teardown per Task resources and record its receipts.
236
+ 2. Under `--make-pr` or `--ship`, finish the lifecycle from the last phase's worktree: sync `.omo/` state back to the main repo, create or update the PR, and wait for review/verification gates. Then follow the delivery mode: `--ship` merges per the repository's merge policy; `--make-pr` hands off with the PR URL and merges only if the user asks. Remove the worktree only after a successful merge or that explicit handoff. Finish directory teardown per Task resources and record its receipts.
234
237
  3. Remove or mark the Boulder work as completed.
235
238
  4. Print an `ORCHESTRATION COMPLETE` block with the plan path, verification commands, artifacts, and cleanup receipts.
236
239
 
@@ -181,7 +181,7 @@ Every "present the plan summary/brief" above delivers THIS structure, in the use
181
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`).
182
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.
183
183
  5. **Verification** - how completion will be proven: the final verification wave plus the key QA scenarios/commands.
184
- 6. **Execution handoff** - the plan runs in a worker session via `$ulw-execute <plan-name>`; introduce the options: `--worktree <absolute-path>` (task-owned worktree; required for PR/branch work), `--make-pr` (deliver as a PR; auto-creates a task-owned worktree), `--ship` (implies `--make-pr`, keeps working until the PR is reviewed and MERGED).
184
+ 6. **Execution handoff** - the plan runs in a worker session via `$ulw-execute <plan-name>`; introduce the options: `--worktree <absolute-path>` (optional: reuse an existing task-owned worktree for the first phase; every phase runs in its own task-owned worktree regardless), `--make-pr` (deliver as a PR; auto-creates a task-owned worktree), `--ship` (implies `--make-pr`, keeps working until the PR is reviewed and MERGED).
185
185
 
186
186
  ### High-accuracy review (dual review)
187
187
  The high-accuracy review is DUAL and both passes must return OKAY before handoff: (1) the native `momus` reviewer subagent, and (2) an independent Oracle review via `task(subagent_type="oracle", ...)` on the strongest available reasoning model, in a fully isolated sub-session with normal approval and sandbox policy. Do not add flags that disable approvals or sandboxing. Momus runs at High and may take substantially longer than other agents. One round = exactly ONE `momus` + ONE independent review, dispatched together against the COMPLETE plan file (todos + TL;DR filled) at the draft's exact recorded `plan_path`. Keep Momus in flight and wait for its terminal result: elapsed time alone never justifies cancelling, duplicating, replacing, or treating it as failed. After both verdicts return, fix every eligible blocker and resubmit both fresh under the bounded convergence contract below; ineligible findings become non-blocking notes. CLEAR: runs when the user opts in or `review_required: true`. UNCLEAR: runs automatically unless Classify=Trivial.
@@ -10,7 +10,7 @@ metadata:
10
10
  Read this when INTENT ROUTING resolved to UNCLEAR: the desired OUTCOME is fuzzy - a vague request, a bootstrap, `$ulw-execute` with no selectable plan, or a goal the user cannot yet articulate. Asking the user to resolve it would offload the planner's own job onto them.
11
11
 
12
12
  <stance>
13
- PRIME DIRECTIVE: do NOT interrogate the user. Resolve ambiguity by RESEARCH, not questions. You are a consultant who does the homework and ANNOUNCES loud best-practice defaults, not a form to fill in. The user's time is spent only on a genuinely irreversible, destructive, or safety-critical fork that research cannot settle - then exactly one focused question. Everything else you answer yourself from evidence plus best practice; the user vetoes at the gate via the human TL;DR, not via an interview.
13
+ PRIME DIRECTIVE: do NOT interrogate the user. Resolve ambiguity by RESEARCH, not questions. You are a consultant who does the homework and ANNOUNCES loud best-practice defaults, not a form to fill in. The user's time is spent only on an owner-decision as SKILL.md's two filters define it (irreversible, destructive, or safety-critical, or a cross-cutting product choice the user lives with) - then exactly one focused question per decision. Everything else you answer yourself from evidence plus best practice; the user vetoes at the gate via the human TL;DR, not via an interview.
14
14
  </stance>
15
15
 
16
16
  <research_protocol>
@@ -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 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.
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 an owner-decision as SKILL.md's two filters define it - 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) - which survives as a question even when a default exists.
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>
@@ -55,7 +55,7 @@ The research is done when all of these hold:
55
55
  - Every claim in the deliverable cites a source or a verification artifact.
56
56
  - Every asserted claim is represented in the claim graph, tied to an intent-vs-reality diff when an expected truth exists, and backed by observation manifest entries from independent observation groups or a documented single-source exception; convergence or exception status is explicit.
57
57
  - The deliverable lane and format were derived from the destination or asked through the empty-info interview without blocking collection, recorded in `brief.md` with `answered_by`, and the final materials match that record.
58
- - The delivered artifact passed the delivery gates in order (static gates, layout gates, fidelity gate, visual QA, and the proofread pass where the harness provides one), each status is in `outcome.json`, and `outcome verify` passed.
58
+ - The delivered artifact passed the delivery gates in order (static gates, fidelity gate, layout gates, visual QA, and the proofread pass where the harness provides one), each status is in `outcome.json`, and `outcome verify` passed.
59
59
  - Every excursion opened during the run was closed by an EXIT rule, folded back into the claim or axis that triggered it, and recorded in both `excursion-log.md` and the ulw-loop ledger.
60
60
  - When the harness can show an HTML page inline, the report was shown inline before the artifact paths.
61
61
  - When the ask reproduces a visual source, the report carries side-by-side pairs of real source frames and the output rendered at the same moments, each with its critique, and the differences they surfaced were fixed or listed as gaps. A simple or well-understood topic shortens the research, never this comparison.
@@ -140,7 +140,7 @@ The promised formats recorded in `brief.md` and `outcome.json` are binding; `pdf
140
140
 
141
141
  Asset workers (background, parallel, each fed `design-spec.md`) — visuals are the DEFAULT deliverable of this phase, not garnish the user must ask for; a delivered report without figures is an incomplete run:
142
142
 
143
- - **Charts for every quantitative finding, computed from real data.** Pull the numbers into an actual table first (CSV/JSON under `$SESSION_DIR`), then plot from that table, never from prose. Follow the data-scientist tool doctrine — numpy always, Polars for filtering/sorting/transforms, DuckDB for joins/aggregations/window functions, never pandas — and load the `data-scientist` skill when this session has it: `uv run --with numpy --with polars --with duckdb --with pyarrow --with matplotlib python`. Keep `pyarrow` in that set — the DuckDB-to-Polars handoff (`.pl()`) fails without it, and `.df()` fails without pandas, so hand data across through `.pl()`, never `.df()`. Save to `$SESSION_DIR/assets/`. Plot ONLY from the ledger: export the rows with `node "$SKILL_DIR/scripts/report-tools.mjs" fact export --csv --out "$SESSION_DIR/assets/<chart>.csv" --session-dir "$SESSION_DIR"` and draw from that CSV; every chart figure carries `data-chart-source="assets/<chart>.csv"`, and its axis tick labels sit inside a `<g class="ticks" data-tick-step=".." data-tick-min=".." data-tick-max="..">` group, so the fidelity gate can check every plotted value and tick (the deliverable reference's section 6 tick rule).
143
+ - **Charts for every quantitative finding, computed from real data.** Pull the numbers into an actual table first (CSV/JSON under `$SESSION_DIR`), then plot from that table, never from prose. Follow the data-scientist tool doctrine — numpy for numeric work beyond SQL/DataFrame aggregation, Polars for filtering/sorting/transforms, DuckDB for joins/aggregations/window functions, never pandas — and load the `data-scientist` skill when this session has it: `uv run --with numpy --with polars --with duckdb --with pyarrow --with matplotlib python`. Keep `pyarrow` in that set — the DuckDB-to-Polars handoff (`.pl()`) fails without it, and `.df()` fails without pandas, so hand data across through `.pl()`, never `.df()`. Save to `$SESSION_DIR/assets/`. Plot ONLY from the ledger: export the rows with `node "$SKILL_DIR/scripts/report-tools.mjs" fact export --csv --out "$SESSION_DIR/assets/<chart>.csv" --session-dir "$SESSION_DIR"` and draw from that CSV; every chart figure carries `data-chart-source="assets/<chart>.csv"`, and its axis tick labels sit inside a `<g class="ticks" data-tick-step=".." data-tick-min=".." data-tick-max="..">` group, so the fidelity gate can check every plotted value and tick (the deliverable reference's section 6 tick rule).
144
144
  - **Mermaid graphs** for process, architecture, argument, timeline, and evidence-flow structure, themed to the spec's fonts and palette. Render each to SVG and confirm the file exists before the document references it.
145
145
  - **Generated visuals through the imagegen skill whenever the session has it:** a cover plus a concept illustration per major theme, prompted from the spec's style, palette, and mood — document-styled illustration, never generic stock art dropped into a designed page.
146
146
  - **Full-page screenshots** of the top 5-10 sources, saved by the web workers while reading, as provenance you can show.
@@ -175,7 +175,7 @@ Next, write `$SESSION_DIR/pairs-strong.json` (the same file, keeping only the pa
175
175
 
176
176
  3. **Layout gates.** Print the probe with `node "$SKILL_DIR/scripts/report-tools.mjs" layout-probe --json`, evaluate its `source` in the rendered page through the `browser` skill's owned headless engine, save the result as `$SESSION_DIR/boxes.json`, and re-run `check` with `--layout "$SESSION_DIR/boxes.json"` (overflow, clipped text, distorted images, overlapping siblings).
177
177
  4. **Visual QA.** Render the produced artifact back to images — PDF pages to PNG, the HTML through the browser skill at desktop and phone widths — and look at them: missing or broken figures, images stretched or spilling their containers, diagram or chart text rendered off the spec's font or palette, clipped tables, overflowing CJK text, blank pages, unlabeled chart values, wrong page breaks. Reading the source markup is not visual QA; inspect the pixels.
178
- 5. **Proofread gate: `task(category="writing", ...)`.** Hand the final text to a dedicated `writing` worker whose only job is language: grammar, spelling, punctuation, terminology consistency, and whether the prose reads NATIVELY in the report's own language. It proofreads only and never composes, and it never edits the file: it returns `$SESSION_DIR/polish-edits.json`, an array of `{"before": ..., "after": ..., "reason": ...}` where `before` is the exact current text of one or more adjacent sentences. Edits change text only; an edit whose before/after would alter any tag, attribute, comment, or script/style content is rejected, and markup changes go through the full fidelity gates instead. Apply it with `node "$SKILL_DIR/scripts/report-tools.mjs" fact polish-apply "$SESSION_DIR/report.html" --edits "$SESSION_DIR/polish-edits.json" --out "$SESSION_DIR/report.polished.html" --session-dir "$SESSION_DIR"`: each edit is applied alone, and an edit that changes a fact span, a numeral, a link, or a claim id, or drops a hedge or qualifier the source carries, is `polish_edit_rejected` (a `before` not found exactly once is `polish_edit_unlocated`) and leaves its text unchanged. Send the rejected and unlocated edits back to the same worker with their reasons, plus `$SESSION_DIR/polish-defects.json` and the pre-polish `report.html` the backstop compared against, so the worker sees why each edit was refused; it returns either a rewritten sentence or a new edit list, and the repair round re-runs `fact polish-apply` with `"$SESSION_DIR/report.polished.html"` as both input and output, within the repair budget. Then run the backstop `fact polish-diff --before "$SESSION_DIR/report.html" --after "$SESSION_DIR/report.polished.html" --session-dir "$SESSION_DIR"` (exit `1` on `polish_diff_fail`), `fact verify` on `report.polished.html`, and `fact pairs "$SESSION_DIR/report.polished.html" --changed-since "$SESSION_DIR/report.html.fill-map.json" --session-dir "$SESSION_DIR"`, which keeps only the quote and claim pairs whose sentence text changed during polish; run the meaning readers above (cheap, then strong on the flagged pairs) on exactly those pairs and `fact meaning-check` before recording `outcome gate fidelity`. A rewording that keeps every number, hedge, qualifier, and link but swaps who did what to whom therefore still reaches a meaning reader on the delivered text. `report.polished.html` is the report that is delivered. Deliver only on a clean pass. This gate runs BEFORE the first delivery, not after the user finds the typo. Edits must not span entities (such as &amp; or &lt;) or markup; narrow the edit to the surrounding words instead, and a rejected edit comes back with the reason to act on.
178
+ 5. **Proofread gate: `task(category="writing", ...)`.** Hand the final text to a dedicated `writing` worker whose only job is language: grammar, spelling, punctuation, terminology consistency, and whether the prose reads NATIVELY in the report's own language. It proofreads only and never composes, and it never edits the file: it returns `$SESSION_DIR/polish-edits.json`, an array of `{"before": ..., "after": ..., "reason": ...}` where `before` is the exact current text of one or more adjacent sentences. Edits change text only; an edit whose before/after would alter any tag, attribute, comment, or script/style content is rejected, and markup changes go through the full fidelity gates instead. Apply it with `node "$SKILL_DIR/scripts/report-tools.mjs" fact polish-apply "$SESSION_DIR/report.html" --edits "$SESSION_DIR/polish-edits.json" --out "$SESSION_DIR/report.polished.html" --session-dir "$SESSION_DIR"`: each edit is applied alone, and an edit that changes a fact span, a numeral, a link, or a claim id, or drops a hedge or qualifier the source carries, is `polish_edit_rejected` (a `before` not found exactly once is `polish_edit_unlocated`) and leaves its text unchanged. Send the rejected and unlocated edits back to the same worker with their reasons, plus `$SESSION_DIR/polish-defects.json` and the pre-polish `report.html` the backstop compared against, so the worker sees why each edit was refused; it returns either a rewritten sentence or a new edit list, and the repair round re-runs `fact polish-apply` with `"$SESSION_DIR/report.polished.html"` as both input and output, within the repair budget. Then run the backstop `fact polish-diff --before "$SESSION_DIR/report.html" --after "$SESSION_DIR/report.polished.html" --session-dir "$SESSION_DIR"` (exit `1` on `polish_diff_fail`), `fact verify` on `report.polished.html`, and `fact pairs "$SESSION_DIR/report.polished.html" --changed-since "$SESSION_DIR/report.html.fill-map.json" --session-dir "$SESSION_DIR"`, which keeps only the quote and claim pairs whose sentence text changed during polish; run the meaning readers above (cheap, then strong on the flagged pairs) on exactly those pairs and `fact meaning-check` before recording `outcome gate fidelity`. A rewording that keeps every number, hedge, qualifier, and link but swaps who did what to whom therefore still reaches a meaning reader on the delivered text. `report.polished.html` is the report that is delivered; polish can change line wrapping, so re-run the layout gates and visual QA on `report.polished.html` and record `layout` and `visual` again. Deliver only on a clean pass. This gate runs BEFORE the first delivery, not after the user finds the typo. Edits must not span entities (such as &amp; or &lt;) or markup; narrow the edit to the surrounding words instead, and a rejected edit comes back with the reason to act on.
179
179
 
180
180
  **Repair is bounded.** After every gate run that found defects, ask `node "$SKILL_DIR/scripts/report-tools.mjs" repair decide --state "$SESSION_DIR/repair-state.json" --defects "$SESSION_DIR/defects.json" --defects "$SESSION_DIR/fidelity-defects.json" --artifact-bytes <bytes> --renders <pages> --session-dir "$SESSION_DIR"` and obey it: `repair` means fix and re-run; `deliver` means stop and ship with the residual defects the manifest now lists; `block` means a content-integrity defect remains (or there is no usable artifact), so do not deliver: tell the user what blocks it and record the row as `failed` with the reason. Never repair past a stop decision (3 attempts, a 2-attempt plateau, an oscillation, or 15 minutes; the reference's section 8). Fidelity defects ride the same loop (`--defects "$SESSION_DIR/defects.json" --defects "$SESSION_DIR/fidelity-defects.json"`), but a `deliver` decision does not release them: while `fidelity-defects.json` lists `untraceable_number`, `value_mismatch`, `unit_mismatch`, `quote_not_verbatim`, `quote_unbound`, `unbound_sentence`, or `chart_value_untraceable`, `outcome verify` fails with `fidelity_unresolved` and `outcome finish` refuses, even with the repair budget spent. The only ways out are a ledger row, an `assumed` row with its rationale, or removing the sentence.
181
181
 
@@ -80,7 +80,7 @@ format description: none
80
80
 
81
81
  The values below are read by `scripts/fidelity-policy.mjs`, the single registry: `SOURCE_FLOOR_RULES` and `parseSourceFloor()` for the `source floor` forms (`pointedFlag` in source registration reads the same grammar), and `FIDELITY_VALUE_RULES` for `derived numbers`, `languages`, `fallback`, and `meaning check`. `derived numbers` and `fallback` accept only the values in their row below (`FIDELITY_VALUE_RULES.tables`, any case); any other value, a free-text answer included, is a usage error (exit `2`) naming the field and the value, as an unknown `source floor` form is. Map a free-text answer onto a table value before writing it: a partial allowance ("growth rates yes, estimates no") records `derived numbers: none`.
82
82
 
83
- Beside `## Deliverable`, the brief records what the report must stay faithful to, under `## Fidelity`. The fields are inferred first; only `as of`, `meaning check`, `source floor`, and `derived numbers` may be asked, each on its own trigger, in the same question call as Q1-Q3 (at most four questions in that call). The inference rules, the triggers, and the question texts are in `SKILL.md`.
83
+ Beside `## Deliverable`, the brief records what the report must stay faithful to, under `## Fidelity`. The fields are inferred first; only `as of`, `meaning check`, `source floor`, and `derived numbers` may be asked, each on its own trigger, in the same question call as Q1-Q3 (at most four questions in that call). The inference rules, the triggers, and the question texts are in [research-collection.md](research-collection.md), under "The fidelity questions".
84
84
 
85
85
  | Field | Values | Default | Read by |
86
86
  | --- | --- | --- | --- |
@@ -175,14 +175,14 @@ Nothing reaches the requester until the gates for its QA tier pass, in this orde
175
175
  node "$SKILL_DIR/scripts/report-tools.mjs" layout-probe --json # .source is one async expression
176
176
  ```
177
177
  4. **Visual QA.** Render the artifact to images (PDF pages to PNG, the HTML in the browser skill's engine at desktop and phone widths) and look at the pixels for what a machine cannot see: composition, hierarchy, page breaks, figure legibility.
178
- 5. **Proofread.** A dedicated writing lane proofreads the final text only (grammar, spelling, punctuation, terminology, native register); it never composes or rewrites content and never edits the file. Edits change text only; an edit whose before/after would alter any tag, attribute, comment, or script/style content is rejected, and markup changes go through the full fidelity gates instead. It returns `polish-edits.json` (`[{before, after, reason}]`), which the orchestrator applies edit by edit; a rejected or unlocated edit goes back to the lane with its reason, within the repair budget. The backstop diff, `fact verify` on the polished file, and the meaning readers on the pairs whose sentences polish changed run before the fidelity gate is recorded again. Edits must not span entities (such as &amp; or &lt;) or markup; narrow the edit to the surrounding words instead, and a rejected edit comes back with the reason to act on.
178
+ 5. **Proofread.** A dedicated writing lane proofreads the final text only (grammar, spelling, punctuation, terminology, native register); it never composes or rewrites content and never edits the file. Edits change text only; an edit whose before/after would alter any tag, attribute, comment, or script/style content is rejected, and markup changes go through the full fidelity gates instead. It returns `polish-edits.json` (`[{before, after, reason}]`), which the orchestrator applies edit by edit; a rejected or unlocated edit goes back to the lane with its reason, within the repair budget. The backstop diff, `fact verify` on the polished file, and the meaning readers on the pairs whose sentences polish changed run before the fidelity gate is recorded again; the layout gates and visual QA then run again on the polished file, which is the one delivered. Edits must not span entities (such as &amp; or &lt;) or markup; narrow the edit to the surrounding words instead, and a rejected edit comes back with the reason to act on.
179
179
  ```bash
180
180
  node "$SKILL_DIR/scripts/report-tools.mjs" fact polish-apply "$SESSION_DIR/report.html" --edits "$SESSION_DIR/polish-edits.json" --out "$SESSION_DIR/report.polished.html" --session-dir "$SESSION_DIR"
181
181
  node "$SKILL_DIR/scripts/report-tools.mjs" fact polish-diff --before "$SESSION_DIR/report.html" --after "$SESSION_DIR/report.polished.html" --session-dir "$SESSION_DIR" # writes polish-defects.json
182
182
  node "$SKILL_DIR/scripts/report-tools.mjs" fact pairs "$SESSION_DIR/report.polished.html" --changed-since "$SESSION_DIR/report.html.fill-map.json" --session-dir "$SESSION_DIR"
183
183
  ```
184
184
 
185
- **Every reader-facing edition is verified.** The main report, the inline edition (section 9), LaTeX per-section sources, and slide sources are filled by `fact fill` from one placeholder source and each is verified by `fact verify` into its own record; PDF and DOCX are renders of a verified source. A delivered row is recorded with `outcome set <format> delivered --path <file> --verified-by <record>`, where the record's `artifact_sha256` equals the sha256 of the delivered source; a PDF or DOCX adds `--rendered-from <source>` and is matched against that source. Each delivered edition also carries its own meaning record: run `fact pairs` on that edition's source and `fact meaning-check --edition <format>`, which writes `fidelity-meaning-defects.<format>.json` bound to those bytes (section 7). The barrier binds each edition to a record for its current bytes: every record whose `artifact_sha256` equals those bytes is a candidate (its own record, another edition's record for a byte-identical copy or the html edition a PDF renders, and the legacy single file `fidelity-meaning-defects.json`), and the one with the newest `written_at` wins; on equal times the more severe verdict wins (`meaning_drift_confirmed`, then `meaning_unverified`, then clean). In a session with a fact ledger, `outcome verify` refuses a delivered row without a matching record (`edition_unverified`, blocker, integrity). Markdown and LaTeX verification arrive with the Markdown stage; until then `fact verify --format md|tex` exits `2`, and such an edition is recorded `blocked_capability` with that reason rather than delivered unverified.
185
+ **Every reader-facing edition is verified.** The main report, the inline edition (section 9), LaTeX per-section sources, and slide sources are filled by `fact fill` from one placeholder source and each is verified by `fact verify` into its own record; PDF and DOCX are renders of a verified source. A delivered row is recorded with `outcome set <format> delivered --path <file> --verified-by <record>`, where the record's `artifact_sha256` equals the sha256 of the delivered source; a PDF or DOCX adds `--rendered-from <source>` and is matched against that source. Each delivered edition also carries its own meaning record: run `fact pairs` on that edition's source and `fact meaning-check --edition <format>`, which writes `fidelity-meaning-defects.<format>.json` bound to those bytes (section 7). The barrier binds each edition to a record for its current bytes: every record whose `artifact_sha256` equals those bytes is a candidate (its own record, another edition's record for a byte-identical copy or the html edition a PDF renders, and the legacy single file `fidelity-meaning-defects.json`), and the one with the newest `written_at` wins; on equal times the more severe verdict wins (`meaning_drift_confirmed`, then `meaning_unverified`, then clean). In a session with a fact ledger, `outcome verify` refuses a delivered row without a matching record (`edition_unverified`, blocker, integrity). A LaTeX edition is verified through its Markdown source; `fact verify --format tex` exits `2`.
186
186
 
187
187
  The light tier runs gate 1 and one render (recorded as `visual`) and records `fidelity`, `layout`, and `proofread` as `not_run` (`fidelity not_run` needs `--reason "<why>"`); the light tier never runs the fidelity verifier, although `fact verify` checks HTML and Markdown editions. The full tier runs all five.
188
188
 
@@ -269,7 +269,7 @@ Invoke every command as `node "$SKILL_DIR/scripts/report-tools.mjs" <command>`.
269
269
  | `fact polish-apply <report.html>` | `--edits <polish-edits.json>` and `--out <report.polished.html>` (both required; a missing flag or a Markdown edition exits `2`), `--fill-map <file>` (default: the edition's fill map, chosen as `fact verify` chooses it; one that does not record the input's bytes exits `2` and nothing is written), `--format html`, `--ledger <fact-ledger.json>`, `--brief <brief.md>`, `--session-dir <dir>` | `fidelity_interview_incomplete` (nothing written); otherwise never: it exits `0` whenever it wrote the output. With a fill map it also writes `<out>.polished.fill-map.json` (the brief binding, the polished file's hash, and `polishedFrom` naming the fill map) and never rewrites the fill map, even when `--out` is the input. Each rejected (`polish_edit_rejected`) or unlocated (`polish_edit_unlocated`) edit leaves its text unchanged and is printed verbatim, one line per rejection, in the summary and in `data.rejected_reasons`; `data` also carries `applied`, `rejected`, `unlocated`, `applied_indexes`, `input_sha256`, `edits_sha256`, and `out_sha256` |
270
270
  | `fact polish-diff` | `--before <pre-polish.html>` and `--after <polished.html>` (both required; a missing flag exits `2`), `--ledger <fact-ledger.json>`, `--out <record>` (default `$SESSION_DIR/polish-defects.json`), `--brief <brief.md>`, `--session-dir <dir>` | `fidelity_interview_incomplete` (nothing written), or a registry blocker in the diff (majors and minors are reported and exit `0`; a defect code the registry does not know refuses with `unknown defect code <code>`). The record is `{command, status, exitCode, before, artifact, artifact_sha256, defects[], counts}`, with `counts` in contract buckets |
271
271
  | `fact meaning-check` | `--pairs <pairs.json>` and `--verdicts <file>` (required; repeatable, one per reader tier), `--dispute P<n> --reason <text>`, `--run-id <id>`, `--calibration <file>` (default `fidelity-calibration.jsonl`), `--brief <brief.md>`, `--edition <format>` (writes `fidelity-meaning-defects.<format>.json`, the delivered edition's meaning record), `--out <record>` (default `fidelity-meaning-defects.json`), `--session-dir <dir>` | `fidelity_interview_incomplete`, or `meaning_drift_confirmed` (stderr carries one JSON line with the defect and dropped-verdict counts) |
272
- | `fact derive` | `--op <op>` and `--now <ISO>` (both required; `--now` is the row's `observed_at`, the script never reads the clock, and without it the command exits `2` with `missing_now` and writes no row) with the operation's operands (section 11), `--unit`, `--to`, `--rationale`, `--disjoint`, `--label`, `--json`, `--session-dir <dir>` | `incompatible_operands` (no row written) |
272
+ | `fact derive` | `--op <op>` and `--now <ISO>` (both required; `--now` is the row's `observed_at`, the script never reads the clock, and without it the command exits `2` with `missing_now` and writes no row) with the operation's operands (section 11), `--unit`, `--to`, `--rationale`, `--disjoint`, `--reference`, `--label`, `--json`, `--session-dir <dir>` | `incompatible_operands` (no row written) |
273
273
  | `claims index <claim-graph.md>` | `--out <claims.json>` (required) | never (a malformed claim table exits `2`) |
274
274
 
275
275
  ## 11. Fidelity gate
@@ -298,7 +298,7 @@ Derivations are computed in exact rationals from the operands' stored values and
298
298
 
299
299
  | Operation | Operands | Checks |
300
300
  | --- | --- | --- |
301
- | `sum` | two or more ids, `--unit` | one unit; summing `%` needs `--disjoint` and `--rationale` |
301
+ | `sum` | two or more ids, `--unit` | one unit; summing `%` needs `--disjoint`, `--reference <denominator>`, and `--rationale` |
302
302
  | `diff` | two ids (minuend, subtrahend) | one unit; a difference of `%` is in `pp` |
303
303
  | `growth` | `--from <id> --to <id>` | one declared entity, two different `valid_at` periods, a positive start; result in `%` |
304
304
  | `ratio` | `--num <id> --den <id>`, `--unit` | a non-zero denominator |
@@ -35,7 +35,7 @@ Save every asset under `$SESSION_DIR/assets/` and confirm the file exists and is
35
35
 
36
36
  ### Charts from data
37
37
 
38
- Put the numbers in a table first (`$SESSION_DIR/data/<name>.csv`), then plot from the table, never from prose. Follow the data-scientist doctrine in SKILL.md (numpy, Polars, DuckDB, no pandas).
38
+ Put the numbers in a table first (`$SESSION_DIR/data/<name>.csv`), then plot from the table, never from prose. Follow the data-scientist tool doctrine: numpy for numeric work beyond SQL/DataFrame aggregation, Polars for filtering, sorting, and transforms, DuckDB for joins, aggregations, and window functions, never pandas.
39
39
 
40
40
  ```bash
41
41
  uv run --with numpy --with polars --with matplotlib python plot_<name>.py
@@ -125,7 +125,7 @@ A post by Andrej Karpathy on 2026-10-02 ranks the formats that make model output
125
125
 
126
126
  ## 5. Quality bar
127
127
 
128
- - Every figure follows the figure standard in SKILL.md: fixed container, contain-fit, aspect ratio preserved, spec fonts and palette.
128
+ - Every figure follows the binding figure standard in [deliverable-phase.md](deliverable-phase.md), section 6: fixed container, contain-fit, aspect ratio preserved, spec fonts and palette.
129
129
  - The caption alone tells the reader what the visual shows and what to conclude: "Median build time fell from 9.4 to 3.1 minutes after the cache change [S4]" beats "Build times".
130
130
  - Alt text states the content, not the file: the key values or the shape of the trend for a chart, the main nodes and flow for a diagram. A purely decorative image takes `alt=""` plus `role="presentation"` and does not count as a visual; an empty alt without that marker is reported as missing.
131
131
  - Every number in a visual comes from the data table and carries its source or lineage tag in the caption.
@@ -102,7 +102,7 @@ asked: derived numbers
102
102
 
103
103
  Values carry no parentheses; `pending` goes only with `answered_by: pending`. When an answer lands, rewrite that one line with `answered_by: user` and leave `asked:` as history; a late answer after `fact fill` is a re-render: fill again, then verify.
104
104
 
105
- **Re-entry.** An `edit-existing` session, or any session created before this block existed, has no `## Fidelity`. Before any `fact` command, run the inference step above and write the block with `answered_by: default` on every field. `claims index` on a free-form `claim-graph.md` (no claim table) returns `{claims: [], errors: [...]}`, exits 2, and writes no `claims.json`; run `fact verify` without it, and the gate reports each unbound sentence as `unbound_sentence` (major) instead of blocking.
105
+ **Re-entry.** An `edit-existing` session, or any session created before this block existed, has no `## Fidelity`. Before any `fact` command, run the inference step above and write the block with `answered_by: default` on every field. `claims index` on a free-form `claim-graph.md` (no claim table) returns `{claims: [], errors: [...]}`, exits 2, and writes no `claims.json`; run `fact verify` without it, and the gate reports each unbound sentence as `unbound_sentence` (major), which blocks delivery until the sentence is bound.
106
106
 
107
107
  **Calibration.** `fact meaning-check` appends one line per flagged pair to `--calibration` (default `$SESSION_DIR/fidelity-calibration.jsonl`). After each run, also append that run's new lines to the workspace-level `.omo/ulw-research/fidelity-calibration.jsonl`; promotion of `meaning_drift_confirmed` is decided from that log.
108
108
 
@@ -129,7 +129,7 @@ Scaling floor — more angles always justify more workers:
129
129
  Role protocols — embed the relevant one in each spawn message; every worker gets a unique angle:
130
130
 
131
131
  - **Codebase (explore), 2-4 workers.** Grep with 3+ keyword variations; structural/AST search; LSP definitions and references; file-name globs; `git log --all -S '<keyword>'` and `--grep` for history including deleted code. Cross-validate hits across tools. Report absolute file paths, patterns with `file:line`, and how findings connect.
132
- - **Web, 3-9 workers, every one loaded with the `browser` skill.** Search with 10+ websearch queries per worker, each with a different operator or angle (see Search craft); a result is a candidate, not a source. Read every candidate in the user's browser through the `browser` skill's attached engine: one named session per worker, one tab per source, several tabs open side by side while sources are compared — `session.tabCreate` / `tabSelect` / `tabClose` where the harness has a JS eval kernel, `bsk tab create --url <url>` / `tab select <id>` / `tab close <id>` / `tab list` on the CLI — the page scrolled to its end, a full-page screenshot of each top source saved as provenance, the tab closed once reported. A browser on another machine is reached through the `browser` skill's remote reference or a user-level skill that bridges to it, never replaced by a local headless one. `webfetch` is for raw files only: PDF, JSON, feeds, sitemaps. A host the browser cannot open (WAF, bot score, 403) goes to `ultimate-browsing`, whose provenance travels with the claim: a `snapshot` result cites its `snapshot_timestamp` and is never stated as the live page; a `proxy` result is `untrusted` until a second independent route agrees. Context7 with 3+ queries per known library; grep.app and `gh search code|repos|issues` for real-world usage; official docs via sitemap discovery (`<base>/sitemap.xml`), then targeted pages. A worker whose sources are all fetched text has searched, not read.
132
+ - **Web, 3-9 workers, every one loaded with the `browser` skill.** Search with 10+ websearch queries per worker, each with a different operator or angle (see Search craft); a result is a candidate, not a source. Read every candidate in the user's browser through the `browser` skill's attached engine: one named session per worker, one tab per source, several tabs open side by side while sources are compared — `session.tabCreate` / `tabSelect` / `tabClose` where the harness has a JS eval kernel, `bsk tab create --session <session> --url <url>` / `tab select --session <session> <id>` / `tab close --session <session> <id>` / `tab list --session <session>` on the CLI — the page scrolled to its end, a full-page screenshot of each top source saved as provenance, the tab closed once reported. A browser on another machine is reached through the `browser` skill's remote reference or a user-level skill that bridges to it, never replaced by a local headless one. `webfetch` is for raw files only: PDF, JSON, feeds, sitemaps. A host the browser cannot open (WAF, bot score, 403) goes to `ultimate-browsing`, whose provenance travels with the claim: a `snapshot` result cites its `snapshot_timestamp` and is never stated as the live page; a `proxy` result is `untrusted` until a second independent route agrees. Context7 with 3+ queries per known library; grep.app and `gh search code|repos|issues` for real-world usage; official docs via sitemap discovery (`<base>/sitemap.xml`), then targeted pages. A worker whose sources are all fetched text has searched, not read.
133
133
  - **Repo deep-dive (librarian), 0-2 workers.** Shallow-clone the most relevant repos to `${TMPDIR:-/tmp}`, pin the HEAD SHA, read core modules, follow call chains, return SHA-pinned permalinks.
134
134
 
135
135
  Example spawn (codebase axis; web and repo-dive follow the same contract with their own protocol):
@@ -31,7 +31,7 @@ numeric guards may read `exact` values, unit selection may not. The property tes
31
31
 
32
32
  | op | arity | operand guards | context fields (persisted on the row) | result unit | malformed -> recompute ok:false |
33
33
  |---|---|---|---|---|---|
34
- | sum | n>=2 | non-affine units, all equal after canonicalization; if `%`: `disjoint: true` AND `reference` (one denominator id/text) equal on every operand AND rationale | disjoint, reference, rationale | the common unit (`%` stays `%`) | <2 operands; missing id; no context; unequal/affine units; `%` without disjoint, reference, or rationale |
34
+ | sum | n>=2 | non-affine units, all equal after canonicalization; if `%`: `disjoint: true` AND `reference` (one denominator id/text) equal on every operand AND rationale | disjoint, reference (the `%` rationale goes in the row's `rationale` field, not in context) | the common unit (`%` stays `%`) | <2 operands; missing id; no context; unequal/affine units; `%` without disjoint, reference, or rationale |
35
35
  | diff | 2 | non-affine units; typed pairs only: U-U -> U (same non-% unit); %-% -> `%p`; %-%p -> `%`; %p-%p -> `%p`; %p-% REFUSED | none | per the pair rule | arity; invalid pair (`%p - %`, `m - person`); affine units; stray context |
36
36
  | growth | 2 (from,to) | equal non-affine units; same entity; two different valid_at; from.exact > 0 | none | `%` (= 100(to-from)/from) | arity; unequal/affine units; entity/valid_at; from<=0; stray context |
37
37
  | share | 2 (part,whole) | equal non-affine units; whole.exact > 0; 0 <= part <= whole | none | `%` (= 100 part/whole) | arity; units; whole<=0; part outside [0,whole]; stray context |
@@ -123,7 +123,7 @@ converted rows that carry this version's columns, and to every row this version
123
123
  still breaks a strict rule (a scale word as unit, empty metadata, an operation or derivation fields) is flagged when it
124
124
  is used: `derive` and `recompute` refuse it with shape `dimension 6`, `dimension 18`, or `dimension 1`, and `addRow`
125
125
  refuses to write a new one. Normalization never strips user data: an `exact` carrying keys beyond `num` and `den` is left exactly as written and flagged `dimension 7` on use, never silently reduced to `{ num, den }`. Reading a normalized file again changes nothing. The legacy test fixture is generated by
126
- dev's own `addRow` (`scripts/tests/fixtures/fidelity/gen-legacy-dev.mjs`, which pins the dev commit).
126
+ dev's own `addRow` (`scripts/tests/fixtures/fidelity/gen-legacy-dev.mjs` in the source repository, which pins the dev commit; the tests and fixtures do not ship with the skill).
127
127
 
128
128
  ## Trust boundary
129
129
 
@@ -55,4 +55,4 @@ node scripts/visual-qa.mjs tui-check <capture.txt> --cols 80
55
55
  bun test scripts/*.test.ts
56
56
  ```
57
57
 
58
- - Parent: [`packages/shared-skills/AGENTS.md`](../../AGENTS.md).
58
+ - Parent (source checkout only; not shipped with the skill): `packages/shared-skills/AGENTS.md`.
@@ -130,7 +130,7 @@ This is the platform baseline, distilled from Apple's Human Interface Guidelines
130
130
  - A10 Content that continues out of view shows a cue (partial item, fade, chevron).
131
131
  - A11 (mac) Nothing important lives only at the window's bottom edge; the minimum window size keeps toolbar and content legible; the sidebar collapses when the window narrows.
132
132
  - A12 (web and app screens; N/A for a TUI, a printed page, or a figure) Layout contract: every changed screen or region has a `Layout:` line (in `DESIGN.md`, or in the change description when the project has none; the `frontend` skill's Brief step); the capture shows that pattern's structure; the logged owner is the region's main scroller in the probe output, every other scroller listed is nested inside it for its own content (a code block, a dropdown, a composer) or is named in the line too; none of the line's anti-patterns appear. A missing line, a different main scroller, an unexplained sibling scroller, or a present anti-pattern is a FAIL; a logged skip still owes the scroll-owner check.
133
- - A13 Spacing rhythm, read from computed values: the space above a section heading is at least 1.5x the space below it, and the gap between groups is at least 2x the gap inside a group (the `frontend` skill's `references/perfection/craft-floor.md`).
133
+ - A13 Spacing rhythm, read from computed values: the space above a section heading is at least 1.5x the space below it, and the gap between groups is at least 2x the gap inside a group, unless the brief's chosen style route sets its own spacing rhythm and the deviation is recorded in the brief or DESIGN.md, in which case that value is the check (the `frontend` skill's `references/perfection/craft-floor.md`).
134
134
 
135
135
  **B. Hierarchy**
136
136
  - B1 One primary action per view, in the prominent style (accent on its background, not its glyph); peers differ by style, never by size.
@@ -181,7 +181,7 @@ This is the platform baseline, distilled from Apple's Human Interface Guidelines
181
181
  A13, B8, E7, F8 and F9 are adapted from the craft floor of [pbakaus/impeccable](https://github.com/pbakaus/impeccable) (Apache-2.0, Copyright 2025 Paul Bakaus); the license and the list of changes are in the `frontend` skill's `ATTRIBUTION.md` section 6.
182
182
 
183
183
  **G. Motion and feedback**
184
- - G1 Every animation has a cause - an interaction, a state change, an arrival; no motion on non-interactive elements, no hover that changes nothing, no permanent loop.
184
+ - G1 Every animation has a cause - an interaction, a state change, an arrival; no motion on non-interactive elements, no hover that changes nothing, no permanent loop. A background the brief's ambience route asked for may loop on its decorative layer only while in view: it starts from an IntersectionObserver, stops off-screen and on visibilitychange, and paints one static frame under reduced motion (the `frontend` skill's `references/design/ambience-skill.md`).
185
185
  - G2 Transitions keep identity: a surface that resizes or moves animates from its old geometry to the new; exit mirrors entry; nothing reflows under the pointer.
186
186
  - G3 Motion is interruptible and never gates input: mid-animation input retargets smoothly and never snaps; nobody waits for an animation to act.
187
187
  - G4 Under `prefers-reduced-motion`, positional, scale and depth motion becomes a cross-fade; fades, progress and gesture tracking stay; blur never animates.
@@ -249,7 +249,7 @@ SOURCE CODE:
249
249
  {Full source of the UI: components, styles/tokens, layout, render code. Include neighboring files that show existing patterns.}
250
250
 
251
251
  CAPTURES:
252
- {Web: actual screenshot path(s) plus your described observations. TUI: paste capture.txt and capture-ansi.txt inline.}
252
+ {Web: actual screenshot path(s) plus your described observations. TUI: paste terminal.txt and terminal-ansi.txt inline.}
253
253
 
254
254
  SHARED SCRIPT EVIDENCE (reference, not verdict):
255
255
  {Paste the image-diff or tui-check JSON. Use alphaChannelIntact for the transparency check.}
@@ -306,7 +306,7 @@ BEFORE/AFTER PAIRS:
306
306
  SURFACE: {web | tui | both}
307
307
 
308
308
  CAPTURES:
309
- {Web: actual and reference screenshot paths plus your described observations. TUI: paste capture.txt and capture-ansi.txt inline.}
309
+ {Web: actual and reference screenshot paths plus your described observations. TUI: paste terminal.txt and terminal-ansi.txt inline.}
310
310
 
311
311
  SOURCE CODE:
312
312
  {For web: include the rendered text/content, components, typography, layout, and style code. For TUI: include render code that controls wrapping, width, and wide-character handling.}
@@ -322,7 +322,7 @@ USE THE EVIDENCE:
322
322
  - TUI (tui-check): inspect maxWidth vs expectedColumns, every overflowLines[] entry, borderMisaligned, and wideCharColumns[].
323
323
 
324
324
  CHECK:
325
- 1. Checklist sections A-F, item by item, on the 390 AND 1440 captures in BOTH themes and on the scrolled-to-end shots: PASS, FAIL or N/A with the capture that proves it. Every FAIL is BLOCKING.
325
+ 1. Checklist sections A-F, item by item, on the 390, 1440 and (for page layouts) 1920 captures in BOTH themes and on the scrolled-to-end shots: PASS, FAIL or N/A with the capture that proves it. Every FAIL is BLOCKING.
326
326
  2. When a reference packet exists, compare ACTUAL against REFERENCE pixel-perfectly, region by region: page bounds, header/nav, hero, cards, grids, charts, media, typography, copy, color tokens, radius, shadow, border, icon size, spacing, alignment, scroll position, and state. Anything off beyond unavoidable rasterization/rounding is a finding. The overview text is part of the target: missing or rearranged reference content is a finding even if the screenshot looks plausible.
327
327
  3. When before/after pairs exist, judge each pair side by side: the after must show the brief's primary action and priorities more legibly than the before, carry fewer elements without a job, and lose nothing from the required-content list. A pair with no change a reader can point to, or a required input, datum, or copy present in before and missing or merged in after, is a BLOCKING [defect].
328
328
  4. CJK precision:
@@ -89,8 +89,10 @@ not fall back to the owned engine for an authenticated criterion.
89
89
 
90
90
  ## Capture at a fixed viewport
91
91
 
92
- Match CSS viewport AND PNG dimensions: pin `deviceScaleFactor` through `emulate` (owned) or
93
- `resize` (attached) instead of resizing the PNG to force a pass; a 390-wide capture at desktop
92
+ Match CSS viewport AND PNG dimensions: pin `deviceScaleFactor` through `emulate` (owned engine).
93
+ Attached `resize(width, height)` sets the window size only and leaves the device pixel ratio at the
94
+ user's display, so on the attached engine record the capture's DPR (PNG width / CSS viewport width)
95
+ and compare against a reference taken at that DPR. Never resize the PNG to force a pass; a 390-wide capture at desktop
94
96
  DPR with classic scrollbars is not a phone capture. Wait for the specific page state (a locator,
95
97
  a `waitForURL`, a `createNetworkSnoop(page).waitFor(...)`), not a sleep, then compare:
96
98