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
@@ -32,6 +32,49 @@ export function validateSemanticFactInspectorCensus(manifest) {
32
32
  }
33
33
  assertSameSemanticFactSet([...actual], [...expected.keys()], "inspector_census_universe");
34
34
  }
35
+ export function buildSemanticFactInspectorCensus(manifest) {
36
+ const factsFor = (predicate) => manifest.facts.filter(predicate).map((item) => item.key);
37
+ return [...expectedCensusRows(manifest, factsFor).entries()].map(([identity, expectation]) => {
38
+ const separator = identity.indexOf(":");
39
+ const kind = identity.slice(0, separator);
40
+ const key = identity.slice(separator + 1);
41
+ const basisRefs = censusBasisRefs(kind, expectation.row, expectation.fact_refs, manifest);
42
+ return {
43
+ key,
44
+ kind,
45
+ locator: {
46
+ material_ref: manifest.key,
47
+ kind: "manifest_pointer",
48
+ value: expectation.pointer,
49
+ },
50
+ identity_sha256: sha256Hex(canonicalValueJson(expectation.row)),
51
+ disposition: expectation.fact_refs.length
52
+ ? "material_with_facts"
53
+ : "supporting_only",
54
+ fact_refs: expectation.fact_refs,
55
+ basis_refs: basisRefs,
56
+ rationale: expectation.fact_refs.length
57
+ ? "This census identity contributes to an exact semantic Fact."
58
+ : "This identity is explicitly inventoried as supporting or inapplicable.",
59
+ };
60
+ });
61
+ }
62
+ function censusBasisRefs(kind, row, factRefs, manifest) {
63
+ if (row && typeof row === "object" && !Array.isArray(row)) {
64
+ const record = row;
65
+ for (const field of ["basis_refs", "source_item_refs"])
66
+ if (Array.isArray(record[field]) &&
67
+ record[field].every((item) => typeof item === "string") &&
68
+ record[field].length)
69
+ return [...record[field]];
70
+ }
71
+ if (kind === "proof_obligation" && factRefs.length) {
72
+ const fact = manifest.facts.find((item) => item.key === factRefs[0]);
73
+ if (fact?.source_item_refs.length)
74
+ return [...fact.source_item_refs];
75
+ }
76
+ return [manifest.scope.source_item_refs[0]];
77
+ }
35
78
  function expectedCensusRows(manifest, factsFor) {
36
79
  const result = new Map();
37
80
  const add = (kind, key, pointer, row, factRefs) => result.set(`${kind}:${key}`, {
@@ -31,7 +31,7 @@ export declare function parseSemanticFactProofObligations(value: unknown, label:
31
31
  method: string;
32
32
  authority: "external_confirmation" | "machine";
33
33
  proof_surface: "api_contract" | "data_state" | "implementation_structure" | "population_coverage" | "runtime_behavior" | "security_boundary" | "ui_browser";
34
- evidence_capabilities: ("boundary_invocation" | "cross_surface_consistency" | "design_conformance" | "design_method" | "durable_readback" | "external_side_effect" | "failure_injection" | "input_variation" | "interaction_trace" | "presence" | "semantic_fact" | "state_delta" | "target_runtime" | "visual_render")[];
34
+ evidence_capabilities: ("boundary_invocation" | "cross_surface_consistency" | "design_conformance" | "design_method" | "design_symbolic_certificate" | "durable_readback" | "external_side_effect" | "failure_injection" | "input_variation" | "interaction_trace" | "presence" | "semantic_fact" | "state_delta" | "target_runtime" | "visual_render")[];
35
35
  comparison: {
36
36
  comparator: string;
37
37
  mode: "exact" | "tolerance";
@@ -5,7 +5,7 @@ export declare function parseSemanticFactPropertyDispositions(value: unknown, la
5
5
  standard: boolean;
6
6
  value_kind: "boolean" | "custom" | "decision_table" | "digest" | "duration" | "enum" | "formula" | "number" | "object" | "ordered_list" | "range" | "rate" | "ratio" | "relation" | "schema" | "set" | "string" | "timestamp" | "trace";
7
7
  required_methods: string[];
8
- required_evidence_capabilities: ("boundary_invocation" | "cross_surface_consistency" | "design_conformance" | "design_method" | "durable_readback" | "external_side_effect" | "failure_injection" | "input_variation" | "interaction_trace" | "presence" | "semantic_fact" | "state_delta" | "target_runtime" | "visual_render")[];
8
+ required_evidence_capabilities: ("boundary_invocation" | "cross_surface_consistency" | "design_conformance" | "design_method" | "design_symbolic_certificate" | "durable_readback" | "external_side_effect" | "failure_injection" | "input_variation" | "interaction_trace" | "presence" | "semantic_fact" | "state_delta" | "target_runtime" | "visual_render")[];
9
9
  applicable_unit_refs: string[];
10
10
  not_applicable_unit_refs: string[];
11
11
  decision_required_unit_refs: string[];
@@ -1,9 +1,14 @@
1
+ import { type SemanticFactRevisionIdentityV1 } from "./semantic-fact-compact-carrier.js";
1
2
  import type { SemanticFactManifestV1 } from "./semantic-fact-types.js";
2
3
  export interface ParsedSemanticFactManifestV1 {
3
4
  source_path: string;
4
5
  line: number;
5
6
  manifest: SemanticFactManifestV1;
6
7
  sha256: string;
8
+ carrier: "expanded_v1" | "compact_v1";
9
+ fact_revisions: SemanticFactRevisionIdentityV1[];
10
+ obligation_revisions: SemanticFactRevisionIdentityV1[];
7
11
  }
8
12
  export declare function parseSemanticFactManifestBlocks(sourcePath: string, content: string): ParsedSemanticFactManifestV1[];
13
+ export declare function parseSemanticFactManifestBlocksForMigration(sourcePath: string, content: string): ParsedSemanticFactManifestV1[];
9
14
  export declare function loadSemanticFactManifest(repository: string, sourcePaths: string[]): Promise<ParsedSemanticFactManifestV1>;
@@ -1,37 +1,78 @@
1
1
  import { readFile } from "node:fs/promises";
2
2
  import path from "node:path";
3
3
  import { assertProtectedRepositoryFile } from "./long-task-protected-files.js";
4
+ import { indexSemanticFactRevisionInputs, parseSemanticFactCompactCarrierForMigration, parseSemanticFactCompactCarrierShape, semanticFactRevisionDigest, semanticObligationRevisionDigest, } from "./semantic-fact-compact-carrier.js";
4
5
  import { parseSemanticFactManifestShape } from "./semantic-fact-manifest-shape.js";
5
6
  import { canonicalValueJson, parseStrictYaml, sha256Hex, } from "./strict-codec.js";
6
- const START = /^\s*```yaml[ \t]+semantic-fact-manifest-v1[ \t]*$/u;
7
+ const START = /^\s*```yaml[ \t]+(semantic-fact-manifest-v1|semantic-fact-compact-carrier-v1)[ \t]*$/u;
7
8
  const END = /^\s*```[ \t]*$/u;
8
9
  export function parseSemanticFactManifestBlocks(sourcePath, content) {
10
+ return parseSemanticFactManifestBlocksWithMode(sourcePath, content, false);
11
+ }
12
+ export function parseSemanticFactManifestBlocksForMigration(sourcePath, content) {
13
+ return parseSemanticFactManifestBlocksWithMode(sourcePath, content, true);
14
+ }
15
+ function parseSemanticFactManifestBlocksWithMode(sourcePath, content, allowLegacyRevisionIdentity) {
9
16
  const rows = [];
10
17
  const lines = content.replace(/\r\n?/gu, "\n").split("\n");
11
18
  let open = null;
12
19
  for (const [index, line] of lines.entries()) {
13
20
  if (!open) {
14
- if (START.test(line))
15
- open = { line: index + 1, lines: [] };
21
+ const match = START.exec(line);
22
+ if (match)
23
+ open = { line: index + 1, lines: [], kind: match[1] };
16
24
  continue;
17
25
  }
18
26
  if (!END.test(line)) {
19
27
  open.lines.push(line);
20
28
  continue;
21
29
  }
22
- const manifest = parseSemanticFactManifestShape(parseStrictYaml(open.lines.join("\n")));
30
+ const decoded = parseStrictYaml(open.lines.join("\n"));
31
+ const compact = open.kind === "semantic-fact-compact-carrier-v1";
32
+ const materialized = compact
33
+ ? allowLegacyRevisionIdentity
34
+ ? parseSemanticFactCompactCarrierForMigration(decoded)
35
+ : parseSemanticFactCompactCarrierShape(decoded)
36
+ : null;
37
+ const manifest = materialized
38
+ ? materialized.manifest
39
+ : parseSemanticFactManifestShape(decoded);
40
+ const expandedRevisions = materialized
41
+ ? null
42
+ : semanticFactRevisionIdentities(manifest);
23
43
  rows.push({
24
44
  source_path: sourcePath,
25
45
  line: open.line,
26
46
  manifest,
27
- sha256: sha256Hex(canonicalValueJson(manifest)),
47
+ sha256: sha256Hex(canonicalValueJson(compact ? decoded : manifest)),
48
+ carrier: compact ? "compact_v1" : "expanded_v1",
49
+ fact_revisions: materialized?.fact_revisions ?? expandedRevisions.facts,
50
+ obligation_revisions: materialized?.obligation_revisions ?? expandedRevisions.obligations,
28
51
  });
29
52
  open = null;
30
53
  }
31
54
  if (open)
32
- throw new Error(`source_formal_block_unclosed:${sourcePath}:semantic-fact-manifest-v1:${open.line}`);
55
+ throw new Error(`source_formal_block_unclosed:${sourcePath}:${open.kind}:${open.line}`);
33
56
  return rows;
34
57
  }
58
+ function semanticFactRevisionIdentities(manifest) {
59
+ const inputRevisionsByFact = indexSemanticFactRevisionInputs(manifest.inputs);
60
+ const facts = manifest.facts.map((fact) => ({
61
+ key: fact.key,
62
+ revision_digest: semanticFactRevisionDigest(fact, inputRevisionsByFact),
63
+ }));
64
+ const factRevisionByKey = new Map(facts.map((item) => [item.key, item.revision_digest]));
65
+ const obligations = manifest.proof_obligations.map((proof) => {
66
+ const factRevision = factRevisionByKey.get(proof.fact_ref);
67
+ if (!factRevision)
68
+ throw new Error(`semantic_fact_revision_unknown_fact:${proof.key}:${proof.fact_ref}`);
69
+ return {
70
+ key: proof.key,
71
+ revision_digest: semanticObligationRevisionDigest(proof, factRevision),
72
+ };
73
+ });
74
+ return { facts, obligations };
75
+ }
35
76
  export async function loadSemanticFactManifest(repository, sourcePaths) {
36
77
  const rows = [];
37
78
  for (const [index, sourcePath] of sourcePaths.entries()) {
@@ -0,0 +1,79 @@
1
+ export interface StructuralClosureCostBaseline {
2
+ schema_version: "structural-closure-cost-baseline-v1";
3
+ workload: string;
4
+ exact: {
5
+ K_fact: number;
6
+ K_rule: number;
7
+ M_value: number;
8
+ M_total: number;
9
+ };
10
+ maximum: {
11
+ N_dag: number;
12
+ source_bytes: number;
13
+ contract_bytes: number;
14
+ evidence_bytes: number;
15
+ default_context_bytes: number;
16
+ revision_changed_files: number;
17
+ revision_changed_lines: number;
18
+ revision_changed_bytes: number;
19
+ };
20
+ minimum: {
21
+ source_duplicate_saved_bytes: number;
22
+ contract_duplicate_saved_bytes: number;
23
+ };
24
+ profiles: Record<string, {
25
+ compile_ms: number;
26
+ preflight_ms: number;
27
+ final_gate_ms: number;
28
+ peak_rss_bytes: number;
29
+ }>;
30
+ }
31
+ export interface StructuralClosureCostObservation {
32
+ cardinality: {
33
+ K_fact: number;
34
+ K_rule: number;
35
+ M_value: number;
36
+ M_total: number;
37
+ N_dag: number;
38
+ };
39
+ bytes: {
40
+ source: number;
41
+ contract: number;
42
+ evidence: number;
43
+ default_context: number;
44
+ };
45
+ phases_ms: {
46
+ compile: number;
47
+ preflight: number;
48
+ final_gate: number;
49
+ };
50
+ peak_rss_bytes: number;
51
+ duplicate_blocks: {
52
+ source: {
53
+ saved_bytes: number;
54
+ remaining_beneficial_candidates: number;
55
+ };
56
+ contract: {
57
+ saved_bytes: number;
58
+ remaining_beneficial_candidates: number;
59
+ };
60
+ };
61
+ revision_blast_radius: {
62
+ changed_files: number;
63
+ changed_lines: number;
64
+ changed_bytes: number;
65
+ changed_fact_revision_keys: string[];
66
+ expected_changed_fact_revision_keys: string[];
67
+ changed_obligation_revision_keys: string[];
68
+ expected_changed_obligation_revision_keys: string[];
69
+ unrelated_fact_revision_identities_unchanged: boolean;
70
+ unrelated_obligation_revision_identities_unchanged: boolean;
71
+ shared_structure_catalog_unchanged: boolean;
72
+ };
73
+ unrelated_axis: {
74
+ K_fact_growth: number;
75
+ M_value_growth: number;
76
+ persisted_shared_metadata_growth_bytes: number;
77
+ };
78
+ }
79
+ export declare function evaluateStructuralClosureCost(observation: StructuralClosureCostObservation, baseline: StructuralClosureCostBaseline, profile: string): string[];
@@ -0,0 +1,91 @@
1
+ export function evaluateStructuralClosureCost(observation, baseline, profile) {
2
+ const findings = [];
3
+ if (baseline.schema_version !== "structural-closure-cost-baseline-v1")
4
+ findings.push("baseline_schema_version_invalid");
5
+ for (const field of ["K_fact", "K_rule", "M_value", "M_total"])
6
+ if (observation.cardinality[field] !== baseline.exact[field])
7
+ findings.push(`cardinality_${field}_mismatch:${observation.cardinality[field]}:${baseline.exact[field]}`);
8
+ compareMaximum(findings, "N_dag", observation.cardinality.N_dag, baseline.maximum.N_dag);
9
+ for (const [field, value] of [
10
+ ["source_bytes", observation.bytes.source],
11
+ ["contract_bytes", observation.bytes.contract],
12
+ ["evidence_bytes", observation.bytes.evidence],
13
+ ["default_context_bytes", observation.bytes.default_context],
14
+ ])
15
+ compareMaximum(findings, field, value, baseline.maximum[field]);
16
+ const phaseBudget = baseline.profiles[profile];
17
+ if (!phaseBudget)
18
+ findings.push(`baseline_profile_missing:${profile}`);
19
+ else {
20
+ compareMaximum(findings, "compile_ms", observation.phases_ms.compile, phaseBudget.compile_ms);
21
+ compareMaximum(findings, "preflight_ms", observation.phases_ms.preflight, phaseBudget.preflight_ms);
22
+ compareMaximum(findings, "final_gate_ms", observation.phases_ms.final_gate, phaseBudget.final_gate_ms);
23
+ compareMaximum(findings, "peak_rss_bytes", observation.peak_rss_bytes, phaseBudget.peak_rss_bytes);
24
+ }
25
+ compareMinimum(findings, "source_duplicate_saved_bytes", observation.duplicate_blocks.source.saved_bytes, baseline.minimum.source_duplicate_saved_bytes);
26
+ compareMinimum(findings, "contract_duplicate_saved_bytes", observation.duplicate_blocks.contract.saved_bytes, baseline.minimum.contract_duplicate_saved_bytes);
27
+ for (const [side, value] of [
28
+ [
29
+ "source",
30
+ observation.duplicate_blocks.source.remaining_beneficial_candidates,
31
+ ],
32
+ [
33
+ "contract",
34
+ observation.duplicate_blocks.contract.remaining_beneficial_candidates,
35
+ ],
36
+ ])
37
+ if (value !== 0)
38
+ findings.push(`remaining_beneficial_candidates:${side}:${value}`);
39
+ compareMaximum(findings, "revision_changed_files", observation.revision_blast_radius.changed_files, baseline.maximum.revision_changed_files);
40
+ compareMaximum(findings, "revision_changed_lines", observation.revision_blast_radius.changed_lines, baseline.maximum.revision_changed_lines);
41
+ compareMaximum(findings, "revision_changed_bytes", observation.revision_blast_radius.changed_bytes, baseline.maximum.revision_changed_bytes);
42
+ for (const [field, value] of [
43
+ [
44
+ "fact_revision_key_set",
45
+ sameStrings(observation.revision_blast_radius.changed_fact_revision_keys, observation.revision_blast_radius.expected_changed_fact_revision_keys),
46
+ ],
47
+ [
48
+ "obligation_revision_key_set",
49
+ sameStrings(observation.revision_blast_radius.changed_obligation_revision_keys, observation.revision_blast_radius
50
+ .expected_changed_obligation_revision_keys),
51
+ ],
52
+ [
53
+ "unrelated_fact_revision_identities",
54
+ observation.revision_blast_radius
55
+ .unrelated_fact_revision_identities_unchanged,
56
+ ],
57
+ [
58
+ "unrelated_obligation_revision_identities",
59
+ observation.revision_blast_radius
60
+ .unrelated_obligation_revision_identities_unchanged,
61
+ ],
62
+ [
63
+ "shared_structure_catalog",
64
+ observation.revision_blast_radius.shared_structure_catalog_unchanged,
65
+ ],
66
+ ])
67
+ if (!value)
68
+ findings.push(`revision_locality_failed:${field}`);
69
+ for (const [field, value] of [
70
+ ["K_fact_growth", observation.unrelated_axis.K_fact_growth],
71
+ ["M_value_growth", observation.unrelated_axis.M_value_growth],
72
+ [
73
+ "persisted_shared_metadata_growth_bytes",
74
+ observation.unrelated_axis.persisted_shared_metadata_growth_bytes,
75
+ ],
76
+ ])
77
+ if (value !== 0)
78
+ findings.push(`unrelated_axis_growth:${field}:${value}`);
79
+ return findings.sort();
80
+ }
81
+ function compareMaximum(findings, field, value, maximum) {
82
+ if (!Number.isFinite(value) || value > maximum)
83
+ findings.push(`maximum_exceeded:${field}:${value}:${maximum}`);
84
+ }
85
+ function compareMinimum(findings, field, value, minimum) {
86
+ if (!Number.isFinite(value) || value < minimum)
87
+ findings.push(`minimum_not_met:${field}:${value}:${minimum}`);
88
+ }
89
+ function sameStrings(left, right) {
90
+ return JSON.stringify([...left].sort()) === JSON.stringify([...right].sort());
91
+ }
@@ -0,0 +1,25 @@
1
+ import type { SymbolicDenotationCanonicalDagV1, SymbolicDenotationComplexityLimits, SymbolicDenotationPredicate } from "./symbolic-denotation-types.js";
2
+ import type { SymbolicRuntimeAxis } from "./symbolic-denotation-runtime.js";
3
+ export declare class SymbolicDecisionDagBuilder {
4
+ private readonly axes;
5
+ private readonly limits;
6
+ private readonly nodes;
7
+ private readonly unique;
8
+ private readonly predicateMemo;
9
+ private readonly applyMemo;
10
+ private readonly notMemo;
11
+ private constructedEdges;
12
+ constructor(axes: SymbolicRuntimeAxis[], limits: SymbolicDenotationComplexityLimits);
13
+ predicate(predicate: SymbolicDenotationPredicate, domainIndex: ReadonlyMap<string, number>): number;
14
+ private compilePredicate;
15
+ private inPredicate;
16
+ private rangePredicate;
17
+ private groupPredicate;
18
+ canonicalize(rootId: number): SymbolicDenotationCanonicalDagV1;
19
+ private checkCanonicalLimits;
20
+ private atom;
21
+ private negate;
22
+ private apply;
23
+ private reduceApply;
24
+ private node;
25
+ }
@@ -0,0 +1,176 @@
1
+ import { canonicalSymbolicEdges, symbolicSegmentMatches, } from "./symbolic-denotation-runtime.js";
2
+ import { compareText, invalid, neverValue, scalarEqual, sha256, stableJson, } from "./symbolic-denotation-support.js";
3
+ export class SymbolicDecisionDagBuilder {
4
+ axes;
5
+ limits;
6
+ nodes = [
7
+ { axis_index: -1, child_ids: [] },
8
+ { axis_index: -1, child_ids: [] },
9
+ ];
10
+ unique = new Map();
11
+ predicateMemo = new Map();
12
+ applyMemo = new Map();
13
+ notMemo = new Map();
14
+ constructedEdges = 0;
15
+ constructor(axes, limits) {
16
+ this.axes = axes;
17
+ this.limits = limits;
18
+ }
19
+ predicate(predicate, domainIndex) {
20
+ const memoKey = stableJson(predicate);
21
+ const cached = this.predicateMemo.get(memoKey);
22
+ if (cached !== undefined)
23
+ return cached;
24
+ const result = this.compilePredicate(predicate, domainIndex);
25
+ this.predicateMemo.set(memoKey, result);
26
+ return result;
27
+ }
28
+ compilePredicate(predicate, domainIndex) {
29
+ switch (predicate.op) {
30
+ case "eq":
31
+ return this.atom(predicate.axis_ref, domainIndex, (value) => scalarEqual(value, predicate.value));
32
+ case "in":
33
+ return this.inPredicate(predicate, domainIndex);
34
+ case "range":
35
+ return this.rangePredicate(predicate, domainIndex);
36
+ case "not":
37
+ return this.negate(this.predicate(predicate.predicate, domainIndex));
38
+ case "all":
39
+ return this.groupPredicate("and", predicate.predicates, domainIndex);
40
+ case "any":
41
+ return this.groupPredicate("or", predicate.predicates, domainIndex);
42
+ default:
43
+ return invalid("predicate_operator_unknown", neverValue(predicate));
44
+ }
45
+ }
46
+ inPredicate(predicate, domainIndex) {
47
+ return this.atom(predicate.axis_ref, domainIndex, (value) => predicate.values.some((candidate) => scalarEqual(value, candidate)));
48
+ }
49
+ rangePredicate(predicate, domainIndex) {
50
+ const minimum = predicate.minimum + (predicate.minimum_inclusive ? 0 : 1);
51
+ const maximum = predicate.maximum - (predicate.maximum_inclusive ? 0 : 1);
52
+ return this.atom(predicate.axis_ref, domainIndex, (value) => typeof value === "number" && value >= minimum && value <= maximum);
53
+ }
54
+ groupPredicate(operation, predicates, domainIndex) {
55
+ let result = operation === "and" ? 1 : 0;
56
+ for (const child of predicates)
57
+ result = this.apply(operation, result, this.predicate(child, domainIndex));
58
+ return result;
59
+ }
60
+ canonicalize(rootId) {
61
+ const output = new Map();
62
+ const memo = new Map([
63
+ [0, "terminal.false"],
64
+ [1, "terminal.true"],
65
+ ]);
66
+ const visit = (id) => {
67
+ const cached = memo.get(id);
68
+ if (cached)
69
+ return cached;
70
+ const node = this.nodes[id];
71
+ const axis = this.axes[node.axis_index];
72
+ const childRefs = node.child_ids.map(visit);
73
+ const edges = canonicalSymbolicEdges(axis, childRefs);
74
+ const body = { axis_ref: axis.domain.key, edges };
75
+ const key = `node.${sha256(stableJson(body))}`;
76
+ const existing = output.get(key);
77
+ if (existing && stableJson(existing.edges) !== stableJson(edges))
78
+ invalid("canonical_node_hash_collision", key);
79
+ output.set(key, { key, ...body });
80
+ memo.set(id, key);
81
+ return key;
82
+ };
83
+ const rootRef = visit(rootId);
84
+ const nodes = [...output.values()].sort((left, right) => compareText(left.key, right.key));
85
+ this.checkCanonicalLimits(nodes);
86
+ return {
87
+ schema_version: "symbolic-denotation-canonical-dag-v1",
88
+ root_ref: rootRef,
89
+ nodes,
90
+ };
91
+ }
92
+ checkCanonicalLimits(nodes) {
93
+ const partitionEdges = nodes.reduce((total, node) => total + node.edges.length, 0);
94
+ if (nodes.length > this.limits.max_canonical_dag_nodes)
95
+ invalid("canonical_dag_node_limit_exceeded", `actual=${nodes.length}:limit=${this.limits.max_canonical_dag_nodes}`);
96
+ if (partitionEdges > this.limits.max_partition_edges)
97
+ invalid("canonical_partition_edge_limit_exceeded", `actual=${partitionEdges}:limit=${this.limits.max_partition_edges}`);
98
+ }
99
+ atom(axisRef, domainIndex, matches) {
100
+ const axisIndex = domainIndex.get(axisRef);
101
+ if (axisIndex === undefined)
102
+ invalid("predicate_axis_unknown", axisRef);
103
+ const axis = this.axes[axisIndex];
104
+ return this.node(axisIndex, axis.segments.map((segment) => symbolicSegmentMatches(segment, matches) ? 1 : 0));
105
+ }
106
+ negate(id) {
107
+ if (id === 0)
108
+ return 1;
109
+ if (id === 1)
110
+ return 0;
111
+ const cached = this.notMemo.get(id);
112
+ if (cached !== undefined)
113
+ return cached;
114
+ const node = this.nodes[id];
115
+ const result = this.node(node.axis_index, node.child_ids.map((child) => this.negate(child)));
116
+ this.notMemo.set(id, result);
117
+ return result;
118
+ }
119
+ apply(operation, left, right) {
120
+ const reduced = this.reduceApply(operation, left, right);
121
+ if (reduced !== null)
122
+ return reduced;
123
+ const first = Math.min(left, right);
124
+ const second = Math.max(left, right);
125
+ const memoKey = `${operation}:${first}:${second}`;
126
+ const cached = this.applyMemo.get(memoKey);
127
+ if (cached !== undefined)
128
+ return cached;
129
+ const leftNode = this.nodes[left];
130
+ const rightNode = this.nodes[right];
131
+ const axisIndex = Math.min(leftNode.axis_index, rightNode.axis_index);
132
+ const segmentCount = this.axes[axisIndex].segments.length;
133
+ const children = Array.from({ length: segmentCount }, (_, index) => this.apply(operation, leftNode.axis_index === axisIndex ? leftNode.child_ids[index] : left, rightNode.axis_index === axisIndex ? rightNode.child_ids[index] : right));
134
+ const result = this.node(axisIndex, children);
135
+ this.applyMemo.set(memoKey, result);
136
+ return result;
137
+ }
138
+ reduceApply(operation, left, right) {
139
+ if (left === right)
140
+ return left;
141
+ if (operation === "and") {
142
+ if (left === 0 || right === 0)
143
+ return 0;
144
+ if (left === 1)
145
+ return right;
146
+ if (right === 1)
147
+ return left;
148
+ return null;
149
+ }
150
+ if (left === 1 || right === 1)
151
+ return 1;
152
+ if (left === 0)
153
+ return right;
154
+ if (right === 0)
155
+ return left;
156
+ return null;
157
+ }
158
+ node(axisIndex, childIds) {
159
+ if (childIds.every((child) => child === childIds[0]))
160
+ return childIds[0];
161
+ const key = `${axisIndex}:${childIds.join(",")}`;
162
+ const cached = this.unique.get(key);
163
+ if (cached !== undefined)
164
+ return cached;
165
+ const nextNodeCount = this.nodes.length - 1;
166
+ if (nextNodeCount > this.limits.max_canonical_dag_nodes)
167
+ invalid("constructed_dag_node_limit_exceeded", `actual=${nextNodeCount}:limit=${this.limits.max_canonical_dag_nodes}`);
168
+ this.constructedEdges += childIds.length;
169
+ if (this.constructedEdges > this.limits.max_partition_edges)
170
+ invalid("constructed_partition_edge_limit_exceeded", `actual=${this.constructedEdges}:limit=${this.limits.max_partition_edges}`);
171
+ const id = this.nodes.length;
172
+ this.nodes.push({ axis_index: axisIndex, child_ids: childIds });
173
+ this.unique.set(key, id);
174
+ return id;
175
+ }
176
+ }
@@ -0,0 +1,3 @@
1
+ import type { SymbolicDenotationAxisDomain, SymbolicDenotationComplexityLimits } from "./symbolic-denotation-types.js";
2
+ export declare function validateSymbolicLimits(limits: SymbolicDenotationComplexityLimits): SymbolicDenotationComplexityLimits;
3
+ export declare function validateSymbolicDomains(domainsInput: SymbolicDenotationAxisDomain[]): SymbolicDenotationAxisDomain[];
@@ -0,0 +1,56 @@
1
+ import { compareText, exactKeys, invalid, stableKey, } from "./symbolic-denotation-support.js";
2
+ export function validateSymbolicLimits(limits) {
3
+ exactKeys(limits, [
4
+ "max_predicate_depth",
5
+ "max_input_predicate_nodes",
6
+ "max_canonical_dag_nodes",
7
+ "max_partition_edges",
8
+ "max_canonical_bytes",
9
+ ], "complexity_limits");
10
+ for (const [key, value] of Object.entries(limits))
11
+ if (!Number.isSafeInteger(value) || value <= 0)
12
+ invalid("complexity_limit_invalid", `${key}:${value}`);
13
+ return { ...limits };
14
+ }
15
+ export function validateSymbolicDomains(domainsInput) {
16
+ if (!Array.isArray(domainsInput) || !domainsInput.length)
17
+ invalid("axis_domains_required", "");
18
+ const domains = domainsInput.map(validateDomain);
19
+ domains.sort((left, right) => compareText(left.key, right.key));
20
+ if (new Set(domains.map((domain) => domain.key)).size !== domains.length)
21
+ invalid("axis_domain_key_duplicate", "");
22
+ return domains;
23
+ }
24
+ function validateDomain(input, index) {
25
+ if (!input || typeof input !== "object" || Array.isArray(input))
26
+ invalid("axis_domain_invalid", String(index));
27
+ stableKey(input.key, `axis_domain:${index}`);
28
+ if (input.kind === "enum")
29
+ return validateEnumDomain(input);
30
+ if (input.kind === "bounded_number")
31
+ return validateNumberDomain(input);
32
+ return invalid("axis_domain_kind_unknown", String(input.kind));
33
+ }
34
+ function validateEnumDomain(input) {
35
+ exactKeys(input, ["key", "kind", "values"], `axis_domain:${input.key}`);
36
+ if (!Array.isArray(input.values) || !input.values.length)
37
+ invalid("enum_domain_values_required", input.key);
38
+ const values = input.values.map((value) => {
39
+ if (typeof value !== "string" || !value)
40
+ invalid("enum_domain_value_invalid", input.key);
41
+ return value;
42
+ });
43
+ if (new Set(values).size !== values.length)
44
+ invalid("enum_domain_value_duplicate", input.key);
45
+ return { ...input, values: [...values].sort(compareText) };
46
+ }
47
+ function validateNumberDomain(input) {
48
+ exactKeys(input, ["key", "kind", "minimum", "maximum", "integer"], `axis_domain:${input.key}`);
49
+ if (input.integer !== true ||
50
+ !Number.isSafeInteger(input.minimum) ||
51
+ !Number.isSafeInteger(input.maximum) ||
52
+ input.minimum > input.maximum ||
53
+ input.maximum >= Number.MAX_SAFE_INTEGER)
54
+ invalid("bounded_number_domain_invalid", input.key);
55
+ return { ...input };
56
+ }
@@ -0,0 +1,32 @@
1
+ import type { CompiledSymbolicDenotationV1, SymbolicDenotationAxisDomain, SymbolicDenotationCanonicalDagV1, SymbolicDenotationComplexityLimits, SymbolicDenotationPredicate, SymbolicDenotationScalar } from "./symbolic-denotation-types.js";
2
+ export declare const DEFAULT_SYMBOLIC_DENOTATION_COMPLEXITY_LIMITS: {
3
+ readonly max_predicate_depth: 32;
4
+ readonly max_input_predicate_nodes: 4096;
5
+ readonly max_canonical_dag_nodes: 8192;
6
+ readonly max_partition_edges: 65536;
7
+ readonly max_canonical_bytes: 4194304;
8
+ };
9
+ export declare function compileSymbolicDenotation(domainsInput: SymbolicDenotationAxisDomain[], predicateInput: SymbolicDenotationPredicate, limits?: SymbolicDenotationComplexityLimits): CompiledSymbolicDenotationV1;
10
+ export interface SymbolicDenotationCompilationStatisticsV1 {
11
+ axis_partition_builds: 1;
12
+ compile_requests: number;
13
+ compile_cache_hits: number;
14
+ unique_compiled_predicates: number;
15
+ }
16
+ export declare class SymbolicDenotationCompilationSession {
17
+ private readonly limits;
18
+ private readonly domains;
19
+ private readonly domainIndex;
20
+ private readonly numberCuts;
21
+ private readonly builder;
22
+ private readonly compiled;
23
+ private readonly theoreticalGroundCardinality;
24
+ private compileRequests;
25
+ private compileCacheHits;
26
+ constructor(domainsInput: SymbolicDenotationAxisDomain[], seedPredicates: readonly SymbolicDenotationPredicate[], limits?: SymbolicDenotationComplexityLimits);
27
+ compile(predicateInput: SymbolicDenotationPredicate): CompiledSymbolicDenotationV1;
28
+ statistics(): SymbolicDenotationCompilationStatisticsV1;
29
+ private inspect;
30
+ }
31
+ export declare function createSymbolicDenotationCompilationSession(domains: SymbolicDenotationAxisDomain[], seedPredicates: readonly SymbolicDenotationPredicate[], limits?: SymbolicDenotationComplexityLimits): SymbolicDenotationCompilationSession;
32
+ export declare function evaluateCanonicalSymbolicDenotation(dag: SymbolicDenotationCanonicalDagV1, assignment: Record<string, SymbolicDenotationScalar>): boolean;