pi-daddy 0.22.0 → 0.24.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 (385) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +12 -6
  3. package/contracts/daily-view/v1/README.md +114 -0
  4. package/contracts/daily-view/v1/fixtures/view.json +525 -0
  5. package/contracts/daily-view/v1/fixtures/view.txt +75 -0
  6. package/contracts/daily-view/v1/fixtures/work.jsonl +17 -0
  7. package/contracts/daily-view/v1/p03/README.md +26 -0
  8. package/contracts/daily-view/v1/p03/fixtures/retained-executions.json +241 -0
  9. package/contracts/daily-view/v1/p03/projection.schema.json +194 -0
  10. package/contracts/daily-view/v1/p03/provenance.json +21 -0
  11. package/contracts/dashboard-host/v1/README.md +176 -0
  12. package/contracts/debrief/v1/README.md +146 -0
  13. package/contracts/debrief/v1/intervention/README.md +32 -0
  14. package/contracts/debrief/v1/intervention/fixtures/artifact-3ee11136beb864f518252e5024dae9197421fbf97b6e981d3243c782b5c44bd0.txt +1 -0
  15. package/contracts/debrief/v1/intervention/fixtures/artifact-58905d872dd3c54a9705f67b05fa82edbad7af6476ae8993faf1a7b9fadfb905.txt +1 -0
  16. package/contracts/debrief/v1/intervention/fixtures/assessment.json +29 -0
  17. package/contracts/debrief/v1/intervention/fixtures/blind-view.json +20 -0
  18. package/contracts/debrief/v1/intervention/fixtures/choice.json +7 -0
  19. package/contracts/debrief/v1/intervention/fixtures/manifest.json +57 -0
  20. package/contracts/debrief/v1/intervention/fixtures/reveal.json +39 -0
  21. package/contracts/debrief/v1/provenance.json +89 -0
  22. package/contracts/debrief/v1/work-capture/README.md +38 -0
  23. package/contracts/debrief/v1/work-capture/fixtures/batch.json +17 -0
  24. package/contracts/debrief/v1/work-capture/fixtures/cases.json +184 -0
  25. package/contracts/debrief/v1/work-capture/fixtures/review.json +184 -0
  26. package/contracts/debrief/v1/work-capture/review-request.schema.json +41 -0
  27. package/contracts/debrief/v1/work-capture/work-case.schema.json +190 -0
  28. package/contracts/debrief/v2/README.md +71 -0
  29. package/contracts/debrief/v2/input-pin.json +66 -0
  30. package/contracts/debrief/v2/intervention-upstream.md +40 -0
  31. package/contracts/debrief/v2/work-signals-upstream.md +22 -0
  32. package/contracts/dispatch-control/v1/README.md +109 -0
  33. package/contracts/dispatch-control/v1/request.schema.json +19 -0
  34. package/contracts/effect-profile/v1/README.md +124 -0
  35. package/contracts/execution-retention/v1/README.md +109 -0
  36. package/contracts/execution-retention/v2/README.md +148 -0
  37. package/contracts/execution-retention/v2/fixtures/interrupted-native-bytes.json +91 -0
  38. package/contracts/execution-retention/v2/fixtures/missing-native-session.json +91 -0
  39. package/contracts/execution-retention/v2/fixtures/native-file-unknown-branch.json +91 -0
  40. package/contracts/execution-retention/v2/fixtures/native-id-without-bytes.json +91 -0
  41. package/contracts/execution-retention/v2/fixtures/native-live-branch.json +90 -0
  42. package/contracts/execution-retention/v2/fixtures/replaced-native-session.json +92 -0
  43. package/contracts/execution-retention/v2/fixtures/result-82c620cdfeb8ca6b858cf653d7f5e2eedca5315d6244216d60e8b36f03223d6a.bin +1 -0
  44. package/contracts/execution-retention/v2/fixtures/session-2ec1f134bc739984434f7fca689e1c3d1c39fce2dcadae709e9b6faedfcc4ac7.bin +3 -0
  45. package/contracts/execution-retention/v2/fixtures/session-9bdb4bd16a901da31580acf056bda525225259e15ec409e0410480109011772f.bin +3 -0
  46. package/contracts/execution-retention/v2/manifest.schema.json +858 -0
  47. package/contracts/experiment/v1/README.md +164 -0
  48. package/contracts/factory-order/v1/README.md +151 -0
  49. package/contracts/factory-order/v1/adoption-pin.json +8 -0
  50. package/contracts/intent-control/v1/README.md +135 -0
  51. package/contracts/intent-control/v1/request.schema.json +1096 -0
  52. package/contracts/intent-control/v2/README.md +34 -0
  53. package/contracts/intent-control/v2/request.schema.json +1070 -0
  54. package/contracts/ledger/v4/README.md +241 -0
  55. package/contracts/ledger/v4/fixtures/layout-options.json +428 -0
  56. package/contracts/ledger/v4/fixtures/work-acceptance.json +57 -0
  57. package/contracts/ledger/v4/fixtures/work-occurrence.json +44 -0
  58. package/contracts/ledger/v4/fixtures/work-revision.json +26 -0
  59. package/contracts/ledger/v4/fixtures/work-snapshot.json +73 -0
  60. package/contracts/ledger/v4/ledger-event.schema.json +162 -0
  61. package/contracts/ordinary-control/v1/README.md +59 -0
  62. package/contracts/producer-ipc/v1/README.md +137 -0
  63. package/dist/check-runner.d.ts +5 -0
  64. package/dist/check-runner.d.ts.map +1 -1
  65. package/dist/check-runner.js +16 -2
  66. package/dist/check-runner.js.map +1 -1
  67. package/dist/cli.d.ts +3 -1
  68. package/dist/cli.d.ts.map +1 -1
  69. package/dist/cli.js +49 -3
  70. package/dist/cli.js.map +1 -1
  71. package/dist/control-journal.d.ts +20 -0
  72. package/dist/control-journal.d.ts.map +1 -0
  73. package/dist/control-journal.js +73 -0
  74. package/dist/control-journal.js.map +1 -0
  75. package/dist/daily-dashboard-host.d.ts +99 -0
  76. package/dist/daily-dashboard-host.d.ts.map +1 -0
  77. package/dist/daily-dashboard-host.js +71 -0
  78. package/dist/daily-dashboard-host.js.map +1 -0
  79. package/dist/daily-view-input.d.ts +44 -0
  80. package/dist/daily-view-input.d.ts.map +1 -0
  81. package/dist/daily-view-input.js +68 -0
  82. package/dist/daily-view-input.js.map +1 -0
  83. package/dist/daily-view-render.d.ts +4 -0
  84. package/dist/daily-view-render.d.ts.map +1 -0
  85. package/dist/daily-view-render.js +41 -0
  86. package/dist/daily-view-render.js.map +1 -0
  87. package/dist/daily-view.d.ts +74 -0
  88. package/dist/daily-view.d.ts.map +1 -0
  89. package/dist/daily-view.js +170 -0
  90. package/dist/daily-view.js.map +1 -0
  91. package/dist/dashboard-cli.d.ts +26 -1
  92. package/dist/dashboard-cli.d.ts.map +1 -1
  93. package/dist/dashboard-cli.js +128 -3
  94. package/dist/dashboard-cli.js.map +1 -1
  95. package/dist/dashboard-harness.d.ts +22 -0
  96. package/dist/dashboard-harness.d.ts.map +1 -0
  97. package/dist/dashboard-harness.js +89 -0
  98. package/dist/dashboard-harness.js.map +1 -0
  99. package/dist/dashboard-herdr.d.ts.map +1 -1
  100. package/dist/dashboard-herdr.js +7 -2
  101. package/dist/dashboard-herdr.js.map +1 -1
  102. package/dist/dashboard-host-contract.d.ts +116 -0
  103. package/dist/dashboard-host-contract.d.ts.map +1 -0
  104. package/dist/dashboard-host-contract.js +14 -0
  105. package/dist/dashboard-host-contract.js.map +1 -0
  106. package/dist/dashboard-host-transport.d.ts +16 -0
  107. package/dist/dashboard-host-transport.d.ts.map +1 -0
  108. package/dist/dashboard-host-transport.js +124 -0
  109. package/dist/dashboard-host-transport.js.map +1 -0
  110. package/dist/dashboard-host.d.ts +203 -0
  111. package/dist/dashboard-host.d.ts.map +1 -0
  112. package/dist/dashboard-host.js +376 -0
  113. package/dist/dashboard-host.js.map +1 -0
  114. package/dist/dashboard-observation.d.ts +28 -0
  115. package/dist/dashboard-observation.d.ts.map +1 -0
  116. package/dist/dashboard-observation.js +86 -0
  117. package/dist/dashboard-observation.js.map +1 -0
  118. package/dist/debrief-contract.d.ts +65 -0
  119. package/dist/debrief-contract.d.ts.map +1 -0
  120. package/dist/debrief-contract.js +151 -0
  121. package/dist/debrief-contract.js.map +1 -0
  122. package/dist/debrief-fixture.d.ts +16 -0
  123. package/dist/debrief-fixture.d.ts.map +1 -0
  124. package/dist/debrief-fixture.js +41 -0
  125. package/dist/debrief-fixture.js.map +1 -0
  126. package/dist/debrief-host.d.ts +59 -0
  127. package/dist/debrief-host.d.ts.map +1 -0
  128. package/dist/debrief-host.js +49 -0
  129. package/dist/debrief-host.js.map +1 -0
  130. package/dist/debrief-render.d.ts +5 -0
  131. package/dist/debrief-render.d.ts.map +1 -0
  132. package/dist/debrief-render.js +65 -0
  133. package/dist/debrief-render.js.map +1 -0
  134. package/dist/debrief.d.ts +90 -0
  135. package/dist/debrief.d.ts.map +1 -0
  136. package/dist/debrief.js +263 -0
  137. package/dist/debrief.js.map +1 -0
  138. package/dist/delegate-types.d.ts +2 -0
  139. package/dist/delegate-types.d.ts.map +1 -1
  140. package/dist/delegate-types.js.map +1 -1
  141. package/dist/delegate.d.ts.map +1 -1
  142. package/dist/delegate.js +1 -0
  143. package/dist/delegate.js.map +1 -1
  144. package/dist/dispatch-control.d.ts +45 -0
  145. package/dist/dispatch-control.d.ts.map +1 -0
  146. package/dist/dispatch-control.js +76 -0
  147. package/dist/dispatch-control.js.map +1 -0
  148. package/dist/effect-profile-runtime.d.ts +40 -0
  149. package/dist/effect-profile-runtime.d.ts.map +1 -0
  150. package/dist/effect-profile-runtime.js +51 -0
  151. package/dist/effect-profile-runtime.js.map +1 -0
  152. package/dist/effect-profile.d.ts +40 -0
  153. package/dist/effect-profile.d.ts.map +1 -0
  154. package/dist/effect-profile.js +152 -0
  155. package/dist/effect-profile.js.map +1 -0
  156. package/dist/execution-retention.d.ts +90 -0
  157. package/dist/execution-retention.d.ts.map +1 -0
  158. package/dist/execution-retention.js +247 -0
  159. package/dist/execution-retention.js.map +1 -0
  160. package/dist/experiment-contract.d.ts +56 -0
  161. package/dist/experiment-contract.d.ts.map +1 -0
  162. package/dist/experiment-contract.js +80 -0
  163. package/dist/experiment-contract.js.map +1 -0
  164. package/dist/experiment-state.d.ts +22 -0
  165. package/dist/experiment-state.d.ts.map +1 -0
  166. package/dist/experiment-state.js +79 -0
  167. package/dist/experiment-state.js.map +1 -0
  168. package/dist/experiment-store.d.ts +30 -0
  169. package/dist/experiment-store.d.ts.map +1 -0
  170. package/dist/experiment-store.js +147 -0
  171. package/dist/experiment-store.js.map +1 -0
  172. package/dist/experiment.d.ts +65 -0
  173. package/dist/experiment.d.ts.map +1 -0
  174. package/dist/experiment.js +357 -0
  175. package/dist/experiment.js.map +1 -0
  176. package/dist/factory-contract.d.ts +79 -0
  177. package/dist/factory-contract.d.ts.map +1 -0
  178. package/dist/factory-contract.js +89 -0
  179. package/dist/factory-contract.js.map +1 -0
  180. package/dist/factory-migration.d.ts +20 -0
  181. package/dist/factory-migration.d.ts.map +1 -0
  182. package/dist/factory-migration.js +55 -0
  183. package/dist/factory-migration.js.map +1 -0
  184. package/dist/factory-order.d.ts +848 -0
  185. package/dist/factory-order.d.ts.map +1 -0
  186. package/dist/factory-order.js +83 -0
  187. package/dist/factory-order.js.map +1 -0
  188. package/dist/factory-registry.d.ts +121 -0
  189. package/dist/factory-registry.d.ts.map +1 -0
  190. package/dist/factory-registry.js +133 -0
  191. package/dist/factory-registry.js.map +1 -0
  192. package/dist/file-lock.d.ts +8 -2
  193. package/dist/file-lock.d.ts.map +1 -1
  194. package/dist/file-lock.js +78 -19
  195. package/dist/file-lock.js.map +1 -1
  196. package/dist/herdr-poll.d.ts +8 -0
  197. package/dist/herdr-poll.d.ts.map +1 -1
  198. package/dist/herdr-poll.js +23 -0
  199. package/dist/herdr-poll.js.map +1 -1
  200. package/dist/index.d.ts +20 -0
  201. package/dist/index.d.ts.map +1 -1
  202. package/dist/index.js +20 -0
  203. package/dist/index.js.map +1 -1
  204. package/dist/intent-application.d.ts +17 -0
  205. package/dist/intent-application.d.ts.map +1 -0
  206. package/dist/intent-application.js +113 -0
  207. package/dist/intent-application.js.map +1 -0
  208. package/dist/intent-control.d.ts +201 -0
  209. package/dist/intent-control.d.ts.map +1 -0
  210. package/dist/intent-control.js +110 -0
  211. package/dist/intent-control.js.map +1 -0
  212. package/dist/intent-scheduling.d.ts +9 -0
  213. package/dist/intent-scheduling.d.ts.map +1 -0
  214. package/dist/intent-scheduling.js +15 -0
  215. package/dist/intent-scheduling.js.map +1 -0
  216. package/dist/ledger-append.d.ts +15 -0
  217. package/dist/ledger-append.d.ts.map +1 -0
  218. package/dist/ledger-append.js +94 -0
  219. package/dist/ledger-append.js.map +1 -0
  220. package/dist/ledger.d.ts +11 -0
  221. package/dist/ledger.d.ts.map +1 -1
  222. package/dist/ledger.js +3 -7
  223. package/dist/ledger.js.map +1 -1
  224. package/dist/native-session-target.d.ts +9 -0
  225. package/dist/native-session-target.d.ts.map +1 -0
  226. package/dist/native-session-target.js +29 -0
  227. package/dist/native-session-target.js.map +1 -0
  228. package/dist/native-session.d.ts +59 -0
  229. package/dist/native-session.d.ts.map +1 -0
  230. package/dist/native-session.js +154 -0
  231. package/dist/native-session.js.map +1 -0
  232. package/dist/order-schedule.d.ts +37 -0
  233. package/dist/order-schedule.d.ts.map +1 -0
  234. package/dist/order-schedule.js +81 -0
  235. package/dist/order-schedule.js.map +1 -0
  236. package/dist/ordinary-children.d.ts +52 -0
  237. package/dist/ordinary-children.d.ts.map +1 -0
  238. package/dist/ordinary-children.js +93 -0
  239. package/dist/ordinary-children.js.map +1 -0
  240. package/dist/producer-ipc-contract.d.ts +29 -0
  241. package/dist/producer-ipc-contract.d.ts.map +1 -0
  242. package/dist/producer-ipc-contract.js +29 -0
  243. package/dist/producer-ipc-contract.js.map +1 -0
  244. package/dist/producer-ipc.d.ts +55 -0
  245. package/dist/producer-ipc.d.ts.map +1 -0
  246. package/dist/producer-ipc.js +143 -0
  247. package/dist/producer-ipc.js.map +1 -0
  248. package/dist/resource-budget.d.ts +334 -0
  249. package/dist/resource-budget.d.ts.map +1 -0
  250. package/dist/resource-budget.js +415 -0
  251. package/dist/resource-budget.js.map +1 -0
  252. package/dist/retention-contract.d.ts +73 -0
  253. package/dist/retention-contract.d.ts.map +1 -0
  254. package/dist/retention-contract.js +104 -0
  255. package/dist/retention-contract.js.map +1 -0
  256. package/dist/retention-json.d.ts +3 -0
  257. package/dist/retention-json.d.ts.map +1 -0
  258. package/dist/retention-json.js +32 -0
  259. package/dist/retention-json.js.map +1 -0
  260. package/dist/run-child.d.ts +4 -0
  261. package/dist/run-child.d.ts.map +1 -1
  262. package/dist/run-child.js +16 -2
  263. package/dist/run-child.js.map +1 -1
  264. package/dist/run-herdr.d.ts +6 -0
  265. package/dist/run-herdr.d.ts.map +1 -1
  266. package/dist/run-herdr.js +19 -6
  267. package/dist/run-herdr.js.map +1 -1
  268. package/dist/vendor/adoption.d.ts +129 -0
  269. package/dist/vendor/adoption.d.ts.map +1 -0
  270. package/dist/vendor/adoption.js +102 -0
  271. package/dist/vendor/adoption.js.map +1 -0
  272. package/dist/work-command.d.ts +30 -0
  273. package/dist/work-command.d.ts.map +1 -0
  274. package/dist/work-command.js +148 -0
  275. package/dist/work-command.js.map +1 -0
  276. package/dist/work-ledger-destination.d.ts +20 -0
  277. package/dist/work-ledger-destination.d.ts.map +1 -0
  278. package/dist/work-ledger-destination.js +131 -0
  279. package/dist/work-ledger-destination.js.map +1 -0
  280. package/dist/work-ledger-json.d.ts +25 -0
  281. package/dist/work-ledger-json.d.ts.map +1 -0
  282. package/dist/work-ledger-json.js +267 -0
  283. package/dist/work-ledger-json.js.map +1 -0
  284. package/dist/work-ledger-occurrences.d.ts +227 -0
  285. package/dist/work-ledger-occurrences.d.ts.map +1 -0
  286. package/dist/work-ledger-occurrences.js +115 -0
  287. package/dist/work-ledger-occurrences.js.map +1 -0
  288. package/dist/work-ledger-projection.d.ts +295 -0
  289. package/dist/work-ledger-projection.d.ts.map +1 -0
  290. package/dist/work-ledger-projection.js +237 -0
  291. package/dist/work-ledger-projection.js.map +1 -0
  292. package/dist/work-ledger-snapshot.d.ts +29 -0
  293. package/dist/work-ledger-snapshot.d.ts.map +1 -0
  294. package/dist/work-ledger-snapshot.js +267 -0
  295. package/dist/work-ledger-snapshot.js.map +1 -0
  296. package/dist/work-ledger-types.d.ts +261 -0
  297. package/dist/work-ledger-types.d.ts.map +1 -0
  298. package/dist/work-ledger-types.js +13 -0
  299. package/dist/work-ledger-types.js.map +1 -0
  300. package/dist/work-ledger-validation.d.ts +14 -0
  301. package/dist/work-ledger-validation.d.ts.map +1 -0
  302. package/dist/work-ledger-validation.js +226 -0
  303. package/dist/work-ledger-validation.js.map +1 -0
  304. package/dist/work-ledger.d.ts +43 -0
  305. package/dist/work-ledger.d.ts.map +1 -0
  306. package/dist/work-ledger.js +225 -0
  307. package/dist/work-ledger.js.map +1 -0
  308. package/extensions/daily-dashboard-session.ts +30 -0
  309. package/extensions/daily-work-session.ts +20 -0
  310. package/extensions/delegate-chain.ts +1 -0
  311. package/extensions/delegation-native.ts +12 -0
  312. package/extensions/delegation.ts +25 -11
  313. package/extensions/execute-child.ts +44 -5
  314. package/extensions/executor-session.ts +9 -0
  315. package/extensions/grants-command.ts +14 -15
  316. package/extensions/grants-connected-command.ts +19 -0
  317. package/extensions/grants.ts +26 -2
  318. package/extensions/ordinary-runtime.ts +14 -0
  319. package/extensions/primary-shadow.ts +11 -0
  320. package/extensions/run-delegation.ts +9 -7
  321. package/extensions/session.ts +10 -20
  322. package/extensions/work-runtime.ts +44 -0
  323. package/package.json +78 -4
  324. package/src/check-runner.ts +20 -2
  325. package/src/cli.ts +41 -4
  326. package/src/control-journal.ts +26 -0
  327. package/src/daily-dashboard-host.ts +49 -0
  328. package/src/daily-view-input.ts +59 -0
  329. package/src/daily-view-render.ts +44 -0
  330. package/src/daily-view.ts +152 -0
  331. package/src/dashboard-cli.ts +108 -4
  332. package/src/dashboard-harness.ts +37 -0
  333. package/src/dashboard-herdr.ts +7 -2
  334. package/src/dashboard-host-contract.ts +45 -0
  335. package/src/dashboard-host-transport.ts +40 -0
  336. package/src/dashboard-host.ts +191 -0
  337. package/src/dashboard-observation.ts +45 -0
  338. package/src/debrief-contract.ts +127 -0
  339. package/src/debrief-fixture.ts +29 -0
  340. package/src/debrief-host.ts +53 -0
  341. package/src/debrief-render.ts +49 -0
  342. package/src/debrief.ts +198 -0
  343. package/src/delegate-types.ts +2 -0
  344. package/src/delegate.ts +1 -0
  345. package/src/dispatch-control.ts +81 -0
  346. package/src/effect-profile-runtime.ts +46 -0
  347. package/src/effect-profile.ts +129 -0
  348. package/src/execution-retention.ts +230 -0
  349. package/src/experiment-contract.ts +66 -0
  350. package/src/experiment-state.ts +44 -0
  351. package/src/experiment-store.ts +98 -0
  352. package/src/experiment.ts +231 -0
  353. package/src/factory-contract.ts +47 -0
  354. package/src/factory-migration.ts +29 -0
  355. package/src/factory-order.ts +56 -0
  356. package/src/factory-registry.ts +60 -0
  357. package/src/file-lock.ts +47 -11
  358. package/src/herdr-poll.ts +18 -0
  359. package/src/index.ts +32 -0
  360. package/src/intent-application.ts +90 -0
  361. package/src/intent-control.ts +107 -0
  362. package/src/intent-scheduling.ts +14 -0
  363. package/src/ledger-append.ts +72 -0
  364. package/src/ledger.ts +3 -9
  365. package/src/native-session-target.ts +23 -0
  366. package/src/native-session.ts +139 -0
  367. package/src/order-schedule.ts +42 -0
  368. package/src/ordinary-children.ts +59 -0
  369. package/src/producer-ipc-contract.ts +26 -0
  370. package/src/producer-ipc.ts +107 -0
  371. package/src/resource-budget.ts +349 -0
  372. package/src/retention-contract.ts +84 -0
  373. package/src/retention-json.ts +20 -0
  374. package/src/run-child.ts +13 -2
  375. package/src/run-herdr.ts +11 -7
  376. package/src/vendor/adoption.ts +109 -0
  377. package/src/work-command.ts +179 -0
  378. package/src/work-ledger-destination.ts +113 -0
  379. package/src/work-ledger-json.ts +228 -0
  380. package/src/work-ledger-occurrences.ts +99 -0
  381. package/src/work-ledger-projection.ts +262 -0
  382. package/src/work-ledger-snapshot.ts +246 -0
  383. package/src/work-ledger-types.ts +229 -0
  384. package/src/work-ledger-validation.ts +174 -0
  385. package/src/work-ledger.ts +186 -0
@@ -0,0 +1,146 @@
1
+ # P08 manual debrief / label / blind view — integration contract for P10/P12/P13
2
+
3
+ Local implementation candidate, not overall acceptance or live qualification. This is the existing
4
+ pi-daddy dashboard/Herdr plugin path, not a new product. P04 read-only daily view and P05 intent controls
5
+ remain separate. Labels/choices never dispatch workers, alter grants/work acceptance, adopt a candidate
6
+ or establish causality.
7
+
8
+ ## Immutable actual inputs
9
+
10
+ `provenance.json` pins exact Git blob bytes:
11
+ - work-capture schema/review contract and seven-case/batch/review fixtures at harness
12
+ **4460af93c55aa3a52df262782cd339ad374113b8**;
13
+ - intervention manifest/assessment/public blind view/choice/reveal and actual retained synthetic artifacts at
14
+ **0475e1f5684e01992850c48aa14841751711701a**.
15
+
16
+ The vendored source documents and fixtures are unchanged. Original public zero-seed comparison fixtures
17
+ are not real blinding, live casting, authenticated human decisions or routing authority. The read path
18
+ validates closed schemas, case identities/reason-cost consistency, history digests/links and opaque artifact
19
+ membership plus actual bytes. Case/page/history callbacks must come from the genuine configured harness
20
+ owner; an arbitrary object/"author" field does not supply that provenance.
21
+
22
+ ## Existing render/action path
23
+
24
+ `dashboardFrame({cwd, debrief: presenter})` renders the actual validated presenter. `dashboardDebriefAction`
25
+ and the existing CLI's own input handler call its explicit actions. Neither uses worker prompts, terminal
26
+ transport, observer messages or P05 control APIs. `runDashboard(argv, env, {debrief: presenter})` accepts an
27
+ already configured/opened host presenter; it does **not** override a host's closed/deferred state.
28
+
29
+ For the standalone synthetic manual view:
30
+
31
+ ```sh
32
+ pi-daddy-dashboard --once --debrief-fixture --no-color
33
+ pi-daddy-dashboard --once --debrief-fixture --debrief-json
34
+ # Without --once, input belongs only to this dashboard:
35
+ # choose tie variant-... variant-...
36
+ # reveal
37
+ # close
38
+ # open
39
+ ```
40
+
41
+ `PI_DADDY_DEBRIEF_FIXTURE=1` selects that same clearly marked demo through the existing plugin-open seam and
42
+ participates in pane reuse identity. Existing plugin-open ledger/protocol prerequisites still apply; the
43
+ standalone fixture CLI does not waive those native host guards. No environment/module/file loader can inject a decision writer. CLI
44
+ fixture case labeling is **disabled**, because it has no genuine harness writer. Fixture-only blind actions
45
+ use a session-memory checkpoint and known synthetic mapping; restart persistence or real blinded study is
46
+ not claimed. The fixed first four case IDs plus one blind slot never paginate into extra questions.
47
+
48
+ Programmatic integration uses the real host API:
49
+
50
+ ```ts
51
+ const reviewer = createWorkCaseReviewer(harnessArchiveRoot, batchManifestId, verifiedOperatorIdentity);
52
+ const presenter = createDebriefPresenter({
53
+ scope: hostOwnedPresentationScope, operatorIdentity: verifiedOperatorIdentity, reviewer,
54
+ blind: genuineP12BlindPort, // optional: view/readArtifact/choose/reveal only
55
+ persistence: hostOwnedAttentionCheckpoint,
56
+ });
57
+ await presenter.open({mode:'manual', userPresent:true}); // explicit operator action, not agent_end
58
+ await runDashboard(args, env, {debrief: presenter});
59
+ ```
60
+
61
+ No second dashboard decision ledger is created. `reviewer.decide` writes only the harness-owned digest-bound
62
+ case history. P07's operator-selected capability is not a human authenticator; real identity remains the
63
+ host's responsibility. Callbacks are captured at construction, not resolved from incoming case metadata.
64
+
65
+ ## Five-slot attention budget and reopening
66
+
67
+ One `scope` must be independently bound by the host to the actual batch/operator/presentation interval, not
68
+ a pane title, file tail, repeated agent_end or a new window. The first explicit open reserves a fixed set:
69
+ **at most five total cards/questions**, not five cases plus a blind choice. A blind comparison takes one
70
+ slot, leaving four case cards. With seven incidents this leaves three unexposed/unresolved. All variants
71
+ within the one bounded blind question share its slot. Current implementation supports two to four eligible
72
+ variants, up to four retained artifacts each, 64 KiB per artifact and short marked previews.
73
+
74
+ Reservation is checkpointed and exact host readback is checked before exposure; a callback returning success
75
+ without retained matching state is not sufficient. Closing/rendering/answering/skipping never refunds slots,
76
+ advances the page or fills a vacated blind slot with another case. A host may choose `offset` for a new
77
+ explicit weekly/manual budget; it is pinned in the checkpoint and cannot change within the same scope. `budgetSpent` remains visible even while
78
+ closed; exhausted allowance defers new questions and reopens only the same slots. Missing/failed checkpoint
79
+ state is unknown, never a fresh allowance. Changed batch/blind identity refuses rather than remapping cards.
80
+ Unanswered cases remain unanswered in harness history. Skip/uncertain and unselected blind choice remain
81
+ unresolved, not agreement or a quality vote.
82
+
83
+ `DebriefPersistence` is a **host-owned attention/transport** interface:
84
+ - `durability: 'host-owned'` for the configured host, or `'fixture-memory'` only in explicit fixture mode;
85
+ - `load()` returns null only if genuinely never initialized, otherwise an exact `DebriefCheckpoint`;
86
+ - `compareAndSwap(expectedDigest, next)` must durably/atomically bind the scope and whole checkpoint before
87
+ returning. Missing/deleted/partial/rollback state, ambiguous commits and concurrent stale saves must refuse.
88
+ A host cannot report null for lost prior state and thereby mint a fresh pause budget.
89
+
90
+ The product does not install a persistence store. Its checkpoint contains fixed card IDs/public blind digest,
91
+ immutable pending review requests, quality choice and reveal-attempt state—**not authoritative case decisions**.
92
+ Case decisions are always rechecked against actual harness history, including the separately configured
93
+ operator identity for acknowledgement. The host must configure the same legitimate identity in reviewer
94
+ and presenter; missing identity disables labels, and a different author is never credited to this request. Tests use a separately configured owned
95
+ fixture-host checkpoint with the existing non-expiring lock and synced append; this is not a deployed host
96
+ service or hostile-filesystem/rollback qualification. Without a checkpoint, manual viewing is session-only
97
+ and real label/choice actions are unavailable. Reuse the same presenter to retain its session budget; a
98
+ process restart without genuine host restoration cannot claim per-pause continuity.
99
+
100
+ ## Explicit labels and unknown acknowledgement
101
+
102
+ `label({caseManifestId, priorDecisionId, disposition, note})` accepts only the real four-field P07 request and
103
+ only an exposed card. The CLI spelling is `label SLOT DISPOSITION NOTE`. The expected prior comes from the
104
+ shown snapshot, never silently advanced to overwrite a newer decision. One immutable request per card/pause
105
+ is saved before calling the genuine writer. Its replay calls history only; it never sends `decide` twice.
106
+ An exact current history record is required before displaying label-recorded. Unknown/failed/stale writer
107
+ acknowledgement is unresolved; `reconcile SLOT` reads the actual history without sending a label again.
108
+ A saved request whose writer was never reached remains unknown/unanswered; there is no blind automatic retry.
109
+ Corrections/new exposure require a separately governed host presentation, not unlimited questions this pause.
110
+
111
+ Dispositions: confirmed_defect, expected_behavior, exemplar, uncertain, skip. They are nominations/labels,
112
+ not scored-spec promotion, accepted work or agreement with a model. Render/schema success is not authority.
113
+
114
+ ## Quality before configuration/cost
115
+
116
+ Before choice, the comparison exposes only public opaque labels and verified artifact previews; blind manifest/assessment,
117
+ configuration/cost, arm IDs and filenames are not in the frame. Known A/B fixture captions are removed.
118
+ Arbitrary artifact text can still disclose identity: the UI explicitly warns rather than claiming perfect
119
+ blinding. Public fixture seeds/hashes may be independently linkable and must never be used for live blinding.
120
+
121
+ `choose({kind:'one'|'tie'|'none'|'insufficient',labels:[...]})` validates exact opaque membership, persists the
122
+ choice, then calls the actual blind interface. Reveal stays locked until that choice is acknowledged.
123
+ Choices lock once recorded by this presenter (stricter than permitting pre-reveal corrections). `reveal()`
124
+ persists the attempt before calling the private host method, validates the same choice/mapping, then displays
125
+ configuration/cost. Failed persistence reveals nothing. Reopening a new presenter with saved choice requires
126
+ an explicit same-choice confirmation against the restored blind port before reveal; the host must restore
127
+ its private seed/mapping. No new vote or changed post-reveal choice is allowed. No evaluation, causal claim,
128
+ automatic routing or adoption follows any choice.
129
+
130
+ ## Automatic/live status and remaining facts
131
+
132
+ **Automatic presentation is deliberately unqualified and deferred**, including a caller string claiming
133
+ verified-closing. There is no implemented verified suitable user closing pause/exposure-calibration-policy /
134
+ identity/durable-writer bridge. Repeated/transient agent_end, idle flags, file tails, busy work and absence
135
+ cannot authorize exposure. Busy/absent manual requests also defer. Existing host deferrals are not upgraded
136
+ by runDashboard. A <=5 page alone is not treated as proof of an attention budget.
137
+
138
+ Supported: actual existing manual render/action path, real pinned harness case writer and P12 primitive
139
+ integration in owned fixtures/programmatic ports, bounded checkpoint/reopen behavior, standalone frozen
140
+ CLI and fresh compiled plugin-command execution. Remaining: deployed genuine host writer/attention store,
141
+ verified automatic pause/policy/identity, private seed persistence, actual P12 live casting and live Herdr
142
+ qualification. Source fixture transpilation is not an installed harness package qualification.
143
+
144
+ P05 owned cancellation remains unfinished implementation work; general live steering remains unqualified.
145
+ P02/P04/P06 unsupported native/freshness/containment clauses remain. No worker messages, model/provider calls,
146
+ per-task model review, package lifecycle or publication is part of this implementation.
@@ -0,0 +1,32 @@
1
+ # Frozen intervention comparison primitives — P12 partial, P08 fixture input
2
+
3
+ This is a SEPARATE family from existing fixed-model `buildComparison`/`compare`. Their same-model/judge/input guards are unchanged. No model is launched here.
4
+
5
+ `freezeIntervention` binds an investigation digest, common scenario/rubric/fixture/held-out/harness/judge-policy inputs, mode, repetition/criterion/critical thresholds, resource metric and explicit candidate axes. Undeclared model/effort/skill/prompt/configuration changes reject. Multiple changed axes are a package intervention, not evidence of one variable's causal effect. LLM sampling is not claimed deterministic.
6
+
7
+ `assertInterventionRoles` is a pre-spend check over independently resolved HOST context. Missing roles and proposer/judge/subject canonical identity conflicts refuse. Same subjects may repeat across arms. It does not resolve providers, authenticate arbitrary context or qualify a delivery route. Do not derive qualification or expected evidence digests from incoming arm claims.
8
+
9
+ `assessIntervention` checks exact host-confirmed evidence digests and frozen input/cell policy. Delivery NOT-MEASURED/ERROR and missing/unknown/suspect cells keep the comparison incomplete; objective failure prevents judging/eligibility. Votes are retained per criterion. Actual output bytes must match per-cell/arm hashes; digests alone are missing evidence. Retained bytes are copied for later blind reads. Cheap failed arms cannot become eligible. Cheapest eligible is only a conditional measurement; routingDefault is always null and adoptionAuthorized false.
10
+
11
+ `interventionEvidenceFromResults` uses existing schema3 validation and retains complete source results/votes beside the summary. It requires recorded `source_hashes['intervention:manifest']` and `['intervention:inputs']`, matching model/mode/judge/plan, and supplied output bytes. It never stamps missing bindings onto historical runs. Multi-judge conversion is not yet supported rather than choosing a convenient panel vote. The orchestrator that records these bindings and qualifies actual execution remains integration work.
12
+
13
+ ## Blind view API
14
+
15
+ ```ts
16
+ const blind = createBlindComparison(manifest, recomputedAssessment);
17
+ const view = blind.view(); // opaque labels + artifact hashes + explicit clue limitation; no configuration/cost
18
+ const bytes = blind.readArtifact(label, artifactHash); // only retained bytes admitted to that label
19
+ blind.choose({kind:'one'|'tie'|'none'|'insufficient', labels:[/* opaque labels, or [] */]});
20
+ const revealed = blind.reveal(); // refuses before choice; different choice refuses after reveal
21
+ ```
22
+
23
+ An optional private seed supports fixtures/host-controlled restoration; real independent views need fresh private randomness, not a public fixed seed. Public view omits identity metadata, but arbitrary artifact text may reveal clues. The host must enforce user/judge identity, persist quality/seed/reveal state before exposure, and expose only the public view/read methods before choice. This in-memory API is not durable human authentication or proof a host did not leak the assessment/configuration. P08 must keep its total five-card budget and real pause/exposure boundaries.
24
+
25
+ `fixtures/` is generated by actual code from fixed synthetic evidence, retained Layout A/B bytes, fixture role identities and a public zero seed. It is NOT live qualification, real human blinding, efficacy or casting evidence. It supplies a concrete UI contract: blind-view.json before choice; choice.json; reveal.json only afterward.
26
+
27
+ Remaining P12: qualified model-backed orchestration, complete panel/durable blind workflow, verified role/receipt integration, applicable casting rows/uncertainty/revalidation and live P08 demonstration. Full acceptance and any routing/adoption default remain pending.
28
+
29
+ ```sh
30
+ node scripts/generate-intervention-fixture.mjs --check
31
+ node node_modules/vitest/vitest.mjs run packages/core/test/intervention.test.ts packages/core/test/intervention-results.test.ts packages/core/test/comparison.test.ts
32
+ ```
@@ -0,0 +1,29 @@
1
+ {
2
+ "manifestId": "a84186a1c1f272c80fe14387aeb3c8dd7242f6eacb6b76b0ef29a7343b254ffb",
3
+ "complete": true,
4
+ "arms": [
5
+ {
6
+ "armId": "a",
7
+ "state": "MEASURED",
8
+ "eligible": true,
9
+ "artifactDigests": [
10
+ "58905d872dd3c54a9705f67b05fa82edbad7af6476ae8993faf1a7b9fadfb905"
11
+ ],
12
+ "cost": 1,
13
+ "costUnit": "wall_ms"
14
+ },
15
+ {
16
+ "armId": "b",
17
+ "state": "MEASURED",
18
+ "eligible": true,
19
+ "artifactDigests": [
20
+ "3ee11136beb864f518252e5024dae9197421fbf97b6e981d3243c782b5c44bd0"
21
+ ],
22
+ "cost": 2,
23
+ "costUnit": "wall_ms"
24
+ }
25
+ ],
26
+ "cheapestEligible": "a",
27
+ "routingDefault": null,
28
+ "adoptionAuthorized": false
29
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "version": "blind-intervention-view-v1",
3
+ "cards": [
4
+ {
5
+ "label": "variant-4798fd88dc0c9767",
6
+ "artifactDigests": [
7
+ "58905d872dd3c54a9705f67b05fa82edbad7af6476ae8993faf1a7b9fadfb905"
8
+ ]
9
+ },
10
+ {
11
+ "label": "variant-5588a335bb82b8d5",
12
+ "artifactDigests": [
13
+ "3ee11136beb864f518252e5024dae9197421fbf97b6e981d3243c782b5c44bd0"
14
+ ]
15
+ }
16
+ ],
17
+ "limitations": [
18
+ "artifact-content-may-disclose-identity"
19
+ ]
20
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "kind": "tie",
3
+ "labels": [
4
+ "variant-4798fd88dc0c9767",
5
+ "variant-5588a335bb82b8d5"
6
+ ]
7
+ }
@@ -0,0 +1,57 @@
1
+ {
2
+ "arms": [
3
+ {
4
+ "configuration": {
5
+ "configuration": "35653d898fe8f4687defd9c18d0f6daaf43f2ae7d762e2c8aa3df7f1e68a3534",
6
+ "effort": "fixture",
7
+ "model": "fixture:a",
8
+ "prompt": "35653d898fe8f4687defd9c18d0f6daaf43f2ae7d762e2c8aa3df7f1e68a3534",
9
+ "skill": "35653d898fe8f4687defd9c18d0f6daaf43f2ae7d762e2c8aa3df7f1e68a3534"
10
+ },
11
+ "id": "a"
12
+ },
13
+ {
14
+ "configuration": {
15
+ "configuration": "35653d898fe8f4687defd9c18d0f6daaf43f2ae7d762e2c8aa3df7f1e68a3534",
16
+ "effort": "fixture",
17
+ "model": "fixture:b",
18
+ "prompt": "35653d898fe8f4687defd9c18d0f6daaf43f2ae7d762e2c8aa3df7f1e68a3534",
19
+ "skill": "35653d898fe8f4687defd9c18d0f6daaf43f2ae7d762e2c8aa3df7f1e68a3534"
20
+ },
21
+ "id": "b"
22
+ }
23
+ ],
24
+ "axes": [
25
+ "model"
26
+ ],
27
+ "cases": [
28
+ {
29
+ "criteria": 1,
30
+ "critical": false,
31
+ "id": "A1",
32
+ "reps": 1,
33
+ "threshold": 1
34
+ }
35
+ ],
36
+ "common": {
37
+ "fixtureSha256": "35653d898fe8f4687defd9c18d0f6daaf43f2ae7d762e2c8aa3df7f1e68a3534",
38
+ "harnessSha256": "35653d898fe8f4687defd9c18d0f6daaf43f2ae7d762e2c8aa3df7f1e68a3534",
39
+ "heldoutSha256": "35653d898fe8f4687defd9c18d0f6daaf43f2ae7d762e2c8aa3df7f1e68a3534",
40
+ "judgePolicySha256": "35653d898fe8f4687defd9c18d0f6daaf43f2ae7d762e2c8aa3df7f1e68a3534",
41
+ "mode": "force",
42
+ "rubricSha256": "35653d898fe8f4687defd9c18d0f6daaf43f2ae7d762e2c8aa3df7f1e68a3534",
43
+ "scenarioSha256": "35653d898fe8f4687defd9c18d0f6daaf43f2ae7d762e2c8aa3df7f1e68a3534"
44
+ },
45
+ "family": "intervention",
46
+ "investigationSha256": "35653d898fe8f4687defd9c18d0f6daaf43f2ae7d762e2c8aa3df7f1e68a3534",
47
+ "judge": "fixture:judge",
48
+ "proposer": "fixture:proposer",
49
+ "resourceMetric": "wall_ms",
50
+ "version": "intervention-comparison-v1",
51
+ "inputDigest": "dafb046cb29e1e8aaa3dc9bd1b8497427c69ef15228d81aaa6228c23c4fcce40",
52
+ "changedAxes": [
53
+ "model"
54
+ ],
55
+ "deterministicSampling": false,
56
+ "id": "a84186a1c1f272c80fe14387aeb3c8dd7242f6eacb6b76b0ef29a7343b254ffb"
57
+ }
@@ -0,0 +1,39 @@
1
+ {
2
+ "manifestId": "a84186a1c1f272c80fe14387aeb3c8dd7242f6eacb6b76b0ef29a7343b254ffb",
3
+ "choice": {
4
+ "kind": "tie",
5
+ "labels": [
6
+ "variant-4798fd88dc0c9767",
7
+ "variant-5588a335bb82b8d5"
8
+ ]
9
+ },
10
+ "arms": [
11
+ {
12
+ "label": "variant-4798fd88dc0c9767",
13
+ "armId": "a",
14
+ "configuration": {
15
+ "configuration": "35653d898fe8f4687defd9c18d0f6daaf43f2ae7d762e2c8aa3df7f1e68a3534",
16
+ "effort": "fixture",
17
+ "model": "fixture:a",
18
+ "prompt": "35653d898fe8f4687defd9c18d0f6daaf43f2ae7d762e2c8aa3df7f1e68a3534",
19
+ "skill": "35653d898fe8f4687defd9c18d0f6daaf43f2ae7d762e2c8aa3df7f1e68a3534"
20
+ },
21
+ "cost": 1,
22
+ "costUnit": "wall_ms"
23
+ },
24
+ {
25
+ "label": "variant-5588a335bb82b8d5",
26
+ "armId": "b",
27
+ "configuration": {
28
+ "configuration": "35653d898fe8f4687defd9c18d0f6daaf43f2ae7d762e2c8aa3df7f1e68a3534",
29
+ "effort": "fixture",
30
+ "model": "fixture:b",
31
+ "prompt": "35653d898fe8f4687defd9c18d0f6daaf43f2ae7d762e2c8aa3df7f1e68a3534",
32
+ "skill": "35653d898fe8f4687defd9c18d0f6daaf43f2ae7d762e2c8aa3df7f1e68a3534"
33
+ },
34
+ "cost": 2,
35
+ "costUnit": "wall_ms"
36
+ }
37
+ ],
38
+ "routingDefault": null
39
+ }
@@ -0,0 +1,89 @@
1
+ {
2
+ "repository": "skill-harness",
3
+ "records": [
4
+ {
5
+ "commit": "4460af93c55aa3a52df262782cd339ad374113b8",
6
+ "source": "contracts/work-capture/v2/README.md",
7
+ "target": "work-capture/README.md",
8
+ "sha256": "9e33d02ad97c5333f8c6c1cf8c639690b3feb6283596f137860b0e00769f5d2c"
9
+ },
10
+ {
11
+ "commit": "4460af93c55aa3a52df262782cd339ad374113b8",
12
+ "source": "contracts/work-capture/v2/fixtures/batch.json",
13
+ "target": "work-capture/fixtures/batch.json",
14
+ "sha256": "23ba49a4312f27046b91b8b49d777f7d6992ecae964858917b9f143d5a4d70da"
15
+ },
16
+ {
17
+ "commit": "4460af93c55aa3a52df262782cd339ad374113b8",
18
+ "source": "contracts/work-capture/v2/fixtures/cases.json",
19
+ "target": "work-capture/fixtures/cases.json",
20
+ "sha256": "b8efcf0ca89fc34f82cf526b95fd61be010bd23bec4697bc6d54bba7b4cfda14"
21
+ },
22
+ {
23
+ "commit": "4460af93c55aa3a52df262782cd339ad374113b8",
24
+ "source": "contracts/work-capture/v2/fixtures/review.json",
25
+ "target": "work-capture/fixtures/review.json",
26
+ "sha256": "c87d4b91f82df1ee197d25c7a22dcf250791680157b4e0685b3528030e4a2402"
27
+ },
28
+ {
29
+ "commit": "4460af93c55aa3a52df262782cd339ad374113b8",
30
+ "source": "contracts/work-capture/v2/review-request.schema.json",
31
+ "target": "work-capture/review-request.schema.json",
32
+ "sha256": "1f0f8d156b56c5b1ed212e3f7ad470ac9b52568160ffa28fde07a9e53915ea11"
33
+ },
34
+ {
35
+ "commit": "4460af93c55aa3a52df262782cd339ad374113b8",
36
+ "source": "contracts/work-capture/v2/work-case.schema.json",
37
+ "target": "work-capture/work-case.schema.json",
38
+ "sha256": "b3b39d5ccec8a0ffb45dfdff317a2a27802ec337ad4aab9df6f08122dc3f6274"
39
+ },
40
+ {
41
+ "commit": "0475e1f5684e01992850c48aa14841751711701a",
42
+ "source": "contracts/intervention/v1/README.md",
43
+ "target": "intervention/README.md",
44
+ "sha256": "71cd78c8748516d7f7229f69905f0e34e51dead3e73fae13a39e984ed8db917f"
45
+ },
46
+ {
47
+ "commit": "0475e1f5684e01992850c48aa14841751711701a",
48
+ "source": "contracts/intervention/v1/fixtures/artifact-3ee11136beb864f518252e5024dae9197421fbf97b6e981d3243c782b5c44bd0.txt",
49
+ "target": "intervention/fixtures/artifact-3ee11136beb864f518252e5024dae9197421fbf97b6e981d3243c782b5c44bd0.txt",
50
+ "sha256": "3ee11136beb864f518252e5024dae9197421fbf97b6e981d3243c782b5c44bd0"
51
+ },
52
+ {
53
+ "commit": "0475e1f5684e01992850c48aa14841751711701a",
54
+ "source": "contracts/intervention/v1/fixtures/artifact-58905d872dd3c54a9705f67b05fa82edbad7af6476ae8993faf1a7b9fadfb905.txt",
55
+ "target": "intervention/fixtures/artifact-58905d872dd3c54a9705f67b05fa82edbad7af6476ae8993faf1a7b9fadfb905.txt",
56
+ "sha256": "58905d872dd3c54a9705f67b05fa82edbad7af6476ae8993faf1a7b9fadfb905"
57
+ },
58
+ {
59
+ "commit": "0475e1f5684e01992850c48aa14841751711701a",
60
+ "source": "contracts/intervention/v1/fixtures/assessment.json",
61
+ "target": "intervention/fixtures/assessment.json",
62
+ "sha256": "4099505170048292ccf3213893b9d8ca87cf4933c9ae199907c1d5fc5540dd78"
63
+ },
64
+ {
65
+ "commit": "0475e1f5684e01992850c48aa14841751711701a",
66
+ "source": "contracts/intervention/v1/fixtures/blind-view.json",
67
+ "target": "intervention/fixtures/blind-view.json",
68
+ "sha256": "eed28f68aab303a2b73a380a7de6804c58a64262e1f1ad76fcb29238445e9c83"
69
+ },
70
+ {
71
+ "commit": "0475e1f5684e01992850c48aa14841751711701a",
72
+ "source": "contracts/intervention/v1/fixtures/choice.json",
73
+ "target": "intervention/fixtures/choice.json",
74
+ "sha256": "f6d4cbe275ae3673a5d2ba04db8475409d2843ecb2dace6438d76dc64dfcc1df"
75
+ },
76
+ {
77
+ "commit": "0475e1f5684e01992850c48aa14841751711701a",
78
+ "source": "contracts/intervention/v1/fixtures/manifest.json",
79
+ "target": "intervention/fixtures/manifest.json",
80
+ "sha256": "26076b33bfc9a5d4976ace87f3569956a32419c1702f63ddab0963c3242f2e53"
81
+ },
82
+ {
83
+ "commit": "0475e1f5684e01992850c48aa14841751711701a",
84
+ "source": "contracts/intervention/v1/fixtures/reveal.json",
85
+ "target": "intervention/fixtures/reveal.json",
86
+ "sha256": "bdc44d7b528beeb3134b358c2af0aadd5089d650df66c8e1b22f016a9f3e471a"
87
+ }
88
+ ]
89
+ }
@@ -0,0 +1,38 @@
1
+ # Work capture/review contract — P07 input for P08
2
+
3
+ Owner: skill-harness. `work-case.schema.json` and `review-request.schema.json` are emitted from source-owned schemas. `fixtures/` comes from the actual case builder, archive and decision writer over seven synthetic layout incidents. These are not live captures, authenticated human statements or approved work.
4
+
5
+ ## Host API
6
+
7
+ ```ts
8
+ import { createWorkCaseReviewer } from '@skill-harness/adapters';
9
+ // An independently configured operator/controller selects this exact private archive, batch and author.
10
+ const reviewer = createWorkCaseReviewer(archiveRoot, batchManifestId, operatorIdentity);
11
+ const page = reviewer.list(0, 5); // total/offset/items; no writes, <=5 items per call
12
+ const history = reviewer.history(caseManifestId); // read-only; no decision is inferred
13
+ const result = reviewer.decide({ caseManifestId, priorDecisionId, disposition, note });
14
+ ```
15
+
16
+ The caller must establish the legitimate operator and presentation/attention policy. This API is not a user authenticator, remote capability service or authorization for workers/adoption. A JSON case cannot supply the author, change batch membership or promote itself. Host callbacks can integrate this actual harness-owned writer with an existing dashboard; absent a genuine configured writer, UI actions must stay unavailable rather than writing a separate dashboard ledger.
17
+
18
+ - `list` returns `{total,offset,items:[{caseManifestId,candidate,priorDecisionId,disposition}]}`. Unselected cases do not become agreement. A skip remains skip/unresolved, not a positive label. Five is a per-call ceiling, not proof of the P08 per-pause budget; the presenter must enforce one overall budget including blind cards.
19
+ - `decide` accepts only the four schema fields. The selected batch bounds membership; author is fixed at host initialization. Unknown keys, stale prior IDs, invalid case state and altered history reject.
20
+ - Result is `{current:WorkCaseDecision,replayed:boolean}`. Exact replay does not overwrite a newer current decision. Corrections append a digest-bound chain and preserve prior records.
21
+ - Data lives in the existing private harness archive under `case-decisions/<caseId>/history.jsonl`, with a non-expiring owner-token lock at `case-decisions/<caseId>.lock`. First initialization occurs under that lock. Files/ancestors are checked, writes/directory entries synced, and another owner's lock is never removed.
22
+ - Missing/partial/invalid existing histories refuse further writes. No truncate, automatic stale-lock recovery, rollback or manufactured empty history is provided. A crash/cleanup failure can leave durable bytes and an error; inspect the exact case. Whole-directory rollback by a hostile same-user owner is not prevented or qualified.
23
+ - Case records stay silent/unresolved/causal-not-established. Labels do not alter P01 acceptance, grants, runtime control or scored specifications. Scenario promotion and independently verified calibration outcomes remain separate.
24
+
25
+ Schemas cover wire shape. The source case builder additionally checks canonical ID and cost/reason consistency; the decision writer validates chain identity and expected prior state. Rendering arbitrary caller objects is not validation.
26
+
27
+ ## P08 presentation obligations
28
+
29
+ Use existing dashboard/plugin. A verified suitable pause (not every agent_end or guessed idle state) and explicit exposure/calibration policy are still required for automatic presentation. At most five total questions/cards, including blind-choice cards. Defer on unknown boundary/absence/budget exhaustion. Reconnect retains unresolved cards. Quality choice must precede cost/configuration reveal in the separate frozen comparison family; no live casting result is implied by these fixtures. No worker/status messages or observer steering.
30
+
31
+ Direct reproduction after compiler build:
32
+
33
+ ```sh
34
+ node scripts/generate-work-case-contract.mjs --check
35
+ node node_modules/vitest/vitest.mjs run packages/core/test/work-capture.test.ts packages/adapters/test/work-case-review.test.ts packages/adapters/test/work-case-archive.test.ts
36
+ ```
37
+
38
+ Actual integration, independent labels/attention policy and full P07/P08 acceptance remain pending.
@@ -0,0 +1,17 @@
1
+ {
2
+ "version": "work-candidate-batch-v1",
3
+ "observationId": "3be5c1b87d00d4457a9ec843379815d15a7d953b2c30b11d2325a0b6705adb82",
4
+ "candidateIds": [
5
+ "8c558dfc1db9526c1635515d259f1b6328915e08fee9724b06771c4e739a003c",
6
+ "48910d9ba3af6ab7fd022e6ee38b14f5a4a02d3fca6fe4aa12dc3ada1ef1f181",
7
+ "9dde8e074796e03ef02458e2bd158520e5a4fd7242f1fa88da2e86a6af20bddc",
8
+ "30e6b213a7ad8c236f597484f644ec867874bfa0de56d5c2fd430f7a9178e1a4",
9
+ "fedbb6f6549c42d213e36603d5246ae030ebc4c28a6f76491632f429cf656f94",
10
+ "d0303fd5789b494edafcd3c5a215a7191f1547f9d33802d7101bf911cda21ca3",
11
+ "54856ce8abf12a39cf6e09f92c3b744bae4647bb6dd817a47611c230c69a9635"
12
+ ],
13
+ "issues": [],
14
+ "expected": [],
15
+ "visibility": "silent",
16
+ "promotion": "not-authorized"
17
+ }