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
@@ -0,0 +1,108 @@
1
+ import { validateDesignResourceDeltaAuthority } from "./design-resource-recovery-authority-policy.js";
2
+ import { canonicalValueJson } from "./strict-codec.js";
3
+ export function validateDesignResourceDeltas(deltas, scope, excluded, delegations, authoritySources) {
4
+ const byId = new Map();
5
+ const superseded = new Set();
6
+ for (let index = 0; index < deltas.length; index += 1) {
7
+ const delta = deltas[index];
8
+ validateDeltaShape(delta, index, byId, scope, excluded);
9
+ validateDesignResourceDeltaAuthority(delta, delegations, authoritySources);
10
+ assertDisjoint(new Set(delta.supersedes), new Set(delta.proposes_replacement_of), `delta_replacement_relation_overlap:${delta.delta_id}`);
11
+ validateSupersession(delta, byId, superseded);
12
+ validateProposedReplacement(delta, byId, superseded);
13
+ byId.set(delta.delta_id, delta);
14
+ }
15
+ return { byId, superseded };
16
+ }
17
+ function validateDeltaShape(delta, index, byId, scope, excluded) {
18
+ assertUnique(delta.target_keys, `delta_target_duplicate:${delta.delta_id}`);
19
+ assertUnique(delta.supersedes, `delta_supersedes_duplicate:${delta.delta_id}`);
20
+ assertUnique(delta.proposes_replacement_of, `delta_proposes_replacement_duplicate:${delta.delta_id}`);
21
+ assertUnique(delta.evidence_refs, `delta_evidence_ref_duplicate:${delta.delta_id}`);
22
+ assertUnique(delta.source_refs, `delta_source_ref_duplicate:${delta.delta_id}`);
23
+ assertUnique(delta.explicitly_unchanged_keys, `delta_unchanged_duplicate:${delta.delta_id}`);
24
+ if (delta.sequence !== index + 1)
25
+ invalid(`delta_sequence:${delta.delta_id}:${delta.sequence}:${index + 1}`);
26
+ if (byId.has(delta.delta_id))
27
+ invalid(`delta_id_duplicate:${delta.delta_id}`);
28
+ assertSubset(new Set(delta.target_keys), scope, `delta_target_outside_scope:${delta.delta_id}`);
29
+ assertDisjoint(new Set(delta.target_keys), excluded, `delta_target_excluded:${delta.delta_id}`);
30
+ assertDisjoint(new Set(delta.target_keys), new Set(delta.explicitly_unchanged_keys), `delta_changed_and_unchanged_overlap:${delta.delta_id}`);
31
+ validateOperationSemantics(delta);
32
+ }
33
+ function validateSupersession(delta, byId, superseded) {
34
+ for (const earlier of delta.supersedes) {
35
+ const replaced = byId.get(earlier);
36
+ if (!replaced)
37
+ invalid(`delta_supersedes_missing_or_later:${delta.delta_id}:${earlier}`);
38
+ if (delta.status !== "accepted")
39
+ invalid(`delta_superseder_not_accepted:${delta.delta_id}`);
40
+ if (replaced.status !== "accepted")
41
+ invalid(`delta_supersedes_nonaccepted:${delta.delta_id}:${earlier}`);
42
+ if (superseded.has(earlier))
43
+ invalid(`delta_superseded_more_than_once:${earlier}`);
44
+ validateReplacementRelationship(delta, replaced, "supersedes");
45
+ superseded.add(earlier);
46
+ }
47
+ }
48
+ function validateProposedReplacement(delta, byId, superseded) {
49
+ for (const earlier of delta.proposes_replacement_of) {
50
+ const proposed = byId.get(earlier);
51
+ if (!proposed)
52
+ invalid(`delta_proposes_replacement_missing_or_later:${delta.delta_id}:${earlier}`);
53
+ if (delta.status === "accepted")
54
+ invalid(`accepted_delta_uses_proposal_relation:${delta.delta_id}`);
55
+ if (proposed.status !== "accepted" || superseded.has(earlier))
56
+ invalid(`delta_proposes_replacement_of_inactive:${delta.delta_id}:${earlier}`);
57
+ validateReplacementRelationship(delta, proposed, "proposes_replacement_of");
58
+ }
59
+ }
60
+ function validateOperationSemantics(delta) {
61
+ const before = canonicalValueJson(delta.before_semantics);
62
+ const after = canonicalValueJson(delta.after_semantics);
63
+ if (delta.operation === "add" && delta.before_semantics !== null)
64
+ invalid(`delta_add_before_must_be_null:${delta.delta_id}`);
65
+ if (delta.operation === "remove" && delta.after_semantics !== null)
66
+ invalid(`delta_remove_after_must_be_null:${delta.delta_id}`);
67
+ if (delta.operation === "preserve" && before !== after)
68
+ invalid(`delta_preserve_semantics_changed:${delta.delta_id}`);
69
+ if (delta.operation !== "preserve" && before === after)
70
+ invalid(`delta_change_semantics_equal:${delta.delta_id}`);
71
+ if (delta.operation === "preserve" &&
72
+ (delta.supersedes.length || delta.proposes_replacement_of.length))
73
+ invalid(`delta_preserve_cannot_replace:${delta.delta_id}`);
74
+ if (delta.status === "accepted" && !delta.source_refs.length)
75
+ invalid(`accepted_delta_source_refs_required:${delta.delta_id}`);
76
+ }
77
+ function validateReplacementRelationship(replacement, previous, relation) {
78
+ assertEqualSet(new Set(replacement.target_keys), new Set(previous.target_keys), `delta_${relation}_target_mismatch:${replacement.delta_id}:${previous.delta_id}`);
79
+ if (canonicalValueJson(replacement.before_semantics) !==
80
+ canonicalValueJson(previous.after_semantics))
81
+ invalid(`delta_${relation}_semantic_mismatch:${replacement.delta_id}:${previous.delta_id}`);
82
+ if (replacement.semantic_kind !== previous.semantic_kind)
83
+ invalid(`delta_${relation}_semantic_kind_mismatch:${replacement.delta_id}:${previous.delta_id}`);
84
+ }
85
+ function assertUnique(values, code) {
86
+ if (new Set(values).size !== values.length)
87
+ invalid(code);
88
+ }
89
+ function assertSubset(candidate, owner, code) {
90
+ const outside = [...candidate].filter((value) => !owner.has(value));
91
+ if (outside.length)
92
+ invalid(`${code}:${outside.sort(compareText).join(",")}`);
93
+ }
94
+ function assertDisjoint(left, right, code) {
95
+ const overlap = [...left].filter((value) => right.has(value));
96
+ if (overlap.length)
97
+ invalid(`${code}:${overlap.sort(compareText).join(",")}`);
98
+ }
99
+ function assertEqualSet(left, right, code) {
100
+ if (left.size !== right.size || [...left].some((value) => !right.has(value)))
101
+ invalid(code);
102
+ }
103
+ function invalid(code) {
104
+ throw new Error(`design_resource_recovery_invalid:${code}`);
105
+ }
106
+ function compareText(left, right) {
107
+ return left < right ? -1 : left > right ? 1 : 0;
108
+ }
@@ -0,0 +1,37 @@
1
+ export declare const DESIGN_RESOURCE_RECOVERY_ROOT = "tmp/ty-context/design-resource-recovery";
2
+ export interface RecoveryFileSnapshot {
3
+ relative: string;
4
+ absolute: string;
5
+ bytes: Buffer;
6
+ raw_byte_digest: string;
7
+ mode: number;
8
+ }
9
+ export declare function recoveryCheckpointRelativePath(sessionId: string): string;
10
+ export declare function readRecoveryRepositoryFile(repository: string, locatorInput: string, label: string): Promise<RecoveryFileSnapshot>;
11
+ export declare function readRecoveryCheckpointFile(repository: string, sessionId: string): Promise<RecoveryFileSnapshot>;
12
+ export declare function createRecoveryCheckpointFile(repository: string, sessionId: string, bytes: Uint8Array): Promise<{
13
+ path: string;
14
+ raw_byte_digest: string;
15
+ changed: boolean;
16
+ }>;
17
+ export declare function updateRecoveryCheckpointFile(repository: string, sessionId: string, bytes: Uint8Array, expectedCurrentDigest: string): Promise<{
18
+ path: string;
19
+ raw_byte_digest: string;
20
+ changed: boolean;
21
+ }>;
22
+ export declare function atomicCasWrite(repository: string, relativeInput: string, bytes: Uint8Array, expectedCurrentDigest: string | null, mode: number): Promise<string>;
23
+ export declare function removeRecoveryCheckpointFile(repository: string, sessionId: string, expectedDigest: string): Promise<{
24
+ status: "removed";
25
+ path: string;
26
+ checkpoint_removed: true;
27
+ session_directory_removed: true;
28
+ retained_entries: [];
29
+ } | {
30
+ status: "partial";
31
+ path: string;
32
+ checkpoint_removed: boolean;
33
+ session_directory_removed: false;
34
+ retained_entries: string[];
35
+ reason: "unowned_entries" | "session_directory_cleanup_failed";
36
+ }>;
37
+ export declare function deriveDigestCasState(current: string, before: string, after: string): "unapplied" | "applied" | "conflict";
@@ -0,0 +1,204 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { execFile } from "node:child_process";
3
+ import { lstat, open, readFile, readdir, rename, rmdir, unlink, } from "node:fs/promises";
4
+ import path from "node:path";
5
+ import { promisify } from "node:util";
6
+ import { normalizeRepositoryFile } from "./long-task-paths.js";
7
+ import { assertProtectedRepositoryFile, assertSafeRepositoryFilePath, ensureSafeRepositoryDirectory, resolveInsideRepository, } from "./repository-path-safety.js";
8
+ import { sha256Hex } from "./strict-codec.js";
9
+ export const DESIGN_RESOURCE_RECOVERY_ROOT = "tmp/ty-context/design-resource-recovery";
10
+ const execFileAsync = promisify(execFile);
11
+ export function recoveryCheckpointRelativePath(sessionId) {
12
+ if (!/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/u.test(sessionId))
13
+ invalid(`unsafe_session_id:${sessionId}`);
14
+ return `${DESIGN_RESOURCE_RECOVERY_ROOT}/${sessionId}/checkpoint.json`;
15
+ }
16
+ export async function readRecoveryRepositoryFile(repository, locatorInput, label) {
17
+ const relative = normalizeRepositoryFile(locatorInput, label);
18
+ const absolute = resolveInsideRepository(repository, relative, label);
19
+ const safe = await assertProtectedRepositoryFile(repository, absolute, label);
20
+ const [bytes, status] = await Promise.all([readFile(safe), lstat(safe)]);
21
+ return {
22
+ relative,
23
+ absolute: safe,
24
+ bytes,
25
+ raw_byte_digest: sha256Hex(bytes),
26
+ mode: status.mode,
27
+ };
28
+ }
29
+ export async function readRecoveryCheckpointFile(repository, sessionId) {
30
+ return readRecoveryRepositoryFile(repository, recoveryCheckpointRelativePath(sessionId), "design_resource_recovery_checkpoint");
31
+ }
32
+ export async function createRecoveryCheckpointFile(repository, sessionId, bytes) {
33
+ const relative = recoveryCheckpointRelativePath(sessionId);
34
+ await assertRecoveryPathIgnored(repository, relative);
35
+ await ensureRecoverySessionDirectory(repository, sessionId);
36
+ const existing = await readOptionalRepositoryFile(repository, relative);
37
+ const expectedDigest = sha256Hex(bytes);
38
+ if (existing) {
39
+ if (existing.raw_byte_digest !== expectedDigest)
40
+ invalid(`checkpoint_collision:${relative}`);
41
+ return { path: relative, raw_byte_digest: expectedDigest, changed: false };
42
+ }
43
+ const result = await atomicCasWrite(repository, relative, bytes, null, 0o600);
44
+ return { path: relative, raw_byte_digest: result, changed: true };
45
+ }
46
+ export async function updateRecoveryCheckpointFile(repository, sessionId, bytes, expectedCurrentDigest) {
47
+ const relative = recoveryCheckpointRelativePath(sessionId);
48
+ await assertRecoveryPathIgnored(repository, relative);
49
+ const existing = await readRecoveryCheckpointFile(repository, sessionId);
50
+ if (existing.raw_byte_digest !== expectedCurrentDigest)
51
+ invalid(`checkpoint_update_cas_conflict:${expectedCurrentDigest}:${existing.raw_byte_digest}`);
52
+ const nextDigest = sha256Hex(bytes);
53
+ if (nextDigest === existing.raw_byte_digest)
54
+ return { path: relative, raw_byte_digest: nextDigest, changed: false };
55
+ const written = await atomicCasWrite(repository, relative, bytes, expectedCurrentDigest, existing.mode);
56
+ return { path: relative, raw_byte_digest: written, changed: true };
57
+ }
58
+ export async function atomicCasWrite(repository, relativeInput, bytes, expectedCurrentDigest, mode) {
59
+ const relative = normalizeRepositoryFile(relativeInput, "design_resource_recovery_write_target");
60
+ const destination = await assertSafeRepositoryFilePath(repository, relative, "design_resource_recovery_write_target", { destinationMayBeAbsent: true });
61
+ const current = await readOptionalRepositoryFile(repository, relative);
62
+ assertExpectedDigest(current?.raw_byte_digest ?? null, expectedCurrentDigest);
63
+ const digest = sha256Hex(bytes);
64
+ const temporary = path.join(path.dirname(destination.absolute), `.${path.basename(destination.absolute)}.ty-context-dra-${randomUUID()}.tmp`);
65
+ let created = false;
66
+ try {
67
+ const handle = await open(temporary, "wx", mode & 0o777);
68
+ created = true;
69
+ try {
70
+ await handle.writeFile(bytes);
71
+ await handle.sync();
72
+ }
73
+ finally {
74
+ await handle.close();
75
+ }
76
+ const tempBytes = await readFile(temporary);
77
+ if (sha256Hex(tempBytes) !== digest)
78
+ invalid("temporary_readback_mismatch");
79
+ const beforeRename = await readOptionalRepositoryFile(repository, relative);
80
+ assertExpectedDigest(beforeRename?.raw_byte_digest ?? null, expectedCurrentDigest);
81
+ await rename(temporary, destination.absolute);
82
+ created = false;
83
+ const after = await readRecoveryRepositoryFile(repository, relative, "design_resource_recovery_write_readback");
84
+ if (after.raw_byte_digest !== digest)
85
+ invalid("post_write_readback_mismatch");
86
+ return digest;
87
+ }
88
+ catch (error) {
89
+ if (!created)
90
+ throw error;
91
+ try {
92
+ await cleanupOwnedTemporary(temporary, digest);
93
+ }
94
+ catch (cleanupError) {
95
+ throw new AggregateError([error, cleanupError], "design_resource_recovery_cleanup_failed");
96
+ }
97
+ throw error;
98
+ }
99
+ }
100
+ export async function removeRecoveryCheckpointFile(repository, sessionId, expectedDigest) {
101
+ const snapshot = await readRecoveryCheckpointFile(repository, sessionId);
102
+ if (snapshot.raw_byte_digest !== expectedDigest)
103
+ invalid(`checkpoint_remove_cas_conflict:${expectedDigest}:${snapshot.raw_byte_digest}`);
104
+ const sessionDirectory = path.dirname(snapshot.absolute);
105
+ const before = (await readdir(sessionDirectory)).sort();
106
+ const unowned = before.filter((entry) => entry !== "checkpoint.json");
107
+ if (unowned.length)
108
+ return {
109
+ status: "partial",
110
+ path: snapshot.relative,
111
+ checkpoint_removed: false,
112
+ session_directory_removed: false,
113
+ retained_entries: before,
114
+ reason: "unowned_entries",
115
+ };
116
+ await unlink(snapshot.absolute);
117
+ try {
118
+ await rmdir(sessionDirectory);
119
+ }
120
+ catch {
121
+ const retained = await readdir(sessionDirectory).catch(() => []);
122
+ return {
123
+ status: "partial",
124
+ path: snapshot.relative,
125
+ checkpoint_removed: true,
126
+ session_directory_removed: false,
127
+ retained_entries: retained.sort(),
128
+ reason: "session_directory_cleanup_failed",
129
+ };
130
+ }
131
+ return {
132
+ status: "removed",
133
+ path: snapshot.relative,
134
+ checkpoint_removed: true,
135
+ session_directory_removed: true,
136
+ retained_entries: [],
137
+ };
138
+ }
139
+ export function deriveDigestCasState(current, before, after) {
140
+ if (current === before)
141
+ return "unapplied";
142
+ if (current === after)
143
+ return "applied";
144
+ return "conflict";
145
+ }
146
+ async function ensureRecoverySessionDirectory(repository, sessionId) {
147
+ const relative = `${DESIGN_RESOURCE_RECOVERY_ROOT}/${sessionId}`;
148
+ await ensureSafeRepositoryDirectory(repository, relative, "design_resource_recovery_session");
149
+ const absolute = resolveInsideRepository(repository, relative, "design_resource_recovery_session");
150
+ const entries = await readdir(absolute);
151
+ const collisions = entries.filter((entry) => entry !== "checkpoint.json");
152
+ if (collisions.length)
153
+ invalid(`session_directory_collision:${collisions.sort().join(",")}`);
154
+ }
155
+ async function assertRecoveryPathIgnored(repository, relative) {
156
+ try {
157
+ await execFileAsync("git", ["check-ignore", "--quiet", "--", relative], {
158
+ cwd: repository,
159
+ windowsHide: true,
160
+ });
161
+ }
162
+ catch (error) {
163
+ if (error.code === 1)
164
+ invalid(`checkpoint_path_not_ignored:${relative}`);
165
+ throw error;
166
+ }
167
+ try {
168
+ await execFileAsync("git", ["ls-files", "--error-unmatch", "--", relative], { cwd: repository, windowsHide: true });
169
+ invalid(`checkpoint_path_tracked:${relative}`);
170
+ }
171
+ catch (error) {
172
+ if (error.code !== 1)
173
+ throw error;
174
+ }
175
+ }
176
+ async function readOptionalRepositoryFile(repository, relative) {
177
+ try {
178
+ return await readRecoveryRepositoryFile(repository, relative, "design_resource_recovery_optional_file");
179
+ }
180
+ catch (error) {
181
+ if (error.message.includes("protected_input_not_found:"))
182
+ return null;
183
+ throw error;
184
+ }
185
+ }
186
+ function assertExpectedDigest(actual, expected) {
187
+ if (actual === expected)
188
+ return;
189
+ invalid(`cas_conflict:${expected ?? "absent"}:${actual ?? "absent"}`);
190
+ }
191
+ async function cleanupOwnedTemporary(temporary, expectedDigest) {
192
+ const status = await lstat(temporary).catch(() => null);
193
+ if (!status)
194
+ return;
195
+ if (status.isSymbolicLink() || !status.isFile())
196
+ invalid("temporary_cleanup_collision");
197
+ const digest = sha256Hex(await readFile(temporary));
198
+ if (digest !== expectedDigest)
199
+ invalid("temporary_cleanup_identity_mismatch");
200
+ await unlink(temporary);
201
+ }
202
+ function invalid(reason) {
203
+ throw new Error(`design_resource_recovery_invalid:${reason}`);
204
+ }
@@ -0,0 +1,2 @@
1
+ import type { DesignResourceFinalDisposition } from "./design-resource-recovery-types.js";
2
+ export declare function parseDesignResourceFinalDisposition(value: unknown, label: string): DesignResourceFinalDisposition;
@@ -0,0 +1,47 @@
1
+ import { digest, object, oneOf, stringSet, text, } from "./design-resource-recovery-codec-primitives.js";
2
+ export function parseDesignResourceFinalDisposition(value, label) {
3
+ const first = object(value, label, ["kind"], ["operation_id", "resource_ref", "condition_refs", "downstream_owner"]);
4
+ const kind = oneOf(first.kind, [
5
+ "proposal-written",
6
+ "resource-owned-exact-visual",
7
+ "not-adopted",
8
+ "unresolved",
9
+ ], `${label}.kind`);
10
+ if (kind === "proposal-written") {
11
+ const row = object(value, label, ["kind", "operation_id"]);
12
+ return {
13
+ kind,
14
+ operation_id: text(row.operation_id, `${label}.operation_id`),
15
+ };
16
+ }
17
+ if (kind === "resource-owned-exact-visual") {
18
+ const row = object(value, label, [
19
+ "kind",
20
+ "resource_ref",
21
+ "condition_refs",
22
+ "downstream_owner",
23
+ ]);
24
+ return {
25
+ kind,
26
+ resource_ref: text(row.resource_ref, `${label}.resource_ref`),
27
+ condition_refs: stringSet(row.condition_refs, `${label}.condition_refs`),
28
+ downstream_owner: parseDownstreamOwner(row.downstream_owner, `${label}.downstream_owner`),
29
+ };
30
+ }
31
+ object(value, label, ["kind"]);
32
+ return { kind };
33
+ }
34
+ function parseDownstreamOwner(value, label) {
35
+ const row = object(value, label, [
36
+ "kind",
37
+ "locator",
38
+ "raw_byte_digest",
39
+ "resource_key",
40
+ ]);
41
+ return {
42
+ kind: oneOf(row.kind, ["selected-source-record", "external-immutable"], `${label}.kind`),
43
+ locator: text(row.locator, `${label}.locator`),
44
+ raw_byte_digest: digest(row.raw_byte_digest, `${label}.raw_byte_digest`),
45
+ resource_key: text(row.resource_key, `${label}.resource_key`),
46
+ };
47
+ }
@@ -0,0 +1,54 @@
1
+ import { DESIGN_RESOURCE_PATCH_SCHEMA } from "./design-resource-recovery-schema.js";
2
+ import type { DesignResourceEolPolicy, DesignResourceTextEncoding } from "./design-resource-recovery-types.js";
3
+ export interface DesignResourceTextSemanticProjection {
4
+ semantic_path: string[];
5
+ start_offset: number;
6
+ end_offset: number;
7
+ }
8
+ export interface DesignResourcePatchSemanticBinding {
9
+ delta_id: string;
10
+ target_key: string;
11
+ before_semantics_sha256: string;
12
+ after_semantics_sha256: string;
13
+ before_text_projection: DesignResourceTextSemanticProjection | null;
14
+ after_text_projection: DesignResourceTextSemanticProjection | null;
15
+ }
16
+ export interface DesignResourcePatchSourceSpan {
17
+ coordinate_system: "utf16-code-unit-v1";
18
+ start_offset: number;
19
+ end_offset: number;
20
+ before_text_sha256: string;
21
+ }
22
+ export interface DesignResourceExactPatchOperation {
23
+ operation_id: string;
24
+ operation: "add" | "replace" | "remove";
25
+ target_key: string;
26
+ delta_id: string;
27
+ before_text: string;
28
+ after_text: string;
29
+ before_text_sha256: string;
30
+ after_text_sha256: string;
31
+ source_span: DesignResourcePatchSourceSpan;
32
+ semantic_binding: DesignResourcePatchSemanticBinding;
33
+ expected_occurrences: 1;
34
+ }
35
+ export interface DesignResourceExactPatch {
36
+ schema_version: typeof DESIGN_RESOURCE_PATCH_SCHEMA;
37
+ operations: DesignResourceExactPatchOperation[];
38
+ }
39
+ export interface DesignResourceWritebackInput {
40
+ target_locator: string;
41
+ pre_write_raw_byte_digest: string;
42
+ patch: DesignResourceExactPatch;
43
+ patch_identity: string;
44
+ expected_post_write_raw_byte_digest: string;
45
+ resource_identities: Array<{
46
+ key: string;
47
+ raw_byte_digest: string;
48
+ }>;
49
+ proposal_written_delta_ids: string[];
50
+ }
51
+ export interface DesignResourceRecoveryWriteback extends DesignResourceWritebackInput {
52
+ target_encoding: DesignResourceTextEncoding;
53
+ target_eol_policy: Exclude<DesignResourceEolPolicy, "mixed">;
54
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ import type { DesignResourceDelta, DesignResourceRecoveryCheckpoint, DesignResourceRecoveryCreateInput, DesignResourceReplayProjection } from "./design-resource-recovery-types.js";
2
+ type RecoveryState = DesignResourceRecoveryCreateInput | DesignResourceRecoveryCheckpoint;
3
+ export declare function validateDesignResourceRecoverySemantics(state: RecoveryState): void;
4
+ export declare function createDesignResourceReplayProjection(checkpoint: DesignResourceRecoveryCheckpoint): DesignResourceReplayProjection;
5
+ export declare function acceptedSupersededDeltaIds(deltas: DesignResourceDelta[]): Set<string>;
6
+ export declare function activeAcceptedDesignResourceDeltas(deltas: DesignResourceDelta[], superseded?: Set<string>): DesignResourceDelta[];
7
+ export {};
@@ -0,0 +1,112 @@
1
+ import { indexDesignResourceAuthoritySources, indexDesignResourceDelegations, validateDesignResourceBaseMaterialization, } from "./design-resource-recovery-authority-policy.js";
2
+ import { validateDesignResourceDeltas } from "./design-resource-recovery-delta-policy.js";
3
+ import { validateDesignResourceRecoveryCatalog } from "./design-resource-recovery-catalog.js";
4
+ import { validateRecoveryProviderAndWriteback } from "./design-resource-recovery-writeback-policy.js";
5
+ export function validateDesignResourceRecoverySemantics(state) {
6
+ validateTopLevelUniqueness(state);
7
+ const scope = new Set(state.base.in_scope_keys);
8
+ const excluded = new Set(state.base.explicitly_excluded_keys);
9
+ assertDisjoint(scope, excluded, "base_scope_and_exclusions_overlap");
10
+ const authoritySources = indexDesignResourceAuthoritySources(state.authority_sources);
11
+ validateDesignResourceBaseMaterialization(state, authoritySources);
12
+ const delegations = indexDesignResourceDelegations(state.delegations, scope, authoritySources);
13
+ const { byId, superseded } = validateDesignResourceDeltas(state.deltas, scope, excluded, delegations, authoritySources);
14
+ assertDecisionSets(state, byId);
15
+ const activeAccepted = activeAcceptedDesignResourceDeltas(state.deltas, superseded);
16
+ validateActiveAcceptedTargetUniqueness(activeAccepted);
17
+ validateDesignResourceRecoveryCatalog(state, byId, activeAccepted, superseded, authoritySources);
18
+ if (state.selected_resource_bindings.length &&
19
+ !state.audit_expectations.resource_decisions.length)
20
+ invalid("resource_decision_universe_required");
21
+ validateRecoveryProviderAndWriteback(state, activeAccepted);
22
+ }
23
+ export function createDesignResourceReplayProjection(checkpoint) {
24
+ validateDesignResourceRecoverySemantics(checkpoint);
25
+ const superseded = acceptedSupersededDeltaIds(checkpoint.deltas);
26
+ const external = [
27
+ `provider-project:${checkpoint.provider.project.key}`,
28
+ `provider-run:${checkpoint.provider.run.key}`,
29
+ ...checkpoint.provider.resources.map((resource) => `provider-resource:${resource.key}`),
30
+ ];
31
+ if (checkpoint.design_authority.kind === "external-immutable")
32
+ external.push(`design-authority:${checkpoint.design_authority.locator}`);
33
+ return {
34
+ status: "replayable",
35
+ base: checkpoint.base,
36
+ ordered_active_accepted_deltas: activeAcceptedDesignResourceDeltas(checkpoint.deltas, superseded),
37
+ rejected_deltas: checkpoint.deltas.filter((delta) => delta.status === "rejected"),
38
+ unresolved_deltas: checkpoint.deltas.filter((delta) => delta.status === "unresolved"),
39
+ superseded_delta_ids: [...superseded].sort(compareText),
40
+ explicitly_unchanged_keys: checkpoint.audit_expectations.unchanged.map((row) => row.key),
41
+ design_authority: checkpoint.design_authority,
42
+ external_revalidation_required: external.sort(compareText),
43
+ };
44
+ }
45
+ export function acceptedSupersededDeltaIds(deltas) {
46
+ return new Set(deltas
47
+ .filter((delta) => delta.status === "accepted")
48
+ .flatMap((delta) => delta.supersedes));
49
+ }
50
+ export function activeAcceptedDesignResourceDeltas(deltas, superseded = acceptedSupersededDeltaIds(deltas)) {
51
+ return deltas.filter((delta) => delta.status === "accepted" && !superseded.has(delta.delta_id));
52
+ }
53
+ function assertDecisionSets(state, byId) {
54
+ const expected = {
55
+ accepted_delta_ids: state.deltas
56
+ .filter((delta) => delta.status === "accepted")
57
+ .map((delta) => delta.delta_id),
58
+ rejected_delta_ids: state.deltas
59
+ .filter((delta) => delta.status === "rejected")
60
+ .map((delta) => delta.delta_id),
61
+ unresolved_delta_ids: state.deltas
62
+ .filter((delta) => delta.status === "unresolved")
63
+ .map((delta) => delta.delta_id),
64
+ };
65
+ for (const [key, values] of Object.entries(state.decision_sets)) {
66
+ assertUnique(values, `decision_set_duplicate:${key}`);
67
+ for (const value of values)
68
+ if (!byId.has(value))
69
+ invalid(`decision_set_delta_missing:${key}:${value}`);
70
+ assertEqualSet(new Set(values), new Set(expected[key]), `decision_set_mismatch:${key}`);
71
+ }
72
+ }
73
+ function validateTopLevelUniqueness(state) {
74
+ assertUnique(state.base.in_scope_keys, "base_in_scope_duplicate");
75
+ assertUnique(state.base.explicitly_excluded_keys, "base_explicit_exclusion_duplicate");
76
+ assertUnique(state.provider.resources.map((resource) => resource.key), "provider_resource_key_duplicate");
77
+ assertUnique(state.provider.resources.map((resource) => resource.locator), "provider_resource_locator_duplicate");
78
+ }
79
+ function validateActiveAcceptedTargetUniqueness(activeAccepted) {
80
+ const owner = new Map();
81
+ for (const delta of activeAccepted)
82
+ for (const target of delta.target_keys) {
83
+ const prior = owner.get(target);
84
+ if (prior)
85
+ invalid(`active_accepted_target_collision:${target}:${prior},${delta.delta_id}`);
86
+ owner.set(target, delta.delta_id);
87
+ }
88
+ }
89
+ function assertUnique(values, code) {
90
+ if (new Set(values).size !== values.length)
91
+ invalid(code);
92
+ }
93
+ function assertSubset(candidate, owner, code) {
94
+ const outside = [...candidate].filter((value) => !owner.has(value));
95
+ if (outside.length)
96
+ invalid(`${code}:${outside.sort(compareText).join(",")}`);
97
+ }
98
+ function assertDisjoint(left, right, code) {
99
+ const overlap = [...left].filter((value) => right.has(value));
100
+ if (overlap.length)
101
+ invalid(`${code}:${overlap.sort(compareText).join(",")}`);
102
+ }
103
+ function assertEqualSet(left, right, code) {
104
+ if (left.size !== right.size || [...left].some((value) => !right.has(value)))
105
+ invalid(code);
106
+ }
107
+ function invalid(code) {
108
+ throw new Error(`design_resource_recovery_invalid:${code}`);
109
+ }
110
+ function compareText(left, right) {
111
+ return left < right ? -1 : left > right ? 1 : 0;
112
+ }
@@ -0,0 +1,9 @@
1
+ import type { DesignResourceRecoveryCheckpoint, DesignResourceRecoveryCreateInput } from "./design-resource-recovery-types.js";
2
+ type RecoveryState = DesignResourceRecoveryCreateInput | DesignResourceRecoveryCheckpoint;
3
+ export declare function validateSelectedResourceRepositoryBindings(repository: string, state: RecoveryState): Promise<{
4
+ external_revalidation_required: boolean;
5
+ }>;
6
+ export declare function validateReconciliationDownstreamOwners(repository: string, checkpoint: DesignResourceRecoveryCheckpoint): Promise<{
7
+ external_revalidation_required: boolean;
8
+ }>;
9
+ export {};
@@ -0,0 +1,49 @@
1
+ import { readRecoveryRepositoryFile } from "./design-resource-recovery-files.js";
2
+ export async function validateSelectedResourceRepositoryBindings(repository, state) {
3
+ let external = false;
4
+ for (const binding of state.selected_resource_bindings) {
5
+ if (binding.identity_kind === "external-immutable") {
6
+ external = true;
7
+ continue;
8
+ }
9
+ const snapshot = await readRecoveryRepositoryFile(repository, binding.locator, `design_resource_recovery_selected_resource_${binding.key}`);
10
+ assertDigest(`selected_resource:${binding.key}`, snapshot.raw_byte_digest, binding.raw_byte_digest);
11
+ }
12
+ return { external_revalidation_required: external };
13
+ }
14
+ export async function validateReconciliationDownstreamOwners(repository, checkpoint) {
15
+ const selected = new Map(checkpoint.selected_resource_bindings.map((row) => [row.key, row]));
16
+ const current = await validateSelectedResourceRepositoryBindings(repository, checkpoint);
17
+ for (const row of checkpoint.audit_expectations.resource_decisions)
18
+ for (const binding of row.bindings) {
19
+ const disposition = binding.final_disposition;
20
+ if (disposition.kind !== "resource-owned-exact-visual")
21
+ continue;
22
+ const selectedResource = selected.get(disposition.resource_ref);
23
+ if (!selectedResource)
24
+ invalid(`downstream_owner_resource_unselected:${binding.binding_id}`);
25
+ const owner = disposition.downstream_owner;
26
+ if (owner.resource_key !== disposition.resource_ref ||
27
+ owner.locator !== selectedResource.locator ||
28
+ owner.raw_byte_digest !== selectedResource.raw_byte_digest)
29
+ invalid(`selected_source_owner_identity_mismatch:${binding.binding_id}`);
30
+ if (selectedResource.identity_kind === "external-immutable") {
31
+ if (owner.kind !== "external-immutable")
32
+ invalid(`external_owner_kind_mismatch:${binding.binding_id}`);
33
+ current.external_revalidation_required = true;
34
+ continue;
35
+ }
36
+ if (owner.kind !== "selected-source-record")
37
+ invalid(`selected_source_owner_kind_mismatch:${binding.binding_id}`);
38
+ const snapshot = await readRecoveryRepositoryFile(repository, owner.locator, `design_resource_recovery_downstream_owner_${binding.binding_id}`);
39
+ assertDigest(`downstream_owner:${binding.binding_id}`, snapshot.raw_byte_digest, owner.raw_byte_digest);
40
+ }
41
+ return current;
42
+ }
43
+ function assertDigest(label, actual, expected) {
44
+ if (actual !== expected)
45
+ invalid(`${label}_digest_mismatch:${expected}:${actual}`);
46
+ }
47
+ function invalid(reason) {
48
+ throw new Error(`design_resource_recovery_invalid:${reason}`);
49
+ }
@@ -0,0 +1,5 @@
1
+ export declare const DESIGN_RESOURCE_RECOVERY_INPUT_SCHEMA: "design-resource-recovery-input-v4";
2
+ export declare const DESIGN_RESOURCE_RECOVERY_SCHEMA: "design-resource-recovery-checkpoint-v4";
3
+ export declare const DESIGN_RESOURCE_RECOVERY_AUDIT_SCHEMA: "design-resource-reconciliation-audit-v4";
4
+ export declare const DESIGN_RESOURCE_PATCH_SCHEMA: "design-resource-exact-patch-v4";
5
+ export declare const DESIGN_RESOURCE_AUTHORITY_PROJECTION_SCHEMA: "ty-dra-authority-v1";
@@ -0,0 +1,5 @@
1
+ export const DESIGN_RESOURCE_RECOVERY_INPUT_SCHEMA = "design-resource-recovery-input-v4";
2
+ export const DESIGN_RESOURCE_RECOVERY_SCHEMA = "design-resource-recovery-checkpoint-v4";
3
+ export const DESIGN_RESOURCE_RECOVERY_AUDIT_SCHEMA = "design-resource-reconciliation-audit-v4";
4
+ export const DESIGN_RESOURCE_PATCH_SCHEMA = "design-resource-exact-patch-v4";
5
+ export const DESIGN_RESOURCE_AUTHORITY_PROJECTION_SCHEMA = "ty-dra-authority-v1";