project-tiny-context-harness 0.8.10 → 0.8.12

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 (279) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +490 -472
  3. package/assets/README.md +762 -749
  4. package/assets/README.zh-CN.md +446 -431
  5. package/assets/agents/.gitkeep +1 -1
  6. package/assets/agents/AGENTS_CORE.md +17 -23
  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 +64 -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 +52 -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 +119 -119
  30. package/assets/skills/design-resource-authoring/references/resource-selection.md +158 -181
  31. package/assets/skills/design-system-authoring/SKILL.md +57 -57
  32. package/assets/skills/design-system-authoring/agents/openai.yaml +6 -6
  33. package/assets/skills/design-system-authoring/references/authority-adoption.md +48 -48
  34. package/assets/skills/design-system-authoring/references/open-design-design-system-provider.md +110 -110
  35. package/assets/skills/long-task-workflow/SKILL.md +71 -106
  36. package/assets/skills/long-task-workflow/agents/openai.yaml +1 -1
  37. package/assets/skills/long-task-workflow/references/authority-lifecycle.md +71 -69
  38. package/assets/skills/long-task-workflow/references/contract-authoring.md +98 -94
  39. package/assets/skills/long-task-workflow/references/evidence-design.md +67 -63
  40. package/assets/skills/long-task-workflow/references/source-authoring.md +90 -90
  41. package/assets/tools/validate_context.py +442 -442
  42. package/dist/commands/design-resource.js +9 -2
  43. package/dist/commands/enable.js +2 -0
  44. package/dist/commands/index.js +1 -1
  45. package/dist/commands/long-task-revision.js +8 -7
  46. package/dist/commands/sync.js +2 -0
  47. package/dist/index.d.ts +3 -4
  48. package/dist/index.js +2 -1
  49. package/dist/lib/compact-authoring-support.d.ts +22 -0
  50. package/dist/lib/compact-authoring-support.js +143 -0
  51. package/dist/lib/compact-shared-structure-authoring.d.ts +5 -0
  52. package/dist/lib/compact-shared-structure-authoring.js +9 -0
  53. package/dist/lib/compact-shared-structure-types.d.ts +61 -0
  54. package/dist/lib/compact-shared-structure-types.js +1 -0
  55. package/dist/lib/compact-shared-structure-validation.d.ts +2 -0
  56. package/dist/lib/compact-shared-structure-validation.js +159 -0
  57. package/dist/lib/compact-shared-structures.d.ts +3 -0
  58. package/dist/lib/compact-shared-structures.js +204 -0
  59. package/dist/lib/design-resource-fact-enums.d.ts +4 -0
  60. package/dist/lib/design-resource-fact-enums.js +12 -0
  61. package/dist/lib/design-resource-fact-manifest-shape-evidence.js +2 -2
  62. package/dist/lib/design-resource-fact-manifest-validation.d.ts +2 -1
  63. package/dist/lib/design-resource-fact-policy.d.ts +2 -2
  64. package/dist/lib/design-resource-fact-types.d.ts +2 -2
  65. package/dist/lib/design-resource-handoff-bundle-draft.d.ts +11 -0
  66. package/dist/lib/design-resource-handoff-bundle-draft.js +40 -0
  67. package/dist/lib/design-resource-handoff-bundle.js +4 -28
  68. package/dist/lib/design-resource-handoff-input-types.d.ts +14 -0
  69. package/dist/lib/design-resource-handoff-input-types.js +1 -0
  70. package/dist/lib/design-resource-handoff-manifest-projection.d.ts +2 -1
  71. package/dist/lib/design-resource-handoff-parser.d.ts +2 -2
  72. package/dist/lib/design-resource-handoff-parser.js +2 -2
  73. package/dist/lib/design-resource-handoff-shape.d.ts +4 -1
  74. package/dist/lib/design-resource-handoff-shape.js +10 -0
  75. package/dist/lib/design-resource-handoff-snapshot.d.ts +1 -1
  76. package/dist/lib/design-resource-handoff-snapshot.js +4 -0
  77. package/dist/lib/design-resource-handoff-types.d.ts +0 -10
  78. package/dist/lib/design-resource-handoff-validation.d.ts +6 -2
  79. package/dist/lib/design-resource-handoff-validation.js +11 -0
  80. package/dist/lib/design-resource-handoff-web-dependency-validation.d.ts +4 -2
  81. package/dist/lib/design-resource-symbolic-applicability-authority.d.ts +7 -0
  82. package/dist/lib/design-resource-symbolic-applicability-authority.js +19 -0
  83. package/dist/lib/design-resource-symbolic-applicability-policy.d.ts +12 -0
  84. package/dist/lib/design-resource-symbolic-applicability-policy.js +79 -0
  85. package/dist/lib/design-resource-symbolic-applicability-profiles.d.ts +8 -0
  86. package/dist/lib/design-resource-symbolic-applicability-profiles.js +55 -0
  87. package/dist/lib/design-resource-symbolic-applicability-shape.d.ts +2 -0
  88. package/dist/lib/design-resource-symbolic-applicability-shape.js +76 -0
  89. package/dist/lib/design-resource-symbolic-applicability-validation.d.ts +7 -0
  90. package/dist/lib/design-resource-symbolic-applicability-validation.js +128 -0
  91. package/dist/lib/design-resource-symbolic-compilation.d.ts +3 -0
  92. package/dist/lib/design-resource-symbolic-compilation.js +13 -0
  93. package/dist/lib/design-resource-symbolic-denotation.d.ts +3 -0
  94. package/dist/lib/design-resource-symbolic-denotation.js +167 -0
  95. package/dist/lib/design-resource-symbolic-disposition-validation.d.ts +4 -0
  96. package/dist/lib/design-resource-symbolic-disposition-validation.js +28 -0
  97. package/dist/lib/design-resource-symbolic-fact-policy.d.ts +12 -0
  98. package/dist/lib/design-resource-symbolic-fact-policy.js +12 -0
  99. package/dist/lib/design-resource-symbolic-fact-shape.d.ts +3 -0
  100. package/dist/lib/design-resource-symbolic-fact-shape.js +138 -0
  101. package/dist/lib/design-resource-symbolic-fact-types.d.ts +213 -0
  102. package/dist/lib/design-resource-symbolic-fact-types.js +1 -0
  103. package/dist/lib/design-resource-symbolic-fact-validation.d.ts +3 -0
  104. package/dist/lib/design-resource-symbolic-fact-validation.js +86 -0
  105. package/dist/lib/design-resource-symbolic-indexes.d.ts +23 -0
  106. package/dist/lib/design-resource-symbolic-indexes.js +54 -0
  107. package/dist/lib/design-resource-symbolic-manifest-shape.d.ts +3 -0
  108. package/dist/lib/design-resource-symbolic-manifest-shape.js +155 -0
  109. package/dist/lib/design-resource-symbolic-manifest-validation.d.ts +6 -0
  110. package/dist/lib/design-resource-symbolic-manifest-validation.js +132 -0
  111. package/dist/lib/design-resource-symbolic-noninterference-artifact.d.ts +33 -0
  112. package/dist/lib/design-resource-symbolic-noninterference-artifact.js +110 -0
  113. package/dist/lib/design-resource-symbolic-noninterference-equivalence.d.ts +3 -0
  114. package/dist/lib/design-resource-symbolic-noninterference-equivalence.js +77 -0
  115. package/dist/lib/design-resource-symbolic-noninterference-recompute.d.ts +4 -0
  116. package/dist/lib/design-resource-symbolic-noninterference-recompute.js +146 -0
  117. package/dist/lib/design-resource-symbolic-noninterference-scope.d.ts +7 -0
  118. package/dist/lib/design-resource-symbolic-noninterference-scope.js +49 -0
  119. package/dist/lib/design-resource-symbolic-noninterference-shape.d.ts +2 -0
  120. package/dist/lib/design-resource-symbolic-noninterference-shape.js +152 -0
  121. package/dist/lib/design-resource-symbolic-noninterference-types.d.ts +103 -0
  122. package/dist/lib/design-resource-symbolic-noninterference-types.js +1 -0
  123. package/dist/lib/design-resource-symbolic-noninterference-validation.d.ts +5 -0
  124. package/dist/lib/design-resource-symbolic-noninterference-validation.js +62 -0
  125. package/dist/lib/design-resource-symbolic-oracle-fingerprint.d.ts +1 -0
  126. package/dist/lib/design-resource-symbolic-oracle-fingerprint.js +47 -0
  127. package/dist/lib/design-resource-symbolic-predicate-shape.d.ts +6 -0
  128. package/dist/lib/design-resource-symbolic-predicate-shape.js +123 -0
  129. package/dist/lib/design-resource-symbolic-production-closure.d.ts +4 -0
  130. package/dist/lib/design-resource-symbolic-production-closure.js +144 -0
  131. package/dist/lib/design-resource-symbolic-proof-authority-validation.d.ts +10 -0
  132. package/dist/lib/design-resource-symbolic-proof-authority-validation.js +68 -0
  133. package/dist/lib/design-resource-symbolic-proof-validation.d.ts +10 -0
  134. package/dist/lib/design-resource-symbolic-proof-validation.js +89 -0
  135. package/dist/lib/design-resource-symbolic-region-validation.d.ts +19 -0
  136. package/dist/lib/design-resource-symbolic-region-validation.js +146 -0
  137. package/dist/lib/design-resource-symbolic-resource-validation.d.ts +5 -0
  138. package/dist/lib/design-resource-symbolic-resource-validation.js +90 -0
  139. package/dist/lib/design-resource-symbolic-rule-shape.d.ts +27 -0
  140. package/dist/lib/design-resource-symbolic-rule-shape.js +158 -0
  141. package/dist/lib/design-resource-symbolic-safety-validation.d.ts +6 -0
  142. package/dist/lib/design-resource-symbolic-safety-validation.js +29 -0
  143. package/dist/lib/design-resource-symbolic-source-ir-evaluation.d.ts +19 -0
  144. package/dist/lib/design-resource-symbolic-source-ir-evaluation.js +74 -0
  145. package/dist/lib/design-resource-symbolic-source-ir-evidence.d.ts +44 -0
  146. package/dist/lib/design-resource-symbolic-source-ir-evidence.js +88 -0
  147. package/dist/lib/design-resource-symbolic-source-ir-oracle.d.ts +13 -0
  148. package/dist/lib/design-resource-symbolic-source-ir-oracle.js +96 -0
  149. package/dist/lib/design-resource-symbolic-source-ir-proof.d.ts +14 -0
  150. package/dist/lib/design-resource-symbolic-source-ir-proof.js +98 -0
  151. package/dist/lib/design-resource-symbolic-source-ir-shape.d.ts +2 -0
  152. package/dist/lib/design-resource-symbolic-source-ir-shape.js +38 -0
  153. package/dist/lib/design-resource-symbolic-source-ir-types.d.ts +17 -0
  154. package/dist/lib/design-resource-symbolic-source-ir-types.js +2 -0
  155. package/dist/lib/design-resource-symbolic-static-dependency-validation.d.ts +2 -0
  156. package/dist/lib/design-resource-symbolic-static-dependency-validation.js +83 -0
  157. package/dist/lib/design-resource-symbolic-structural-closure-validation.d.ts +6 -0
  158. package/dist/lib/design-resource-symbolic-structural-closure-validation.js +79 -0
  159. package/dist/lib/design-resource-symbolic-validation-support.d.ts +29 -0
  160. package/dist/lib/design-resource-symbolic-validation-support.js +111 -0
  161. package/dist/lib/design-resource-v1-capacity-header.d.ts +8 -0
  162. package/dist/lib/design-resource-v1-capacity-header.js +231 -0
  163. package/dist/lib/design-resource-v1-capacity.d.ts +5 -0
  164. package/dist/lib/design-resource-v1-capacity.js +45 -0
  165. package/dist/lib/init.js +1 -0
  166. package/dist/lib/long-task-activation-validation.js +2 -2
  167. package/dist/lib/long-task-authority-policy.d.ts +3 -0
  168. package/dist/lib/long-task-authority-policy.js +3 -0
  169. package/dist/lib/long-task-codex-agent-profile.d.ts +42 -0
  170. package/dist/lib/long-task-codex-agent-profile.js +276 -0
  171. package/dist/lib/long-task-compact-authoring-projections.d.ts +12 -0
  172. package/dist/lib/long-task-compact-authoring-projections.js +67 -0
  173. package/dist/lib/long-task-compact-authoring.d.ts +3 -0
  174. package/dist/lib/long-task-compact-authoring.js +173 -0
  175. package/dist/lib/long-task-compact-carrier.d.ts +7 -0
  176. package/dist/lib/long-task-compact-carrier.js +132 -0
  177. package/dist/lib/long-task-compact-parser.d.ts +14 -0
  178. package/dist/lib/long-task-compact-parser.js +123 -0
  179. package/dist/lib/long-task-compact-primitives.d.ts +22 -0
  180. package/dist/lib/long-task-compact-primitives.js +132 -0
  181. package/dist/lib/long-task-compact-projections.d.ts +4 -0
  182. package/dist/lib/long-task-compact-projections.js +153 -0
  183. package/dist/lib/long-task-compact-structure-targets.d.ts +2 -0
  184. package/dist/lib/long-task-compact-structure-targets.js +90 -0
  185. package/dist/lib/long-task-counterfactual-sandbox.d.ts +1 -1
  186. package/dist/lib/long-task-counterfactual-sandbox.js +7 -5
  187. package/dist/lib/long-task-delivery-parser.d.ts +1 -0
  188. package/dist/lib/long-task-delivery-parser.js +38 -6
  189. package/dist/lib/long-task-design-resource-handoff.d.ts +2 -1
  190. package/dist/lib/long-task-design-resource-handoff.js +71 -11
  191. package/dist/lib/long-task-design-resource-method-binding.d.ts +8 -1
  192. package/dist/lib/long-task-design-resource-method-binding.js +150 -0
  193. package/dist/lib/long-task-evidence-capability-codec.js +256 -34
  194. package/dist/lib/long-task-evidence-capability-policy.js +28 -0
  195. package/dist/lib/long-task-evidence-capability-runtime.js +271 -63
  196. package/dist/lib/long-task-evidence-capability-types.d.ts +70 -2
  197. package/dist/lib/long-task-evidence-v2.d.ts +1 -1
  198. package/dist/lib/long-task-evidence-v2.js +5 -5
  199. package/dist/lib/long-task-hook-install.d.ts +19 -2
  200. package/dist/lib/long-task-hook-install.js +288 -91
  201. package/dist/lib/long-task-playwright-capability-records.d.ts +2 -0
  202. package/dist/lib/long-task-playwright-capability-records.js +74 -2
  203. package/dist/lib/long-task-runner-freeze.d.ts +1 -1
  204. package/dist/lib/long-task-runner-freeze.js +4 -2
  205. package/dist/lib/long-task-semantic-contract-types.d.ts +1 -1
  206. package/dist/lib/long-task-semantic-fact-binding-types.d.ts +8 -0
  207. package/dist/lib/long-task-semantic-fact-closure.js +4 -1
  208. package/dist/lib/long-task-semantic-fact-contract-closure.d.ts +1 -1
  209. package/dist/lib/long-task-semantic-fact-contract-closure.js +15 -3
  210. package/dist/lib/long-task-semantic-fact-contract-facts.d.ts +1 -1
  211. package/dist/lib/long-task-semantic-fact-contract-facts.js +4 -1
  212. package/dist/lib/long-task-semantic-fact-contract-proofs.d.ts +1 -1
  213. package/dist/lib/long-task-semantic-fact-contract-proofs.js +12 -3
  214. package/dist/lib/long-task-semantic-fact-evidence.d.ts +5 -1
  215. package/dist/lib/long-task-semantic-fact-evidence.js +47 -4
  216. package/dist/lib/long-task-semantic-fact-shape.js +17 -6
  217. package/dist/lib/long-task-shape-primitives.d.ts +1 -1
  218. package/dist/lib/long-task-shape-primitives.js +1 -0
  219. package/dist/lib/long-task-source-item-parser.d.ts +2 -2
  220. package/dist/lib/long-task-source-item-parser.js +20 -11
  221. package/dist/lib/long-task-ui-design-policy.js +64 -4
  222. package/dist/lib/long-task-ui-surface-shape.js +195 -0
  223. package/dist/lib/long-task-ui-surface-types.d.ts +53 -0
  224. package/dist/lib/long-task-verifier-v2.js +1 -1
  225. package/dist/lib/long-task-worker-selection.d.ts +2 -0
  226. package/dist/lib/long-task-worker-selection.js +7 -0
  227. package/dist/lib/long-task-workspace-scope.js +3 -1
  228. package/dist/lib/long-task-workspace.js +11 -1
  229. package/dist/lib/migrations.js +58 -0
  230. package/dist/lib/profiles.js +0 -1
  231. package/dist/lib/semantic-fact-compact-authoring.d.ts +2 -0
  232. package/dist/lib/semantic-fact-compact-authoring.js +160 -0
  233. package/dist/lib/semantic-fact-compact-capacity.d.ts +9 -0
  234. package/dist/lib/semantic-fact-compact-capacity.js +40 -0
  235. package/dist/lib/semantic-fact-compact-carrier.d.ts +16 -0
  236. package/dist/lib/semantic-fact-compact-carrier.js +146 -0
  237. package/dist/lib/semantic-fact-compact-parser.d.ts +17 -0
  238. package/dist/lib/semantic-fact-compact-parser.js +168 -0
  239. package/dist/lib/semantic-fact-compact-revision.d.ts +11 -0
  240. package/dist/lib/semantic-fact-compact-revision.js +64 -0
  241. package/dist/lib/semantic-fact-compact-support.d.ts +23 -0
  242. package/dist/lib/semantic-fact-compact-support.js +159 -0
  243. package/dist/lib/semantic-fact-policy-census.d.ts +1 -0
  244. package/dist/lib/semantic-fact-policy-census.js +43 -0
  245. package/dist/lib/semantic-fact-proof-shape.d.ts +1 -1
  246. package/dist/lib/semantic-fact-property-shape.d.ts +1 -1
  247. package/dist/lib/semantic-fact-source-parser.d.ts +5 -0
  248. package/dist/lib/semantic-fact-source-parser.js +47 -6
  249. package/dist/lib/structural-closure-cost.d.ts +79 -0
  250. package/dist/lib/structural-closure-cost.js +91 -0
  251. package/dist/lib/symbolic-denotation-dag-builder.d.ts +25 -0
  252. package/dist/lib/symbolic-denotation-dag-builder.js +176 -0
  253. package/dist/lib/symbolic-denotation-domain-validation.d.ts +3 -0
  254. package/dist/lib/symbolic-denotation-domain-validation.js +56 -0
  255. package/dist/lib/symbolic-denotation-engine.d.ts +32 -0
  256. package/dist/lib/symbolic-denotation-engine.js +140 -0
  257. package/dist/lib/symbolic-denotation-public.d.ts +11 -0
  258. package/dist/lib/symbolic-denotation-public.js +12 -0
  259. package/dist/lib/symbolic-denotation-runtime.d.ts +20 -0
  260. package/dist/lib/symbolic-denotation-runtime.js +90 -0
  261. package/dist/lib/symbolic-denotation-support.d.ts +11 -0
  262. package/dist/lib/symbolic-denotation-support.js +49 -0
  263. package/dist/lib/symbolic-denotation-types.d.ts +133 -0
  264. package/dist/lib/symbolic-denotation-types.js +18 -0
  265. package/dist/lib/symbolic-denotation-validation.d.ts +6 -0
  266. package/dist/lib/symbolic-denotation-validation.js +126 -0
  267. package/dist/lib/sync-engine.d.ts +1 -0
  268. package/dist/lib/sync-engine.js +4 -1
  269. package/dist/lib/upgrade.js +1 -0
  270. package/dist/long-task-hook.js +40 -1
  271. package/dist/public-types.d.ts +8 -0
  272. package/dist/public-types.js +1 -0
  273. package/dist/schemas/design-resource-symbolic-noninterference-artifact-v2.schema.json +289 -0
  274. package/dist/schemas/design-resource-symbolic-source-ir-v1.schema.json +130 -0
  275. package/dist/schemas/long-task-delivery-v2/long-task-delivery-v2.schema.json +390 -5
  276. package/migrations/README.md +15 -15
  277. package/package.json +2 -2
  278. package/source-mappings.yaml +28 -25
  279. package/assets/skills/source-plan-authoring/SKILL.md +0 -14
@@ -0,0 +1,204 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { canonicalValueJson, sha256Hex } from "./strict-codec.js";
3
+ const STABLE_BOUNDARY = /^[a-z0-9][a-z0-9._:-]*$/u;
4
+ const MINIMUM_NET_SAVING_BYTES = 32;
5
+ export function createCompactSharedStructures(slotsInput) {
6
+ const slots = slotsInput.map((slot, index) => ({
7
+ boundary: validBoundary(slot.boundary, `slots[${index}].boundary`),
8
+ value: structuredClone(slot.value),
9
+ }));
10
+ const grouped = new Map();
11
+ for (const [slotIndex, slot] of slots.entries()) {
12
+ if (!isCandidateComposite(slot.value))
13
+ continue;
14
+ const descriptor = describeStructure(slot.value);
15
+ const identity = `${slot.boundary}\0${canonicalValueJson(descriptor.shape)}`;
16
+ const occurrences = grouped.get(identity) ?? [];
17
+ occurrences.push({
18
+ slot_index: slotIndex,
19
+ value: slot.value,
20
+ leaves: descriptor.leaves,
21
+ original_bytes: byteLength(slot.value),
22
+ });
23
+ grouped.set(identity, occurrences);
24
+ }
25
+ const candidateClusters = [...grouped.values()]
26
+ .filter((occurrences) => occurrences.length > 1)
27
+ .flatMap(partitionStableCandidateFamilies)
28
+ .filter((group) => group.occurrences.length > 1);
29
+ const candidates = candidateClusters
30
+ .map(({ occurrences, parameter_positions }) => buildCandidate(slots, occurrences, parameter_positions))
31
+ .filter((candidate) => candidate !== null)
32
+ .sort((left, right) => left.row.key.localeCompare(right.row.key));
33
+ const bySlot = new Map();
34
+ for (const candidate of candidates)
35
+ for (const occurrence of candidate.occurrences)
36
+ bySlot.set(occurrence.slot_index, candidate);
37
+ for (const [slotIndex, candidate] of bySlot) {
38
+ const occurrenceIndex = candidate.occurrences.findIndex((item) => item.slot_index === slotIndex);
39
+ slots[slotIndex].value = structuredClone(candidate.references[occurrenceIndex]);
40
+ }
41
+ const catalog = candidates.map((candidate) => candidate.row);
42
+ const originalPayloadBytes = slotsInput.reduce((sum, slot) => sum + byteLength(slot.value), 0);
43
+ const encodedPayloadBytes = slots.reduce((sum, slot) => sum + byteLength(slot.value), 0);
44
+ const catalogBytes = byteLength(catalog);
45
+ const familyStatistics = candidates
46
+ .map((candidate) => candidate.statistic)
47
+ .sort((left, right) => right.saved_bytes - left.saved_bytes ||
48
+ left.key.localeCompare(right.key));
49
+ return {
50
+ slots,
51
+ catalog,
52
+ statistics: {
53
+ slot_count: slots.length,
54
+ composite_slot_count: slotsInput.filter((slot) => isCandidateComposite(slot.value)).length,
55
+ candidate_family_count: candidateClusters.length,
56
+ emitted_family_count: catalog.length,
57
+ exact_family_count: catalog.filter((item) => item.parameter_count === 0)
58
+ .length,
59
+ parameterized_family_count: catalog.filter((item) => item.parameter_count > 0).length,
60
+ reference_count: candidates.reduce((sum, candidate) => sum + candidate.occurrences.length, 0),
61
+ argument_count: candidates.reduce((sum, candidate) => sum + candidate.occurrences.length * candidate.row.parameter_count, 0),
62
+ original_payload_bytes: originalPayloadBytes,
63
+ encoded_payload_bytes: encodedPayloadBytes,
64
+ catalog_bytes: catalogBytes,
65
+ saved_bytes: originalPayloadBytes - encodedPayloadBytes - catalogBytes,
66
+ remaining_beneficial_candidates: 0,
67
+ families: familyStatistics,
68
+ },
69
+ };
70
+ }
71
+ function buildCandidate(slots, occurrences, parameterPositions) {
72
+ const boundary = slots[occurrences[0].slot_index].boundary;
73
+ const parameterByPosition = new Map(parameterPositions.map((position, index) => [position, index]));
74
+ const template = buildTemplate(occurrences[0].value, parameterByPosition);
75
+ const parameterCount = parameterPositions.length;
76
+ const digest = sha256Hex(canonicalValueJson({ boundary, parameter_count: parameterCount, template }));
77
+ const key = `structure.${digest.slice(0, 24)}`;
78
+ const row = {
79
+ key,
80
+ digest,
81
+ boundary,
82
+ parameter_count: parameterCount,
83
+ template,
84
+ };
85
+ const references = occurrences.map((occurrence) => ({
86
+ structure_ref: key,
87
+ arguments: parameterPositions.map((position) => structuredClone(occurrence.leaves[position])),
88
+ }));
89
+ const originalBytes = occurrences.reduce((sum, occurrence) => sum + occurrence.original_bytes, 0);
90
+ const encodedBytes = byteLength(row) +
91
+ references.reduce((sum, reference) => sum + byteLength(reference), 0);
92
+ const savedBytes = originalBytes - encodedBytes;
93
+ if (savedBytes < MINIMUM_NET_SAVING_BYTES)
94
+ return null;
95
+ return {
96
+ boundary,
97
+ occurrences,
98
+ parameter_positions: parameterPositions,
99
+ template,
100
+ row,
101
+ references,
102
+ statistic: {
103
+ key,
104
+ boundary,
105
+ occurrences: occurrences.length,
106
+ parameter_count: parameterCount,
107
+ original_bytes: originalBytes,
108
+ encoded_bytes: encodedBytes,
109
+ saved_bytes: savedBytes,
110
+ },
111
+ };
112
+ }
113
+ function partitionStableCandidateFamilies(occurrences) {
114
+ const leafCount = occurrences[0].leaves.length;
115
+ const parameterPositions = [];
116
+ const constantPositions = [];
117
+ for (let index = 0; index < leafCount; index += 1) {
118
+ const distinct = new Set(occurrences.map((occurrence) => canonicalValueJson(occurrence.leaves[index]))).size;
119
+ if (distinct >= 3 && distinct / occurrences.length >= 0.2)
120
+ parameterPositions.push(index);
121
+ else
122
+ constantPositions.push(index);
123
+ }
124
+ const clusters = new Map();
125
+ for (const occurrence of occurrences) {
126
+ const identity = canonicalValueJson(constantPositions.map((position) => occurrence.leaves[position]));
127
+ const cluster = clusters.get(identity) ?? [];
128
+ cluster.push(occurrence);
129
+ clusters.set(identity, cluster);
130
+ }
131
+ return [...clusters.values()].map((cluster) => ({
132
+ occurrences: cluster,
133
+ parameter_positions: parameterPositions,
134
+ }));
135
+ }
136
+ function describeStructure(value) {
137
+ const leaves = [];
138
+ const visit = (item) => {
139
+ if (Array.isArray(item))
140
+ return ["array", item.map(visit)];
141
+ if (item && typeof item === "object")
142
+ return [
143
+ "object",
144
+ Object.keys(item)
145
+ .sort()
146
+ .map((key) => [key, visit(item[key])]),
147
+ ];
148
+ leaves.push(item);
149
+ return ["leaf", leafKind(item)];
150
+ };
151
+ return { shape: visit(value), leaves };
152
+ }
153
+ function buildTemplate(value, parameterByPosition) {
154
+ let leafIndex = 0;
155
+ const visit = (item) => {
156
+ if (Array.isArray(item))
157
+ return item.map(visit);
158
+ if (item && typeof item === "object")
159
+ return Object.fromEntries(Object.keys(item)
160
+ .sort()
161
+ .map((key) => [key, visit(item[key])]));
162
+ const parameterIndex = parameterByPosition.get(leafIndex);
163
+ leafIndex += 1;
164
+ return parameterIndex === undefined
165
+ ? structuredClone(item)
166
+ : { parameter_index: parameterIndex };
167
+ };
168
+ return visit(value);
169
+ }
170
+ function isCandidateComposite(value) {
171
+ if (!value || typeof value !== "object")
172
+ return false;
173
+ if (!Array.isArray(value)) {
174
+ const row = value;
175
+ if (Object.keys(row).length === 1 &&
176
+ (Object.hasOwn(row, "selector_ref") ||
177
+ Object.hasOwn(row, "structure_ref") ||
178
+ Object.hasOwn(row, "parameter_index")))
179
+ return false;
180
+ }
181
+ return true;
182
+ }
183
+ function leafKind(value) {
184
+ if (value === null)
185
+ return "null";
186
+ if (typeof value === "string")
187
+ return "string";
188
+ if (typeof value === "boolean")
189
+ return "boolean";
190
+ if (typeof value === "number" && Number.isFinite(value))
191
+ return "number";
192
+ fail("value", `unsupported scalar: ${typeof value}`);
193
+ }
194
+ function validBoundary(value, label) {
195
+ if (typeof value !== "string" || !STABLE_BOUNDARY.test(value))
196
+ fail(label, "must be a stable lowercase boundary");
197
+ return value;
198
+ }
199
+ function byteLength(value) {
200
+ return Buffer.byteLength(canonicalValueJson(value), "utf8");
201
+ }
202
+ function fail(label, message) {
203
+ throw new Error(`compact_shared_structure_invalid:${label}:${message}`);
204
+ }
@@ -16,5 +16,9 @@ export declare const DESIGN_RESOURCE_COMPARATORS: readonly ["exact_value", "nume
16
16
  export type DesignResourceComparator = (typeof DESIGN_RESOURCE_COMPARATORS)[number];
17
17
  export declare const DESIGN_RESOURCE_INSPECTOR_CAPABILITIES: readonly ["html_dom", "css_cascade", "javascript_static", "json", "svg", "markdown", "assets", "design_tokens", "component_anatomy", "prototype_transitions", "responsive_rules", "input_rules", "accessibility", "motion", "localization", "system_ui", "haptics", "audio", "render_capture", "geometry_measurement", "custom_properties", "relations", "dynamic_population"];
18
18
  export type DesignResourceInspectorCapability = (typeof DESIGN_RESOURCE_INSPECTOR_CAPABILITIES)[number];
19
+ export declare const DESIGN_RESOURCE_SYMBOLIC_NONINTERFERENCE_ORACLE_CAPABILITIES: readonly ["symbolic_noninterference.source.closed_world_static_dependency_closure", "symbolic_noninterference.source.restricted_ir_symbolic_equivalence", "symbolic_noninterference.source.finite_complete_domain_exhaustive_equivalence", "symbolic_noninterference.production.closed_world_static_dependency_closure", "symbolic_noninterference.production.restricted_ir_symbolic_equivalence", "symbolic_noninterference.production.finite_complete_domain_exhaustive_equivalence"];
20
+ export type DesignResourceSymbolicNoninterferenceOracleCapability = (typeof DESIGN_RESOURCE_SYMBOLIC_NONINTERFERENCE_ORACLE_CAPABILITIES)[number];
21
+ export declare const DESIGN_RESOURCE_ORACLE_CAPABILITIES: readonly ["html_dom", "css_cascade", "javascript_static", "json", "svg", "markdown", "assets", "design_tokens", "component_anatomy", "prototype_transitions", "responsive_rules", "input_rules", "accessibility", "motion", "localization", "system_ui", "haptics", "audio", "render_capture", "geometry_measurement", "custom_properties", "relations", "dynamic_population", "symbolic_noninterference.source.closed_world_static_dependency_closure", "symbolic_noninterference.source.restricted_ir_symbolic_equivalence", "symbolic_noninterference.source.finite_complete_domain_exhaustive_equivalence", "symbolic_noninterference.production.closed_world_static_dependency_closure", "symbolic_noninterference.production.restricted_ir_symbolic_equivalence", "symbolic_noninterference.production.finite_complete_domain_exhaustive_equivalence"];
22
+ export type DesignResourceOracleCapability = (typeof DESIGN_RESOURCE_ORACLE_CAPABILITIES)[number];
19
23
  export declare const DESIGN_RESOURCE_CENSUS_KINDS: readonly ["resource", "node", "declaration", "token", "asset_reference", "relation", "custom_property", "variant", "state", "interaction_phase", "dynamic_population"];
20
24
  export type DesignResourceCensusKind = (typeof DESIGN_RESOURCE_CENSUS_KINDS)[number];
@@ -155,6 +155,18 @@ export const DESIGN_RESOURCE_INSPECTOR_CAPABILITIES = [
155
155
  "relations",
156
156
  "dynamic_population",
157
157
  ];
158
+ export const DESIGN_RESOURCE_SYMBOLIC_NONINTERFERENCE_ORACLE_CAPABILITIES = [
159
+ "symbolic_noninterference.source.closed_world_static_dependency_closure",
160
+ "symbolic_noninterference.source.restricted_ir_symbolic_equivalence",
161
+ "symbolic_noninterference.source.finite_complete_domain_exhaustive_equivalence",
162
+ "symbolic_noninterference.production.closed_world_static_dependency_closure",
163
+ "symbolic_noninterference.production.restricted_ir_symbolic_equivalence",
164
+ "symbolic_noninterference.production.finite_complete_domain_exhaustive_equivalence",
165
+ ];
166
+ export const DESIGN_RESOURCE_ORACLE_CAPABILITIES = [
167
+ ...DESIGN_RESOURCE_INSPECTOR_CAPABILITIES,
168
+ ...DESIGN_RESOURCE_SYMBOLIC_NONINTERFERENCE_ORACLE_CAPABILITIES,
169
+ ];
158
170
  export const DESIGN_RESOURCE_CENSUS_KINDS = [
159
171
  "resource",
160
172
  "node",
@@ -1,4 +1,4 @@
1
- import { DESIGN_RESOURCE_INSPECTOR_CAPABILITIES, } from "./design-resource-fact-manifest-types.js";
1
+ import { DESIGN_RESOURCE_ORACLE_CAPABILITIES, } from "./design-resource-fact-manifest-types.js";
2
2
  import { parseDesignResourceLocatedDigest } from "./design-resource-fact-shape-primitives.js";
3
3
  import { contractKeys, sha256, stableKey, stableKeys, } from "./design-resource-handoff-shape-primitives.js";
4
4
  import { array, literal, nullable, object, string, } from "./long-task-shape-primitives.js";
@@ -19,7 +19,7 @@ export function parseDesignResourceOracles(value, label = "design_resource_hando
19
19
  identity: string(row.identity, `${itemLabel}.identity`),
20
20
  version: string(row.version, `${itemLabel}.version`),
21
21
  sha256: nullable(row.sha256, (item) => sha256(item, `${itemLabel}.sha256`)),
22
- capability_refs: array(row.capability_refs, `${itemLabel}.capability_refs`).map((capability, capabilityIndex) => literal(capability, DESIGN_RESOURCE_INSPECTOR_CAPABILITIES, `${itemLabel}.capability_refs[${capabilityIndex}]`)),
22
+ capability_refs: array(row.capability_refs, `${itemLabel}.capability_refs`).map((capability, capabilityIndex) => literal(capability, DESIGN_RESOURCE_ORACLE_CAPABILITIES, `${itemLabel}.capability_refs[${capabilityIndex}]`)),
23
23
  };
24
24
  });
25
25
  }
@@ -1,4 +1,5 @@
1
1
  import type { DesignResourceObservableFactManifestV1 } from "./design-resource-fact-manifest-types.js";
2
- import type { ParsedDesignResourceHandoffInputV1, ParsedDesignResourceHandoffV1 } from "./design-resource-handoff-types.js";
2
+ import type { ParsedDesignResourceHandoffV1 } from "./design-resource-handoff-types.js";
3
+ import type { ParsedDesignResourceHandoffInputV1 } from "./design-resource-handoff-input-types.js";
3
4
  export declare function parseDesignResourceFactManifests(parsed: ParsedDesignResourceHandoffInputV1, contents: Map<string, Buffer>): Map<string, DesignResourceObservableFactManifestV1>;
4
5
  export declare function validateDesignResourceFactManifests(parsed: ParsedDesignResourceHandoffV1, contents: Map<string, Buffer>, manifests: Map<string, DesignResourceObservableFactManifestV1>, validateProjection: boolean): void;
@@ -1,5 +1,5 @@
1
1
  import type { DesignResourceDimension, DesignResourceEvidenceKind, DesignResourceVerificationMethod } from "./design-resource-handoff-types.js";
2
- import type { DesignResourceInspectorCapability } from "./design-resource-fact-manifest-types.js";
2
+ import type { DesignResourceOracleCapability } from "./design-resource-fact-manifest-types.js";
3
3
  export declare const DESIGN_RESOURCE_FACT_INVARIANTS: Readonly<{
4
4
  readonly complete_observable_design_fact_delivery: true;
5
5
  readonly resource_fact_inventory_closure_required: true;
@@ -40,4 +40,4 @@ export declare function designFactMethodIsCompatible(dimension: DesignResourceDi
40
40
  export declare function designFactEvidenceIsCompatible(dimension: DesignResourceDimension, kind: DesignResourceEvidenceKind): boolean;
41
41
  export declare function designFactEvidenceSupportsMethod(method: DesignResourceVerificationMethod, kind: DesignResourceEvidenceKind): boolean;
42
42
  export declare function designFactComparatorSupportsMethod(method: DesignResourceVerificationMethod, comparator: string): boolean;
43
- export declare function designFactOracleSupportsMethod(method: DesignResourceVerificationMethod, capabilities: readonly DesignResourceInspectorCapability[]): boolean;
43
+ export declare function designFactOracleSupportsMethod(method: DesignResourceVerificationMethod, capabilities: readonly DesignResourceOracleCapability[]): boolean;
@@ -1,5 +1,5 @@
1
1
  import type { DesignResourceCoverageDisposition, DesignResourceDimension, DesignResourceLocatorKind, DesignResourceVerificationMethod } from "./design-resource-handoff-types.js";
2
- import type { DesignResourceComparator, DesignResourceInspectorCapability, DesignResourceLineageNodeKind, DesignResourcePropertyFamily, DesignResourceStandardConditionAxis, DesignResourceSubjectKind, DesignResourceSubjectPresenceKind, DesignResourceValueKind, DesignResourceVariationAxis } from "./design-resource-fact-enums.js";
2
+ import type { DesignResourceComparator, DesignResourceInspectorCapability, DesignResourceLineageNodeKind, DesignResourceOracleCapability, DesignResourcePropertyFamily, DesignResourceStandardConditionAxis, DesignResourceSubjectKind, DesignResourceSubjectPresenceKind, DesignResourceValueKind, DesignResourceVariationAxis } from "./design-resource-fact-enums.js";
3
3
  export interface DesignResourceTypedLocatorV1 {
4
4
  resource_ref: string;
5
5
  kind: DesignResourceLocatorKind;
@@ -131,7 +131,7 @@ export interface DesignResourceOracleV1 {
131
131
  identity: string;
132
132
  version: string;
133
133
  sha256: string | null;
134
- capability_refs: DesignResourceInspectorCapability[];
134
+ capability_refs: DesignResourceOracleCapability[];
135
135
  }
136
136
  export interface DesignResourceEnvironmentV1 {
137
137
  key: string;
@@ -0,0 +1,11 @@
1
+ import type { ParsedDesignResourceHandoffInputV1 } from "./design-resource-handoff-input-types.js";
2
+ import type { DesignResourceHandoffResourceV1, DesignResourceHandoffTargetV1 } from "./design-resource-handoff-types.js";
3
+ type BundleFailure = (code: string, detail: string) => never;
4
+ export interface StagedDesignResourceHandoffDraft {
5
+ bytes: Buffer;
6
+ parsed: ParsedDesignResourceHandoffInputV1;
7
+ target: DesignResourceHandoffTargetV1;
8
+ manifest_resource: DesignResourceHandoffResourceV1;
9
+ }
10
+ export declare function stageDesignResourceHandoffDraft(repository: string, draftDirectory: string, temporaryDirectory: string, entryName: string, maxBytes: number, fail: BundleFailure): Promise<StagedDesignResourceHandoffDraft>;
11
+ export {};
@@ -0,0 +1,40 @@
1
+ import { lstat, readFile, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { parseDesignResourceHandoffMarkdown } from "./design-resource-handoff-parser.js";
4
+ import { repoRelative } from "./long-task-workspace.js";
5
+ export async function stageDesignResourceHandoffDraft(repository, draftDirectory, temporaryDirectory, entryName, maxBytes, fail) {
6
+ const draftFile = path.join(draftDirectory, entryName);
7
+ const info = await lstat(draftFile);
8
+ if (typeof info.nlink === "number" && info.nlink > 1)
9
+ fail("draft_hardlink_not_allowed", entryName);
10
+ assertByteLimit(entryName, info.size, maxBytes, fail);
11
+ const bytes = await readFile(draftFile);
12
+ assertByteLimit(entryName, bytes.length, maxBytes, fail);
13
+ const content = bytes.toString("utf8");
14
+ if (!Buffer.from(content, "utf8").equals(bytes))
15
+ fail("handoff_utf8_invalid", entryName);
16
+ const stagedFile = path.join(temporaryDirectory, entryName);
17
+ await writeFile(stagedFile, bytes, { flag: "wx" });
18
+ const stagedPath = repoRelative(repository, stagedFile);
19
+ const parsed = parseDesignResourceHandoffMarkdown(stagedPath, content);
20
+ if (parsed.handoff.schema_version !== "design-resource-handoff-v1" ||
21
+ !("representation" in parsed.handoff) ||
22
+ parsed.handoff.representation !== "manifest_backed")
23
+ fail("manifest_backed_representation_required", entryName);
24
+ if (parsed.handoff.targets.length !== 1)
25
+ fail("one_target_per_handoff_required", `${entryName}:${parsed.handoff.targets.length}`);
26
+ const target = parsed.handoff.targets[0];
27
+ const manifestResource = parsed.handoff.resources.find((resource) => resource.key === target.source_profile.fact_manifest_resource_ref);
28
+ if (!manifestResource)
29
+ fail("target_manifest_resource_missing", target.key);
30
+ return {
31
+ bytes,
32
+ parsed: parsed,
33
+ target,
34
+ manifest_resource: manifestResource,
35
+ };
36
+ }
37
+ function assertByteLimit(entryName, actual, maximum, fail) {
38
+ if (actual > maximum)
39
+ fail("handoff_byte_limit_exceeded", `${entryName}:${actual}:${maximum}`);
40
+ }
@@ -1,10 +1,10 @@
1
- import { lstat, mkdtemp, readFile, readdir, realpath, rename, rm, writeFile, } from "node:fs/promises";
1
+ import { lstat, mkdtemp, readdir, realpath, rename, rm, } from "node:fs/promises";
2
2
  import path from "node:path";
3
- import { parseDesignResourceHandoffMarkdown } from "./design-resource-handoff-parser.js";
3
+ import { stageDesignResourceHandoffDraft } from "./design-resource-handoff-bundle-draft.js";
4
4
  import { createDesignResourceHandoffSetIntegrity } from "./design-resource-handoff-set-integrity.js";
5
5
  import { preflightParsedDesignResourceHandoff } from "./design-resource-handoff-validation.js";
6
6
  import { normalizeRepositoryCwd, normalizeRepositoryFile, } from "./long-task-paths.js";
7
- import { repoRelative, resolveInsideRepository, } from "./long-task-workspace.js";
7
+ import { resolveInsideRepository } from "./long-task-workspace.js";
8
8
  import { sha256Hex } from "./strict-codec.js";
9
9
  export async function publishDesignResourceHandoffBundle(options) {
10
10
  const repository = path.resolve(options.repository);
@@ -39,31 +39,7 @@ export async function publishDesignResourceHandoffBundle(options) {
39
39
  const manifests = new Map();
40
40
  const handoffSetIntegrity = createDesignResourceHandoffSetIntegrity((code, detail) => invalid(code, detail));
41
41
  for (const entry of draftEntries) {
42
- const draftFile = path.join(draftAbsolute, entry.name);
43
- const info = await lstat(draftFile);
44
- if (typeof info.nlink === "number" && info.nlink > 1)
45
- invalid("draft_hardlink_not_allowed", entry.name);
46
- if (info.size > options.max_handoff_bytes)
47
- invalid("handoff_byte_limit_exceeded", `${entry.name}:${info.size}:${options.max_handoff_bytes}`);
48
- const bytes = await readFile(draftFile);
49
- if (bytes.length > options.max_handoff_bytes)
50
- invalid("handoff_byte_limit_exceeded", `${entry.name}:${bytes.length}:${options.max_handoff_bytes}`);
51
- const content = bytes.toString("utf8");
52
- if (!Buffer.from(content, "utf8").equals(bytes))
53
- invalid("handoff_utf8_invalid", entry.name);
54
- const stagedFile = path.join(temporary, entry.name);
55
- await writeFile(stagedFile, bytes, { flag: "wx" });
56
- const stagedPath = repoRelative(repository, stagedFile);
57
- const parsed = parseDesignResourceHandoffMarkdown(stagedPath, content);
58
- if (!("representation" in parsed.handoff))
59
- invalid("manifest_backed_representation_required", entry.name);
60
- if (parsed.handoff.targets.length !== 1)
61
- invalid("one_target_per_handoff_required", `${entry.name}:${parsed.handoff.targets.length}`);
62
- const declaredTarget = parsed.handoff.targets[0];
63
- const manifestResource = parsed.handoff.resources.find((resource) => resource.key ===
64
- declaredTarget.source_profile.fact_manifest_resource_ref);
65
- if (!manifestResource)
66
- invalid("target_manifest_resource_missing", declaredTarget.key);
42
+ const { bytes, parsed, target: declaredTarget, manifest_resource: manifestResource, } = await stageDesignResourceHandoffDraft(repository, draftAbsolute, temporary, entry.name, options.max_handoff_bytes, invalid);
67
43
  if (!declaredManifestPaths.has(manifestResource.path))
68
44
  invalid("target_manifest_not_declared", `${declaredTarget.key}:${manifestResource.path}`);
69
45
  const preflight = await preflightParsedDesignResourceHandoff(repository, parsed);
@@ -0,0 +1,14 @@
1
+ import type { DesignResourceHandoffV1 } from "./design-resource-handoff-types.js";
2
+ import type { DesignResourceHandoffV2, ParsedDesignResourceHandoffV2 } from "./design-resource-symbolic-fact-types.js";
3
+ export type DesignResourceHandoffManifestBackedV1 = Pick<DesignResourceHandoffV1, "schema_version" | "intent" | "scope" | "provenance" | "resources" | "targets" | "resource_fact_closure" | "coverage" | "proposal"> & {
4
+ representation: "manifest_backed";
5
+ };
6
+ export type DesignResourceHandoffInputV1 = DesignResourceHandoffV1 | DesignResourceHandoffManifestBackedV1;
7
+ export interface ParsedDesignResourceHandoffInputV1 {
8
+ handoff_path: string;
9
+ handoff: DesignResourceHandoffInputV1;
10
+ source_item_keys: string[];
11
+ source_item_kinds: Record<string, string>;
12
+ }
13
+ export type DesignResourceHandoffInput = DesignResourceHandoffInputV1 | DesignResourceHandoffV2;
14
+ export type ParsedDesignResourceHandoffInput = ParsedDesignResourceHandoffInputV1 | ParsedDesignResourceHandoffV2;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,3 +1,4 @@
1
1
  import type { DesignResourceObservableFactManifestV1 } from "./design-resource-fact-manifest-types.js";
2
- import type { DesignResourceHandoffManifestBackedV1, DesignResourceHandoffV1 } from "./design-resource-handoff-types.js";
2
+ import type { DesignResourceHandoffManifestBackedV1 } from "./design-resource-handoff-input-types.js";
3
+ import type { DesignResourceHandoffV1 } from "./design-resource-handoff-types.js";
3
4
  export declare function hydrateManifestBackedDesignResourceHandoff(descriptor: DesignResourceHandoffManifestBackedV1, manifests: Map<string, DesignResourceObservableFactManifestV1>): DesignResourceHandoffV1;
@@ -1,8 +1,8 @@
1
- import type { ParsedDesignResourceHandoffInputV1 } from "./design-resource-handoff-types.js";
1
+ import type { ParsedDesignResourceHandoffInput } from "./design-resource-handoff-input-types.js";
2
2
  export interface DesignResourceHandoffBlockSpan {
3
3
  bodyStartOffset: number;
4
4
  bodyEndOffset: number;
5
5
  }
6
6
  export declare function containsDesignResourceHandoff(content: string): boolean;
7
7
  export declare function scanDesignResourceHandoffBlocks(content: string): DesignResourceHandoffBlockSpan[];
8
- export declare function parseDesignResourceHandoffMarkdown(handoffPath: string, content: string): ParsedDesignResourceHandoffInputV1;
8
+ export declare function parseDesignResourceHandoffMarkdown(handoffPath: string, content: string): ParsedDesignResourceHandoffInput;
@@ -1,6 +1,6 @@
1
1
  import { parseSourceDocument } from "./long-task-source-item-parser.js";
2
2
  import { forEachSourceLine } from "./source-line-scanner.js";
3
- const DESIGN_RESOURCE_START = /^```yaml[ \t]+design-resource-handoff-v1[ \t]*$/u;
3
+ const DESIGN_RESOURCE_START = /^```yaml[ \t]+design-resource-handoff-(?:v1|v2)[ \t]*$/u;
4
4
  const FORMAL_BLOCK_END = /^```[ \t]*$/u;
5
5
  export function containsDesignResourceHandoff(content) {
6
6
  return scanDesignResourceHandoffBlocks(content).length > 0;
@@ -32,7 +32,7 @@ export function parseDesignResourceHandoffMarkdown(handoffPath, content) {
32
32
  const parsedSource = parseSourceDocument(handoffPath, content);
33
33
  const handoff = parsedSource.designResourceHandoff;
34
34
  if (!handoff)
35
- throw new Error("design-resource-handoff-v1 block was not decoded");
35
+ throw new Error("design-resource-handoff block was not decoded");
36
36
  return {
37
37
  handoff_path: handoffPath,
38
38
  handoff,
@@ -1,3 +1,6 @@
1
- import type { DesignResourceHandoffInputV1, DesignResourceHandoffV1 } from "./design-resource-handoff-types.js";
1
+ import type { DesignResourceHandoffInputV1 } from "./design-resource-handoff-input-types.js";
2
+ import type { DesignResourceHandoffInput } from "./design-resource-handoff-input-types.js";
3
+ import type { DesignResourceHandoffV1 } from "./design-resource-handoff-types.js";
2
4
  export declare function parseDesignResourceHandoffInputShape(value: unknown): DesignResourceHandoffInputV1;
5
+ export declare function parseAnyDesignResourceHandoffInputShape(value: unknown): DesignResourceHandoffInput;
3
6
  export declare function parseDesignResourceHandoffShape(value: unknown): DesignResourceHandoffV1;
@@ -1,3 +1,4 @@
1
+ import { parseDesignResourceSymbolicHandoffShape } from "./design-resource-symbolic-fact-shape.js";
1
2
  import { parseDesignResourceAssetBindings, parseDesignResourceAxisDispositions, parseDesignResourceConditionExclusions, parseDesignResourceEnvironments, parseDesignResourceFactCells, parseDesignResourceLineageNodes, parseDesignResourceOracles, parseDesignResourceProofObligations, parseDesignResourceProperties, parseDesignResourceVariationAxisDispositions, parseDesignResourceVariationExclusions, parseDesignResourceVariations, } from "./design-resource-fact-manifest-shape.js";
2
3
  import { parseDesignResourceHandoffBlockers, parseDesignResourceHandoffCoverage, parseDesignResourceHandoffEvidence, parseDesignResourceHandoffFacts, parseDesignResourceHandoffResourceFactClosure, } from "./design-resource-handoff-shape-evidence.js";
3
4
  import { contractKey, stableKeys, } from "./design-resource-handoff-shape-primitives.js";
@@ -11,6 +12,15 @@ export function parseDesignResourceHandoffInputShape(value) {
11
12
  return parseManifestBackedDesignResourceHandoffShape(value);
12
13
  return parseDesignResourceHandoffShape(value);
13
14
  }
15
+ export function parseAnyDesignResourceHandoffInputShape(value) {
16
+ if (value &&
17
+ typeof value === "object" &&
18
+ !Array.isArray(value) &&
19
+ value.schema_version ===
20
+ "design-resource-handoff-v2")
21
+ return parseDesignResourceSymbolicHandoffShape(value);
22
+ return parseDesignResourceHandoffInputShape(value);
23
+ }
14
24
  export function parseDesignResourceHandoffShape(value) {
15
25
  const root = object(value, "design_resource_handoff", [
16
26
  "schema_version",
@@ -1,4 +1,4 @@
1
- import type { ParsedDesignResourceHandoffInputV1 } from "./design-resource-handoff-types.js";
1
+ import type { ParsedDesignResourceHandoffInputV1 } from "./design-resource-handoff-input-types.js";
2
2
  export interface DesignResourceSnapshot {
3
3
  contents: Map<string, Buffer>;
4
4
  hashes: Record<string, string>;
@@ -3,13 +3,17 @@ import path from "node:path";
3
3
  import { invalidDesignResourceHandoff } from "./design-resource-handoff-validation-primitives.js";
4
4
  import { assertProtectedRepositoryFile } from "./long-task-protected-files.js";
5
5
  import { sha256Hex } from "./strict-codec.js";
6
+ import { assertDesignResourceV1ManifestCapacity } from "./design-resource-v1-capacity.js";
6
7
  export async function readDesignResourceSnapshot(repository, parsed) {
7
8
  const contents = new Map();
8
9
  const hashes = {};
10
+ const manifestResourceRefs = new Set(parsed.handoff.targets.map((target) => target.source_profile.fact_manifest_resource_ref));
9
11
  for (const resource of parsed.handoff.resources) {
10
12
  if (resource.path === parsed.handoff_path)
11
13
  invalidDesignResourceHandoff("resource_must_not_be_handoff", resource.key);
12
14
  const file = await assertProtectedRepositoryFile(repository, path.resolve(repository, ...resource.path.split("/")), `design_resource:${resource.key}`);
15
+ if (manifestResourceRefs.has(resource.key))
16
+ await assertDesignResourceV1ManifestCapacity(file);
13
17
  const bytes = await readFile(file);
14
18
  const digest = sha256Hex(bytes);
15
19
  if (digest !== resource.sha256)
@@ -57,10 +57,6 @@ export interface DesignResourceHandoffV1 {
57
57
  revision: string;
58
58
  };
59
59
  }
60
- export type DesignResourceHandoffManifestBackedV1 = Pick<DesignResourceHandoffV1, "schema_version" | "intent" | "scope" | "provenance" | "resources" | "targets" | "resource_fact_closure" | "coverage" | "proposal"> & {
61
- representation: "manifest_backed";
62
- };
63
- export type DesignResourceHandoffInputV1 = DesignResourceHandoffV1 | DesignResourceHandoffManifestBackedV1;
64
60
  export interface DesignResourceHandoffResourceV1 {
65
61
  key: string;
66
62
  role: "exact_target" | "constraint" | "supporting";
@@ -220,12 +216,6 @@ export interface ParsedDesignResourceHandoffV1 {
220
216
  source_item_keys: string[];
221
217
  source_item_kinds: Record<string, string>;
222
218
  }
223
- export interface ParsedDesignResourceHandoffInputV1 {
224
- handoff_path: string;
225
- handoff: DesignResourceHandoffInputV1;
226
- source_item_keys: string[];
227
- source_item_kinds: Record<string, string>;
228
- }
229
219
  export interface DesignResourceHandoffPreflightV1 extends ParsedDesignResourceHandoffV1 {
230
220
  schema_version: "design-resource-handoff-preflight-v1";
231
221
  status: "ready";
@@ -1,4 +1,8 @@
1
- import type { DesignResourceHandoffPreflightV1, ParsedDesignResourceHandoffInputV1, ParsedDesignResourceHandoffV1 } from "./design-resource-handoff-types.js";
2
- export declare function preflightDesignResourceHandoff(repository: string, handoffPath: string): Promise<DesignResourceHandoffPreflightV1>;
1
+ import type { ParsedDesignResourceHandoffInputV1 } from "./design-resource-handoff-input-types.js";
2
+ import type { DesignResourceHandoffPreflightV1, ParsedDesignResourceHandoffV1 } from "./design-resource-handoff-types.js";
3
+ import type { DesignResourceHandoffPreflightV2 } from "./design-resource-symbolic-fact-types.js";
4
+ import type { ParsedDesignResourceHandoffInput } from "./design-resource-handoff-input-types.js";
5
+ export declare function preflightDesignResourceHandoff(repository: string, handoffPath: string): Promise<DesignResourceHandoffPreflightV1 | DesignResourceHandoffPreflightV2>;
6
+ export declare function preflightParsedDesignResourceHandoffAny(repository: string, parsed: ParsedDesignResourceHandoffInput): Promise<DesignResourceHandoffPreflightV1 | DesignResourceHandoffPreflightV2>;
3
7
  export declare function preflightParsedDesignResourceHandoff(repository: string, parsed: ParsedDesignResourceHandoffInputV1): Promise<DesignResourceHandoffPreflightV1>;
4
8
  export declare function validateDesignResourceHandoffSemantics(parsed: ParsedDesignResourceHandoffV1): void;
@@ -6,15 +6,26 @@ import { parseDesignResourceFactManifests, validateDesignResourceFactManifests,
6
6
  import { hydrateManifestBackedDesignResourceHandoff } from "./design-resource-handoff-manifest-projection.js";
7
7
  import { readDesignResourceSnapshot } from "./design-resource-handoff-snapshot.js";
8
8
  import { validateDesignResourceFacts } from "./design-resource-handoff-validation-facts.js";
9
+ import { preflightParsedDesignResourceSymbolicHandoff } from "./design-resource-symbolic-fact-validation.js";
9
10
  import { validateDesignResourceBlockers, validateDesignResourceCoverage, validateDesignResourceReachability, } from "./design-resource-handoff-validation-coverage.js";
10
11
  import { indexDesignResourceItems, invalidDesignResourceHandoff, requireNonemptyDesignResourceValues, requireUniqueDesignResourceObjects, requireUniqueDesignResourceValues, } from "./design-resource-handoff-validation-primitives.js";
11
12
  import { validateDesignResourceConditions, validateDesignResourceEvidence, validateDesignResourceScope, validateDesignResourceSubjects, validateDesignResourceTargets, } from "./design-resource-handoff-validation-structure.js";
12
13
  import { assertProtectedRepositoryFile } from "./long-task-protected-files.js";
14
+ import { assertDesignResourceV1HandoffCapacity } from "./design-resource-v1-capacity.js";
13
15
  export async function preflightDesignResourceHandoff(repository, handoffPath) {
14
16
  const handoffFile = await assertProtectedRepositoryFile(repository, path.resolve(repository, ...handoffPath.split("/")), "design_resource_handoff");
17
+ await assertDesignResourceV1HandoffCapacity(handoffFile);
15
18
  const parsed = parseDesignResourceHandoffMarkdown(handoffPath, await readFile(handoffFile, "utf8"));
19
+ return preflightParsedDesignResourceHandoffAny(repository, parsed);
20
+ }
21
+ export async function preflightParsedDesignResourceHandoffAny(repository, parsed) {
22
+ if (isParsedSymbolicHandoff(parsed))
23
+ return preflightParsedDesignResourceSymbolicHandoff(repository, parsed);
16
24
  return preflightParsedDesignResourceHandoff(repository, parsed);
17
25
  }
26
+ function isParsedSymbolicHandoff(parsed) {
27
+ return parsed.handoff.schema_version === "design-resource-handoff-v2";
28
+ }
18
29
  export async function preflightParsedDesignResourceHandoff(repository, parsed) {
19
30
  const inputHandoff = parsed.handoff;
20
31
  if (isManifestBacked(inputHandoff) && inputHandoff.targets.length !== 1)
@@ -1,4 +1,6 @@
1
- import type { ParsedDesignResourceHandoffV1 } from "./design-resource-handoff-types.js";
2
1
  import { type DesignResource } from "./design-resource-handoff-file-primitives.js";
3
- export declare function validateDesignResourceImplementationDependencyClosure(target: ParsedDesignResourceHandoffV1["handoff"]["targets"][number], resources: Map<string, DesignResource>, contents: Map<string, Buffer>): void;
2
+ export declare function validateDesignResourceImplementationDependencyClosure(target: {
3
+ key: string;
4
+ resource_refs: string[];
5
+ }, resources: Map<string, DesignResource>, contents: Map<string, Buffer>): void;
4
6
  export declare const validateDesignResourceWebDependencyClosure: typeof validateDesignResourceImplementationDependencyClosure;
@@ -0,0 +1,7 @@
1
+ import type { SymbolicManifestIndexes } from "./design-resource-symbolic-indexes.js";
2
+ export declare function validateSymbolicApplicabilityAuthorityRefs(row: {
3
+ census_refs: string[];
4
+ source_item_refs: string[];
5
+ basis_refs: string[];
6
+ rationale: string;
7
+ }, indexes: SymbolicManifestIndexes, artifactRefs: ReadonlySet<string>, label: string): void;
@@ -0,0 +1,19 @@
1
+ import { isKnownSymbolicApplicabilityPolicyRef } from "./design-resource-symbolic-applicability-policy.js";
2
+ import { invalid, requireKnownRefs, unique, } from "./design-resource-symbolic-validation-support.js";
3
+ export function validateSymbolicApplicabilityAuthorityRefs(row, indexes, artifactRefs, label) {
4
+ if (!row.census_refs.length ||
5
+ !row.source_item_refs.length ||
6
+ !row.basis_refs.length ||
7
+ !row.rationale.trim())
8
+ invalid("v2_applicability_authority_incomplete", label);
9
+ unique(row.census_refs, `v2_applicability_census_duplicate:${label}`);
10
+ unique(row.source_item_refs, `v2_applicability_source_item_duplicate:${label}`);
11
+ unique(row.basis_refs, `v2_applicability_basis_duplicate:${label}`);
12
+ requireKnownRefs(row.census_refs, indexes.census, "v2_applicability_census_unknown");
13
+ requireKnownRefs(row.source_item_refs, indexes.sourceItems, "v2_applicability_source_item_unknown");
14
+ for (const basisRef of row.basis_refs)
15
+ if (!isKnownSymbolicApplicabilityPolicyRef(basisRef) &&
16
+ !indexes.census.has(basisRef) &&
17
+ !artifactRefs.has(basisRef))
18
+ invalid("v2_applicability_basis_authority_unknown", `${label}:${basisRef}`);
19
+ }
@@ -0,0 +1,12 @@
1
+ import type { DesignResourceInspectorCensusEntryV1 } from "./design-resource-fact-manifest-model.js";
2
+ import type { DesignResourceHandoffSubjectV1 } from "./design-resource-handoff-types.js";
3
+ export declare const DESIGN_RESOURCE_SYMBOLIC_APPLICABILITY_POLICY_VERSION: "package-subject-capability-algebra-v1";
4
+ export interface DerivedSymbolicStandardApplicabilityV1 {
5
+ property_refs: string[];
6
+ policy_basis_refs: string[];
7
+ }
8
+ export declare function symbolicApplicabilitySubjectPolicyRef(kind: string): string;
9
+ export declare function symbolicApplicabilityCensusPolicyRef(kind: string): string;
10
+ export declare const SYMBOLIC_APPLICABILITY_POPULATION_POLICY_REF: "package-policy.subject-population.v1";
11
+ export declare function deriveRequiredSymbolicStandardApplicability(subject: DesignResourceHandoffSubjectV1, census: ReadonlyMap<string, DesignResourceInspectorCensusEntryV1>): DerivedSymbolicStandardApplicabilityV1;
12
+ export declare function isKnownSymbolicApplicabilityPolicyRef(value: string): boolean;