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,140 @@
1
+ import { DESIGN_RESOURCE_SYMBOLIC_FACT_POLICY } from "./design-resource-symbolic-fact-policy.js";
2
+ import { SymbolicDecisionDagBuilder } from "./symbolic-denotation-dag-builder.js";
3
+ import { validateSymbolicDomains, validateSymbolicLimits, } from "./symbolic-denotation-domain-validation.js";
4
+ import { buildSymbolicRuntimeAxes, symbolicEdgeMatches, } from "./symbolic-denotation-runtime.js";
5
+ import { compareText, domainCardinality, invalid, sha256, stableJson, } from "./symbolic-denotation-support.js";
6
+ import { validateSymbolicPredicate, } from "./symbolic-denotation-validation.js";
7
+ export const DEFAULT_SYMBOLIC_DENOTATION_COMPLEXITY_LIMITS = {
8
+ max_predicate_depth: 32,
9
+ max_input_predicate_nodes: 4_096,
10
+ max_canonical_dag_nodes: 8_192,
11
+ max_partition_edges: 65_536,
12
+ max_canonical_bytes: 4_194_304,
13
+ };
14
+ export function compileSymbolicDenotation(domainsInput, predicateInput, limits = DEFAULT_SYMBOLIC_DENOTATION_COMPLEXITY_LIMITS) {
15
+ return createSymbolicDenotationCompilationSession(domainsInput, [predicateInput], limits).compile(predicateInput);
16
+ }
17
+ export class SymbolicDenotationCompilationSession {
18
+ limits;
19
+ domains;
20
+ domainIndex;
21
+ numberCuts = new Map();
22
+ builder;
23
+ compiled = new Map();
24
+ theoreticalGroundCardinality;
25
+ compileRequests = 0;
26
+ compileCacheHits = 0;
27
+ constructor(domainsInput, seedPredicates, limits = DEFAULT_SYMBOLIC_DENOTATION_COMPLEXITY_LIMITS) {
28
+ if (!seedPredicates.length)
29
+ invalid("compilation_session_seeds_required", "");
30
+ this.limits = validateSymbolicLimits(limits);
31
+ this.domains = validateSymbolicDomains(domainsInput);
32
+ this.domainIndex = new Map(this.domains.map((domain, index) => [domain.key, index]));
33
+ const uniqueSeeds = new Map(seedPredicates.map((predicate) => [stableJson(predicate), predicate]));
34
+ for (const predicate of uniqueSeeds.values())
35
+ mergeNumberCuts(this.numberCuts, this.inspect(predicate).number_cuts);
36
+ const axes = buildSymbolicRuntimeAxes(this.domains, this.numberCuts);
37
+ this.builder = new SymbolicDecisionDagBuilder(axes, this.limits);
38
+ this.theoreticalGroundCardinality = this.domains
39
+ .reduce((total, domain) => total * domainCardinality(domain), 1n)
40
+ .toString();
41
+ }
42
+ compile(predicateInput) {
43
+ this.compileRequests += 1;
44
+ const inspection = this.inspect(predicateInput);
45
+ assertKnownNumberCuts(this.numberCuts, inspection.number_cuts);
46
+ const predicate = validateSymbolicPredicate(predicateInput, this.domains, this.domainIndex, { input_nodes: 0, number_cuts: new Map() }, 1, this.limits);
47
+ const memoKey = stableJson(predicate);
48
+ const cached = this.compiled.get(memoKey);
49
+ if (cached) {
50
+ this.compileCacheHits += 1;
51
+ return cached;
52
+ }
53
+ const rootId = this.builder.predicate(predicate, this.domainIndex);
54
+ const canonicalDag = this.builder.canonicalize(rootId);
55
+ const canonicalJson = stableJson(canonicalDag);
56
+ const canonicalBytes = Buffer.byteLength(canonicalJson, "utf8");
57
+ checkCanonicalBytes(canonicalBytes, this.limits.max_canonical_bytes);
58
+ const partitionEdges = canonicalDag.nodes.reduce((total, node) => total + node.edges.length, 0);
59
+ const referencedAxisRefs = [
60
+ ...new Set(canonicalDag.nodes.map((node) => node.axis_ref)),
61
+ ].sort(compareText);
62
+ const referenced = new Set(referencedAxisRefs);
63
+ const result = {
64
+ canonical_dag: canonicalDag,
65
+ canonical_sha256: sha256(canonicalJson),
66
+ canonical_bytes: canonicalBytes,
67
+ referenced_axis_refs: referencedAxisRefs,
68
+ omitted_axis_refs: this.domains
69
+ .map((domain) => domain.key)
70
+ .filter((axisRef) => !referenced.has(axisRef)),
71
+ theoretical_ground_cardinality: this.theoreticalGroundCardinality,
72
+ metrics: {
73
+ input_predicate_nodes: inspection.input_nodes,
74
+ canonical_dag_nodes: canonicalDag.nodes.length,
75
+ partition_edges: partitionEdges,
76
+ canonical_bytes: canonicalBytes,
77
+ },
78
+ };
79
+ this.compiled.set(memoKey, result);
80
+ return result;
81
+ }
82
+ statistics() {
83
+ return {
84
+ axis_partition_builds: 1,
85
+ compile_requests: this.compileRequests,
86
+ compile_cache_hits: this.compileCacheHits,
87
+ unique_compiled_predicates: this.compiled.size,
88
+ };
89
+ }
90
+ inspect(predicate) {
91
+ const inspection = {
92
+ input_nodes: 0,
93
+ number_cuts: new Map(),
94
+ };
95
+ validateSymbolicPredicate(predicate, this.domains, this.domainIndex, inspection, 1, this.limits);
96
+ return inspection;
97
+ }
98
+ }
99
+ export function createSymbolicDenotationCompilationSession(domains, seedPredicates, limits = DEFAULT_SYMBOLIC_DENOTATION_COMPLEXITY_LIMITS) {
100
+ return new SymbolicDenotationCompilationSession(domains, seedPredicates, limits);
101
+ }
102
+ function mergeNumberCuts(target, source) {
103
+ for (const [axisRef, cuts] of source) {
104
+ const values = target.get(axisRef) ?? new Set();
105
+ cuts.forEach((cut) => values.add(cut));
106
+ target.set(axisRef, values);
107
+ }
108
+ }
109
+ function assertKnownNumberCuts(known, actual) {
110
+ for (const [axisRef, cuts] of actual)
111
+ for (const cut of cuts)
112
+ if (!known.get(axisRef)?.has(cut))
113
+ invalid("compilation_session_axis_partition_stale", `${axisRef}:${cut}`);
114
+ }
115
+ function checkCanonicalBytes(actual, limit) {
116
+ if (actual > limit)
117
+ invalid("canonical_byte_limit_exceeded", `actual=${actual}:limit=${limit}`);
118
+ }
119
+ export function evaluateCanonicalSymbolicDenotation(dag, assignment) {
120
+ const nodes = new Map(dag.nodes.map((node) => [node.key, node]));
121
+ let current = dag.root_ref;
122
+ const visited = new Set();
123
+ while (current !== "terminal.true" && current !== "terminal.false") {
124
+ if (visited.has(current))
125
+ invalid("canonical_dag_cycle", current);
126
+ visited.add(current);
127
+ const node = nodes.get(current);
128
+ if (!node)
129
+ invalid("canonical_dag_node_unknown", current);
130
+ const value = assignment[node.axis_ref];
131
+ if (value === undefined)
132
+ invalid("canonical_dag_assignment_missing", node.axis_ref);
133
+ const matches = node.edges.filter((edge) => symbolicEdgeMatches(edge, value));
134
+ if (matches.length !== 1)
135
+ invalid("canonical_dag_assignment_partition_invalid", `${node.axis_ref}:matches=${matches.length}`);
136
+ current = matches[0].child_ref;
137
+ }
138
+ return current === "terminal.true";
139
+ }
140
+ void DESIGN_RESOURCE_SYMBOLIC_FACT_POLICY.symbolic_denotation_efficiency_delivery;
@@ -0,0 +1,11 @@
1
+ import { denoteDesignResourceSymbolicPoint } from "./design-resource-symbolic-denotation.js";
2
+ import { compileSymbolicDenotation, evaluateCanonicalSymbolicDenotation } from "./symbolic-denotation-engine.js";
3
+ export declare const symbolicDenotation: Readonly<{
4
+ compile: typeof compileSymbolicDenotation;
5
+ evaluate: typeof evaluateCanonicalSymbolicDenotation;
6
+ denoteDesignPoint: typeof denoteDesignResourceSymbolicPoint;
7
+ sourceIr: Readonly<{
8
+ mediaType: "application/vnd.ty-context.symbolic-source-ir+json";
9
+ schemaVersion: "design-resource-symbolic-source-ir-v1";
10
+ }>;
11
+ }>;
@@ -0,0 +1,12 @@
1
+ import { denoteDesignResourceSymbolicPoint } from "./design-resource-symbolic-denotation.js";
2
+ import { compileSymbolicDenotation, evaluateCanonicalSymbolicDenotation, } from "./symbolic-denotation-engine.js";
3
+ import { DESIGN_RESOURCE_SYMBOLIC_SOURCE_IR_MEDIA_TYPE, DESIGN_RESOURCE_SYMBOLIC_SOURCE_IR_SCHEMA_VERSION, } from "./design-resource-symbolic-source-ir-types.js";
4
+ export const symbolicDenotation = Object.freeze({
5
+ compile: compileSymbolicDenotation,
6
+ evaluate: evaluateCanonicalSymbolicDenotation,
7
+ denoteDesignPoint: denoteDesignResourceSymbolicPoint,
8
+ sourceIr: Object.freeze({
9
+ mediaType: DESIGN_RESOURCE_SYMBOLIC_SOURCE_IR_MEDIA_TYPE,
10
+ schemaVersion: DESIGN_RESOURCE_SYMBOLIC_SOURCE_IR_SCHEMA_VERSION,
11
+ }),
12
+ });
@@ -0,0 +1,20 @@
1
+ import type { SymbolicDenotationAxisDomain, SymbolicDenotationCanonicalEdgeV1, SymbolicDenotationScalar } from "./symbolic-denotation-types.js";
2
+ interface EnumSegment {
3
+ kind: "enum";
4
+ values: string[];
5
+ }
6
+ interface NumberSegment {
7
+ kind: "number";
8
+ minimum: number;
9
+ maximum: number;
10
+ }
11
+ export type SymbolicAxisSegment = EnumSegment | NumberSegment;
12
+ export interface SymbolicRuntimeAxis {
13
+ domain: SymbolicDenotationAxisDomain;
14
+ segments: SymbolicAxisSegment[];
15
+ }
16
+ export declare function buildSymbolicRuntimeAxes(domains: SymbolicDenotationAxisDomain[], numberCuts: ReadonlyMap<string, Set<number>>): SymbolicRuntimeAxis[];
17
+ export declare function canonicalSymbolicEdges(axis: SymbolicRuntimeAxis, childRefs: string[]): SymbolicDenotationCanonicalEdgeV1[];
18
+ export declare function symbolicEdgeMatches(edge: SymbolicDenotationCanonicalEdgeV1, value: SymbolicDenotationScalar): boolean;
19
+ export declare function symbolicSegmentMatches(segment: SymbolicAxisSegment, matches: (value: SymbolicDenotationScalar) => boolean): boolean;
20
+ export {};
@@ -0,0 +1,90 @@
1
+ import { compareText, invalid } from "./symbolic-denotation-support.js";
2
+ export function buildSymbolicRuntimeAxes(domains, numberCuts) {
3
+ return domains.map((domain) => {
4
+ if (domain.kind === "enum")
5
+ return {
6
+ domain,
7
+ segments: domain.values.map((value) => ({
8
+ kind: "enum",
9
+ values: [value],
10
+ })),
11
+ };
12
+ return { domain, segments: buildNumberSegments(domain, numberCuts) };
13
+ });
14
+ }
15
+ function buildNumberSegments(domain, numberCuts) {
16
+ const cuts = new Set([
17
+ domain.minimum,
18
+ domain.maximum + 1,
19
+ ...(numberCuts.get(domain.key) ?? []),
20
+ ]);
21
+ const sorted = [...cuts]
22
+ .filter((value) => value >= domain.minimum && value <= domain.maximum + 1)
23
+ .sort((left, right) => left - right);
24
+ const segments = [];
25
+ for (let index = 0; index < sorted.length - 1; index += 1) {
26
+ const minimum = sorted[index];
27
+ const maximum = sorted[index + 1] - 1;
28
+ if (minimum <= maximum)
29
+ segments.push({ kind: "number", minimum, maximum });
30
+ }
31
+ return segments;
32
+ }
33
+ export function canonicalSymbolicEdges(axis, childRefs) {
34
+ return axis.domain.kind === "enum"
35
+ ? canonicalEnumEdges(axis, childRefs)
36
+ : canonicalNumberEdges(axis, childRefs);
37
+ }
38
+ function canonicalEnumEdges(axis, childRefs) {
39
+ const groups = new Map();
40
+ axis.segments.forEach((segment, index) => {
41
+ const values = groups.get(childRefs[index]) ?? [];
42
+ values.push(...segment.values);
43
+ groups.set(childRefs[index], values);
44
+ });
45
+ return [...groups.entries()]
46
+ .map(([child_ref, values]) => ({
47
+ region: { kind: "enum_set", values },
48
+ child_ref,
49
+ }))
50
+ .sort((left, right) => compareText(left.region.values[0], right.region.values[0]));
51
+ }
52
+ function canonicalNumberEdges(axis, childRefs) {
53
+ const edges = [];
54
+ axis.segments.forEach((segment, index) => {
55
+ const numeric = segment;
56
+ const previous = edges.at(-1);
57
+ if (previous?.region.kind === "integer_range" &&
58
+ previous.child_ref === childRefs[index] &&
59
+ previous.region.maximum + 1 === numeric.minimum) {
60
+ previous.region.maximum = numeric.maximum;
61
+ return;
62
+ }
63
+ edges.push({
64
+ region: {
65
+ kind: "integer_range",
66
+ minimum: numeric.minimum,
67
+ maximum: numeric.maximum,
68
+ },
69
+ child_ref: childRefs[index],
70
+ });
71
+ });
72
+ return edges;
73
+ }
74
+ export function symbolicEdgeMatches(edge, value) {
75
+ if (edge.region.kind === "enum_set")
76
+ return typeof value === "string" && edge.region.values.includes(value);
77
+ return (typeof value === "number" &&
78
+ Number.isSafeInteger(value) &&
79
+ value >= edge.region.minimum &&
80
+ value <= edge.region.maximum);
81
+ }
82
+ export function symbolicSegmentMatches(segment, matches) {
83
+ if (segment.kind === "enum")
84
+ return matches(segment.values[0]);
85
+ const atMinimum = matches(segment.minimum);
86
+ const atMaximum = matches(segment.maximum);
87
+ if (atMinimum !== atMaximum)
88
+ invalid("numeric_partition_not_theory_complete", `${segment.minimum}:${segment.maximum}`);
89
+ return atMinimum;
90
+ }
@@ -0,0 +1,11 @@
1
+ import type { SymbolicDenotationAxisDomain, SymbolicDenotationScalar } from "./symbolic-denotation-types.js";
2
+ export declare function exactKeys(value: object, expected: string[], label: string): void;
3
+ export declare function stableKey(value: unknown, label: string): asserts value is string;
4
+ export declare function stableJson(value: unknown): string;
5
+ export declare function sha256(value: string): string;
6
+ export declare function compareText(left: string, right: string): number;
7
+ export declare function compareScalar(left: SymbolicDenotationScalar, right: SymbolicDenotationScalar): number;
8
+ export declare function scalarEqual(left: SymbolicDenotationScalar, right: SymbolicDenotationScalar): boolean;
9
+ export declare function domainCardinality(domain: SymbolicDenotationAxisDomain): bigint;
10
+ export declare function neverValue(value: never): string;
11
+ export declare function invalid(code: string, detail: string): never;
@@ -0,0 +1,49 @@
1
+ import { createHash } from "node:crypto";
2
+ export function exactKeys(value, expected, label) {
3
+ const actual = Object.keys(value).sort(compareText);
4
+ const required = [...expected].sort(compareText);
5
+ if (actual.length !== required.length ||
6
+ actual.some((key, index) => key !== required[index]))
7
+ invalid("shape_keys_invalid", `${label}:actual=${actual.join(",")}:expected=${required.join(",")}`);
8
+ }
9
+ export function stableKey(value, label) {
10
+ if (typeof value !== "string" || !/^[a-z0-9][a-z0-9._-]*$/u.test(value))
11
+ invalid("stable_key_invalid", `${label}:${String(value)}`);
12
+ }
13
+ export function stableJson(value) {
14
+ if (Array.isArray(value))
15
+ return `[${value.map((item) => stableJson(item)).join(",")}]`;
16
+ if (value && typeof value === "object")
17
+ return `{${Object.entries(value)
18
+ .sort(([left], [right]) => compareText(left, right))
19
+ .map(([key, entry]) => `${JSON.stringify(key)}:${stableJson(entry)}`)
20
+ .join(",")}}`;
21
+ return JSON.stringify(value);
22
+ }
23
+ export function sha256(value) {
24
+ return createHash("sha256").update(value).digest("hex");
25
+ }
26
+ export function compareText(left, right) {
27
+ return left < right ? -1 : left > right ? 1 : 0;
28
+ }
29
+ export function compareScalar(left, right) {
30
+ if (typeof left !== typeof right)
31
+ return typeof left === "number" ? -1 : 1;
32
+ return typeof left === "number"
33
+ ? left - right
34
+ : compareText(left, right);
35
+ }
36
+ export function scalarEqual(left, right) {
37
+ return typeof left === typeof right && left === right;
38
+ }
39
+ export function domainCardinality(domain) {
40
+ return domain.kind === "enum"
41
+ ? BigInt(domain.values.length)
42
+ : BigInt(domain.maximum) - BigInt(domain.minimum) + 1n;
43
+ }
44
+ export function neverValue(value) {
45
+ return String(value);
46
+ }
47
+ export function invalid(code, detail) {
48
+ throw new Error(`symbolic_denotation_invalid:${code}:${detail}`);
49
+ }
@@ -0,0 +1,133 @@
1
+ export type SymbolicDenotationScalar = string | number;
2
+ export type SymbolicDenotationAxisDomain = {
3
+ key: string;
4
+ kind: "enum";
5
+ values: string[];
6
+ } | {
7
+ key: string;
8
+ kind: "bounded_number";
9
+ minimum: number;
10
+ maximum: number;
11
+ integer: true;
12
+ };
13
+ export type SymbolicDenotationPredicate = {
14
+ op: "eq";
15
+ axis_ref: string;
16
+ value: SymbolicDenotationScalar;
17
+ } | {
18
+ op: "in";
19
+ axis_ref: string;
20
+ values: SymbolicDenotationScalar[];
21
+ } | {
22
+ op: "range";
23
+ axis_ref: string;
24
+ minimum: number;
25
+ maximum: number;
26
+ minimum_inclusive: boolean;
27
+ maximum_inclusive: boolean;
28
+ } | {
29
+ op: "all" | "any";
30
+ predicates: SymbolicDenotationPredicate[];
31
+ } | {
32
+ op: "not";
33
+ predicate: SymbolicDenotationPredicate;
34
+ };
35
+ export interface SymbolicDenotationComplexityLimits {
36
+ max_predicate_depth: number;
37
+ max_input_predicate_nodes: number;
38
+ max_canonical_dag_nodes: number;
39
+ max_partition_edges: number;
40
+ max_canonical_bytes: number;
41
+ }
42
+ export interface SymbolicDenotationCanonicalDagV1 {
43
+ schema_version: "symbolic-denotation-canonical-dag-v1";
44
+ root_ref: string;
45
+ nodes: SymbolicDenotationCanonicalNodeV1[];
46
+ }
47
+ export interface SymbolicDenotationCanonicalNodeV1 {
48
+ key: string;
49
+ axis_ref: string;
50
+ edges: SymbolicDenotationCanonicalEdgeV1[];
51
+ }
52
+ export type SymbolicDenotationCanonicalEdgeV1 = {
53
+ region: {
54
+ kind: "enum_set";
55
+ values: string[];
56
+ };
57
+ child_ref: string;
58
+ } | {
59
+ region: {
60
+ kind: "integer_range";
61
+ minimum: number;
62
+ maximum: number;
63
+ };
64
+ child_ref: string;
65
+ };
66
+ export interface CompiledSymbolicDenotationV1 {
67
+ canonical_dag: SymbolicDenotationCanonicalDagV1;
68
+ canonical_sha256: string;
69
+ canonical_bytes: number;
70
+ referenced_axis_refs: string[];
71
+ omitted_axis_refs: string[];
72
+ theoretical_ground_cardinality: string;
73
+ metrics: {
74
+ input_predicate_nodes: number;
75
+ canonical_dag_nodes: number;
76
+ partition_edges: number;
77
+ canonical_bytes: number;
78
+ };
79
+ }
80
+ export declare const SYMBOLIC_DENOTATION_DISPOSITIONS: readonly ["specified", "not_applicable", "excluded", "decision_required", "unavailable", "blocking"];
81
+ export type SymbolicDenotationDisposition = (typeof SYMBOLIC_DENOTATION_DISPOSITIONS)[number];
82
+ export declare const SYMBOLIC_DENOTATION_QUANTIFIERS: readonly ["one", "all", "any", "none", "exactly", "at_least", "at_most", "range"];
83
+ export type SymbolicDenotationQuantifier = (typeof SYMBOLIC_DENOTATION_QUANTIFIERS)[number];
84
+ export interface SymbolicExtensionalPointV1 {
85
+ subject_or_relation_ref: string;
86
+ target_ref: string;
87
+ condition_assignment: Record<string, SymbolicDenotationScalar>;
88
+ variation_assignment: Record<string, SymbolicDenotationScalar>;
89
+ property_ref: string;
90
+ population_ref: string | null;
91
+ quantifier: {
92
+ kind: SymbolicDenotationQuantifier;
93
+ minimum: number | null;
94
+ maximum: number | null;
95
+ };
96
+ }
97
+ export interface SymbolicExpectedSemanticsV1 {
98
+ value_type: string;
99
+ expected: {
100
+ locator: {
101
+ resource_ref: string;
102
+ kind: string;
103
+ value: string;
104
+ };
105
+ sha256: string;
106
+ };
107
+ provenance_ref: string;
108
+ sensitivity: string;
109
+ population_ref: string | null;
110
+ quantifier: SymbolicExtensionalPointV1["quantifier"];
111
+ lineage: unknown;
112
+ }
113
+ export interface SymbolicProofObligationDenotationV1 {
114
+ method: string;
115
+ proof_surface: string;
116
+ observation_boundary: string;
117
+ comparison: {
118
+ comparator: string;
119
+ mode: "exact" | "tolerance";
120
+ parameters: unknown;
121
+ tolerance: unknown;
122
+ mask: unknown;
123
+ };
124
+ oracle: unknown;
125
+ environment: unknown;
126
+ protected_value_policy: string;
127
+ completion_effect: string;
128
+ }
129
+ export interface SymbolicPointDenotationV1 {
130
+ disposition: SymbolicDenotationDisposition;
131
+ expected_semantics: SymbolicExpectedSemanticsV1 | null;
132
+ proof_obligations: SymbolicProofObligationDenotationV1[];
133
+ }
@@ -0,0 +1,18 @@
1
+ export const SYMBOLIC_DENOTATION_DISPOSITIONS = [
2
+ "specified",
3
+ "not_applicable",
4
+ "excluded",
5
+ "decision_required",
6
+ "unavailable",
7
+ "blocking",
8
+ ];
9
+ export const SYMBOLIC_DENOTATION_QUANTIFIERS = [
10
+ "one",
11
+ "all",
12
+ "any",
13
+ "none",
14
+ "exactly",
15
+ "at_least",
16
+ "at_most",
17
+ "range",
18
+ ];
@@ -0,0 +1,6 @@
1
+ import type { SymbolicDenotationAxisDomain, SymbolicDenotationComplexityLimits, SymbolicDenotationPredicate } from "./symbolic-denotation-types.js";
2
+ export interface SymbolicPredicateInspection {
3
+ input_nodes: number;
4
+ number_cuts: Map<string, Set<number>>;
5
+ }
6
+ export declare function validateSymbolicPredicate(input: SymbolicDenotationPredicate, domains: SymbolicDenotationAxisDomain[], domainIndex: ReadonlyMap<string, number>, inspection: SymbolicPredicateInspection, depth: number, limits: SymbolicDenotationComplexityLimits): SymbolicDenotationPredicate;
@@ -0,0 +1,126 @@
1
+ import { compareScalar, exactKeys, invalid, } from "./symbolic-denotation-support.js";
2
+ export function validateSymbolicPredicate(input, domains, domainIndex, inspection, depth, limits) {
3
+ inspectPredicateNode(input, depth, inspection, limits);
4
+ switch (input.op) {
5
+ case "eq":
6
+ return validateEq(input, domains, domainIndex, inspection);
7
+ case "in":
8
+ return validateIn(input, domains, domainIndex, inspection);
9
+ case "range":
10
+ return validateRange(input, domains, domainIndex, inspection);
11
+ case "all":
12
+ case "any":
13
+ return validateGroup(input, domains, domainIndex, inspection, depth, limits);
14
+ case "not":
15
+ return validateNot(input, domains, domainIndex, inspection, depth, limits);
16
+ default:
17
+ return invalid("predicate_operator_unknown", String(input.op));
18
+ }
19
+ }
20
+ function inspectPredicateNode(input, depth, inspection, limits) {
21
+ if (!input || typeof input !== "object" || Array.isArray(input))
22
+ invalid("predicate_invalid", "not_object");
23
+ if (depth > limits.max_predicate_depth)
24
+ invalid("predicate_depth_limit_exceeded", `actual=${depth}:limit=${limits.max_predicate_depth}`);
25
+ inspection.input_nodes += 1;
26
+ if (inspection.input_nodes > limits.max_input_predicate_nodes)
27
+ invalid("predicate_node_limit_exceeded", `actual=${inspection.input_nodes}:limit=${limits.max_input_predicate_nodes}`);
28
+ }
29
+ function validateEq(input, domains, domainIndex, inspection) {
30
+ exactKeys(input, ["op", "axis_ref", "value"], "predicate:eq");
31
+ const domain = predicateDomain(input.axis_ref, domains, domainIndex);
32
+ validateScalar(domain, input.value);
33
+ addNumberCuts(domain, [input.value], inspection);
34
+ return { ...input };
35
+ }
36
+ function validateIn(input, domains, domainIndex, inspection) {
37
+ exactKeys(input, ["op", "axis_ref", "values"], "predicate:in");
38
+ const domain = predicateDomain(input.axis_ref, domains, domainIndex);
39
+ if (!Array.isArray(input.values) || !input.values.length)
40
+ invalid("predicate_in_values_required", input.axis_ref);
41
+ const values = input.values.map((value) => {
42
+ validateScalar(domain, value);
43
+ return value;
44
+ });
45
+ if (new Set(values.map((value) => `${typeof value}:${value}`)).size !==
46
+ values.length)
47
+ invalid("predicate_in_value_duplicate", input.axis_ref);
48
+ addNumberCuts(domain, values, inspection);
49
+ return { ...input, values: [...values].sort(compareScalar) };
50
+ }
51
+ function validateRange(input, domains, domainIndex, inspection) {
52
+ exactKeys(input, [
53
+ "op",
54
+ "axis_ref",
55
+ "minimum",
56
+ "maximum",
57
+ "minimum_inclusive",
58
+ "maximum_inclusive",
59
+ ], "predicate:range");
60
+ const domain = predicateDomain(input.axis_ref, domains, domainIndex);
61
+ validateRangeBounds(input, domain);
62
+ const effectiveMinimum = input.minimum + (input.minimum_inclusive ? 0 : 1);
63
+ const effectiveMaximum = input.maximum - (input.maximum_inclusive ? 0 : 1);
64
+ if (effectiveMinimum > effectiveMaximum)
65
+ invalid("predicate_range_empty", input.axis_ref);
66
+ addCuts(inspection, domain.key, effectiveMinimum, effectiveMaximum + 1);
67
+ return { ...input };
68
+ }
69
+ function validateRangeBounds(input, domain) {
70
+ if (domain.kind !== "bounded_number" ||
71
+ !Number.isSafeInteger(input.minimum) ||
72
+ !Number.isSafeInteger(input.maximum) ||
73
+ typeof input.minimum_inclusive !== "boolean" ||
74
+ typeof input.maximum_inclusive !== "boolean" ||
75
+ input.minimum < domain.minimum ||
76
+ input.maximum > domain.maximum ||
77
+ input.minimum > input.maximum)
78
+ invalid("predicate_range_invalid", input.axis_ref);
79
+ }
80
+ function validateGroup(input, domains, domainIndex, inspection, depth, limits) {
81
+ exactKeys(input, ["op", "predicates"], `predicate:${input.op}`);
82
+ if (!Array.isArray(input.predicates) || !input.predicates.length)
83
+ invalid("predicate_children_required", input.op);
84
+ return {
85
+ op: input.op,
86
+ predicates: input.predicates.map((predicate) => validateSymbolicPredicate(predicate, domains, domainIndex, inspection, depth + 1, limits)),
87
+ };
88
+ }
89
+ function validateNot(input, domains, domainIndex, inspection, depth, limits) {
90
+ exactKeys(input, ["op", "predicate"], "predicate:not");
91
+ return {
92
+ op: "not",
93
+ predicate: validateSymbolicPredicate(input.predicate, domains, domainIndex, inspection, depth + 1, limits),
94
+ };
95
+ }
96
+ function predicateDomain(axisRef, domains, domainIndex) {
97
+ if (typeof axisRef !== "string")
98
+ invalid("predicate_axis_invalid", "");
99
+ const index = domainIndex.get(axisRef);
100
+ if (index === undefined)
101
+ invalid("predicate_axis_unknown", axisRef);
102
+ return domains[index];
103
+ }
104
+ function validateScalar(domain, value) {
105
+ if (domain.kind === "enum") {
106
+ if (typeof value !== "string" || !domain.values.includes(value))
107
+ invalid("predicate_value_outside_domain", `${domain.key}:${String(value)}`);
108
+ return;
109
+ }
110
+ if (typeof value !== "number" ||
111
+ !Number.isSafeInteger(value) ||
112
+ value < domain.minimum ||
113
+ value > domain.maximum)
114
+ invalid("predicate_value_outside_domain", `${domain.key}:${String(value)}`);
115
+ }
116
+ function addNumberCuts(domain, values, inspection) {
117
+ if (domain.kind !== "bounded_number")
118
+ return;
119
+ for (const value of values)
120
+ addCuts(inspection, domain.key, value, value + 1);
121
+ }
122
+ function addCuts(inspection, axisRef, ...cuts) {
123
+ const values = inspection.number_cuts.get(axisRef) ?? new Set();
124
+ cuts.forEach((cut) => values.add(cut));
125
+ inspection.number_cuts.set(axisRef, values);
126
+ }
@@ -2,6 +2,7 @@ export interface SyncReport {
2
2
  changed: string[];
3
3
  skipped: string[];
4
4
  blocked: string[];
5
+ notices?: string[];
5
6
  }
6
7
  export declare function emptySyncReport(): SyncReport;
7
8
  export declare function runSync(projectRoot: string): Promise<SyncReport>;
@@ -7,6 +7,7 @@ import { AGENTS_BLOCK_MARKERS, GITHUB_WORKFLOW_BLOCK_END, GITHUB_WORKFLOW_BLOCK_
7
7
  import { packageAssetPath } from "./paths.js";
8
8
  import { assertSupportedSchema } from "./schema-guard.js";
9
9
  import { installLongTaskHooks, uninstallLongTaskHooks, } from "./long-task-hook-install.js";
10
+ import { syncLongTaskCodexAgentProfile } from "./long-task-codex-agent-profile.js";
10
11
  import { enabledManagedSkillNames, isProfileEnabled } from "./profiles.js";
11
12
  export function emptySyncReport() {
12
13
  return {
@@ -27,7 +28,9 @@ export async function runSync(projectRoot) {
27
28
  for (const managedFile of config.managed_files) {
28
29
  await syncManagedFile(projectRoot, root, managedFile, report, config);
29
30
  }
30
- if (isProfileEnabled(config, "long-task")) {
31
+ const longTaskEnabled = isProfileEnabled(config, "long-task");
32
+ await syncLongTaskCodexAgentProfile(projectRoot, root, longTaskEnabled, report);
33
+ if (longTaskEnabled) {
31
34
  await installLongTaskHooks(projectRoot, report);
32
35
  }
33
36
  else {
@@ -42,6 +42,7 @@ export async function runUpgradeReport(projectRoot) {
42
42
  for (const skipped of syncReport.skipped.filter((line) => line.includes("customized"))) {
43
43
  lines.push(`sync skipped: ${skipped}`);
44
44
  }
45
+ lines.push(...(syncReport.notices ?? []));
45
46
  const doctor = await runDoctor(projectRoot);
46
47
  lines.push(`doctor warnings=${doctor.warnings.length} errors=${doctor.errors.length}`);
47
48
  const blocked = migrationReport.manualRequired.length > 0 ||