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
@@ -1,7 +1,7 @@
1
1
  import { validateSemanticFactOutcomeBindings } from "./long-task-semantic-fact-contract-facts.js";
2
2
  import { validateSemanticFactProofBindings } from "./long-task-semantic-fact-contract-proofs.js";
3
3
  import { assertSameSemanticFactClosureSet, uniqueSemanticFactClosureValues, } from "./long-task-semantic-fact-closure-primitives.js";
4
- export function validateSemanticFactContractProjection(contract, manifest, index) {
4
+ export function validateSemanticFactContractProjection(contract, manifest, index, factRevisions, obligationRevisions, sourceRequiresRevisions) {
5
5
  const expectations = new Map();
6
6
  const allFactBindings = [];
7
7
  const allProofBindings = [];
@@ -10,15 +10,27 @@ export function validateSemanticFactContractProjection(contract, manifest, index
10
10
  const facts = manifest.facts.filter((item) => item.outcome_ref === outcome.key);
11
11
  const proofs = manifest.proof_obligations.filter((proof) => facts.some((fact) => fact.key === proof.fact_ref));
12
12
  const bindings = outcome.semantic_fact_bindings;
13
+ const revisionsRequired = sourceRequiresRevisions ||
14
+ bindings.facts.some((item) => item.fact_revision_digest !== undefined) ||
15
+ bindings.proofs.some((item) => item.obligation_revision_digest !== undefined);
13
16
  assertSameSemanticFactClosureSet(bindings.facts.map((item) => item.fact_ref), facts.map((item) => item.key), `contract_fact_set:${outcome.key}`);
17
+ if (revisionsRequired) {
18
+ assertSameSemanticFactClosureSet(bindings.facts.map((item) => revisionPair(item.fact_ref, item.fact_revision_digest, `contract_fact_revision:${outcome.key}`)), facts.map((item) => revisionPair(item.key, factRevisions.get(item.key), `source_fact_revision:${outcome.key}`)), `contract_fact_revision_set:${outcome.key}`);
19
+ assertSameSemanticFactClosureSet(bindings.proofs.map((item) => revisionPair(item.proof_ref, item.obligation_revision_digest, `contract_obligation_revision:${outcome.key}`)), proofs.map((item) => revisionPair(item.key, obligationRevisions.get(item.key), `source_obligation_revision:${outcome.key}`)), `contract_obligation_revision_set:${outcome.key}`);
20
+ }
14
21
  assertSameSemanticFactClosureSet(bindings.proofs.map((item) => item.proof_ref), proofs.map((item) => item.key), `contract_proof_set:${outcome.key}`);
15
22
  uniqueSemanticFactClosureValues(bindings.proofs.map((item) => item.authority === "machine"
16
23
  ? `${item.check_ref}\0${item.assertion_ref}`
17
24
  : `external\0${item.confirmation_ref}`), `contract_proof_target:${outcome.key}`);
18
- validateSemanticFactOutcomeBindings(outcome, manifest, index, allFactBindings);
19
- validateSemanticFactProofBindings(contract, outcome, manifest, index, targetByRef, expectations, allProofBindings);
25
+ validateSemanticFactOutcomeBindings(outcome, manifest, index, allFactBindings, factRevisions, revisionsRequired);
26
+ validateSemanticFactProofBindings(contract, outcome, manifest, index, targetByRef, expectations, allProofBindings, factRevisions, obligationRevisions, revisionsRequired);
20
27
  }
21
28
  assertSameSemanticFactClosureSet(allFactBindings, manifest.facts.map((item) => item.key), "contract_all_fact_set");
22
29
  assertSameSemanticFactClosureSet(allProofBindings, manifest.proof_obligations.map((item) => item.key), "contract_all_proof_set");
23
30
  return expectations;
24
31
  }
32
+ function revisionPair(key, digest, label) {
33
+ if (!digest)
34
+ throw new Error(`semantic_fact_closure_invalid:${label}:${key}:missing`);
35
+ return `${key}\0${digest}`;
36
+ }
@@ -1,4 +1,4 @@
1
1
  import type { DeliveryContractV2 } from "./long-task-delivery-types.js";
2
2
  import type { SemanticFactManifestIndexV1 } from "./semantic-fact-policy.js";
3
3
  import type { SemanticFactManifestV1 } from "./semantic-fact-types.js";
4
- export declare function validateSemanticFactOutcomeBindings(outcome: DeliveryContractV2["outcomes"][number], manifest: SemanticFactManifestV1, index: SemanticFactManifestIndexV1, allFactBindings: string[]): void;
4
+ export declare function validateSemanticFactOutcomeBindings(outcome: DeliveryContractV2["outcomes"][number], manifest: SemanticFactManifestV1, index: SemanticFactManifestIndexV1, allFactBindings: string[], factRevisions: Map<string, string>, revisionsRequired: boolean): void;
@@ -1,10 +1,13 @@
1
1
  import { semanticFactClosureInvalid, uniqueSemanticFactClosureValues, } from "./long-task-semantic-fact-closure-primitives.js";
2
- export function validateSemanticFactOutcomeBindings(outcome, manifest, index, allFactBindings) {
2
+ export function validateSemanticFactOutcomeBindings(outcome, manifest, index, allFactBindings, factRevisions, revisionsRequired) {
3
3
  uniqueSemanticFactClosureValues(outcome.semantic_fact_bindings.facts.map((item) => item.claim_ref), `contract_fact_claim:${outcome.key}`);
4
4
  const applicabilityRefs = new Set(outcome.applicability.map((item) => item.key));
5
5
  for (const binding of outcome.semantic_fact_bindings.facts) {
6
6
  const fact = index.fact_by_ref.get(binding.fact_ref);
7
7
  const expectedClaim = `semantic_fact.${binding.fact_ref}`;
8
+ if (revisionsRequired &&
9
+ binding.fact_revision_digest !== factRevisions.get(binding.fact_ref))
10
+ semanticFactClosureInvalid("contract_fact_revision_mismatch", `${outcome.key}:${binding.fact_ref}:${binding.fact_revision_digest ?? "missing"}:${factRevisions.get(binding.fact_ref) ?? "missing"}`);
8
11
  if (binding.claim_ref !== expectedClaim)
9
12
  semanticFactClosureInvalid("contract_fact_claim_identity_mismatch", `${outcome.key}:${binding.fact_ref}:${binding.claim_ref}:${expectedClaim}`);
10
13
  if (!applicabilityRefs.has(binding.applicability_ref))
@@ -1,4 +1,4 @@
1
1
  import type { DeliveryContractV2, ExecutionTargetV2 } from "./long-task-delivery-types.js";
2
2
  import type { SemanticFactManifestIndexV1 } from "./semantic-fact-policy.js";
3
3
  import type { SemanticFactExpectationV2, SemanticFactManifestV1 } from "./semantic-fact-types.js";
4
- export declare function validateSemanticFactProofBindings(contract: DeliveryContractV2, outcome: DeliveryContractV2["outcomes"][number], manifest: SemanticFactManifestV1, index: SemanticFactManifestIndexV1, targetByRef: Map<string, ExecutionTargetV2>, expectations: Map<string, SemanticFactExpectationV2[]>, allProofBindings: string[]): void;
4
+ export declare function validateSemanticFactProofBindings(contract: DeliveryContractV2, outcome: DeliveryContractV2["outcomes"][number], manifest: SemanticFactManifestV1, index: SemanticFactManifestIndexV1, targetByRef: Map<string, ExecutionTargetV2>, expectations: Map<string, SemanticFactExpectationV2[]>, allProofBindings: string[], factRevisions: Map<string, string>, obligationRevisions: Map<string, string>, revisionsRequired: boolean): void;
@@ -1,16 +1,20 @@
1
1
  import { sameSemanticFactClosureSet, semanticFactClosureInvalid, } from "./long-task-semantic-fact-closure-primitives.js";
2
- export function validateSemanticFactProofBindings(contract, outcome, manifest, index, targetByRef, expectations, allProofBindings) {
2
+ export function validateSemanticFactProofBindings(contract, outcome, manifest, index, targetByRef, expectations, allProofBindings, factRevisions, obligationRevisions, revisionsRequired) {
3
3
  for (const binding of outcome.semantic_fact_bindings.proofs) {
4
4
  const proof = index.proof_by_ref.get(binding.proof_ref);
5
5
  const factBinding = outcome.semantic_fact_bindings.facts.find((item) => item.fact_ref === binding.fact_ref);
6
6
  if (!factBinding)
7
7
  semanticFactClosureInvalid("contract_proof_fact_binding_missing", `${outcome.key}:${binding.proof_ref}:${binding.fact_ref}`);
8
+ if (revisionsRequired &&
9
+ binding.obligation_revision_digest !==
10
+ obligationRevisions.get(binding.proof_ref))
11
+ semanticFactClosureInvalid("contract_obligation_revision_mismatch", `${outcome.key}:${binding.proof_ref}:${binding.obligation_revision_digest ?? "missing"}:${obligationRevisions.get(binding.proof_ref) ?? "missing"}`);
8
12
  validateProofIdentity(outcome, proof, binding);
9
13
  validateObserverTargets(proof, binding, targetByRef);
10
14
  if (binding.authority === "external_confirmation")
11
15
  validateExternalProofProjection(contract, outcome, binding, factBinding.claim_ref);
12
16
  else
13
- validateMachineProofProjection(contract, outcome, manifest, index, binding, proof, factBinding, expectations);
17
+ validateMachineProofProjection(contract, outcome, manifest, index, binding, proof, factBinding, expectations, factRevisions, obligationRevisions, revisionsRequired);
14
18
  allProofBindings.push(binding.proof_ref);
15
19
  }
16
20
  }
@@ -37,7 +41,7 @@ function validateExternalProofProjection(contract, outcome, binding, claimRef) {
37
41
  if (!confirmation.impact_claims.includes(fullClaim))
38
42
  semanticFactClosureInvalid("semantic_fact_confirmation_lineage_missing", `${binding.confirmation_ref}:${fullClaim}`);
39
43
  }
40
- function validateMachineProofProjection(contract, outcome, manifest, index, binding, proof, factBinding, expectations) {
44
+ function validateMachineProofProjection(contract, outcome, manifest, index, binding, proof, factBinding, expectations, factRevisions, obligationRevisions, revisionsRequired) {
41
45
  const check = outcome.acceptance.checks.find((item) => item.key === binding.check_ref);
42
46
  if (!check)
43
47
  semanticFactClosureInvalid("semantic_fact_check_unknown", `${outcome.key}:${binding.check_ref}`);
@@ -62,6 +66,11 @@ function validateMachineProofProjection(contract, outcome, manifest, index, bind
62
66
  rows.push({
63
67
  manifest_ref: manifest.key,
64
68
  manifest_sha256: contract.semantic_fact_manifest.sha256,
69
+ fact_key: fact.key,
70
+ fact_revision_digest: factRevisions.get(fact.key),
71
+ obligation_key: proof.key,
72
+ obligation_revision_digest: obligationRevisions.get(proof.key),
73
+ revision_identity_required: revisionsRequired,
65
74
  fact_ref: fact.key,
66
75
  proof_ref: proof.key,
67
76
  method: proof.method,
@@ -6,6 +6,10 @@ export declare function validateSemanticFactEvidence(check: CompiledCheckV2, rec
6
6
  export declare function semanticFactComparisonResultIdentity(value: {
7
7
  fact_ref: string;
8
8
  proof_ref: string;
9
+ fact_key?: string;
10
+ fact_revision_digest?: string;
11
+ obligation_key?: string;
12
+ obligation_revision_digest?: string;
9
13
  target_ref: string;
10
14
  actual_value_sha256: string;
11
15
  expected_value_sha256: string;
@@ -17,5 +21,5 @@ export declare function semanticFactComparisonResultIdentity(value: {
17
21
  passed: boolean;
18
22
  }): string;
19
23
  export declare function validateDistinctSemanticFactEvidence(records: EvidenceCapabilityRecordV2[]): string | null;
20
- export declare const typed_semantic_fact_runtime_evidence = "fact_ref+actual+comparison+verdict+oracle+environment";
24
+ export declare const typed_semantic_fact_runtime_evidence = "obligation_key+obligation_revision_digest->fact_key+fact_revision_digest+actual+comparison+verdict+oracle+environment";
21
25
  export {};
@@ -38,6 +38,10 @@ function validateSemanticFactEvidenceAuthority(check, record, expected) {
38
38
  semanticFactComparisonResultIdentity({
39
39
  fact_ref: record.fact_ref,
40
40
  proof_ref: record.proof_ref,
41
+ fact_key: record.fact_key,
42
+ fact_revision_digest: record.fact_revision_digest,
43
+ obligation_key: record.obligation_key,
44
+ obligation_revision_digest: record.obligation_revision_digest,
41
45
  target_ref: record.target_ref,
42
46
  actual_value_sha256: record.actual_observation.value_sha256,
43
47
  expected_value_sha256: expected.expected.sha256,
@@ -67,7 +71,22 @@ function sameSemanticFactIdentity(record, expected) {
67
71
  record.method === expected.method &&
68
72
  record.subject_ref === expected.subject_ref &&
69
73
  record.condition_ref === expected.condition_ref &&
70
- record.property_ref === expected.property_ref);
74
+ record.property_ref === expected.property_ref &&
75
+ sameSemanticFactRevisionIdentity(record, expected));
76
+ }
77
+ function sameSemanticFactRevisionIdentity(record, expected) {
78
+ const present = record.fact_key !== undefined ||
79
+ record.fact_revision_digest !== undefined ||
80
+ record.obligation_key !== undefined ||
81
+ record.obligation_revision_digest !== undefined;
82
+ if (!expected.revision_identity_required && !present)
83
+ return true;
84
+ return (record.fact_key === expected.fact_key &&
85
+ record.fact_key === record.fact_ref &&
86
+ record.fact_revision_digest === expected.fact_revision_digest &&
87
+ record.obligation_key === expected.obligation_key &&
88
+ record.obligation_key === record.proof_ref &&
89
+ record.obligation_revision_digest === expected.obligation_revision_digest);
71
90
  }
72
91
  function validSemanticFactRedaction(sensitivity, redaction) {
73
92
  return ((sensitivity === "plain" && redaction === null) ||
@@ -118,6 +137,10 @@ function validateSemanticFactObservers(record, expected, artifactHashes) {
118
137
  semanticFactComparisonResultIdentity({
119
138
  fact_ref: record.fact_ref,
120
139
  proof_ref: record.proof_ref,
140
+ fact_key: record.fact_key,
141
+ fact_revision_digest: record.fact_revision_digest,
142
+ obligation_key: record.obligation_key,
143
+ obligation_revision_digest: record.obligation_revision_digest,
121
144
  target_ref: observer.target_ref,
122
145
  actual_value_sha256: observer.value_sha256,
123
146
  expected_value_sha256: expected.expected.sha256,
@@ -133,7 +156,25 @@ function validateSemanticFactObservers(record, expected, artifactHashes) {
133
156
  return null;
134
157
  }
135
158
  export function semanticFactComparisonResultIdentity(value) {
136
- return sha256Hex(canonicalValueJson(value));
159
+ const revisionIdentityPresent = value.fact_key !== undefined ||
160
+ value.fact_revision_digest !== undefined ||
161
+ value.obligation_key !== undefined ||
162
+ value.obligation_revision_digest !== undefined;
163
+ return sha256Hex(canonicalValueJson(revisionIdentityPresent
164
+ ? value
165
+ : {
166
+ fact_ref: value.fact_ref,
167
+ proof_ref: value.proof_ref,
168
+ target_ref: value.target_ref,
169
+ actual_value_sha256: value.actual_value_sha256,
170
+ expected_value_sha256: value.expected_value_sha256,
171
+ comparator: value.comparator,
172
+ mode: value.mode,
173
+ parameters_sha256: value.parameters_sha256,
174
+ tolerance_sha256: value.tolerance_sha256,
175
+ mask_sha256: value.mask_sha256,
176
+ passed: value.passed,
177
+ }));
137
178
  }
138
179
  export function validateDistinctSemanticFactEvidence(records) {
139
180
  const observations = new Set();
@@ -142,7 +183,9 @@ export function validateDistinctSemanticFactEvidence(records) {
142
183
  for (const record of records) {
143
184
  if (record.capability !== "semantic_fact")
144
185
  continue;
145
- const identity = `${record.fact_ref}\0${record.proof_ref}`;
186
+ const identity = record.obligation_key
187
+ ? `${record.obligation_key}\0${record.obligation_revision_digest}\0${record.fact_key}\0${record.fact_revision_digest}`
188
+ : `${record.fact_ref}\0${record.proof_ref}`;
146
189
  if (identities.has(identity))
147
190
  return "semantic_fact_result_duplicate";
148
191
  identities.add(identity);
@@ -162,4 +205,4 @@ function sameSet(left, right) {
162
205
  new Set(left).size === left.length &&
163
206
  left.every((item) => right.includes(item)));
164
207
  }
165
- export const typed_semantic_fact_runtime_evidence = "fact_ref+actual+comparison+verdict+oracle+environment";
208
+ export const typed_semantic_fact_runtime_evidence = "obligation_key+obligation_revision_digest->fact_key+fact_revision_digest+actual+comparison+verdict+oracle+environment";
@@ -13,13 +13,14 @@ export function parseSemanticFactOutcomeBindings(value, label) {
13
13
  manifest_ref: semanticRef(row.manifest_ref, `${label}.manifest_ref`),
14
14
  facts: array(row.facts, `${label}.facts`).map((item, index) => {
15
15
  const itemLabel = `${label}.facts[${index}]`;
16
- const entry = object(item, itemLabel, [
17
- "fact_ref",
18
- "claim_ref",
19
- "applicability_ref",
20
- ]);
16
+ const entry = object(item, itemLabel, ["fact_ref", "claim_ref", "applicability_ref"], ["fact_revision_digest"]);
21
17
  return {
22
18
  fact_ref: semanticRef(entry.fact_ref, `${itemLabel}.fact_ref`),
19
+ ...(Object.hasOwn(entry, "fact_revision_digest")
20
+ ? {
21
+ fact_revision_digest: sha256(entry.fact_revision_digest, `${itemLabel}.fact_revision_digest`),
22
+ }
23
+ : {}),
23
24
  claim_ref: semanticRef(entry.claim_ref, `${itemLabel}.claim_ref`),
24
25
  applicability_ref: semanticRef(entry.applicability_ref, `${itemLabel}.applicability_ref`),
25
26
  };
@@ -33,7 +34,12 @@ export function parseSemanticFactOutcomeBindings(value, label) {
33
34
  "proof_surface",
34
35
  "evidence_capabilities",
35
36
  "authority",
36
- ], ["check_ref", "assertion_ref", "confirmation_ref"]);
37
+ ], [
38
+ "obligation_revision_digest",
39
+ "check_ref",
40
+ "assertion_ref",
41
+ "confirmation_ref",
42
+ ]);
37
43
  const authority = literal(preliminary.authority, ["machine", "external_confirmation"], `${itemLabel}.authority`);
38
44
  if (authority === "machine") {
39
45
  requireOwned(preliminary, itemLabel, ["check_ref", "assertion_ref"]);
@@ -45,6 +51,11 @@ export function parseSemanticFactOutcomeBindings(value, label) {
45
51
  }
46
52
  const base = {
47
53
  proof_ref: semanticRef(preliminary.proof_ref, `${itemLabel}.proof_ref`),
54
+ ...(Object.hasOwn(preliminary, "obligation_revision_digest")
55
+ ? {
56
+ obligation_revision_digest: sha256(preliminary.obligation_revision_digest, `${itemLabel}.obligation_revision_digest`),
57
+ }
58
+ : {}),
48
59
  fact_ref: semanticRef(preliminary.fact_ref, `${itemLabel}.fact_ref`),
49
60
  method: semanticRef(preliminary.method, `${itemLabel}.method`),
50
61
  proof_surface: literal(preliminary.proof_surface, PROOF_SURFACES, `${itemLabel}.proof_surface`),
@@ -17,5 +17,5 @@ export declare function semanticRef(value: unknown, label: string): string;
17
17
  export declare function nullable<T>(value: unknown, parser: (value: unknown) => T): T | null;
18
18
  export declare const PROOF_SURFACES: readonly ["ui_browser", "runtime_behavior", "api_contract", "data_state", "security_boundary", "population_coverage", "implementation_structure"];
19
19
  export declare const JOURNEY_ROLES: readonly ["success", "degradation", "recovery", "stage_gate", "conformance"];
20
- export declare const EVIDENCE_CAPABILITIES: readonly ["presence", "interaction_trace", "state_delta", "cross_surface_consistency", "durable_readback", "boundary_invocation", "external_side_effect", "failure_injection", "visual_render", "design_conformance", "design_method", "semantic_fact", "target_runtime", "input_variation"];
20
+ export declare const EVIDENCE_CAPABILITIES: readonly ["presence", "interaction_trace", "state_delta", "cross_surface_consistency", "durable_readback", "boundary_invocation", "external_side_effect", "failure_injection", "visual_render", "design_conformance", "design_method", "design_symbolic_certificate", "semantic_fact", "target_runtime", "input_variation"];
21
21
  export declare function fail(label: string, message: string): never;
@@ -106,6 +106,7 @@ export const EVIDENCE_CAPABILITIES = [
106
106
  "visual_render",
107
107
  "design_conformance",
108
108
  "design_method",
109
+ "design_symbolic_certificate",
109
110
  "semantic_fact",
110
111
  "target_runtime",
111
112
  "input_variation",
@@ -1,9 +1,9 @@
1
1
  import type { CompiledSourceItemV2 } from "./long-task-delivery-types.js";
2
- import type { DesignResourceHandoffInputV1 } from "./design-resource-handoff-types.js";
2
+ import type { DesignResourceHandoffInput } from "./design-resource-handoff-input-types.js";
3
3
  import type { SemanticFactManifestV1 } from "./semantic-fact-types.js";
4
4
  export interface ParsedSourceDocument {
5
5
  items: CompiledSourceItemV2[];
6
- designResourceHandoff: DesignResourceHandoffInputV1 | null;
6
+ designResourceHandoff: DesignResourceHandoffInput | null;
7
7
  semanticFactManifest: SemanticFactManifestV1 | null;
8
8
  }
9
9
  export declare function parseSourceItems(sourcePath: string, content: string): CompiledSourceItemV2[];
@@ -1,10 +1,12 @@
1
1
  import { parseDesignResourceHandoffInputShape } from "./design-resource-handoff-shape.js";
2
+ import { parseDesignResourceSymbolicHandoffShape } from "./design-resource-symbolic-fact-shape.js";
3
+ import { parseSemanticFactCompactCarrierShape } from "./semantic-fact-compact-carrier.js";
2
4
  import { parseSemanticFactManifestShape } from "./semantic-fact-manifest-shape.js";
3
5
  import { assertNoOpenOwnedSection, assertOwnedSourceSectionsClosed, consumeBackgroundBoundary, consumeOwnedText, consumeSourceItemBoundary, } from "./long-task-source-owned-sections.js";
4
6
  import { formalBlockBody, forEachSourceLine } from "./source-line-scanner.js";
5
7
  import { parseStrictYaml } from "./strict-codec.js";
6
- const DESIGN_RESOURCE_START = /^\s*```yaml[ \t]+design-resource-handoff-v1[ \t]*$/u;
7
- const SEMANTIC_FACT_START = /^\s*```yaml[ \t]+semantic-fact-manifest-v1[ \t]*$/u;
8
+ const DESIGN_RESOURCE_START = /^\s*```yaml[ \t]+design-resource-handoff-(v1|v2)[ \t]*$/u;
9
+ const SEMANTIC_FACT_START = /^\s*```yaml[ \t]+(semantic-fact-manifest-v1|semantic-fact-compact-carrier-v1)[ \t]*$/u;
8
10
  const FORMAL_BLOCK_END = /^\s*```[ \t]*$/u;
9
11
  export function parseSourceItems(sourcePath, content) {
10
12
  return parseSourceDocument(sourcePath, content).items;
@@ -52,9 +54,15 @@ function consumeOpenFormalBlock(state, line, startOffset) {
52
54
  if (!FORMAL_BLOCK_END.test(line))
53
55
  return true;
54
56
  try {
55
- const value = parseStrictYaml(formalBlockBody(state.content, state.formalBlock.bodyStartOffset, startOffset, state.formalBlock.owner === "design-resource-handoff-v1"));
57
+ const value = parseStrictYaml(formalBlockBody(state.content, state.formalBlock.bodyStartOffset, startOffset, state.formalBlock.owner.startsWith("design-resource-handoff-")));
56
58
  if (state.formalBlock.owner === "design-resource-handoff-v1")
57
59
  state.designResourceHandoff = parseDesignResourceHandoffInputShape(value);
60
+ else if (state.formalBlock.owner === "design-resource-handoff-v2")
61
+ state.designResourceHandoff =
62
+ parseDesignResourceSymbolicHandoffShape(value);
63
+ else if (state.formalBlock.owner === "semantic-fact-compact-carrier-v1")
64
+ state.semanticFactManifest =
65
+ parseSemanticFactCompactCarrierShape(value).manifest;
58
66
  else
59
67
  state.semanticFactManifest = parseSemanticFactManifestShape(value);
60
68
  }
@@ -66,23 +74,24 @@ function consumeOpenFormalBlock(state, line, startOffset) {
66
74
  return true;
67
75
  }
68
76
  function startFormalBlock(state, line, lineNumber, nextOffset) {
69
- const owner = DESIGN_RESOURCE_START.test(line)
70
- ? "design-resource-handoff-v1"
71
- : SEMANTIC_FACT_START.test(line)
72
- ? "semantic-fact-manifest-v1"
73
- : null;
77
+ const designMatch = DESIGN_RESOURCE_START.exec(line);
78
+ const owner = designMatch
79
+ ? designMatch[1] === "v2"
80
+ ? "design-resource-handoff-v2"
81
+ : "design-resource-handoff-v1"
82
+ : (SEMANTIC_FACT_START.exec(line)?.[1] ?? null);
74
83
  if (!owner)
75
84
  return false;
76
85
  assertNoOpenOwnedSection(state, lineNumber);
77
- if (owner === "design-resource-handoff-v1") {
86
+ if (owner.startsWith("design-resource-handoff-")) {
78
87
  state.designResourceBlocks += 1;
79
88
  if (state.designResourceBlocks > 1)
80
- throw new Error(`source_formal_block_duplicate:${state.sourcePath}:design-resource-handoff-v1`);
89
+ throw new Error(`source_formal_block_duplicate:${state.sourcePath}:design-resource-handoff`);
81
90
  }
82
91
  else {
83
92
  state.semanticFactBlocks += 1;
84
93
  if (state.semanticFactBlocks > 1)
85
- throw new Error(`source_formal_block_duplicate:${state.sourcePath}:semantic-fact-manifest-v1`);
94
+ throw new Error(`source_formal_block_duplicate:${state.sourcePath}:semantic-fact-manifest`);
86
95
  }
87
96
  state.formalBlock = {
88
97
  owner,
@@ -7,6 +7,7 @@ export function validateUiDesignBinding(context) {
7
7
  function validateDesignTargets({ outcome, binding, outcomeClaims, checks, carriers, designTargetKeys, designAssertionRefs, report, }) {
8
8
  for (const target of binding.design_targets) {
9
9
  const label = `${outcome.key}:${binding.key}:${target.key}`;
10
+ const symbolic = target.fact_model === "symbolic_rules_v2";
10
11
  if (designTargetKeys.has(target.key))
11
12
  issue(report, "ui_design_target_key_duplicate", label);
12
13
  designTargetKeys.add(target.key);
@@ -14,10 +15,20 @@ function validateDesignTargets({ outcome, binding, outcomeClaims, checks, carrie
14
15
  if (designAssertionRefs.has(assertionIdentity))
15
16
  issue(report, "ui_design_target_assertion_duplicate", label);
16
17
  designAssertionRefs.add(assertionIdentity);
17
- unique(target.verification_method_bindings.map((item) => item.method), "ui_design_target_verification_method_duplicate", label, report);
18
- unique(target.verification_method_bindings.map((item) => item.assertion_ref), "ui_design_target_verification_assertion_duplicate", label, report);
19
- if (!target.verification_method_bindings.length)
18
+ unique((symbolic
19
+ ? (target.symbolic_method_bindings ?? [])
20
+ : target.verification_method_bindings).map((item) => item.method), "ui_design_target_verification_method_duplicate", label, report);
21
+ unique((symbolic
22
+ ? (target.symbolic_method_bindings ?? [])
23
+ : target.verification_method_bindings).map((item) => item.assertion_ref), "ui_design_target_verification_assertion_duplicate", label, report);
24
+ if (!(symbolic
25
+ ? (target.symbolic_method_bindings ?? [])
26
+ : target.verification_method_bindings).length)
20
27
  issue(report, "ui_design_target_verification_methods_required", label);
28
+ if (symbolic &&
29
+ (target.condition_keys.length ||
30
+ target.verification_method_bindings.length))
31
+ issue(report, "ui_design_symbolic_ground_fields_forbidden", label);
21
32
  const methodArtifactPaths = new Set();
22
33
  const methodFactObligations = new Set();
23
34
  for (const [name, values] of [
@@ -26,7 +37,7 @@ function validateDesignTargets({ outcome, binding, outcomeClaims, checks, carrie
26
37
  ["claim_refs", target.claim_refs],
27
38
  ]) {
28
39
  unique(values, `ui_design_target_${name}_duplicate`, label, report);
29
- if (!values.length)
40
+ if (!values.length && !(symbolic && name === "condition_keys"))
30
41
  issue(report, `ui_design_target_${name}_required`, label);
31
42
  }
32
43
  for (const claimRef of target.claim_refs) {
@@ -44,6 +55,11 @@ function validateDesignTargets({ outcome, binding, outcomeClaims, checks, carrie
44
55
  validateRootJourney(binding, check, label, report);
45
56
  validateCarrierInputs(check, carriers, label, report);
46
57
  validateDesignAssertion(target, check, label, report);
58
+ if (symbolic) {
59
+ validateSymbolicDesignBindings(target, check, label, methodArtifactPaths, report);
60
+ validateDesignFiles(target, check, label, report);
61
+ continue;
62
+ }
47
63
  for (const methodBinding of target.verification_method_bindings) {
48
64
  const identity = `${target.conformance_check_ref}\0${methodBinding.assertion_ref}`;
49
65
  if (methodBinding.assertion_ref !== target.conformance_assertion_ref &&
@@ -86,6 +102,50 @@ function validateDesignTargets({ outcome, binding, outcomeClaims, checks, carrie
86
102
  validateDesignFiles(target, check, label, report);
87
103
  }
88
104
  }
105
+ function validateSymbolicDesignBindings(target, check, label, artifactPaths, report) {
106
+ const obligationRefs = new Set();
107
+ for (const binding of target.symbolic_method_bindings ?? []) {
108
+ const assertion = check.positive_assertions.find((item) => item.key === binding.assertion_ref);
109
+ if (!assertion)
110
+ issue(report, "ui_design_symbolic_method_assertion_unknown", `${label}:${binding.method}:${binding.assertion_ref}`);
111
+ else if (!assertion.evidence_capabilities.includes("design_method"))
112
+ issue(report, "ui_design_symbolic_method_capability_required", `${label}:${binding.method}`);
113
+ if (!binding.rule_expectations.length)
114
+ issue(report, "ui_design_symbolic_rule_expectations_required", `${label}:${binding.method}`);
115
+ unique(binding.rule_expectations.map((item) => item.obligation_ref), "ui_design_symbolic_obligation_duplicate", `${label}:${binding.method}`, report);
116
+ for (const expectation of binding.rule_expectations) {
117
+ if (obligationRefs.has(expectation.obligation_ref))
118
+ issue(report, "ui_design_symbolic_obligation_reused", `${label}:${expectation.obligation_ref}`);
119
+ obligationRefs.add(expectation.obligation_ref);
120
+ }
121
+ for (const artifactPath of [
122
+ binding.artifact_path,
123
+ binding.observation_path,
124
+ ])
125
+ validateSymbolicArtifactPath(artifactPath, target, check, label, artifactPaths, report);
126
+ }
127
+ const certificate = target.symbolic_certificate_binding;
128
+ if (!certificate) {
129
+ issue(report, "ui_design_symbolic_certificate_binding_required", label);
130
+ return;
131
+ }
132
+ const assertion = check.positive_assertions.find((item) => item.key === certificate.assertion_ref);
133
+ if (!assertion)
134
+ issue(report, "ui_design_symbolic_certificate_assertion_unknown", `${label}:${certificate.assertion_ref}`);
135
+ else if (!assertion.evidence_capabilities.includes("design_symbolic_certificate"))
136
+ issue(report, "ui_design_symbolic_certificate_capability_required", label);
137
+ if (!certificate.expectations.length)
138
+ issue(report, "ui_design_symbolic_certificate_expectations_required", label);
139
+ unique(certificate.expectations.map((item) => item.certificate_ref), "ui_design_symbolic_certificate_duplicate", label, report);
140
+ validateSymbolicArtifactPath(certificate.artifact_path, target, check, label, artifactPaths, report);
141
+ }
142
+ function validateSymbolicArtifactPath(artifactPath, _target, check, label, artifactPaths, report) {
143
+ if (artifactPaths.has(artifactPath))
144
+ issue(report, "ui_design_symbolic_evidence_artifact_reused", `${label}:${artifactPath}`);
145
+ artifactPaths.add(artifactPath);
146
+ if (!check.artifact_globs.some((pattern) => matchesRepoPattern(artifactPath, pattern)))
147
+ issue(report, "ui_design_symbolic_evidence_artifact_glob_missing", `${label}:${artifactPath}`);
148
+ }
89
149
  function sameSet(left, right) {
90
150
  const leftSet = [...new Set(left)].sort();
91
151
  const rightSet = [...new Set(right)].sort();