harnery 0.33.0 → 0.34.0

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 (657) hide show
  1. package/dist/commander.d.ts.map +1 -1
  2. package/dist/commander.js +4 -0
  3. package/dist/commands/adapter.js +2 -2
  4. package/dist/commands/agents.d.ts +144 -1
  5. package/dist/commands/agents.d.ts.map +1 -1
  6. package/dist/commands/agents.js +1220 -588
  7. package/dist/commands/artifacts.d.ts.map +1 -1
  8. package/dist/commands/artifacts.js +7 -6
  9. package/dist/commands/backup.d.ts +1 -1
  10. package/dist/commands/backup.d.ts.map +1 -1
  11. package/dist/commands/backup.js +29 -16
  12. package/dist/commands/browse.d.ts.map +1 -1
  13. package/dist/commands/browse.js +234 -12
  14. package/dist/commands/checkpoint.d.ts.map +1 -1
  15. package/dist/commands/checkpoint.js +3 -2
  16. package/dist/commands/claude-desktop.d.ts +1 -1
  17. package/dist/commands/claude-desktop.d.ts.map +1 -1
  18. package/dist/commands/claude-desktop.js +3 -74
  19. package/dist/commands/context.js +1 -6
  20. package/dist/commands/decision.d.ts.map +1 -1
  21. package/dist/commands/decision.js +22 -38
  22. package/dist/commands/docs.d.ts.map +1 -1
  23. package/dist/commands/docs.js +91 -28
  24. package/dist/commands/doctor.js +10 -1
  25. package/dist/commands/events.d.ts +5 -0
  26. package/dist/commands/events.d.ts.map +1 -0
  27. package/dist/commands/events.js +189 -0
  28. package/dist/commands/governor.d.ts.map +1 -1
  29. package/dist/commands/governor.js +13 -4
  30. package/dist/commands/init.d.ts +9 -2
  31. package/dist/commands/init.d.ts.map +1 -1
  32. package/dist/commands/init.js +223 -51
  33. package/dist/commands/journal.d.ts.map +1 -1
  34. package/dist/commands/journal.js +4 -13
  35. package/dist/commands/ledger-v3.d.ts +5 -0
  36. package/dist/commands/ledger-v3.d.ts.map +1 -0
  37. package/dist/commands/ledger-v3.js +91 -0
  38. package/dist/commands/presence.d.ts.map +1 -1
  39. package/dist/commands/presence.js +11 -5
  40. package/dist/commands/sync.d.ts +1 -1
  41. package/dist/commands/sync.js +1 -1
  42. package/dist/commands/web.d.ts +6 -0
  43. package/dist/commands/web.d.ts.map +1 -1
  44. package/dist/commands/web.js +67 -7
  45. package/dist/commands/work.d.ts.map +1 -1
  46. package/dist/commands/work.js +22 -5
  47. package/dist/core/adapter.d.ts +5 -0
  48. package/dist/core/adapter.d.ts.map +1 -0
  49. package/dist/core/adapter.js +1 -0
  50. package/dist/core/adapters/attest.d.ts +5 -2
  51. package/dist/core/adapters/attest.d.ts.map +1 -1
  52. package/dist/core/adapters/attest.js +8 -3
  53. package/dist/core/adapters/profiles.d.ts +6 -6
  54. package/dist/core/adapters/profiles.d.ts.map +1 -1
  55. package/dist/core/adapters/profiles.js +4 -4
  56. package/dist/core/agents/canonical-emit.d.ts +17 -15
  57. package/dist/core/agents/canonical-emit.d.ts.map +1 -1
  58. package/dist/core/agents/canonical-emit.js +22 -22
  59. package/dist/core/agents/cli.js +207 -234
  60. package/dist/core/agents/codex-archive-v3.d.ts +14 -0
  61. package/dist/core/agents/codex-archive-v3.d.ts.map +1 -0
  62. package/dist/core/agents/codex-archive-v3.js +110 -0
  63. package/dist/core/agents/coord-client.d.ts +19 -81
  64. package/dist/core/agents/coord-client.d.ts.map +1 -1
  65. package/dist/core/agents/coord-client.js +65 -155
  66. package/dist/core/agents/finalization.d.ts +4 -1
  67. package/dist/core/agents/finalization.d.ts.map +1 -1
  68. package/dist/core/agents/finalization.js +89 -32
  69. package/dist/core/agents/index.d.ts +4 -5
  70. package/dist/core/agents/index.d.ts.map +1 -1
  71. package/dist/core/agents/index.js +4 -5
  72. package/dist/core/agents/live-authority-v3.d.ts +59 -0
  73. package/dist/core/agents/live-authority-v3.d.ts.map +1 -0
  74. package/dist/core/agents/live-authority-v3.js +233 -0
  75. package/dist/core/agents/live-lifecycle-v3.d.ts +20 -0
  76. package/dist/core/agents/live-lifecycle-v3.d.ts.map +1 -0
  77. package/dist/core/agents/live-lifecycle-v3.js +91 -0
  78. package/dist/core/agents/live-observation-v3.d.ts +25 -0
  79. package/dist/core/agents/live-observation-v3.d.ts.map +1 -0
  80. package/dist/core/agents/live-observation-v3.js +157 -0
  81. package/dist/core/agents/render/prompt-context.d.ts +4 -4
  82. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  83. package/dist/core/agents/render/prompt-context.js +23 -58
  84. package/dist/core/agents/render/session-context.d.ts +1 -1
  85. package/dist/core/agents/render/session-context.d.ts.map +1 -1
  86. package/dist/core/agents/render/session-context.js +8 -32
  87. package/dist/core/agents/rules/claim-conflict.d.ts +3 -3
  88. package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -1
  89. package/dist/core/agents/rules/claim-conflict.js +79 -127
  90. package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
  91. package/dist/core/agents/rules/commit-conflict.js +3 -18
  92. package/dist/core/agents/rules/stop-hook.d.ts +9 -50
  93. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  94. package/dist/core/agents/rules/stop-hook.js +193 -236
  95. package/dist/core/agents/session-events.d.ts +5 -7
  96. package/dist/core/agents/session-events.d.ts.map +1 -1
  97. package/dist/core/agents/session-events.js +127 -95
  98. package/dist/core/agents/session-finalization-state-v3.d.ts +30 -0
  99. package/dist/core/agents/session-finalization-state-v3.d.ts.map +1 -0
  100. package/dist/core/agents/session-finalization-state-v3.js +40 -0
  101. package/dist/core/agents/session-finalizer-v3.d.ts +107 -0
  102. package/dist/core/agents/session-finalizer-v3.d.ts.map +1 -0
  103. package/dist/core/agents/session-finalizer-v3.js +734 -0
  104. package/dist/core/agents/session-name-display.d.ts +40 -0
  105. package/dist/core/agents/session-name-display.d.ts.map +1 -0
  106. package/dist/core/agents/session-name-display.js +119 -0
  107. package/dist/core/agents/state/activity-log.d.ts +3 -3
  108. package/dist/core/agents/state/activity-log.d.ts.map +1 -1
  109. package/dist/core/agents/state/activity-log.js +7 -16
  110. package/dist/core/agents/state/heartbeat-writer.d.ts +23 -55
  111. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  112. package/dist/core/agents/state/heartbeat-writer.js +56 -228
  113. package/dist/core/agents/state/live-coordination-view.d.ts +31 -0
  114. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -0
  115. package/dist/core/agents/state/live-coordination-view.js +209 -0
  116. package/dist/core/agents/state/session-state.d.ts +4 -3
  117. package/dist/core/agents/state/session-state.d.ts.map +1 -1
  118. package/dist/core/agents/state/session-state.js +18 -9
  119. package/dist/core/agents/state/stale-sweep.d.ts +1 -1
  120. package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
  121. package/dist/core/agents/state/stale-sweep.js +26 -15
  122. package/dist/core/artifacts/index.d.ts.map +1 -1
  123. package/dist/core/artifacts/index.js +5 -7
  124. package/dist/core/config.d.ts +33 -2
  125. package/dist/core/config.d.ts.map +1 -1
  126. package/dist/core/config.js +98 -2
  127. package/dist/core/context/index.d.ts +1 -4
  128. package/dist/core/context/index.d.ts.map +1 -1
  129. package/dist/core/context/index.js +9 -9
  130. package/dist/core/events/span-parent.d.ts +15 -0
  131. package/dist/core/events/span-parent.d.ts.map +1 -0
  132. package/dist/core/events/span-parent.js +34 -0
  133. package/dist/core/events/v3/advance.d.ts +14 -0
  134. package/dist/core/events/v3/advance.d.ts.map +1 -0
  135. package/dist/core/events/v3/advance.js +134 -0
  136. package/dist/core/events/v3/authority-outbox.d.ts +78 -0
  137. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -0
  138. package/dist/core/events/v3/authority-outbox.js +399 -0
  139. package/dist/core/events/v3/base-builder.d.ts +20 -0
  140. package/dist/core/events/v3/base-builder.d.ts.map +1 -0
  141. package/dist/core/events/v3/base-builder.js +29 -0
  142. package/dist/core/events/v3/base-contract.d.ts +7576 -0
  143. package/dist/core/events/v3/base-contract.d.ts.map +1 -0
  144. package/dist/core/events/v3/base-contract.js +647 -0
  145. package/dist/core/events/v3/bootstrap.d.ts +34 -0
  146. package/dist/core/events/v3/bootstrap.d.ts.map +1 -0
  147. package/dist/core/events/v3/bootstrap.js +175 -0
  148. package/dist/core/events/v3/builder.d.ts +20 -0
  149. package/dist/core/events/v3/builder.d.ts.map +1 -0
  150. package/dist/core/events/v3/builder.js +28 -0
  151. package/dist/core/events/v3/canonical.d.ts +31 -0
  152. package/dist/core/events/v3/canonical.d.ts.map +1 -0
  153. package/dist/core/events/v3/canonical.js +100 -0
  154. package/dist/core/events/v3/capabilities.d.ts +31 -0
  155. package/dist/core/events/v3/capabilities.d.ts.map +1 -0
  156. package/dist/core/events/v3/capabilities.js +107 -0
  157. package/dist/core/events/v3/capability-drift.d.ts +22 -0
  158. package/dist/core/events/v3/capability-drift.d.ts.map +1 -0
  159. package/dist/core/events/v3/capability-drift.js +134 -0
  160. package/dist/core/events/v3/catalog.d.ts +38 -0
  161. package/dist/core/events/v3/catalog.d.ts.map +1 -0
  162. package/dist/core/events/v3/catalog.js +135 -0
  163. package/dist/core/events/v3/clock-order.d.ts +34 -0
  164. package/dist/core/events/v3/clock-order.d.ts.map +1 -0
  165. package/dist/core/events/v3/clock-order.js +35 -0
  166. package/dist/core/events/v3/contract.d.ts +171 -0
  167. package/dist/core/events/v3/contract.d.ts.map +1 -0
  168. package/dist/core/events/v3/contract.js +180 -0
  169. package/dist/core/events/v3/control.d.ts +111 -0
  170. package/dist/core/events/v3/control.d.ts.map +1 -0
  171. package/dist/core/events/v3/control.js +419 -0
  172. package/dist/core/events/v3/coordination-view.d.ts +69 -0
  173. package/dist/core/events/v3/coordination-view.d.ts.map +1 -0
  174. package/dist/core/events/v3/coordination-view.js +119 -0
  175. package/dist/core/events/v3/economics.d.ts +77 -0
  176. package/dist/core/events/v3/economics.d.ts.map +1 -0
  177. package/dist/core/events/v3/economics.js +274 -0
  178. package/dist/core/events/v3/finalization-view.d.ts +26 -0
  179. package/dist/core/events/v3/finalization-view.d.ts.map +1 -0
  180. package/dist/core/events/v3/finalization-view.js +37 -0
  181. package/dist/core/events/v3/fingerprint-keys.d.ts +25 -0
  182. package/dist/core/events/v3/fingerprint-keys.d.ts.map +1 -0
  183. package/dist/core/events/v3/fingerprint-keys.js +217 -0
  184. package/dist/core/events/v3/generated.d.ts +4 -0
  185. package/dist/core/events/v3/generated.d.ts.map +1 -0
  186. package/dist/core/events/v3/generated.js +47 -0
  187. package/dist/core/events/v3/ids.d.ts +9 -0
  188. package/dist/core/events/v3/ids.d.ts.map +1 -0
  189. package/dist/core/events/v3/ids.js +25 -0
  190. package/dist/core/events/v3/index.d.ts +35 -0
  191. package/dist/core/events/v3/index.d.ts.map +1 -0
  192. package/dist/core/events/v3/index.js +33 -0
  193. package/dist/core/events/v3/latency.d.ts +63 -0
  194. package/dist/core/events/v3/latency.d.ts.map +1 -0
  195. package/dist/core/events/v3/latency.js +412 -0
  196. package/dist/core/events/v3/live-feed.d.ts +45 -0
  197. package/dist/core/events/v3/live-feed.d.ts.map +1 -0
  198. package/dist/core/events/v3/live-feed.js +246 -0
  199. package/dist/core/events/v3/live-observation.d.ts +35 -0
  200. package/dist/core/events/v3/live-observation.d.ts.map +1 -0
  201. package/dist/core/events/v3/live-observation.js +1 -0
  202. package/dist/core/events/v3/live-routing.d.ts +57 -0
  203. package/dist/core/events/v3/live-routing.d.ts.map +1 -0
  204. package/dist/core/events/v3/live-routing.js +107 -0
  205. package/dist/core/events/v3/producers/command-recorder.d.ts +67 -0
  206. package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -0
  207. package/dist/core/events/v3/producers/command-recorder.js +477 -0
  208. package/dist/core/events/v3/producers/command.d.ts +50 -0
  209. package/dist/core/events/v3/producers/command.d.ts.map +1 -0
  210. package/dist/core/events/v3/producers/command.js +135 -0
  211. package/dist/core/events/v3/producers/coordination-recorder.d.ts +53 -0
  212. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -0
  213. package/dist/core/events/v3/producers/coordination-recorder.js +376 -0
  214. package/dist/core/events/v3/producers/coordination.d.ts +90 -0
  215. package/dist/core/events/v3/producers/coordination.d.ts.map +1 -0
  216. package/dist/core/events/v3/producers/coordination.js +229 -0
  217. package/dist/core/events/v3/producers/hook-base.d.ts +54 -0
  218. package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -0
  219. package/dist/core/events/v3/producers/hook-base.js +424 -0
  220. package/dist/core/events/v3/producers/hook.d.ts +29 -0
  221. package/dist/core/events/v3/producers/hook.d.ts.map +1 -0
  222. package/dist/core/events/v3/producers/hook.js +71 -0
  223. package/dist/core/events/v3/producers/intake.d.ts +65 -0
  224. package/dist/core/events/v3/producers/intake.d.ts.map +1 -0
  225. package/dist/core/events/v3/producers/intake.js +244 -0
  226. package/dist/core/events/v3/producers/recorder.d.ts +240 -0
  227. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -0
  228. package/dist/core/events/v3/producers/recorder.js +2176 -0
  229. package/dist/core/events/v3/projection.d.ts +101 -0
  230. package/dist/core/events/v3/projection.d.ts.map +1 -0
  231. package/dist/core/events/v3/projection.js +479 -0
  232. package/dist/core/events/v3/reader.d.ts +75 -0
  233. package/dist/core/events/v3/reader.d.ts.map +1 -0
  234. package/dist/core/events/v3/reader.js +778 -0
  235. package/dist/core/events/v3/recovery-record.d.ts +47 -0
  236. package/dist/core/events/v3/recovery-record.d.ts.map +1 -0
  237. package/dist/core/events/v3/recovery-record.js +167 -0
  238. package/dist/core/events/v3/recovery.d.ts +22 -0
  239. package/dist/core/events/v3/recovery.d.ts.map +1 -0
  240. package/dist/core/events/v3/recovery.js +227 -0
  241. package/dist/core/events/v3/span-state.d.ts +52 -0
  242. package/dist/core/events/v3/span-state.d.ts.map +1 -0
  243. package/dist/core/events/v3/span-state.js +142 -0
  244. package/dist/core/events/v3/targets.d.ts +23 -0
  245. package/dist/core/events/v3/targets.d.ts.map +1 -0
  246. package/dist/core/events/v3/targets.js +134 -0
  247. package/dist/core/events/v3/turn-telemetry.d.ts +41 -0
  248. package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -0
  249. package/dist/core/events/v3/turn-telemetry.js +168 -0
  250. package/dist/core/events/v3/validate.d.ts +9 -0
  251. package/dist/core/events/v3/validate.d.ts.map +1 -0
  252. package/dist/core/events/v3/validate.js +281 -0
  253. package/dist/core/events/v3/writer.d.ts +56 -0
  254. package/dist/core/events/v3/writer.d.ts.map +1 -0
  255. package/dist/core/events/v3/writer.js +335 -0
  256. package/dist/core/governor/index.d.ts +1 -1
  257. package/dist/core/governor/index.d.ts.map +1 -1
  258. package/dist/core/governor/index.js +1 -1
  259. package/dist/core/governor/plan-api.d.ts +2 -1
  260. package/dist/core/governor/plan-api.d.ts.map +1 -1
  261. package/dist/core/governor/plan-api.js +6 -3
  262. package/dist/core/governor/read.d.ts +1 -1
  263. package/dist/core/governor/read.d.ts.map +1 -1
  264. package/dist/core/governor/read.js +1 -1
  265. package/dist/core/governor/state.d.ts +9 -0
  266. package/dist/core/governor/state.d.ts.map +1 -1
  267. package/dist/core/governor/state.js +40 -3
  268. package/dist/core/guard/config.d.ts +5 -0
  269. package/dist/core/guard/config.d.ts.map +1 -0
  270. package/dist/core/guard/config.js +157 -0
  271. package/dist/core/guard/coordinator.d.ts +14 -0
  272. package/dist/core/guard/coordinator.d.ts.map +1 -0
  273. package/dist/core/guard/coordinator.js +173 -0
  274. package/dist/core/guard/evaluator.d.ts +4 -0
  275. package/dist/core/guard/evaluator.d.ts.map +1 -0
  276. package/dist/core/guard/evaluator.js +242 -0
  277. package/dist/core/guard/evidence-v3.d.ts +15 -0
  278. package/dist/core/guard/evidence-v3.d.ts.map +1 -0
  279. package/dist/core/guard/evidence-v3.js +171 -0
  280. package/dist/core/guard/index.d.ts +10 -0
  281. package/dist/core/guard/index.d.ts.map +1 -0
  282. package/dist/core/guard/index.js +6 -0
  283. package/dist/core/guard/live-source-v3.d.ts +40 -0
  284. package/dist/core/guard/live-source-v3.d.ts.map +1 -0
  285. package/dist/core/guard/live-source-v3.js +128 -0
  286. package/dist/core/guard/storage.d.ts +27 -0
  287. package/dist/core/guard/storage.d.ts.map +1 -0
  288. package/dist/core/guard/storage.js +140 -0
  289. package/dist/core/guard/types.d.ts +119 -0
  290. package/dist/core/guard/types.d.ts.map +1 -0
  291. package/dist/core/guard/types.js +1 -0
  292. package/dist/core/hooks/adapter/detect.d.ts +18 -1
  293. package/dist/core/hooks/adapter/detect.d.ts.map +1 -1
  294. package/dist/core/hooks/adapter/detect.js +29 -0
  295. package/dist/core/hooks/adapter/events.d.ts +7 -4
  296. package/dist/core/hooks/adapter/events.d.ts.map +1 -1
  297. package/dist/core/hooks/adapter/events.js +12 -4
  298. package/dist/core/hooks/adapter/output.d.ts +2 -2
  299. package/dist/core/hooks/adapter/output.d.ts.map +1 -1
  300. package/dist/core/hooks/adapter/parse.d.ts +7 -4
  301. package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
  302. package/dist/core/hooks/adapter/parse.js +63 -25
  303. package/dist/core/hooks/adapter/wiring.d.ts +30 -4
  304. package/dist/core/hooks/adapter/wiring.d.ts.map +1 -1
  305. package/dist/core/hooks/adapter/wiring.js +89 -11
  306. package/dist/core/hooks/cli.d.ts +1 -1
  307. package/dist/core/hooks/cli.js +305 -444
  308. package/dist/core/hooks/effects/image-capture.d.ts +20 -34
  309. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  310. package/dist/core/hooks/effects/image-capture.js +212 -221
  311. package/dist/core/hooks/effects/index.d.ts +1 -9
  312. package/dist/core/hooks/effects/index.d.ts.map +1 -1
  313. package/dist/core/hooks/effects/index.js +1 -24
  314. package/dist/core/hooks/events/input-hash.d.ts +7 -0
  315. package/dist/core/hooks/events/input-hash.d.ts.map +1 -0
  316. package/dist/core/hooks/events/input-hash.js +43 -0
  317. package/dist/core/hooks/index.d.ts +4 -3
  318. package/dist/core/hooks/index.d.ts.map +1 -1
  319. package/dist/core/hooks/index.js +2 -3
  320. package/dist/core/hooks/resolve/coord-root.d.ts +1 -1
  321. package/dist/core/hooks/resolve/coord-root.js +1 -1
  322. package/dist/core/hooks/resolve/owner.d.ts +16 -15
  323. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  324. package/dist/core/hooks/resolve/owner.js +51 -42
  325. package/dist/core/hooks/resolve/transcript.d.ts +33 -3
  326. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  327. package/dist/core/hooks/resolve/transcript.js +155 -14
  328. package/dist/core/hooks/session-name-presence.d.ts +9 -10
  329. package/dist/core/hooks/session-name-presence.d.ts.map +1 -1
  330. package/dist/core/hooks/session-name-presence.js +15 -15
  331. package/dist/core/hooks/unsafe-cross-shell.d.ts +1 -1
  332. package/dist/core/hooks/unsafe-cross-shell.d.ts.map +1 -1
  333. package/dist/core/journal/index.d.ts +2 -2
  334. package/dist/core/journal/index.d.ts.map +1 -1
  335. package/dist/core/journal/index.js +9 -22
  336. package/dist/core/presence/blob.d.ts +4 -3
  337. package/dist/core/presence/blob.d.ts.map +1 -1
  338. package/dist/core/presence/blob.js +45 -44
  339. package/dist/core/presence/codec-digest.d.ts +29 -0
  340. package/dist/core/presence/codec-digest.d.ts.map +1 -0
  341. package/dist/core/presence/codec-digest.js +170 -0
  342. package/dist/core/presence/relay-client.d.ts +1 -1
  343. package/dist/core/presence/relay-client.d.ts.map +1 -1
  344. package/dist/core/presence/relay-client.js +5 -5
  345. package/dist/core/work/index.d.ts +1 -1
  346. package/dist/core/work/index.d.ts.map +1 -1
  347. package/dist/core/work/index.js +1 -1
  348. package/dist/core/work/read.d.ts +1 -1
  349. package/dist/core/work/read.d.ts.map +1 -1
  350. package/dist/core/work/read.js +1 -1
  351. package/dist/core/work/runner.d.ts.map +1 -1
  352. package/dist/core/work/runner.js +6 -0
  353. package/dist/core/work/state.d.ts +9 -0
  354. package/dist/core/work/state.d.ts.map +1 -1
  355. package/dist/core/work/state.js +17 -3
  356. package/dist/core/workflow/engine.js +24 -25
  357. package/dist/core/workflow/live-session-v3.d.ts +19 -0
  358. package/dist/core/workflow/live-session-v3.d.ts.map +1 -0
  359. package/dist/core/workflow/live-session-v3.js +86 -0
  360. package/dist/core/workflow/scope-id.d.ts +3 -0
  361. package/dist/core/workflow/scope-id.d.ts.map +1 -0
  362. package/dist/core/workflow/scope-id.js +5 -0
  363. package/dist/core/workflow/workspaces/leases.d.ts +4 -0
  364. package/dist/core/workflow/workspaces/leases.d.ts.map +1 -1
  365. package/dist/core/workflow/workspaces/leases.js +53 -19
  366. package/dist/index.d.ts +1 -1
  367. package/dist/index.js +1 -1
  368. package/dist/lib/browser/client.d.ts +41 -0
  369. package/dist/lib/browser/client.d.ts.map +1 -1
  370. package/dist/lib/browser/client.js +203 -0
  371. package/dist/lib/browser/critique.d.ts +28 -2
  372. package/dist/lib/browser/critique.d.ts.map +1 -1
  373. package/dist/lib/browser/critique.js +74 -18
  374. package/dist/lib/browser/geometry.d.ts +1 -1
  375. package/dist/lib/browser/geometry.d.ts.map +1 -1
  376. package/dist/lib/browser/geometry.js +130 -6
  377. package/dist/lib/browser/index.d.ts +3 -0
  378. package/dist/lib/browser/index.d.ts.map +1 -1
  379. package/dist/lib/browser/index.js +3 -0
  380. package/dist/lib/browser/qa-plan.d.ts +174 -0
  381. package/dist/lib/browser/qa-plan.d.ts.map +1 -0
  382. package/dist/lib/browser/qa-plan.js +321 -0
  383. package/dist/lib/browser/qa-reuse.d.ts +99 -0
  384. package/dist/lib/browser/qa-reuse.d.ts.map +1 -0
  385. package/dist/lib/browser/qa-reuse.js +222 -0
  386. package/dist/lib/browser/qa-snapshot.d.ts +64 -0
  387. package/dist/lib/browser/qa-snapshot.d.ts.map +1 -0
  388. package/dist/lib/browser/qa-snapshot.js +171 -0
  389. package/dist/lib/browser/runts.d.ts.map +1 -1
  390. package/dist/lib/browser/runts.js +22 -1
  391. package/dist/lib/browser/tiling.d.ts +71 -0
  392. package/dist/lib/browser/tiling.d.ts.map +1 -0
  393. package/dist/lib/browser/tiling.js +118 -0
  394. package/dist/lib/claude-desktop.d.ts +0 -47
  395. package/dist/lib/claude-desktop.d.ts.map +1 -1
  396. package/dist/lib/claude-desktop.js +1 -169
  397. package/dist/lib/context/index.d.ts +0 -3
  398. package/dist/lib/context/index.d.ts.map +1 -1
  399. package/dist/lib/context/index.js +20 -42
  400. package/dist/lib/council/index.d.ts +2 -2
  401. package/dist/lib/council/index.d.ts.map +1 -1
  402. package/dist/lib/council/index.js +9 -20
  403. package/dist/lib/docs-frontmatter.d.ts +1 -6
  404. package/dist/lib/docs-frontmatter.d.ts.map +1 -1
  405. package/dist/lib/docs-frontmatter.js +12 -78
  406. package/dist/lib/docs-index.d.ts +9 -0
  407. package/dist/lib/docs-index.d.ts.map +1 -1
  408. package/dist/lib/docs-index.js +32 -3
  409. package/dist/lib/docs-lint.d.ts.map +1 -1
  410. package/dist/lib/docs-lint.js +14 -30
  411. package/dist/lib/docs-metadata-audit.d.ts +19 -0
  412. package/dist/lib/docs-metadata-audit.d.ts.map +1 -0
  413. package/dist/lib/docs-metadata-audit.js +132 -0
  414. package/dist/lib/docs-metadata-managed.d.ts +23 -0
  415. package/dist/lib/docs-metadata-managed.d.ts.map +1 -0
  416. package/dist/lib/docs-metadata-managed.js +78 -0
  417. package/dist/lib/docs-metadata-sync.d.ts +20 -0
  418. package/dist/lib/docs-metadata-sync.d.ts.map +1 -0
  419. package/dist/lib/docs-metadata-sync.js +222 -0
  420. package/dist/lib/docs-metadata-v2-schema.d.ts +273 -0
  421. package/dist/lib/docs-metadata-v2-schema.d.ts.map +1 -0
  422. package/dist/lib/docs-metadata-v2-schema.js +134 -0
  423. package/dist/lib/docs-metadata-v2.d.ts +21 -0
  424. package/dist/lib/docs-metadata-v2.d.ts.map +1 -0
  425. package/dist/lib/docs-metadata-v2.js +424 -0
  426. package/dist/lib/docs-new.d.ts +11 -0
  427. package/dist/lib/docs-new.d.ts.map +1 -0
  428. package/dist/lib/docs-new.js +52 -0
  429. package/dist/lib/docs-sweep.d.ts.map +1 -1
  430. package/dist/lib/docs-sweep.js +45 -29
  431. package/dist/lib/headless/index.d.ts +98 -0
  432. package/dist/lib/headless/index.d.ts.map +1 -0
  433. package/dist/lib/headless/index.js +211 -0
  434. package/dist/lib/identities/assume.d.ts +4 -4
  435. package/dist/lib/identities/assume.d.ts.map +1 -1
  436. package/dist/lib/identities/assume.js +52 -68
  437. package/dist/lib/instructions/apply.d.ts +5 -4
  438. package/dist/lib/instructions/apply.d.ts.map +1 -1
  439. package/dist/lib/instructions/apply.js +32 -20
  440. package/dist/lib/instructions/bundle.d.ts +1 -1
  441. package/dist/lib/instructions/bundle.d.ts.map +1 -1
  442. package/dist/lib/instructions/bundle.js +1 -1
  443. package/dist/lib/instructions/splice.d.ts +0 -1
  444. package/dist/lib/instructions/splice.d.ts.map +1 -1
  445. package/dist/lib/instructions/splice.js +22 -6
  446. package/dist/lib/instructions/templates.d.ts +7 -5
  447. package/dist/lib/instructions/templates.d.ts.map +1 -1
  448. package/dist/lib/instructions/templates.js +79 -9
  449. package/package.json +26 -5
  450. package/schemas/config.schema.json +120 -2
  451. package/schemas/docs-metadata-v2.schema.json +441 -0
  452. package/schemas/event-v3.schema.json +24472 -0
  453. package/src/commander.ts +4 -0
  454. package/src/commands/adapter.ts +2 -2
  455. package/src/commands/agents.ts +1512 -592
  456. package/src/commands/artifacts.ts +7 -6
  457. package/src/commands/backup.ts +29 -21
  458. package/src/commands/browse.ts +349 -8
  459. package/src/commands/checkpoint.ts +4 -3
  460. package/src/commands/claude-desktop.ts +2 -101
  461. package/src/commands/context.ts +1 -6
  462. package/src/commands/decision.ts +27 -44
  463. package/src/commands/docs.ts +100 -33
  464. package/src/commands/doctor.ts +14 -1
  465. package/src/commands/events.ts +256 -0
  466. package/src/commands/governor.ts +18 -4
  467. package/src/commands/init.ts +253 -57
  468. package/src/commands/instructions.ts +1 -1
  469. package/src/commands/journal.ts +4 -13
  470. package/src/commands/ledger-v3.ts +111 -0
  471. package/src/commands/presence.ts +11 -10
  472. package/src/commands/sync.ts +1 -1
  473. package/src/commands/web.ts +67 -8
  474. package/src/commands/work.ts +28 -5
  475. package/src/core/adapter.ts +5 -0
  476. package/src/core/adapters/attest.ts +8 -3
  477. package/src/core/adapters/profiles.ts +4 -6
  478. package/src/core/agents/canonical-emit.ts +34 -25
  479. package/src/core/agents/cli.ts +236 -262
  480. package/src/core/agents/codex-archive-v3.ts +138 -0
  481. package/src/core/agents/coord-client.ts +75 -188
  482. package/src/core/agents/finalization.ts +120 -38
  483. package/src/core/agents/index.ts +4 -5
  484. package/src/core/agents/live-authority-v3.ts +375 -0
  485. package/src/core/agents/live-lifecycle-v3.ts +140 -0
  486. package/src/core/agents/live-observation-v3.ts +216 -0
  487. package/src/core/agents/render/prompt-context.ts +29 -60
  488. package/src/core/agents/render/session-context.ts +10 -31
  489. package/src/core/agents/rules/claim-conflict.ts +85 -126
  490. package/src/core/agents/rules/commit-conflict.ts +3 -14
  491. package/src/core/agents/rules/stop-hook.ts +239 -293
  492. package/src/core/agents/session-events.ts +137 -104
  493. package/src/core/agents/session-finalization-state-v3.ts +90 -0
  494. package/src/core/agents/session-finalizer-v3.ts +953 -0
  495. package/src/core/agents/session-name-display.ts +149 -0
  496. package/src/core/agents/state/activity-log.ts +6 -14
  497. package/src/core/agents/state/heartbeat-writer.ts +82 -277
  498. package/src/core/agents/state/live-coordination-view.ts +290 -0
  499. package/src/core/agents/state/session-state.ts +24 -12
  500. package/src/core/agents/state/stale-sweep.ts +40 -17
  501. package/src/core/artifacts/index.ts +4 -5
  502. package/src/core/config.ts +148 -3
  503. package/src/core/context/index.ts +9 -17
  504. package/src/core/events/span-parent.ts +46 -0
  505. package/src/core/events/v3/advance.ts +168 -0
  506. package/src/core/events/v3/authority-outbox.ts +548 -0
  507. package/src/core/events/v3/base-builder.ts +60 -0
  508. package/src/core/events/v3/base-contract.ts +882 -0
  509. package/src/core/events/v3/bootstrap.ts +226 -0
  510. package/src/core/events/v3/builder.ts +59 -0
  511. package/src/core/events/v3/canonical.ts +153 -0
  512. package/src/core/events/v3/capabilities.ts +171 -0
  513. package/src/core/events/v3/capability-drift.ts +177 -0
  514. package/src/core/events/v3/catalog.ts +202 -0
  515. package/src/core/events/v3/clock-order.ts +41 -0
  516. package/src/core/events/v3/contract.ts +365 -0
  517. package/src/core/events/v3/control.ts +576 -0
  518. package/src/core/events/v3/coordination-view.ts +193 -0
  519. package/src/core/events/v3/economics.ts +384 -0
  520. package/src/core/events/v3/finalization-view.ts +67 -0
  521. package/src/core/events/v3/fingerprint-keys.ts +260 -0
  522. package/src/core/events/v3/generated.ts +48 -0
  523. package/src/core/events/v3/ids.ts +33 -0
  524. package/src/core/events/v3/index.ts +322 -0
  525. package/src/core/events/v3/latency.ts +551 -0
  526. package/src/core/events/v3/live-feed.ts +319 -0
  527. package/src/core/events/v3/live-observation.ts +39 -0
  528. package/src/core/events/v3/live-routing.ts +135 -0
  529. package/src/core/events/v3/producers/command-recorder.ts +631 -0
  530. package/src/core/events/v3/producers/command.ts +201 -0
  531. package/src/core/events/v3/producers/coordination-recorder.ts +538 -0
  532. package/src/core/events/v3/producers/coordination.ts +355 -0
  533. package/src/core/events/v3/producers/hook-base.ts +578 -0
  534. package/src/core/events/v3/producers/hook.ts +119 -0
  535. package/src/core/events/v3/producers/intake.ts +319 -0
  536. package/src/core/events/v3/producers/recorder.ts +2805 -0
  537. package/src/core/events/v3/projection.ts +653 -0
  538. package/src/core/events/v3/reader.ts +1127 -0
  539. package/src/core/events/v3/recovery-record.ts +244 -0
  540. package/src/core/events/v3/recovery.ts +271 -0
  541. package/src/core/events/v3/span-state.ts +187 -0
  542. package/src/core/events/v3/targets.ts +182 -0
  543. package/src/core/events/v3/turn-telemetry.ts +259 -0
  544. package/src/core/events/v3/validate.ts +361 -0
  545. package/src/core/events/v3/writer.ts +419 -0
  546. package/src/core/governor/index.ts +3 -0
  547. package/src/core/governor/plan-api.ts +10 -2
  548. package/src/core/governor/read.ts +3 -0
  549. package/src/core/governor/state.ts +52 -5
  550. package/src/core/guard/config.ts +206 -0
  551. package/src/core/guard/coordinator.ts +227 -0
  552. package/src/core/guard/evaluator.ts +343 -0
  553. package/src/core/guard/evidence-v3.ts +227 -0
  554. package/src/core/guard/index.ts +35 -0
  555. package/src/core/guard/live-source-v3.ts +204 -0
  556. package/src/core/guard/storage.ts +188 -0
  557. package/src/core/guard/types.ts +152 -0
  558. package/src/core/hooks/adapter/detect.ts +28 -1
  559. package/src/core/hooks/adapter/events.ts +14 -6
  560. package/src/core/hooks/adapter/output.ts +7 -2
  561. package/src/core/hooks/adapter/parse.ts +80 -38
  562. package/src/core/hooks/adapter/wiring.ts +119 -13
  563. package/src/core/hooks/cli.ts +351 -466
  564. package/src/core/hooks/effects/image-capture.ts +228 -238
  565. package/src/core/hooks/effects/index.ts +1 -36
  566. package/src/core/hooks/events/input-hash.ts +47 -0
  567. package/src/core/hooks/index.ts +4 -11
  568. package/src/core/hooks/resolve/coord-root.ts +1 -1
  569. package/src/core/hooks/resolve/owner.ts +52 -45
  570. package/src/core/hooks/resolve/transcript.ts +165 -14
  571. package/src/core/hooks/session-name-presence.ts +14 -15
  572. package/src/core/hooks/unsafe-cross-shell.ts +1 -1
  573. package/src/core/journal/index.ts +15 -22
  574. package/src/core/presence/blob.ts +48 -41
  575. package/src/core/presence/codec-digest.ts +215 -0
  576. package/src/core/presence/relay-client.ts +5 -5
  577. package/src/core/work/index.ts +3 -0
  578. package/src/core/work/read.ts +3 -0
  579. package/src/core/work/runner.ts +6 -0
  580. package/src/core/work/state.ts +27 -3
  581. package/src/core/workflow/engine.ts +24 -24
  582. package/src/core/workflow/live-session-v3.ts +126 -0
  583. package/src/core/workflow/scope-id.ts +6 -0
  584. package/src/core/workflow/workspaces/leases.ts +56 -19
  585. package/src/index.ts +1 -1
  586. package/src/lib/browser/client.ts +230 -0
  587. package/src/lib/browser/critique.ts +104 -27
  588. package/src/lib/browser/geometry.ts +143 -14
  589. package/src/lib/browser/index.ts +34 -0
  590. package/src/lib/browser/qa-plan.ts +501 -0
  591. package/src/lib/browser/qa-reuse.ts +306 -0
  592. package/src/lib/browser/qa-snapshot.ts +223 -0
  593. package/src/lib/browser/runts.ts +27 -2
  594. package/src/lib/browser/tiling.ts +164 -0
  595. package/src/lib/claude-desktop.ts +1 -232
  596. package/src/lib/context/index.ts +22 -46
  597. package/src/lib/council/index.ts +9 -21
  598. package/src/lib/docs-frontmatter.ts +8 -79
  599. package/src/lib/docs-index.ts +33 -3
  600. package/src/lib/docs-lint.ts +15 -29
  601. package/src/lib/docs-metadata-audit.ts +166 -0
  602. package/src/lib/docs-metadata-managed.ts +83 -0
  603. package/src/lib/docs-metadata-sync.ts +262 -0
  604. package/src/lib/docs-metadata-v2-schema.ts +138 -0
  605. package/src/lib/docs-metadata-v2.ts +646 -0
  606. package/src/lib/docs-new.ts +63 -0
  607. package/src/lib/docs-sweep.ts +42 -28
  608. package/src/lib/headless/index.ts +287 -0
  609. package/src/lib/identities/assume.ts +67 -86
  610. package/src/lib/instructions/apply.ts +33 -20
  611. package/src/lib/instructions/bundle.ts +2 -2
  612. package/src/lib/instructions/splice.ts +21 -7
  613. package/src/lib/instructions/templates.ts +85 -13
  614. package/dist/core/agents/cli-emit.d.ts +0 -27
  615. package/dist/core/agents/cli-emit.d.ts.map +0 -1
  616. package/dist/core/agents/cli-emit.js +0 -57
  617. package/dist/core/agents/codex-replay.d.ts +0 -29
  618. package/dist/core/agents/codex-replay.d.ts.map +0 -1
  619. package/dist/core/agents/codex-replay.js +0 -138
  620. package/dist/core/agents/events/consume.d.ts +0 -82
  621. package/dist/core/agents/events/consume.d.ts.map +0 -1
  622. package/dist/core/agents/events/consume.js +0 -195
  623. package/dist/core/agents/events/emit.d.ts +0 -42
  624. package/dist/core/agents/events/emit.d.ts.map +0 -1
  625. package/dist/core/agents/events/emit.js +0 -75
  626. package/dist/core/agents/events/ulid.d.ts +0 -11
  627. package/dist/core/agents/events/ulid.d.ts.map +0 -1
  628. package/dist/core/agents/events/ulid.js +0 -47
  629. package/dist/core/agents/state/heartbeat-projector.d.ts +0 -76
  630. package/dist/core/agents/state/heartbeat-projector.d.ts.map +0 -1
  631. package/dist/core/agents/state/heartbeat-projector.js +0 -581
  632. package/dist/core/hooks/events/emit.d.ts +0 -31
  633. package/dist/core/hooks/events/emit.d.ts.map +0 -1
  634. package/dist/core/hooks/events/emit.js +0 -93
  635. package/dist/core/hooks/events/rotate.d.ts +0 -43
  636. package/dist/core/hooks/events/rotate.d.ts.map +0 -1
  637. package/dist/core/hooks/events/rotate.js +0 -142
  638. package/dist/core/hooks/events/schema.d.ts +0 -341
  639. package/dist/core/hooks/events/schema.d.ts.map +0 -1
  640. package/dist/core/hooks/events/schema.js +0 -12
  641. package/dist/core/hooks/events/ulid.d.ts +0 -10
  642. package/dist/core/hooks/events/ulid.d.ts.map +0 -1
  643. package/dist/core/hooks/events/ulid.js +0 -47
  644. package/dist/lib/docs-frontmatter-migrate.d.ts +0 -33
  645. package/dist/lib/docs-frontmatter-migrate.d.ts.map +0 -1
  646. package/dist/lib/docs-frontmatter-migrate.js +0 -364
  647. package/src/core/agents/cli-emit.ts +0 -64
  648. package/src/core/agents/codex-replay.ts +0 -163
  649. package/src/core/agents/events/consume.ts +0 -254
  650. package/src/core/agents/events/emit.ts +0 -115
  651. package/src/core/agents/events/ulid.ts +0 -51
  652. package/src/core/agents/state/heartbeat-projector.ts +0 -645
  653. package/src/core/hooks/events/emit.ts +0 -125
  654. package/src/core/hooks/events/rotate.ts +0 -151
  655. package/src/core/hooks/events/schema.ts +0 -582
  656. package/src/core/hooks/events/ulid.ts +0 -51
  657. package/src/lib/docs-frontmatter-migrate.ts +0 -427
@@ -18,6 +18,7 @@
18
18
  // orchestration live here; the model call lives in the host.
19
19
 
20
20
  import { PNG } from "pngjs";
21
+ import { bandOversizedRect, snappedBandRects, type VisualAtom } from "./tiling.js";
21
22
 
22
23
  export interface CritiqueTile {
23
24
  index: number;
@@ -25,6 +26,9 @@ export interface CritiqueTile {
25
26
  label: string;
26
27
  /** Document-space Y offset of the tile's top, so findings map to a place. */
27
28
  scrollY: number;
29
+ /** Document-space X offset (0 for full-width bands; element-relative for
30
+ * selector tiles). Optional for backward compatibility — treat absent as 0. */
31
+ x?: number;
28
32
  width: number;
29
33
  height: number;
30
34
  /** Base64 PNG of the tile (no data: prefix). */
@@ -48,18 +52,32 @@ export interface CritiqueResult {
48
52
  outcome: "pass" | "fail" | "skipped";
49
53
  /** Set when skipped or a provider call failed. */
50
54
  error?: string;
55
+ /** Host-reported provider provenance (route, attempts, fallbacks, usage). */
56
+ provider_meta?: Record<string, unknown>;
51
57
  }
52
58
 
53
59
  /**
54
60
  * The host-injected model call. Given one tile and the rubric, return the
55
61
  * findings for that tile. Throwing is caught and surfaced as an error finding
56
62
  * so one bad tile never sinks the run.
63
+ *
64
+ * Optional properties let the host shape execution without widening the call
65
+ * contract: `concurrency` caps how many tiles run at once (default 4 — tiles
66
+ * are independent, and the wall-clock win is roughly the cap factor), and
67
+ * `meta()` is read once after the run so route/usage provenance lands on the
68
+ * result envelope.
57
69
  */
58
- export type CritiqueProvider = (input: {
70
+ export type CritiqueProvider = ((input: {
59
71
  url: string;
60
72
  rubric: string;
61
73
  tile: CritiqueTile;
62
- }) => Promise<CritiqueFinding[]>;
74
+ }) => Promise<CritiqueFinding[]>) & {
75
+ concurrency?: number;
76
+ meta?: () => Record<string, unknown> | undefined;
77
+ /** Long-edge pixel budget of the routed model's vision input. The tiler
78
+ * clamps band height to it so tiles are never downscaled by the provider. */
79
+ tileBudgetPx?: number;
80
+ };
63
81
 
64
82
  export const DEFAULT_CRITIQUE_RUBRIC = [
65
83
  "You are reviewing one vertical slice of a rendered web page for visual defects.",
@@ -70,6 +88,10 @@ export const DEFAULT_CRITIQUE_RUBRIC = [
70
88
  "- broken, distorted, or missing images",
71
89
  "- leaked template tokens, placeholder text, or obviously wrong values",
72
90
  "- anything that looks broken, unfinished, or accidental",
91
+ "The slice's own top and bottom edges cut through the page at arbitrary points:",
92
+ "content cropped by the slice boundary itself (a heading, row, or paragraph",
93
+ "entering or leaving the frame) is a tiling artifact, NOT a defect - never report it.",
94
+ "Only report clipping that happens at an element's own container edge inside the slice.",
73
95
  "Do NOT comment on content quality, wording, tone, or subjective taste.",
74
96
  "If the slice looks fine, return an empty list. Be precise and terse.",
75
97
  "Return JSON only: an array of objects",
@@ -108,6 +130,13 @@ export function bandRects(
108
130
  * resolution. Pass `elementRects` for semantic (per-element) tiling; otherwise
109
131
  * the page is banded from the actual image height. Rects are clamped to the
110
132
  * image so an off-by-one never throws.
133
+ *
134
+ * When `atoms` are supplied (see tiling.ts), band seams snap into content
135
+ * gaps instead of cutting at fixed offsets, and element rects taller than the
136
+ * band budget are banded internally rather than shipped as one over-tall tile
137
+ * the provider would downscale. Atom coordinates must be in the same pixel
138
+ * space as the screenshot (identical at deviceScaleFactor 1; scale them if
139
+ * the capture DPR differs).
111
140
  */
112
141
  export function tilesFromFullPage(
113
142
  fullPageBuffer: Buffer,
@@ -116,20 +145,46 @@ export function tilesFromFullPage(
116
145
  bandHeight?: number;
117
146
  overlap?: number;
118
147
  maxTiles: number;
148
+ atoms?: VisualAtom[];
119
149
  },
120
150
  ): CritiqueTile[] {
121
151
  const png = PNG.sync.read(fullPageBuffer);
122
- const rects =
123
- opts.elementRects && opts.elementRects.length > 0
124
- ? opts.elementRects.map((r, index) => ({ index, ...r }))
125
- : bandRects(png.height, png.width, opts.bandHeight ?? 1400, opts.overlap ?? 120).map((b) => ({
126
- index: b.index,
127
- label: `band ${b.index + 1}`,
128
- x: b.x,
129
- y: b.y,
130
- width: b.width,
131
- height: b.height,
132
- }));
152
+ const snapOpts = {
153
+ bandHeight: opts.bandHeight ?? 1400,
154
+ overlap: opts.overlap ?? 120,
155
+ };
156
+ let rects: Array<{
157
+ index: number;
158
+ label: string;
159
+ x: number;
160
+ y: number;
161
+ width: number;
162
+ height: number;
163
+ }>;
164
+ if (opts.elementRects && opts.elementRects.length > 0) {
165
+ const expanded = opts.atoms
166
+ ? opts.elementRects.flatMap((r) => bandOversizedRect(r, opts.atoms ?? [], snapOpts))
167
+ : opts.elementRects;
168
+ rects = expanded.map((r, index) => ({ index, ...r }));
169
+ } else if (opts.atoms && opts.atoms.length > 0) {
170
+ rects = snappedBandRects(0, png.height, 0, png.width, opts.atoms, snapOpts).rects.map((b) => ({
171
+ index: b.index,
172
+ label: `band ${b.index + 1}`,
173
+ x: b.x,
174
+ y: b.y,
175
+ width: b.width,
176
+ height: b.height,
177
+ }));
178
+ } else {
179
+ rects = bandRects(png.height, png.width, snapOpts.bandHeight, snapOpts.overlap).map((b) => ({
180
+ index: b.index,
181
+ label: `band ${b.index + 1}`,
182
+ x: b.x,
183
+ y: b.y,
184
+ width: b.width,
185
+ height: b.height,
186
+ }));
187
+ }
133
188
  const tiles: CritiqueTile[] = [];
134
189
  for (const rect of rects.slice(0, opts.maxTiles)) {
135
190
  const sx = Math.max(0, Math.min(Math.round(rect.x), png.width - 1));
@@ -148,6 +203,7 @@ export function tilesFromFullPage(
148
203
  index: rect.index,
149
204
  label: rect.label,
150
205
  scrollY: sy,
206
+ x: sx,
151
207
  width: w,
152
208
  height: h,
153
209
  pngBase64: PNG.sync.write(dst).toString("base64"),
@@ -212,20 +268,41 @@ export async function runCritique(args: {
212
268
  "no critiqueProvider injected by the host (see HarneryProgramContext.critiqueProvider)",
213
269
  };
214
270
  }
215
- const findings: CritiqueFinding[] = [];
216
- for (const tile of tiles) {
217
- try {
218
- const tileFindings = await provider({ url, rubric, tile });
219
- findings.push(...tileFindings.map((f) => ({ ...f, tile: tile.index })));
220
- } catch (err: unknown) {
221
- findings.push({
222
- tile: tile.index,
223
- severity: "high",
224
- category: "provider-error",
225
- description: `critique provider failed on ${tile.label}: ${err instanceof Error ? err.message : String(err)}`,
226
- });
271
+ // Tiles are judged independently, so run them concurrently (bounded) and
272
+ // reassemble findings in tile order so artifacts stay deterministic.
273
+ const concurrency = Math.max(1, Math.min(provider.concurrency ?? 4, tiles.length || 1));
274
+ const perTile: CritiqueFinding[][] = tiles.map(() => []);
275
+ let cursor = 0;
276
+ const worker = async (): Promise<void> => {
277
+ while (true) {
278
+ const i = cursor++;
279
+ if (i >= tiles.length) return;
280
+ const tile = tiles[i];
281
+ try {
282
+ const tileFindings = await provider({ url, rubric, tile });
283
+ perTile[i] = tileFindings.map((f) => ({ ...f, tile: tile.index }));
284
+ } catch (err: unknown) {
285
+ perTile[i] = [
286
+ {
287
+ tile: tile.index,
288
+ severity: "high",
289
+ category: "provider-error",
290
+ description: `critique provider failed on ${tile.label}: ${err instanceof Error ? err.message : String(err)}`,
291
+ },
292
+ ];
293
+ }
227
294
  }
228
- }
295
+ };
296
+ await Promise.all(Array.from({ length: concurrency }, () => worker()));
297
+ const findings = perTile.flat();
229
298
  const outcome = findings.some((f) => f.severity === "high") ? "fail" : "pass";
230
- return { rule: "critique", tiles: tiles.length, provider: true, findings, outcome };
299
+ const meta = provider.meta?.();
300
+ return {
301
+ rule: "critique",
302
+ tiles: tiles.length,
303
+ provider: true,
304
+ findings,
305
+ outcome,
306
+ ...(meta ? { provider_meta: meta } : {}),
307
+ };
231
308
  }
@@ -24,7 +24,13 @@ export interface LayoutElementMeasurement {
24
24
  export interface LayoutExclusion {
25
25
  index: number;
26
26
  tag: string;
27
- reason: "hidden" | "zero-area" | "out-of-flow" | "limit";
27
+ reason:
28
+ | "hidden"
29
+ | "zero-area"
30
+ | "out-of-flow"
31
+ | "limit"
32
+ | "visually-hidden"
33
+ | "ellipsis-truncation";
28
34
  }
29
35
 
30
36
  export interface AlignChild extends LayoutElementMeasurement {
@@ -507,6 +513,53 @@ export function buildLayoutLintCheck(): (request: LayoutLintRequest) => LayoutLi
507
513
  return { x: clips.has(style.overflowX), y: clips.has(style.overflowY) };
508
514
  };
509
515
 
516
+ // The visually-hidden idiom (Tailwind `sr-only`, Bootstrap
517
+ // `visually-hidden`): a ~1px absolutely-positioned box whose content is
518
+ // clipped ON PURPOSE so it exists for assistive tech only. Its box is 1x1
519
+ // (not zero-area, so the zero-area exclusion misses it) and the legacy
520
+ // `clip: rect(0,0,0,0)` it relies on is not an overflow style, so nothing
521
+ // above recognizes it. Reporting it would flag every accessible page.
522
+ const isVisuallyHidden = (element: Element): boolean => {
523
+ const style = getComputedStyle(element);
524
+ if (style.position !== "absolute" && style.position !== "fixed") return false;
525
+ if (style.clip && style.clip !== "auto") return true;
526
+ const rect = element.getBoundingClientRect();
527
+ return rect.width <= 1 && rect.height <= 1 && style.overflow === "hidden";
528
+ };
529
+
530
+ const hasVisuallyHiddenAncestor = (start: Element | null, scope: Element): boolean => {
531
+ let current = start;
532
+ while (current && scope.contains(current)) {
533
+ if (isVisuallyHidden(current)) return true;
534
+ if (current === scope) break;
535
+ current = current.parentElement;
536
+ }
537
+ return false;
538
+ };
539
+
540
+ // Deliberate single-line truncation (`text-overflow: ellipsis` + nowrap +
541
+ // hidden overflow, the `truncate` utility): cutting the text is the
542
+ // design, and the dedicated truncation check owns auditing it. Only text
543
+ // under such an ancestor is exempt; element boxes still have to fit.
544
+ const ellipsizes = (element: Element): boolean => {
545
+ const style = getComputedStyle(element);
546
+ return (
547
+ style.textOverflow === "ellipsis" &&
548
+ style.whiteSpace === "nowrap" &&
549
+ (style.overflowX === "hidden" || style.overflowX === "clip")
550
+ );
551
+ };
552
+
553
+ const hasEllipsizingAncestor = (start: Element | null, scope: Element): boolean => {
554
+ let current = start;
555
+ while (current && scope.contains(current)) {
556
+ if (ellipsizes(current)) return true;
557
+ if (current === scope) break;
558
+ current = current.parentElement;
559
+ }
560
+ return false;
561
+ };
562
+
510
563
  // A scroller hides content the same way a clip does, but the reader can
511
564
  // reach it. Content below the fold of a capped table or right of a wide
512
565
  // code block is not a layout defect, so an axis stops being checked at the
@@ -519,6 +572,20 @@ export function buildLayoutLintCheck(): (request: LayoutLintRequest) => LayoutLi
519
572
  return { x: scrolls.has(style.overflowX), y: scrolls.has(style.overflowY) };
520
573
  };
521
574
 
575
+ const scrollsBeforeScope = (
576
+ start: Element | null,
577
+ scope: Element,
578
+ axis: "x" | "y",
579
+ ): boolean => {
580
+ let current = start;
581
+ while (current && scope.contains(current)) {
582
+ if (scrollingStyle(current)[axis]) return true;
583
+ if (current === scope) break;
584
+ current = current.parentElement;
585
+ }
586
+ return false;
587
+ };
588
+
522
589
  const unbounded = (): LayoutRect => ({
523
590
  x: Number.NEGATIVE_INFINITY,
524
591
  y: Number.NEGATIVE_INFINITY,
@@ -573,7 +640,7 @@ export function buildLayoutLintCheck(): (request: LayoutLintRequest) => LayoutLi
573
640
  const recordIssue = (
574
641
  element: LayoutElementMeasurement,
575
642
  allowed: LayoutRect,
576
- clippedBy: string,
643
+ clippedBy: { x: string; y: string },
577
644
  axes: { x: boolean; y: boolean } = { x: true, y: true },
578
645
  ): void => {
579
646
  const rect = element.rect;
@@ -585,7 +652,14 @@ export function buildLayoutLintCheck(): (request: LayoutLintRequest) => LayoutLi
585
652
  };
586
653
  const maxOverrunPx = Math.max(overrun.top, overrun.right, overrun.bottom, overrun.left);
587
654
  if (maxOverrunPx > tolerancePx + SUBPIXEL_EPSILON && issues.length < ISSUE_LIMIT) {
588
- issues.push({ element, clippedBy, overrun, maxOverrunPx });
655
+ const horizontalOverrun = Math.max(overrun.left, overrun.right);
656
+ const verticalOverrun = Math.max(overrun.top, overrun.bottom);
657
+ issues.push({
658
+ element,
659
+ clippedBy: horizontalOverrun >= verticalOverrun ? clippedBy.x : clippedBy.y,
660
+ overrun,
661
+ maxOverrunPx,
662
+ });
589
663
  }
590
664
  };
591
665
 
@@ -599,9 +673,9 @@ export function buildLayoutLintCheck(): (request: LayoutLintRequest) => LayoutLi
599
673
  container: Element,
600
674
  seed: LayoutRect,
601
675
  seedLabel: string,
602
- ): { allowed: LayoutRect; clippedBy: string } => {
676
+ ): { allowed: LayoutRect; clippedBy: { x: string; y: string } } => {
603
677
  let allowed = { ...seed };
604
- let clippedBy = seedLabel;
678
+ const clippedBy = { x: seedLabel, y: seedLabel };
605
679
  const free = { x: false, y: false };
606
680
  let current: Element | null = start;
607
681
  while (current && container.contains(current)) {
@@ -622,6 +696,14 @@ export function buildLayoutLintCheck(): (request: LayoutLintRequest) => LayoutLi
622
696
  };
623
697
  if (clips.x || clips.y) {
624
698
  const candidate = paddingRect(current);
699
+ const tightensX =
700
+ clips.x &&
701
+ (candidate.left > allowed.left + SUBPIXEL_EPSILON ||
702
+ candidate.right < allowed.right - SUBPIXEL_EPSILON);
703
+ const tightensY =
704
+ clips.y &&
705
+ (candidate.top > allowed.top + SUBPIXEL_EPSILON ||
706
+ candidate.bottom < allowed.bottom - SUBPIXEL_EPSILON);
625
707
  allowed = {
626
708
  x: clips.x ? Math.max(allowed.left, candidate.left) : allowed.left,
627
709
  y: clips.y ? Math.max(allowed.top, candidate.top) : allowed.top,
@@ -634,7 +716,11 @@ export function buildLayoutLintCheck(): (request: LayoutLintRequest) => LayoutLi
634
716
  };
635
717
  allowed.width = Math.max(0, allowed.right - allowed.left);
636
718
  allowed.height = Math.max(0, allowed.bottom - allowed.top);
637
- clippedBy = labelOf(current);
719
+ // Keep the label of the boundary that actually made each axis
720
+ // smaller. A wider outer scope should not hide the nearer parent
721
+ // responsible for a horizontal overrun.
722
+ if (tightensX) clippedBy.x = labelOf(current);
723
+ if (tightensY) clippedBy.y = labelOf(current);
638
724
  }
639
725
  if (scrolls.x) free.x = true;
640
726
  if (scrolls.y) free.y = true;
@@ -644,7 +730,7 @@ export function buildLayoutLintCheck(): (request: LayoutLintRequest) => LayoutLi
644
730
  return { allowed, clippedBy };
645
731
  };
646
732
 
647
- const textContainer = (node: Node, scope: Element): Element | null => {
733
+ const nearestBlockOwner = (node: Node, scope: Element): Element | null => {
648
734
  let current = node.parentElement;
649
735
  while (current && scope.contains(current)) {
650
736
  if (current instanceof SVGElement) return null;
@@ -665,17 +751,38 @@ export function buildLayoutLintCheck(): (request: LayoutLintRequest) => LayoutLi
665
751
  excluded.push({ index, tag: element.tagName.toLowerCase(), reason: "hidden" });
666
752
  return;
667
753
  }
754
+ if (hasVisuallyHiddenAncestor(element, container)) {
755
+ excluded.push({ index, tag: element.tagName.toLowerCase(), reason: "visually-hidden" });
756
+ return;
757
+ }
668
758
  const rect = element.getBoundingClientRect();
669
759
  if (rect.width <= 0 || rect.height <= 0) {
670
760
  excluded.push({ index, tag: element.tagName.toLowerCase(), reason: "zero-area" });
671
761
  return;
672
762
  }
673
- const chain = clipChain(
674
- element.parentElement,
675
- container,
676
- unbounded(),
677
- labelOf(container),
678
- );
763
+ // CSS overflow defaults to visible, so a child can escape a grid or
764
+ // flex cell without any clipping ancestor noticing. Constrain
765
+ // in-flow boxes horizontally to their nearest block owner. Vertical
766
+ // parent containment is intentionally left to real CSS clips because
767
+ // normal margin collapse can paint outside a parent's vertical box.
768
+ const owner = nearestBlockOwner(element, container);
769
+ const seed = unbounded();
770
+ let seedLabel = labelOf(container);
771
+ const position = getComputedStyle(element).position;
772
+ if (
773
+ owner &&
774
+ position !== "absolute" &&
775
+ position !== "fixed" &&
776
+ !scrollsBeforeScope(owner, container, "x")
777
+ ) {
778
+ const ownerRect = paddingRect(owner);
779
+ seed.left = ownerRect.left;
780
+ seed.right = ownerRect.right;
781
+ seed.x = seed.left;
782
+ seed.width = Math.max(0, seed.right - seed.left);
783
+ seedLabel = labelOf(owner);
784
+ }
785
+ const chain = clipChain(element.parentElement, container, seed, seedLabel);
679
786
  recordIssue(measure(element, index, false), chain.allowed, chain.clippedBy);
680
787
  });
681
788
 
@@ -696,8 +803,24 @@ export function buildLayoutLintCheck(): (request: LayoutLintRequest) => LayoutLi
696
803
  ) {
697
804
  continue;
698
805
  }
699
- const owner = textContainer(node, container);
806
+ const owner = nearestBlockOwner(node, container);
700
807
  if (!owner) continue;
808
+ if (hasVisuallyHiddenAncestor(parent, container)) {
809
+ excluded.push({
810
+ index: measurementIndex++,
811
+ tag: parent.tagName.toLowerCase(),
812
+ reason: "visually-hidden",
813
+ });
814
+ continue;
815
+ }
816
+ if (hasEllipsizingAncestor(parent, container)) {
817
+ excluded.push({
818
+ index: measurementIndex++,
819
+ tag: parent.tagName.toLowerCase(),
820
+ reason: "ellipsis-truncation",
821
+ });
822
+ continue;
823
+ }
701
824
  let transformed = false;
702
825
  let current: Element | null = owner;
703
826
  while (current && container.contains(current)) {
@@ -856,6 +979,11 @@ export function buildLayoutLintCheck(): (request: LayoutLintRequest) => LayoutLi
856
979
  "COL",
857
980
  "COLGROUP",
858
981
  ]);
982
+ // Code-family chips are inline controls, not layout cards, but the
983
+ // radius-vs-size pill test misses them (a code chip's radius is modest)
984
+ // and a flex/grid tag row blockifies their computed display, defeating
985
+ // the inline-display exclusion. Exclude them by tag.
986
+ const CONTROL_TAGS = new Set(["CODE", "KBD", "SAMP", "VAR", "OUTPUT"]);
859
987
 
860
988
  const maxCornerRadiusPx = (style: CSSStyleDeclaration, minDim: number): number => {
861
989
  const corners = [
@@ -877,6 +1005,7 @@ export function buildLayoutLintCheck(): (request: LayoutLintRequest) => LayoutLi
877
1005
 
878
1006
  const isPanel = (element: Element): boolean => {
879
1007
  if (STRUCTURAL_TAGS.has(element.tagName)) return false;
1008
+ if (CONTROL_TAGS.has(element.tagName)) return false;
880
1009
  const style = getComputedStyle(element);
881
1010
  if (style.display.startsWith("table") || style.display.startsWith("inline")) return false;
882
1011
  if (style.boxShadow && style.boxShadow !== "none") return true;
@@ -93,6 +93,32 @@ export {
93
93
  extractObservedIp,
94
94
  WEBRTC_PROXY_ONLY_ARG,
95
95
  } from "./proxy.js";
96
+ export {
97
+ buildQaManifest,
98
+ type ChangeClass,
99
+ type ClassifyOptions,
100
+ classifySignatures,
101
+ fnv1a32,
102
+ type ManifestOptions,
103
+ type QaClassification,
104
+ type QaContext,
105
+ type QaManifest,
106
+ type QaNodeSignature,
107
+ type QaScope,
108
+ type QaSignature,
109
+ type QaStylesheetSignature,
110
+ } from "./qa-plan.js";
111
+ export {
112
+ listQaSnapshotTargets,
113
+ loadQaSnapshot,
114
+ QA_SNAPSHOT_DIR,
115
+ type QaSnapshotStoreOptions,
116
+ qaSnapshotKey,
117
+ type ResolvedQaBaseline,
118
+ resolveQaBaseline,
119
+ type StoredQaSnapshot,
120
+ saveQaSnapshot,
121
+ } from "./qa-snapshot.js";
96
122
  export type {
97
123
  RuntHit,
98
124
  RuntsResult,
@@ -120,6 +146,14 @@ export type {
120
146
  TargetSizeProfile,
121
147
  TargetSizeResult,
122
148
  } from "./target-size.js";
149
+ export {
150
+ bandOversizedRect,
151
+ cutCost,
152
+ type SnapOptions,
153
+ type SnapSeam,
154
+ snappedBandRects,
155
+ type VisualAtom,
156
+ } from "./tiling.js";
123
157
  export type {
124
158
  CheckVisibilityOptions,
125
159
  VisibilityResult,