project-tiny-context-harness 0.8.10 → 0.8.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +490 -472
  3. package/assets/README.md +762 -749
  4. package/assets/README.zh-CN.md +446 -431
  5. package/assets/agents/.gitkeep +1 -1
  6. package/assets/agents/AGENTS_CORE.md +17 -23
  7. package/assets/agents/long-task-implementation.toml +15 -0
  8. package/assets/context_templates/architecture.md +18 -18
  9. package/assets/context_templates/area.md +30 -30
  10. package/assets/context_templates/context.toml +24 -24
  11. package/assets/context_templates/deployment.md +35 -35
  12. package/assets/context_templates/global.md +56 -56
  13. package/assets/context_templates/product-surface-contract.md +70 -70
  14. package/assets/context_templates/screen-contract.md +189 -189
  15. package/assets/context_templates/verification.md +25 -25
  16. package/assets/github/.gitkeep +1 -1
  17. package/assets/github/harness.yml +39 -39
  18. package/assets/make/.gitkeep +1 -1
  19. package/assets/make/ty-context.mk +48 -48
  20. package/assets/skills/context_development_engineer/SKILL.md +64 -185
  21. package/assets/skills/context_full_project_export/SKILL.md +28 -28
  22. package/assets/skills/context_harness_upgrade/SKILL.md +60 -60
  23. package/assets/skills/context_product_plan/SKILL.md +35 -101
  24. package/assets/skills/context_surface_contract/SKILL.md +194 -191
  25. package/assets/skills/context_uiux_design/SKILL.md +49 -172
  26. package/assets/skills/design-resource-authoring/SKILL.md +52 -88
  27. package/assets/skills/design-resource-authoring/references/downstream-handoff.md +51 -163
  28. package/assets/skills/design-resource-authoring/references/formal-selected-web-app-handoff.md +96 -0
  29. package/assets/skills/design-resource-authoring/references/open-design-provider.md +119 -119
  30. package/assets/skills/design-resource-authoring/references/resource-selection.md +158 -181
  31. package/assets/skills/design-system-authoring/SKILL.md +57 -57
  32. package/assets/skills/design-system-authoring/agents/openai.yaml +6 -6
  33. package/assets/skills/design-system-authoring/references/authority-adoption.md +48 -48
  34. package/assets/skills/design-system-authoring/references/open-design-design-system-provider.md +110 -110
  35. package/assets/skills/long-task-workflow/SKILL.md +71 -106
  36. package/assets/skills/long-task-workflow/agents/openai.yaml +1 -1
  37. package/assets/skills/long-task-workflow/references/authority-lifecycle.md +71 -69
  38. package/assets/skills/long-task-workflow/references/contract-authoring.md +98 -94
  39. package/assets/skills/long-task-workflow/references/evidence-design.md +67 -63
  40. package/assets/skills/long-task-workflow/references/source-authoring.md +90 -90
  41. package/assets/tools/validate_context.py +442 -442
  42. package/dist/commands/design-resource.js +9 -2
  43. package/dist/commands/enable.js +2 -0
  44. package/dist/commands/index.js +1 -1
  45. package/dist/commands/long-task-revision.js +8 -7
  46. package/dist/commands/sync.js +2 -0
  47. package/dist/index.d.ts +3 -4
  48. package/dist/index.js +2 -1
  49. package/dist/lib/compact-authoring-support.d.ts +22 -0
  50. package/dist/lib/compact-authoring-support.js +143 -0
  51. package/dist/lib/compact-shared-structure-authoring.d.ts +5 -0
  52. package/dist/lib/compact-shared-structure-authoring.js +9 -0
  53. package/dist/lib/compact-shared-structure-types.d.ts +61 -0
  54. package/dist/lib/compact-shared-structure-types.js +1 -0
  55. package/dist/lib/compact-shared-structure-validation.d.ts +2 -0
  56. package/dist/lib/compact-shared-structure-validation.js +159 -0
  57. package/dist/lib/compact-shared-structures.d.ts +3 -0
  58. package/dist/lib/compact-shared-structures.js +204 -0
  59. package/dist/lib/design-resource-fact-enums.d.ts +4 -0
  60. package/dist/lib/design-resource-fact-enums.js +12 -0
  61. package/dist/lib/design-resource-fact-manifest-shape-evidence.js +2 -2
  62. package/dist/lib/design-resource-fact-manifest-validation.d.ts +2 -1
  63. package/dist/lib/design-resource-fact-policy.d.ts +2 -2
  64. package/dist/lib/design-resource-fact-types.d.ts +2 -2
  65. package/dist/lib/design-resource-handoff-bundle-draft.d.ts +11 -0
  66. package/dist/lib/design-resource-handoff-bundle-draft.js +40 -0
  67. package/dist/lib/design-resource-handoff-bundle.js +4 -28
  68. package/dist/lib/design-resource-handoff-input-types.d.ts +14 -0
  69. package/dist/lib/design-resource-handoff-input-types.js +1 -0
  70. package/dist/lib/design-resource-handoff-manifest-projection.d.ts +2 -1
  71. package/dist/lib/design-resource-handoff-parser.d.ts +2 -2
  72. package/dist/lib/design-resource-handoff-parser.js +2 -2
  73. package/dist/lib/design-resource-handoff-shape.d.ts +4 -1
  74. package/dist/lib/design-resource-handoff-shape.js +10 -0
  75. package/dist/lib/design-resource-handoff-snapshot.d.ts +1 -1
  76. package/dist/lib/design-resource-handoff-snapshot.js +4 -0
  77. package/dist/lib/design-resource-handoff-types.d.ts +0 -10
  78. package/dist/lib/design-resource-handoff-validation.d.ts +6 -2
  79. package/dist/lib/design-resource-handoff-validation.js +11 -0
  80. package/dist/lib/design-resource-handoff-web-dependency-validation.d.ts +4 -2
  81. package/dist/lib/design-resource-symbolic-applicability-authority.d.ts +7 -0
  82. package/dist/lib/design-resource-symbolic-applicability-authority.js +19 -0
  83. package/dist/lib/design-resource-symbolic-applicability-policy.d.ts +12 -0
  84. package/dist/lib/design-resource-symbolic-applicability-policy.js +79 -0
  85. package/dist/lib/design-resource-symbolic-applicability-profiles.d.ts +8 -0
  86. package/dist/lib/design-resource-symbolic-applicability-profiles.js +55 -0
  87. package/dist/lib/design-resource-symbolic-applicability-shape.d.ts +2 -0
  88. package/dist/lib/design-resource-symbolic-applicability-shape.js +76 -0
  89. package/dist/lib/design-resource-symbolic-applicability-validation.d.ts +7 -0
  90. package/dist/lib/design-resource-symbolic-applicability-validation.js +128 -0
  91. package/dist/lib/design-resource-symbolic-compilation.d.ts +3 -0
  92. package/dist/lib/design-resource-symbolic-compilation.js +13 -0
  93. package/dist/lib/design-resource-symbolic-denotation.d.ts +3 -0
  94. package/dist/lib/design-resource-symbolic-denotation.js +167 -0
  95. package/dist/lib/design-resource-symbolic-disposition-validation.d.ts +4 -0
  96. package/dist/lib/design-resource-symbolic-disposition-validation.js +28 -0
  97. package/dist/lib/design-resource-symbolic-fact-policy.d.ts +12 -0
  98. package/dist/lib/design-resource-symbolic-fact-policy.js +12 -0
  99. package/dist/lib/design-resource-symbolic-fact-shape.d.ts +3 -0
  100. package/dist/lib/design-resource-symbolic-fact-shape.js +138 -0
  101. package/dist/lib/design-resource-symbolic-fact-types.d.ts +213 -0
  102. package/dist/lib/design-resource-symbolic-fact-types.js +1 -0
  103. package/dist/lib/design-resource-symbolic-fact-validation.d.ts +3 -0
  104. package/dist/lib/design-resource-symbolic-fact-validation.js +86 -0
  105. package/dist/lib/design-resource-symbolic-indexes.d.ts +23 -0
  106. package/dist/lib/design-resource-symbolic-indexes.js +54 -0
  107. package/dist/lib/design-resource-symbolic-manifest-shape.d.ts +3 -0
  108. package/dist/lib/design-resource-symbolic-manifest-shape.js +155 -0
  109. package/dist/lib/design-resource-symbolic-manifest-validation.d.ts +6 -0
  110. package/dist/lib/design-resource-symbolic-manifest-validation.js +132 -0
  111. package/dist/lib/design-resource-symbolic-noninterference-artifact.d.ts +33 -0
  112. package/dist/lib/design-resource-symbolic-noninterference-artifact.js +110 -0
  113. package/dist/lib/design-resource-symbolic-noninterference-equivalence.d.ts +3 -0
  114. package/dist/lib/design-resource-symbolic-noninterference-equivalence.js +77 -0
  115. package/dist/lib/design-resource-symbolic-noninterference-recompute.d.ts +4 -0
  116. package/dist/lib/design-resource-symbolic-noninterference-recompute.js +146 -0
  117. package/dist/lib/design-resource-symbolic-noninterference-scope.d.ts +7 -0
  118. package/dist/lib/design-resource-symbolic-noninterference-scope.js +49 -0
  119. package/dist/lib/design-resource-symbolic-noninterference-shape.d.ts +2 -0
  120. package/dist/lib/design-resource-symbolic-noninterference-shape.js +152 -0
  121. package/dist/lib/design-resource-symbolic-noninterference-types.d.ts +103 -0
  122. package/dist/lib/design-resource-symbolic-noninterference-types.js +1 -0
  123. package/dist/lib/design-resource-symbolic-noninterference-validation.d.ts +5 -0
  124. package/dist/lib/design-resource-symbolic-noninterference-validation.js +62 -0
  125. package/dist/lib/design-resource-symbolic-oracle-fingerprint.d.ts +1 -0
  126. package/dist/lib/design-resource-symbolic-oracle-fingerprint.js +47 -0
  127. package/dist/lib/design-resource-symbolic-predicate-shape.d.ts +6 -0
  128. package/dist/lib/design-resource-symbolic-predicate-shape.js +123 -0
  129. package/dist/lib/design-resource-symbolic-production-closure.d.ts +4 -0
  130. package/dist/lib/design-resource-symbolic-production-closure.js +144 -0
  131. package/dist/lib/design-resource-symbolic-proof-authority-validation.d.ts +10 -0
  132. package/dist/lib/design-resource-symbolic-proof-authority-validation.js +68 -0
  133. package/dist/lib/design-resource-symbolic-proof-validation.d.ts +10 -0
  134. package/dist/lib/design-resource-symbolic-proof-validation.js +89 -0
  135. package/dist/lib/design-resource-symbolic-region-validation.d.ts +19 -0
  136. package/dist/lib/design-resource-symbolic-region-validation.js +146 -0
  137. package/dist/lib/design-resource-symbolic-resource-validation.d.ts +5 -0
  138. package/dist/lib/design-resource-symbolic-resource-validation.js +90 -0
  139. package/dist/lib/design-resource-symbolic-rule-shape.d.ts +27 -0
  140. package/dist/lib/design-resource-symbolic-rule-shape.js +158 -0
  141. package/dist/lib/design-resource-symbolic-safety-validation.d.ts +6 -0
  142. package/dist/lib/design-resource-symbolic-safety-validation.js +29 -0
  143. package/dist/lib/design-resource-symbolic-source-ir-evaluation.d.ts +19 -0
  144. package/dist/lib/design-resource-symbolic-source-ir-evaluation.js +74 -0
  145. package/dist/lib/design-resource-symbolic-source-ir-evidence.d.ts +44 -0
  146. package/dist/lib/design-resource-symbolic-source-ir-evidence.js +88 -0
  147. package/dist/lib/design-resource-symbolic-source-ir-oracle.d.ts +13 -0
  148. package/dist/lib/design-resource-symbolic-source-ir-oracle.js +96 -0
  149. package/dist/lib/design-resource-symbolic-source-ir-proof.d.ts +14 -0
  150. package/dist/lib/design-resource-symbolic-source-ir-proof.js +98 -0
  151. package/dist/lib/design-resource-symbolic-source-ir-shape.d.ts +2 -0
  152. package/dist/lib/design-resource-symbolic-source-ir-shape.js +38 -0
  153. package/dist/lib/design-resource-symbolic-source-ir-types.d.ts +17 -0
  154. package/dist/lib/design-resource-symbolic-source-ir-types.js +2 -0
  155. package/dist/lib/design-resource-symbolic-static-dependency-validation.d.ts +2 -0
  156. package/dist/lib/design-resource-symbolic-static-dependency-validation.js +83 -0
  157. package/dist/lib/design-resource-symbolic-structural-closure-validation.d.ts +6 -0
  158. package/dist/lib/design-resource-symbolic-structural-closure-validation.js +79 -0
  159. package/dist/lib/design-resource-symbolic-validation-support.d.ts +29 -0
  160. package/dist/lib/design-resource-symbolic-validation-support.js +111 -0
  161. package/dist/lib/design-resource-v1-capacity-header.d.ts +8 -0
  162. package/dist/lib/design-resource-v1-capacity-header.js +231 -0
  163. package/dist/lib/design-resource-v1-capacity.d.ts +5 -0
  164. package/dist/lib/design-resource-v1-capacity.js +45 -0
  165. package/dist/lib/init.js +1 -0
  166. package/dist/lib/long-task-activation-validation.js +2 -2
  167. package/dist/lib/long-task-authority-policy.d.ts +3 -0
  168. package/dist/lib/long-task-authority-policy.js +3 -0
  169. package/dist/lib/long-task-codex-agent-profile.d.ts +42 -0
  170. package/dist/lib/long-task-codex-agent-profile.js +276 -0
  171. package/dist/lib/long-task-compact-authoring-projections.d.ts +12 -0
  172. package/dist/lib/long-task-compact-authoring-projections.js +67 -0
  173. package/dist/lib/long-task-compact-authoring.d.ts +3 -0
  174. package/dist/lib/long-task-compact-authoring.js +173 -0
  175. package/dist/lib/long-task-compact-carrier.d.ts +7 -0
  176. package/dist/lib/long-task-compact-carrier.js +132 -0
  177. package/dist/lib/long-task-compact-parser.d.ts +14 -0
  178. package/dist/lib/long-task-compact-parser.js +123 -0
  179. package/dist/lib/long-task-compact-primitives.d.ts +22 -0
  180. package/dist/lib/long-task-compact-primitives.js +132 -0
  181. package/dist/lib/long-task-compact-projections.d.ts +4 -0
  182. package/dist/lib/long-task-compact-projections.js +153 -0
  183. package/dist/lib/long-task-compact-structure-targets.d.ts +2 -0
  184. package/dist/lib/long-task-compact-structure-targets.js +90 -0
  185. package/dist/lib/long-task-counterfactual-sandbox.d.ts +1 -1
  186. package/dist/lib/long-task-counterfactual-sandbox.js +7 -5
  187. package/dist/lib/long-task-delivery-parser.d.ts +1 -0
  188. package/dist/lib/long-task-delivery-parser.js +38 -6
  189. package/dist/lib/long-task-design-resource-handoff.d.ts +2 -1
  190. package/dist/lib/long-task-design-resource-handoff.js +71 -11
  191. package/dist/lib/long-task-design-resource-method-binding.d.ts +8 -1
  192. package/dist/lib/long-task-design-resource-method-binding.js +150 -0
  193. package/dist/lib/long-task-evidence-capability-codec.js +256 -34
  194. package/dist/lib/long-task-evidence-capability-policy.js +28 -0
  195. package/dist/lib/long-task-evidence-capability-runtime.js +271 -63
  196. package/dist/lib/long-task-evidence-capability-types.d.ts +70 -2
  197. package/dist/lib/long-task-evidence-v2.d.ts +1 -1
  198. package/dist/lib/long-task-evidence-v2.js +5 -5
  199. package/dist/lib/long-task-hook-install.d.ts +19 -2
  200. package/dist/lib/long-task-hook-install.js +288 -91
  201. package/dist/lib/long-task-playwright-capability-records.d.ts +2 -0
  202. package/dist/lib/long-task-playwright-capability-records.js +74 -2
  203. package/dist/lib/long-task-runner-freeze.d.ts +1 -1
  204. package/dist/lib/long-task-runner-freeze.js +4 -2
  205. package/dist/lib/long-task-semantic-contract-types.d.ts +1 -1
  206. package/dist/lib/long-task-semantic-fact-binding-types.d.ts +8 -0
  207. package/dist/lib/long-task-semantic-fact-closure.js +4 -1
  208. package/dist/lib/long-task-semantic-fact-contract-closure.d.ts +1 -1
  209. package/dist/lib/long-task-semantic-fact-contract-closure.js +15 -3
  210. package/dist/lib/long-task-semantic-fact-contract-facts.d.ts +1 -1
  211. package/dist/lib/long-task-semantic-fact-contract-facts.js +4 -1
  212. package/dist/lib/long-task-semantic-fact-contract-proofs.d.ts +1 -1
  213. package/dist/lib/long-task-semantic-fact-contract-proofs.js +12 -3
  214. package/dist/lib/long-task-semantic-fact-evidence.d.ts +5 -1
  215. package/dist/lib/long-task-semantic-fact-evidence.js +47 -4
  216. package/dist/lib/long-task-semantic-fact-shape.js +17 -6
  217. package/dist/lib/long-task-shape-primitives.d.ts +1 -1
  218. package/dist/lib/long-task-shape-primitives.js +1 -0
  219. package/dist/lib/long-task-source-item-parser.d.ts +2 -2
  220. package/dist/lib/long-task-source-item-parser.js +20 -11
  221. package/dist/lib/long-task-ui-design-policy.js +64 -4
  222. package/dist/lib/long-task-ui-surface-shape.js +195 -0
  223. package/dist/lib/long-task-ui-surface-types.d.ts +53 -0
  224. package/dist/lib/long-task-verifier-v2.js +1 -1
  225. package/dist/lib/long-task-worker-selection.d.ts +2 -0
  226. package/dist/lib/long-task-worker-selection.js +7 -0
  227. package/dist/lib/long-task-workspace-scope.js +3 -1
  228. package/dist/lib/long-task-workspace.js +11 -1
  229. package/dist/lib/migrations.js +58 -0
  230. package/dist/lib/profiles.js +0 -1
  231. package/dist/lib/semantic-fact-compact-authoring.d.ts +2 -0
  232. package/dist/lib/semantic-fact-compact-authoring.js +160 -0
  233. package/dist/lib/semantic-fact-compact-capacity.d.ts +9 -0
  234. package/dist/lib/semantic-fact-compact-capacity.js +40 -0
  235. package/dist/lib/semantic-fact-compact-carrier.d.ts +16 -0
  236. package/dist/lib/semantic-fact-compact-carrier.js +146 -0
  237. package/dist/lib/semantic-fact-compact-parser.d.ts +17 -0
  238. package/dist/lib/semantic-fact-compact-parser.js +168 -0
  239. package/dist/lib/semantic-fact-compact-revision.d.ts +11 -0
  240. package/dist/lib/semantic-fact-compact-revision.js +64 -0
  241. package/dist/lib/semantic-fact-compact-support.d.ts +23 -0
  242. package/dist/lib/semantic-fact-compact-support.js +159 -0
  243. package/dist/lib/semantic-fact-policy-census.d.ts +1 -0
  244. package/dist/lib/semantic-fact-policy-census.js +43 -0
  245. package/dist/lib/semantic-fact-proof-shape.d.ts +1 -1
  246. package/dist/lib/semantic-fact-property-shape.d.ts +1 -1
  247. package/dist/lib/semantic-fact-source-parser.d.ts +5 -0
  248. package/dist/lib/semantic-fact-source-parser.js +47 -6
  249. package/dist/lib/structural-closure-cost.d.ts +79 -0
  250. package/dist/lib/structural-closure-cost.js +91 -0
  251. package/dist/lib/symbolic-denotation-dag-builder.d.ts +25 -0
  252. package/dist/lib/symbolic-denotation-dag-builder.js +176 -0
  253. package/dist/lib/symbolic-denotation-domain-validation.d.ts +3 -0
  254. package/dist/lib/symbolic-denotation-domain-validation.js +56 -0
  255. package/dist/lib/symbolic-denotation-engine.d.ts +32 -0
  256. package/dist/lib/symbolic-denotation-engine.js +140 -0
  257. package/dist/lib/symbolic-denotation-public.d.ts +11 -0
  258. package/dist/lib/symbolic-denotation-public.js +12 -0
  259. package/dist/lib/symbolic-denotation-runtime.d.ts +20 -0
  260. package/dist/lib/symbolic-denotation-runtime.js +90 -0
  261. package/dist/lib/symbolic-denotation-support.d.ts +11 -0
  262. package/dist/lib/symbolic-denotation-support.js +49 -0
  263. package/dist/lib/symbolic-denotation-types.d.ts +133 -0
  264. package/dist/lib/symbolic-denotation-types.js +18 -0
  265. package/dist/lib/symbolic-denotation-validation.d.ts +6 -0
  266. package/dist/lib/symbolic-denotation-validation.js +126 -0
  267. package/dist/lib/sync-engine.d.ts +1 -0
  268. package/dist/lib/sync-engine.js +4 -1
  269. package/dist/lib/upgrade.js +1 -0
  270. package/dist/long-task-hook.js +40 -1
  271. package/dist/public-types.d.ts +8 -0
  272. package/dist/public-types.js +1 -0
  273. package/dist/schemas/design-resource-symbolic-noninterference-artifact-v2.schema.json +289 -0
  274. package/dist/schemas/design-resource-symbolic-source-ir-v1.schema.json +130 -0
  275. package/dist/schemas/long-task-delivery-v2/long-task-delivery-v2.schema.json +390 -5
  276. package/migrations/README.md +15 -15
  277. package/package.json +2 -2
  278. package/source-mappings.yaml +28 -25
  279. package/assets/skills/source-plan-authoring/SKILL.md +0 -14
@@ -0,0 +1,40 @@
1
+ import { semanticFail } from "./semantic-fact-shape-primitives.js";
2
+ export const SEMANTIC_COMPACT_CAPACITY_FIELDS = [
3
+ "inputs",
4
+ "catalog_rows",
5
+ "selector_members",
6
+ "structure_families",
7
+ "structure_references",
8
+ "structure_arguments",
9
+ "facts",
10
+ "obligations",
11
+ "census",
12
+ "canonical_bytes",
13
+ ];
14
+ const PACKAGE_MAXIMUM = {
15
+ inputs: 100_000,
16
+ catalog_rows: 2_000_000,
17
+ selector_members: 5_000_000,
18
+ structure_families: 1_000_000,
19
+ structure_references: 10_000_000,
20
+ structure_arguments: 50_000_000,
21
+ facts: 1_000_000,
22
+ obligations: 2_000_000,
23
+ census: 10_000_000,
24
+ canonical_bytes: 256 * 1024 * 1024,
25
+ };
26
+ export function validateSemanticCompactCapacity(capacity, measured, label) {
27
+ for (const field of SEMANTIC_COMPACT_CAPACITY_FIELDS) {
28
+ if (capacity.maximum[field] > PACKAGE_MAXIMUM[field])
29
+ semanticFail(`${label}.capacity.maximum.${field}`, `exceeds package maximum ${PACKAGE_MAXIMUM[field]}`);
30
+ if (capacity.measured[field] !== measured[field])
31
+ semanticFail(`${label}.capacity.measured.${field}`, `measured mismatch: ${capacity.measured[field]}:${measured[field]}`);
32
+ if (measured[field] > capacity.maximum[field])
33
+ semanticFail(`${label}.capacity.maximum.${field}`, `capacity exceeded: ${measured[field]}:${capacity.maximum[field]}`);
34
+ }
35
+ }
36
+ export function validateSemanticCompactDeclaredMaximum(maximum, label) {
37
+ for (const field of SEMANTIC_COMPACT_CAPACITY_FIELDS)
38
+ if (maximum[field] > PACKAGE_MAXIMUM[field])
39
+ semanticFail(`${label}.capacity.maximum.${field}`, `exceeds package maximum ${PACKAGE_MAXIMUM[field]}`);
40
+ }
@@ -0,0 +1,16 @@
1
+ import type { SemanticFactManifestV1 } from "./semantic-fact-types.js";
2
+ import { type SemanticCompactCapacityCounts } from "./semantic-fact-compact-support.js";
3
+ export { indexSemanticFactRevisionInputs, semanticFactRevisionDigest, semanticObligationRevisionDigest, } from "./semantic-fact-compact-support.js";
4
+ export declare const SEMANTIC_FACT_COMPACT_CARRIER_VERSION: "semantic-fact-compact-carrier-v1";
5
+ export interface SemanticFactRevisionIdentityV1 {
6
+ key: string;
7
+ revision_digest: string;
8
+ }
9
+ export interface MaterializedSemanticFactCompactCarrierV1 {
10
+ manifest: SemanticFactManifestV1;
11
+ fact_revisions: SemanticFactRevisionIdentityV1[];
12
+ obligation_revisions: SemanticFactRevisionIdentityV1[];
13
+ measured: SemanticCompactCapacityCounts;
14
+ }
15
+ export declare function parseSemanticFactCompactCarrierShape(value: unknown): MaterializedSemanticFactCompactCarrierV1;
16
+ export declare function parseSemanticFactCompactCarrierForMigration(value: unknown): MaterializedSemanticFactCompactCarrierV1;
@@ -0,0 +1,146 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { parseSemanticFactManifestShape } from "./semantic-fact-manifest-shape.js";
3
+ import { buildSemanticFactInspectorCensus } from "./semantic-fact-policy-census.js";
4
+ import { semanticFail, semanticLiteral, semanticObject, semanticStableRef, } from "./semantic-fact-shape-primitives.js";
5
+ import { canonicalValueJson } from "./strict-codec.js";
6
+ import { materializeCanonicalCompactSharedStructures } from "./compact-shared-structure-validation.js";
7
+ import { parseSemanticCompactCapacity, parseSemanticCompactCatalogs, parseSemanticCompactExceptions, parseSemanticCompactFactSets, parseSemanticCompactObligations, parseSemanticCompactProofTemplates, parseSemanticCompactSelectors, } from "./semantic-fact-compact-parser.js";
8
+ import { SEMANTIC_COMPACT_CATALOG_COLLECTIONS, assertUniqueSemanticCompactKeys, emptySemanticCompactCollectionRows, indexSemanticFactRevisionInputs, legacySemanticFactRevisionDigest, legacySemanticObligationRevisionDigest, semanticFactRevisionDigest, semanticObligationRevisionDigest, semanticCompactCollectionRows, semanticCompactGeneration, semanticCompactSharedStructureTargets, resolveSemanticCompactSelectors, validateSemanticCompactCapacity, validateSemanticCompactDeclaredMaximum, } from "./semantic-fact-compact-support.js";
9
+ export { indexSemanticFactRevisionInputs, semanticFactRevisionDigest, semanticObligationRevisionDigest, } from "./semantic-fact-compact-support.js";
10
+ export const SEMANTIC_FACT_COMPACT_CARRIER_VERSION = "semantic-fact-compact-carrier-v1";
11
+ export function parseSemanticFactCompactCarrierShape(value) {
12
+ return parseSemanticFactCompactCarrier(value, false);
13
+ }
14
+ export function parseSemanticFactCompactCarrierForMigration(value) {
15
+ return parseSemanticFactCompactCarrier(value, true);
16
+ }
17
+ function parseSemanticFactCompactCarrier(value, allowLegacyRevisionIdentity) {
18
+ const label = "semantic_fact_compact_carrier";
19
+ const working = structuredClone(value);
20
+ const hadSharedStructures = Boolean(working &&
21
+ typeof working === "object" &&
22
+ Object.hasOwn(working, "shared_structures"));
23
+ if (allowLegacyRevisionIdentity && !hadSharedStructures) {
24
+ working.shared_structures = [];
25
+ addLegacyStructureCapacityFields(working.capacity);
26
+ }
27
+ const root = semanticObject(working, label, [
28
+ "schema_version",
29
+ "key",
30
+ "capacity",
31
+ "scope",
32
+ "inspector",
33
+ "selectors",
34
+ "shared_structures",
35
+ "catalogs",
36
+ "fact_sets",
37
+ "proof_templates",
38
+ "obligations",
39
+ "exceptions",
40
+ ]);
41
+ semanticLiteral(root.schema_version, [SEMANTIC_FACT_COMPACT_CARRIER_VERSION], `${label}.schema_version`);
42
+ const key = semanticStableRef(root.key, `${label}.key`);
43
+ const capacity = parseSemanticCompactCapacity(root.capacity, `${label}.capacity`);
44
+ validateSemanticCompactDeclaredMaximum(capacity.maximum, label);
45
+ const structureStatistics = hadSharedStructures
46
+ ? materializeCanonicalCompactSharedStructures(semanticCompactSharedStructureTargets(root), root.shared_structures, label)
47
+ : {
48
+ emitted_family_count: 0,
49
+ reference_count: 0,
50
+ argument_count: 0,
51
+ };
52
+ const selectors = parseSemanticCompactSelectors(root.selectors, `${label}.selectors`);
53
+ const catalogs = parseSemanticCompactCatalogs(root.catalogs, selectors, `${label}.catalogs`);
54
+ const factRows = parseSemanticCompactFactSets(root.fact_sets, selectors, `${label}.fact_sets`);
55
+ const proofTemplates = parseSemanticCompactProofTemplates(root.proof_templates, selectors, `${label}.proof_templates`);
56
+ const obligationRows = parseSemanticCompactObligations(root.obligations, proofTemplates, selectors, `${label}.obligations`);
57
+ parseSemanticCompactExceptions(root.exceptions, `${label}.exceptions`);
58
+ assertUniqueSemanticCompactKeys(factRows.map((item) => item.fact.key), `${label}.facts`);
59
+ assertUniqueSemanticCompactKeys(obligationRows.map((item) => item.proof.key), `${label}.obligations`);
60
+ const factKeys = new Set(factRows.map((item) => item.fact.key));
61
+ for (const row of obligationRows)
62
+ if (!factKeys.has(row.proof.fact_ref))
63
+ semanticFail(`${label}.obligations`, `unknown fact_key: ${row.proof.fact_ref}`);
64
+ const preliminary = parseSemanticFactManifestShape({
65
+ schema_version: "semantic-fact-manifest-v1",
66
+ key,
67
+ scope: resolveSemanticCompactSelectors(root.scope, selectors, `${label}.scope`),
68
+ inspector: {
69
+ ...resolveSemanticCompactSelectors(root.inspector, selectors, `${label}.inspector`),
70
+ census: [],
71
+ },
72
+ generation: semanticCompactGeneration(emptySemanticCompactCollectionRows(catalogs, factRows, obligationRows)),
73
+ ...catalogs,
74
+ facts: factRows.map((item) => item.fact),
75
+ proof_obligations: obligationRows.map((item) => item.proof),
76
+ });
77
+ preliminary.inspector.census = buildSemanticFactInspectorCensus(preliminary);
78
+ preliminary.generation = semanticCompactGeneration(semanticCompactCollectionRows(preliminary));
79
+ const manifest = parseSemanticFactManifestShape(preliminary);
80
+ const inputRevisionsByFact = indexSemanticFactRevisionInputs(manifest.inputs);
81
+ const currentFactRevisions = new Map(manifest.facts.map((fact) => [
82
+ fact.key,
83
+ semanticFactRevisionDigest(fact, inputRevisionsByFact),
84
+ ]));
85
+ for (const row of factRows) {
86
+ const key = semanticStableRef(row.fact.key, `${label}.fact_revision.key`);
87
+ const current = currentFactRevisions.get(key);
88
+ const legacy = legacySemanticFactRevisionDigest(row.fact);
89
+ if (row.revision_digest !== current &&
90
+ (!allowLegacyRevisionIdentity || row.revision_digest !== legacy))
91
+ semanticFail(`${label}.fact_revision.${key}`, `revision digest mismatch: ${row.revision_digest}:${current}`);
92
+ }
93
+ const currentObligationRevisions = new Map();
94
+ for (const row of obligationRows) {
95
+ const key = semanticStableRef(row.proof.key, `${label}.obligation_revision.key`);
96
+ const factRef = semanticStableRef(row.proof.fact_ref, `${label}.obligation_revision.fact_ref`);
97
+ const factRevision = currentFactRevisions.get(factRef);
98
+ if (!factRevision)
99
+ semanticFail(`${label}.obligation_revision.${key}`, `unknown fact revision: ${factRef}`);
100
+ const current = semanticObligationRevisionDigest(row.proof, factRevision);
101
+ const legacy = legacySemanticObligationRevisionDigest(row.proof);
102
+ if (row.revision_digest !== current &&
103
+ (!allowLegacyRevisionIdentity || row.revision_digest !== legacy))
104
+ semanticFail(`${label}.obligation_revision.${key}`, `revision digest mismatch: ${row.revision_digest}:${current}`);
105
+ currentObligationRevisions.set(key, current);
106
+ }
107
+ const measured = {
108
+ inputs: manifest.inputs.length,
109
+ catalog_rows: SEMANTIC_COMPACT_CATALOG_COLLECTIONS.reduce((sum, name) => sum + manifest[name].length, 0),
110
+ selector_members: [...selectors.values()].reduce((sum, members) => sum + members.length, 0),
111
+ structure_families: structureStatistics.emitted_family_count,
112
+ structure_references: structureStatistics.reference_count,
113
+ structure_arguments: structureStatistics.argument_count,
114
+ facts: manifest.facts.length,
115
+ obligations: manifest.proof_obligations.length,
116
+ census: manifest.inspector.census.length,
117
+ canonical_bytes: Buffer.byteLength(canonicalValueJson(manifest), "utf8"),
118
+ };
119
+ validateSemanticCompactCapacity(capacity, measured, label);
120
+ return {
121
+ manifest,
122
+ fact_revisions: factRows.map((item) => ({
123
+ key: semanticStableRef(item.fact.key, `${label}.fact_revision.key`),
124
+ revision_digest: currentFactRevisions.get(String(item.fact.key)),
125
+ })),
126
+ obligation_revisions: obligationRows.map((item) => ({
127
+ key: semanticStableRef(item.proof.key, `${label}.obligation_revision.key`),
128
+ revision_digest: currentObligationRevisions.get(String(item.proof.key)),
129
+ })),
130
+ measured,
131
+ };
132
+ }
133
+ function addLegacyStructureCapacityFields(value) {
134
+ if (!value || typeof value !== "object" || Array.isArray(value))
135
+ return;
136
+ const capacity = value;
137
+ for (const field of ["measured", "maximum"]) {
138
+ const counts = capacity[field];
139
+ if (!counts || typeof counts !== "object" || Array.isArray(counts))
140
+ continue;
141
+ const row = counts;
142
+ row.structure_families = 0;
143
+ row.structure_references = 0;
144
+ row.structure_arguments = 0;
145
+ }
146
+ }
@@ -0,0 +1,17 @@
1
+ import { type SemanticCompactCapacityCounts, type SemanticCompactCatalogs } from "./semantic-fact-compact-support.js";
2
+ export declare function parseSemanticCompactCapacity(value: unknown, label: string): {
3
+ measured: SemanticCompactCapacityCounts;
4
+ maximum: SemanticCompactCapacityCounts;
5
+ };
6
+ export declare function parseSemanticCompactSelectors(value: unknown, label: string): Map<string, string[]>;
7
+ export declare function parseSemanticCompactCatalogs(value: unknown, selectors: Map<string, string[]>, label: string): SemanticCompactCatalogs;
8
+ export declare function parseSemanticCompactFactSets(value: unknown, selectors: Map<string, string[]>, label: string): Array<{
9
+ fact: Record<string, unknown>;
10
+ revision_digest: string;
11
+ }>;
12
+ export declare function parseSemanticCompactProofTemplates(value: unknown, selectors: Map<string, string[]>, label: string): Map<string, Record<string, unknown>>;
13
+ export declare function parseSemanticCompactObligations(value: unknown, templates: Map<string, Record<string, unknown>>, selectors: Map<string, string[]>, label: string): Array<{
14
+ proof: Record<string, unknown>;
15
+ revision_digest: string;
16
+ }>;
17
+ export declare function parseSemanticCompactExceptions(value: unknown, label: string): void;
@@ -0,0 +1,168 @@
1
+ import { semanticArray, semanticFail, semanticInteger, semanticLiteral, semanticObject, semanticSha256, semanticStableRef, semanticStableRefs, semanticString, } from "./semantic-fact-shape-primitives.js";
2
+ import { SEMANTIC_COMPACT_CAPACITY_FIELDS, SEMANTIC_COMPACT_CATALOG_COLLECTIONS, plainSemanticCompactObject, resolveSemanticCompactSelectors, } from "./semantic-fact-compact-support.js";
3
+ export function parseSemanticCompactCapacity(value, label) {
4
+ const row = semanticObject(value, label, [
5
+ "theoretical_ground_universe",
6
+ "measured",
7
+ "maximum",
8
+ ]);
9
+ semanticLiteral(row.theoretical_ground_universe, ["not_materialized"], `${label}.theoretical_ground_universe`);
10
+ return {
11
+ measured: parseCapacityCounts(row.measured, `${label}.measured`),
12
+ maximum: parseCapacityCounts(row.maximum, `${label}.maximum`),
13
+ };
14
+ }
15
+ function parseCapacityCounts(value, label) {
16
+ const row = semanticObject(value, label, [
17
+ ...SEMANTIC_COMPACT_CAPACITY_FIELDS,
18
+ ]);
19
+ return Object.fromEntries(SEMANTIC_COMPACT_CAPACITY_FIELDS.map((field) => [
20
+ field,
21
+ semanticInteger(row[field], `${label}.${field}`),
22
+ ]));
23
+ }
24
+ export function parseSemanticCompactSelectors(value, label) {
25
+ const result = new Map();
26
+ for (const [index, item] of semanticArray(value, label).entries()) {
27
+ const itemLabel = `${label}[${index}]`;
28
+ const row = semanticObject(item, itemLabel, ["key", "members"]);
29
+ const key = semanticStableRef(row.key, `${itemLabel}.key`);
30
+ const members = semanticStableRefs(row.members, `${itemLabel}.members`);
31
+ if (result.has(key))
32
+ semanticFail(itemLabel, `duplicate key: ${key}`);
33
+ if (new Set(members).size !== members.length)
34
+ semanticFail(itemLabel, "members must be unique");
35
+ result.set(key, members);
36
+ }
37
+ return result;
38
+ }
39
+ export function parseSemanticCompactCatalogs(value, selectors, label) {
40
+ const row = semanticObject(value, label, [
41
+ ...SEMANTIC_COMPACT_CATALOG_COLLECTIONS,
42
+ ]);
43
+ return Object.fromEntries(SEMANTIC_COMPACT_CATALOG_COLLECTIONS.map((name) => [
44
+ name,
45
+ parseCompactTable(row[name], selectors, `${label}.${name}`),
46
+ ]));
47
+ }
48
+ export function parseSemanticCompactFactSets(value, selectors, label) {
49
+ const result = [];
50
+ const setKeys = new Set();
51
+ for (const [setIndex, item] of semanticArray(value, label).entries()) {
52
+ const setLabel = `${label}[${setIndex}]`;
53
+ const row = semanticObject(item, setLabel, [
54
+ "key",
55
+ "defaults",
56
+ "columns",
57
+ "rows",
58
+ ]);
59
+ const setKey = semanticStableRef(row.key, `${setLabel}.key`);
60
+ if (setKeys.has(setKey))
61
+ semanticFail(setLabel, `duplicate key: ${setKey}`);
62
+ setKeys.add(setKey);
63
+ const defaults = plainSemanticCompactObject(row.defaults, `${setLabel}.defaults`);
64
+ if (Object.hasOwn(defaults, "key"))
65
+ semanticFail(`${setLabel}.defaults`, "key cannot be defaulted");
66
+ const rows = parseCompactTable({ defaults, columns: row.columns, rows: row.rows }, selectors, setLabel);
67
+ for (const [rowIndex, factItem] of rows.entries()) {
68
+ const rowLabel = `${setLabel}.rows[${rowIndex}]`;
69
+ const factRow = plainSemanticCompactObject(factItem, rowLabel);
70
+ if (!Object.hasOwn(factRow, "fact_revision_digest"))
71
+ semanticFail(rowLabel, "missing fact_revision_digest");
72
+ const { fact_revision_digest: digestValue, ...fact } = factRow;
73
+ const revisionDigest = semanticSha256(digestValue, `${rowLabel}.fact_revision_digest`);
74
+ result.push({ fact, revision_digest: revisionDigest });
75
+ }
76
+ }
77
+ return result;
78
+ }
79
+ export function parseSemanticCompactProofTemplates(value, selectors, label) {
80
+ const result = new Map();
81
+ for (const [index, item] of semanticArray(value, label).entries()) {
82
+ const itemLabel = `${label}[${index}]`;
83
+ const row = semanticObject(item, itemLabel, ["key", "proof"]);
84
+ const key = semanticStableRef(row.key, `${itemLabel}.key`);
85
+ const proof = plainSemanticCompactObject(resolveSemanticCompactSelectors(row.proof, selectors, `${itemLabel}.proof`), `${itemLabel}.proof`);
86
+ if (Object.hasOwn(proof, "key") || Object.hasOwn(proof, "fact_ref"))
87
+ semanticFail(`${itemLabel}.proof`, "key and fact_ref belong to obligation rows");
88
+ if (result.has(key))
89
+ semanticFail(itemLabel, `duplicate key: ${key}`);
90
+ result.set(key, proof);
91
+ }
92
+ return result;
93
+ }
94
+ export function parseSemanticCompactObligations(value, templates, selectors, label) {
95
+ return parseCompactTable(value, selectors, label).map((item, index) => {
96
+ const itemLabel = `${label}[${index}]`;
97
+ const row = semanticObject(item, itemLabel, [
98
+ "obligation_key",
99
+ "obligation_revision_digest",
100
+ "fact_key",
101
+ "template_ref",
102
+ "overrides",
103
+ ]);
104
+ const obligationKey = semanticStableRef(row.obligation_key, `${itemLabel}.obligation_key`);
105
+ const factKey = semanticStableRef(row.fact_key, `${itemLabel}.fact_key`);
106
+ const templateRef = semanticStableRef(row.template_ref, `${itemLabel}.template_ref`);
107
+ const template = templates.get(templateRef);
108
+ if (!template)
109
+ semanticFail(`${itemLabel}.template_ref`, `unknown template: ${templateRef}`);
110
+ const overrides = plainSemanticCompactObject(resolveSemanticCompactSelectors(row.overrides, selectors, `${itemLabel}.overrides`), `${itemLabel}.overrides`);
111
+ if (Object.hasOwn(overrides, "key") || Object.hasOwn(overrides, "fact_ref"))
112
+ semanticFail(`${itemLabel}.overrides`, "key and fact_ref cannot be overridden");
113
+ const proof = {
114
+ ...template,
115
+ ...overrides,
116
+ key: obligationKey,
117
+ fact_ref: factKey,
118
+ };
119
+ const revisionDigest = semanticSha256(row.obligation_revision_digest, `${itemLabel}.obligation_revision_digest`);
120
+ return { proof, revision_digest: revisionDigest };
121
+ });
122
+ }
123
+ function parseCompactTable(value, selectors, label) {
124
+ const table = semanticObject(value, label, ["defaults", "columns", "rows"]);
125
+ const defaults = plainSemanticCompactObject(resolveSemanticCompactSelectors(table.defaults, selectors, `${label}.defaults`), `${label}.defaults`);
126
+ const columns = semanticArray(table.columns, `${label}.columns`).map((item, index) => {
127
+ const column = semanticString(item, `${label}.columns[${index}]`);
128
+ if (!/^[a-z][a-z0-9_]*$/u.test(column))
129
+ semanticFail(`${label}.columns[${index}]`, "invalid column name");
130
+ return column;
131
+ });
132
+ if (new Set(columns).size !== columns.length)
133
+ semanticFail(`${label}.columns`, "columns must be unique");
134
+ for (const column of columns)
135
+ if (Object.hasOwn(defaults, column))
136
+ semanticFail(`${label}.columns`, `column duplicates default field: ${column}`);
137
+ return semanticArray(table.rows, `${label}.rows`).map((item, index) => {
138
+ const rowLabel = `${label}.rows[${index}]`;
139
+ const values = semanticArray(item, rowLabel);
140
+ if (values.length !== columns.length)
141
+ semanticFail(rowLabel, `column count mismatch: ${values.length}:${columns.length}`);
142
+ return {
143
+ ...defaults,
144
+ ...Object.fromEntries(columns.map((column, columnIndex) => [
145
+ column,
146
+ resolveSemanticCompactSelectors(values[columnIndex], selectors, `${rowLabel}[${columnIndex}]`),
147
+ ])),
148
+ };
149
+ });
150
+ }
151
+ export function parseSemanticCompactExceptions(value, label) {
152
+ const seen = new Set();
153
+ for (const [index, item] of semanticArray(value, label).entries()) {
154
+ const itemLabel = `${label}[${index}]`;
155
+ const row = semanticObject(item, itemLabel, [
156
+ "key",
157
+ "target_ref",
158
+ "rationale",
159
+ ]);
160
+ const key = semanticStableRef(row.key, `${itemLabel}.key`);
161
+ semanticStableRef(row.target_ref, `${itemLabel}.target_ref`);
162
+ if (typeof row.rationale !== "string" || !row.rationale.trim())
163
+ semanticFail(`${itemLabel}.rationale`, "must be a non-empty string");
164
+ if (seen.has(key))
165
+ semanticFail(itemLabel, `duplicate key: ${key}`);
166
+ seen.add(key);
167
+ }
168
+ }
@@ -0,0 +1,11 @@
1
+ export interface SemanticFactRevisionInput {
2
+ key: string;
3
+ kind: string;
4
+ source_ref: string;
5
+ sha256: string;
6
+ }
7
+ export declare function indexSemanticFactRevisionInputs(inputs: readonly Record<string, unknown>[]): Map<string, SemanticFactRevisionInput[]>;
8
+ export declare function semanticFactRevisionDigest(fact: Record<string, unknown>, inputRevisionsByFact: ReadonlyMap<string, readonly SemanticFactRevisionInput[]>): string;
9
+ export declare function semanticObligationRevisionDigest(obligation: Record<string, unknown>, factRevisionDigest: string): string;
10
+ export declare function legacySemanticFactRevisionDigest(fact: Record<string, unknown>): string;
11
+ export declare function legacySemanticObligationRevisionDigest(obligation: Record<string, unknown>): string;
@@ -0,0 +1,64 @@
1
+ import { canonicalValueJson, sha256Hex } from "./strict-codec.js";
2
+ function normalizeLocatedValues(value) {
3
+ if (Array.isArray(value))
4
+ return value.map(normalizeLocatedValues);
5
+ if (!value || typeof value !== "object")
6
+ return value;
7
+ const row = value;
8
+ if (Object.hasOwn(row, "representation") &&
9
+ Object.hasOwn(row, "locator") &&
10
+ Object.hasOwn(row, "sha256")) {
11
+ const { locator: _locator, ...rest } = row;
12
+ return Object.fromEntries(Object.entries(rest).map(([key, item]) => [
13
+ key,
14
+ normalizeLocatedValues(item),
15
+ ]));
16
+ }
17
+ return Object.fromEntries(Object.entries(row).map(([key, item]) => [
18
+ key,
19
+ normalizeLocatedValues(item),
20
+ ]));
21
+ }
22
+ export function indexSemanticFactRevisionInputs(inputs) {
23
+ const result = new Map();
24
+ for (const input of inputs) {
25
+ const revision = {
26
+ key: String(input.key),
27
+ kind: String(input.kind),
28
+ source_ref: String(input.source_ref),
29
+ sha256: String(input.sha256),
30
+ };
31
+ const factRefs = Array.isArray(input.fact_refs) ? input.fact_refs : [];
32
+ for (const factRef of factRefs) {
33
+ const key = String(factRef);
34
+ const rows = result.get(key) ?? [];
35
+ rows.push(revision);
36
+ result.set(key, rows);
37
+ }
38
+ }
39
+ for (const rows of result.values())
40
+ rows.sort((left, right) => left.key.localeCompare(right.key));
41
+ return result;
42
+ }
43
+ export function semanticFactRevisionDigest(fact, inputRevisionsByFact) {
44
+ const { key: _key, ...meaning } = fact;
45
+ return sha256Hex(canonicalValueJson({
46
+ meaning: normalizeLocatedValues(meaning),
47
+ input_revisions: inputRevisionsByFact.get(String(fact.key)) ?? [],
48
+ }));
49
+ }
50
+ export function semanticObligationRevisionDigest(obligation, factRevisionDigest) {
51
+ const { key: _key, ...meaning } = obligation;
52
+ return sha256Hex(canonicalValueJson({
53
+ meaning: normalizeLocatedValues(meaning),
54
+ fact_revision_digest: factRevisionDigest,
55
+ }));
56
+ }
57
+ export function legacySemanticFactRevisionDigest(fact) {
58
+ const { key: _key, ...meaning } = fact;
59
+ return sha256Hex(canonicalValueJson(normalizeLocatedValues(meaning)));
60
+ }
61
+ export function legacySemanticObligationRevisionDigest(obligation) {
62
+ const { key: _key, ...meaning } = obligation;
63
+ return sha256Hex(canonicalValueJson(normalizeLocatedValues(meaning)));
64
+ }
@@ -0,0 +1,23 @@
1
+ import { type SemanticFactManifestCollectionName, type SemanticFactManifestV1 } from "./semantic-fact-types.js";
2
+ import type { CompactSharedStructureTarget } from "./compact-shared-structures.js";
3
+ export { SEMANTIC_COMPACT_CAPACITY_FIELDS, validateSemanticCompactCapacity, validateSemanticCompactDeclaredMaximum, type SemanticCompactCapacityCounts, } from "./semantic-fact-compact-capacity.js";
4
+ export { indexSemanticFactRevisionInputs, legacySemanticFactRevisionDigest, legacySemanticObligationRevisionDigest, semanticFactRevisionDigest, semanticObligationRevisionDigest, type SemanticFactRevisionInput, } from "./semantic-fact-compact-revision.js";
5
+ export declare const SEMANTIC_COMPACT_CATALOG_COLLECTIONS: readonly ["inputs", "family_dispositions", "subjects", "relations", "populations", "axis_dispositions", "condition_rules", "conditions", "condition_exclusions", "property_dispositions", "fact_cells", "oracles", "environments", "blockers"];
6
+ export type SemanticCompactCatalogs = Record<(typeof SEMANTIC_COMPACT_CATALOG_COLLECTIONS)[number], unknown[]>;
7
+ export declare function resolveSemanticCompactSelectors(value: unknown, selectors: Map<string, string[]>, label: string): unknown;
8
+ export declare function plainSemanticCompactObject(value: unknown, label: string): Record<string, unknown>;
9
+ export declare function assertUniqueSemanticCompactKeys(rows: unknown[], label: string): void;
10
+ export declare function emptySemanticCompactCollectionRows(catalogs: Record<(typeof SEMANTIC_COMPACT_CATALOG_COLLECTIONS)[number], unknown[]>, facts: Array<{
11
+ fact: Record<string, unknown>;
12
+ }>, obligations: Array<{
13
+ proof: Record<string, unknown>;
14
+ }>): Record<SemanticFactManifestCollectionName, Array<{
15
+ key: string;
16
+ }>>;
17
+ export declare function semanticCompactCollectionRows(manifest: SemanticFactManifestV1): Record<SemanticFactManifestCollectionName, Array<{
18
+ key: string;
19
+ }>>;
20
+ export declare function semanticCompactGeneration(rows: Record<SemanticFactManifestCollectionName, Array<{
21
+ key: string;
22
+ }>>): SemanticFactManifestV1["generation"];
23
+ export declare function semanticCompactSharedStructureTargets(root: Record<string, unknown>): CompactSharedStructureTarget[];
@@ -0,0 +1,159 @@
1
+ import { SEMANTIC_FACT_MANIFEST_COLLECTIONS, } from "./semantic-fact-types.js";
2
+ import { semanticFactCollectionIdentity } from "./semantic-fact-policy.js";
3
+ import { semanticFail, semanticStableRef, } from "./semantic-fact-shape-primitives.js";
4
+ export { SEMANTIC_COMPACT_CAPACITY_FIELDS, validateSemanticCompactCapacity, validateSemanticCompactDeclaredMaximum, } from "./semantic-fact-compact-capacity.js";
5
+ export { indexSemanticFactRevisionInputs, legacySemanticFactRevisionDigest, legacySemanticObligationRevisionDigest, semanticFactRevisionDigest, semanticObligationRevisionDigest, } from "./semantic-fact-compact-revision.js";
6
+ export const SEMANTIC_COMPACT_CATALOG_COLLECTIONS = [
7
+ "inputs",
8
+ "family_dispositions",
9
+ "subjects",
10
+ "relations",
11
+ "populations",
12
+ "axis_dispositions",
13
+ "condition_rules",
14
+ "conditions",
15
+ "condition_exclusions",
16
+ "property_dispositions",
17
+ "fact_cells",
18
+ "oracles",
19
+ "environments",
20
+ "blockers",
21
+ ];
22
+ export function resolveSemanticCompactSelectors(value, selectors, label) {
23
+ if (Array.isArray(value))
24
+ return value.map((item, index) => resolveSemanticCompactSelectors(item, selectors, `${label}[${index}]`));
25
+ if (!value || typeof value !== "object")
26
+ return value;
27
+ const row = value;
28
+ if (Object.keys(row).length === 1 && Object.hasOwn(row, "selector_ref")) {
29
+ const selectorRef = semanticStableRef(row.selector_ref, `${label}.selector_ref`);
30
+ const members = selectors.get(selectorRef);
31
+ if (!members)
32
+ semanticFail(`${label}.selector_ref`, `unknown selector: ${selectorRef}`);
33
+ return [...members];
34
+ }
35
+ if (Object.hasOwn(row, "selector_ref"))
36
+ semanticFail(label, "selector_ref must be the only key in its object");
37
+ return Object.fromEntries(Object.entries(row).map(([key, item]) => [
38
+ key,
39
+ resolveSemanticCompactSelectors(item, selectors, `${label}.${key}`),
40
+ ]));
41
+ }
42
+ export function plainSemanticCompactObject(value, label) {
43
+ if (!value || typeof value !== "object" || Array.isArray(value))
44
+ semanticFail(label, "must be an object");
45
+ return value;
46
+ }
47
+ export function assertUniqueSemanticCompactKeys(rows, label) {
48
+ const seen = new Set();
49
+ for (const [index, keyValue] of rows.entries()) {
50
+ const key = semanticStableRef(keyValue, `${label}[${index}].key`);
51
+ if (seen.has(key))
52
+ semanticFail(label, `duplicate key: ${key}`);
53
+ seen.add(key);
54
+ }
55
+ }
56
+ export function emptySemanticCompactCollectionRows(catalogs, facts, obligations) {
57
+ return {
58
+ ...Object.fromEntries(SEMANTIC_COMPACT_CATALOG_COLLECTIONS.map((name) => [
59
+ name,
60
+ catalogs[name],
61
+ ])),
62
+ inspector_census: [],
63
+ facts: facts.map((item) => item.fact),
64
+ proof_obligations: obligations.map((item) => item.proof),
65
+ };
66
+ }
67
+ export function semanticCompactCollectionRows(manifest) {
68
+ return {
69
+ inputs: manifest.inputs,
70
+ inspector_census: manifest.inspector.census,
71
+ family_dispositions: manifest.family_dispositions,
72
+ subjects: manifest.subjects,
73
+ relations: manifest.relations,
74
+ populations: manifest.populations,
75
+ axis_dispositions: manifest.axis_dispositions,
76
+ condition_rules: manifest.condition_rules,
77
+ conditions: manifest.conditions,
78
+ condition_exclusions: manifest.condition_exclusions,
79
+ property_dispositions: manifest.property_dispositions,
80
+ fact_cells: manifest.fact_cells,
81
+ facts: manifest.facts,
82
+ proof_obligations: manifest.proof_obligations,
83
+ oracles: manifest.oracles,
84
+ environments: manifest.environments,
85
+ blockers: manifest.blockers,
86
+ };
87
+ }
88
+ export function semanticCompactGeneration(rows) {
89
+ return {
90
+ strategy: "complete_explicit",
91
+ sampling: "forbidden",
92
+ truncation: "forbidden",
93
+ chunk_count: 1,
94
+ chunk_indexes: [0],
95
+ collections: SEMANTIC_FACT_MANIFEST_COLLECTIONS.map((name) => ({
96
+ name,
97
+ expected_count: rows[name].length,
98
+ identity_sha256: semanticFactCollectionIdentity(rows[name]),
99
+ })),
100
+ };
101
+ }
102
+ export function semanticCompactSharedStructureTargets(root) {
103
+ const targets = [];
104
+ addObjectFieldTargets(targets, root.scope, "source.scope");
105
+ addObjectFieldTargets(targets, root.inspector, "source.inspector");
106
+ const catalogs = plainRecord(root.catalogs);
107
+ for (const name of SEMANTIC_COMPACT_CATALOG_COLLECTIONS)
108
+ addCompactTableTargets(targets, catalogs?.[name], `source.catalog.${name}`);
109
+ if (Array.isArray(root.fact_sets))
110
+ for (const factSet of root.fact_sets)
111
+ addCompactTableTargets(targets, factSet, "source.fact");
112
+ if (Array.isArray(root.proof_templates))
113
+ for (const template of root.proof_templates) {
114
+ const row = plainRecord(template);
115
+ if (row && Object.hasOwn(row, "proof"))
116
+ addTarget(targets, row, "proof", "source.proof.policy");
117
+ }
118
+ addCompactTableTargets(targets, root.obligations, "source.obligation");
119
+ return targets;
120
+ }
121
+ function addCompactTableTargets(targets, value, boundary) {
122
+ const table = plainRecord(value);
123
+ if (!table || !Array.isArray(table.columns) || !Array.isArray(table.rows))
124
+ return;
125
+ const columns = table.columns.map(String);
126
+ addObjectFieldTargets(targets, table.defaults, `${boundary}.default`);
127
+ for (const rowValue of table.rows) {
128
+ if (!Array.isArray(rowValue) || rowValue.length !== columns.length)
129
+ continue;
130
+ for (const [index, column] of columns.entries())
131
+ if (isComposite(rowValue[index]))
132
+ addTarget(targets, rowValue, index, `${boundary}.${column}`);
133
+ }
134
+ }
135
+ function addObjectFieldTargets(targets, value, boundary) {
136
+ const row = plainRecord(value);
137
+ if (!row)
138
+ return;
139
+ for (const key of Object.keys(row))
140
+ if (isComposite(row[key]))
141
+ addTarget(targets, row, key, `${boundary}.${key}`);
142
+ }
143
+ function addTarget(targets, parent, key, boundary) {
144
+ targets.push({
145
+ boundary,
146
+ read: () => parent[key],
147
+ write: (value) => {
148
+ parent[key] = value;
149
+ },
150
+ });
151
+ }
152
+ function plainRecord(value) {
153
+ return value && typeof value === "object" && !Array.isArray(value)
154
+ ? value
155
+ : null;
156
+ }
157
+ function isComposite(value) {
158
+ return Boolean(value && typeof value === "object");
159
+ }
@@ -1,2 +1,3 @@
1
1
  import type { SemanticFactManifestV1 } from "./semantic-fact-types.js";
2
2
  export declare function validateSemanticFactInspectorCensus(manifest: SemanticFactManifestV1): void;
3
+ export declare function buildSemanticFactInspectorCensus(manifest: SemanticFactManifestV1): SemanticFactManifestV1["inspector"]["census"];