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
@@ -6,13 +6,13 @@
6
6
 
7
7
  ```bash
8
8
  # 读取任意网页内容
9
- curl -s "https://r.jina.ai/URL"
9
+ curl -s -H "Authorization: Bearer ${JINA_API_KEY}" "https://r.jina.ai/URL"
10
10
 
11
11
  # 示例
12
- curl -s "https://r.jina.ai/https://example.com/article"
12
+ curl -s -H "Authorization: Bearer ${JINA_API_KEY}" "https://r.jina.ai/https://example.com/article"
13
13
  ```
14
14
 
15
- **适用场景**: 大多数网页可以直接用 Jina Reader 读取。
15
+ **适用场景**: 大多数网页可以直接用 Jina Reader 读取。匿名调用返回 401,必须带 `JINA_API_KEY`(见 [../insane-search/jina.md](../insane-search/jina.md))。
16
16
 
17
17
  ## Web Reader (MCP)
18
18
 
@@ -69,7 +69,7 @@ for e in feedparser.parse('FEED_URL').entries[:5]:
69
69
 
70
70
  | 场景 | 推荐工具 |
71
71
  |-----|---------|
72
- | 通用网页 | Jina Reader (`curl r.jina.ai`) |
72
+ | 通用网页 | Jina Reader (`curl r.jina.ai`,需 `JINA_API_KEY`) |
73
73
  | 需要图片/格式控制 | web-reader MCP |
74
74
  | 微信公众号 | Exa (搜索+阅读) / Camoufox (可选阅读) |
75
75
  | RSS 订阅 | feedparser |
@@ -29,7 +29,8 @@ page that only a signed-in user can reach belongs to the attached engine, not to
29
29
 
30
30
  ## Cookie login limits
31
31
 
32
- `scripts/extract_cookies.py` still exports cookies from a local browser; inject them with
32
+ `scripts/extract_cookies.py` still exports cookies from a local browser's default profile store (run it only where
33
+ that profile is not the user's live one; see `../SKILL.md`, Cookie login); inject them with
33
34
  `injectCookies(page, cookies)` into an **owned** profile. It sanitizes the set (drops expired
34
35
  entries, keeps host-prefixed cookies secure and root-scoped). Limits that do not change:
35
36
 
@@ -17,7 +17,7 @@
17
17
  2. 즉시 다음을 실행:
18
18
  ```bash
19
19
  python3 -B -m engine "<URL>" [--selector "<CSS>"] [--device auto|desktop|mobile] [--trace] \
20
- [--no-retry] [--no-extract]
20
+ [--timeout 25] [--max-attempts 12] [--no-playwright] [--allow-proxy] [--json]
21
21
  ```
22
22
  3. 종료코드 0(ok) 또는 1(fail) 받은 뒤 판단. trace를 먼저 읽고 재시도 결정.
23
23
  4. 실패 시에만 `--trace --json`으로 재호출해서 원인 진단 후 `--device` 또는 `user_hint` 조정.
@@ -124,7 +124,7 @@
124
124
  ### 단일 진입점
125
125
 
126
126
  ```python
127
- from insane_search.engine import fetch
127
+ from engine import fetch # 스킬 디렉터리에서 실행 (패키지는 engine/)
128
128
 
129
129
  result = fetch(
130
130
  "https://example.com/path",
@@ -136,15 +136,13 @@ result = fetch(
136
136
 
137
137
  if result.ok:
138
138
  print(result.verdict) # strong_ok | weak_ok
139
- html = result.content # raw body — 단, content-rescue가 발동한 경우 구조 텍스트
140
- # v0.10.0 content-rescue: PDF 응답은 pypdf 추출 텍스트, visible text가 얇은
141
- # SPA 셸은 JSON-LD articleBody / 렌더된 innerText로 대체될 수 있다.
142
- # result.extraction_source로 판별: "raw"(원문 그대로) | pdf | json_ld | *+inner_text.
143
- # 일반 HTML 성공은 항상 raw. 끄기: enable_extraction=False / --no-extract.
144
- # 429/502/503/504는 probe에서 백오프 재시도(Retry-After 반영, 총 10초 캡);
145
- # 끄기: enable_retry=False / --no-retry.
139
+ html = result.content # raw body (내장 추출/변환 없음)
140
+ # 필드: ok, content, final_url, verdict, profile_used, trace, summary,
141
+ # provenance, snapshot_timestamp, trust (engine/result_schema.py FetchResult).
142
+ # 업스트림 신버전의 content-rescue(PDF/JSON-LD 추출)와 Retry-After 백오프는
143
+ # 이 스냅샷에 없다 — engine/AGENTS.md의 WANT 목록. grid 시도 사이에는 짧은 jitter만 둔다.
146
144
  else:
147
- # Phase 3 수동 개입 (Playwright MCP) 필요 — result.trace로 원인 진단
145
+ # result.trace로 원인 진단. 브라우저가 필요하면 아래 "needs_js_exec only 폴백 규칙"을 따른다
148
146
  pass
149
147
  ```
150
148
 
@@ -191,16 +189,17 @@ report — FetchResult(ok, verdict, profile_used, trace, summary)
191
189
  | 태그 | 실행기 | 언제 |
192
190
  |------|--------|------|
193
191
  | `needs_real_tls_stack` + `needs_js_exec` | `playwright_real_chrome.js` (로컬 Node) | Akamai Bot Manager 등 — Chromium 번들 TLS는 탐지됨 |
194
- | `needs_js_exec` only | Playwright MCP (`mcp__playwright__*`) | Cloudflare 기본 방어 등 |
192
+ | `needs_js_exec` only | 에이전트가 직접 띄우는 브라우저 (엔진은 stub만 반환, 아래 규칙) | Cloudflare 기본 방어 등 |
195
193
  | `needs_mobile_context` (+ real_tls) | `playwright_mobile_chrome.js` | 모바일 디바이스 에뮬레이션 필요 |
196
194
 
197
195
  자세한 선택 기준: [playwright.md](playwright.md).
198
196
 
199
- ### Playwright MCP 호출 규칙
197
+ ### `needs_js_exec only` 폴백 규칙
200
198
 
201
- `fetch_chain`의 `needs_js_exec only` 케이스는 **Claude 세션에서 MCP 도구를 직접 호출**해야 한다. subprocess 경로 없음. 즉:
199
+ `fetch_chain`의 `needs_js_exec only` 케이스는 subprocess 경로가 없어 **에이전트가 직접 브라우저를 다뤄야** 한다. 즉:
202
200
  1. `result.summary`에 "Playwright MCP must be invoked from the Claude session"이 포함되면
203
- 2. `mcp__playwright__browser_navigate` → `browser_wait_for` → `browser_snapshot` 흐름으로 Claude가 직접 처리
201
+ 2. 엔진 문구가 MCP를 가리켜도 기본 경로는 Tier 2a owned engine이다: js eval에서 omowright `connectPipe`, 스텔스는 `connectCloakProfile` (`../../SKILL.md` Tier 2, the `browser` skill's `references/owned-engine/`)
202
+ 3. `mcp__playwright__*` 도구는 그 MCP가 이미 세션에 연결된 경우에만 쓴다. 없으면 새로 설치하지 않는다 ([playwright.md](playwright.md))
204
203
 
205
204
  ## Phase 2 — 수동 개입 (옵션)
206
205
 
@@ -233,7 +232,7 @@ Tier 1 추출 폴백 전용이며 에이전트가 직접 브라우저를 다루
233
232
 
234
233
  ```bash
235
234
  # 범용 웹 (Jina Reader — 일반 HTML만, WAF 사이트엔 무효)
236
- curl -s "https://r.jina.ai/{URL}"
235
+ curl -s -H "Authorization: Bearer ${JINA_API_KEY}" "https://r.jina.ai/{URL}"
237
236
 
238
237
  # yt-dlp — 1,858 사이트 미디어 메타데이터
239
238
  yt-dlp --dump-json "URL"
@@ -290,7 +289,7 @@ yt-dlp --write-sub --write-auto-sub --sub-lang "en,ko" --skip-download -o "/tmp/
290
289
  | 파일 | 언제 읽는가 | 무엇을 다루는가 |
291
290
  |------|-------------|-----------------|
292
291
  | [`tls-impersonate.md`](tls-impersonate.md) | curl_cffi 격자가 전부 `challenge`/`blocked`로 끝날 때, 새 impersonate 타겟을 `waf_profiles.yaml`에 추가할 때 | curl_cffi로 Safari/Chrome/Firefox TLS(JA3/JA4) 지문 복제하는 방법, WAF(Akamai/Cloudflare/F5 등)별 최적 타겟 조합, 임퍼소네이션 타겟 버전 목록, `tls_impersonate_avoid`의 실증 근거 |
293
- | [`playwright.md`](playwright.md) | engine이 Playwright fallback으로 넘어가는데 MCP/Local Chrome 중 어디로 갈지 확인 필요할 때 | Approach 1 (`mcp__playwright__*` — Cloudflare급 챌린지), Approach 2 (Local Node + `channel:'chrome'` + stealth — Akamai Bot Manager급), 템플릿 파라미터 규격 |
292
+ | [`playwright.md`](playwright.md) | engine이 Playwright fallback으로 넘어가는데 MCP/Local Chrome 중 어디로 갈지 확인 필요할 때 | Approach 1 (이미 연결된 경우의 `mcp__playwright__*`, 없으면 omowright owned engine — Cloudflare급 챌린지), Approach 2 (Local Node + `channel:'chrome'` + stealth — Akamai Bot Manager급), 템플릿 파라미터 규격 |
294
293
  | [`fallback.md`](fallback.md) | `verdict`가 애매하거나 Phase 전환 타이밍 결정 필요할 때 | engine의 Phase 0→1→2→3 에스컬레이션 원칙, 응답 성공/실패 판정 기준 세부, 각 Phase 종료 조건 |
295
294
  | [`metadata.md`](metadata.md) | 본문 전체를 못 가져왔지만 제목·요약·가격·저자 같은 핵심만이라도 필요할 때 | OGP 메타 태그, JSON-LD (Schema.org), Twitter Card 파싱, 구조화 데이터 추출 패턴 |
296
295
 
@@ -298,7 +297,7 @@ yt-dlp --write-sub --write-auto-sub --sub-lang "en,ko" --skip-download -o "/tmp/
298
297
 
299
298
  | 파일 | 언제 읽는가 | 무엇을 다루는가 |
300
299
  |------|-------------|-----------------|
301
- | [`jina.md`](jina.md) | WAF 없는 일반 웹(블로그·뉴스·Wiki)의 깨끗한 마크다운 추출 필요할 때 | `r.jina.ai/URL` 한 줄로 Puppeteer 기반 JS SPA 렌더링, 마크다운 변환, 무료 500 RPM, API 키 불필요 |
300
+ | [`jina.md`](jina.md) | WAF 없는 일반 웹(블로그·뉴스·Wiki)의 깨끗한 마크다운 추출 필요할 때 | `r.jina.ai/URL` + `JINA_API_KEY` Bearer 헤더(익명 호출은 401)로 Puppeteer 기반 JS SPA 렌더링, 마크다운 변환 |
302
301
  | [`cache-archive.md`](cache-archive.md) | 원본 사이트가 차단됐지만 과거 스냅샷으로라도 접근 필요할 때 | Wayback Machine CDX API, archive.today, AMP Cache (Google Cache는 2024-07 종료됨) |
303
302
  | [`rss.md`](rss.md) | 뉴스·블로그·커뮤니티의 시계열 업데이트를 구조화해 받고 싶을 때 | RSS/Atom 자동 발견, 피드 파싱, 인증 불필요 — 가장 깔끔한 시계열 데이터 소스 |
304
303
 
@@ -23,9 +23,12 @@
23
23
 
24
24
  ## Phase 1: 경량 프로브 (병렬)
25
25
 
26
+ > **R1 ([README.md](README.md))**: 차단된 URL에는 WebFetch나 즉흥 curl을 쓰지 않는다. `python3 -B -m engine "<URL>"`이
27
+ > 아래 Phase 1-3(curl_cffi 프로브, Referer/변환/디바이스 격자, 서로게이트, Playwright 폴백)을 실행한다.
28
+ > 이 문서는 `--trace` 출력을 읽기 위한 단계 설명이다.
29
+
26
30
  **먼저 시도** (동시):
27
- - WebFetch (Claude 내장)
28
- - Jina Reader (기본 / JSON / SPA 모드)
31
+ - Jina Reader (기본 / JSON / SPA 모드, `JINA_API_KEY` 있을 때만)
29
32
  - curl Chrome Desktop UA
30
33
 
31
34
  **아직 성공 없으면 추가 시도**:
@@ -34,7 +37,6 @@
34
37
  - URL 변형 시도: `.json`, `/rss`, `/feed`
35
38
 
36
39
  **사이드카** (1차와 동시, low-trust):
37
- - Google AMP 캐시
38
40
  - archive.today
39
41
  - Wayback Machine
40
42
  → **원본이 하나라도 성공하면 사이드카는 참고만.** 전부 실패 시에만 사이드카 채택 (provenance 태깅 필수)
@@ -90,7 +92,7 @@ for target in TARGETS:
90
92
  session = requests.Session(impersonate=target)
91
93
  session.headers.update(HEADERS)
92
94
  resp = session.get("{URL}", timeout=20)
93
- if resp.status_code == 200 and len(resp.text) > 300:
95
+ if resp.status_code == 200 and len(resp.text) >= 3072 and not any(m in resp.text for m in ("Access Denied", "Just a moment...", "DataDome", "sec-if-cpt-container")):
94
96
  # 성공 — JSON-LD도 같이 추출
95
97
  break
96
98
  except:
@@ -103,7 +105,7 @@ for target in TARGETS:
103
105
 
104
106
  ---
105
107
 
106
- ## Phase 3: Playwright MCP (브라우저)
108
+ ## Phase 3: 브라우저 (owned engine, 또는 이미 연결된 Playwright MCP)
107
109
 
108
110
  **조건**: Phase 2도 실패 또는 JS 챌린지/CAPTCHA 감지
109
111
 
@@ -114,7 +116,9 @@ browser_evaluate → () => document.body.innerText (Light Mode — 먼저)
114
116
  필요 시 browser_snapshot → 접근성 트리 전체
115
117
  ```
116
118
 
117
- **API 발견**: `browser_network_requests`로 숨은 JSON API를 찾으면 이후 curl_cffi로 재사용 가능.
119
+ 위 흐름은 Playwright MCP가 이미 세션에 연결된 경우의 도구 이름이다. 없으면 같은 단계를 Tier 2a owned engine(js eval의 omowright `connectPipe` / `connectCloakProfile`)으로 실행한다 — [README.md](README.md) "`needs_js_exec only` 폴백 규칙".
120
+
121
+ **API 발견**: `browser_network_requests`(MCP) 또는 owned engine의 `createNetworkSnoop`(the `browser` skill's `references/owned-engine/network.md`)로 숨은 JSON API를 찾으면 이후 curl_cffi로 재사용 가능.
118
122
 
119
123
  상세: [playwright.md](playwright.md)
120
124
 
@@ -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별 최적 전략
@@ -119,6 +119,8 @@ Before the first task command, create one `RUN_TMP=$(mktemp -d)` per task, track
119
119
  At task end, after owned processes exit, remove only owned directories, including runtime caches. Never wipe shared caches; retain worktrees still needed by open PRs and any parent directory containing them.
120
120
 
121
121
  ## 0. Survey the skills, gather context, then size the work
122
+ This section records into the notepad, so run section 2's `NOTE=`
123
+ command first; section 2 then initialises that same file.
122
124
  First, survey the loaded skill list and read the description of each
123
125
  loosely relevant skill. Decide explicitly which skills this task will
124
126
  use and prefer using every genuinely applicable one — name them in the
@@ -32,6 +32,8 @@ For work likely to exceed one wait cycle, require the child to send `WORKING: <t
32
32
 
33
33
  **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.
34
34
 
35
+ This rule binds the root of a ulw-execute run: a worker runs every implementation and per-task QA scenario, and you judge the artifacts it captured. The Codex edition's one exception is the final verification in the Completion section below, where the root runs its own manual QA on the real surface and records a self-review. 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.
36
+
35
37
  ### Codex tier mapping for the delegation router
36
38
  When tier worker agents are installed, map the delegation router's parenthesized difficulty to `agent_type`: (low) -> `lazycodex-worker-low`; (medium) -> `lazycodex-worker-medium`; (high) -> `lazycodex-worker-high`. Explorer/librarian research lanes keep their own roles. On spawn surfaces without `agent_type`, state the tier inside `message`. Difficulty (model power) is orthogonal to the LIGHT/HEAVY rigor tier in step 4 — judge each on its own facts.
37
39
 
@@ -112,7 +114,7 @@ Every phase (plan wave) runs in its own task-owned worktree with its own goal: b
112
114
  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:
113
115
 
114
116
  - **Independent lanes -> parallel workers.** Separate files, no shared contract: one parallel spawn burst; no team.
115
- - **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.
117
+ - **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.
116
118
  - **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.
117
119
  - **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.
118
120
 
@@ -152,7 +154,6 @@ When the plan annotates a todo with `Recommended task executor category:`, follo
152
154
  | `unspecified-high` (medium) | standard features across a few files with known patterns |
153
155
  | `visual-engineering` (medium) | frontend, UI/UX, styling, animation |
154
156
  | `writing` (low) | documentation and prose |
155
- | `git` (low) | git operations |
156
157
  | `deep-low` (medium) | hairy debugging, research-heavy or subtle cross-module work the worker can settle from what it reads |
157
158
  | `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 |
158
159
  | `ultrabrain` (high) | ONE genuinely hard, logic-heavy problem — hand it the goal, not step-by-step instructions |
@@ -162,6 +163,8 @@ Sizing is a two-branch decision made per checkbox, before dispatch:
162
163
  - **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.
163
164
  - **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.
164
165
 
166
+ 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).
167
+
165
168
  Each sub-task message must include:
166
169
 
167
170
  1. Goal and exact files or directories in scope.
@@ -173,7 +176,7 @@ Each sub-task message must include:
173
176
  - 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`.
174
177
  - 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.
175
178
  - Computer use: OS-level GUI automation against the running desktop app when the surface is not a page.
176
- - 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`.
179
+ - 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`.
177
180
  6. The adversarial classes that apply to this sub-task (from the 9 ultraqa classes) and how each is probed.
178
181
  7. Required artifact path and cleanup receipt.
179
182
  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.
@@ -218,10 +221,10 @@ A worker done claim is never final: each implementation sub-task returns a `Done
218
221
 
219
222
  Rules:
220
223
  - `confirmed` is the only pass verdict. `false-positive`, `needs-fix`, and `needs-human-review` all block checkbox completion.
221
- - 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.
224
+ - 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.
222
225
  - A worker done claim must be independently verified before it becomes checkbox completion.
223
226
  - 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.
224
- - 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.
227
+ - 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.
225
228
  - 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.
226
229
  - The verifier must probe the applicable adversarial keys, including `stale_state`, `dirty_worktree`, and `misleading_success_output`, before allowing `FullyDone`.
227
230
 
@@ -241,7 +244,7 @@ When all top-level checkboxes in `## TODOs` and `## Final Verification Wave` are
241
244
  1. Run the plan's final verification commands.
242
245
  2. Record a self-review in the notepad: re-read the diff, run diagnostics, and capture evidence for every acceptance criterion. Run your own manual QA on the real surface.
243
246
  3. Only when the user demanded strict, rigorous, or high-accuracy review, spawn ONE `lazycodex-gate-reviewer`; otherwise your self-review is the final verification.
244
- 4. Finish the PR/branch lifecycle from its task-owned 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.
247
+ 4. Finish the PR/branch lifecycle from its task-owned worktree: sync `.omo/` state back to the main repo, create or update the PR, wait for review/verification gates; `--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.
245
248
  5. Remove or mark the Boulder work as completed.
246
249
  6. Print an `ORCHESTRATION COMPLETE` block with the plan path, verification commands, artifacts, and cleanup receipts.
247
250
 
@@ -69,7 +69,7 @@ Stand up a team when BOTH hold:
69
69
  1. **The units' scopes overlap in a way you cannot cleanly cut.** They touch the same module, contract, or migration, so one unit's discovery changes what another should do. Fire-and-forget workers cannot exchange that mid-flight; teammates can, because the lead relays it.
70
70
  2. **Running them at the same time actually finishes sooner.** The units are each substantial and none is merely waiting on another's output. Two units where the second only consumes the first's result are a sequence, not a team.
71
71
 
72
- When the units are genuinely independent — separate files, no shared contract — spawn parallel background `task` workers instead and avoid the team coordination overhead entirely. When the work is one cohesive unit, do it yourself. Overlap alone is not enough: near-identical units that would collide on the same lines are faster done in sequence by one worker.
72
+ When the units are genuinely independent — separate files, no shared contract — spawn parallel background `task` workers instead and avoid the team coordination overhead entirely. When the work is one cohesive unit, keep it in this session - delegating only the code edits, test writes, fixes, and QA executions the rule above requires. Overlap alone is not enough: near-identical units that would collide on the same lines are faster done in sequence by one worker.
73
73
 
74
74
  Under team mode, isolate and land per unit:
75
75
 
@@ -87,7 +87,7 @@ Repaired: "Resolve every open change-requesting review comment on PR 123 touchin
87
87
  | an active goal conflicting with this intent | Stop and surface the conflict; the user decides whether to finish it, complete it, or branch. |
88
88
 
89
89
  2. Goals are unlimited. Never invent a numeric budget, token limit, or deadline the user did not state — that ban covers run quotas; the `assumed:` work constraints from Objective anatomy #4 are different and required.
90
- 3. In a ulw-loop run, the loop CLI owns per-goal state (`.omo/ulw-loop/goals.json`): `create_goal` registers the aggregate objective from the printed handoff, and this reference shapes both that objective and every goal's `successCriteria` at `create-goals` time.
90
+ 3. In a ulw-loop run, the loop SDK owns per-goal state (`.omo/ulw-loop/<session-id>/goals.json`): `create_goal` registers the aggregate objective from the handoff create-goals returns, and this reference shapes both that objective and every goal's `successCriteria` at `create-goals` time.
91
91
 
92
92
  ## Completion honesty
93
93
 
@@ -10,7 +10,7 @@ Expert goal orchestration agent. You conduct; right-sized subagents play. Plan d
10
10
  Use GPT-5.x style: outcome-first, evidence-bound, atomic decisions, no nested branching prose.
11
11
 
12
12
  ## Goal
13
- Deliver every goal in `.omo/ulw-loop/goals.json` end-to-end.
13
+ Deliver every goal in `.omo/ulw-loop/<session-id>/goals.json` end-to-end.
14
14
  Prove EVERY success criterion with captured observable evidence from a real-usage scenario you ran (HTTP / tmux / browser / computer-use below).
15
15
  TESTS ALONE NEVER PROVE DONE. A green test suite is supporting evidence, not completion proof.
16
16
  Audit each pass, fail, block, steering change, and checkpoint in `.omo/ulw-loop/<session-id>/ledger.jsonl`.
@@ -24,8 +24,8 @@ Run each criterion's real-surface proof yourself through the channel that faithf
24
24
  4. **Computer use** — for desktop/GUI apps, drive the running app via OS automation (computer-use, AppleScript, xdotool, etc.); capture action log + screenshot.
25
25
 
26
26
  For TUI visual QA (mandatory when a PR or review must inspect the terminal screen),
27
- run `node script/qa/web-terminal-visual-qa.mjs --command "<cmd>" --input "{Enter}"
28
- --evidence-dir <dir>` (live pty + xterm.js in Chrome; `--from-file` replays a raw
27
+ run `node script/qa/web-terminal-visual-qa.mjs --title "<surface>" --command "<cmd>"
28
+ --input "{Enter}" --evidence-dir <dir>` (live pty + xterm.js in Chrome; `--from-file` replays a raw
29
29
  stream) and record `terminal.png`, `terminal.txt`, and `metadata.json`.
30
30
 
31
31
  Auxiliary surfaces (CLI stdout / DB state diff / parsed config dump) are first-class evidence for CLI- or data-shaped criteria; use a channel scenario when the behavior is user-facing. `--dry-run`, printing the command, "should respond", and "looks correct" never count.
@@ -62,9 +62,9 @@ Codex subagent reliability:
62
62
  - Fallback only when the child is completed without the deliverable, ack-only after `followup_task`, explicitly `BLOCKED:`, or no longer running. Then send `TASK STILL ACTIVE: return <deliverable> or BLOCKED: <reason>` via `followup_task` when it can still recover the lane; otherwise record inconclusive, do not count it as pass/review approval, stop it if safe, and respawn a smaller `fork_turns: "none"` task with the missing deliverable.
63
63
 
64
64
  ## Artifacts
65
- - `.omo/ulw-loop/brief.md`: original brief and durable constraints.
66
- - `.omo/ulw-loop/goals.json`: goals with embedded `successCriteria` per goal.
67
- - `.omo/ulw-loop/ledger.jsonl`: append-only audit trail.
65
+ - `.omo/ulw-loop/<session-id>/brief.md`: original brief and durable constraints.
66
+ - `.omo/ulw-loop/<session-id>/goals.json`: goals with embedded `successCriteria` per goal.
67
+ - `.omo/ulw-loop/<session-id>/ledger.jsonl`: append-only audit trail.
68
68
  - Read artifacts before resuming, steering, or checkpointing.
69
69
  - After compaction or context loss, re-read brief + goals + ledger FIRST, then `omo-agent-toolkit ulw-loop status --json`. Recover from artifacts; never re-plan from scratch or repeat completed work.
70
70
  - Never invent state outside `.omo/ulw-loop` artifacts or `omo-agent-toolkit ulw-loop status --json`.
@@ -152,7 +152,7 @@ Loop per goal. Cap at 5 cycles per goal. Cap identical same-criterion failures a
152
152
 
153
153
  | get_goal result | action |
154
154
  |-----------------|--------|
155
- | no active goal | You MUST call `create_goal` — goal registration goes through the tool, never prose — with objective only from `instruction.json.objective`; do not copy lifecycle fields such as `status`. |
155
+ | no active goal | You MUST call `create_goal` — goal registration goes through the tool, never prose — with objective only from the handoff's rendered `create_goal` payload; do not copy lifecycle fields such as `status`. |
156
156
  | same aggregate objective active | Continue the current ulw-loop story. |
157
157
  | different goal active | STOP. Checkpoint blocked and surface the conflict. |
158
158
  4. If retrying failed work, run `omo-agent-toolkit ulw-loop complete-goals --retry-failed --json`.
@@ -190,11 +190,11 @@ omo-agent-toolkit ulw-loop status --json
190
190
  # Read nextActions and currentAttemptDir.
191
191
  omo-agent-toolkit ulw-loop record-evidence --goal-id <g> --criterion-id <c> --status pass --evidence "..."
192
192
  # Repeat record-evidence once per criterion.
193
- # Then use the harness update_goal tool with status complete.
194
193
  omo-agent-toolkit ulw-loop checkpoint --goal-id <g> --print-template --json
195
194
  # Fill the printed template: replace every placeholder and use real artifact paths under currentAttemptDir.
196
195
  # codex-goal-json.goal.objective must equal the plan's codexObjective verbatim.
197
196
  omo-agent-toolkit ulw-loop checkpoint --goal-id <g> --status complete --evidence "..." --codex-goal-json <path> --quality-gate-json <path>
197
+ # Only after that gated checkpoint succeeds, use the harness update_goal tool with status complete.
198
198
  omo-agent-toolkit ulw-loop complete-goals
199
199
  ```
200
200
 
@@ -206,7 +206,7 @@ Trigger only for the final aggregate goal after every criterion in every goal is
206
206
  2. FREEZE first — no more edits or rebases. At the frozen HEAD, re-run Manual-QA for any PASS criterion whose stamped tree differs from `git rev-parse --short "HEAD^{tree}"`, so every criterion is proven on the frozen tree; each artifact exists and is non-empty.
207
207
  3a. Spawn lazycodex-code-reviewer and lazycodex-qa-executor in parallel (`fork_context: false` on v1; `fork_turns: "none"` on v2) with brief, goals, desired outcome, diff, evidence; wait for BOTH and confirm their report artifacts exist on disk.
208
208
  3b. Only then spawn lazycodex-gate-reviewer with those artifact paths.
209
- 3c. The gate's approval binds to the frozen tree and full commit SHA and covers its three lanes — code quality, hands-on QA, and goal verification. Immediately append one durable `.omo/ulw-loop/ledger.jsonl` record per passing lane with the lane name, full SHA, verdict, and report artifact/source. Before reuse after continuation or compaction, re-read the ledger and require the exact lane/SHA pair; memory or an unstamped report is not coverage. A later rebase or amend that keeps the tree identical still has a new SHA and needs fresh lane stamps; changed content needs fresh review of the delta.
209
+ 3c. The gate's approval binds to the frozen tree and full commit SHA and covers its three lanes — code quality, hands-on QA, and goal verification. Immediately append one durable `.omo/ulw-loop/<session-id>/ledger.jsonl` record per passing lane with the lane name, full SHA, verdict, and report artifact/source. Before reuse after continuation or compaction, re-read the ledger and require the exact lane/SHA pair; memory or an unstamped report is not coverage. A later rebase or amend that keeps the tree identical still has a new SHA and needs fresh lane stamps; changed content needs fresh review of the delta.
210
210
  4. Treat timeout, missing deliverable, ack-only, `BLOCKED:`, or inconclusive review as a blocker. Any fix restarts the freeze at the new HEAD: re-run ONLY the proofs it invalidated and stamp the fresh output — never regenerate all evidence or relabel stale output to HEAD — re-review the delta at most TWICE; then record-review-blockers (step 5) and surface to the user.
211
211
  5. If review remains blocked, run `omo-agent-toolkit ulw-loop record-review-blockers --goal-id <id> --title "<...>" --objective "<...>" --evidence "<review findings>" --codex-goal-json <snapshot> --json`.
212
212
  6. If clean, checkpoint final completion:
@@ -251,7 +251,7 @@ Structured prompt directives accepted: `OMO_ULW_LOOP_STEER: { ... }`, `omo.ulw-l
251
251
  3. Evidence is bound to the tree it was captured at; changed tracked content invalidates it — re-run the QA at the current HEAD and re-record (an identical tree after rebase/amend stays valid). NEVER mark PASS from memory, and NEVER relabel, pin, refresh, or regenerate prior output to a moved HEAD.
252
252
  4. NEVER bypass the criteria gate: non-final aggregate completion requires all essential criteria; final aggregate completion requires all criteria across the whole plan.
253
253
  5. Baseline build/lint/typecheck/test commands are necessary evidence, NOT SUFFICIENT completion proof. Criteria coverage with observable evidence is the gate.
254
- 6. Treat `.omo/ulw-loop/ledger.jsonl` as the durable audit trail; checkpoint after every success or failure.
254
+ 6. Treat `.omo/ulw-loop/<session-id>/ledger.jsonl` as the durable audit trail; checkpoint after every success or failure.
255
255
  7. Per-story Codex goal mode is opt-in only with `--codex-goal-mode per-story`; default is aggregate.
256
256
  8. Structured steering directives mutate state through validation; normal prose does not.
257
257
  9. Evidence MUST be observable from the real surface per the Manual-QA channel table — never a printed command, `--dry-run`, or "looks correct".
@@ -180,7 +180,7 @@ Every "present the plan summary/brief" above delivers THIS structure, in the use
180
180
  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`).
181
181
  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.
182
182
  5. **Verification** - how completion will be proven: the final verification wave plus the key QA scenarios/commands.
183
- 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).
183
+ 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).
184
184
 
185
185
  ### High-accuracy review (dual review)
186
186
  The high-accuracy review is DUAL and both passes must return OKAY before handoff: (1) the native `momus` reviewer subagent, and (2) an independent Codex CLI review on gpt-5.6-sol at xhigh reasoning, run in a disposable isolated workspace and `CODEX_HOME` with the harness's 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>
@@ -57,7 +57,7 @@ The research is done when all of these hold:
57
57
  - Every claim in the deliverable cites a source or a verification artifact.
58
58
  - 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.
59
59
  - 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.
60
- - 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.
60
+ - 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.
61
61
  - 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.
62
62
  - When the harness can show an HTML page inline, the report was shown inline before the artifact paths.
63
63
  - 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.
@@ -142,7 +142,7 @@ The promised formats recorded in `brief.md` and `outcome.json` are binding; `pdf
142
142
 
143
143
  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:
144
144
 
145
- - **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).
145
+ - **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).
146
146
  - **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.
147
147
  - **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.
148
148
  - **Full-page screenshots** of the top 5-10 sources, saved by the web workers while reading, as provenance you can show.