project-tiny-context-harness 0.8.11 → 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 (272) 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 -3
  48. package/dist/index.js +2 -0
  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-policy.d.ts +2 -2
  63. package/dist/lib/design-resource-fact-types.d.ts +2 -2
  64. package/dist/lib/design-resource-handoff-bundle-draft.js +4 -2
  65. package/dist/lib/design-resource-handoff-input-types.d.ts +3 -0
  66. package/dist/lib/design-resource-handoff-parser.d.ts +2 -2
  67. package/dist/lib/design-resource-handoff-parser.js +2 -2
  68. package/dist/lib/design-resource-handoff-shape.d.ts +2 -0
  69. package/dist/lib/design-resource-handoff-shape.js +10 -0
  70. package/dist/lib/design-resource-handoff-snapshot.js +4 -0
  71. package/dist/lib/design-resource-handoff-validation.d.ts +4 -1
  72. package/dist/lib/design-resource-handoff-validation.js +11 -0
  73. package/dist/lib/design-resource-handoff-web-dependency-validation.d.ts +4 -2
  74. package/dist/lib/design-resource-symbolic-applicability-authority.d.ts +7 -0
  75. package/dist/lib/design-resource-symbolic-applicability-authority.js +19 -0
  76. package/dist/lib/design-resource-symbolic-applicability-policy.d.ts +12 -0
  77. package/dist/lib/design-resource-symbolic-applicability-policy.js +79 -0
  78. package/dist/lib/design-resource-symbolic-applicability-profiles.d.ts +8 -0
  79. package/dist/lib/design-resource-symbolic-applicability-profiles.js +55 -0
  80. package/dist/lib/design-resource-symbolic-applicability-shape.d.ts +2 -0
  81. package/dist/lib/design-resource-symbolic-applicability-shape.js +76 -0
  82. package/dist/lib/design-resource-symbolic-applicability-validation.d.ts +7 -0
  83. package/dist/lib/design-resource-symbolic-applicability-validation.js +128 -0
  84. package/dist/lib/design-resource-symbolic-compilation.d.ts +3 -0
  85. package/dist/lib/design-resource-symbolic-compilation.js +13 -0
  86. package/dist/lib/design-resource-symbolic-denotation.d.ts +3 -0
  87. package/dist/lib/design-resource-symbolic-denotation.js +167 -0
  88. package/dist/lib/design-resource-symbolic-disposition-validation.d.ts +4 -0
  89. package/dist/lib/design-resource-symbolic-disposition-validation.js +28 -0
  90. package/dist/lib/design-resource-symbolic-fact-policy.d.ts +12 -0
  91. package/dist/lib/design-resource-symbolic-fact-policy.js +12 -0
  92. package/dist/lib/design-resource-symbolic-fact-shape.d.ts +3 -0
  93. package/dist/lib/design-resource-symbolic-fact-shape.js +138 -0
  94. package/dist/lib/design-resource-symbolic-fact-types.d.ts +213 -0
  95. package/dist/lib/design-resource-symbolic-fact-types.js +1 -0
  96. package/dist/lib/design-resource-symbolic-fact-validation.d.ts +3 -0
  97. package/dist/lib/design-resource-symbolic-fact-validation.js +86 -0
  98. package/dist/lib/design-resource-symbolic-indexes.d.ts +23 -0
  99. package/dist/lib/design-resource-symbolic-indexes.js +54 -0
  100. package/dist/lib/design-resource-symbolic-manifest-shape.d.ts +3 -0
  101. package/dist/lib/design-resource-symbolic-manifest-shape.js +155 -0
  102. package/dist/lib/design-resource-symbolic-manifest-validation.d.ts +6 -0
  103. package/dist/lib/design-resource-symbolic-manifest-validation.js +132 -0
  104. package/dist/lib/design-resource-symbolic-noninterference-artifact.d.ts +33 -0
  105. package/dist/lib/design-resource-symbolic-noninterference-artifact.js +110 -0
  106. package/dist/lib/design-resource-symbolic-noninterference-equivalence.d.ts +3 -0
  107. package/dist/lib/design-resource-symbolic-noninterference-equivalence.js +77 -0
  108. package/dist/lib/design-resource-symbolic-noninterference-recompute.d.ts +4 -0
  109. package/dist/lib/design-resource-symbolic-noninterference-recompute.js +146 -0
  110. package/dist/lib/design-resource-symbolic-noninterference-scope.d.ts +7 -0
  111. package/dist/lib/design-resource-symbolic-noninterference-scope.js +49 -0
  112. package/dist/lib/design-resource-symbolic-noninterference-shape.d.ts +2 -0
  113. package/dist/lib/design-resource-symbolic-noninterference-shape.js +152 -0
  114. package/dist/lib/design-resource-symbolic-noninterference-types.d.ts +103 -0
  115. package/dist/lib/design-resource-symbolic-noninterference-types.js +1 -0
  116. package/dist/lib/design-resource-symbolic-noninterference-validation.d.ts +5 -0
  117. package/dist/lib/design-resource-symbolic-noninterference-validation.js +62 -0
  118. package/dist/lib/design-resource-symbolic-oracle-fingerprint.d.ts +1 -0
  119. package/dist/lib/design-resource-symbolic-oracle-fingerprint.js +47 -0
  120. package/dist/lib/design-resource-symbolic-predicate-shape.d.ts +6 -0
  121. package/dist/lib/design-resource-symbolic-predicate-shape.js +123 -0
  122. package/dist/lib/design-resource-symbolic-production-closure.d.ts +4 -0
  123. package/dist/lib/design-resource-symbolic-production-closure.js +144 -0
  124. package/dist/lib/design-resource-symbolic-proof-authority-validation.d.ts +10 -0
  125. package/dist/lib/design-resource-symbolic-proof-authority-validation.js +68 -0
  126. package/dist/lib/design-resource-symbolic-proof-validation.d.ts +10 -0
  127. package/dist/lib/design-resource-symbolic-proof-validation.js +89 -0
  128. package/dist/lib/design-resource-symbolic-region-validation.d.ts +19 -0
  129. package/dist/lib/design-resource-symbolic-region-validation.js +146 -0
  130. package/dist/lib/design-resource-symbolic-resource-validation.d.ts +5 -0
  131. package/dist/lib/design-resource-symbolic-resource-validation.js +90 -0
  132. package/dist/lib/design-resource-symbolic-rule-shape.d.ts +27 -0
  133. package/dist/lib/design-resource-symbolic-rule-shape.js +158 -0
  134. package/dist/lib/design-resource-symbolic-safety-validation.d.ts +6 -0
  135. package/dist/lib/design-resource-symbolic-safety-validation.js +29 -0
  136. package/dist/lib/design-resource-symbolic-source-ir-evaluation.d.ts +19 -0
  137. package/dist/lib/design-resource-symbolic-source-ir-evaluation.js +74 -0
  138. package/dist/lib/design-resource-symbolic-source-ir-evidence.d.ts +44 -0
  139. package/dist/lib/design-resource-symbolic-source-ir-evidence.js +88 -0
  140. package/dist/lib/design-resource-symbolic-source-ir-oracle.d.ts +13 -0
  141. package/dist/lib/design-resource-symbolic-source-ir-oracle.js +96 -0
  142. package/dist/lib/design-resource-symbolic-source-ir-proof.d.ts +14 -0
  143. package/dist/lib/design-resource-symbolic-source-ir-proof.js +98 -0
  144. package/dist/lib/design-resource-symbolic-source-ir-shape.d.ts +2 -0
  145. package/dist/lib/design-resource-symbolic-source-ir-shape.js +38 -0
  146. package/dist/lib/design-resource-symbolic-source-ir-types.d.ts +17 -0
  147. package/dist/lib/design-resource-symbolic-source-ir-types.js +2 -0
  148. package/dist/lib/design-resource-symbolic-static-dependency-validation.d.ts +2 -0
  149. package/dist/lib/design-resource-symbolic-static-dependency-validation.js +83 -0
  150. package/dist/lib/design-resource-symbolic-structural-closure-validation.d.ts +6 -0
  151. package/dist/lib/design-resource-symbolic-structural-closure-validation.js +79 -0
  152. package/dist/lib/design-resource-symbolic-validation-support.d.ts +29 -0
  153. package/dist/lib/design-resource-symbolic-validation-support.js +111 -0
  154. package/dist/lib/design-resource-v1-capacity-header.d.ts +8 -0
  155. package/dist/lib/design-resource-v1-capacity-header.js +231 -0
  156. package/dist/lib/design-resource-v1-capacity.d.ts +5 -0
  157. package/dist/lib/design-resource-v1-capacity.js +45 -0
  158. package/dist/lib/init.js +1 -0
  159. package/dist/lib/long-task-activation-validation.js +2 -2
  160. package/dist/lib/long-task-authority-policy.d.ts +3 -0
  161. package/dist/lib/long-task-authority-policy.js +3 -0
  162. package/dist/lib/long-task-codex-agent-profile.d.ts +42 -0
  163. package/dist/lib/long-task-codex-agent-profile.js +276 -0
  164. package/dist/lib/long-task-compact-authoring-projections.d.ts +12 -0
  165. package/dist/lib/long-task-compact-authoring-projections.js +67 -0
  166. package/dist/lib/long-task-compact-authoring.d.ts +3 -0
  167. package/dist/lib/long-task-compact-authoring.js +173 -0
  168. package/dist/lib/long-task-compact-carrier.d.ts +7 -0
  169. package/dist/lib/long-task-compact-carrier.js +132 -0
  170. package/dist/lib/long-task-compact-parser.d.ts +14 -0
  171. package/dist/lib/long-task-compact-parser.js +123 -0
  172. package/dist/lib/long-task-compact-primitives.d.ts +22 -0
  173. package/dist/lib/long-task-compact-primitives.js +132 -0
  174. package/dist/lib/long-task-compact-projections.d.ts +4 -0
  175. package/dist/lib/long-task-compact-projections.js +153 -0
  176. package/dist/lib/long-task-compact-structure-targets.d.ts +2 -0
  177. package/dist/lib/long-task-compact-structure-targets.js +90 -0
  178. package/dist/lib/long-task-counterfactual-sandbox.d.ts +1 -1
  179. package/dist/lib/long-task-counterfactual-sandbox.js +7 -5
  180. package/dist/lib/long-task-delivery-parser.d.ts +1 -0
  181. package/dist/lib/long-task-delivery-parser.js +38 -6
  182. package/dist/lib/long-task-design-resource-handoff.d.ts +2 -1
  183. package/dist/lib/long-task-design-resource-handoff.js +71 -11
  184. package/dist/lib/long-task-design-resource-method-binding.d.ts +8 -1
  185. package/dist/lib/long-task-design-resource-method-binding.js +150 -0
  186. package/dist/lib/long-task-evidence-capability-codec.js +256 -34
  187. package/dist/lib/long-task-evidence-capability-policy.js +28 -0
  188. package/dist/lib/long-task-evidence-capability-runtime.js +271 -63
  189. package/dist/lib/long-task-evidence-capability-types.d.ts +70 -2
  190. package/dist/lib/long-task-evidence-v2.d.ts +1 -1
  191. package/dist/lib/long-task-evidence-v2.js +5 -5
  192. package/dist/lib/long-task-hook-install.d.ts +19 -2
  193. package/dist/lib/long-task-hook-install.js +288 -91
  194. package/dist/lib/long-task-playwright-capability-records.d.ts +2 -0
  195. package/dist/lib/long-task-playwright-capability-records.js +74 -2
  196. package/dist/lib/long-task-runner-freeze.d.ts +1 -1
  197. package/dist/lib/long-task-runner-freeze.js +4 -2
  198. package/dist/lib/long-task-semantic-contract-types.d.ts +1 -1
  199. package/dist/lib/long-task-semantic-fact-binding-types.d.ts +8 -0
  200. package/dist/lib/long-task-semantic-fact-closure.js +4 -1
  201. package/dist/lib/long-task-semantic-fact-contract-closure.d.ts +1 -1
  202. package/dist/lib/long-task-semantic-fact-contract-closure.js +15 -3
  203. package/dist/lib/long-task-semantic-fact-contract-facts.d.ts +1 -1
  204. package/dist/lib/long-task-semantic-fact-contract-facts.js +4 -1
  205. package/dist/lib/long-task-semantic-fact-contract-proofs.d.ts +1 -1
  206. package/dist/lib/long-task-semantic-fact-contract-proofs.js +12 -3
  207. package/dist/lib/long-task-semantic-fact-evidence.d.ts +5 -1
  208. package/dist/lib/long-task-semantic-fact-evidence.js +47 -4
  209. package/dist/lib/long-task-semantic-fact-shape.js +17 -6
  210. package/dist/lib/long-task-shape-primitives.d.ts +1 -1
  211. package/dist/lib/long-task-shape-primitives.js +1 -0
  212. package/dist/lib/long-task-source-item-parser.d.ts +2 -2
  213. package/dist/lib/long-task-source-item-parser.js +20 -11
  214. package/dist/lib/long-task-ui-design-policy.js +64 -4
  215. package/dist/lib/long-task-ui-surface-shape.js +195 -0
  216. package/dist/lib/long-task-ui-surface-types.d.ts +53 -0
  217. package/dist/lib/long-task-verifier-v2.js +1 -1
  218. package/dist/lib/long-task-worker-selection.d.ts +2 -0
  219. package/dist/lib/long-task-worker-selection.js +7 -0
  220. package/dist/lib/long-task-workspace-scope.js +3 -1
  221. package/dist/lib/long-task-workspace.js +11 -1
  222. package/dist/lib/migrations.js +58 -0
  223. package/dist/lib/profiles.js +0 -1
  224. package/dist/lib/semantic-fact-compact-authoring.d.ts +2 -0
  225. package/dist/lib/semantic-fact-compact-authoring.js +160 -0
  226. package/dist/lib/semantic-fact-compact-capacity.d.ts +9 -0
  227. package/dist/lib/semantic-fact-compact-capacity.js +40 -0
  228. package/dist/lib/semantic-fact-compact-carrier.d.ts +16 -0
  229. package/dist/lib/semantic-fact-compact-carrier.js +146 -0
  230. package/dist/lib/semantic-fact-compact-parser.d.ts +17 -0
  231. package/dist/lib/semantic-fact-compact-parser.js +168 -0
  232. package/dist/lib/semantic-fact-compact-revision.d.ts +11 -0
  233. package/dist/lib/semantic-fact-compact-revision.js +64 -0
  234. package/dist/lib/semantic-fact-compact-support.d.ts +23 -0
  235. package/dist/lib/semantic-fact-compact-support.js +159 -0
  236. package/dist/lib/semantic-fact-policy-census.d.ts +1 -0
  237. package/dist/lib/semantic-fact-policy-census.js +43 -0
  238. package/dist/lib/semantic-fact-proof-shape.d.ts +1 -1
  239. package/dist/lib/semantic-fact-property-shape.d.ts +1 -1
  240. package/dist/lib/semantic-fact-source-parser.d.ts +5 -0
  241. package/dist/lib/semantic-fact-source-parser.js +47 -6
  242. package/dist/lib/structural-closure-cost.d.ts +79 -0
  243. package/dist/lib/structural-closure-cost.js +91 -0
  244. package/dist/lib/symbolic-denotation-dag-builder.d.ts +25 -0
  245. package/dist/lib/symbolic-denotation-dag-builder.js +176 -0
  246. package/dist/lib/symbolic-denotation-domain-validation.d.ts +3 -0
  247. package/dist/lib/symbolic-denotation-domain-validation.js +56 -0
  248. package/dist/lib/symbolic-denotation-engine.d.ts +32 -0
  249. package/dist/lib/symbolic-denotation-engine.js +140 -0
  250. package/dist/lib/symbolic-denotation-public.d.ts +11 -0
  251. package/dist/lib/symbolic-denotation-public.js +12 -0
  252. package/dist/lib/symbolic-denotation-runtime.d.ts +20 -0
  253. package/dist/lib/symbolic-denotation-runtime.js +90 -0
  254. package/dist/lib/symbolic-denotation-support.d.ts +11 -0
  255. package/dist/lib/symbolic-denotation-support.js +49 -0
  256. package/dist/lib/symbolic-denotation-types.d.ts +133 -0
  257. package/dist/lib/symbolic-denotation-types.js +18 -0
  258. package/dist/lib/symbolic-denotation-validation.d.ts +6 -0
  259. package/dist/lib/symbolic-denotation-validation.js +126 -0
  260. package/dist/lib/sync-engine.d.ts +1 -0
  261. package/dist/lib/sync-engine.js +4 -1
  262. package/dist/lib/upgrade.js +1 -0
  263. package/dist/long-task-hook.js +40 -1
  264. package/dist/public-types.d.ts +8 -0
  265. package/dist/public-types.js +1 -0
  266. package/dist/schemas/design-resource-symbolic-noninterference-artifact-v2.schema.json +289 -0
  267. package/dist/schemas/design-resource-symbolic-source-ir-v1.schema.json +130 -0
  268. package/dist/schemas/long-task-delivery-v2/long-task-delivery-v2.schema.json +390 -5
  269. package/migrations/README.md +15 -15
  270. package/package.json +2 -2
  271. package/source-mappings.yaml +28 -25
  272. package/assets/skills/source-plan-authoring/SKILL.md +0 -14
@@ -0,0 +1,29 @@
1
+ import { EXACT_TARGET_FULL_TARGET_METHODS } from "./design-resource-fact-policy.js";
2
+ import { invalid } from "./design-resource-symbolic-validation-support.js";
3
+ export function validateSymbolicReadinessClosure(manifest) {
4
+ if (manifest.acceptance_blockers.length)
5
+ invalid("acceptance_blockers_unresolved", manifest.acceptance_blockers.map((item) => item.key).join(","));
6
+ }
7
+ export function assertNoUnprovedOmittedAxes(compiled, label) {
8
+ if (compiled.omitted_axis_refs.length)
9
+ invalid("v2_noninterference_proof_unavailable", `${label}:${compiled.omitted_axis_refs.join(",")}`);
10
+ }
11
+ export function validateSymbolicExactTargetCoverage(interpretation, manifest, projections, reachable, compilation) {
12
+ if (interpretation !== "exact_target")
13
+ return;
14
+ const obligations = new Map(manifest.semantic_proof_obligations.map((item) => [item.key, item]));
15
+ for (const method of EXACT_TARGET_FULL_TARGET_METHODS) {
16
+ const regions = projections
17
+ .filter(({ rule }) => rule.observation_scope === "full_target" &&
18
+ rule.semantic_obligation_refs.some((ref) => obligations.get(ref)?.method === method))
19
+ .map(({ rule }) => rule.region);
20
+ if (!regions.length)
21
+ invalid("v2_exact_target_full_target_method_missing", method);
22
+ const covered = compilation.compile({
23
+ op: "any",
24
+ predicates: regions,
25
+ });
26
+ if (covered.canonical_sha256 !== reachable.canonical_sha256)
27
+ invalid("v2_exact_target_full_target_region_gap", method);
28
+ }
29
+ }
@@ -0,0 +1,19 @@
1
+ import type { CompiledSymbolicDenotationV1, SymbolicDenotationAxisDomain, SymbolicDenotationScalar } from "./symbolic-denotation-types.js";
2
+ export declare const MAX_SOURCE_EXHAUSTIVE_DOMAIN_CARDINALITY = 100000n;
3
+ export interface SymbolicSourceExhaustiveCaseV1 {
4
+ fact_rule_refs: string[];
5
+ source: CompiledSymbolicDenotationV1;
6
+ rule: CompiledSymbolicDenotationV1;
7
+ }
8
+ export interface SymbolicSourceExhaustiveCounterexampleV1 {
9
+ kind: "source_rule_denotation_mismatch" | "complete_domain_counterexample";
10
+ axis_ref: string | null;
11
+ fact_rule_ref: string;
12
+ assignment: Record<string, SymbolicDenotationScalar>;
13
+ detail: string;
14
+ }
15
+ export declare function evaluateCompleteSymbolicSourceDomain(domains: SymbolicDenotationAxisDomain[], omittedAxisRefs: string[], cases: SymbolicSourceExhaustiveCaseV1[]): {
16
+ cardinality: string;
17
+ evaluation_sha256: string;
18
+ counterexample: SymbolicSourceExhaustiveCounterexampleV1 | null;
19
+ };
@@ -0,0 +1,74 @@
1
+ import { createHash } from "node:crypto";
2
+ import { evaluateCanonicalSymbolicDenotation } from "./symbolic-denotation-engine.js";
3
+ import { domainCardinality } from "./symbolic-denotation-support.js";
4
+ import { compareText, stableJson, } from "./design-resource-symbolic-validation-support.js";
5
+ export const MAX_SOURCE_EXHAUSTIVE_DOMAIN_CARDINALITY = 100000n;
6
+ export function evaluateCompleteSymbolicSourceDomain(domains, omittedAxisRefs, cases) {
7
+ const sortedDomains = [...domains].sort((left, right) => compareText(left.key, right.key));
8
+ const cardinality = sortedDomains.reduce((total, domain) => total * domainCardinality(domain), 1n);
9
+ if (cardinality > MAX_SOURCE_EXHAUSTIVE_DOMAIN_CARDINALITY)
10
+ throw new Error(`source_complete_domain_capacity_exceeded:actual=${cardinality}:limit=${MAX_SOURCE_EXHAUSTIVE_DOMAIN_CARDINALITY}`);
11
+ const omitted = new Set(omittedAxisRefs);
12
+ const anchor = Object.fromEntries(sortedDomains.map((domain) => [domain.key, domainValues(domain)[0]]));
13
+ const hash = createHash("sha256");
14
+ let independenceCounterexample = null;
15
+ let ruleCounterexample = null;
16
+ for (const assignment of enumerateAssignments(sortedDomains)) {
17
+ const axisErasedAssignment = { ...assignment };
18
+ for (const axisRef of omitted)
19
+ axisErasedAssignment[axisRef] = anchor[axisRef];
20
+ for (const proofCase of cases) {
21
+ const source = evaluateCanonicalSymbolicDenotation(proofCase.source.canonical_dag, assignment);
22
+ const rule = evaluateCanonicalSymbolicDenotation(proofCase.rule.canonical_dag, assignment);
23
+ const axisErased = evaluateCanonicalSymbolicDenotation(proofCase.source.canonical_dag, axisErasedAssignment);
24
+ hash.update(stableJson({
25
+ assignment,
26
+ axis_erased: axisErased,
27
+ rule,
28
+ source,
29
+ rule_refs: proofCase.fact_rule_refs,
30
+ }));
31
+ hash.update("\n");
32
+ if (!independenceCounterexample && source !== axisErased) {
33
+ const axisRef = omittedAxisRefs.find((ref) => assignment[ref] !== anchor[ref]);
34
+ independenceCounterexample = {
35
+ kind: "complete_domain_counterexample",
36
+ axis_ref: axisRef ?? omittedAxisRefs[0] ?? null,
37
+ fact_rule_ref: proofCase.fact_rule_refs[0],
38
+ assignment: { ...assignment },
39
+ detail: "current Source denotation changes after omitted axes are erased",
40
+ };
41
+ }
42
+ if (!ruleCounterexample && source !== rule)
43
+ ruleCounterexample = {
44
+ kind: "source_rule_denotation_mismatch",
45
+ axis_ref: null,
46
+ fact_rule_ref: proofCase.fact_rule_refs[0],
47
+ assignment: { ...assignment },
48
+ detail: "current Source denotation differs from the current Rule region",
49
+ };
50
+ }
51
+ }
52
+ return {
53
+ cardinality: cardinality.toString(),
54
+ evaluation_sha256: hash.digest("hex"),
55
+ counterexample: independenceCounterexample ?? ruleCounterexample,
56
+ };
57
+ }
58
+ function* enumerateAssignments(domains, index = 0, current = {}) {
59
+ if (index === domains.length) {
60
+ yield { ...current };
61
+ return;
62
+ }
63
+ const domain = domains[index];
64
+ for (const value of domainValues(domain)) {
65
+ current[domain.key] = value;
66
+ yield* enumerateAssignments(domains, index + 1, current);
67
+ }
68
+ delete current[domain.key];
69
+ }
70
+ function domainValues(domain) {
71
+ if (domain.kind === "enum")
72
+ return [...domain.values];
73
+ return Array.from({ length: domain.maximum - domain.minimum + 1 }, (_, index) => domain.minimum + index);
74
+ }
@@ -0,0 +1,44 @@
1
+ import type { DesignResource } from "./design-resource-handoff-file-primitives.js";
2
+ import type { DesignResourceObservableRuleManifestV2, DesignResourceSymbolicNoninterferenceDerivedResultV2, DesignResourceSymbolicNoninterferenceFailureWitnessV1, DesignResourceSymbolicNoninterferenceProofMethodV2 } from "./design-resource-symbolic-fact-types.js";
3
+ import type { CompiledSymbolicDenotationV1, SymbolicDenotationPredicate } from "./symbolic-denotation-types.js";
4
+ export interface DerivedCurrentSourceNoninterferenceEvidenceV2 {
5
+ derived_result: DesignResourceSymbolicNoninterferenceDerivedResultV2;
6
+ failure_witness: DesignResourceSymbolicNoninterferenceFailureWitnessV1 | null;
7
+ }
8
+ export interface DerivedSourceCase {
9
+ index: number;
10
+ region: {
11
+ rule_region_sha256: string;
12
+ predicate: SymbolicDenotationPredicate;
13
+ };
14
+ compiledSource: CompiledSymbolicDenotationV1;
15
+ compiledRule: CompiledSymbolicDenotationV1;
16
+ factRuleRefs: string[];
17
+ }
18
+ export declare function derivedSourceResult(method: DesignResourceSymbolicNoninterferenceProofMethodV2, sourceResourceRef: string, cases: DerivedSourceCase[], manifest: DesignResourceObservableRuleManifestV2): DesignResourceSymbolicNoninterferenceDerivedResultV2;
19
+ export declare function emptyDerivedSourceResult(method: DesignResourceSymbolicNoninterferenceProofMethodV2, sourceResourceRef?: string | null): DesignResourceSymbolicNoninterferenceDerivedResultV2;
20
+ export declare function sourceCaseWitness({ certificateScopeSha256, resource, source, proofCase, kind, axisRef, assignment, detail, }: {
21
+ certificateScopeSha256: string;
22
+ resource: DesignResource;
23
+ source: string;
24
+ proofCase: DerivedSourceCase;
25
+ kind: DesignResourceSymbolicNoninterferenceFailureWitnessV1["kind"];
26
+ axisRef?: string | null;
27
+ assignment?: DesignResourceSymbolicNoninterferenceFailureWitnessV1["assignment"];
28
+ detail: string;
29
+ }): DesignResourceSymbolicNoninterferenceFailureWitnessV1;
30
+ export declare function sourceNoninterferenceWitness({ certificateScopeSha256, kind, axisRef, factRuleRef, resource, locator, nodeRef, byteOffset, assignment, detail, }: {
31
+ certificateScopeSha256: string;
32
+ kind?: DesignResourceSymbolicNoninterferenceFailureWitnessV1["kind"];
33
+ axisRef?: string | null;
34
+ factRuleRef?: string | null;
35
+ resource?: DesignResource;
36
+ locator?: string | null;
37
+ nodeRef?: string | null;
38
+ byteOffset?: number | null;
39
+ assignment?: DesignResourceSymbolicNoninterferenceFailureWitnessV1["assignment"];
40
+ detail: string;
41
+ }): DesignResourceSymbolicNoninterferenceFailureWitnessV1;
42
+ export declare function failedSourceEvidence(derivedResult: DesignResourceSymbolicNoninterferenceDerivedResultV2, failureWitness: DesignResourceSymbolicNoninterferenceFailureWitnessV1): DerivedCurrentSourceNoninterferenceEvidenceV2;
43
+ export declare function sameStringSet(left: string[], right: string[]): boolean;
44
+ export declare function sourceOracleErrorText(error: unknown): string;
@@ -0,0 +1,88 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { compareText, stableJson, } from "./design-resource-symbolic-validation-support.js";
3
+ export function derivedSourceResult(method, sourceResourceRef, cases, manifest) {
4
+ const result = emptyDerivedSourceResult(method, sourceResourceRef);
5
+ if (method === "closed_world_static_dependency_closure") {
6
+ const inputNodeRef = "source.input.complete";
7
+ result.static_dependency_nodes = [
8
+ {
9
+ key: inputNodeRef,
10
+ axis_refs: [],
11
+ dependency_refs: [],
12
+ input_resource_refs: manifest.inspector.input_resources
13
+ .map((input) => input.resource_ref)
14
+ .sort(compareText),
15
+ },
16
+ ...cases.map((proofCase) => ({
17
+ key: `source.region.${proofCase.region.rule_region_sha256}`,
18
+ axis_refs: [...proofCase.compiledSource.referenced_axis_refs].sort(compareText),
19
+ dependency_refs: [inputNodeRef],
20
+ input_resource_refs: [],
21
+ })),
22
+ ];
23
+ result.static_rule_roots = cases.map((proofCase) => ({
24
+ fact_rule_refs: [...proofCase.factRuleRefs],
25
+ node_ref: `source.region.${proofCase.region.rule_region_sha256}`,
26
+ }));
27
+ return result;
28
+ }
29
+ result.equivalence_cases = cases.map((proofCase) => ({
30
+ fact_rule_refs: [...proofCase.factRuleRefs],
31
+ side_predicate: structuredClone(proofCase.region.predicate),
32
+ axis_erased_predicate: structuredClone(proofCase.region.predicate),
33
+ }));
34
+ return result;
35
+ }
36
+ export function emptyDerivedSourceResult(method, sourceResourceRef = null) {
37
+ return {
38
+ source_ir_resource_ref: sourceResourceRef,
39
+ static_dependency_nodes: [],
40
+ static_rule_roots: [],
41
+ equivalence_cases: [],
42
+ complete_domain_cardinality: method === "finite_complete_domain_exhaustive_equivalence" ? "0" : null,
43
+ exhaustive_evaluation_sha256: null,
44
+ };
45
+ }
46
+ export function sourceCaseWitness({ certificateScopeSha256, resource, source, proofCase, kind, axisRef = null, assignment = null, detail, }) {
47
+ const locator = `/certificate_scopes/*/regions/${proofCase.index}/predicate`;
48
+ const needle = axisRef ?? proofCase.region.rule_region_sha256;
49
+ const offset = source.indexOf(needle);
50
+ return sourceNoninterferenceWitness({
51
+ certificateScopeSha256,
52
+ kind,
53
+ axisRef,
54
+ factRuleRef: proofCase.factRuleRefs[0] ?? null,
55
+ resource,
56
+ locator,
57
+ nodeRef: `source.region.${proofCase.region.rule_region_sha256}`,
58
+ byteOffset: offset < 0 ? null : Buffer.byteLength(source.slice(0, offset), "utf8"),
59
+ assignment,
60
+ detail,
61
+ });
62
+ }
63
+ export function sourceNoninterferenceWitness({ certificateScopeSha256, kind = "unsupported_dependency", axisRef = null, factRuleRef = null, resource, locator = null, nodeRef = null, byteOffset = null, assignment = null, detail, }) {
64
+ return {
65
+ kind,
66
+ side: "source",
67
+ certificate_scope_sha256: certificateScopeSha256,
68
+ axis_ref: axisRef,
69
+ fact_rule_ref: factRuleRef,
70
+ resource_ref: resource?.key ?? null,
71
+ path: resource?.path ?? null,
72
+ locator,
73
+ node_ref: nodeRef,
74
+ byte_offset: byteOffset,
75
+ assignment,
76
+ detail,
77
+ };
78
+ }
79
+ export function failedSourceEvidence(derivedResult, failureWitness) {
80
+ return { derived_result: derivedResult, failure_witness: failureWitness };
81
+ }
82
+ export function sameStringSet(left, right) {
83
+ return (stableJson([...new Set(left)].sort(compareText)) ===
84
+ stableJson([...new Set(right)].sort(compareText)));
85
+ }
86
+ export function sourceOracleErrorText(error) {
87
+ return error instanceof Error ? error.message : String(error);
88
+ }
@@ -0,0 +1,13 @@
1
+ import { Buffer } from "node:buffer";
2
+ import type { DesignResource } from "./design-resource-handoff-file-primitives.js";
3
+ import type { DesignResourceObservableRuleManifestV2, DesignResourceSymbolicHandoffTargetV2, DesignResourceSymbolicNoninterferenceCertificateV2, DesignResourceSymbolicNoninterferenceProofMethodV2 } from "./design-resource-symbolic-fact-types.js";
4
+ import { type DerivedCurrentSourceNoninterferenceEvidenceV2 } from "./design-resource-symbolic-source-ir-evidence.js";
5
+ export type { DerivedCurrentSourceNoninterferenceEvidenceV2 } from "./design-resource-symbolic-source-ir-evidence.js";
6
+ export declare function deriveCurrentSourceNoninterferenceEvidence({ manifest, certificate, method, target, resources, contents, }: {
7
+ manifest: DesignResourceObservableRuleManifestV2;
8
+ certificate: DesignResourceSymbolicNoninterferenceCertificateV2;
9
+ method: DesignResourceSymbolicNoninterferenceProofMethodV2;
10
+ target: DesignResourceSymbolicHandoffTargetV2;
11
+ resources: ReadonlyMap<string, DesignResource>;
12
+ contents: ReadonlyMap<string, Buffer>;
13
+ }): DerivedCurrentSourceNoninterferenceEvidenceV2;
@@ -0,0 +1,96 @@
1
+ import { symbolicNoninterferenceCertificateScopeSha256, symbolicNoninterferenceRuleScopeSha256, } from "./design-resource-symbolic-noninterference-scope.js";
2
+ import { productionClosureFailure } from "./design-resource-symbolic-production-closure.js";
3
+ import { emptyDerivedSourceResult, failedSourceEvidence, sourceNoninterferenceWitness, sourceOracleErrorText, } from "./design-resource-symbolic-source-ir-evidence.js";
4
+ import { deriveCurrentSourceScopeEvidence } from "./design-resource-symbolic-source-ir-proof.js";
5
+ import { parseDesignResourceSymbolicSourceIr } from "./design-resource-symbolic-source-ir-shape.js";
6
+ import { DESIGN_RESOURCE_SYMBOLIC_SOURCE_IR_MEDIA_TYPE } from "./design-resource-symbolic-source-ir-types.js";
7
+ import { canonicalJson } from "./strict-codec.js";
8
+ export function deriveCurrentSourceNoninterferenceEvidence({ manifest, certificate, method, target, resources, contents, }) {
9
+ const certificateScopeSha256 = symbolicNoninterferenceCertificateScopeSha256(certificate);
10
+ const ruleScopeSha256 = symbolicNoninterferenceRuleScopeSha256(manifest, certificate);
11
+ const empty = emptyDerivedSourceResult(method);
12
+ const closureFailure = currentSourceClosureFailure(manifest, certificate, target, resources, contents);
13
+ if (closureFailure)
14
+ return { derived_result: empty, failure_witness: closureFailure };
15
+ const sourceResourceRefs = manifest.inspector.input_resources
16
+ .map((input) => input.resource_ref)
17
+ .filter((ref) => resources.get(ref)?.media_type ===
18
+ DESIGN_RESOURCE_SYMBOLIC_SOURCE_IR_MEDIA_TYPE);
19
+ if (sourceResourceRefs.length !== 1)
20
+ return failedSourceEvidence(empty, sourceNoninterferenceWitness({
21
+ certificateScopeSha256,
22
+ detail: `symbolic_source_ir_count:${sourceResourceRefs.length}`,
23
+ }));
24
+ const sourceResourceRef = sourceResourceRefs[0];
25
+ const resource = resources.get(sourceResourceRef);
26
+ const bytes = contents.get(sourceResourceRef);
27
+ const source = bytes.toString("utf8");
28
+ let parsed;
29
+ try {
30
+ const raw = JSON.parse(source);
31
+ if (canonicalJson(raw) !== source)
32
+ throw new Error("symbolic Source IR must use canonical JSON bytes");
33
+ parsed = parseDesignResourceSymbolicSourceIr(raw, `symbolic_source_ir:${sourceResourceRef}`);
34
+ }
35
+ catch (error) {
36
+ return failedSourceEvidence({ ...empty, source_ir_resource_ref: sourceResourceRef }, sourceNoninterferenceWitness({
37
+ certificateScopeSha256,
38
+ resource,
39
+ detail: `invalid_symbolic_source_ir:${sourceOracleErrorText(error)}`,
40
+ }));
41
+ }
42
+ if (parsed.target_ref !== target.key)
43
+ return failedSourceEvidence({ ...empty, source_ir_resource_ref: sourceResourceRef }, sourceNoninterferenceWitness({
44
+ certificateScopeSha256,
45
+ resource,
46
+ locator: "/target_ref",
47
+ detail: `symbolic_source_ir_target_mismatch:${parsed.target_ref}:${target.key}`,
48
+ }));
49
+ const matches = parsed.certificate_scopes.filter((scope) => scope.certificate_scope_sha256 === certificateScopeSha256 &&
50
+ scope.rule_scope_sha256 === ruleScopeSha256);
51
+ if (matches.length !== 1)
52
+ return failedSourceEvidence({ ...empty, source_ir_resource_ref: sourceResourceRef }, sourceNoninterferenceWitness({
53
+ certificateScopeSha256,
54
+ resource,
55
+ locator: "/certificate_scopes",
56
+ detail: `symbolic_source_ir_scope_match_count:${matches.length}:rule_scope=${ruleScopeSha256}`,
57
+ }));
58
+ try {
59
+ return deriveCurrentSourceScopeEvidence({
60
+ manifest,
61
+ certificate,
62
+ method,
63
+ resource,
64
+ source,
65
+ sourceResourceRef,
66
+ scope: matches[0],
67
+ certificateScopeSha256,
68
+ });
69
+ }
70
+ catch (error) {
71
+ return failedSourceEvidence({ ...empty, source_ir_resource_ref: sourceResourceRef }, sourceNoninterferenceWitness({
72
+ certificateScopeSha256,
73
+ resource,
74
+ locator: "/certificate_scopes",
75
+ detail: `unsupported_symbolic_source_ir:${sourceOracleErrorText(error)}`,
76
+ }));
77
+ }
78
+ }
79
+ function currentSourceClosureFailure(manifest, certificate, target, resources, contents) {
80
+ const inputRefs = manifest.inspector.input_resources.map((input) => input.resource_ref);
81
+ const failure = productionClosureFailure({
82
+ ...target,
83
+ resource_refs: inputRefs,
84
+ source_profile: {
85
+ ...target.source_profile,
86
+ dependency_resource_refs: inputRefs.filter((ref) => ref !== target.source_profile.entry_resource_ref),
87
+ },
88
+ }, certificate, resources, contents);
89
+ return failure
90
+ ? {
91
+ ...failure,
92
+ side: "source",
93
+ detail: `unsupported_source:${failure.detail}`,
94
+ }
95
+ : null;
96
+ }
@@ -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;