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,14 @@
1
+ import type { DesignResource } from "./design-resource-handoff-file-primitives.js";
2
+ import type { DesignResourceObservableRuleManifestV2, DesignResourceSymbolicNoninterferenceCertificateV2, DesignResourceSymbolicNoninterferenceProofMethodV2 } from "./design-resource-symbolic-fact-types.js";
3
+ import { type DerivedCurrentSourceNoninterferenceEvidenceV2 } from "./design-resource-symbolic-source-ir-evidence.js";
4
+ import type { DesignResourceSymbolicSourceIrCertificateScopeV1 } from "./design-resource-symbolic-source-ir-types.js";
5
+ export declare function deriveCurrentSourceScopeEvidence({ manifest, certificate, method, resource, source, sourceResourceRef, scope, certificateScopeSha256, }: {
6
+ manifest: DesignResourceObservableRuleManifestV2;
7
+ certificate: DesignResourceSymbolicNoninterferenceCertificateV2;
8
+ method: DesignResourceSymbolicNoninterferenceProofMethodV2;
9
+ resource: DesignResource;
10
+ source: string;
11
+ sourceResourceRef: string;
12
+ scope: DesignResourceSymbolicSourceIrCertificateScopeV1;
13
+ certificateScopeSha256: string;
14
+ }): DerivedCurrentSourceNoninterferenceEvidenceV2;
@@ -0,0 +1,98 @@
1
+ import { compareText } from "./design-resource-symbolic-validation-support.js";
2
+ import { derivedSourceResult, emptyDerivedSourceResult, failedSourceEvidence, sameStringSet, sourceCaseWitness, sourceNoninterferenceWitness, } from "./design-resource-symbolic-source-ir-evidence.js";
3
+ import { evaluateCompleteSymbolicSourceDomain } from "./design-resource-symbolic-source-ir-evaluation.js";
4
+ import { createSymbolicDenotationCompilationSession } from "./symbolic-denotation-engine.js";
5
+ export function deriveCurrentSourceScopeEvidence({ manifest, certificate, method, resource, source, sourceResourceRef, scope, certificateScopeSha256, }) {
6
+ const ruleIndex = new Map(manifest.fact_rules.map((rule) => [rule.key, rule]));
7
+ const rules = certificate.fact_rule_refs.map((ruleRef) => {
8
+ const rule = ruleIndex.get(ruleRef);
9
+ if (!rule)
10
+ throw new Error(`certificate_rule_unknown:${ruleRef}`);
11
+ return rule;
12
+ });
13
+ const compilation = createSymbolicDenotationCompilationSession(manifest.axis_domains, [
14
+ ...rules.map((rule) => rule.region),
15
+ ...scope.regions.map((row) => row.predicate),
16
+ ]);
17
+ const rulesByRegion = new Map();
18
+ for (const rule of rules) {
19
+ const compiled = compilation.compile(rule.region);
20
+ const current = rulesByRegion.get(compiled.canonical_sha256) ?? {
21
+ factRuleRefs: [],
22
+ compiled,
23
+ };
24
+ current.factRuleRefs.push(rule.key);
25
+ rulesByRegion.set(compiled.canonical_sha256, current);
26
+ }
27
+ const declaredRegionRefs = scope.regions.map((row) => row.rule_region_sha256);
28
+ if (new Set(declaredRegionRefs).size !== declaredRegionRefs.length)
29
+ throw new Error("symbolic_source_ir_region_duplicate");
30
+ if (!sameStringSet(declaredRegionRefs, [...rulesByRegion.keys()]))
31
+ return failedSourceEvidence(emptyDerivedSourceResult(method, sourceResourceRef), sourceNoninterferenceWitness({
32
+ certificateScopeSha256,
33
+ resource,
34
+ locator: "/certificate_scopes/*/regions",
35
+ detail: `source_rule_region_set_mismatch:${declaredRegionRefs.join(",")}:${[
36
+ ...rulesByRegion.keys(),
37
+ ].join(",")}`,
38
+ kind: "source_rule_denotation_mismatch",
39
+ }));
40
+ const cases = scope.regions.map((region, index) => {
41
+ const expected = rulesByRegion.get(region.rule_region_sha256);
42
+ return {
43
+ index,
44
+ region,
45
+ compiledSource: compilation.compile(region.predicate),
46
+ compiledRule: expected.compiled,
47
+ factRuleRefs: [...expected.factRuleRefs].sort(compareText),
48
+ };
49
+ });
50
+ const derived = derivedSourceResult(method, sourceResourceRef, cases, manifest);
51
+ if (method !== "finite_complete_domain_exhaustive_equivalence") {
52
+ for (const proofCase of cases) {
53
+ const omittedAxisRef = proofCase.compiledSource.referenced_axis_refs.find((axisRef) => certificate.omitted_axis_refs.includes(axisRef));
54
+ if (omittedAxisRef)
55
+ return failedSourceEvidence(derived, sourceCaseWitness({
56
+ certificateScopeSha256,
57
+ resource,
58
+ source,
59
+ proofCase,
60
+ axisRef: omittedAxisRef,
61
+ kind: "omitted_axis_dependency",
62
+ detail: "current Source expression branches on an omitted axis",
63
+ }));
64
+ if (proofCase.compiledSource.canonical_sha256 !==
65
+ proofCase.compiledRule.canonical_sha256)
66
+ return failedSourceEvidence(derived, sourceCaseWitness({
67
+ certificateScopeSha256,
68
+ resource,
69
+ source,
70
+ proofCase,
71
+ kind: "source_rule_denotation_mismatch",
72
+ detail: "current Source predicate differs from the current Rule region",
73
+ }));
74
+ }
75
+ return { derived_result: derived, failure_witness: null };
76
+ }
77
+ const exhaustive = evaluateCompleteSymbolicSourceDomain(manifest.axis_domains, certificate.omitted_axis_refs, cases.map((proofCase) => ({
78
+ fact_rule_refs: proofCase.factRuleRefs,
79
+ source: proofCase.compiledSource,
80
+ rule: proofCase.compiledRule,
81
+ })));
82
+ derived.complete_domain_cardinality = exhaustive.cardinality;
83
+ derived.exhaustive_evaluation_sha256 = exhaustive.evaluation_sha256;
84
+ if (exhaustive.counterexample) {
85
+ const proofCase = cases.find((item) => item.factRuleRefs.includes(exhaustive.counterexample.fact_rule_ref));
86
+ return failedSourceEvidence(derived, sourceCaseWitness({
87
+ certificateScopeSha256,
88
+ resource,
89
+ source,
90
+ proofCase,
91
+ kind: exhaustive.counterexample.kind,
92
+ axisRef: exhaustive.counterexample.axis_ref,
93
+ assignment: exhaustive.counterexample.assignment,
94
+ detail: exhaustive.counterexample.detail,
95
+ }));
96
+ }
97
+ return { derived_result: derived, failure_witness: null };
98
+ }
@@ -0,0 +1,2 @@
1
+ import { type DesignResourceSymbolicSourceIrV1 } from "./design-resource-symbolic-source-ir-types.js";
2
+ export declare function parseDesignResourceSymbolicSourceIr(value: unknown, label: string): DesignResourceSymbolicSourceIrV1;
@@ -0,0 +1,38 @@
1
+ import { sha256, stableKey, } from "./design-resource-handoff-shape-primitives.js";
2
+ import { parseSymbolicPredicate } from "./design-resource-symbolic-predicate-shape.js";
3
+ import { DESIGN_RESOURCE_SYMBOLIC_SOURCE_IR_SCHEMA_VERSION, } from "./design-resource-symbolic-source-ir-types.js";
4
+ import { array, literal, object } from "./long-task-shape-primitives.js";
5
+ export function parseDesignResourceSymbolicSourceIr(value, label) {
6
+ const root = object(value, label, [
7
+ "schema_version",
8
+ "target_ref",
9
+ "certificate_scopes",
10
+ ]);
11
+ return {
12
+ schema_version: literal(root.schema_version, [DESIGN_RESOURCE_SYMBOLIC_SOURCE_IR_SCHEMA_VERSION], `${label}.schema_version`),
13
+ target_ref: stableKey(root.target_ref, `${label}.target_ref`),
14
+ certificate_scopes: array(root.certificate_scopes, `${label}.certificate_scopes`).map((scope, scopeIndex) => {
15
+ const scopeLabel = `${label}.certificate_scopes[${scopeIndex}]`;
16
+ const row = object(scope, scopeLabel, [
17
+ "certificate_scope_sha256",
18
+ "rule_scope_sha256",
19
+ "regions",
20
+ ]);
21
+ return {
22
+ certificate_scope_sha256: sha256(row.certificate_scope_sha256, `${scopeLabel}.certificate_scope_sha256`),
23
+ rule_scope_sha256: sha256(row.rule_scope_sha256, `${scopeLabel}.rule_scope_sha256`),
24
+ regions: array(row.regions, `${scopeLabel}.regions`).map((region, regionIndex) => {
25
+ const regionLabel = `${scopeLabel}.regions[${regionIndex}]`;
26
+ const entry = object(region, regionLabel, [
27
+ "rule_region_sha256",
28
+ "predicate",
29
+ ]);
30
+ return {
31
+ rule_region_sha256: sha256(entry.rule_region_sha256, `${regionLabel}.rule_region_sha256`),
32
+ predicate: parseSymbolicPredicate(entry.predicate, `${regionLabel}.predicate`),
33
+ };
34
+ }),
35
+ };
36
+ }),
37
+ };
38
+ }
@@ -0,0 +1,17 @@
1
+ import type { SymbolicDenotationPredicate } from "./symbolic-denotation-types.js";
2
+ export declare const DESIGN_RESOURCE_SYMBOLIC_SOURCE_IR_SCHEMA_VERSION: "design-resource-symbolic-source-ir-v1";
3
+ export declare const DESIGN_RESOURCE_SYMBOLIC_SOURCE_IR_MEDIA_TYPE: "application/vnd.ty-context.symbolic-source-ir+json";
4
+ export interface DesignResourceSymbolicSourceIrRegionV1 {
5
+ rule_region_sha256: string;
6
+ predicate: SymbolicDenotationPredicate;
7
+ }
8
+ export interface DesignResourceSymbolicSourceIrCertificateScopeV1 {
9
+ certificate_scope_sha256: string;
10
+ rule_scope_sha256: string;
11
+ regions: DesignResourceSymbolicSourceIrRegionV1[];
12
+ }
13
+ export interface DesignResourceSymbolicSourceIrV1 {
14
+ schema_version: typeof DESIGN_RESOURCE_SYMBOLIC_SOURCE_IR_SCHEMA_VERSION;
15
+ target_ref: string;
16
+ certificate_scopes: DesignResourceSymbolicSourceIrCertificateScopeV1[];
17
+ }
@@ -0,0 +1,2 @@
1
+ export const DESIGN_RESOURCE_SYMBOLIC_SOURCE_IR_SCHEMA_VERSION = "design-resource-symbolic-source-ir-v1";
2
+ export const DESIGN_RESOURCE_SYMBOLIC_SOURCE_IR_MEDIA_TYPE = "application/vnd.ty-context.symbolic-source-ir+json";
@@ -0,0 +1,2 @@
1
+ import type { DesignResourceHandoffPreflightV2, DesignResourceObservableRuleManifestV2, DesignResourceSymbolicNoninterferenceCertificateV2, DesignResourceSymbolicNoninterferenceProofV2 } from "./design-resource-symbolic-fact-types.js";
2
+ export declare function validateStaticDependencyClosure(proof: DesignResourceSymbolicNoninterferenceProofV2, certificate: DesignResourceSymbolicNoninterferenceCertificateV2, projections: DesignResourceHandoffPreflightV2["rule_projections"], manifest: DesignResourceObservableRuleManifestV2): void;
@@ -0,0 +1,83 @@
1
+ import { assertSameSet, invalid, requireKnownRefs, unique, } from "./design-resource-symbolic-validation-support.js";
2
+ const MAX_STATIC_DEPENDENCY_NODES = 8_192;
3
+ const MAX_STATIC_DEPENDENCY_EDGES = 65_536;
4
+ const MAX_STATIC_DEPENDENCY_DEPTH = 512;
5
+ export function validateStaticDependencyClosure(proof, certificate, projections, manifest) {
6
+ if (proof.equivalence_cases.length ||
7
+ proof.complete_domain_cardinality !== null)
8
+ invalid("v2_static_dependency_proof_shape_invalid", certificate.key);
9
+ if (!proof.static_dependency_nodes.length || !proof.static_rule_roots.length)
10
+ invalid("v2_static_dependency_graph_required", certificate.key);
11
+ if (proof.static_dependency_nodes.length > MAX_STATIC_DEPENDENCY_NODES)
12
+ invalid("v2_static_dependency_node_limit_exceeded", certificate.key);
13
+ if (proof.static_dependency_nodes.reduce((total, node) => total + node.dependency_refs.length, 0) > MAX_STATIC_DEPENDENCY_EDGES)
14
+ invalid("v2_static_dependency_edge_limit_exceeded", certificate.key);
15
+ const nodes = new Map(proof.static_dependency_nodes.map((node) => [node.key, node]));
16
+ unique(proof.static_dependency_nodes.map((node) => node.key), `v2_static_dependency_node_duplicate:${certificate.key}`);
17
+ validateNodes(proof, manifest, nodes, certificate.key);
18
+ const rootedRuleRefs = proof.static_rule_roots.flatMap((root) => root.fact_rule_refs ?? certificate.fact_rule_refs);
19
+ unique(rootedRuleRefs, `v2_static_dependency_rule_duplicate:${certificate.key}`);
20
+ assertSameSet(rootedRuleRefs, certificate.fact_rule_refs, "v2_static_dependency_rule_set_mismatch", certificate.key);
21
+ const projectionsByRule = new Map(projections.map((projection) => [projection.rule.key, projection]));
22
+ const reachedNodes = new Set();
23
+ const reachedResources = new Set();
24
+ const closureMemo = new Map();
25
+ for (const root of proof.static_rule_roots) {
26
+ const rootRuleRefs = root.fact_rule_refs ?? certificate.fact_rule_refs;
27
+ if (!rootRuleRefs.length)
28
+ invalid("v2_static_dependency_root_rules_required", certificate.key);
29
+ const closure = collectClosure(root.node_ref, nodes, new Set(), reachedNodes, certificate.key, closureMemo);
30
+ if (closure.maximumDepth > MAX_STATIC_DEPENDENCY_DEPTH)
31
+ invalid("v2_static_dependency_depth_limit_exceeded", certificate.key);
32
+ closure.inputResourceRefs.forEach((ref) => reachedResources.add(ref));
33
+ for (const ruleRef of rootRuleRefs) {
34
+ const projection = projectionsByRule.get(ruleRef);
35
+ if (!projection)
36
+ invalid("v2_static_dependency_rule_unknown", `${certificate.key}:${ruleRef}`);
37
+ assertSameSet([...closure.axisRefs], projection.compiled_region.referenced_axis_refs, "v2_static_dependency_closure_mismatch", `${certificate.key}:${ruleRef}`);
38
+ if (certificate.omitted_axis_refs.some((axisRef) => closure.axisRefs.has(axisRef)))
39
+ invalid("v2_static_dependency_omitted_axis_conflict", `${certificate.key}:${ruleRef}`);
40
+ }
41
+ }
42
+ assertSameSet([...reachedNodes], [...nodes.keys()], "v2_static_dependency_unreachable_node", certificate.key);
43
+ assertSameSet([...reachedResources], proof.input_resource_refs, "v2_static_dependency_input_graph_mismatch", certificate.key);
44
+ }
45
+ function validateNodes(proof, manifest, nodes, label) {
46
+ const axes = new Set(manifest.axis_domains.map((axis) => axis.key));
47
+ for (const node of nodes.values()) {
48
+ unique(node.axis_refs, `v2_static_dependency_axis_duplicate:${node.key}`);
49
+ unique(node.dependency_refs, `v2_static_dependency_ref_duplicate:${node.key}`);
50
+ unique(node.input_resource_refs, `v2_static_dependency_input_duplicate:${node.key}`);
51
+ requireKnownRefs(node.axis_refs, axes, "v2_static_dependency_axis_unknown");
52
+ requireKnownRefs(node.dependency_refs, nodes, "v2_static_dependency_node_unknown");
53
+ requireKnownRefs(node.input_resource_refs, new Set(manifest.inspector.input_resources.map((resource) => resource.resource_ref)), "v2_static_dependency_input_unknown");
54
+ }
55
+ requireKnownRefs(proof.static_rule_roots.map((root) => root.node_ref), nodes, "v2_static_dependency_root_unknown");
56
+ if (!proof.input_resource_refs.length)
57
+ invalid("v2_noninterference_inputs_required", label);
58
+ }
59
+ function collectClosure(nodeRef, nodes, visiting, reached, label, memo) {
60
+ if (visiting.has(nodeRef))
61
+ invalid("v2_static_dependency_cycle", `${label}:${nodeRef}`);
62
+ const cached = memo.get(nodeRef);
63
+ if (cached)
64
+ return cached;
65
+ const node = nodes.get(nodeRef);
66
+ if (!node)
67
+ invalid("v2_static_dependency_node_unknown", `${label}:${nodeRef}`);
68
+ visiting.add(nodeRef);
69
+ reached.add(nodeRef);
70
+ const axisRefs = new Set(node.axis_refs);
71
+ const inputResourceRefs = new Set(node.input_resource_refs);
72
+ let maximumDepth = 1;
73
+ for (const dependencyRef of node.dependency_refs) {
74
+ const dependency = collectClosure(dependencyRef, nodes, visiting, reached, label, memo);
75
+ dependency.axisRefs.forEach((ref) => axisRefs.add(ref));
76
+ dependency.inputResourceRefs.forEach((ref) => inputResourceRefs.add(ref));
77
+ maximumDepth = Math.max(maximumDepth, dependency.maximumDepth + 1);
78
+ }
79
+ visiting.delete(nodeRef);
80
+ const result = { axisRefs, inputResourceRefs, maximumDepth };
81
+ memo.set(nodeRef, result);
82
+ return result;
83
+ }
@@ -0,0 +1,6 @@
1
+ import type { DesignResource } from "./design-resource-handoff-file-primitives.js";
2
+ import type { DesignResourceSymbolicCompilationSession } from "./design-resource-symbolic-compilation.js";
3
+ import type { SymbolicManifestIndexes } from "./design-resource-symbolic-indexes.js";
4
+ import type { DesignResourceObservableRuleManifestV2, DesignResourceSymbolicHandoffTargetV2 } from "./design-resource-symbolic-fact-types.js";
5
+ export declare function validateSymbolicSubjectPopulationClosure(manifest: DesignResourceObservableRuleManifestV2, target: DesignResourceSymbolicHandoffTargetV2, indexes: SymbolicManifestIndexes, resources: Map<string, DesignResource>, contents: Map<string, Buffer>, compilation: DesignResourceSymbolicCompilationSession): void;
6
+ export declare function validateSymbolicCensusClosure(manifest: DesignResourceObservableRuleManifestV2, indexes: SymbolicManifestIndexes): void;
@@ -0,0 +1,79 @@
1
+ import { validateDesignResourceLocatedDigest } from "./design-resource-fact-locator-validation.js";
2
+ import { validateSymbolicQuantifier, validateSymbolicRegionWithinReachable, } from "./design-resource-symbolic-region-validation.js";
3
+ import { assertNoUnprovedOmittedAxes } from "./design-resource-symbolic-safety-validation.js";
4
+ import { assertSameSet, invalid, requireKnownRefs, unique, } from "./design-resource-symbolic-validation-support.js";
5
+ export function validateSymbolicSubjectPopulationClosure(manifest, target, indexes, resources, contents, compilation) {
6
+ validateSubjects(manifest, target.key, indexes);
7
+ validatePopulations(manifest, target, indexes, resources, contents, compilation);
8
+ }
9
+ export function validateSymbolicCensusClosure(manifest, indexes) {
10
+ validateCensusClosure(manifest, indexes);
11
+ }
12
+ function validateSubjects(manifest, targetKey, indexes) {
13
+ const stableKeys = [];
14
+ for (const subject of manifest.subjects) {
15
+ if (!subject.stable_keys.length)
16
+ invalid("v2_subject_stable_keys_required", subject.key);
17
+ unique(subject.stable_keys, `v2_subject_stable_key_duplicate:${subject.key}`);
18
+ stableKeys.push(...subject.stable_keys);
19
+ assertSameSet(subject.target_refs, [targetKey], "v2_subject_target_mismatch", subject.key);
20
+ requireKnownRefs(subject.census_refs, indexes.census, "v2_subject_census_unknown");
21
+ if (subject.population_ref &&
22
+ !indexes.populations.has(subject.population_ref))
23
+ invalid("v2_subject_population_unknown", subject.key);
24
+ for (const ref of [
25
+ subject.parent_ref,
26
+ subject.instance_of_ref,
27
+ subject.override_of_ref,
28
+ subject.family_ref,
29
+ subject.portal_host_ref,
30
+ ])
31
+ if (ref !== null && !indexes.subjects.has(ref))
32
+ invalid("v2_subject_hierarchy_ref_unknown", `${subject.key}:${ref}`);
33
+ unique(subject.relation_endpoints.map((item) => item.role), `v2_relation_endpoint_role_duplicate:${subject.key}`);
34
+ for (const endpoint of subject.relation_endpoints)
35
+ if (!indexes.subjects.has(endpoint.subject_ref))
36
+ invalid("v2_relation_endpoint_subject_unknown", `${subject.key}:${endpoint.subject_ref}`);
37
+ if (subject.kind === "relation" && subject.relation_endpoints.length < 2)
38
+ invalid("v2_relation_endpoints_incomplete", subject.key);
39
+ if (subject.presence === "always" && subject.presence_rule_ref !== null)
40
+ invalid("v2_subject_always_presence_rule_forbidden", subject.key);
41
+ }
42
+ unique(stableKeys, "v2_subject_stable_key_ambiguous");
43
+ }
44
+ function validatePopulations(manifest, target, indexes, resources, contents, compilation) {
45
+ const targetResources = new Set(target.resource_refs);
46
+ for (const population of manifest.populations) {
47
+ requireKnownRefs(population.member_subject_refs, indexes.subjects, "v2_population_subject_unknown");
48
+ assertSameSet(population.member_subject_refs, manifest.subjects
49
+ .filter((subject) => subject.population_ref === population.key)
50
+ .map((subject) => subject.key), "v2_population_member_set_mismatch", population.key);
51
+ if ((population.kind === "static" && population.enumeration !== "complete") ||
52
+ (population.kind === "dynamic" &&
53
+ population.enumeration !== "symbolic_partition"))
54
+ invalid("v2_population_enumeration_mismatch", population.key);
55
+ validateDesignResourceLocatedDigest(population.universe, resources, contents, `v2.population.${population.key}.universe`);
56
+ if (!targetResources.has(population.universe.locator.resource_ref))
57
+ invalid("v2_population_resource_outside_target", population.key);
58
+ validateSymbolicQuantifier(population.quantifier, population.key);
59
+ unique(population.exclusions.map((item) => item.key), `v2_population_exclusion_key_duplicate:${population.key}`);
60
+ for (const exclusion of population.exclusions) {
61
+ if (!exclusion.basis_refs.length)
62
+ invalid("v2_population_exclusion_basis_required", exclusion.key);
63
+ const compiled = compilation.compile(exclusion.region);
64
+ assertNoUnprovedOmittedAxes(compiled, exclusion.key);
65
+ validateSymbolicRegionWithinReachable(exclusion.region, manifest.reachable_region, exclusion.key, compilation);
66
+ }
67
+ }
68
+ }
69
+ function validateCensusClosure(manifest, indexes) {
70
+ const rules = new Map(manifest.fact_rules.map((item) => [item.key, item]));
71
+ for (const row of manifest.inspector.census) {
72
+ requireKnownRefs(row.fact_refs, rules, "v2_census_rule_unknown");
73
+ requireKnownRefs(row.source_item_refs, indexes.sourceItems, "v2_census_source_item_unknown");
74
+ if (!row.source_item_refs.length || !row.basis_refs.length)
75
+ invalid("v2_census_basis_source_required", row.key);
76
+ unique(row.fact_refs, `v2_census_rule_ref_duplicate:${row.key}`);
77
+ assertSameSet(row.fact_refs, (indexes.rulesByCensus.get(row.key) ?? []).map((rule) => rule.key), "v2_census_rule_set_mismatch", row.key);
78
+ }
79
+ }
@@ -0,0 +1,29 @@
1
+ import type { DesignResourceObservableRuleManifestV2, DesignResourceSymbolicDependencyEdgeV2, DesignResourceSymbolicFactRuleV2, DesignResourceSymbolicNoninterferenceCertificateV2 } from "./design-resource-symbolic-fact-types.js";
2
+ export declare function designResourceSymbolicRuleKey(rule: Omit<DesignResourceSymbolicFactRuleV2, "key" | "semantic_obligation_refs">, regionSha256: string): string;
3
+ export declare function designResourceSymbolicObligationKey(obligation: Omit<DesignResourceObservableRuleManifestV2["semantic_proof_obligations"][number], "key">): string;
4
+ export declare function designResourceSymbolicDependencyEdge(axisRef: string, factRuleRef: string): DesignResourceSymbolicDependencyEdgeV2;
5
+ export declare function designResourceSymbolicCertificateKey(certificate: Omit<DesignResourceSymbolicNoninterferenceCertificateV2, "key">): string;
6
+ export declare function designResourceSymbolicNoninterferenceProofDigest(proof: DesignResourceSymbolicNoninterferenceCertificateV2["source_noninterference_proof"]): string | null;
7
+ export declare function designResourceSymbolicCombinedRuleDigest(ruleProjections: Array<{
8
+ rule: {
9
+ key: string;
10
+ };
11
+ compiled_region: {
12
+ canonical_sha256: string;
13
+ };
14
+ }>): string;
15
+ export declare function omitRuleIdentityFields(rule: DesignResourceSymbolicFactRuleV2): Omit<DesignResourceSymbolicFactRuleV2, "key" | "semantic_obligation_refs">;
16
+ export declare function omitKey<T extends {
17
+ key: string;
18
+ }>(value: T): Omit<T, "key">;
19
+ export declare function requireExactRefs<T>(refs: string[], values: Map<string, T>, code: string): void;
20
+ export declare function requireKnownRefs(refs: string[], values: ReadonlyMap<string, unknown> | ReadonlySet<string>, code: string): void;
21
+ export declare function unique(values: string[], code: string): void;
22
+ export declare function assertSameSet(actual: string[], expected: string[], code: string, detail: string): void;
23
+ export declare function assertCanonicalSet<T extends {
24
+ key: string;
25
+ }>(actual: T[], expected: T[], code: string): void;
26
+ export declare function stableJson(value: unknown): string;
27
+ export declare function sha256(value: string): string;
28
+ export declare function compareText(left: string, right: string): number;
29
+ export declare function invalid(code: string, detail: string): never;
@@ -0,0 +1,111 @@
1
+ import { createHash } from "node:crypto";
2
+ import { invalidDesignResourceHandoff } from "./design-resource-handoff-validation-primitives.js";
3
+ const ALL_EFFECTS = [
4
+ "disposition",
5
+ "expected_semantics",
6
+ "proof_denotation",
7
+ ];
8
+ export function designResourceSymbolicRuleKey(rule, regionSha256) {
9
+ return `rule.${sha256(stableJson({
10
+ subject_or_relation_ref: rule.subject_or_relation_ref,
11
+ target_ref: rule.target_ref,
12
+ property_ref: rule.property_ref,
13
+ population_ref: rule.population_ref,
14
+ quantifier: rule.quantifier,
15
+ region_sha256: regionSha256,
16
+ expected: rule.expected,
17
+ value_kind: rule.value_kind,
18
+ provenance_ref: rule.provenance_ref,
19
+ observation_scope: rule.observation_scope,
20
+ observation_sensitivity: rule.observation_sensitivity,
21
+ lineage: rule.lineage,
22
+ evidence_refs: [...rule.evidence_refs].sort(compareText),
23
+ census_refs: [...rule.census_refs].sort(compareText),
24
+ source_item_refs: [...rule.source_item_refs].sort(compareText),
25
+ }))}`;
26
+ }
27
+ export function designResourceSymbolicObligationKey(obligation) {
28
+ return `obligation.${sha256(stableJson(obligation))}`;
29
+ }
30
+ export function designResourceSymbolicDependencyEdge(axisRef, factRuleRef) {
31
+ const body = {
32
+ axis_ref: axisRef,
33
+ fact_rule_ref: factRuleRef,
34
+ effects: [...ALL_EFFECTS],
35
+ };
36
+ return { key: `edge.${sha256(stableJson(body))}`, ...body };
37
+ }
38
+ export function designResourceSymbolicCertificateKey(certificate) {
39
+ return `certificate.${sha256(stableJson({
40
+ ...certificate,
41
+ fact_rule_refs: [...certificate.fact_rule_refs].sort(compareText),
42
+ omitted_axis_refs: [...certificate.omitted_axis_refs].sort(compareText),
43
+ dependency_edge_refs: [...certificate.dependency_edge_refs].sort(compareText),
44
+ }))}`;
45
+ }
46
+ export function designResourceSymbolicNoninterferenceProofDigest(proof) {
47
+ return proof ? sha256(stableJson(proof)) : null;
48
+ }
49
+ export function designResourceSymbolicCombinedRuleDigest(ruleProjections) {
50
+ return sha256(stableJson(ruleProjections
51
+ .map((projection) => ({
52
+ rule_ref: projection.rule.key,
53
+ region_sha256: projection.compiled_region.canonical_sha256,
54
+ }))
55
+ .sort((left, right) => compareText(left.rule_ref, right.rule_ref))));
56
+ }
57
+ export function omitRuleIdentityFields(rule) {
58
+ const { key: _key, semantic_obligation_refs: _refs, ...value } = rule;
59
+ return value;
60
+ }
61
+ export function omitKey(value) {
62
+ const { key: _key, ...rest } = value;
63
+ return rest;
64
+ }
65
+ export function requireExactRefs(refs, values, code) {
66
+ unique(refs, `${code}_duplicate`);
67
+ requireKnownRefs(refs, values, `${code}_unknown`);
68
+ }
69
+ export function requireKnownRefs(refs, values, code) {
70
+ for (const ref of refs)
71
+ if (!values.has(ref))
72
+ invalid(code, ref);
73
+ }
74
+ export function unique(values, code) {
75
+ if (new Set(values).size !== values.length)
76
+ invalid(code, "");
77
+ }
78
+ export function assertSameSet(actual, expected, code, detail) {
79
+ const left = [...new Set(actual)].sort(compareText);
80
+ const right = [...new Set(expected)].sort(compareText);
81
+ if (left.length !== right.length ||
82
+ left.some((item, index) => item !== right[index]))
83
+ invalid(code, `${detail}:${left.join(",")}:${right.join(",")}`);
84
+ }
85
+ export function assertCanonicalSet(actual, expected, code) {
86
+ const left = new Map(actual.map((item) => [item.key, stableJson(item)]));
87
+ const right = new Map(expected.map((item) => [item.key, stableJson(item)]));
88
+ assertSameSet([...left.keys()], [...right.keys()], code, "keys");
89
+ for (const [key, value] of right)
90
+ if (left.get(key) !== value)
91
+ invalid(code, key);
92
+ }
93
+ export function stableJson(value) {
94
+ if (Array.isArray(value))
95
+ return `[${value.map((item) => stableJson(item)).join(",")}]`;
96
+ if (value && typeof value === "object")
97
+ return `{${Object.entries(value)
98
+ .sort(([left], [right]) => compareText(left, right))
99
+ .map(([key, entry]) => `${JSON.stringify(key)}:${stableJson(entry)}`)
100
+ .join(",")}}`;
101
+ return JSON.stringify(value);
102
+ }
103
+ export function sha256(value) {
104
+ return createHash("sha256").update(value).digest("hex");
105
+ }
106
+ export function compareText(left, right) {
107
+ return left < right ? -1 : left > right ? 1 : 0;
108
+ }
109
+ export function invalid(code, detail) {
110
+ invalidDesignResourceHandoff(code, detail);
111
+ }
@@ -0,0 +1,8 @@
1
+ declare const V1_SCHEMA = "design-resource-observable-fact-manifest-v1";
2
+ export declare const DESIGN_RESOURCE_V1_REGENERATION_GUIDANCE = "regenerate_as=design-resource-handoff-v2:fact_model=symbolic_rules_v2";
3
+ export interface DesignResourceV1CapacityHeader {
4
+ schema_version: typeof V1_SCHEMA;
5
+ collection_counts: ReadonlyMap<string, number>;
6
+ }
7
+ export declare function parseDesignResourceV1CapacityHeader(prefix: string): DesignResourceV1CapacityHeader;
8
+ export {};