project-tiny-context-harness 0.8.11 → 0.8.13

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 (395) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +514 -472
  3. package/assets/README.md +803 -749
  4. package/assets/README.zh-CN.md +468 -431
  5. package/assets/agents/.gitkeep +1 -1
  6. package/assets/agents/AGENTS_CORE.md +22 -24
  7. package/assets/agents/long-task-implementation.toml +15 -0
  8. package/assets/context_templates/architecture.md +18 -18
  9. package/assets/context_templates/area.md +30 -30
  10. package/assets/context_templates/context.toml +24 -24
  11. package/assets/context_templates/deployment.md +35 -35
  12. package/assets/context_templates/global.md +56 -56
  13. package/assets/context_templates/product-surface-contract.md +70 -70
  14. package/assets/context_templates/screen-contract.md +189 -189
  15. package/assets/context_templates/verification.md +25 -25
  16. package/assets/github/.gitkeep +1 -1
  17. package/assets/github/harness.yml +39 -39
  18. package/assets/make/.gitkeep +1 -1
  19. package/assets/make/ty-context.mk +48 -48
  20. package/assets/skills/context_development_engineer/SKILL.md +72 -185
  21. package/assets/skills/context_full_project_export/SKILL.md +28 -28
  22. package/assets/skills/context_harness_upgrade/SKILL.md +60 -60
  23. package/assets/skills/context_product_plan/SKILL.md +35 -101
  24. package/assets/skills/context_surface_contract/SKILL.md +194 -191
  25. package/assets/skills/context_uiux_design/SKILL.md +49 -172
  26. package/assets/skills/design-resource-authoring/SKILL.md +54 -88
  27. package/assets/skills/design-resource-authoring/references/downstream-handoff.md +51 -163
  28. package/assets/skills/design-resource-authoring/references/formal-selected-web-app-handoff.md +96 -0
  29. package/assets/skills/design-resource-authoring/references/open-design-provider.md +140 -120
  30. package/assets/skills/design-resource-authoring/references/recovery-and-writeback.md +199 -0
  31. package/assets/skills/design-resource-authoring/references/resource-selection.md +158 -181
  32. package/assets/skills/design-system-authoring/SKILL.md +57 -57
  33. package/assets/skills/design-system-authoring/agents/openai.yaml +6 -6
  34. package/assets/skills/design-system-authoring/references/authority-adoption.md +48 -48
  35. package/assets/skills/design-system-authoring/references/open-design-design-system-provider.md +110 -110
  36. package/assets/skills/long-task-workflow/SKILL.md +71 -106
  37. package/assets/skills/long-task-workflow/agents/openai.yaml +1 -1
  38. package/assets/skills/long-task-workflow/references/authority-lifecycle.md +71 -69
  39. package/assets/skills/long-task-workflow/references/contract-authoring.md +110 -101
  40. package/assets/skills/long-task-workflow/references/evidence-design.md +99 -78
  41. package/assets/skills/long-task-workflow/references/source-authoring.md +90 -90
  42. package/assets/tools/validate_context.py +442 -442
  43. package/dist/commands/design-resource-recovery.d.ts +1 -0
  44. package/dist/commands/design-resource-recovery.js +152 -0
  45. package/dist/commands/design-resource.js +29 -3
  46. package/dist/commands/enable.js +2 -0
  47. package/dist/commands/index.js +2 -2
  48. package/dist/commands/long-task-revision.js +8 -7
  49. package/dist/commands/sync.js +2 -0
  50. package/dist/index.d.ts +3 -3
  51. package/dist/index.js +2 -0
  52. package/dist/lib/compact-authoring-support.d.ts +22 -0
  53. package/dist/lib/compact-authoring-support.js +143 -0
  54. package/dist/lib/compact-shared-structure-authoring.d.ts +5 -0
  55. package/dist/lib/compact-shared-structure-authoring.js +9 -0
  56. package/dist/lib/compact-shared-structure-types.d.ts +61 -0
  57. package/dist/lib/compact-shared-structure-types.js +1 -0
  58. package/dist/lib/compact-shared-structure-validation.d.ts +2 -0
  59. package/dist/lib/compact-shared-structure-validation.js +159 -0
  60. package/dist/lib/compact-shared-structures.d.ts +3 -0
  61. package/dist/lib/compact-shared-structures.js +204 -0
  62. package/dist/lib/design-resource-fact-enums.d.ts +4 -0
  63. package/dist/lib/design-resource-fact-enums.js +12 -0
  64. package/dist/lib/design-resource-fact-manifest-shape-evidence.js +2 -2
  65. package/dist/lib/design-resource-fact-policy.d.ts +2 -2
  66. package/dist/lib/design-resource-fact-types.d.ts +2 -2
  67. package/dist/lib/design-resource-handoff-bundle-draft.js +4 -2
  68. package/dist/lib/design-resource-handoff-input-types.d.ts +3 -0
  69. package/dist/lib/design-resource-handoff-parser.d.ts +2 -2
  70. package/dist/lib/design-resource-handoff-parser.js +2 -2
  71. package/dist/lib/design-resource-handoff-shape.d.ts +2 -0
  72. package/dist/lib/design-resource-handoff-shape.js +10 -0
  73. package/dist/lib/design-resource-handoff-snapshot.js +4 -0
  74. package/dist/lib/design-resource-handoff-validation.d.ts +4 -1
  75. package/dist/lib/design-resource-handoff-validation.js +11 -0
  76. package/dist/lib/design-resource-handoff-web-dependency-validation.d.ts +4 -2
  77. package/dist/lib/design-resource-reconciliation-codec.d.ts +2 -0
  78. package/dist/lib/design-resource-reconciliation-codec.js +174 -0
  79. package/dist/lib/design-resource-reconciliation-types.d.ts +62 -0
  80. package/dist/lib/design-resource-reconciliation-types.js +1 -0
  81. package/dist/lib/design-resource-reconciliation.d.ts +3 -0
  82. package/dist/lib/design-resource-reconciliation.js +224 -0
  83. package/dist/lib/design-resource-recovery-authority-policy.d.ts +8 -0
  84. package/dist/lib/design-resource-recovery-authority-policy.js +123 -0
  85. package/dist/lib/design-resource-recovery-catalog-resources.d.ts +6 -0
  86. package/dist/lib/design-resource-recovery-catalog-resources.js +121 -0
  87. package/dist/lib/design-resource-recovery-catalog-shape.d.ts +3 -0
  88. package/dist/lib/design-resource-recovery-catalog-shape.js +104 -0
  89. package/dist/lib/design-resource-recovery-catalog.d.ts +9 -0
  90. package/dist/lib/design-resource-recovery-catalog.js +103 -0
  91. package/dist/lib/design-resource-recovery-cleanup.d.ts +2 -0
  92. package/dist/lib/design-resource-recovery-cleanup.js +11 -0
  93. package/dist/lib/design-resource-recovery-codec-primitives.d.ts +19 -0
  94. package/dist/lib/design-resource-recovery-codec-primitives.js +92 -0
  95. package/dist/lib/design-resource-recovery-codec.d.ts +4 -0
  96. package/dist/lib/design-resource-recovery-codec.js +93 -0
  97. package/dist/lib/design-resource-recovery-current.d.ts +9 -0
  98. package/dist/lib/design-resource-recovery-current.js +41 -0
  99. package/dist/lib/design-resource-recovery-delta-policy.d.ts +5 -0
  100. package/dist/lib/design-resource-recovery-delta-policy.js +108 -0
  101. package/dist/lib/design-resource-recovery-files.d.ts +37 -0
  102. package/dist/lib/design-resource-recovery-files.js +204 -0
  103. package/dist/lib/design-resource-recovery-final-disposition-shape.d.ts +2 -0
  104. package/dist/lib/design-resource-recovery-final-disposition-shape.js +47 -0
  105. package/dist/lib/design-resource-recovery-patch-types.d.ts +54 -0
  106. package/dist/lib/design-resource-recovery-patch-types.js +1 -0
  107. package/dist/lib/design-resource-recovery-replay.d.ts +7 -0
  108. package/dist/lib/design-resource-recovery-replay.js +112 -0
  109. package/dist/lib/design-resource-recovery-repository-bindings.d.ts +9 -0
  110. package/dist/lib/design-resource-recovery-repository-bindings.js +49 -0
  111. package/dist/lib/design-resource-recovery-schema.d.ts +5 -0
  112. package/dist/lib/design-resource-recovery-schema.js +5 -0
  113. package/dist/lib/design-resource-recovery-shape.d.ts +10 -0
  114. package/dist/lib/design-resource-recovery-shape.js +184 -0
  115. package/dist/lib/design-resource-recovery-source-authority.d.ts +5 -0
  116. package/dist/lib/design-resource-recovery-source-authority.js +219 -0
  117. package/dist/lib/design-resource-recovery-text.d.ts +17 -0
  118. package/dist/lib/design-resource-recovery-text.js +186 -0
  119. package/dist/lib/design-resource-recovery-types.d.ts +197 -0
  120. package/dist/lib/design-resource-recovery-types.js +1 -0
  121. package/dist/lib/design-resource-recovery-writeback-policy.d.ts +5 -0
  122. package/dist/lib/design-resource-recovery-writeback-policy.js +326 -0
  123. package/dist/lib/design-resource-recovery-writeback-shape.d.ts +6 -0
  124. package/dist/lib/design-resource-recovery-writeback-shape.js +155 -0
  125. package/dist/lib/design-resource-recovery.d.ts +44 -0
  126. package/dist/lib/design-resource-recovery.js +216 -0
  127. package/dist/lib/design-resource-symbolic-applicability-authority.d.ts +7 -0
  128. package/dist/lib/design-resource-symbolic-applicability-authority.js +19 -0
  129. package/dist/lib/design-resource-symbolic-applicability-policy.d.ts +12 -0
  130. package/dist/lib/design-resource-symbolic-applicability-policy.js +79 -0
  131. package/dist/lib/design-resource-symbolic-applicability-profiles.d.ts +8 -0
  132. package/dist/lib/design-resource-symbolic-applicability-profiles.js +55 -0
  133. package/dist/lib/design-resource-symbolic-applicability-shape.d.ts +2 -0
  134. package/dist/lib/design-resource-symbolic-applicability-shape.js +76 -0
  135. package/dist/lib/design-resource-symbolic-applicability-validation.d.ts +7 -0
  136. package/dist/lib/design-resource-symbolic-applicability-validation.js +128 -0
  137. package/dist/lib/design-resource-symbolic-compilation.d.ts +3 -0
  138. package/dist/lib/design-resource-symbolic-compilation.js +13 -0
  139. package/dist/lib/design-resource-symbolic-denotation.d.ts +3 -0
  140. package/dist/lib/design-resource-symbolic-denotation.js +167 -0
  141. package/dist/lib/design-resource-symbolic-disposition-validation.d.ts +4 -0
  142. package/dist/lib/design-resource-symbolic-disposition-validation.js +28 -0
  143. package/dist/lib/design-resource-symbolic-fact-policy.d.ts +12 -0
  144. package/dist/lib/design-resource-symbolic-fact-policy.js +12 -0
  145. package/dist/lib/design-resource-symbolic-fact-shape.d.ts +3 -0
  146. package/dist/lib/design-resource-symbolic-fact-shape.js +138 -0
  147. package/dist/lib/design-resource-symbolic-fact-types.d.ts +213 -0
  148. package/dist/lib/design-resource-symbolic-fact-types.js +1 -0
  149. package/dist/lib/design-resource-symbolic-fact-validation.d.ts +3 -0
  150. package/dist/lib/design-resource-symbolic-fact-validation.js +86 -0
  151. package/dist/lib/design-resource-symbolic-indexes.d.ts +23 -0
  152. package/dist/lib/design-resource-symbolic-indexes.js +54 -0
  153. package/dist/lib/design-resource-symbolic-manifest-shape.d.ts +3 -0
  154. package/dist/lib/design-resource-symbolic-manifest-shape.js +155 -0
  155. package/dist/lib/design-resource-symbolic-manifest-validation.d.ts +6 -0
  156. package/dist/lib/design-resource-symbolic-manifest-validation.js +132 -0
  157. package/dist/lib/design-resource-symbolic-noninterference-artifact.d.ts +33 -0
  158. package/dist/lib/design-resource-symbolic-noninterference-artifact.js +110 -0
  159. package/dist/lib/design-resource-symbolic-noninterference-equivalence.d.ts +3 -0
  160. package/dist/lib/design-resource-symbolic-noninterference-equivalence.js +77 -0
  161. package/dist/lib/design-resource-symbolic-noninterference-recompute.d.ts +4 -0
  162. package/dist/lib/design-resource-symbolic-noninterference-recompute.js +146 -0
  163. package/dist/lib/design-resource-symbolic-noninterference-scope.d.ts +7 -0
  164. package/dist/lib/design-resource-symbolic-noninterference-scope.js +49 -0
  165. package/dist/lib/design-resource-symbolic-noninterference-shape.d.ts +2 -0
  166. package/dist/lib/design-resource-symbolic-noninterference-shape.js +152 -0
  167. package/dist/lib/design-resource-symbolic-noninterference-types.d.ts +103 -0
  168. package/dist/lib/design-resource-symbolic-noninterference-types.js +1 -0
  169. package/dist/lib/design-resource-symbolic-noninterference-validation.d.ts +5 -0
  170. package/dist/lib/design-resource-symbolic-noninterference-validation.js +62 -0
  171. package/dist/lib/design-resource-symbolic-oracle-fingerprint.d.ts +1 -0
  172. package/dist/lib/design-resource-symbolic-oracle-fingerprint.js +47 -0
  173. package/dist/lib/design-resource-symbolic-predicate-shape.d.ts +6 -0
  174. package/dist/lib/design-resource-symbolic-predicate-shape.js +123 -0
  175. package/dist/lib/design-resource-symbolic-production-closure.d.ts +4 -0
  176. package/dist/lib/design-resource-symbolic-production-closure.js +144 -0
  177. package/dist/lib/design-resource-symbolic-proof-authority-validation.d.ts +10 -0
  178. package/dist/lib/design-resource-symbolic-proof-authority-validation.js +68 -0
  179. package/dist/lib/design-resource-symbolic-proof-validation.d.ts +10 -0
  180. package/dist/lib/design-resource-symbolic-proof-validation.js +89 -0
  181. package/dist/lib/design-resource-symbolic-region-validation.d.ts +19 -0
  182. package/dist/lib/design-resource-symbolic-region-validation.js +146 -0
  183. package/dist/lib/design-resource-symbolic-resource-validation.d.ts +5 -0
  184. package/dist/lib/design-resource-symbolic-resource-validation.js +90 -0
  185. package/dist/lib/design-resource-symbolic-rule-shape.d.ts +27 -0
  186. package/dist/lib/design-resource-symbolic-rule-shape.js +158 -0
  187. package/dist/lib/design-resource-symbolic-safety-validation.d.ts +6 -0
  188. package/dist/lib/design-resource-symbolic-safety-validation.js +29 -0
  189. package/dist/lib/design-resource-symbolic-source-ir-evaluation.d.ts +19 -0
  190. package/dist/lib/design-resource-symbolic-source-ir-evaluation.js +74 -0
  191. package/dist/lib/design-resource-symbolic-source-ir-evidence.d.ts +44 -0
  192. package/dist/lib/design-resource-symbolic-source-ir-evidence.js +88 -0
  193. package/dist/lib/design-resource-symbolic-source-ir-oracle.d.ts +13 -0
  194. package/dist/lib/design-resource-symbolic-source-ir-oracle.js +96 -0
  195. package/dist/lib/design-resource-symbolic-source-ir-proof.d.ts +14 -0
  196. package/dist/lib/design-resource-symbolic-source-ir-proof.js +98 -0
  197. package/dist/lib/design-resource-symbolic-source-ir-shape.d.ts +2 -0
  198. package/dist/lib/design-resource-symbolic-source-ir-shape.js +38 -0
  199. package/dist/lib/design-resource-symbolic-source-ir-types.d.ts +17 -0
  200. package/dist/lib/design-resource-symbolic-source-ir-types.js +2 -0
  201. package/dist/lib/design-resource-symbolic-static-dependency-validation.d.ts +2 -0
  202. package/dist/lib/design-resource-symbolic-static-dependency-validation.js +83 -0
  203. package/dist/lib/design-resource-symbolic-structural-closure-validation.d.ts +6 -0
  204. package/dist/lib/design-resource-symbolic-structural-closure-validation.js +79 -0
  205. package/dist/lib/design-resource-symbolic-validation-support.d.ts +29 -0
  206. package/dist/lib/design-resource-symbolic-validation-support.js +111 -0
  207. package/dist/lib/design-resource-v1-capacity-header.d.ts +8 -0
  208. package/dist/lib/design-resource-v1-capacity-header.js +231 -0
  209. package/dist/lib/design-resource-v1-capacity.d.ts +5 -0
  210. package/dist/lib/design-resource-v1-capacity.js +45 -0
  211. package/dist/lib/init.js +1 -0
  212. package/dist/lib/long-task-acceptance-shape.js +8 -2
  213. package/dist/lib/long-task-activation-validation.js +13 -3
  214. package/dist/lib/long-task-admitted-observation-records.d.ts +25 -0
  215. package/dist/lib/long-task-admitted-observation-records.js +40 -0
  216. package/dist/lib/long-task-admitted-observation.d.ts +93 -0
  217. package/dist/lib/long-task-admitted-observation.js +201 -0
  218. package/dist/lib/long-task-artifacts.d.ts +1 -0
  219. package/dist/lib/long-task-artifacts.js +1 -0
  220. package/dist/lib/long-task-authority-material-diff.js +1 -0
  221. package/dist/lib/long-task-authority-policy.d.ts +5 -0
  222. package/dist/lib/long-task-authority-policy.js +5 -0
  223. package/dist/lib/long-task-authority-revision-details.js +3 -1
  224. package/dist/lib/long-task-authority.js +2 -1
  225. package/dist/lib/long-task-check-execution-policy.js +5 -0
  226. package/dist/lib/long-task-check-runner.d.ts +2 -2
  227. package/dist/lib/long-task-check-runner.js +440 -23
  228. package/dist/lib/long-task-claims.d.ts +18 -0
  229. package/dist/lib/long-task-claims.js +35 -0
  230. package/dist/lib/long-task-codex-agent-profile.d.ts +42 -0
  231. package/dist/lib/long-task-codex-agent-profile.js +276 -0
  232. package/dist/lib/long-task-compact-authoring-projections.d.ts +12 -0
  233. package/dist/lib/long-task-compact-authoring-projections.js +67 -0
  234. package/dist/lib/long-task-compact-authoring.d.ts +3 -0
  235. package/dist/lib/long-task-compact-authoring.js +173 -0
  236. package/dist/lib/long-task-compact-carrier.d.ts +7 -0
  237. package/dist/lib/long-task-compact-carrier.js +132 -0
  238. package/dist/lib/long-task-compact-parser.d.ts +14 -0
  239. package/dist/lib/long-task-compact-parser.js +123 -0
  240. package/dist/lib/long-task-compact-primitives.d.ts +22 -0
  241. package/dist/lib/long-task-compact-primitives.js +132 -0
  242. package/dist/lib/long-task-compact-projections.d.ts +4 -0
  243. package/dist/lib/long-task-compact-projections.js +153 -0
  244. package/dist/lib/long-task-compact-structure-targets.d.ts +2 -0
  245. package/dist/lib/long-task-compact-structure-targets.js +91 -0
  246. package/dist/lib/long-task-conformance-policy.js +3 -1
  247. package/dist/lib/long-task-counterfactual-claim-policy.d.ts +3 -4
  248. package/dist/lib/long-task-counterfactual-claim-policy.js +11 -3
  249. package/dist/lib/long-task-counterfactual-sandbox.d.ts +1 -1
  250. package/dist/lib/long-task-counterfactual-sandbox.js +8 -5
  251. package/dist/lib/long-task-counterfactual-types.d.ts +2 -0
  252. package/dist/lib/long-task-delivery-compiler.js +2 -0
  253. package/dist/lib/long-task-delivery-parser.d.ts +1 -0
  254. package/dist/lib/long-task-delivery-parser.js +38 -6
  255. package/dist/lib/long-task-design-resource-handoff.d.ts +2 -1
  256. package/dist/lib/long-task-design-resource-handoff.js +71 -11
  257. package/dist/lib/long-task-design-resource-method-binding.d.ts +8 -1
  258. package/dist/lib/long-task-design-resource-method-binding.js +150 -0
  259. package/dist/lib/long-task-evidence-capability-codec.js +256 -34
  260. package/dist/lib/long-task-evidence-capability-policy.d.ts +3 -2
  261. package/dist/lib/long-task-evidence-capability-policy.js +142 -8
  262. package/dist/lib/long-task-evidence-capability-runtime.d.ts +5 -2
  263. package/dist/lib/long-task-evidence-capability-runtime.js +420 -68
  264. package/dist/lib/long-task-evidence-capability-types.d.ts +70 -2
  265. package/dist/lib/long-task-evidence-sensitivity-policy.d.ts +9 -0
  266. package/dist/lib/long-task-evidence-sensitivity-policy.js +31 -1
  267. package/dist/lib/long-task-evidence-v2.d.ts +4 -4
  268. package/dist/lib/long-task-evidence-v2.js +322 -44
  269. package/dist/lib/long-task-exact-comparison.d.ts +16 -0
  270. package/dist/lib/long-task-exact-comparison.js +28 -0
  271. package/dist/lib/long-task-execution-observation.d.ts +24 -0
  272. package/dist/lib/long-task-execution-observation.js +332 -0
  273. package/dist/lib/long-task-explain-acceptance-link.d.ts +4 -0
  274. package/dist/lib/long-task-explain-acceptance-link.js +4 -0
  275. package/dist/lib/long-task-explain-claim-links.d.ts +2 -0
  276. package/dist/lib/long-task-explain-claim-links.js +2 -0
  277. package/dist/lib/long-task-explain-source-links.d.ts +6 -0
  278. package/dist/lib/long-task-final-v2.js +7 -4
  279. package/dist/lib/long-task-hook-install.d.ts +19 -2
  280. package/dist/lib/long-task-hook-install.js +288 -91
  281. package/dist/lib/long-task-json-pointer-observation.d.ts +59 -0
  282. package/dist/lib/long-task-json-pointer-observation.js +184 -0
  283. package/dist/lib/long-task-observation-artifact.d.ts +8 -0
  284. package/dist/lib/long-task-observation-artifact.js +58 -0
  285. package/dist/lib/long-task-observation-authority.d.ts +17 -0
  286. package/dist/lib/long-task-observation-authority.js +348 -0
  287. package/dist/lib/long-task-paths.js +1 -1
  288. package/dist/lib/long-task-playwright-capability-records.d.ts +2 -0
  289. package/dist/lib/long-task-playwright-capability-records.js +74 -2
  290. package/dist/lib/long-task-process-observation.d.ts +6 -0
  291. package/dist/lib/long-task-process-observation.js +117 -0
  292. package/dist/lib/long-task-process-runtime-closure.d.ts +13 -0
  293. package/dist/lib/long-task-process-runtime-closure.js +175 -0
  294. package/dist/lib/long-task-progress.js +2 -0
  295. package/dist/lib/long-task-protected-files.d.ts +1 -1
  296. package/dist/lib/long-task-protected-files.js +1 -30
  297. package/dist/lib/long-task-risk.js +8 -3
  298. package/dist/lib/long-task-root-shape.js +10 -1
  299. package/dist/lib/long-task-runner-environment.d.ts +1 -1
  300. package/dist/lib/long-task-runner-environment.js +4 -4
  301. package/dist/lib/long-task-runner-freeze.d.ts +4 -2
  302. package/dist/lib/long-task-runner-freeze.js +130 -28
  303. package/dist/lib/long-task-runtime-types.d.ts +111 -0
  304. package/dist/lib/long-task-scoped-binding.d.ts +13 -0
  305. package/dist/lib/long-task-scoped-binding.js +11 -0
  306. package/dist/lib/long-task-semantic-contract-types.d.ts +2 -1
  307. package/dist/lib/long-task-semantic-fact-binding-types.d.ts +8 -0
  308. package/dist/lib/long-task-semantic-fact-closure.js +4 -1
  309. package/dist/lib/long-task-semantic-fact-contract-closure.d.ts +1 -1
  310. package/dist/lib/long-task-semantic-fact-contract-closure.js +18 -6
  311. package/dist/lib/long-task-semantic-fact-contract-facts.d.ts +1 -1
  312. package/dist/lib/long-task-semantic-fact-contract-facts.js +4 -1
  313. package/dist/lib/long-task-semantic-fact-contract-proofs.d.ts +1 -1
  314. package/dist/lib/long-task-semantic-fact-contract-proofs.js +12 -3
  315. package/dist/lib/long-task-semantic-fact-evidence.d.ts +8 -4
  316. package/dist/lib/long-task-semantic-fact-evidence.js +103 -43
  317. package/dist/lib/long-task-semantic-fact-shape.js +17 -6
  318. package/dist/lib/long-task-shape-primitives.d.ts +1 -1
  319. package/dist/lib/long-task-shape-primitives.js +1 -0
  320. package/dist/lib/long-task-source-claim-validation.js +4 -1
  321. package/dist/lib/long-task-source-item-parser.d.ts +2 -2
  322. package/dist/lib/long-task-source-item-parser.js +20 -11
  323. package/dist/lib/long-task-source-target-continuity.d.ts +2 -2
  324. package/dist/lib/long-task-source-target-continuity.js +35 -2
  325. package/dist/lib/long-task-source-target-index.d.ts +3 -0
  326. package/dist/lib/long-task-source-target-index.js +19 -0
  327. package/dist/lib/long-task-stage-policy.js +10 -4
  328. package/dist/lib/long-task-static-observation-freeze.d.ts +83 -0
  329. package/dist/lib/long-task-static-observation-freeze.js +428 -0
  330. package/dist/lib/long-task-status-projection.js +5 -1
  331. package/dist/lib/long-task-target-policy.d.ts +1 -1
  332. package/dist/lib/long-task-target-policy.js +3 -0
  333. package/dist/lib/long-task-ui-design-policy.js +64 -4
  334. package/dist/lib/long-task-ui-surface-shape.js +195 -0
  335. package/dist/lib/long-task-ui-surface-types.d.ts +53 -0
  336. package/dist/lib/long-task-verifier-dependency-closure.js +7 -3
  337. package/dist/lib/long-task-verifier-v2.js +70 -9
  338. package/dist/lib/long-task-worker-selection.d.ts +2 -0
  339. package/dist/lib/long-task-worker-selection.js +7 -0
  340. package/dist/lib/long-task-workspace-scope.js +3 -1
  341. package/dist/lib/long-task-workspace.d.ts +1 -1
  342. package/dist/lib/long-task-workspace.js +12 -13
  343. package/dist/lib/migrations.js +58 -0
  344. package/dist/lib/profiles.js +0 -1
  345. package/dist/lib/repository-path-safety.d.ts +14 -0
  346. package/dist/lib/repository-path-safety.js +126 -0
  347. package/dist/lib/semantic-fact-compact-authoring.d.ts +2 -0
  348. package/dist/lib/semantic-fact-compact-authoring.js +160 -0
  349. package/dist/lib/semantic-fact-compact-capacity.d.ts +9 -0
  350. package/dist/lib/semantic-fact-compact-capacity.js +40 -0
  351. package/dist/lib/semantic-fact-compact-carrier.d.ts +16 -0
  352. package/dist/lib/semantic-fact-compact-carrier.js +146 -0
  353. package/dist/lib/semantic-fact-compact-parser.d.ts +17 -0
  354. package/dist/lib/semantic-fact-compact-parser.js +168 -0
  355. package/dist/lib/semantic-fact-compact-revision.d.ts +11 -0
  356. package/dist/lib/semantic-fact-compact-revision.js +64 -0
  357. package/dist/lib/semantic-fact-compact-support.d.ts +23 -0
  358. package/dist/lib/semantic-fact-compact-support.js +159 -0
  359. package/dist/lib/semantic-fact-policy-census.d.ts +1 -0
  360. package/dist/lib/semantic-fact-policy-census.js +43 -0
  361. package/dist/lib/semantic-fact-proof-shape.d.ts +1 -1
  362. package/dist/lib/semantic-fact-property-shape.d.ts +1 -1
  363. package/dist/lib/semantic-fact-source-parser.d.ts +5 -0
  364. package/dist/lib/semantic-fact-source-parser.js +47 -6
  365. package/dist/lib/structural-closure-cost.d.ts +79 -0
  366. package/dist/lib/structural-closure-cost.js +91 -0
  367. package/dist/lib/symbolic-denotation-dag-builder.d.ts +25 -0
  368. package/dist/lib/symbolic-denotation-dag-builder.js +176 -0
  369. package/dist/lib/symbolic-denotation-domain-validation.d.ts +3 -0
  370. package/dist/lib/symbolic-denotation-domain-validation.js +56 -0
  371. package/dist/lib/symbolic-denotation-engine.d.ts +32 -0
  372. package/dist/lib/symbolic-denotation-engine.js +140 -0
  373. package/dist/lib/symbolic-denotation-public.d.ts +11 -0
  374. package/dist/lib/symbolic-denotation-public.js +12 -0
  375. package/dist/lib/symbolic-denotation-runtime.d.ts +20 -0
  376. package/dist/lib/symbolic-denotation-runtime.js +90 -0
  377. package/dist/lib/symbolic-denotation-support.d.ts +11 -0
  378. package/dist/lib/symbolic-denotation-support.js +49 -0
  379. package/dist/lib/symbolic-denotation-types.d.ts +133 -0
  380. package/dist/lib/symbolic-denotation-types.js +18 -0
  381. package/dist/lib/symbolic-denotation-validation.d.ts +6 -0
  382. package/dist/lib/symbolic-denotation-validation.js +126 -0
  383. package/dist/lib/sync-engine.d.ts +1 -0
  384. package/dist/lib/sync-engine.js +4 -1
  385. package/dist/lib/upgrade.js +1 -0
  386. package/dist/long-task-hook.js +40 -1
  387. package/dist/public-types.d.ts +8 -0
  388. package/dist/public-types.js +1 -0
  389. package/dist/schemas/design-resource-symbolic-noninterference-artifact-v2.schema.json +289 -0
  390. package/dist/schemas/design-resource-symbolic-source-ir-v1.schema.json +130 -0
  391. package/dist/schemas/long-task-delivery-v2/long-task-delivery-v2.schema.json +435 -5
  392. package/migrations/README.md +92 -15
  393. package/package.json +2 -2
  394. package/source-mappings.yaml +28 -25
  395. package/assets/skills/source-plan-authoring/SKILL.md +0 -14
@@ -6,6 +6,37 @@ const NON_RESULT_SENSITIVITY_PREFIXES = [
6
6
  "non_completing.",
7
7
  "forbidden_shortcut.",
8
8
  ];
9
+ export function validateCounterfactualObservationImpact(input) {
10
+ if (input.carrier_role === "evidence")
11
+ return "counterfactual_mutates_generated_evidence";
12
+ if (!input.target_live)
13
+ return "counterfactual_target_not_live";
14
+ const expected = new Set(input.expected_affected_fact_refs);
15
+ const preserved = new Set(input.preserved_fact_refs);
16
+ const allowedFanout = new Set(input.allowed_fanout_fact_refs ?? []);
17
+ for (const factRef of expected) {
18
+ if (!Object.hasOwn(input.baseline_by_fact, factRef) ||
19
+ !Object.hasOwn(input.mutated_by_fact, factRef))
20
+ return "counterfactual_expected_fact_observation_missing";
21
+ if (input.baseline_by_fact[factRef] === input.mutated_by_fact[factRef])
22
+ return "counterfactual_expected_fact_unchanged";
23
+ }
24
+ for (const factRef of new Set([
25
+ ...Object.keys(input.baseline_by_fact),
26
+ ...Object.keys(input.mutated_by_fact),
27
+ ])) {
28
+ if (expected.has(factRef) || allowedFanout.has(factRef))
29
+ continue;
30
+ const baseline = input.baseline_by_fact[factRef];
31
+ const mutated = input.mutated_by_fact[factRef];
32
+ if (preserved.has(factRef) &&
33
+ (baseline === undefined || mutated === undefined || baseline !== mutated))
34
+ return "counterfactual_unexpected_fact_impact";
35
+ if (!preserved.has(factRef) && baseline !== mutated)
36
+ return "counterfactual_unexpected_fact_impact";
37
+ }
38
+ return null;
39
+ }
9
40
  export function validateClaimEvidenceSensitivity(contract, globalChecks, outcomes, report) {
10
41
  validateGlobalStructuredSensitivity(contract, globalChecks, report);
11
42
  validateGlobalSemanticWitnesses(contract, globalChecks, report);
@@ -62,7 +93,6 @@ function isNarrowSemanticMutation(type) {
62
93
  }
63
94
  function isBehavioralAssertion(check, assertion) {
64
95
  return !(check.proof_surface === "implementation_structure" &&
65
- assertion.operator === "exists" &&
66
96
  assertion.evidence_capabilities.every((capability) => capability === "presence"));
67
97
  }
68
98
  function isLivenessAssertion(check, reference) {
@@ -1,5 +1,5 @@
1
1
  import type { CheckExecutionResultV2, CompiledCheckV2, CompiledDeliveryContractV2, CompiledOutcomeV2, LongTaskFindingV2, RawCommandExecutionV2, WorkspaceManifestV2 } from "./long-task-delivery-types.js";
2
- export declare function evaluateCheckEvidence(check: CompiledCheckV2, raw: RawCommandExecutionV2, snapshotRoot: string, outcome?: CompiledOutcomeV2): Promise<CheckExecutionResultV2>;
3
- export declare function evaluateOutcomeCounterfactuals(outcome: CompiledOutcomeV2, snapshotRoot: string, manifest?: WorkspaceManifestV2): Promise<LongTaskFindingV2[]>;
4
- export declare function evaluateGlobalCounterfactuals(compiled: CompiledDeliveryContractV2, snapshotRoot: string, selectedCheckKeys?: ReadonlySet<string>, manifest?: WorkspaceManifestV2): Promise<LongTaskFindingV2[]>;
5
- export declare function isValidCounterfactualCheckResult(result: CheckExecutionResultV2, expectedAssertionFailures: string[]): boolean;
2
+ export declare function evaluateCheckEvidence(check: CompiledCheckV2, raw: RawCommandExecutionV2, snapshotRoot: string, outcome?: CompiledOutcomeV2, observationAuthorityPaths?: readonly string[]): Promise<CheckExecutionResultV2>;
3
+ export declare function evaluateOutcomeCounterfactuals(outcome: CompiledOutcomeV2, snapshotRoot: string, manifest?: WorkspaceManifestV2, protectedAuthorityPaths?: readonly string[], baselineResults?: readonly CheckExecutionResultV2[], baselineExecutions?: ReadonlyMap<string, RawCommandExecutionV2>, executionUniverse?: readonly CompiledCheckV2[]): Promise<LongTaskFindingV2[]>;
4
+ export declare function evaluateGlobalCounterfactuals(compiled: CompiledDeliveryContractV2, snapshotRoot: string, selectedCheckKeys?: ReadonlySet<string>, manifest?: WorkspaceManifestV2, baselineResults?: readonly CheckExecutionResultV2[], baselineExecutions?: ReadonlyMap<string, RawCommandExecutionV2>, executionUniverse?: readonly CompiledCheckV2[]): Promise<LongTaskFindingV2[]>;
5
+ export declare function isValidCounterfactualCheckResult(result: CheckExecutionResultV2, expectedAssertionFailures: string[], allowedFanoutAssertions?: string[]): boolean;
@@ -1,22 +1,41 @@
1
1
  import { copyFile, rm, stat } from "node:fs/promises";
2
2
  import { evaluatePopulation } from "./long-task-assertions-v2.js";
3
- import { collectCheckArtifacts } from "./long-task-artifacts.js";
3
+ import { collectCheckArtifacts, prepareAdmittedObservations, } from "./long-task-artifacts.js";
4
4
  import { executeCheckRunner } from "./long-task-check-runner.js";
5
+ import { prepareExecutionObservationGroup } from "./long-task-execution-observation.js";
5
6
  import { createCounterfactualSandbox } from "./long-task-counterfactual-sandbox.js";
6
7
  import { assertionFinding, checkFinding, classifyCheckStatus, evaluateAssertionResults, } from "./long-task-evidence-findings.js";
7
8
  import { classifyPlaywrightCounterfactual } from "./long-task-playwright-counterfactual-policy.js";
9
+ import { admittedObservationAuthorityKey, classifyMachineObservationCarrierRoleConflict, } from "./long-task-admitted-observation.js";
8
10
  import { applyNarrowSemanticMutation } from "./long-task-semantic-mutation.js";
9
11
  import { evaluateEvidenceCapabilities } from "./long-task-evidence-capability-policy.js";
12
+ import { validateCounterfactualObservationImpact } from "./long-task-evidence-sensitivity-policy.js";
13
+ import { matchesRepoPattern, normalizeRepositoryFile, } from "./long-task-paths.js";
10
14
  import { resolveInsideRepository } from "./long-task-workspace.js";
11
- export async function evaluateCheckEvidence(check, raw, snapshotRoot, outcome) {
15
+ import { canonicalValueJson } from "./strict-codec.js";
16
+ export async function evaluateCheckEvidence(check, raw, snapshotRoot, outcome, observationAuthorityPaths = []) {
12
17
  const artifacts = await collectCheckArtifacts(check, snapshotRoot);
13
- const assertionResults = evaluateAssertionResults(check, raw.observations);
18
+ const admittedObservations = await prepareAdmittedObservations({
19
+ check,
20
+ records: raw.evidence_records ?? [],
21
+ snapshot_root: snapshotRoot,
22
+ authority_paths: observationAuthorityPaths,
23
+ package_observations: (raw.package_observations ?? []).filter((candidate) => (check.observation_authorities ?? []).some((authority) => authority.authority === candidate.authority &&
24
+ authority.observation_identity === candidate.observation_identity &&
25
+ authority.assertion_ref === candidate.assertion_ref &&
26
+ authority.obligation_ref === candidate.obligation_ref &&
27
+ authority.method === candidate.method)),
28
+ });
29
+ const derived = packageDerivedAssertionObservations(check, raw.observations, admittedObservations);
30
+ const authoritativeRaw = { ...raw, observations: derived.observations };
31
+ const assertionResults = evaluateAssertionResults(check, authoritativeRaw.observations);
14
32
  const executionCompleted = raw.execution_status === "completed";
15
- const findings = collectExecutionFindings(check, raw, outcome, artifacts, assertionResults);
33
+ const findings = collectExecutionFindings(check, authoritativeRaw, outcome, artifacts, assertionResults, admittedObservations);
34
+ findings.push(...derived.findings);
16
35
  const population = outcome?.acceptance.population;
17
36
  let populationPassed = true;
18
37
  if (executionCompleted && population?.check_key === check.key) {
19
- const result = evaluatePopulation(population, raw.observations);
38
+ const result = evaluatePopulation(population, authoritativeRaw.observations);
20
39
  populationPassed = result.passed;
21
40
  if (!result.passed)
22
41
  findings.push({
@@ -57,7 +76,7 @@ export async function evaluateCheckEvidence(check, raw, snapshotRoot, outcome) {
57
76
  evidence_adapter: check.evidence_adapter,
58
77
  execution_identity: raw.raw_execution_identity,
59
78
  assertion_results: assertionResults,
60
- observations: raw.observations,
79
+ observations: authoritativeRaw.observations,
61
80
  evidence_records: raw.evidence_records ?? [],
62
81
  artifact_hashes: artifacts.hashes,
63
82
  claim_proofs: claimProofs,
@@ -66,7 +85,40 @@ export async function evaluateCheckEvidence(check, raw, snapshotRoot, outcome) {
66
85
  duration_ms: raw.duration_ms,
67
86
  };
68
87
  }
69
- function collectExecutionFindings(check, raw, outcome, artifacts, assertionResults) {
88
+ function packageDerivedAssertionObservations(check, submitted, admitted) {
89
+ const observations = { ...submitted };
90
+ const findings = [];
91
+ for (const assertion of [
92
+ ...check.positive_assertions,
93
+ ...check.negative_assertions,
94
+ ]) {
95
+ const authorities = (check.observation_authorities ?? []).filter((authority) => authority.assertion_ref === assertion.key);
96
+ if (!authorities.length)
97
+ continue;
98
+ const entries = authorities.map((authority) => admitted.by_authority_key.get(admittedObservationAuthorityKey(authority)));
99
+ if (entries.some((entry) => !entry || entry.reason || !entry.observation || !entry.comparison))
100
+ continue;
101
+ const factBound = authorities.some((authority) => authority.fact_ref !== null);
102
+ const derivedValue = factBound
103
+ ? entries.every((entry) => entry.comparison.passed)
104
+ : entries.length === 1
105
+ ? entries[0].raw_value
106
+ : entries.every((entry) => entry.comparison.passed);
107
+ if (Object.hasOwn(submitted, assertion.observation) &&
108
+ canonicalValueJson(submitted[assertion.observation]) !==
109
+ canonicalValueJson(derivedValue))
110
+ findings.push({
111
+ ...checkFinding(check, "project_submitted_verdict_disagrees_with_harness", `Project-submitted observation ${assertion.observation} disagrees with the package-derived current Actual.`, "Remove the compatibility copy or make it agree with the Harness-derived observation; it cannot act as Authority."),
112
+ assertion_key: assertion.key,
113
+ claim_keys: assertion.claims,
114
+ expected: derivedValue,
115
+ actual: submitted[assertion.observation],
116
+ });
117
+ observations[assertion.observation] = derivedValue;
118
+ }
119
+ return { observations, findings };
120
+ }
121
+ function collectExecutionFindings(check, raw, outcome, artifacts, assertionResults, admittedObservations) {
70
122
  const findings = [];
71
123
  if (raw.execution_status !== "completed") {
72
124
  findings.push(checkFinding(check, raw.execution_status, raw.error ?? raw.execution_status, raw.execution_status === "blocked_external"
@@ -83,17 +135,24 @@ function collectExecutionFindings(check, raw, outcome, artifacts, assertionResul
83
135
  for (const result of assertionResults)
84
136
  if (!result.passed)
85
137
  findings.push(assertionFinding(check, result, raw.observations, outcome));
86
- const capabilityEvaluation = evaluateEvidenceCapabilities(check, raw.evidence_records, artifacts.hashes);
138
+ const capabilityEvaluation = evaluateEvidenceCapabilities(check, raw.evidence_records, artifacts.hashes, admittedObservations, raw);
87
139
  const passedAssertions = new Set(assertionResults
88
140
  .filter((result) => result.passed)
89
141
  .map((result) => result.key));
90
- findings.push(...capabilityEvaluation.findings.filter((finding) => !finding.assertion_key || passedAssertions.has(finding.assertion_key)));
142
+ findings.push(...capabilityEvaluation.findings.filter((finding) => !finding.assertion_key ||
143
+ passedAssertions.has(finding.assertion_key) ||
144
+ isObservationAuthorityFailureFinding(finding)));
91
145
  for (const result of assertionResults)
92
146
  result.evidence_complete =
93
147
  result.passed && capabilityEvaluation.complete[result.key] === true;
94
148
  return findings;
95
149
  }
96
- export async function evaluateOutcomeCounterfactuals(outcome, snapshotRoot, manifest) {
150
+ function isObservationAuthorityFailureFinding(finding) {
151
+ if (typeof finding.actual !== "string")
152
+ return false;
153
+ return /^(?:admitted_observation_|counterfactual_admitted_observation_|host_attestation_|machine_observer_|observation_|process_observation_|process_observer_|project_submitted_|static_observation_|unsupported_observer_)/u.test(finding.actual);
154
+ }
155
+ export async function evaluateOutcomeCounterfactuals(outcome, snapshotRoot, manifest, protectedAuthorityPaths = [], baselineResults = [], baselineExecutions = new Map(), executionUniverse = outcome.acceptance.checks) {
97
156
  return evaluateCounterfactualSet(outcome.acceptance.counterfactual_controls.map((control) => ({
98
157
  control,
99
158
  check: outcome.acceptance.checks.find((item) => item.key === control.check_key),
@@ -101,9 +160,12 @@ export async function evaluateOutcomeCounterfactuals(outcome, snapshotRoot, mani
101
160
  findingOutcomeKey: outcome.key,
102
161
  owningOutcome: outcome,
103
162
  bindingRef: `${outcome.key}.${control.binding_key}`,
104
- })), snapshotRoot, manifest);
163
+ })), snapshotRoot, manifest, protectedAuthorityPaths, baselineResults, baselineExecutions, executionUniverse);
105
164
  }
106
- export async function evaluateGlobalCounterfactuals(compiled, snapshotRoot, selectedCheckKeys, manifest) {
165
+ export async function evaluateGlobalCounterfactuals(compiled, snapshotRoot, selectedCheckKeys, manifest, baselineResults = [], baselineExecutions = new Map(), executionUniverse = [
166
+ ...compiled.global.acceptance.checks,
167
+ ...compiled.outcomes.flatMap((outcome) => outcome.acceptance.checks),
168
+ ]) {
107
169
  return evaluateCounterfactualSet((compiled.global.acceptance.counterfactual_controls ?? [])
108
170
  .filter((control) => !selectedCheckKeys || selectedCheckKeys.has(control.check_key))
109
171
  .map((control) => {
@@ -115,23 +177,18 @@ export async function evaluateGlobalCounterfactuals(compiled, snapshotRoot, sele
115
177
  owningOutcome: compiled.outcomes.find((outcome) => outcome.key === outcomeKey),
116
178
  bindingRef: control.binding_ref,
117
179
  };
118
- }), snapshotRoot, manifest);
180
+ }), snapshotRoot, manifest, compiledAuthorityPaths(compiled), baselineResults, baselineExecutions, executionUniverse);
119
181
  }
120
- async function evaluateCounterfactualSet(entries, snapshotRoot, manifest) {
182
+ async function evaluateCounterfactualSet(entries, snapshotRoot, manifest, protectedAuthorityPaths = [], baselineResults = [], baselineExecutions = new Map(), executionUniverse = []) {
121
183
  const findings = [];
122
184
  for (const entry of entries) {
123
185
  const { control, check } = entry;
124
186
  const owningBinding = entry.owningOutcome.technical.bindings.find((binding) => `${entry.owningOutcome.key}.${binding.key}` === entry.bindingRef);
125
- const sandbox = await createCounterfactualSandbox(snapshotRoot, check, control, owningBinding?.carrier_paths ?? [], manifest);
187
+ const sandbox = await createCounterfactualSandbox(snapshotRoot, check, control, owningBinding?.carrier_paths ?? [], manifest, protectedAuthorityPaths);
126
188
  const root = sandbox.root;
127
189
  try {
128
- const mutationTargets = control.mutation.type === "remove_paths"
129
- ? control.mutation.paths
130
- : [control.mutation.path];
131
- const missingTargets = [];
132
- for (const target of mutationTargets)
133
- if (!(await stat(resolveInsideRepository(root, target, "counterfactual.target")).catch(() => null)))
134
- missingTargets.push(target);
190
+ const mutationTargets = counterfactualMutationTargets(control);
191
+ const missingTargets = await missingCounterfactualMutationTargets(root, mutationTargets);
135
192
  if (missingTargets.length) {
136
193
  findings.push(counterfactualIntegrityFinding(entry, {
137
194
  execution_status: "not_run",
@@ -140,18 +197,10 @@ async function evaluateCounterfactualSet(entries, snapshotRoot, manifest) {
140
197
  }));
141
198
  continue;
142
199
  }
143
- if (control.mutation.type === "remove_paths") {
144
- for (const target of control.mutation.paths)
145
- await rm(resolveInsideRepository(root, target, "counterfactual.remove_paths"), { recursive: true, force: true });
146
- }
147
- else if (control.mutation.type === "replace_file") {
148
- await copyFile(resolveInsideRepository(root, control.mutation.fixture_path, "counterfactual.fixture"), resolveInsideRepository(root, control.mutation.path, "counterfactual.path"));
149
- }
150
- else {
151
- await applyNarrowSemanticMutation(root, control.mutation);
152
- }
153
- const raw = await executeCheckRunner(check, root);
154
- const result = await evaluateCheckEvidence(check, raw, root, entry.evidenceOutcome);
200
+ await applyCounterfactualMutation(root, control);
201
+ const raw = await executeCounterfactualCheck(check, root, manifest, protectedAuthorityPaths, executionUniverse);
202
+ const result = await evaluateCheckEvidence(check, raw, root, entry.evidenceOutcome, protectedAuthorityPaths);
203
+ const observationImpactIssue = await counterfactualObservationImpactIssue(entry, baselineResults, baselineExecutions.get(check.raw_execution_identity), result, raw, snapshotRoot, root, mutationTargets, owningBinding?.carrier_paths ?? [], protectedAuthorityPaths, executionUniverse);
155
204
  const playwrightClassification = result.evidence_adapter === "playwright_json_v1"
156
205
  ? classifyPlaywrightCounterfactual(raw, result, control)
157
206
  : null;
@@ -161,21 +210,27 @@ async function evaluateCounterfactualSet(entries, snapshotRoot, manifest) {
161
210
  .map((assertion) => assertion.key)
162
211
  .sort();
163
212
  const expected = [...control.expected_assertion_failures].sort();
213
+ const allowedFanout = [
214
+ ...(control.allowed_fanout_assertions ?? []),
215
+ ].sort();
164
216
  const acceptedExit = playwrightClassification
165
217
  ? playwrightClassification.accepted_test_failure_exit
166
218
  : raw.exit_code === 0;
167
219
  const valid = raw.execution_status === "completed" &&
168
220
  acceptedExit &&
169
- isValidCounterfactualCheckResult(sensitivityResult, expected);
221
+ observationImpactIssue === null &&
222
+ isValidCounterfactualCheckResult(sensitivityResult, expected, allowedFanout);
170
223
  if (!valid)
171
224
  findings.push(counterfactualIntegrityFinding(entry, playwrightClassification
172
225
  ? playwrightCounterfactualDiagnostic(raw, result, expected, playwrightClassification.rejection_reasons)
173
226
  : {
174
227
  execution_status: raw.execution_status,
175
228
  exit_code: raw.exit_code,
229
+ execution_error: raw.error,
176
230
  result_status: result.status,
177
231
  failed_assertions: failedAssertions,
178
232
  finding_codes: result.findings.map((finding) => finding.code),
233
+ observation_impact_issue: observationImpactIssue,
179
234
  }));
180
235
  }
181
236
  finally {
@@ -184,6 +239,232 @@ async function evaluateCounterfactualSet(entries, snapshotRoot, manifest) {
184
239
  }
185
240
  return findings;
186
241
  }
242
+ async function executeCounterfactualCheck(check, root, manifest, protectedAuthorityPaths, executionUniverse) {
243
+ const packageAuthorities = (check.observation_authorities ?? []).filter((authority) => authority.authority !== "external_confirmation");
244
+ if (!packageAuthorities.length)
245
+ return executeCheckRunner(check, root);
246
+ if (!manifest)
247
+ return {
248
+ raw_execution_identity: check.raw_execution_identity,
249
+ execution_identity: check.raw_execution_identity,
250
+ execution_status: "invalid_evidence",
251
+ exit_code: -1,
252
+ observations: {},
253
+ evidence_records: [],
254
+ stdout_sha256: "",
255
+ stderr_sha256: "",
256
+ attempts: 0,
257
+ duration_ms: 0,
258
+ error: "counterfactual_admitted_observation_required",
259
+ package_observations: [],
260
+ host_execution_attestation: null,
261
+ };
262
+ const group = executionUniverse.filter((candidate) => candidate.raw_execution_identity === check.raw_execution_identity);
263
+ const prepared = await prepareExecutionObservationGroup({
264
+ checks: group.length ? group : [check],
265
+ snapshot_root: root,
266
+ workspace_manifest: manifest,
267
+ protected_authority_paths: protectedAuthorityPaths,
268
+ });
269
+ try {
270
+ return await prepared.finalize(await executeCheckRunner(check, prepared.execution_root, prepared.runner_context));
271
+ }
272
+ finally {
273
+ await prepared.dispose();
274
+ }
275
+ }
276
+ function counterfactualMutationTargets(control) {
277
+ return control.mutation.type === "remove_paths"
278
+ ? control.mutation.paths
279
+ : [control.mutation.path];
280
+ }
281
+ async function missingCounterfactualMutationTargets(root, targets) {
282
+ const missing = [];
283
+ for (const target of targets)
284
+ if (!(await stat(resolveInsideRepository(root, target, "counterfactual.target")).catch(() => null)))
285
+ missing.push(target);
286
+ return missing;
287
+ }
288
+ async function applyCounterfactualMutation(root, control) {
289
+ if (control.mutation.type === "remove_paths") {
290
+ for (const target of control.mutation.paths)
291
+ await rm(resolveInsideRepository(root, target, "counterfactual.remove_paths"), { recursive: true, force: true });
292
+ return;
293
+ }
294
+ if (control.mutation.type === "replace_file") {
295
+ await copyFile(resolveInsideRepository(root, control.mutation.fixture_path, "counterfactual.fixture"), resolveInsideRepository(root, control.mutation.path, "counterfactual.path"));
296
+ return;
297
+ }
298
+ await applyNarrowSemanticMutation(root, control.mutation);
299
+ }
300
+ async function counterfactualObservationImpactIssue(entry, baselineResults, baselineRaw, mutatedResult, mutatedRaw, baselineRoot, mutatedRoot, mutationTargets, bindingCarrierPaths, protectedAuthorityPaths, executionUniverse) {
301
+ const baselineResult = baselineResults.find((candidate) => candidate.internal_id === entry.check.internal_id);
302
+ const machineClosing = [
303
+ ...entry.check.positive_assertions,
304
+ ...entry.check.negative_assertions,
305
+ ].some((assertion) => assertion.claims.length > 0);
306
+ if (!baselineResult || !baselineRaw)
307
+ return machineClosing
308
+ ? "counterfactual_admitted_observation_required"
309
+ : null;
310
+ const processObserved = (entry.check.observation_authorities ?? []).some((authority) => authority.authority === "package_process_json_exact");
311
+ const processClosure = processObserved
312
+ ? entry.check.process_runtime_closure
313
+ : null;
314
+ if (processObserved) {
315
+ if (!processClosure)
316
+ return "process_runtime_closure_identity_mismatch";
317
+ const normalizedMutationTargets = mutationTargets.map((target, index) => normalizeRepositoryFile(target, `counterfactual.mutation_targets[${index}]`));
318
+ if (normalizedMutationTargets.some((target) => !processClosure.production_carrier_files.includes(target)))
319
+ return "counterfactual_runtime_reachability_unproven";
320
+ }
321
+ const observationChecks = counterfactualObservationChecks(entry.check, executionUniverse, processObserved);
322
+ const observationSets = await Promise.all(observationChecks.map(async (check) => {
323
+ const baselineCheckResult = baselineResults.find((candidate) => candidate.internal_id === check.internal_id);
324
+ const [baseline, mutated] = await Promise.all([
325
+ prepareAdmittedObservations({
326
+ check,
327
+ records: baselineCheckResult?.evidence_records ?? [],
328
+ snapshot_root: baselineRoot,
329
+ authority_paths: protectedAuthorityPaths,
330
+ package_observations: packageObservationsForCheck(check, baselineRaw.package_observations ?? []),
331
+ }),
332
+ prepareAdmittedObservations({
333
+ check,
334
+ records: check.internal_id === entry.check.internal_id
335
+ ? mutatedResult.evidence_records
336
+ : [],
337
+ snapshot_root: mutatedRoot,
338
+ authority_paths: protectedAuthorityPaths,
339
+ package_observations: packageObservationsForCheck(check, mutatedRaw.package_observations ?? []),
340
+ }),
341
+ ]);
342
+ return { check, baseline, mutated };
343
+ }));
344
+ const baselineEntries = observationSets.flatMap(({ check, baseline }) => baseline.entries.map((candidate) => ({
345
+ candidate,
346
+ check,
347
+ identity: scopedObservationImpactIdentity(check, candidate),
348
+ })));
349
+ const mutatedEntries = observationSets.flatMap(({ check, mutated }) => mutated.entries.map((candidate) => ({
350
+ candidate,
351
+ check,
352
+ identity: scopedObservationImpactIdentity(check, candidate),
353
+ })));
354
+ if (!baselineEntries.length || !mutatedEntries.length)
355
+ return machineClosing
356
+ ? "counterfactual_admitted_observation_required"
357
+ : null;
358
+ const baselineIssue = baselineEntries.find(({ candidate }) => candidate.reason || !candidate.observation);
359
+ if (baselineIssue)
360
+ return `counterfactual_baseline_observation_invalid:${baselineIssue.candidate.reason ?? "missing"}`;
361
+ const mutatedIssue = mutatedEntries.find(({ candidate }) => candidate.reason || !candidate.observation);
362
+ if (mutatedIssue)
363
+ return `counterfactual_mutated_observation_invalid:${mutatedIssue.candidate.reason ?? "missing"}`;
364
+ if (processClosure) {
365
+ const baselineClosureIdentity = baselineRaw.host_execution_attestation
366
+ ?.process_runtime_closure_identity ?? null;
367
+ const mutatedClosureIdentity = mutatedRaw.host_execution_attestation?.process_runtime_closure_identity ??
368
+ null;
369
+ if (baselineClosureIdentity !== processClosure.closure_identity ||
370
+ mutatedClosureIdentity !== processClosure.closure_identity ||
371
+ baselineClosureIdentity !== mutatedClosureIdentity)
372
+ return "process_runtime_closure_identity_mismatch";
373
+ }
374
+ const baselineKeys = baselineEntries.map(({ identity }) => identity).sort();
375
+ const mutatedKeys = mutatedEntries.map(({ identity }) => identity).sort();
376
+ if (canonicalValueJson(baselineKeys) !== canonicalValueJson(mutatedKeys))
377
+ return "counterfactual_obligation_universe_changed";
378
+ const baselineByFact = Object.fromEntries(baselineEntries.map(({ candidate, identity }) => [
379
+ identity,
380
+ candidate.observation.value_sha256,
381
+ ]));
382
+ const mutatedByFact = Object.fromEntries(mutatedEntries.map(({ candidate, identity }) => [
383
+ identity,
384
+ candidate.observation.value_sha256,
385
+ ]));
386
+ const expectedAssertions = new Set(entry.control.expected_assertion_failures);
387
+ const preservedAssertions = new Set(entry.control.preserved_assertions);
388
+ const allowedFanoutAssertions = new Set(entry.control.allowed_fanout_assertions ?? []);
389
+ const expectedFactRefs = baselineEntries
390
+ .filter(({ candidate, check }) => check.internal_id === entry.check.internal_id &&
391
+ expectedAssertions.has(candidate.assertion_key))
392
+ .map(({ identity }) => identity);
393
+ if (!expectedFactRefs.length)
394
+ return "counterfactual_expected_fact_observation_missing";
395
+ const preservedFactRefs = baselineEntries
396
+ .filter(({ candidate, check }) => check.internal_id === entry.check.internal_id &&
397
+ preservedAssertions.has(candidate.assertion_key))
398
+ .map(({ identity }) => identity);
399
+ const allowedFanoutFactRefs = baselineEntries
400
+ .filter(({ candidate, check }) => check.internal_id === entry.check.internal_id &&
401
+ allowedFanoutAssertions.has(candidate.assertion_key))
402
+ .map(({ identity }) => identity);
403
+ const targetLive = entry.control.preserved_assertions.every((key) => mutatedResult.assertion_results.some((assertion) => assertion.key === key && assertion.passed));
404
+ let carrierRole = "product";
405
+ if (!processObserved) {
406
+ const carrierRoleConflict = mutationTargets
407
+ .map((target) => classifyMachineObservationCarrierRoleConflict({
408
+ carrier_pattern: target,
409
+ expected_authority_patterns: [
410
+ ...entry.check.verification_inputs,
411
+ ...protectedAuthorityPaths,
412
+ ],
413
+ evidence_role_patterns: [
414
+ ...entry.check.expected_output_paths,
415
+ ...entry.check.artifact_globs,
416
+ ],
417
+ }))
418
+ .find((candidate) => candidate !== null);
419
+ if (carrierRoleConflict)
420
+ return `counterfactual_static_carrier_${carrierRoleConflict}_forbidden`;
421
+ carrierRole = mutationTargets.every((target) => bindingCarrierPaths.some((pattern) => matchesRepoPattern(target, pattern)) &&
422
+ entry.check.input_paths.some((pattern) => matchesRepoPattern(target, pattern)))
423
+ ? "product"
424
+ : "evidence";
425
+ }
426
+ return validateCounterfactualObservationImpact({
427
+ baseline_by_fact: baselineByFact,
428
+ mutated_by_fact: mutatedByFact,
429
+ expected_affected_fact_refs: expectedFactRefs,
430
+ preserved_fact_refs: preservedFactRefs,
431
+ allowed_fanout_fact_refs: allowedFanoutFactRefs,
432
+ target_live: targetLive,
433
+ carrier_role: carrierRole,
434
+ });
435
+ }
436
+ function counterfactualObservationChecks(check, executionUniverse, processObserved) {
437
+ if (!processObserved)
438
+ return [check];
439
+ const checks = new Map([[check.internal_id, check]]);
440
+ for (const candidate of executionUniverse)
441
+ if (candidate.raw_execution_identity === check.raw_execution_identity &&
442
+ (candidate.observation_authorities ?? []).some((authority) => authority.authority !== "external_confirmation"))
443
+ checks.set(candidate.internal_id, candidate);
444
+ return [...checks.values()].sort((left, right) => left.internal_id.localeCompare(right.internal_id));
445
+ }
446
+ function packageObservationsForCheck(check, observations) {
447
+ return observations.filter((candidate) => (check.observation_authorities ?? []).some((authority) => authority.authority === candidate.authority &&
448
+ authority.observation_identity === candidate.observation_identity &&
449
+ authority.assertion_ref === candidate.assertion_ref &&
450
+ authority.obligation_ref === candidate.obligation_ref &&
451
+ authority.method === candidate.method));
452
+ }
453
+ function observationImpactIdentity(candidate) {
454
+ return (candidate.authority_key ??
455
+ `${candidate.assertion_key}\0${candidate.obligation_ref ?? candidate.identity_ref}\0${candidate.method}`);
456
+ }
457
+ function scopedObservationImpactIdentity(check, candidate) {
458
+ return `${check.internal_id}\0${observationImpactIdentity(candidate)}`;
459
+ }
460
+ function compiledAuthorityPaths(compiled) {
461
+ return [
462
+ compiled.contract_file,
463
+ ...Object.keys(compiled.contract_files),
464
+ ...Object.keys(compiled.source_hashes),
465
+ ...compiled.context_snapshot.files,
466
+ ];
467
+ }
187
468
  function playwrightCounterfactualDiagnostic(raw, result, expectedAssertions, rejectionReasons) {
188
469
  const caseIds = result.assertion_results
189
470
  .map((assertion) => /^playwright\.case\.([a-z0-9][a-z0-9-]*)\.passed$/u.exec(assertion.observation)?.[1])
@@ -225,23 +506,20 @@ function counterfactualIntegrityFinding(entry, actual) {
225
506
  next_action: "Repair the referenced implementation carrier or proof so only the designated Assertion value mismatches demonstrate sensitivity.",
226
507
  };
227
508
  }
228
- export function isValidCounterfactualCheckResult(result, expectedAssertionFailures) {
509
+ export function isValidCounterfactualCheckResult(result, expectedAssertionFailures, allowedFanoutAssertions = []) {
229
510
  const expected = [...expectedAssertionFailures].sort();
511
+ const allowed = new Set([...expected, ...allowedFanoutAssertions]);
230
512
  const failedAssertions = result.assertion_results
231
513
  .filter((assertion) => !assertion.passed)
232
514
  .map((assertion) => assertion.key)
233
515
  .sort();
234
516
  return (result.status === "assertion_failed" &&
235
- result.findings.length === expected.length &&
236
- result.findings.filter((finding) => finding.assertion_key).length ===
237
- expected.length &&
238
- result.findings
239
- .filter((finding) => finding.assertion_key)
240
- .every((finding) => expected.some((key) => finding.assertion_key === key)) &&
517
+ result.findings.length === failedAssertions.length &&
518
+ result.findings.every((finding) => Boolean(finding.assertion_key) && allowed.has(finding.assertion_key)) &&
241
519
  result.findings.every((finding) => finding.code === "assertion_value_mismatch") &&
242
520
  result.assertion_results
243
521
  .filter((assertion) => !assertion.passed)
244
522
  .every((assertion) => assertion.status === "assertion_value_mismatch") &&
245
- failedAssertions.length === expected.length &&
246
- failedAssertions.every((item, index) => item === expected[index]));
523
+ expected.every((item) => failedAssertions.includes(item)) &&
524
+ failedAssertions.every((item) => allowed.has(item)));
247
525
  }
@@ -0,0 +1,16 @@
1
+ export interface ExactDigestComparisonInput {
2
+ identity: Readonly<Record<string, unknown>>;
3
+ actual_value_sha256: string;
4
+ expected_value_sha256: string;
5
+ comparator: string;
6
+ mode: "exact" | "tolerance";
7
+ parameters_sha256: string;
8
+ tolerance_sha256: string | null;
9
+ mask_sha256: string | null;
10
+ }
11
+ export interface ExactDigestComparisonResult {
12
+ passed: boolean;
13
+ result_sha256: string;
14
+ }
15
+ export declare function evaluateExactDigestComparison(input: ExactDigestComparisonInput): ExactDigestComparisonResult;
16
+ export declare function exactComparisonResultIdentity(material: Readonly<Record<string, unknown>>): string;
@@ -0,0 +1,28 @@
1
+ import { canonicalValueJson, sha256Hex } from "./strict-codec.js";
2
+ export function evaluateExactDigestComparison(input) {
3
+ if (input.comparator !== "exact_value" ||
4
+ input.mode !== "exact" ||
5
+ input.tolerance_sha256 !== null ||
6
+ input.mask_sha256 !== null)
7
+ throw new Error("exact_digest_comparison_authority_invalid");
8
+ const { actual_value_sha256, expected_value_sha256 } = input;
9
+ const passed = actual_value_sha256 === expected_value_sha256;
10
+ const material = {
11
+ identity: input.identity,
12
+ actual_value_sha256: input.actual_value_sha256,
13
+ expected_value_sha256: input.expected_value_sha256,
14
+ comparator: input.comparator,
15
+ mode: input.mode,
16
+ parameters_sha256: input.parameters_sha256,
17
+ tolerance_sha256: input.tolerance_sha256,
18
+ mask_sha256: input.mask_sha256,
19
+ passed,
20
+ };
21
+ return {
22
+ passed,
23
+ result_sha256: exactComparisonResultIdentity(material),
24
+ };
25
+ }
26
+ export function exactComparisonResultIdentity(material) {
27
+ return sha256Hex(canonicalValueJson(material));
28
+ }
@@ -0,0 +1,24 @@
1
+ import type { CheckRunnerExecutionContextV2, CompiledCheckV2, RawCommandExecutionV2, WorkspaceManifestV2 } from "./long-task-delivery-types.js";
2
+ export interface PreparedExecutionObservationGroupV2 {
3
+ readonly execution_root: string;
4
+ readonly runner_context: CheckRunnerExecutionContextV2;
5
+ finalize(raw: RawCommandExecutionV2): Promise<RawCommandExecutionV2>;
6
+ dispose(): Promise<void>;
7
+ }
8
+ /**
9
+ * Freezes every selected Raw Execution group's observation inputs before the
10
+ * caller is allowed to start any runner. Keeping this as one owner prevents a
11
+ * prior execution from priming a later group's supposedly pre-run carrier.
12
+ */
13
+ export declare function prepareExecutionObservationUniverse(input: {
14
+ groups: readonly (readonly CompiledCheckV2[])[];
15
+ snapshot_root: string;
16
+ workspace_manifest: WorkspaceManifestV2;
17
+ protected_authority_paths?: readonly string[];
18
+ }): Promise<PreparedExecutionObservationGroupV2[]>;
19
+ export declare function prepareExecutionObservationGroup(input: {
20
+ checks: readonly CompiledCheckV2[];
21
+ snapshot_root: string;
22
+ workspace_manifest: WorkspaceManifestV2;
23
+ protected_authority_paths?: readonly string[];
24
+ }): Promise<PreparedExecutionObservationGroupV2>;