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,10 @@
1
+ import { type DesignResourceAuthorityIdentity, type DesignResourceAuthoritySourceItem, type DesignResourceDecisionAuthority, type DesignResourceDelegation, type DesignResourceDelta, type DesignResourceRecoveryBase, type DesignResourceRecoveryBaseInput } from "./design-resource-recovery-types.js";
2
+ export declare const DESIGN_RESOURCE_ORIGINS: readonly ["user-direct", "necessary-derived", "repository-evidence-backed", "provider-suggested"];
3
+ export declare const DESIGN_RESOURCE_SEMANTIC_KINDS: readonly ["exact-visual", "product", "business", "permission", "data", "algorithm", "commercial", "safety-security", "technical"];
4
+ export declare function parseRecoveryBaseInput(value: unknown, label: string): DesignResourceRecoveryBaseInput;
5
+ export declare function parseRecoveryBase(value: unknown, label: string): DesignResourceRecoveryBase;
6
+ export declare function parseDelegation(value: unknown, label: string): DesignResourceDelegation;
7
+ export declare function parseAuthoritySourceItem(value: unknown, label: string): DesignResourceAuthoritySourceItem;
8
+ export declare function parseDelta(value: unknown, label: string): DesignResourceDelta;
9
+ export declare function parseAuthorityIdentity(value: unknown, label: string): DesignResourceAuthorityIdentity;
10
+ export declare function parseDecisionAuthority(value: unknown, label: string): DesignResourceDecisionAuthority;
@@ -0,0 +1,184 @@
1
+ import { arrayOf, digest, integer, object, oneOf, stringSet, text, unknownSemantics, } from "./design-resource-recovery-codec-primitives.js";
2
+ export const DESIGN_RESOURCE_ORIGINS = [
3
+ "user-direct",
4
+ "necessary-derived",
5
+ "repository-evidence-backed",
6
+ "provider-suggested",
7
+ ];
8
+ const STATUSES = ["accepted", "rejected", "unresolved"];
9
+ const OPERATIONS = ["add", "replace", "remove", "preserve"];
10
+ const ENCODINGS = ["utf8", "utf8-bom", "utf16le", "utf16be"];
11
+ const EOLS = ["none", "lf", "crlf", "cr", "mixed"];
12
+ export const DESIGN_RESOURCE_SEMANTIC_KINDS = [
13
+ "exact-visual",
14
+ "product",
15
+ "business",
16
+ "permission",
17
+ "data",
18
+ "algorithm",
19
+ "commercial",
20
+ "safety-security",
21
+ "technical",
22
+ ];
23
+ const SOURCE_ITEM_KINDS = [
24
+ "outcome_result",
25
+ "requirement",
26
+ "control",
27
+ "acceptance",
28
+ "technical_obligation",
29
+ "non_completing",
30
+ "non_goal",
31
+ "forbidden_shortcut",
32
+ "risk_fact",
33
+ "external_confirmation",
34
+ "decision",
35
+ ];
36
+ export function parseRecoveryBaseInput(value, label) {
37
+ const row = object(value, label, [
38
+ "locator",
39
+ "raw_byte_digest",
40
+ "materialization",
41
+ "scope_ceiling",
42
+ "in_scope_keys",
43
+ "explicitly_excluded_keys",
44
+ ]);
45
+ const materialization = object(row.materialization, `${label}.materialization`, ["kind"], ["authorization_ref"]);
46
+ const kind = oneOf(materialization.kind, ["repository-source", "authorized-recovery-snapshot"], `${label}.materialization.kind`);
47
+ const normalizedMaterialization = kind === "repository-source"
48
+ ? { kind }
49
+ : {
50
+ kind,
51
+ authorization_ref: text(materialization.authorization_ref, `${label}.materialization.authorization_ref`),
52
+ };
53
+ if (kind === "repository-source" && "authorization_ref" in materialization)
54
+ throw new Error(`design_resource_recovery_invalid:${label}.materialization:unexpected_authorization_ref`);
55
+ return {
56
+ locator: text(row.locator, `${label}.locator`),
57
+ raw_byte_digest: digest(row.raw_byte_digest, `${label}.raw_byte_digest`),
58
+ materialization: normalizedMaterialization,
59
+ scope_ceiling: text(row.scope_ceiling, `${label}.scope_ceiling`),
60
+ in_scope_keys: stringSet(row.in_scope_keys, `${label}.in_scope_keys`),
61
+ explicitly_excluded_keys: stringSet(row.explicitly_excluded_keys, `${label}.explicitly_excluded_keys`, { allowEmpty: true }),
62
+ };
63
+ }
64
+ export function parseRecoveryBase(value, label) {
65
+ const row = object(value, label, [
66
+ "locator",
67
+ "raw_byte_digest",
68
+ "materialization",
69
+ "scope_ceiling",
70
+ "in_scope_keys",
71
+ "explicitly_excluded_keys",
72
+ "encoding",
73
+ "eol_policy",
74
+ ]);
75
+ const base = parseRecoveryBaseInput(Object.fromEntries(Object.entries(row).filter(([key]) => key !== "encoding" && key !== "eol_policy")), label);
76
+ return {
77
+ ...base,
78
+ encoding: oneOf(row.encoding, ENCODINGS, `${label}.encoding`),
79
+ eol_policy: oneOf(row.eol_policy, EOLS, `${label}.eol_policy`),
80
+ };
81
+ }
82
+ export function parseDelegation(value, label) {
83
+ const row = object(value, label, [
84
+ "key",
85
+ "source_ref",
86
+ "allowed_origins",
87
+ "allowed_target_keys",
88
+ "allowed_semantic_kinds",
89
+ ]);
90
+ return {
91
+ key: text(row.key, `${label}.key`),
92
+ source_ref: text(row.source_ref, `${label}.source_ref`),
93
+ allowed_origins: arrayOf(row.allowed_origins, `${label}.allowed_origins`, (item, itemLabel) => oneOf(item, DESIGN_RESOURCE_ORIGINS, itemLabel)),
94
+ allowed_target_keys: stringSet(row.allowed_target_keys, `${label}.allowed_target_keys`),
95
+ allowed_semantic_kinds: stringSet(row.allowed_semantic_kinds, `${label}.allowed_semantic_kinds`).map((value, index) => oneOf(value, DESIGN_RESOURCE_SEMANTIC_KINDS, `${label}.allowed_semantic_kinds[${index}]`)),
96
+ };
97
+ }
98
+ export function parseAuthoritySourceItem(value, label) {
99
+ const row = object(value, label, [
100
+ "source_ref",
101
+ "locator",
102
+ "raw_byte_digest",
103
+ "source_item_key",
104
+ "source_item_kind",
105
+ "source_item_text_sha256",
106
+ ]);
107
+ return {
108
+ source_ref: text(row.source_ref, `${label}.source_ref`),
109
+ locator: text(row.locator, `${label}.locator`),
110
+ raw_byte_digest: digest(row.raw_byte_digest, `${label}.raw_byte_digest`),
111
+ source_item_key: text(row.source_item_key, `${label}.source_item_key`),
112
+ source_item_kind: oneOf(row.source_item_kind, SOURCE_ITEM_KINDS, `${label}.source_item_kind`),
113
+ source_item_text_sha256: digest(row.source_item_text_sha256, `${label}.source_item_text_sha256`),
114
+ };
115
+ }
116
+ export function parseDelta(value, label) {
117
+ const row = object(value, label, [
118
+ "delta_id",
119
+ "sequence",
120
+ "supersedes",
121
+ "proposes_replacement_of",
122
+ "operation",
123
+ "semantic_kind",
124
+ "target_keys",
125
+ "before_semantics",
126
+ "after_semantics",
127
+ "origin",
128
+ "decision_authority",
129
+ "evidence_refs",
130
+ "source_refs",
131
+ "explicitly_unchanged_keys",
132
+ "status",
133
+ ]);
134
+ return {
135
+ delta_id: text(row.delta_id, `${label}.delta_id`),
136
+ sequence: integer(row.sequence, `${label}.sequence`, 1),
137
+ supersedes: stringSet(row.supersedes, `${label}.supersedes`, {
138
+ allowEmpty: true,
139
+ }),
140
+ proposes_replacement_of: stringSet(row.proposes_replacement_of, `${label}.proposes_replacement_of`, { allowEmpty: true }),
141
+ operation: oneOf(row.operation, OPERATIONS, `${label}.operation`),
142
+ semantic_kind: oneOf(row.semantic_kind, DESIGN_RESOURCE_SEMANTIC_KINDS, `${label}.semantic_kind`),
143
+ target_keys: stringSet(row.target_keys, `${label}.target_keys`),
144
+ before_semantics: unknownSemantics(row, "before_semantics", label),
145
+ after_semantics: unknownSemantics(row, "after_semantics", label),
146
+ origin: oneOf(row.origin, DESIGN_RESOURCE_ORIGINS, `${label}.origin`),
147
+ decision_authority: parseDecisionAuthority(row.decision_authority, `${label}.decision_authority`),
148
+ evidence_refs: stringSet(row.evidence_refs, `${label}.evidence_refs`, {
149
+ allowEmpty: true,
150
+ }),
151
+ source_refs: stringSet(row.source_refs, `${label}.source_refs`, {
152
+ allowEmpty: true,
153
+ }),
154
+ explicitly_unchanged_keys: stringSet(row.explicitly_unchanged_keys, `${label}.explicitly_unchanged_keys`, { allowEmpty: true }),
155
+ status: oneOf(row.status, STATUSES, `${label}.status`),
156
+ };
157
+ }
158
+ export function parseAuthorityIdentity(value, label) {
159
+ const first = object(value, label, ["kind"], ["locator", "raw_byte_digest", "rationale"]);
160
+ const kind = oneOf(first.kind, ["repository-file", "external-immutable", "not-applicable"], `${label}.kind`);
161
+ if (kind === "not-applicable") {
162
+ if ("locator" in first || "raw_byte_digest" in first)
163
+ throw new Error(`design_resource_recovery_invalid:${label}:not_applicable_identity_fields`);
164
+ return {
165
+ kind,
166
+ rationale: text(first.rationale, `${label}.rationale`),
167
+ };
168
+ }
169
+ if ("rationale" in first)
170
+ throw new Error(`design_resource_recovery_invalid:${label}:unexpected_rationale`);
171
+ return {
172
+ kind,
173
+ locator: text(first.locator, `${label}.locator`),
174
+ raw_byte_digest: digest(first.raw_byte_digest, `${label}.raw_byte_digest`),
175
+ };
176
+ }
177
+ export function parseDecisionAuthority(value, label) {
178
+ const result = text(value, label);
179
+ if (result === "explicit-user" || result === "none")
180
+ return result;
181
+ if (/^delegated:[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u.test(result))
182
+ return result;
183
+ throw new Error(`design_resource_recovery_invalid:${label}:invalid_authority`);
184
+ }
@@ -0,0 +1,5 @@
1
+ import type { DesignResourceAuthorityProjection, DesignResourceRecoveryCheckpoint, DesignResourceRecoveryCreateInput } from "./design-resource-recovery-types.js";
2
+ type RecoveryState = DesignResourceRecoveryCreateInput | DesignResourceRecoveryCheckpoint;
3
+ export declare function validateDesignResourceAuthoritySourceItems(repository: string, state: RecoveryState): Promise<void>;
4
+ export declare function parseAuthorityProjections(sourcePath: string, itemKey: string, normalizedText: string): DesignResourceAuthorityProjection[];
5
+ export {};
@@ -0,0 +1,219 @@
1
+ import { decodeDesignResourceText } from "./design-resource-recovery-text.js";
2
+ import { readRecoveryRepositoryFile } from "./design-resource-recovery-files.js";
3
+ import { parseSourceDocument } from "./long-task-source-item-parser.js";
4
+ import { arrayOf, digest, literal, object, oneOf, parseStrictJsonObject, stringSet, text, } from "./design-resource-recovery-codec-primitives.js";
5
+ import { DESIGN_RESOURCE_AUTHORITY_PROJECTION_SCHEMA } from "./design-resource-recovery-schema.js";
6
+ import { DESIGN_RESOURCE_ORIGINS, DESIGN_RESOURCE_SEMANTIC_KINDS, } from "./design-resource-recovery-shape.js";
7
+ import { canonicalValueJson, sha256Hex } from "./strict-codec.js";
8
+ import { isDesignResourceAuthoritativeMeaningSourceKind } from "./design-resource-recovery-authority-policy.js";
9
+ export async function validateDesignResourceAuthoritySourceItems(repository, state) {
10
+ const byLocator = new Map();
11
+ const bySourceRef = new Map();
12
+ for (const declared of state.authority_sources) {
13
+ let loaded = byLocator.get(declared.locator);
14
+ if (!loaded) {
15
+ loaded = await loadAuthoritySourceDocument(repository, declared.locator);
16
+ byLocator.set(declared.locator, loaded);
17
+ }
18
+ if (loaded.rawByteDigest !== declared.raw_byte_digest)
19
+ invalid(`authority_source_raw_digest_mismatch:${declared.source_ref}:${declared.raw_byte_digest}:${loaded.rawByteDigest}`);
20
+ const item = loaded.items.get(declared.source_item_key);
21
+ if (!item)
22
+ invalid(`authority_source_item_missing:${declared.source_ref}:${declared.source_item_key}`);
23
+ if (item.kind !== declared.source_item_kind)
24
+ invalid(`authority_source_item_kind_mismatch:${declared.source_ref}:${declared.source_item_kind}:${item.kind}`);
25
+ if (item.text_sha256 !== declared.source_item_text_sha256)
26
+ invalid(`authority_source_item_digest_mismatch:${declared.source_ref}:${declared.source_item_text_sha256}:${item.text_sha256}`);
27
+ bySourceRef.set(declared.source_ref, {
28
+ kind: item.kind,
29
+ projections: item.projections,
30
+ });
31
+ }
32
+ validateDelegationProjections(state, bySourceRef);
33
+ validateAcceptedDeltaProjections(state, bySourceRef);
34
+ }
35
+ function validateDelegationProjections(state, sources) {
36
+ for (const delegation of state.delegations) {
37
+ const source = sources.get(delegation.source_ref);
38
+ if (!source)
39
+ invalid(`delegation_source_ref_unresolved:${delegation.key}`);
40
+ if (source.kind !== "decision")
41
+ invalid(`delegation_source_not_decision:${delegation.key}`);
42
+ const matching = source.projections.filter((projection) => projection.mode === "delegation" &&
43
+ projection.delegation_key === delegation.key);
44
+ if (matching.length !== 1)
45
+ invalid(`delegation_projection_count:${delegation.key}:${matching.length}`);
46
+ const projection = matching[0];
47
+ if (projection.mode !== "delegation")
48
+ throw new Error("unreachable");
49
+ assertExactSet(projection.allowed_target_keys, delegation.allowed_target_keys, `delegation_projection_targets:${delegation.key}`);
50
+ assertExactSet(projection.allowed_semantic_kinds, delegation.allowed_semantic_kinds, `delegation_projection_semantic_kinds:${delegation.key}`);
51
+ assertExactSet(projection.allowed_origins, delegation.allowed_origins, `delegation_projection_origins:${delegation.key}`);
52
+ }
53
+ }
54
+ function validateAcceptedDeltaProjections(state, sources) {
55
+ const delegations = new Map(state.delegations.map((item) => [item.key, item]));
56
+ for (const delta of state.deltas) {
57
+ if (delta.status !== "accepted")
58
+ continue;
59
+ const sourceRows = delta.source_refs.map((sourceRef) => {
60
+ const source = sources.get(sourceRef);
61
+ if (!source)
62
+ invalid(`delta_source_ref_unresolved:${delta.delta_id}:${sourceRef}`);
63
+ return { sourceRef, ...source };
64
+ });
65
+ const meaningDigest = sha256Hex(canonicalValueJson(delta.after_semantics));
66
+ const matchingMeaning = sourceRows.filter(({ projections }) => projections.some((projection) => projection.mode === "explicit-user" &&
67
+ projection.meaning_sha256 === meaningDigest &&
68
+ projection.semantic_kinds.includes(delta.semantic_kind) &&
69
+ projection.allowed_origins.includes(delta.origin) &&
70
+ sameStringSet(projection.target_keys, delta.target_keys)));
71
+ if (delta.decision_authority === "explicit-user") {
72
+ const decisions = matchingMeaning.filter(({ kind }) => kind === "decision");
73
+ if (!decisions.length)
74
+ invalid(`explicit_user_projection_required:${delta.delta_id}`);
75
+ }
76
+ if (delta.decision_authority.startsWith("delegated:")) {
77
+ const key = delta.decision_authority.slice("delegated:".length);
78
+ const delegation = delegations.get(key);
79
+ if (!delegation)
80
+ invalid(`delegation_not_found:${delta.delta_id}:${key}`);
81
+ const source = sourceRows.find((item) => item.sourceRef === delegation.source_ref);
82
+ if (!source?.projections.some((projection) => projection.mode === "delegation" &&
83
+ projection.delegation_key === key &&
84
+ projection.allowed_origins.includes(delta.origin) &&
85
+ projection.allowed_semantic_kinds.includes(delta.semantic_kind) &&
86
+ delta.target_keys.every((target) => projection.allowed_target_keys.includes(target))))
87
+ invalid(`delegation_projection_mismatch:${delta.delta_id}:${key}`);
88
+ }
89
+ const delegatedExactVisual = delta.semantic_kind === "exact-visual" &&
90
+ delta.decision_authority.startsWith("delegated:");
91
+ const delegatedNonvisual = delta.semantic_kind !== "exact-visual" &&
92
+ delta.decision_authority.startsWith("delegated:");
93
+ if (delegatedNonvisual) {
94
+ const key = delta.decision_authority.slice("delegated:".length);
95
+ const delegation = delegations.get(key);
96
+ const independent = matchingMeaning.filter(({ sourceRef, kind }) => sourceRef !== delegation?.source_ref &&
97
+ isDesignResourceAuthoritativeMeaningSourceKind(kind));
98
+ if (!independent.length)
99
+ invalid(`delegated_nonvisual_meaning_projection_required:${delta.delta_id}`);
100
+ }
101
+ else if (!delegatedExactVisual && !matchingMeaning.length)
102
+ invalid(`accepted_meaning_projection_required:${delta.delta_id}`);
103
+ }
104
+ }
105
+ async function loadAuthoritySourceDocument(repository, locator) {
106
+ const snapshot = await readRecoveryRepositoryFile(repository, locator, "design_resource_recovery_authority_source");
107
+ const decoded = decodeDesignResourceText(snapshot.bytes);
108
+ try {
109
+ const parsed = parseSourceDocument(snapshot.relative, decoded.text);
110
+ return {
111
+ rawByteDigest: snapshot.raw_byte_digest,
112
+ items: new Map(parsed.items.map((item) => [
113
+ item.key,
114
+ {
115
+ kind: item.kind,
116
+ text_sha256: item.text_sha256,
117
+ projections: parseAuthorityProjections(snapshot.relative, item.key, item.normalized_text),
118
+ },
119
+ ])),
120
+ };
121
+ }
122
+ catch (error) {
123
+ invalid(`authority_source_parse_failed:${snapshot.relative}:${error.message}`);
124
+ }
125
+ }
126
+ export function parseAuthorityProjections(sourcePath, itemKey, normalizedText) {
127
+ const projections = [];
128
+ for (const [index, line] of normalizedText.split("\n").entries()) {
129
+ if (!line.includes(DESIGN_RESOURCE_AUTHORITY_PROJECTION_SCHEMA))
130
+ continue;
131
+ const match = /^<!-- ty-dra-authority-v1 (\{.*\}) -->$/u.exec(line);
132
+ if (!match)
133
+ invalid(`authority_projection_marker_invalid:${sourcePath}:${itemKey}:${index + 1}`);
134
+ projections.push(parseAuthorityProjection(match[1], `${sourcePath}:${itemKey}:${index + 1}`));
135
+ }
136
+ const identities = projections.map(projectionIdentity);
137
+ if (new Set(identities).size !== identities.length)
138
+ invalid(`authority_projection_duplicate:${sourcePath}:${itemKey}`);
139
+ return projections;
140
+ }
141
+ function parseAuthorityProjection(content, label) {
142
+ const parsed = parseStrictJsonObject(content, `authority_projection:${label}`);
143
+ const header = object(parsed, `authority_projection:${label}`, ["schema_version", "mode"], [
144
+ "target_keys",
145
+ "semantic_kinds",
146
+ "allowed_origins",
147
+ "meaning_sha256",
148
+ "delegation_key",
149
+ "allowed_target_keys",
150
+ "allowed_semantic_kinds",
151
+ ]);
152
+ literal(header.schema_version, DESIGN_RESOURCE_AUTHORITY_PROJECTION_SCHEMA, `authority_projection:${label}.schema_version`);
153
+ const mode = oneOf(header.mode, ["explicit-user", "delegation"], `authority_projection:${label}.mode`);
154
+ if (mode === "explicit-user") {
155
+ const row = object(parsed, `authority_projection:${label}`, [
156
+ "schema_version",
157
+ "mode",
158
+ "target_keys",
159
+ "semantic_kinds",
160
+ "allowed_origins",
161
+ "meaning_sha256",
162
+ ]);
163
+ return {
164
+ schema_version: DESIGN_RESOURCE_AUTHORITY_PROJECTION_SCHEMA,
165
+ mode,
166
+ target_keys: stringSet(row.target_keys, `authority_projection:${label}.target_keys`),
167
+ semantic_kinds: enumSet(row.semantic_kinds, DESIGN_RESOURCE_SEMANTIC_KINDS, `authority_projection:${label}.semantic_kinds`),
168
+ allowed_origins: enumSet(row.allowed_origins, DESIGN_RESOURCE_ORIGINS, `authority_projection:${label}.allowed_origins`),
169
+ meaning_sha256: digest(row.meaning_sha256, `authority_projection:${label}.meaning_sha256`),
170
+ };
171
+ }
172
+ const row = object(parsed, `authority_projection:${label}`, [
173
+ "schema_version",
174
+ "mode",
175
+ "delegation_key",
176
+ "allowed_target_keys",
177
+ "allowed_semantic_kinds",
178
+ "allowed_origins",
179
+ ]);
180
+ const delegationKey = text(row.delegation_key, `authority_projection:${label}.delegation_key`);
181
+ if (!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u.test(delegationKey))
182
+ invalid(`authority_projection_delegation_key_invalid:${label}`);
183
+ return {
184
+ schema_version: DESIGN_RESOURCE_AUTHORITY_PROJECTION_SCHEMA,
185
+ mode,
186
+ delegation_key: delegationKey,
187
+ allowed_target_keys: stringSet(row.allowed_target_keys, `authority_projection:${label}.allowed_target_keys`),
188
+ allowed_semantic_kinds: enumSet(row.allowed_semantic_kinds, DESIGN_RESOURCE_SEMANTIC_KINDS, `authority_projection:${label}.allowed_semantic_kinds`),
189
+ allowed_origins: enumSet(row.allowed_origins, DESIGN_RESOURCE_ORIGINS, `authority_projection:${label}.allowed_origins`),
190
+ };
191
+ }
192
+ function enumSet(value, allowed, label) {
193
+ const result = arrayOf(value, label, (item, itemLabel) => oneOf(item, allowed, itemLabel));
194
+ if (new Set(result).size !== result.length)
195
+ invalid(`authority_projection_duplicate_value:${label}`);
196
+ return result.sort(compareText);
197
+ }
198
+ function projectionIdentity(projection) {
199
+ return canonicalValueJson(projection);
200
+ }
201
+ function assertExactSet(actual, expected, label) {
202
+ const left = [...actual].sort(compareText);
203
+ const right = [...expected].sort(compareText);
204
+ if (left.length !== right.length ||
205
+ left.some((value, index) => value !== right[index]))
206
+ invalid(label);
207
+ }
208
+ function sameStringSet(left, right) {
209
+ const first = [...left].sort(compareText);
210
+ const second = [...right].sort(compareText);
211
+ return (first.length === second.length &&
212
+ first.every((value, index) => value === second[index]));
213
+ }
214
+ function compareText(left, right) {
215
+ return left < right ? -1 : left > right ? 1 : 0;
216
+ }
217
+ function invalid(reason) {
218
+ throw new Error(`design_resource_recovery_invalid:${reason}`);
219
+ }
@@ -0,0 +1,17 @@
1
+ import type { DesignResourceEolPolicy, DesignResourceTextEncoding } from "./design-resource-recovery-types.js";
2
+ import type { DesignResourceExactPatch } from "./design-resource-recovery-patch-types.js";
3
+ export interface DesignResourceDecodedText {
4
+ text: string;
5
+ encoding: DesignResourceTextEncoding;
6
+ eol_policy: DesignResourceEolPolicy;
7
+ }
8
+ export declare function decodeDesignResourceText(bytes: Uint8Array): DesignResourceDecodedText;
9
+ export declare function encodeDesignResourceText(text: string, encoding: DesignResourceTextEncoding): Buffer;
10
+ export declare function applyDesignResourceExactPatch(bytes: Uint8Array, patch: DesignResourceExactPatch, expectedEncoding?: DesignResourceTextEncoding, expectedEol?: Exclude<DesignResourceEolPolicy, "mixed">): {
11
+ bytes: Buffer;
12
+ encoding: DesignResourceTextEncoding;
13
+ eol_policy: Exclude<DesignResourceEolPolicy, "mixed">;
14
+ };
15
+ export declare function verifyDesignResourceExactPatchReadback(bytes: Uint8Array, patch: DesignResourceExactPatch): void;
16
+ export declare function verifyDesignResourceSupersededTextReadback(bytes: Uint8Array, patch: DesignResourceExactPatch, supersedingDeltaIds: ReadonlySet<string>): void;
17
+ export declare function detectEolPolicy(text: string): DesignResourceEolPolicy;
@@ -0,0 +1,186 @@
1
+ import { sha256Hex } from "./strict-codec.js";
2
+ export function decodeDesignResourceText(bytes) {
3
+ let encoding;
4
+ let body;
5
+ if (startsWith(bytes, [0xef, 0xbb, 0xbf])) {
6
+ encoding = "utf8-bom";
7
+ body = bytes.subarray(3);
8
+ }
9
+ else if (startsWith(bytes, [0xff, 0xfe])) {
10
+ encoding = "utf16le";
11
+ body = bytes.subarray(2);
12
+ }
13
+ else if (startsWith(bytes, [0xfe, 0xff])) {
14
+ encoding = "utf16be";
15
+ body = swapUtf16(bytes.subarray(2));
16
+ }
17
+ else {
18
+ encoding = "utf8";
19
+ body = bytes;
20
+ }
21
+ if ((encoding === "utf16le" || encoding === "utf16be") && body.length % 2)
22
+ invalid("odd_utf16_byte_length");
23
+ let text;
24
+ try {
25
+ text = new TextDecoder(encoding === "utf16le" || encoding === "utf16be" ? "utf-16le" : "utf-8", { fatal: true }).decode(body);
26
+ }
27
+ catch {
28
+ invalid(`invalid_${encoding}`);
29
+ }
30
+ if (text.includes("\0"))
31
+ invalid("nul_character_not_allowed");
32
+ return { text, encoding, eol_policy: detectEolPolicy(text) };
33
+ }
34
+ export function encodeDesignResourceText(text, encoding) {
35
+ if (text.includes("\0"))
36
+ invalid("nul_character_not_allowed");
37
+ if (encoding === "utf8")
38
+ return Buffer.from(text, "utf8");
39
+ if (encoding === "utf8-bom")
40
+ return Buffer.concat([Buffer.from([0xef, 0xbb, 0xbf]), Buffer.from(text)]);
41
+ const littleEndian = Buffer.from(text, "utf16le");
42
+ if (encoding === "utf16le")
43
+ return Buffer.concat([Buffer.from([0xff, 0xfe]), littleEndian]);
44
+ return Buffer.concat([
45
+ Buffer.from([0xfe, 0xff]),
46
+ Buffer.from(swapUtf16(littleEndian)),
47
+ ]);
48
+ }
49
+ export function applyDesignResourceExactPatch(bytes, patch, expectedEncoding, expectedEol) {
50
+ const decoded = decodeDesignResourceText(bytes);
51
+ if (decoded.eol_policy === "mixed")
52
+ invalid("mixed_eol_writeback_unsupported");
53
+ if (expectedEncoding && decoded.encoding !== expectedEncoding)
54
+ invalid(`encoding_changed:${expectedEncoding}:${decoded.encoding}`);
55
+ if (expectedEol && decoded.eol_policy !== expectedEol)
56
+ invalid(`eol_changed:${expectedEol}:${decoded.eol_policy}`);
57
+ const operations = resolveOriginalSourceSpans(decoded.text, patch);
58
+ let text = decoded.text;
59
+ for (const operation of [...operations].reverse()) {
60
+ const { start_offset: start, end_offset: end } = operation.source_span;
61
+ text = `${text.slice(0, start)}${operation.after_text}${text.slice(end)}`;
62
+ }
63
+ assertPatchFinalIntervals(text, patch);
64
+ assertPatchAfterTextOccurrences(text, patch);
65
+ const postEol = detectEolPolicy(text);
66
+ if (postEol !== decoded.eol_policy)
67
+ invalid(`patch_changes_eol_policy:${decoded.eol_policy}:${postEol}`);
68
+ return {
69
+ bytes: encodeDesignResourceText(text, decoded.encoding),
70
+ encoding: decoded.encoding,
71
+ eol_policy: decoded.eol_policy,
72
+ };
73
+ }
74
+ export function verifyDesignResourceExactPatchReadback(bytes, patch) {
75
+ const decoded = decodeDesignResourceText(bytes);
76
+ assertPatchFinalIntervals(decoded.text, patch);
77
+ assertPatchAfterTextOccurrences(decoded.text, patch);
78
+ }
79
+ export function verifyDesignResourceSupersededTextReadback(bytes, patch, supersedingDeltaIds) {
80
+ const text = decodeDesignResourceText(bytes).text;
81
+ for (const operation of patch.operations) {
82
+ if (!supersedingDeltaIds.has(operation.delta_id))
83
+ continue;
84
+ const count = occurrenceCount(text, operation.before_text);
85
+ if (count !== 0)
86
+ invalid(`superseded_before_text_leakage:${operation.operation_id}:${count}`);
87
+ }
88
+ }
89
+ export function detectEolPolicy(text) {
90
+ const withoutCrLf = text.replace(/\r\n/gu, "");
91
+ const kinds = [
92
+ text.includes("\r\n") ? "crlf" : null,
93
+ withoutCrLf.includes("\n") ? "lf" : null,
94
+ withoutCrLf.includes("\r") ? "cr" : null,
95
+ ].filter((value) => value !== null);
96
+ if (!kinds.length)
97
+ return "none";
98
+ return kinds.length === 1 ? kinds[0] : "mixed";
99
+ }
100
+ function occurrenceCount(value, search) {
101
+ if (!search)
102
+ invalid("patch_before_text_empty");
103
+ let count = 0;
104
+ let offset = 0;
105
+ while (true) {
106
+ const found = value.indexOf(search, offset);
107
+ if (found < 0)
108
+ return count;
109
+ count += 1;
110
+ offset = found + search.length;
111
+ }
112
+ }
113
+ function resolveOriginalSourceSpans(text, patch) {
114
+ const operations = [...patch.operations].sort((left, right) => left.source_span.start_offset - right.source_span.start_offset ||
115
+ left.source_span.end_offset - right.source_span.end_offset ||
116
+ left.operation_id.localeCompare(right.operation_id));
117
+ let previous;
118
+ for (const operation of operations) {
119
+ const span = operation.source_span;
120
+ if (span.coordinate_system !== "utf16-code-unit-v1" ||
121
+ span.start_offset < 0 ||
122
+ span.end_offset <= span.start_offset ||
123
+ span.end_offset > text.length ||
124
+ span.end_offset - span.start_offset !== operation.before_text.length)
125
+ invalid(`patch_source_span_range:${operation.operation_id}`);
126
+ const actual = text.slice(span.start_offset, span.end_offset);
127
+ if (actual !== operation.before_text ||
128
+ sha256Hex(actual) !== span.before_text_sha256 ||
129
+ span.before_text_sha256 !== operation.before_text_sha256)
130
+ invalid(`patch_source_span_preimage:${operation.operation_id}`);
131
+ if ((operation.operation === "remove" ||
132
+ (operation.operation === "add" &&
133
+ operation.after_text.startsWith("<!-- ty-dra-proposal-scalar-v1 "))) &&
134
+ span.start_offset > 0 &&
135
+ !["\n", "\r"].includes(text[span.start_offset - 1]))
136
+ invalid(`patch_carrier_line_boundary:${operation.operation_id}`);
137
+ const count = occurrenceCount(text, operation.before_text);
138
+ if (count !== operation.expected_occurrences)
139
+ invalid(`patch_occurrence_mismatch:${operation.operation_id}:${operation.expected_occurrences}:${count}`);
140
+ if (previous && span.start_offset < previous.source_span.end_offset)
141
+ invalid(`patch_source_span_overlap:${previous.operation_id}:${operation.operation_id}`);
142
+ previous = operation;
143
+ }
144
+ return operations;
145
+ }
146
+ function assertPatchFinalIntervals(text, patch) {
147
+ const operations = [...patch.operations].sort((left, right) => left.source_span.start_offset - right.source_span.start_offset ||
148
+ left.source_span.end_offset - right.source_span.end_offset ||
149
+ left.operation_id.localeCompare(right.operation_id));
150
+ let offsetDelta = 0;
151
+ for (const operation of operations) {
152
+ const start = operation.source_span.start_offset + offsetDelta;
153
+ const end = start + operation.after_text.length;
154
+ if (start < 0 ||
155
+ end > text.length ||
156
+ text.slice(start, end) !== operation.after_text)
157
+ invalid(`patch_readback_output_span:${operation.operation_id}`);
158
+ offsetDelta +=
159
+ operation.after_text.length -
160
+ (operation.source_span.end_offset - operation.source_span.start_offset);
161
+ }
162
+ }
163
+ function assertPatchAfterTextOccurrences(text, patch) {
164
+ for (const operation of patch.operations) {
165
+ const remove = operation.operation === "remove";
166
+ const count = occurrenceCount(text, remove ? operation.before_text : operation.after_text);
167
+ const expected = remove ? 0 : operation.expected_occurrences;
168
+ if (count !== expected)
169
+ invalid(`${remove ? "patch_remove_before_still_present" : "patch_after_occurrence_mismatch"}:${operation.operation_id}:${expected}:${count}`);
170
+ }
171
+ }
172
+ function startsWith(bytes, prefix) {
173
+ return prefix.every((value, index) => bytes[index] === value);
174
+ }
175
+ function swapUtf16(bytes) {
176
+ const result = Uint8Array.from(bytes);
177
+ for (let index = 0; index < result.length; index += 2) {
178
+ const first = result[index];
179
+ result[index] = result[index + 1];
180
+ result[index + 1] = first;
181
+ }
182
+ return result;
183
+ }
184
+ function invalid(reason) {
185
+ throw new Error(`design_resource_recovery_invalid:text:${reason}`);
186
+ }