project-tiny-context-harness 0.8.17 → 0.11.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 (488) hide show
  1. package/README.md +93 -30
  2. package/assets/README.md +158 -44
  3. package/assets/README.zh-CN.md +88 -29
  4. package/assets/agents/AGENTS_CORE.md +2 -2
  5. package/assets/context_templates/context.toml +6 -1
  6. package/assets/runtime/windows-job-supervisor/formal_process_supervisor_native_helpers.cs +301 -0
  7. package/assets/runtime/windows-job-supervisor/formal_process_supervisor_native_run.cs +197 -0
  8. package/assets/runtime/windows-job-supervisor/formal_process_supervisor_native_types.cs +215 -0
  9. package/assets/runtime/windows-job-supervisor/windows_job_process_supervisor.ps1 +117 -0
  10. package/assets/skills/design-resource-authoring/SKILL.md +6 -3
  11. package/assets/skills/design-resource-authoring/references/authority-delta-assessment.md +52 -0
  12. package/assets/skills/design-resource-authoring/references/downstream-handoff.md +5 -1
  13. package/assets/skills/design-system-authoring/SKILL.md +23 -17
  14. package/assets/skills/design-system-authoring/references/authority-adoption.md +19 -9
  15. package/assets/skills/design-system-authoring/references/open-design-design-system-provider.md +4 -0
  16. package/assets/skills/long-task-workflow/SKILL.md +6 -6
  17. package/assets/skills/long-task-workflow/references/authority-lifecycle.md +10 -4
  18. package/assets/skills/long-task-workflow/references/contract-authoring.md +5 -5
  19. package/assets/skills/long-task-workflow/references/evidence-design.md +14 -3
  20. package/assets/skills/long-task-workflow/references/source-authoring.md +11 -8
  21. package/assets/tools/context_rules.json +53 -0
  22. package/assets/tools/validate_context.py +302 -77
  23. package/dist/cli.js +2 -1
  24. package/dist/commands/context-create.d.ts +1 -0
  25. package/dist/commands/context-create.js +90 -0
  26. package/dist/commands/context-inspect.d.ts +1 -0
  27. package/dist/commands/context-inspect.js +98 -0
  28. package/dist/commands/context-move.d.ts +1 -0
  29. package/dist/commands/context-move.js +78 -0
  30. package/dist/commands/context-register.d.ts +1 -0
  31. package/dist/commands/context-register.js +110 -0
  32. package/dist/commands/context-transaction.d.ts +1 -0
  33. package/dist/commands/context-transaction.js +84 -0
  34. package/dist/commands/context.d.ts +1 -0
  35. package/dist/commands/context.js +36 -0
  36. package/dist/commands/design-authority-delta.d.ts +1 -0
  37. package/dist/commands/design-authority-delta.js +53 -0
  38. package/dist/commands/design-authority.d.ts +1 -0
  39. package/dist/commands/design-authority.js +104 -0
  40. package/dist/commands/design-resource.js +8 -1
  41. package/dist/commands/doctor.d.ts +1 -1
  42. package/dist/commands/doctor.js +61 -3
  43. package/dist/commands/index.js +19 -2
  44. package/dist/commands/long-task-authoring.js +20 -2
  45. package/dist/commands/long-task-workdir.d.ts +2 -0
  46. package/dist/commands/long-task-workdir.js +23 -0
  47. package/dist/commands/long-task.js +75 -6
  48. package/dist/commands/route.d.ts +15 -0
  49. package/dist/commands/route.js +142 -0
  50. package/dist/index.d.ts +3 -13
  51. package/dist/index.js +3 -12
  52. package/dist/lib/cli-exit.d.ts +14 -0
  53. package/dist/lib/cli-exit.js +19 -0
  54. package/dist/lib/context-catalog/catalog-default-footprint.d.ts +3 -0
  55. package/dist/lib/context-catalog/catalog-default-footprint.js +53 -0
  56. package/dist/lib/context-catalog/catalog-diagnostics.d.ts +9 -0
  57. package/dist/lib/context-catalog/catalog-diagnostics.js +34 -0
  58. package/dist/lib/context-catalog/catalog-discovery.d.ts +7 -0
  59. package/dist/lib/context-catalog/catalog-discovery.js +81 -0
  60. package/dist/lib/context-catalog/catalog-load.d.ts +8 -0
  61. package/dist/lib/context-catalog/catalog-load.js +187 -0
  62. package/dist/lib/context-catalog/catalog-path-validation.d.ts +7 -0
  63. package/dist/lib/context-catalog/catalog-path-validation.js +62 -0
  64. package/dist/lib/context-catalog/catalog-paths.d.ts +11 -0
  65. package/dist/lib/context-catalog/catalog-paths.js +41 -0
  66. package/dist/lib/context-catalog/catalog-portable-contract.d.ts +15 -0
  67. package/dist/lib/context-catalog/catalog-portable-contract.js +68 -0
  68. package/dist/lib/context-catalog/catalog-staged-path-safety.d.ts +1 -0
  69. package/dist/lib/context-catalog/catalog-staged-path-safety.js +36 -0
  70. package/dist/lib/context-catalog/catalog-types.d.ts +40 -0
  71. package/dist/lib/context-catalog/catalog-types.js +1 -0
  72. package/dist/lib/context-catalog/catalog-validation.d.ts +9 -0
  73. package/dist/lib/context-catalog/catalog-validation.js +148 -0
  74. package/dist/lib/context-create/context-create-path.d.ts +2 -0
  75. package/dist/lib/context-create/context-create-path.js +30 -0
  76. package/dist/lib/context-create/context-create-template.d.ts +2 -0
  77. package/dist/lib/context-create/context-create-template.js +95 -0
  78. package/dist/lib/context-create/context-create-types.d.ts +28 -0
  79. package/dist/lib/context-create/context-create-types.js +1 -0
  80. package/dist/lib/context-create/context-create-write.d.ts +1 -0
  81. package/dist/lib/context-create/context-create-write.js +85 -0
  82. package/dist/lib/context-create/context-create.d.ts +2 -0
  83. package/dist/lib/context-create/context-create.js +84 -0
  84. package/dist/lib/context-default-footprint.d.ts +2 -3
  85. package/dist/lib/context-default-footprint.js +49 -57
  86. package/dist/lib/context-doctor/context-doctor-types.d.ts +16 -0
  87. package/dist/lib/context-doctor/context-doctor-types.js +15 -0
  88. package/dist/lib/context-doctor/context-doctor.d.ts +2 -0
  89. package/dist/lib/context-doctor/context-doctor.js +130 -0
  90. package/dist/lib/context-graph-snapshot.d.ts +5 -0
  91. package/dist/lib/context-graph-snapshot.js +46 -25
  92. package/dist/lib/context-inspect/context-inspect-projection.d.ts +9 -0
  93. package/dist/lib/context-inspect/context-inspect-projection.js +49 -0
  94. package/dist/lib/context-inspect/context-inspect-render.d.ts +2 -0
  95. package/dist/lib/context-inspect/context-inspect-render.js +29 -0
  96. package/dist/lib/context-inspect/context-inspect-types.d.ts +43 -0
  97. package/dist/lib/context-inspect/context-inspect-types.js +1 -0
  98. package/dist/lib/context-inspect/context-inspect.d.ts +2 -0
  99. package/dist/lib/context-inspect/context-inspect.js +104 -0
  100. package/dist/lib/context-manifest-schema.d.ts +1 -1
  101. package/dist/lib/context-manifest-schema.js +4 -20
  102. package/dist/lib/context-markdown/context-markdown-analysis.d.ts +15 -0
  103. package/dist/lib/context-markdown/context-markdown-analysis.js +245 -0
  104. package/dist/lib/context-markdown/context-markdown-extract.d.ts +7 -0
  105. package/dist/lib/context-markdown/context-markdown-extract.js +114 -0
  106. package/dist/lib/context-markdown/context-markdown-types.d.ts +57 -0
  107. package/dist/lib/context-markdown/context-markdown-types.js +1 -0
  108. package/dist/lib/context-move/context-move-input.d.ts +8 -0
  109. package/dist/lib/context-move/context-move-input.js +17 -0
  110. package/dist/lib/context-move/context-move-literal-scan.d.ts +20 -0
  111. package/dist/lib/context-move/context-move-literal-scan.js +213 -0
  112. package/dist/lib/context-move/context-move-live-validation.d.ts +3 -0
  113. package/dist/lib/context-move/context-move-live-validation.js +56 -0
  114. package/dist/lib/context-move/context-move-markdown-plan.d.ts +22 -0
  115. package/dist/lib/context-move/context-move-markdown-plan.js +39 -0
  116. package/dist/lib/context-move/context-move-projection.d.ts +3 -0
  117. package/dist/lib/context-move/context-move-projection.js +11 -0
  118. package/dist/lib/context-move/context-move-reference-validation.d.ts +11 -0
  119. package/dist/lib/context-move/context-move-reference-validation.js +64 -0
  120. package/dist/lib/context-move/context-move-render.d.ts +2 -0
  121. package/dist/lib/context-move/context-move-render.js +24 -0
  122. package/dist/lib/context-move/context-move-support.d.ts +10 -0
  123. package/dist/lib/context-move/context-move-support.js +88 -0
  124. package/dist/lib/context-move/context-move-transaction-plan.d.ts +24 -0
  125. package/dist/lib/context-move/context-move-transaction-plan.js +108 -0
  126. package/dist/lib/context-move/context-move-types.d.ts +74 -0
  127. package/dist/lib/context-move/context-move-types.js +1 -0
  128. package/dist/lib/context-move/context-move.d.ts +8 -0
  129. package/dist/lib/context-move/context-move.js +180 -0
  130. package/dist/lib/context-mutation/manifest-lossless-patch.d.ts +28 -0
  131. package/dist/lib/context-mutation/manifest-lossless-patch.js +208 -0
  132. package/dist/lib/context-mutation/markdown-link-patch.d.ts +34 -0
  133. package/dist/lib/context-mutation/markdown-link-patch.js +143 -0
  134. package/dist/lib/context-mutation/markdown-link-spans.d.ts +10 -0
  135. package/dist/lib/context-mutation/markdown-link-spans.js +179 -0
  136. package/dist/lib/context-mutation/mutation-cas.d.ts +13 -0
  137. package/dist/lib/context-mutation/mutation-cas.js +365 -0
  138. package/dist/lib/context-mutation/mutation-command-support.d.ts +12 -0
  139. package/dist/lib/context-mutation/mutation-command-support.js +57 -0
  140. package/dist/lib/context-mutation/mutation-commit.d.ts +12 -0
  141. package/dist/lib/context-mutation/mutation-commit.js +89 -0
  142. package/dist/lib/context-mutation/mutation-directories.d.ts +5 -0
  143. package/dist/lib/context-mutation/mutation-directories.js +56 -0
  144. package/dist/lib/context-mutation/mutation-file-state.d.ts +14 -0
  145. package/dist/lib/context-mutation/mutation-file-state.js +137 -0
  146. package/dist/lib/context-mutation/mutation-journal-file-validation.d.ts +1 -0
  147. package/dist/lib/context-mutation/mutation-journal-file-validation.js +106 -0
  148. package/dist/lib/context-mutation/mutation-journal-io.d.ts +5 -0
  149. package/dist/lib/context-mutation/mutation-journal-io.js +55 -0
  150. package/dist/lib/context-mutation/mutation-journal-storage.d.ts +18 -0
  151. package/dist/lib/context-mutation/mutation-journal-storage.js +283 -0
  152. package/dist/lib/context-mutation/mutation-journal-validation-support.d.ts +16 -0
  153. package/dist/lib/context-mutation/mutation-journal-validation-support.js +140 -0
  154. package/dist/lib/context-mutation/mutation-journal-validation.d.ts +3 -0
  155. package/dist/lib/context-mutation/mutation-journal-validation.js +177 -0
  156. package/dist/lib/context-mutation/mutation-journal.d.ts +8 -0
  157. package/dist/lib/context-mutation/mutation-journal.js +111 -0
  158. package/dist/lib/context-mutation/mutation-live-validation.d.ts +3 -0
  159. package/dist/lib/context-mutation/mutation-live-validation.js +51 -0
  160. package/dist/lib/context-mutation/mutation-long-task-guard.d.ts +6 -0
  161. package/dist/lib/context-mutation/mutation-long-task-guard.js +57 -0
  162. package/dist/lib/context-mutation/mutation-recovery.d.ts +4 -0
  163. package/dist/lib/context-mutation/mutation-recovery.js +189 -0
  164. package/dist/lib/context-mutation/mutation-staged-fs.d.ts +5 -0
  165. package/dist/lib/context-mutation/mutation-staged-fs.js +56 -0
  166. package/dist/lib/context-mutation/mutation-types.d.ts +103 -0
  167. package/dist/lib/context-mutation/mutation-types.js +1 -0
  168. package/dist/lib/context-register/context-register-input.d.ts +11 -0
  169. package/dist/lib/context-register/context-register-input.js +43 -0
  170. package/dist/lib/context-register/context-register-render.d.ts +2 -0
  171. package/dist/lib/context-register/context-register-render.js +21 -0
  172. package/dist/lib/context-register/context-register-support.d.ts +6 -0
  173. package/dist/lib/context-register/context-register-support.js +46 -0
  174. package/dist/lib/context-register/context-register-types.d.ts +46 -0
  175. package/dist/lib/context-register/context-register-types.js +1 -0
  176. package/dist/lib/context-register/context-register.d.ts +8 -0
  177. package/dist/lib/context-register/context-register.js +155 -0
  178. package/dist/lib/context-router/context-route-budget.d.ts +15 -0
  179. package/dist/lib/context-router/context-route-budget.js +14 -0
  180. package/dist/lib/context-router/context-route-candidates.d.ts +15 -0
  181. package/dist/lib/context-router/context-route-candidates.js +112 -0
  182. package/dist/lib/context-router/context-route-order.d.ts +6 -0
  183. package/dist/lib/context-router/context-route-order.js +53 -0
  184. package/dist/lib/context-router/context-route-paths.d.ts +16 -0
  185. package/dist/lib/context-router/context-route-paths.js +109 -0
  186. package/dist/lib/context-router/context-route-render.d.ts +2 -0
  187. package/dist/lib/context-router/context-route-render.js +32 -0
  188. package/dist/lib/context-router/context-route-scan.d.ts +18 -0
  189. package/dist/lib/context-router/context-route-scan.js +156 -0
  190. package/dist/lib/context-router/context-route-selection.d.ts +16 -0
  191. package/dist/lib/context-router/context-route-selection.js +72 -0
  192. package/dist/lib/context-router/context-route-terms.d.ts +13 -0
  193. package/dist/lib/context-router/context-route-terms.js +202 -0
  194. package/dist/lib/context-router/context-route-types.d.ts +101 -0
  195. package/dist/lib/context-router/context-route-types.js +1 -0
  196. package/dist/lib/context-router/context-route.d.ts +2 -0
  197. package/dist/lib/context-router/context-route.js +127 -0
  198. package/dist/lib/context-units-migration.d.ts +13 -0
  199. package/dist/lib/context-units-migration.js +217 -0
  200. package/dist/lib/design-authority-binding.d.ts +7 -0
  201. package/dist/lib/design-authority-binding.js +96 -0
  202. package/dist/lib/design-authority-closure.d.ts +3 -0
  203. package/dist/lib/design-authority-closure.js +201 -0
  204. package/dist/lib/design-authority-delta-codec-primitives.d.ts +10 -0
  205. package/dist/lib/design-authority-delta-codec-primitives.js +58 -0
  206. package/dist/lib/design-authority-delta-codec.d.ts +2 -0
  207. package/dist/lib/design-authority-delta-codec.js +193 -0
  208. package/dist/lib/design-authority-delta-types.d.ts +65 -0
  209. package/dist/lib/design-authority-delta-types.js +6 -0
  210. package/dist/lib/design-authority-delta-validation.d.ts +2 -0
  211. package/dist/lib/design-authority-delta-validation.js +16 -0
  212. package/dist/lib/design-authority-digest.d.ts +8 -0
  213. package/dist/lib/design-authority-digest.js +36 -0
  214. package/dist/lib/design-authority-files.d.ts +9 -0
  215. package/dist/lib/design-authority-files.js +62 -0
  216. package/dist/lib/design-authority-format.d.ts +2 -0
  217. package/dist/lib/design-authority-format.js +93 -0
  218. package/dist/lib/design-authority-links.d.ts +10 -0
  219. package/dist/lib/design-authority-links.js +137 -0
  220. package/dist/lib/design-authority-manifest.d.ts +4 -0
  221. package/dist/lib/design-authority-manifest.js +144 -0
  222. package/dist/lib/design-authority-tokens.d.ts +9 -0
  223. package/dist/lib/design-authority-tokens.js +45 -0
  224. package/dist/lib/design-authority-types.d.ts +80 -0
  225. package/dist/lib/design-authority-types.js +23 -0
  226. package/dist/lib/design-md-tool-adapter.d.ts +9 -0
  227. package/dist/lib/design-md-tool-adapter.js +152 -0
  228. package/dist/lib/design-md-tool-normalization.d.ts +7 -0
  229. package/dist/lib/design-md-tool-normalization.js +78 -0
  230. package/dist/lib/design-md-tool-types.d.ts +99 -0
  231. package/dist/lib/design-md-tool-types.js +8 -0
  232. package/dist/lib/design-resource-handoff-input-types.d.ts +1 -1
  233. package/dist/lib/design-resource-handoff-manifest-projection.js +3 -0
  234. package/dist/lib/design-resource-handoff-shape.js +14 -2
  235. package/dist/lib/design-resource-handoff-types.d.ts +3 -0
  236. package/dist/lib/design-resource-handoff-validation.js +16 -4
  237. package/dist/lib/design-resource-implementation-feasibility-validation-support.js +1 -1
  238. package/dist/lib/design-resource-recovery-current.js +22 -0
  239. package/dist/lib/design-resource-recovery-shape.js +64 -7
  240. package/dist/lib/design-resource-recovery-types.d.ts +4 -1
  241. package/dist/lib/design-resource-symbolic-fact-shape.js +7 -1
  242. package/dist/lib/design-resource-symbolic-fact-types.d.ts +3 -0
  243. package/dist/lib/design-resource-symbolic-fact-validation.js +15 -3
  244. package/dist/lib/doctor.d.ts +2 -1
  245. package/dist/lib/doctor.js +29 -1
  246. package/dist/lib/fs.js +1 -1
  247. package/dist/lib/long-task-acceptance-reachability-claims.d.ts +2 -0
  248. package/dist/lib/long-task-acceptance-reachability-claims.js +279 -0
  249. package/dist/lib/long-task-acceptance-reachability-design.d.ts +2 -0
  250. package/dist/lib/long-task-acceptance-reachability-design.js +96 -0
  251. package/dist/lib/long-task-acceptance-reachability-external.d.ts +9 -0
  252. package/dist/lib/long-task-acceptance-reachability-external.js +123 -0
  253. package/dist/lib/long-task-acceptance-reachability-helpers.d.ts +64 -0
  254. package/dist/lib/long-task-acceptance-reachability-helpers.js +473 -0
  255. package/dist/lib/long-task-acceptance-reachability-semantic.d.ts +2 -0
  256. package/dist/lib/long-task-acceptance-reachability-semantic.js +122 -0
  257. package/dist/lib/long-task-acceptance-reachability-types.d.ts +91 -0
  258. package/dist/lib/long-task-acceptance-reachability-types.js +1 -0
  259. package/dist/lib/long-task-acceptance-reachability.d.ts +4 -0
  260. package/dist/lib/long-task-acceptance-reachability.js +115 -0
  261. package/dist/lib/long-task-activation-validation.d.ts +6 -0
  262. package/dist/lib/long-task-activation-validation.js +72 -69
  263. package/dist/lib/long-task-active-authority-lock-context.d.ts +4 -0
  264. package/dist/lib/long-task-active-authority-lock-context.js +29 -0
  265. package/dist/lib/long-task-applicability-identity.d.ts +25 -0
  266. package/dist/lib/long-task-applicability-identity.js +60 -0
  267. package/dist/lib/long-task-authoring-preflight-diagnostics.js +8 -0
  268. package/dist/lib/long-task-authoring-preflight-types.d.ts +2 -0
  269. package/dist/lib/long-task-authoring-preflight-types.js +9 -0
  270. package/dist/lib/long-task-authoring-preflight.js +18 -2
  271. package/dist/lib/long-task-authority-material-diff.js +4 -0
  272. package/dist/lib/long-task-authority-materials.js +19 -0
  273. package/dist/lib/long-task-authority-policy.d.ts +3 -0
  274. package/dist/lib/long-task-authority-policy.js +3 -0
  275. package/dist/lib/long-task-authority-revision-details.js +2 -1
  276. package/dist/lib/long-task-authority-types.d.ts +2 -0
  277. package/dist/lib/long-task-authority.js +2 -0
  278. package/dist/lib/long-task-check-shape.js +6 -1
  279. package/dist/lib/long-task-claim-definitions.js +1 -3
  280. package/dist/lib/long-task-claim-semantic-proof-floor.d.ts +3 -0
  281. package/dist/lib/long-task-claim-semantic-proof-floor.js +78 -0
  282. package/dist/lib/long-task-claims.d.ts +0 -18
  283. package/dist/lib/long-task-claims.js +15 -14
  284. package/dist/lib/long-task-command-process.js +3 -0
  285. package/dist/lib/long-task-compact-authoring.js +3 -0
  286. package/dist/lib/long-task-compact-projections.js +10 -0
  287. package/dist/lib/long-task-complete-delivery-evidence-types.d.ts +38 -0
  288. package/dist/lib/long-task-complete-delivery-evidence-types.js +1 -0
  289. package/dist/lib/long-task-completion-types.d.ts +109 -0
  290. package/dist/lib/long-task-completion-types.js +1 -0
  291. package/dist/lib/long-task-conformance-policy.d.ts +2 -1
  292. package/dist/lib/long-task-conformance-policy.js +11 -4
  293. package/dist/lib/long-task-context-authority-topology.js +6 -4
  294. package/dist/lib/long-task-contract-types.d.ts +52 -1
  295. package/dist/lib/long-task-counterfactual-sandbox.d.ts +7 -1
  296. package/dist/lib/long-task-counterfactual-sandbox.js +86 -6
  297. package/dist/lib/long-task-delivery-compiler-preflight.d.ts +24 -0
  298. package/dist/lib/long-task-delivery-compiler-preflight.js +32 -0
  299. package/dist/lib/long-task-delivery-compiler.d.ts +1 -0
  300. package/dist/lib/long-task-delivery-compiler.js +59 -44
  301. package/dist/lib/long-task-delivery-parser.d.ts +3 -0
  302. package/dist/lib/long-task-delivery-parser.js +26 -8
  303. package/dist/lib/long-task-delivery-types.d.ts +2 -0
  304. package/dist/lib/long-task-delivery-types.js +2 -0
  305. package/dist/lib/long-task-delivery-validation.d.ts +6 -1
  306. package/dist/lib/long-task-delivery-validation.js +19 -4
  307. package/dist/lib/long-task-design-feasibility-binding.d.ts +1 -0
  308. package/dist/lib/long-task-design-feasibility-binding.js +3 -3
  309. package/dist/lib/long-task-design-feasibility-source-closure.js +11 -2
  310. package/dist/lib/long-task-design-obligation.d.ts +50 -0
  311. package/dist/lib/long-task-design-obligation.js +99 -0
  312. package/dist/lib/long-task-design-resource-handoff.d.ts +3 -1
  313. package/dist/lib/long-task-design-resource-handoff.js +36 -12
  314. package/dist/lib/long-task-design-resource-method-binding.js +12 -0
  315. package/dist/lib/long-task-effective-external-takeover.d.ts +15 -0
  316. package/dist/lib/long-task-effective-external-takeover.js +109 -0
  317. package/dist/lib/long-task-effective-external-ui-takeover.d.ts +5 -0
  318. package/dist/lib/long-task-effective-external-ui-takeover.js +117 -0
  319. package/dist/lib/long-task-evidence-capability-codec.js +91 -0
  320. package/dist/lib/long-task-evidence-capability-runtime.js +62 -14
  321. package/dist/lib/long-task-evidence-capability-types.d.ts +3 -2
  322. package/dist/lib/long-task-evidence-v2.d.ts +6 -1
  323. package/dist/lib/long-task-evidence-v2.js +253 -170
  324. package/dist/lib/long-task-execution-observation.d.ts +7 -0
  325. package/dist/lib/long-task-execution-observation.js +21 -4
  326. package/dist/lib/long-task-expected-authority.d.ts +4 -0
  327. package/dist/lib/long-task-expected-authority.js +126 -0
  328. package/dist/lib/long-task-external-confirmation-artifacts.d.ts +9 -0
  329. package/dist/lib/long-task-external-confirmation-artifacts.js +138 -0
  330. package/dist/lib/long-task-external-confirmation-attestation.d.ts +20 -0
  331. package/dist/lib/long-task-external-confirmation-attestation.js +115 -0
  332. package/dist/lib/long-task-external-confirmation-challenge.d.ts +23 -0
  333. package/dist/lib/long-task-external-confirmation-challenge.js +164 -0
  334. package/dist/lib/long-task-external-confirmation-context.d.ts +14 -0
  335. package/dist/lib/long-task-external-confirmation-context.js +53 -0
  336. package/dist/lib/long-task-external-confirmation-evaluation.d.ts +11 -0
  337. package/dist/lib/long-task-external-confirmation-evaluation.js +454 -0
  338. package/dist/lib/long-task-external-confirmation-expected.d.ts +8 -0
  339. package/dist/lib/long-task-external-confirmation-expected.js +200 -0
  340. package/dist/lib/long-task-external-confirmation-identity.d.ts +10 -0
  341. package/dist/lib/long-task-external-confirmation-identity.js +77 -0
  342. package/dist/lib/long-task-external-confirmation-plan.d.ts +25 -0
  343. package/dist/lib/long-task-external-confirmation-plan.js +148 -0
  344. package/dist/lib/long-task-external-confirmation-preparation.d.ts +4 -0
  345. package/dist/lib/long-task-external-confirmation-preparation.js +100 -0
  346. package/dist/lib/long-task-external-confirmation-shape.d.ts +8 -0
  347. package/dist/lib/long-task-external-confirmation-shape.js +387 -0
  348. package/dist/lib/long-task-external-confirmation-state.d.ts +10 -0
  349. package/dist/lib/long-task-external-confirmation-state.js +109 -0
  350. package/dist/lib/long-task-external-confirmation-types.d.ts +195 -0
  351. package/dist/lib/long-task-external-confirmation-types.js +1 -0
  352. package/dist/lib/long-task-final-integrity.d.ts +2 -0
  353. package/dist/lib/long-task-final-integrity.js +21 -10
  354. package/dist/lib/long-task-final-v2.d.ts +7 -2
  355. package/dist/lib/long-task-final-v2.js +179 -55
  356. package/dist/lib/long-task-finalization-identity.d.ts +27 -0
  357. package/dist/lib/long-task-finalization-identity.js +58 -0
  358. package/dist/lib/long-task-finding-context.d.ts +1 -1
  359. package/dist/lib/long-task-finding-context.js +139 -13
  360. package/dist/lib/long-task-freshness.d.ts +27 -0
  361. package/dist/lib/long-task-freshness.js +128 -5
  362. package/dist/lib/long-task-git.js +3 -3
  363. package/dist/lib/long-task-material-input-closure.d.ts +3 -0
  364. package/dist/lib/long-task-material-input-closure.js +92 -0
  365. package/dist/lib/long-task-obligation-authority-resolution.d.ts +12 -0
  366. package/dist/lib/long-task-obligation-authority-resolution.js +57 -0
  367. package/dist/lib/long-task-obligation-semantic-identity.d.ts +16 -0
  368. package/dist/lib/long-task-obligation-semantic-identity.js +116 -0
  369. package/dist/lib/long-task-observation-authority.d.ts +11 -0
  370. package/dist/lib/long-task-observation-authority.js +137 -6
  371. package/dist/lib/long-task-process-table.d.ts +2 -5
  372. package/dist/lib/long-task-process-table.js +21 -53
  373. package/dist/lib/long-task-process-tree.d.ts +0 -1
  374. package/dist/lib/long-task-process-tree.js +24 -54
  375. package/dist/lib/long-task-proof-adequacy.d.ts +12 -0
  376. package/dist/lib/long-task-proof-adequacy.js +57 -0
  377. package/dist/lib/long-task-proof-capability-floor.d.ts +6 -0
  378. package/dist/lib/long-task-proof-capability-floor.js +137 -0
  379. package/dist/lib/long-task-repair-frontier-checks.d.ts +8 -0
  380. package/dist/lib/long-task-repair-frontier-checks.js +93 -0
  381. package/dist/lib/long-task-repair-frontier-groups.d.ts +2 -0
  382. package/dist/lib/long-task-repair-frontier-groups.js +64 -0
  383. package/dist/lib/long-task-repair-frontier-utils.d.ts +6 -0
  384. package/dist/lib/long-task-repair-frontier-utils.js +27 -0
  385. package/dist/lib/long-task-repair-frontier.d.ts +14 -0
  386. package/dist/lib/long-task-repair-frontier.js +132 -0
  387. package/dist/lib/long-task-risk.d.ts +3 -2
  388. package/dist/lib/long-task-risk.js +73 -24
  389. package/dist/lib/long-task-root-shape.js +148 -8
  390. package/dist/lib/long-task-runner-freeze.d.ts +2 -1
  391. package/dist/lib/long-task-runner-freeze.js +23 -8
  392. package/dist/lib/long-task-runtime-types.d.ts +34 -40
  393. package/dist/lib/long-task-semantic-assurance-policy.js +2 -11
  394. package/dist/lib/long-task-semantic-contract-types.d.ts +2 -1
  395. package/dist/lib/long-task-semantic-drift-migration.js +48 -2
  396. package/dist/lib/long-task-semantic-fact-binding-types.d.ts +20 -0
  397. package/dist/lib/long-task-semantic-fact-closure.d.ts +5 -1
  398. package/dist/lib/long-task-semantic-fact-closure.js +33 -5
  399. package/dist/lib/long-task-semantic-fact-contract-closure.js +176 -1
  400. package/dist/lib/long-task-semantic-fact-contract-proofs.js +18 -1
  401. package/dist/lib/long-task-semantic-fact-input-closure.d.ts +16 -2
  402. package/dist/lib/long-task-semantic-fact-input-closure.js +138 -15
  403. package/dist/lib/long-task-semantic-fact-provenance-closure.js +1 -1
  404. package/dist/lib/long-task-semantic-fact-shape.d.ts +2 -1
  405. package/dist/lib/long-task-semantic-fact-shape.js +35 -1
  406. package/dist/lib/long-task-semantic-proof-adequacy.d.ts +2 -0
  407. package/dist/lib/long-task-semantic-proof-adequacy.js +19 -0
  408. package/dist/lib/long-task-semantic-proof-profile.d.ts +5 -0
  409. package/dist/lib/long-task-semantic-proof-profile.js +187 -0
  410. package/dist/lib/long-task-shape-primitives.d.ts +1 -1
  411. package/dist/lib/long-task-shape-primitives.js +5 -0
  412. package/dist/lib/long-task-source-anchors.d.ts +10 -0
  413. package/dist/lib/long-task-source-anchors.js +102 -0
  414. package/dist/lib/long-task-source-authority-types.d.ts +46 -0
  415. package/dist/lib/long-task-source-claim-validation.js +36 -0
  416. package/dist/lib/long-task-source-conservation-facts.d.ts +8 -0
  417. package/dist/lib/long-task-source-conservation-facts.js +57 -0
  418. package/dist/lib/long-task-source-conservation-types.d.ts +34 -0
  419. package/dist/lib/long-task-source-conservation-types.js +1 -0
  420. package/dist/lib/long-task-source-conservation.d.ts +7 -0
  421. package/dist/lib/long-task-source-conservation.js +110 -0
  422. package/dist/lib/long-task-source-fragments.d.ts +6 -0
  423. package/dist/lib/long-task-source-fragments.js +219 -0
  424. package/dist/lib/long-task-source-projection-resolution.d.ts +5 -0
  425. package/dist/lib/long-task-source-projection-resolution.js +57 -0
  426. package/dist/lib/long-task-source-projection-validation.d.ts +17 -0
  427. package/dist/lib/long-task-source-projection-validation.js +154 -0
  428. package/dist/lib/long-task-source-shape.js +14 -6
  429. package/dist/lib/long-task-source-supersession.d.ts +5 -0
  430. package/dist/lib/long-task-source-supersession.js +138 -0
  431. package/dist/lib/long-task-stage-policy.d.ts +7 -2
  432. package/dist/lib/long-task-stage-policy.js +67 -23
  433. package/dist/lib/long-task-state.d.ts +18 -4
  434. package/dist/lib/long-task-state.js +319 -33
  435. package/dist/lib/long-task-static-observation-freeze.js +4 -3
  436. package/dist/lib/long-task-status-projection.d.ts +3 -1
  437. package/dist/lib/long-task-status-projection.js +44 -13
  438. package/dist/lib/long-task-status-v2.d.ts +10 -6
  439. package/dist/lib/long-task-status-v2.js +70 -58
  440. package/dist/lib/long-task-target-policy.d.ts +8 -3
  441. package/dist/lib/long-task-target-policy.js +40 -9
  442. package/dist/lib/long-task-terminal-finalization.d.ts +12 -0
  443. package/dist/lib/long-task-terminal-finalization.js +190 -0
  444. package/dist/lib/long-task-ui-design-policy.js +15 -4
  445. package/dist/lib/long-task-verifier-counterfactuals.d.ts +11 -0
  446. package/dist/lib/long-task-verifier-counterfactuals.js +96 -0
  447. package/dist/lib/long-task-verifier-execution.d.ts +9 -0
  448. package/dist/lib/long-task-verifier-execution.js +67 -0
  449. package/dist/lib/long-task-verifier-identity.js +16 -5
  450. package/dist/lib/long-task-verifier-v2.js +52 -65
  451. package/dist/lib/long-task-windows-job-supervisor-helper.d.ts +1 -0
  452. package/dist/lib/long-task-windows-job-supervisor-helper.js +104 -0
  453. package/dist/lib/long-task-windows-job-supervisor-protocol.d.ts +28 -0
  454. package/dist/lib/long-task-windows-job-supervisor-protocol.js +124 -0
  455. package/dist/lib/long-task-windows-job-supervisor-result.d.ts +11 -0
  456. package/dist/lib/long-task-windows-job-supervisor-result.js +152 -0
  457. package/dist/lib/long-task-windows-job-supervisor.d.ts +2 -0
  458. package/dist/lib/long-task-windows-job-supervisor.js +126 -0
  459. package/dist/lib/long-task-workspace-scope.d.ts +1 -0
  460. package/dist/lib/long-task-workspace-scope.js +4 -1
  461. package/dist/lib/long-task-workspace.d.ts +1 -0
  462. package/dist/lib/long-task-workspace.js +10 -0
  463. package/dist/lib/migrations.js +43 -2
  464. package/dist/lib/repository-path-safety.d.ts +1 -0
  465. package/dist/lib/repository-path-safety.js +3 -3
  466. package/dist/lib/semantic-fact-input-shape.d.ts +7 -2
  467. package/dist/lib/semantic-fact-input-shape.js +25 -1
  468. package/dist/lib/semantic-fact-inventory-types.d.ts +8 -2
  469. package/dist/lib/semantic-fact-policy-census.d.ts +1 -1
  470. package/dist/lib/semantic-fact-policy-census.js +5 -2
  471. package/dist/lib/semantic-fact-policy.d.ts +1 -1
  472. package/dist/lib/semantic-fact-policy.js +2 -2
  473. package/dist/lib/semantic-fact-proof-shape.d.ts +1 -1
  474. package/dist/lib/semantic-fact-property-shape.d.ts +1 -1
  475. package/dist/lib/validators.d.ts +3 -0
  476. package/dist/lib/validators.js +45 -157
  477. package/dist/public-api-core.d.ts +12 -0
  478. package/dist/public-api-core.js +12 -0
  479. package/dist/public-api-long-task.d.ts +10 -0
  480. package/dist/public-api-long-task.js +10 -0
  481. package/dist/public-types.d.ts +5 -1
  482. package/dist/schemas/design-authority-delta-assessment-v1.schema.json +191 -0
  483. package/dist/schemas/long-task-delivery-v2/long-task-delivery-v2.schema.json +166 -2
  484. package/dist/schemas/long-task-external-confirmation-record-v1.schema.json +155 -0
  485. package/dist/schemas/long-task-external-confirmation-record-v2.schema.json +209 -0
  486. package/migrations/README.md +99 -0
  487. package/package.json +7 -5
  488. package/source-mappings.yaml +18 -0
@@ -22,8 +22,12 @@ export function semanticDriftMigrationFields(value) {
22
22
  collectApplicability(global?.applicability, "global.applicability", missing);
23
23
  const globalAcceptance = row(global?.acceptance);
24
24
  collectChecks(globalAcceptance?.checks, "global.acceptance.checks", missing);
25
- for (const [index, confirmation] of rows(globalAcceptance?.external_confirmations).entries())
26
- required(confirmation, `global.acceptance.external_confirmations[${index}]`, ["kind", "impact_claims", "blocks_target"], missing);
25
+ const externalConfirmations = rows(globalAcceptance?.external_confirmations);
26
+ for (const [index, confirmation] of externalConfirmations.entries())
27
+ collectExternalConfirmation(confirmation, `global.acceptance.external_confirmations[${index}]`, missing);
28
+ if (externalConfirmations.some((confirmation) => confirmation.blocks_target === true) &&
29
+ row(task?.target_profile)?.completion_authority !== "declared_authorities")
30
+ missing.push("task.target_profile.completion_authority=declared_authorities_or_remove_blocking_external");
27
31
  return [...new Set(missing)].sort();
28
32
  }
29
33
  export function semanticDriftOutcomeMigrationFields(value, label) {
@@ -87,6 +91,48 @@ function collectChecks(value, label, missing) {
87
91
  required(assertion, `${checkLabel}.${polarity}[${assertionIndex}]`, ["evidence_capabilities"], missing);
88
92
  }
89
93
  }
94
+ function collectExternalConfirmation(confirmation, label, missing) {
95
+ required(confirmation, label, ["kind", "impact_claims", "blocks_target"], missing);
96
+ if (confirmation.blocks_target !== true)
97
+ return;
98
+ required(confirmation, label, [
99
+ "actor",
100
+ "target_ref",
101
+ "environment_identity",
102
+ "scenario",
103
+ "evidence_requirements",
104
+ "obligations",
105
+ ], missing);
106
+ const actor = row(confirmation.actor);
107
+ if (actor) {
108
+ required(actor, `${label}.actor`, ["identity_assurance"], missing);
109
+ const assurance = row(actor.identity_assurance);
110
+ if (assurance) {
111
+ required(assurance, `${label}.actor.identity_assurance`, ["scheme"], missing);
112
+ if (assurance.scheme !== "ed25519")
113
+ missing.push(`${label}.actor.identity_assurance.scheme=ed25519`);
114
+ else
115
+ required(assurance, `${label}.actor.identity_assurance`, ["key_id", "public_key_ref"], missing);
116
+ }
117
+ }
118
+ for (const [index, obligation] of rows(confirmation.obligations).entries()) {
119
+ const obligationLabel = `${label}.obligations[${index}]`;
120
+ required(obligation, obligationLabel, [
121
+ "key",
122
+ "claim_ref",
123
+ "applicability_ref",
124
+ "fact_ref",
125
+ "proof_ref",
126
+ "method",
127
+ "proof_surface",
128
+ "evidence_capabilities",
129
+ "expected_authority_ref",
130
+ "result_kind",
131
+ ], missing);
132
+ if (obligation.result_kind === "judgment")
133
+ required(obligation, obligationLabel, ["judgment_basis"], missing);
134
+ }
135
+ }
90
136
  function required(value, label, keys, missing) {
91
137
  for (const key of keys)
92
138
  if (!Object.hasOwn(value, key))
@@ -11,6 +11,7 @@ export interface SemanticFactBindingV2 {
11
11
  fact_revision_digest?: string;
12
12
  claim_ref: string;
13
13
  applicability_ref: string;
14
+ required_polarity?: "positive" | "negative";
14
15
  }
15
16
  export type SemanticFactProofBindingV2 = {
16
17
  proof_ref: string;
@@ -37,6 +38,25 @@ export interface SemanticFactOutcomeBindingsV2 {
37
38
  facts: SemanticFactBindingV2[];
38
39
  proofs: SemanticFactProofBindingV2[];
39
40
  }
41
+ export interface SemanticFactGlobalObligationBindingV2 {
42
+ claim_ref: string;
43
+ applicability_ref: string;
44
+ target_ref: string;
45
+ outcome_ref: string;
46
+ fact_ref: string;
47
+ proof_ref: string;
48
+ method: string;
49
+ required_polarity: "positive" | "negative";
50
+ }
51
+ /**
52
+ * Links Global Claims to exact obligations that remain owned by the existing
53
+ * Outcome-scoped Semantic Fact/proof bindings. This is a conservation
54
+ * projection, not a second Fact inventory or completion authority.
55
+ */
56
+ export interface SemanticFactGlobalBindingsV2 {
57
+ manifest_ref: string;
58
+ obligations: SemanticFactGlobalObligationBindingV2[];
59
+ }
40
60
  export interface SemanticFactExpectationV2 {
41
61
  manifest_ref: string;
42
62
  manifest_sha256: string;
@@ -1,13 +1,17 @@
1
+ import type { LongTaskDesignHandoffPreflight } from "./long-task-design-resource-handoff.js";
2
+ import { type SourceSemanticConservationV2 } from "./long-task-source-conservation.js";
1
3
  import type { CompiledSourceItemV2, DeliveryContractV2 } from "./long-task-delivery-types.js";
2
4
  import { semanticFactCollectionIdentity } from "./semantic-fact-policy.js";
3
5
  import type { SemanticFactExpectationV2, SemanticFactManifestV1 } from "./semantic-fact-types.js";
6
+ import type { CapturedContextGraphSnapshot } from "./context-graph-snapshot.js";
4
7
  export interface LongTaskSemanticFactClosureV2 {
5
8
  manifest: SemanticFactManifestV1;
6
9
  manifest_sha256: string;
7
10
  manifest_source_path: string;
8
11
  expectations_by_check: Map<string, SemanticFactExpectationV2[]>;
12
+ source_conservation: SourceSemanticConservationV2;
9
13
  }
10
- export declare function validateLongTaskSemanticFactClosure(contract: DeliveryContractV2, repository: string, sourceItems: CompiledSourceItemV2[], contextFiles: string[]): Promise<LongTaskSemanticFactClosureV2>;
14
+ export declare function validateLongTaskSemanticFactClosure(contract: DeliveryContractV2, repository: string, sourceItems: CompiledSourceItemV2[], context: CapturedContextGraphSnapshot, designHandoffs?: LongTaskDesignHandoffPreflight[]): Promise<LongTaskSemanticFactClosureV2>;
11
15
  export declare const semantic_fact_manifest = "semantic-fact-manifest-v1";
12
16
  export declare const semantic_fact_contract_projection_enabled = true;
13
17
  export declare const expected_semantic_fact_universe: typeof semanticFactCollectionIdentity;
@@ -1,17 +1,24 @@
1
1
  import { validateSemanticFactContractProjection } from "./long-task-semantic-fact-contract-closure.js";
2
2
  import { assertSameSemanticFactClosureSet, semanticFactClosureInvalid, } from "./long-task-semantic-fact-closure-primitives.js";
3
- import { collectDesignOwnedSemanticFactSourceItems, validateSemanticFactInputInventory, } from "./long-task-semantic-fact-input-closure.js";
3
+ import { collectDesignOwnedSemanticFactSourceItems, projectDesignOwnedSemanticFacts, validateSemanticFactInputInventory, } from "./long-task-semantic-fact-input-closure.js";
4
4
  import { validateSemanticFactBasisClosure } from "./long-task-semantic-fact-provenance-closure.js";
5
5
  import { validateSemanticFactLocatedValues } from "./long-task-semantic-fact-value-closure.js";
6
+ import { validateSourceSemanticConservation, } from "./long-task-source-conservation.js";
6
7
  import { semanticFactCollectionIdentity, validateSemanticFactManifestPolicy, } from "./semantic-fact-policy.js";
7
8
  import { loadSemanticFactManifest } from "./semantic-fact-source-parser.js";
8
- export async function validateLongTaskSemanticFactClosure(contract, repository, sourceItems, contextFiles) {
9
+ export async function validateLongTaskSemanticFactClosure(contract, repository, sourceItems, context, designHandoffs) {
9
10
  const parsed = await loadSemanticFactManifest(repository, contract.task.source_paths);
10
11
  const manifest = parsed.manifest;
11
- const index = validateSemanticFactManifestPolicy(manifest);
12
12
  validateManifestReference(contract, parsed);
13
- const designOwnedSourceItems = await collectDesignOwnedSemanticFactSourceItems(repository, contract.task.source_paths);
14
- await validateSemanticFactInputInventory(repository, sourceItems, contextFiles, manifest, designOwnedSourceItems);
13
+ const designProjection = designHandoffs
14
+ ? projectDesignOwnedSemanticFacts(designHandoffs)
15
+ : {
16
+ source_items: await collectDesignOwnedSemanticFactSourceItems(repository, contract.task.source_paths),
17
+ facts: [],
18
+ };
19
+ const index = validateSemanticFactManifestPolicy(manifest, new Set(designProjection.facts.map((fact) => fact.key)));
20
+ const materialInputs = await validateSemanticFactInputInventory(repository, sourceItems, context, manifest, designProjection);
21
+ const sourceConservation = validateSourceSemanticConservation(sourceItems, manifest, designProjection, materialInputs, semanticFactClaimPolarities(contract));
15
22
  validateSemanticFactBasisClosure(manifest, sourceItems);
16
23
  await validateSemanticFactLocatedValues(repository, manifest, sourceItems);
17
24
  const expectations = validateSemanticFactContractProjection(contract, manifest, index, new Map(parsed.fact_revisions.map((item) => [item.key, item.revision_digest])), new Map(parsed.obligation_revisions.map((item) => [
@@ -23,8 +30,25 @@ export async function validateLongTaskSemanticFactClosure(contract, repository,
23
30
  manifest_sha256: parsed.sha256,
24
31
  manifest_source_path: parsed.source_path,
25
32
  expectations_by_check: expectations,
33
+ source_conservation: sourceConservation,
26
34
  };
27
35
  }
36
+ function semanticFactClaimPolarities(contract) {
37
+ const result = new Map();
38
+ for (const outcome of contract.outcomes)
39
+ for (const binding of outcome.semantic_fact_bindings.facts) {
40
+ const values = result.get(binding.fact_ref) ?? new Set();
41
+ values.add(binding.required_polarity ?? "positive");
42
+ result.set(binding.fact_ref, values);
43
+ }
44
+ for (const binding of contract.global.semantic_fact_bindings?.obligations ??
45
+ []) {
46
+ const values = result.get(binding.fact_ref) ?? new Set();
47
+ values.add(binding.required_polarity);
48
+ result.set(binding.fact_ref, values);
49
+ }
50
+ return result;
51
+ }
28
52
  function validateManifestReference(contract, parsed) {
29
53
  const declared = contract.semantic_fact_manifest;
30
54
  if (declared.key !== parsed.manifest.key ||
@@ -45,6 +69,10 @@ function validateManifestReference(contract, parsed) {
45
69
  if (outcome.semantic_fact_bindings.manifest_ref !==
46
70
  contract.semantic_fact_manifest.key)
47
71
  semanticFactClosureInvalid("outcome_manifest_ref_mismatch", `${outcome.key}:${outcome.semantic_fact_bindings.manifest_ref}`);
72
+ if (contract.global.semantic_fact_bindings &&
73
+ contract.global.semantic_fact_bindings.manifest_ref !==
74
+ contract.semantic_fact_manifest.key)
75
+ semanticFactClosureInvalid("global_manifest_ref_mismatch", contract.global.semantic_fact_bindings.manifest_ref);
48
76
  }
49
77
  export const semantic_fact_manifest = "semantic-fact-manifest-v1";
50
78
  export const semantic_fact_contract_projection_enabled = true;
@@ -1,6 +1,7 @@
1
1
  import { validateSemanticFactOutcomeBindings } from "./long-task-semantic-fact-contract-facts.js";
2
2
  import { validateSemanticFactProofBindings } from "./long-task-semantic-fact-contract-proofs.js";
3
- import { assertSameSemanticFactClosureSet, uniqueSemanticFactClosureValues, } from "./long-task-semantic-fact-closure-primitives.js";
3
+ import { globalCompatibleOutcomeApplicabilityCoverage, outcomeApplicabilityPairIdentity, sameApplicabilityProfile, sameOutcomeApplicabilityCoverage, } from "./long-task-applicability-identity.js";
4
+ import { assertSameSemanticFactClosureSet, semanticFactClosureInvalid, uniqueSemanticFactClosureValues, } from "./long-task-semantic-fact-closure-primitives.js";
4
5
  export function validateSemanticFactContractProjection(contract, manifest, index, factRevisions, obligationRevisions, sourceRequiresRevisions) {
5
6
  const expectations = new Map();
6
7
  const allFactBindings = [];
@@ -25,10 +26,184 @@ export function validateSemanticFactContractProjection(contract, manifest, index
25
26
  validateSemanticFactOutcomeBindings(outcome, manifest, index, allFactBindings, factRevisions, revisionsRequired);
26
27
  validateSemanticFactProofBindings(contract, outcome, manifest, index, targetByRef, expectations, allProofBindings, factRevisions, obligationRevisions, revisionsRequired);
27
28
  }
29
+ validateSemanticFactGlobalBindings(contract, manifest, index);
28
30
  assertSameSemanticFactClosureSet(allFactBindings, manifest.facts.map((item) => item.key), "contract_all_fact_set");
29
31
  assertSameSemanticFactClosureSet(allProofBindings, manifest.proof_obligations.map((item) => item.key), "contract_all_proof_set");
30
32
  return expectations;
31
33
  }
34
+ function validateSemanticFactGlobalBindings(contract, manifest, index) {
35
+ const claims = globalMaterialClaims(contract);
36
+ const bindings = contract.global.semantic_fact_bindings;
37
+ if (!claims.length) {
38
+ if (bindings?.obligations.length)
39
+ semanticFactClosureInvalid("global_semantic_fact_claim_unknown", bindings.obligations[0].claim_ref);
40
+ return;
41
+ }
42
+ if (!bindings)
43
+ semanticFactClosureInvalid("global_semantic_fact_bindings_required", claims
44
+ .map((claim) => claim.claim_ref)
45
+ .sort()
46
+ .join(","));
47
+ if (bindings.manifest_ref !== contract.semantic_fact_manifest.key)
48
+ semanticFactClosureInvalid("global_semantic_fact_manifest_ref_mismatch", `${bindings.manifest_ref}:${contract.semantic_fact_manifest.key}`);
49
+ const claimsByRef = new Map(claims.map((claim) => [claim.claim_ref, claim]));
50
+ const applicabilityByRef = new Map(contract.global.applicability.map((item) => [item.key, item]));
51
+ const validationContext = {
52
+ contract,
53
+ index,
54
+ claims_by_ref: claimsByRef,
55
+ applicability_by_ref: applicabilityByRef,
56
+ };
57
+ validateGlobalObligationRows(bindings.obligations, validationContext);
58
+ for (const claim of claims)
59
+ for (const applicabilityRef of claim.applicability_refs)
60
+ validateGlobalClaimApplicabilityCoverage(contract, manifest, bindings, claim, applicabilityRef, applicabilityByRef);
61
+ }
62
+ function validateGlobalObligationRows(obligations, context) {
63
+ const tupleKeys = new Set();
64
+ for (const binding of obligations) {
65
+ const tupleKey = globalObligationTupleKey(binding);
66
+ if (tupleKeys.has(tupleKey))
67
+ semanticFactClosureInvalid("global_semantic_fact_obligation_duplicate", tupleKey.replaceAll("\0", ":"));
68
+ tupleKeys.add(tupleKey);
69
+ validateGlobalObligation(binding, context);
70
+ }
71
+ }
72
+ function globalObligationTupleKey(binding) {
73
+ return [
74
+ binding.claim_ref,
75
+ binding.applicability_ref,
76
+ binding.target_ref,
77
+ binding.outcome_ref,
78
+ binding.fact_ref,
79
+ binding.proof_ref,
80
+ binding.method,
81
+ ].join("\0");
82
+ }
83
+ function validateGlobalObligation(binding, context) {
84
+ const { contract, index, claims_by_ref, applicability_by_ref } = context;
85
+ const claim = claims_by_ref.get(binding.claim_ref);
86
+ if (!claim)
87
+ semanticFactClosureInvalid("global_semantic_fact_claim_unknown", binding.claim_ref);
88
+ if (!claim.applicability_refs.includes(binding.applicability_ref))
89
+ semanticFactClosureInvalid("global_semantic_fact_applicability_not_owned", `${binding.claim_ref}:${binding.applicability_ref}`);
90
+ if (binding.required_polarity !== claim.required_polarity)
91
+ semanticFactClosureInvalid("global_semantic_fact_polarity_mismatch", `${binding.claim_ref}:${binding.required_polarity}:${claim.required_polarity}`);
92
+ const applicability = applicability_by_ref.get(binding.applicability_ref);
93
+ if (!applicability)
94
+ semanticFactClosureInvalid("global_semantic_fact_applicability_unknown", `${binding.claim_ref}:${binding.applicability_ref}`);
95
+ if (binding.target_ref !== applicability.target_ref)
96
+ semanticFactClosureInvalid("global_semantic_fact_target_mismatch", `${binding.claim_ref}:${binding.applicability_ref}:${binding.target_ref}:${applicability.target_ref}`);
97
+ const outcome = contract.outcomes.find((item) => item.key === binding.outcome_ref);
98
+ if (!outcome)
99
+ semanticFactClosureInvalid("global_semantic_fact_outcome_unknown", `${binding.claim_ref}:${binding.outcome_ref}`);
100
+ const fact = index.fact_by_ref.get(binding.fact_ref);
101
+ if (!fact)
102
+ semanticFactClosureInvalid("global_semantic_fact_unknown", `${binding.claim_ref}:${binding.fact_ref}`);
103
+ if (fact.outcome_ref !== binding.outcome_ref)
104
+ semanticFactClosureInvalid("global_semantic_fact_outcome_mismatch", `${binding.fact_ref}:${binding.outcome_ref}:${fact.outcome_ref}`);
105
+ const factBinding = outcome.semantic_fact_bindings.facts.find((item) => item.fact_ref === binding.fact_ref);
106
+ if (!factBinding)
107
+ semanticFactClosureInvalid("global_semantic_fact_outcome_binding_missing", `${binding.claim_ref}:${binding.outcome_ref}:${binding.fact_ref}`);
108
+ const factApplicability = outcome.applicability.find((item) => item.key === factBinding.applicability_ref);
109
+ if (!factApplicability || factApplicability.target_ref !== binding.target_ref)
110
+ semanticFactClosureInvalid("global_semantic_fact_outcome_target_mismatch", `${binding.claim_ref}:${binding.outcome_ref}:${binding.fact_ref}:${binding.target_ref}`);
111
+ if (!sameApplicabilityProfile(applicability, factApplicability))
112
+ semanticFactClosureInvalid("global_semantic_fact_applicability_profile_mismatch", `${binding.claim_ref}:${binding.applicability_ref}:${binding.outcome_ref}:${factBinding.applicability_ref}`);
113
+ const proof = index.proof_by_ref.get(binding.proof_ref);
114
+ if (!proof)
115
+ semanticFactClosureInvalid("global_semantic_fact_proof_unknown", `${binding.claim_ref}:${binding.proof_ref}`);
116
+ if (proof.fact_ref !== binding.fact_ref ||
117
+ proof.method !== binding.method ||
118
+ !outcome.semantic_fact_bindings.proofs.some((item) => item.proof_ref === binding.proof_ref &&
119
+ item.fact_ref === binding.fact_ref &&
120
+ item.method === binding.method))
121
+ semanticFactClosureInvalid("global_semantic_fact_proof_identity_mismatch", `${binding.claim_ref}:${binding.fact_ref}:${binding.proof_ref}:${binding.method}`);
122
+ if (!globalClaimSourceOwners(contract, binding.claim_ref).some((sourceRef) => fact.source_item_refs.includes(sourceRef)))
123
+ semanticFactClosureInvalid("global_semantic_fact_source_lineage_missing", `${binding.claim_ref}:${binding.fact_ref}`);
124
+ }
125
+ function validateGlobalClaimApplicabilityCoverage(contract, manifest, bindings, claim, applicabilityRef, applicabilityByRef) {
126
+ const applicability = applicabilityByRef.get(applicabilityRef);
127
+ if (!applicability)
128
+ semanticFactClosureInvalid("global_semantic_fact_applicability_unknown", `${claim.claim_ref}:${applicabilityRef}`);
129
+ const selected = bindings.obligations.filter((item) => item.claim_ref === claim.claim_ref &&
130
+ item.applicability_ref === applicabilityRef &&
131
+ item.target_ref === applicability.target_ref);
132
+ if (!selected.length)
133
+ semanticFactClosureInvalid("broad_claim_semantic_fact_required", `GLOBAL:${claim.claim_ref}:${applicabilityRef}`);
134
+ const localCoverage = globalCompatibleOutcomeApplicabilityCoverage(contract, applicability);
135
+ validateGlobalTargetOutcomeCoverage(claim.claim_ref, applicabilityRef, applicability.target_ref, localCoverage, selected);
136
+ validateGlobalLocalApplicabilityCoverage(contract, claim.claim_ref, applicabilityRef, localCoverage, selected);
137
+ validateGlobalFactMethodCoverage(manifest, claim.claim_ref, applicabilityRef, selected);
138
+ }
139
+ function validateGlobalTargetOutcomeCoverage(claimRef, applicabilityRef, targetRef, localCoverage, selected) {
140
+ const requiredOutcomes = localCoverage.target_outcome_refs;
141
+ if (!requiredOutcomes.length)
142
+ semanticFactClosureInvalid("global_semantic_fact_target_unowned", `${claimRef}:${applicabilityRef}:${targetRef}`);
143
+ if (localCoverage.missing_outcome_refs.length)
144
+ semanticFactClosureInvalid("global_semantic_fact_outcome_applicability_missing", `${claimRef}:${applicabilityRef}:${localCoverage.missing_outcome_refs.join(",")}`);
145
+ const coveredOutcomes = [
146
+ ...new Set(selected.map((item) => item.outcome_ref)),
147
+ ].sort();
148
+ if (requiredOutcomes.length !== coveredOutcomes.length ||
149
+ requiredOutcomes.some((outcomeRef, index) => outcomeRef !== coveredOutcomes[index]))
150
+ semanticFactClosureInvalid("global_semantic_fact_target_coverage_incomplete", `${claimRef}:${applicabilityRef}:required=${requiredOutcomes.join(",")}:actual=${coveredOutcomes.join(",")}`);
151
+ }
152
+ function validateGlobalLocalApplicabilityCoverage(contract, claimRef, applicabilityRef, localCoverage, selected) {
153
+ const covered = [
154
+ ...new Map(selected.map((item) => {
155
+ const outcome = contract.outcomes.find((candidate) => candidate.key === item.outcome_ref);
156
+ const factBinding = outcome.semantic_fact_bindings.facts.find((candidate) => candidate.fact_ref === item.fact_ref);
157
+ const pair = {
158
+ outcome_ref: item.outcome_ref,
159
+ applicability_ref: factBinding.applicability_ref,
160
+ };
161
+ return [outcomeApplicabilityPairIdentity(pair), pair];
162
+ })).values(),
163
+ ];
164
+ if (!sameOutcomeApplicabilityCoverage(localCoverage.required_pairs, covered))
165
+ semanticFactClosureInvalid("global_semantic_fact_local_applicability_coverage_incomplete", `${claimRef}:${applicabilityRef}:required=${localCoverage.required_pairs.map(outcomeApplicabilityPairIdentity).join(",")}:actual=${covered.map(outcomeApplicabilityPairIdentity).sort().join(",")}`);
166
+ }
167
+ function validateGlobalFactMethodCoverage(manifest, claimRef, applicabilityRef, selected) {
168
+ for (const factRef of new Set(selected.map((item) => item.fact_ref))) {
169
+ const requiredProofs = manifest.proof_obligations
170
+ .filter((proof) => proof.fact_ref === factRef)
171
+ .map((proof) => `${proof.key}\0${proof.method}`)
172
+ .sort();
173
+ const boundProofs = selected
174
+ .filter((item) => item.fact_ref === factRef)
175
+ .map((item) => `${item.proof_ref}\0${item.method}`)
176
+ .sort();
177
+ if (requiredProofs.length !== boundProofs.length ||
178
+ requiredProofs.some((proofIdentity, index) => proofIdentity !== boundProofs[index]))
179
+ semanticFactClosureInvalid("global_semantic_fact_method_coverage_incomplete", `${claimRef}:${applicabilityRef}:${factRef}`);
180
+ }
181
+ }
182
+ function globalMaterialClaims(contract) {
183
+ return [
184
+ ...contract.global.product.non_goals.map((item) => ({
185
+ claim_ref: `non_goal.${item.key}`,
186
+ applicability_refs: item.applicability_refs,
187
+ required_polarity: "negative",
188
+ })),
189
+ ...contract.global.technical.constraints.map((item) => ({
190
+ claim_ref: `constraint.${item.key}`,
191
+ applicability_refs: item.applicability_refs,
192
+ required_polarity: "positive",
193
+ })),
194
+ ...contract.global.technical.forbidden_shortcuts.map((item) => ({
195
+ claim_ref: `forbidden_shortcut.${item.key}`,
196
+ applicability_refs: item.applicability_refs,
197
+ required_polarity: "negative",
198
+ })),
199
+ ];
200
+ }
201
+ function globalClaimSourceOwners(contract, claimRef) {
202
+ return contract.source_claims
203
+ .filter((source) => source.disposition.type === "global_constraint" &&
204
+ source.disposition.refs.includes(claimRef))
205
+ .map((source) => source.key);
206
+ }
32
207
  function revisionPair(key, digest, label) {
33
208
  if (!digest)
34
209
  throw new Error(`semantic_fact_closure_invalid:${label}:${key}:missing`);
@@ -59,7 +59,24 @@ function validateMachineProofProjection(contract, outcome, manifest, index, bind
59
59
  assertion.operator !== "equals" ||
60
60
  assertion.expected !== true ||
61
61
  !sameSemanticFactClosureSet(assertion.evidence_capabilities, binding.evidence_capabilities))
62
- semanticFactClosureInvalid("semantic_fact_assertion_binding_mismatch", `${binding.check_ref}:${binding.assertion_ref}`);
62
+ semanticFactClosureInvalid("semantic_fact_assertion_binding_mismatch", {
63
+ check_ref: binding.check_ref,
64
+ assertion_ref: binding.assertion_ref,
65
+ expected: {
66
+ claims: [factBinding.claim_ref],
67
+ applicability_ref: factBinding.applicability_ref,
68
+ operator: "equals",
69
+ expected: true,
70
+ evidence_capabilities: [...binding.evidence_capabilities].sort(),
71
+ },
72
+ actual: {
73
+ claims: assertion.claims,
74
+ applicability_ref: assertion.applicability_ref ?? null,
75
+ operator: assertion.operator,
76
+ expected: "expected" in assertion ? assertion.expected : null,
77
+ evidence_capabilities: [...assertion.evidence_capabilities].sort(),
78
+ },
79
+ });
63
80
  validateSemanticFactCounterfactualProjection(outcome, proof, factBinding.claim_ref, binding.check_ref, binding.assertion_ref);
64
81
  const fact = index.fact_by_ref.get(binding.fact_ref);
65
82
  const rows = expectations.get(binding.check_ref) ?? [];
@@ -1,4 +1,18 @@
1
- import type { CompiledSourceItemV2 } from "./long-task-source-authority-types.js";
1
+ import type { CompiledSourceItemV2, MaterialTextInputV2 } from "./long-task-source-authority-types.js";
2
+ import type { LongTaskDesignHandoffPreflight } from "./long-task-design-resource-handoff.js";
2
3
  import type { SemanticFactManifestV1 } from "./semantic-fact-types.js";
4
+ import type { CapturedContextGraphSnapshot } from "./context-graph-snapshot.js";
5
+ export interface DesignOwnedSemanticFactProjectionV1 {
6
+ key: string;
7
+ source_item_refs: string[];
8
+ basis_refs: string[];
9
+ expected_search_text: string;
10
+ }
11
+ export interface DesignOwnedSemanticProjectionV1 {
12
+ source_items: Set<string>;
13
+ facts: DesignOwnedSemanticFactProjectionV1[];
14
+ }
15
+ export declare function designOwnedSemanticFactProjectionKey(kind: "fact" | "fact_rule", handoffPath: string, factKey: string): string;
16
+ export declare function projectDesignOwnedSemanticFacts(preflights: LongTaskDesignHandoffPreflight[]): DesignOwnedSemanticProjectionV1;
3
17
  export declare function collectDesignOwnedSemanticFactSourceItems(repository: string, sourcePaths: string[]): Promise<Set<string>>;
4
- export declare function validateSemanticFactInputInventory(repository: string, sourceItems: CompiledSourceItemV2[], contextFiles: string[], manifest: SemanticFactManifestV1, designOwnedSourceItems: Set<string>): Promise<void>;
18
+ export declare function validateSemanticFactInputInventory(repository: string, sourceItems: CompiledSourceItemV2[], context: CapturedContextGraphSnapshot, manifest: SemanticFactManifestV1, designProjection: DesignOwnedSemanticProjectionV1): Promise<MaterialTextInputV2[]>;
@@ -3,8 +3,86 @@ import path from "node:path";
3
3
  import { containsDesignResourceHandoff, parseDesignResourceHandoffMarkdown, } from "./design-resource-handoff-parser.js";
4
4
  import { assertSameSemanticFactClosureSet, semanticFactClosureInvalid, uniqueSemanticFactClosureValues, } from "./long-task-semantic-fact-closure-primitives.js";
5
5
  import { validateSemanticFactProvenance } from "./long-task-semantic-fact-provenance-closure.js";
6
+ import { deriveMaterialTextInputs } from "./long-task-material-input-closure.js";
6
7
  import { assertProtectedRepositoryFile } from "./long-task-protected-files.js";
7
8
  import { sha256Hex } from "./strict-codec.js";
9
+ export function designOwnedSemanticFactProjectionKey(kind, handoffPath, factKey) {
10
+ return `design.${kind}.${sha256Hex(`${kind}\0${handoffPath}\0${factKey}`)}`;
11
+ }
12
+ export function projectDesignOwnedSemanticFacts(preflights) {
13
+ const sourceItems = new Set();
14
+ const facts = new Map();
15
+ for (const preflight of preflights) {
16
+ for (const key of preflight.source_item_keys)
17
+ sourceItems.add(key);
18
+ if ("preflight_schema_version" in preflight)
19
+ for (const rule of preflight.manifest.fact_rules)
20
+ addDesignFactProjection(facts, {
21
+ key: designOwnedSemanticFactProjectionKey("fact_rule", preflight.handoff_path, rule.key),
22
+ source_item_refs: [...rule.source_item_refs],
23
+ basis_refs: [...rule.semantic_obligation_refs],
24
+ expected_search_text: [
25
+ rule.key,
26
+ rule.subject_or_relation_ref,
27
+ rule.target_ref,
28
+ rule.property_ref,
29
+ rule.population_ref ?? "",
30
+ rule.quantifier,
31
+ rule.value_kind,
32
+ rule.provenance_ref,
33
+ rule.observation_scope,
34
+ rule.expected.locator.resource_ref,
35
+ rule.expected.locator.kind,
36
+ rule.expected.locator.value,
37
+ rule.expected.sha256,
38
+ JSON.stringify(rule.region),
39
+ ...rule.evidence_refs,
40
+ ...rule.census_refs,
41
+ ...rule.semantic_obligation_refs,
42
+ ].join("\n"),
43
+ });
44
+ else
45
+ for (const fact of preflight.handoff.facts)
46
+ addDesignFactProjection(facts, {
47
+ key: designOwnedSemanticFactProjectionKey("fact", preflight.handoff_path, fact.key),
48
+ source_item_refs: [...fact.source_item_refs],
49
+ basis_refs: [...fact.evidence_refs],
50
+ expected_search_text: [
51
+ fact.key,
52
+ fact.cell_ref,
53
+ fact.subject_ref,
54
+ fact.target_ref,
55
+ fact.condition_ref,
56
+ fact.variation_ref,
57
+ fact.property_ref,
58
+ fact.dimension,
59
+ fact.observation_scope,
60
+ fact.value_kind,
61
+ fact.value.locator.resource_ref,
62
+ fact.value.locator.kind,
63
+ fact.value.locator.value,
64
+ fact.value.sha256,
65
+ fact.lineage.design_system_ref ?? "",
66
+ ...fact.lineage.token_chain_refs,
67
+ ...fact.lineage.override_chain_refs,
68
+ fact.lineage.resolved_value.locator.resource_ref,
69
+ fact.lineage.resolved_value.locator.kind,
70
+ fact.lineage.resolved_value.locator.value,
71
+ fact.lineage.resolved_value.sha256,
72
+ ...fact.evidence_refs,
73
+ ].join("\n"),
74
+ });
75
+ }
76
+ return {
77
+ source_items: sourceItems,
78
+ facts: [...facts.values()].sort((left, right) => left.key.localeCompare(right.key)),
79
+ };
80
+ }
81
+ function addDesignFactProjection(facts, fact) {
82
+ if (facts.has(fact.key))
83
+ semanticFactClosureInvalid("design_fact_projection_duplicate", fact.key);
84
+ facts.set(fact.key, fact);
85
+ }
8
86
  export async function collectDesignOwnedSemanticFactSourceItems(repository, sourcePaths) {
9
87
  const result = new Set();
10
88
  for (const sourcePath of sourcePaths) {
@@ -18,18 +96,20 @@ export async function collectDesignOwnedSemanticFactSourceItems(repository, sour
18
96
  }
19
97
  return result;
20
98
  }
21
- export async function validateSemanticFactInputInventory(repository, sourceItems, contextFiles, manifest, designOwnedSourceItems) {
99
+ export async function validateSemanticFactInputInventory(repository, sourceItems, context, manifest, designProjection) {
100
+ const designOwnedSourceItems = designProjection.source_items;
22
101
  const sourceItemByKey = new Map(sourceItems.map((item) => [item.key, item]));
23
102
  const sourceInputs = manifest.inputs.filter((item) => item.kind === "source_item");
24
103
  assertSameSemanticFactClosureSet(manifest.scope.source_item_refs, sourceItems.map((item) => item.key), "manifest_source_item_universe");
25
104
  assertSameSemanticFactClosureSet(sourceInputs.map((item) => item.source_ref), sourceItems.map((item) => item.key), "input_source_item_universe");
26
105
  validateSourceInputDigests(sourceInputs, sourceItemByKey, designOwnedSourceItems);
27
106
  const contextInputs = manifest.inputs.filter((item) => item.kind === "context");
28
- assertSameSemanticFactClosureSet(contextInputs.map((item) => item.source_ref), contextFiles, "input_context_universe");
107
+ assertSameSemanticFactClosureSet(contextInputs.map((item) => item.source_ref), context.snapshot.files, "input_context_universe");
29
108
  for (const input of manifest.inputs)
30
- await validateInput(repository, manifest, input, designOwnedSourceItems);
31
- validateInputFactLineage(manifest, sourceInputs);
109
+ await validateInput(repository, manifest, input, designOwnedSourceItems, context.physical_files);
110
+ validateInputFactLineage(manifest, sourceInputs, designProjection.facts);
32
111
  validateSemanticFactProvenance(manifest, sourceItems);
112
+ return deriveMaterialTextInputs(repository, sourceItems, manifest, designOwnedSourceItems);
33
113
  }
34
114
  function validateSourceInputDigests(sourceInputs, sourceItemByKey, designOwnedSourceItems) {
35
115
  for (const input of sourceInputs) {
@@ -43,14 +123,32 @@ function validateSourceInputDigests(sourceInputs, sourceItemByKey, designOwnedSo
43
123
  semanticFactClosureInvalid("material_source_item_disposition_mismatch", `${input.key}:${input.source_ref}:${input.disposition}:${designOwned ? "ui_design_or_non_ui_material" : "non_ui_material"}`);
44
124
  }
45
125
  }
46
- async function validateInput(repository, manifest, input, designOwnedSourceItems) {
126
+ async function validateInput(repository, manifest, input, designOwnedSourceItems, contextPhysicalFiles) {
127
+ const projectionInput = input.kind === "source_fragment" || input.kind === "semantic_anchor";
128
+ const projectionDispositions = [
129
+ "fact_bearing",
130
+ "supporting_basis",
131
+ "superseded",
132
+ "decision_required",
133
+ "scope_excluded",
134
+ ];
135
+ const resourceDispositions = [
136
+ "non_ui_material",
137
+ "ui_design",
138
+ "supporting_only",
139
+ "excluded_by_scope",
140
+ ];
141
+ if (projectionInput
142
+ ? !projectionDispositions.includes(input.disposition)
143
+ : !resourceDispositions.includes(input.disposition))
144
+ semanticFactClosureInvalid("input_disposition_kind_mismatch", `${input.key}:${input.kind}:${input.disposition}`);
47
145
  uniqueSemanticFactClosureValues(input.fact_refs, `input_fact_refs:${input.key}`);
48
146
  uniqueSemanticFactClosureValues(input.basis_refs, `input_basis_refs:${input.key}`);
49
- if (input.disposition === "non_ui_material"
50
- ? !input.fact_refs.length
51
- : input.fact_refs.length)
147
+ const factBearing = ["non_ui_material", "fact_bearing"].includes(input.disposition);
148
+ const requiresFactRefs = factBearing || input.disposition === "supporting_basis";
149
+ if (requiresFactRefs ? !input.fact_refs.length : input.fact_refs.length)
52
150
  semanticFactClosureInvalid("input_fact_disposition_mismatch", `${input.key}:${input.disposition}`);
53
- if (input.disposition !== "non_ui_material" && !input.rationale.trim())
151
+ if (!factBearing && !input.rationale.trim())
54
152
  semanticFactClosureInvalid("input_disposition_rationale_required", input.key);
55
153
  if (["canonical_spec", "external_constraint", "delegated_instruction"].includes(input.kind) &&
56
154
  input.disposition !== "non_ui_material")
@@ -62,27 +160,46 @@ async function validateInput(repository, manifest, input, designOwnedSourceItems
62
160
  ? !["ui_design", "non_ui_material"].includes(input.disposition)
63
161
  : input.disposition === "ui_design")
64
162
  semanticFactClosureInvalid("ui_design_input_kind_mismatch", `${input.key}:${input.kind}:${input.disposition}`);
65
- if (input.disposition === "excluded_by_scope" &&
163
+ if (["excluded_by_scope", "scope_excluded"].includes(input.disposition) &&
66
164
  !manifest.scope.exclusions.some((exclusion) => exclusion.affected_refs.includes(input.key)))
67
165
  semanticFactClosureInvalid("input_scope_exclusion_missing", input.key);
68
- if (input.kind === "source_item")
166
+ if (input.kind === "source_item" || projectionInput)
69
167
  return;
70
- const file = await assertProtectedRepositoryFile(repository, path.resolve(repository, ...input.source_ref.split("/")), `semantic_fact_input:${input.key}`);
168
+ const inputPath = input.kind === "context"
169
+ ? contextPhysicalFiles.get(input.source_ref)
170
+ : path.resolve(repository, ...input.source_ref.split("/"));
171
+ if (!inputPath)
172
+ semanticFactClosureInvalid("input_context_physical_file_missing", `${input.key}:${input.source_ref}`);
173
+ const file = await assertProtectedRepositoryFile(repository, inputPath, `semantic_fact_input:${input.key}`);
71
174
  const digest = sha256Hex(await readFile(file));
72
175
  if (digest !== input.sha256)
73
176
  semanticFactClosureInvalid("input_resource_digest_mismatch", `${input.key}:${input.source_ref}`);
74
177
  }
75
- function validateInputFactLineage(manifest, sourceInputs) {
76
- const facts = new Map(manifest.facts.map((item) => [item.key, item]));
178
+ function validateInputFactLineage(manifest, sourceInputs, designFacts) {
179
+ const facts = new Map([
180
+ ...manifest.facts.map((item) => [
181
+ item.key,
182
+ {
183
+ key: item.key,
184
+ source_item_refs: item.source_item_refs,
185
+ basis_refs: item.provenance.basis_refs,
186
+ },
187
+ ]),
188
+ ...designFacts.map((item) => [item.key, item]),
189
+ ]);
190
+ const sourceItemRefs = new Set(sourceInputs.map((item) => item.source_ref));
77
191
  for (const input of manifest.inputs)
78
192
  for (const factRef of input.fact_refs)
79
193
  if (!facts.has(factRef))
80
194
  semanticFactClosureInvalid("input_fact_unknown", `${input.key}:${factRef}`);
81
195
  else {
82
196
  const fact = facts.get(factRef);
197
+ const projectedSourceRef = projectionSourceItemRef(input);
83
198
  if (input.kind === "source_item"
84
199
  ? !fact.source_item_refs.includes(input.source_ref)
85
- : !fact.provenance.basis_refs.includes(input.key))
200
+ : projectedSourceRef && sourceItemRefs.has(projectedSourceRef)
201
+ ? !fact.source_item_refs.includes(projectedSourceRef)
202
+ : !fact.basis_refs.includes(input.key))
86
203
  semanticFactClosureInvalid("input_fact_lineage_mismatch", `${input.key}:${factRef}`);
87
204
  }
88
205
  for (const fact of manifest.facts) {
@@ -99,3 +216,9 @@ function validateInputFactLineage(manifest, sourceInputs) {
99
216
  semanticFactClosureInvalid("fact_source_input_required", fact.key);
100
217
  }
101
218
  }
219
+ function projectionSourceItemRef(input) {
220
+ if (input.kind !== "source_fragment" && input.kind !== "semantic_anchor")
221
+ return null;
222
+ const separator = input.source_ref.indexOf("#fragment:");
223
+ return separator > 0 ? input.source_ref.slice(0, separator) : null;
224
+ }