@fundamental-engine/core 0.4.0

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 (371) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +128 -0
  3. package/dist/agents/element-agent.d.ts +38 -0
  4. package/dist/agents/element-agent.d.ts.map +1 -0
  5. package/dist/agents/element-agent.js +70 -0
  6. package/dist/agents/element-agent.js.map +1 -0
  7. package/dist/agents/event-agent.d.ts +47 -0
  8. package/dist/agents/event-agent.d.ts.map +1 -0
  9. package/dist/agents/event-agent.js +82 -0
  10. package/dist/agents/event-agent.js.map +1 -0
  11. package/dist/agents/index.d.ts +17 -0
  12. package/dist/agents/index.d.ts.map +1 -0
  13. package/dist/agents/index.js +57 -0
  14. package/dist/agents/index.js.map +1 -0
  15. package/dist/agents/region-agents.d.ts +40 -0
  16. package/dist/agents/region-agents.d.ts.map +1 -0
  17. package/dist/agents/region-agents.js +22 -0
  18. package/dist/agents/region-agents.js.map +1 -0
  19. package/dist/agents/relationship.d.ts +55 -0
  20. package/dist/agents/relationship.d.ts.map +1 -0
  21. package/dist/agents/relationship.js +40 -0
  22. package/dist/agents/relationship.js.map +1 -0
  23. package/dist/agents/user-agent.d.ts +57 -0
  24. package/dist/agents/user-agent.d.ts.map +1 -0
  25. package/dist/agents/user-agent.js +45 -0
  26. package/dist/agents/user-agent.js.map +1 -0
  27. package/dist/config/forces.config.d.ts +101 -0
  28. package/dist/config/forces.config.d.ts.map +1 -0
  29. package/dist/config/forces.config.js +239 -0
  30. package/dist/config/forces.config.js.map +1 -0
  31. package/dist/config/manual.d.ts +134 -0
  32. package/dist/config/manual.d.ts.map +1 -0
  33. package/dist/config/manual.js +604 -0
  34. package/dist/config/manual.js.map +1 -0
  35. package/dist/config/palettes.d.ts +18 -0
  36. package/dist/config/palettes.d.ts.map +1 -0
  37. package/dist/config/palettes.js +34 -0
  38. package/dist/config/palettes.js.map +1 -0
  39. package/dist/config/presets.d.ts +48 -0
  40. package/dist/config/presets.d.ts.map +1 -0
  41. package/dist/config/presets.js +87 -0
  42. package/dist/config/presets.js.map +1 -0
  43. package/dist/config/tokens.d.ts +3 -0
  44. package/dist/config/tokens.d.ts.map +1 -0
  45. package/dist/config/tokens.js +16 -0
  46. package/dist/config/tokens.js.map +1 -0
  47. package/dist/conformance/expectations.d.ts +40 -0
  48. package/dist/conformance/expectations.d.ts.map +1 -0
  49. package/dist/conformance/expectations.js +347 -0
  50. package/dist/conformance/expectations.js.map +1 -0
  51. package/dist/conformance/experiments.d.ts +17 -0
  52. package/dist/conformance/experiments.d.ts.map +1 -0
  53. package/dist/conformance/experiments.js +875 -0
  54. package/dist/conformance/experiments.js.map +1 -0
  55. package/dist/conformance/run.d.ts +18 -0
  56. package/dist/conformance/run.d.ts.map +1 -0
  57. package/dist/conformance/run.js +240 -0
  58. package/dist/conformance/run.js.map +1 -0
  59. package/dist/conformance/types.d.ts +100 -0
  60. package/dist/conformance/types.d.ts.map +1 -0
  61. package/dist/conformance/types.js +2 -0
  62. package/dist/conformance/types.js.map +1 -0
  63. package/dist/contracts/guards.d.ts +51 -0
  64. package/dist/contracts/guards.d.ts.map +1 -0
  65. package/dist/contracts/guards.js +100 -0
  66. package/dist/contracts/guards.js.map +1 -0
  67. package/dist/contracts/index.d.ts +18 -0
  68. package/dist/contracts/index.d.ts.map +1 -0
  69. package/dist/contracts/index.js +107 -0
  70. package/dist/contracts/index.js.map +1 -0
  71. package/dist/contracts/passport.d.ts +88 -0
  72. package/dist/contracts/passport.d.ts.map +1 -0
  73. package/dist/contracts/passport.js +135 -0
  74. package/dist/contracts/passport.js.map +1 -0
  75. package/dist/contracts/types.d.ts +120 -0
  76. package/dist/contracts/types.d.ts.map +1 -0
  77. package/dist/contracts/types.js +24 -0
  78. package/dist/contracts/types.js.map +1 -0
  79. package/dist/core/accretion.d.ts +50 -0
  80. package/dist/core/accretion.d.ts.map +1 -0
  81. package/dist/core/accretion.js +98 -0
  82. package/dist/core/accretion.js.map +1 -0
  83. package/dist/core/agents.d.ts +31 -0
  84. package/dist/core/agents.d.ts.map +1 -0
  85. package/dist/core/agents.js +51 -0
  86. package/dist/core/agents.js.map +1 -0
  87. package/dist/core/attention.d.ts +72 -0
  88. package/dist/core/attention.d.ts.map +1 -0
  89. package/dist/core/attention.js +122 -0
  90. package/dist/core/attention.js.map +1 -0
  91. package/dist/core/causality.d.ts +38 -0
  92. package/dist/core/causality.d.ts.map +1 -0
  93. package/dist/core/causality.js +64 -0
  94. package/dist/core/causality.js.map +1 -0
  95. package/dist/core/conditions.d.ts +10 -0
  96. package/dist/core/conditions.d.ts.map +1 -0
  97. package/dist/core/conditions.js +22 -0
  98. package/dist/core/conditions.js.map +1 -0
  99. package/dist/core/currents.d.ts +53 -0
  100. package/dist/core/currents.d.ts.map +1 -0
  101. package/dist/core/currents.js +65 -0
  102. package/dist/core/currents.js.map +1 -0
  103. package/dist/core/dock.d.ts +35 -0
  104. package/dist/core/dock.d.ts.map +1 -0
  105. package/dist/core/dock.js +39 -0
  106. package/dist/core/dock.js.map +1 -0
  107. package/dist/core/events.d.ts +23 -0
  108. package/dist/core/events.d.ts.map +1 -0
  109. package/dist/core/events.js +34 -0
  110. package/dist/core/events.js.map +1 -0
  111. package/dist/core/feedback-sink.d.ts +32 -0
  112. package/dist/core/feedback-sink.d.ts.map +1 -0
  113. package/dist/core/feedback-sink.js +53 -0
  114. package/dist/core/feedback-sink.js.map +1 -0
  115. package/dist/core/feedback.d.ts +11 -0
  116. package/dist/core/feedback.d.ts.map +1 -0
  117. package/dist/core/feedback.js +16 -0
  118. package/dist/core/feedback.js.map +1 -0
  119. package/dist/core/field-store.d.ts +26 -0
  120. package/dist/core/field-store.d.ts.map +1 -0
  121. package/dist/core/field-store.js +54 -0
  122. package/dist/core/field-store.js.map +1 -0
  123. package/dist/core/field.d.ts +18 -0
  124. package/dist/core/field.d.ts.map +1 -0
  125. package/dist/core/field.js +1943 -0
  126. package/dist/core/field.js.map +1 -0
  127. package/dist/core/fieldline-seeds.d.ts +25 -0
  128. package/dist/core/fieldline-seeds.d.ts.map +1 -0
  129. package/dist/core/fieldline-seeds.js +32 -0
  130. package/dist/core/fieldline-seeds.js.map +1 -0
  131. package/dist/core/fieldlines.d.ts +75 -0
  132. package/dist/core/fieldlines.d.ts.map +1 -0
  133. package/dist/core/fieldlines.js +111 -0
  134. package/dist/core/fieldlines.js.map +1 -0
  135. package/dist/core/flow.d.ts +38 -0
  136. package/dist/core/flow.d.ts.map +1 -0
  137. package/dist/core/flow.js +27 -0
  138. package/dist/core/flow.js.map +1 -0
  139. package/dist/core/formations.d.ts +11 -0
  140. package/dist/core/formations.d.ts.map +1 -0
  141. package/dist/core/formations.js +22 -0
  142. package/dist/core/formations.js.map +1 -0
  143. package/dist/core/geometry.d.ts +67 -0
  144. package/dist/core/geometry.d.ts.map +1 -0
  145. package/dist/core/geometry.js +68 -0
  146. package/dist/core/geometry.js.map +1 -0
  147. package/dist/core/heatmap.d.ts +22 -0
  148. package/dist/core/heatmap.d.ts.map +1 -0
  149. package/dist/core/heatmap.js +55 -0
  150. package/dist/core/heatmap.js.map +1 -0
  151. package/dist/core/host.d.ts +46 -0
  152. package/dist/core/host.d.ts.map +1 -0
  153. package/dist/core/host.js +11 -0
  154. package/dist/core/host.js.map +1 -0
  155. package/dist/core/integrator.d.ts +24 -0
  156. package/dist/core/integrator.d.ts.map +1 -0
  157. package/dist/core/integrator.js +375 -0
  158. package/dist/core/integrator.js.map +1 -0
  159. package/dist/core/math.d.ts +37 -0
  160. package/dist/core/math.d.ts.map +1 -0
  161. package/dist/core/math.js +77 -0
  162. package/dist/core/math.js.map +1 -0
  163. package/dist/core/reactions.d.ts +32 -0
  164. package/dist/core/reactions.d.ts.map +1 -0
  165. package/dist/core/reactions.js +45 -0
  166. package/dist/core/reactions.js.map +1 -0
  167. package/dist/core/registry.d.ts +13 -0
  168. package/dist/core/registry.d.ts.map +1 -0
  169. package/dist/core/registry.js +20 -0
  170. package/dist/core/registry.js.map +1 -0
  171. package/dist/core/render-backend.d.ts +46 -0
  172. package/dist/core/render-backend.d.ts.map +1 -0
  173. package/dist/core/render-backend.js +75 -0
  174. package/dist/core/render-backend.js.map +1 -0
  175. package/dist/core/render-modes.d.ts +42 -0
  176. package/dist/core/render-modes.d.ts.map +1 -0
  177. package/dist/core/render-modes.js +141 -0
  178. package/dist/core/render-modes.js.map +1 -0
  179. package/dist/core/reservoir.d.ts +43 -0
  180. package/dist/core/reservoir.d.ts.map +1 -0
  181. package/dist/core/reservoir.js +207 -0
  182. package/dist/core/reservoir.js.map +1 -0
  183. package/dist/core/scalar-grid.d.ts +51 -0
  184. package/dist/core/scalar-grid.d.ts.map +1 -0
  185. package/dist/core/scalar-grid.js +146 -0
  186. package/dist/core/scalar-grid.js.map +1 -0
  187. package/dist/core/scanner.d.ts +59 -0
  188. package/dist/core/scanner.d.ts.map +1 -0
  189. package/dist/core/scanner.js +260 -0
  190. package/dist/core/scanner.js.map +1 -0
  191. package/dist/core/shadow.d.ts +69 -0
  192. package/dist/core/shadow.d.ts.map +1 -0
  193. package/dist/core/shadow.js +84 -0
  194. package/dist/core/shadow.js.map +1 -0
  195. package/dist/core/spatial-hash.d.ts +30 -0
  196. package/dist/core/spatial-hash.d.ts.map +1 -0
  197. package/dist/core/spatial-hash.js +64 -0
  198. package/dist/core/spatial-hash.js.map +1 -0
  199. package/dist/core/streamlines.d.ts +29 -0
  200. package/dist/core/streamlines.d.ts.map +1 -0
  201. package/dist/core/streamlines.js +70 -0
  202. package/dist/core/streamlines.js.map +1 -0
  203. package/dist/core/surface.d.ts +19 -0
  204. package/dist/core/surface.d.ts.map +1 -0
  205. package/dist/core/surface.js +21 -0
  206. package/dist/core/surface.js.map +1 -0
  207. package/dist/core/temporal.d.ts +110 -0
  208. package/dist/core/temporal.d.ts.map +1 -0
  209. package/dist/core/temporal.js +139 -0
  210. package/dist/core/temporal.js.map +1 -0
  211. package/dist/core/thermo.d.ts +48 -0
  212. package/dist/core/thermo.d.ts.map +1 -0
  213. package/dist/core/thermo.js +48 -0
  214. package/dist/core/thermo.js.map +1 -0
  215. package/dist/core/types.d.ts +610 -0
  216. package/dist/core/types.d.ts.map +1 -0
  217. package/dist/core/types.js +2 -0
  218. package/dist/core/types.js.map +1 -0
  219. package/dist/core/weights.d.ts +111 -0
  220. package/dist/core/weights.d.ts.map +1 -0
  221. package/dist/core/weights.js +128 -0
  222. package/dist/core/weights.js.map +1 -0
  223. package/dist/diagnostics/energy.d.ts +21 -0
  224. package/dist/diagnostics/energy.d.ts.map +1 -0
  225. package/dist/diagnostics/energy.js +27 -0
  226. package/dist/diagnostics/energy.js.map +1 -0
  227. package/dist/diagnostics/fields.d.ts +23 -0
  228. package/dist/diagnostics/fields.d.ts.map +1 -0
  229. package/dist/diagnostics/fields.js +30 -0
  230. package/dist/diagnostics/fields.js.map +1 -0
  231. package/dist/diagnostics/index.d.ts +46 -0
  232. package/dist/diagnostics/index.d.ts.map +1 -0
  233. package/dist/diagnostics/index.js +23 -0
  234. package/dist/diagnostics/index.js.map +1 -0
  235. package/dist/diagnostics/modes.d.ts +108 -0
  236. package/dist/diagnostics/modes.d.ts.map +1 -0
  237. package/dist/diagnostics/modes.js +181 -0
  238. package/dist/diagnostics/modes.js.map +1 -0
  239. package/dist/diagnostics/potential.d.ts +30 -0
  240. package/dist/diagnostics/potential.d.ts.map +1 -0
  241. package/dist/diagnostics/potential.js +43 -0
  242. package/dist/diagnostics/potential.js.map +1 -0
  243. package/dist/diagnostics/probes.d.ts +31 -0
  244. package/dist/diagnostics/probes.d.ts.map +1 -0
  245. package/dist/diagnostics/probes.js +61 -0
  246. package/dist/diagnostics/probes.js.map +1 -0
  247. package/dist/diagnostics/render.d.ts +49 -0
  248. package/dist/diagnostics/render.d.ts.map +1 -0
  249. package/dist/diagnostics/render.js +132 -0
  250. package/dist/diagnostics/render.js.map +1 -0
  251. package/dist/export.d.ts +18 -0
  252. package/dist/export.d.ts.map +1 -0
  253. package/dist/export.js +17 -0
  254. package/dist/export.js.map +1 -0
  255. package/dist/forces/extended.d.ts +121 -0
  256. package/dist/forces/extended.d.ts.map +1 -0
  257. package/dist/forces/extended.js +674 -0
  258. package/dist/forces/extended.js.map +1 -0
  259. package/dist/forces/index.d.ts +33 -0
  260. package/dist/forces/index.d.ts.map +1 -0
  261. package/dist/forces/index.js +237 -0
  262. package/dist/forces/index.js.map +1 -0
  263. package/dist/forces/natural.d.ts +106 -0
  264. package/dist/forces/natural.d.ts.map +1 -0
  265. package/dist/forces/natural.js +385 -0
  266. package/dist/forces/natural.js.map +1 -0
  267. package/dist/index.d.ts +59 -0
  268. package/dist/index.d.ts.map +1 -0
  269. package/dist/index.js +71 -0
  270. package/dist/index.js.map +1 -0
  271. package/dist/inspect/budget.d.ts +17 -0
  272. package/dist/inspect/budget.d.ts.map +1 -0
  273. package/dist/inspect/budget.js +19 -0
  274. package/dist/inspect/budget.js.map +1 -0
  275. package/dist/inspect/index.d.ts +10 -0
  276. package/dist/inspect/index.d.ts.map +1 -0
  277. package/dist/inspect/index.js +10 -0
  278. package/dist/inspect/index.js.map +1 -0
  279. package/dist/inspect/report.d.ts +17 -0
  280. package/dist/inspect/report.d.ts.map +1 -0
  281. package/dist/inspect/report.js +44 -0
  282. package/dist/inspect/report.js.map +1 -0
  283. package/dist/inspect/snapshot.d.ts +21 -0
  284. package/dist/inspect/snapshot.d.ts.map +1 -0
  285. package/dist/inspect/snapshot.js +30 -0
  286. package/dist/inspect/snapshot.js.map +1 -0
  287. package/dist/recipes/catalog.d.ts +51 -0
  288. package/dist/recipes/catalog.d.ts.map +1 -0
  289. package/dist/recipes/catalog.js +1496 -0
  290. package/dist/recipes/catalog.js.map +1 -0
  291. package/dist/recipes/charge.d.ts +18 -0
  292. package/dist/recipes/charge.d.ts.map +1 -0
  293. package/dist/recipes/charge.js +27 -0
  294. package/dist/recipes/charge.js.map +1 -0
  295. package/dist/recipes/compile.d.ts +93 -0
  296. package/dist/recipes/compile.d.ts.map +1 -0
  297. package/dist/recipes/compile.js +113 -0
  298. package/dist/recipes/compile.js.map +1 -0
  299. package/dist/recipes/explain.d.ts +8 -0
  300. package/dist/recipes/explain.d.ts.map +1 -0
  301. package/dist/recipes/explain.js +46 -0
  302. package/dist/recipes/explain.js.map +1 -0
  303. package/dist/recipes/gallery.d.ts +6 -0
  304. package/dist/recipes/gallery.d.ts.map +1 -0
  305. package/dist/recipes/gallery.js +6 -0
  306. package/dist/recipes/gallery.js.map +1 -0
  307. package/dist/recipes/gravity.d.ts +16 -0
  308. package/dist/recipes/gravity.d.ts.map +1 -0
  309. package/dist/recipes/gravity.js +27 -0
  310. package/dist/recipes/gravity.js.map +1 -0
  311. package/dist/recipes/index.d.ts +18 -0
  312. package/dist/recipes/index.d.ts.map +1 -0
  313. package/dist/recipes/index.js +36 -0
  314. package/dist/recipes/index.js.map +1 -0
  315. package/dist/recipes/intent.d.ts +44 -0
  316. package/dist/recipes/intent.d.ts.map +1 -0
  317. package/dist/recipes/intent.js +46 -0
  318. package/dist/recipes/intent.js.map +1 -0
  319. package/dist/recipes/schema.d.ts +103 -0
  320. package/dist/recipes/schema.d.ts.map +1 -0
  321. package/dist/recipes/schema.js +123 -0
  322. package/dist/recipes/schema.js.map +1 -0
  323. package/dist/recipes/wayfinding.d.ts +39 -0
  324. package/dist/recipes/wayfinding.d.ts.map +1 -0
  325. package/dist/recipes/wayfinding.js +77 -0
  326. package/dist/recipes/wayfinding.js.map +1 -0
  327. package/dist/semantic/index.d.ts +13 -0
  328. package/dist/semantic/index.d.ts.map +1 -0
  329. package/dist/semantic/index.js +31 -0
  330. package/dist/semantic/index.js.map +1 -0
  331. package/dist/semantic/layers.d.ts +24 -0
  332. package/dist/semantic/layers.d.ts.map +1 -0
  333. package/dist/semantic/layers.js +27 -0
  334. package/dist/semantic/layers.js.map +1 -0
  335. package/dist/semantic/materials.d.ts +20 -0
  336. package/dist/semantic/materials.d.ts.map +1 -0
  337. package/dist/semantic/materials.js +17 -0
  338. package/dist/semantic/materials.js.map +1 -0
  339. package/dist/semantic/states.d.ts +11 -0
  340. package/dist/semantic/states.d.ts.map +1 -0
  341. package/dist/semantic/states.js +26 -0
  342. package/dist/semantic/states.js.map +1 -0
  343. package/dist/visual/channels.d.ts +71 -0
  344. package/dist/visual/channels.d.ts.map +1 -0
  345. package/dist/visual/channels.js +70 -0
  346. package/dist/visual/channels.js.map +1 -0
  347. package/dist/visual/index.d.ts +39 -0
  348. package/dist/visual/index.d.ts.map +1 -0
  349. package/dist/visual/index.js +30 -0
  350. package/dist/visual/index.js.map +1 -0
  351. package/dist/visual/lint.d.ts +41 -0
  352. package/dist/visual/lint.d.ts.map +1 -0
  353. package/dist/visual/lint.js +58 -0
  354. package/dist/visual/lint.js.map +1 -0
  355. package/dist/visual/mapping.d.ts +13 -0
  356. package/dist/visual/mapping.d.ts.map +1 -0
  357. package/dist/visual/mapping.js +43 -0
  358. package/dist/visual/mapping.js.map +1 -0
  359. package/dist/visual/semantic-text.d.ts +28 -0
  360. package/dist/visual/semantic-text.d.ts.map +1 -0
  361. package/dist/visual/semantic-text.js +36 -0
  362. package/dist/visual/semantic-text.js.map +1 -0
  363. package/dist/visual/tokens.d.ts +23 -0
  364. package/dist/visual/tokens.d.ts.map +1 -0
  365. package/dist/visual/tokens.js +54 -0
  366. package/dist/visual/tokens.js.map +1 -0
  367. package/dist/visual/visualization.d.ts +31 -0
  368. package/dist/visual/visualization.d.ts.map +1 -0
  369. package/dist/visual/visualization.js +47 -0
  370. package/dist/visual/visualization.js.map +1 -0
  371. package/package.json +60 -0
@@ -0,0 +1,18 @@
1
+ /**
2
+ * field-ui contracts (Phase 4). The formal, inspectable contract layer over the engine:
3
+ * - `types.ts` — named contract type definitions
4
+ * - `passport.ts` — every force's declarative, validated description
5
+ * - `guards.ts` — dev-mode runtime enforcement (the Error Taxonomy)
6
+ * - `CONTRACTS` — the inspectable catalog: each contract and the five questions it answers
7
+ */
8
+ import type { ContractMeta } from './types.ts';
9
+ export * from './types.ts';
10
+ export * from './passport.ts';
11
+ export * from './guards.ts';
12
+ /**
13
+ * The inspectable catalog of the foundational contracts (system-contracts §1–§16). Each records
14
+ * the five questions every contract answers. Agent-type, visual-language, and recipe contracts
15
+ * are formalized in later phases.
16
+ */
17
+ export declare const CONTRACTS: readonly ContractMeta[];
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAE5B;;;;GAIG;AACH,eAAO,MAAM,SAAS,EAAE,SAAS,YAAY,EAiG5C,CAAC"}
@@ -0,0 +1,107 @@
1
+ export * from "./types.js";
2
+ export * from "./passport.js";
3
+ export * from "./guards.js";
4
+ /**
5
+ * The inspectable catalog of the foundational contracts (system-contracts §1–§16). Each records
6
+ * the five questions every contract answers. Agent-type, visual-language, and recipe contracts
7
+ * are formalized in later phases.
8
+ */
9
+ export const CONTRACTS = [
10
+ {
11
+ name: 'Body Contract',
12
+ mustExist: 'id, element/owner, geometry provider, field target, write-back target, behavior registration, lifecycle hooks',
13
+ mayMutate: 'its own write-back target (CSS vars, data-state)',
14
+ sideEffectFree: 'its geometry provider (measurement must not change layout)',
15
+ testable: 'registry + scanner tests; the default body is the custom-element host',
16
+ inspectable: 'the ShadowRegistry size and the per-body rect',
17
+ },
18
+ {
19
+ name: 'Field Contract',
20
+ mustExist: 'field(body, x, y, env) → vector/scalar/compound/null, declaring its kind',
21
+ mayMutate: 'nothing',
22
+ sideEffectFree: 'the whole function — stable values for a fixed state; mutates no particles or bodies',
23
+ testable: 'field lines trace field(), not apply(); purity (same input → same output)',
24
+ inspectable: 'field lines, streamlines, heatmaps, Lab probes',
25
+ },
26
+ {
27
+ name: 'Force Contract',
28
+ mustExist: 'token, label, apply(); a passport declaring its physics (passport.ts)',
29
+ mayMutate: 'particle velocity, heat, phase, capture state, identity, life',
30
+ sideEffectFree: 'its optional field() hook',
31
+ testable: 'a conformance experiment per force; the passport is validated against ground truth',
32
+ inspectable: 'the passport and the conformance verdict (the Lab)',
33
+ },
34
+ {
35
+ name: 'Transport Contract',
36
+ mustExist: 'a primitive that moves matter along field geometry; fieldflow is canonical',
37
+ mayMutate: 'particle velocity (it does work) via env.fieldAt()',
38
+ sideEffectFree: 'must not replace another force’s physical law',
39
+ testable: 'fieldflow moves neutral matter along a field; magnetism alone does not',
40
+ inspectable: 'streamlines aligned to the field it follows',
41
+ },
42
+ {
43
+ name: 'Agent Contract',
44
+ mustExist: 'identity, state, inputs, outputs, accepted influence, emitted metrics, events, tests',
45
+ mayMutate: 'only its own outputs (DOM state for an ElementAgent; never particles unless also a body)',
46
+ sideEffectFree: 'its metric reads',
47
+ testable: 'per agent-kind response tests',
48
+ inspectable: 'its metrics and dispatched events (Phase 5 expands the kinds)',
49
+ },
50
+ {
51
+ name: 'Event Contract',
52
+ mustExist: 'a thresholded, debounced event with a useful detail payload, traceable to a metric',
53
+ mayMutate: 'nothing (it notifies)',
54
+ sideEffectFree: 'dispatch must not run physics',
55
+ testable: 'events are thresholded/debounced and do not fire every frame by default',
56
+ inspectable: 'the event type, source metric, threshold, and payload',
57
+ },
58
+ {
59
+ name: 'Feedback Contract',
60
+ mustExist: 'a write-back of field state to CSS vars / data-state / ElementInternals',
61
+ mayMutate: 'presentation (visually yes), not meaning',
62
+ sideEffectFree: 'must not break readability or require motion for meaning',
63
+ testable: 'density write-back sets --field-* / --d; reduced-motion holds meaning',
64
+ inspectable: 'the CSS variables and data-state written on each body',
65
+ },
66
+ {
67
+ name: 'Visualization Contract',
68
+ mustExist: 'a layer that reads field/particle/grid/relationship state to reveal it',
69
+ mayMutate: 'nothing — unless explicitly reclassified as feedback or force behavior',
70
+ sideEffectFree: 'the whole read path (debug overlays must not affect integration)',
71
+ testable: 'visualization does not alter physics; prediction mode does not mutate live state',
72
+ inspectable: 'each layer declares what it reads and whether it mutates physics',
73
+ },
74
+ {
75
+ name: 'Source/Sink Contract',
76
+ mustExist: 'a source budget (spawn rate, max particles, life, cooldown) or sink budget (capacity, saturation)',
77
+ mayMutate: 'particle count — within budget only',
78
+ sideEffectFree: 'budget accounting must be deterministic',
79
+ testable: 'no unbounded creation; a sink emits a saturation event',
80
+ inspectable: 'the live count vs. the declared cap',
81
+ },
82
+ {
83
+ name: 'Performance Contract',
84
+ mustExist: 'a budget for particles, bodies, local cells, field lines, heatmap resolution, DPR',
85
+ mayMutate: 'nothing (it bounds cost)',
86
+ sideEffectFree: 'budget evaluation',
87
+ testable: 'counts stay within budget; DPR is capped; debug overlays off in production',
88
+ inspectable: 'the budget vs. live counts',
89
+ },
90
+ {
91
+ name: 'Accessibility Contract',
92
+ mustExist: 'a reduced-motion fallback for any motion-dependent meaning; labels for interactive fields',
93
+ mayMutate: 'nothing physical — it constrains how feedback/visualization may present',
94
+ sideEffectFree: 'the checks (reduced-motion gating, lint) are pure',
95
+ testable: 'meaning survives without motion; events do not spam AT; color is not the sole carrier',
96
+ inspectable: 'reduced-motion state, the a11y lint findings, and ARIA on interactive fields',
97
+ },
98
+ {
99
+ name: 'Conformance Contract',
100
+ mustExist: 'proof for every force, render mode, agent, source/sink, recipe',
101
+ mayMutate: 'nothing',
102
+ sideEffectFree: 'the runner simulates headlessly without touching live state',
103
+ testable: 'golden math, behavioral scenario, snapshot, side-effect, threshold, reduced-motion',
104
+ inspectable: 'the Lab MATCH/NO-MATCH verdict per check',
105
+ },
106
+ ];
107
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":"AASA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAE5B;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAA4B;IAChD;QACE,IAAI,EAAE,eAAe;QACrB,SAAS,EAAE,+GAA+G;QAC1H,SAAS,EAAE,kDAAkD;QAC7D,cAAc,EAAE,4DAA4D;QAC5E,QAAQ,EAAE,uEAAuE;QACjF,WAAW,EAAE,+CAA+C;KAC7D;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,SAAS,EAAE,0EAA0E;QACrF,SAAS,EAAE,SAAS;QACpB,cAAc,EAAE,sFAAsF;QACtG,QAAQ,EAAE,2EAA2E;QACrF,WAAW,EAAE,gDAAgD;KAC9D;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,SAAS,EAAE,uEAAuE;QAClF,SAAS,EAAE,+DAA+D;QAC1E,cAAc,EAAE,2BAA2B;QAC3C,QAAQ,EAAE,oFAAoF;QAC9F,WAAW,EAAE,oDAAoD;KAClE;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,SAAS,EAAE,4EAA4E;QACvF,SAAS,EAAE,oDAAoD;QAC/D,cAAc,EAAE,+CAA+C;QAC/D,QAAQ,EAAE,wEAAwE;QAClF,WAAW,EAAE,6CAA6C;KAC3D;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,SAAS,EAAE,sFAAsF;QACjG,SAAS,EAAE,0FAA0F;QACrG,cAAc,EAAE,kBAAkB;QAClC,QAAQ,EAAE,+BAA+B;QACzC,WAAW,EAAE,+DAA+D;KAC7E;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,SAAS,EAAE,oFAAoF;QAC/F,SAAS,EAAE,uBAAuB;QAClC,cAAc,EAAE,+BAA+B;QAC/C,QAAQ,EAAE,yEAAyE;QACnF,WAAW,EAAE,uDAAuD;KACrE;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,SAAS,EAAE,yEAAyE;QACpF,SAAS,EAAE,0CAA0C;QACrD,cAAc,EAAE,0DAA0D;QAC1E,QAAQ,EAAE,uEAAuE;QACjF,WAAW,EAAE,uDAAuD;KACrE;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,SAAS,EAAE,wEAAwE;QACnF,SAAS,EAAE,wEAAwE;QACnF,cAAc,EAAE,kEAAkE;QAClF,QAAQ,EAAE,kFAAkF;QAC5F,WAAW,EAAE,kEAAkE;KAChF;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,SAAS,EAAE,mGAAmG;QAC9G,SAAS,EAAE,qCAAqC;QAChD,cAAc,EAAE,yCAAyC;QACzD,QAAQ,EAAE,wDAAwD;QAClE,WAAW,EAAE,qCAAqC;KACnD;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,SAAS,EAAE,mFAAmF;QAC9F,SAAS,EAAE,0BAA0B;QACrC,cAAc,EAAE,mBAAmB;QACnC,QAAQ,EAAE,4EAA4E;QACtF,WAAW,EAAE,4BAA4B;KAC1C;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,SAAS,EAAE,2FAA2F;QACtG,SAAS,EAAE,yEAAyE;QACpF,cAAc,EAAE,mDAAmD;QACnE,QAAQ,EAAE,uFAAuF;QACjG,WAAW,EAAE,8EAA8E;KAC5F;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,SAAS,EAAE,gEAAgE;QAC3E,SAAS,EAAE,SAAS;QACpB,cAAc,EAAE,6DAA6D;QAC7E,QAAQ,EAAE,oFAAoF;QAC9F,WAAW,EAAE,0CAA0C;KACxD;CACF,CAAC"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Force passports (system-contracts §3, testing-and-conformance §2).
3
+ *
4
+ * Every force declares a passport: what it is, what it mutates, whether it does work, whether it
5
+ * needs charge or velocity, whether it touches neutral matter, and how it can be visualized. The
6
+ * passport is the inspectable, lintable description that prose alone used to carry — and it is
7
+ * cross-checked against ground truth (the live registry + the conformance catalog) by the test
8
+ * suite, so it cannot silently drift from the implementation.
9
+ *
10
+ * Structural facts (family, class, ownsField, isSource, isModifier) are validated against the live
11
+ * `Force` objects and the conformance experiments. Physics semantics (doesWork, conservesSpeed,
12
+ * requiresCharge/Velocity, affectsNeutralMatter, usesFieldAt) are declared here and, where the
13
+ * conformance catalog proves them, cross-checked too.
14
+ */
15
+ import type { Token, Force } from '../core/types.ts';
16
+ import type { ForceClass, ForceConformance } from '../conformance/types.ts';
17
+ /**
18
+ * The five truth modes the docs classify behavior by (definition §11, behavior-table, worldclass §1),
19
+ * plus `hybrid`. Forces are `physical`, `designed`, or `hybrid`; `diagnostic` classifies
20
+ * visualizations, `poetic` classifies composite presets, and `semantic` classifies the
21
+ * meaning→metric mappings (see `semantic/`).
22
+ */
23
+ export type TruthMode = 'physical' | 'designed' | 'hybrid' | 'diagnostic' | 'poetic' | 'semantic';
24
+ /** The truth-mode catalog (what each mode classifies), for inspectors. */
25
+ export declare const TRUTH_MODES: Readonly<Record<TruthMode, string>>;
26
+ /** Render modes + the renderable structure layers a force reads best in (incl. field-lines/heatmap). */
27
+ export type RenderMode = 'dots' | 'trails' | 'links' | 'streamlines' | 'metaballs' | 'voronoi' | 'field-lines' | 'heatmap';
28
+ /** A force's complete, inspectable contract description. */
29
+ export interface ForcePassport {
30
+ token: Token;
31
+ label: string;
32
+ family: 'canonical' | 'natural' | 'extended';
33
+ /** input class (§20.1): A body→particle · B particle↔particle · C field-grid · D shape · S source · modifier. */
34
+ klass: ForceClass;
35
+ truthMode: TruthMode;
36
+ /** defines `field()` — a renderable field structure (charge, magnetism). */
37
+ ownsField: boolean;
38
+ /** reads `env.fieldAt()` to follow field geometry (transport). */
39
+ usesFieldAt: boolean;
40
+ /** moves particles (a non-no-op `apply`). False for pure modifiers and color-only forces. */
41
+ movesParticles: boolean;
42
+ /** changes a particle's kinetic energy. */
43
+ doesWork: boolean;
44
+ /** preserves |v| — a pure rotation or elastic reflection. */
45
+ conservesSpeed: boolean;
46
+ /** no effect on charge-free matter (q = 0). */
47
+ requiresCharge: boolean;
48
+ /** no effect on a still particle (needs motion). */
49
+ requiresVelocity: boolean;
50
+ /** acts on neutral (uncharged) matter. */
51
+ affectsNeutralMatter: boolean;
52
+ /** creates matter via `env.spawn` (class S) — must be budgeted. */
53
+ isSource: boolean;
54
+ /** affects sibling forces via `modify()` rather than moving matter directly. */
55
+ isModifier: boolean;
56
+ /** can be drawn as field lines (iff it owns a `field()`). */
57
+ canVisualizeFieldLines: boolean;
58
+ /** can be drawn as force vectors via a probe (iff it moves particles). */
59
+ canVisualizeForceVectors: boolean;
60
+ /** the render modes that read best for this force (testing §2 "Best render modes"). */
61
+ bestRenderModes: readonly RenderMode[];
62
+ /** preset composites this force commonly appears in (testing §2 "Common composites"). */
63
+ commonComposites: readonly string[];
64
+ designUse: string;
65
+ physicsNote: string;
66
+ }
67
+ /** The passport registry — `token → passport`, derived fields filled in. */
68
+ export declare const PASSPORTS: Readonly<Record<Token, ForcePassport>>;
69
+ /** The passport for a force token, or `undefined` if none is registered. */
70
+ export declare function passportFor(token: Token): ForcePassport | undefined;
71
+ /**
72
+ * The conformance-check labels that prove a force (testing-and-conformance §2 "Conformance tests"),
73
+ * derived from the live conformance catalog so the passport's proof list never drifts from the
74
+ * tests that actually run. Empty when a force has no experiment.
75
+ */
76
+ export declare function conformanceTests(token: Token): string[];
77
+ /** A problem found while validating passports against ground truth. */
78
+ export interface PassportProblem {
79
+ token: string;
80
+ issue: string;
81
+ }
82
+ /**
83
+ * Validate the authored passports against the live registry and the conformance catalog. Returns
84
+ * every mismatch (empty array = all consistent). Used by the test suite — this is what keeps a
85
+ * passport honest: structural claims must match the implementation and the conformance class.
86
+ */
87
+ export declare function validatePassports(registry: Readonly<Record<Token, Force>>, catalog: readonly ForceConformance[]): PassportProblem[];
88
+ //# sourceMappingURL=passport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passport.d.ts","sourceRoot":"","sources":["../../src/contracts/passport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG5E;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GACjB,UAAU,GACV,UAAU,GACV,QAAQ,GACR,YAAY,GACZ,QAAQ,GACR,UAAU,CAAC;AAEf,0EAA0E;AAC1E,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAO3D,CAAC;AAEF,wGAAwG;AACxG,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,QAAQ,GACR,OAAO,GACP,aAAa,GACb,WAAW,GACX,SAAS,GACT,aAAa,GACb,SAAS,CAAC;AAEd,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC;IAC7C,iHAAiH;IACjH,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,4EAA4E;IAC5E,SAAS,EAAE,OAAO,CAAC;IACnB,kEAAkE;IAClE,WAAW,EAAE,OAAO,CAAC;IACrB,6FAA6F;IAC7F,cAAc,EAAE,OAAO,CAAC;IACxB,2CAA2C;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,6DAA6D;IAC7D,cAAc,EAAE,OAAO,CAAC;IACxB,+CAA+C;IAC/C,cAAc,EAAE,OAAO,CAAC;IACxB,oDAAoD;IACpD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,0CAA0C;IAC1C,oBAAoB,EAAE,OAAO,CAAC;IAC9B,mEAAmE;IACnE,QAAQ,EAAE,OAAO,CAAC;IAClB,gFAAgF;IAChF,UAAU,EAAE,OAAO,CAAC;IACpB,6DAA6D;IAC7D,sBAAsB,EAAE,OAAO,CAAC;IAChC,0EAA0E;IAC1E,wBAAwB,EAAE,OAAO,CAAC;IAClC,uFAAuF;IACvF,eAAe,EAAE,SAAS,UAAU,EAAE,CAAC;IACvC,yFAAyF;IACzF,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AA8FD,4EAA4E;AAC5E,eAAO,MAAM,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,CAE5D,CAAC;AAEF,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,aAAa,GAAG,SAAS,CAEnE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,CAGvD;AAED,uEAAuE;AACvE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,EACxC,OAAO,EAAE,SAAS,gBAAgB,EAAE,GACnC,eAAe,EAAE,CA8BnB"}
@@ -0,0 +1,135 @@
1
+ import { EXPERIMENTS } from "../conformance/experiments.js";
2
+ /** The truth-mode catalog (what each mode classifies), for inspectors. */
3
+ export const TRUTH_MODES = {
4
+ physical: 'modeled after a real physical law',
5
+ designed: 'shaped for readable UI behavior',
6
+ hybrid: 'a designed primitive operating over natural field geometry',
7
+ diagnostic: 'reveals internal state (visualizations, inspectors)',
8
+ poetic: 'an expressive composite from stable primitives (presets)',
9
+ semantic: 'maps data/interface meaning into physics',
10
+ };
11
+ /** Per-force render-mode + composite hints (the forces where they're meaningful). Others default. */
12
+ const EXTRA = {
13
+ attract: { render: ['dots', 'metaballs'], composites: ['blackhole', 'galaxy', 'star'] },
14
+ repel: { render: ['dots'], composites: ['whitehole', 'nebula'] },
15
+ swirl: { render: ['trails', 'streamlines'], composites: ['galaxy', 'tornado'] },
16
+ stream: { render: ['trails', 'streamlines'], composites: ['fountain'] },
17
+ jet: { render: ['trails'], composites: ['fountain', 'quasar'] },
18
+ sink: { render: ['dots', 'metaballs'], composites: ['blackhole', 'accretion'] },
19
+ gravity: { render: ['field-lines', 'trails'], composites: ['blackhole', 'galaxy', 'star'] },
20
+ charge: { render: ['field-lines', 'dots'], composites: ['quasar'] },
21
+ magnetism: { render: ['field-lines', 'trails'], composites: ['star', 'quasar'] },
22
+ thermal: { render: ['heatmap', 'trails'], composites: ['star', 'nebula'] },
23
+ fieldflow: { render: ['streamlines', 'trails', 'field-lines'], composites: ['star', 'nebula', 'quasar'] },
24
+ diffuse: { render: ['heatmap'], composites: ['nebula'] },
25
+ link: { render: ['links'], composites: [] },
26
+ morph: { render: ['dots'], composites: [] },
27
+ };
28
+ // Derived fields (isSource, isModifier, canVisualize*, render/composite hints) are computed in
29
+ // `finish()`, so they can never contradict the structural facts.
30
+ function finish(r) {
31
+ const extra = EXTRA[r.token];
32
+ return {
33
+ ...r,
34
+ isSource: r.klass === 'S',
35
+ isModifier: r.klass === 'modifier',
36
+ canVisualizeFieldLines: r.ownsField,
37
+ canVisualizeForceVectors: r.movesParticles,
38
+ bestRenderModes: extra?.render ?? (r.ownsField ? ['field-lines', 'dots'] : ['dots']),
39
+ commonComposites: extra?.composites ?? [],
40
+ };
41
+ }
42
+ const C = 'canonical';
43
+ const N = 'natural';
44
+ const E = 'extended';
45
+ const ROWS = [
46
+ // ── canonical nine (§6): designed interface verbs, class A ───────────────────────────────
47
+ { token: 'attract', label: 'Attract', family: C, klass: 'A', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: true, designUse: 'draw matter into a focus / well', physicsNote: 'soft (1 − d/r)² inward pull, optional orbital swirl' },
48
+ { token: 'repel', label: 'Repel', family: C, klass: 'A', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: true, designUse: 'carve a void / keep-clear region', physicsNote: 'soft (1 − d/r)² outward push' },
49
+ { token: 'swirl', label: 'Swirl', family: C, klass: 'A', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: true, designUse: 'rotate matter around a centre', physicsNote: 'tangential-dominant swirl with light inward retention' },
50
+ { token: 'stream', label: 'Stream', family: C, klass: 'A', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: true, designUse: 'flow matter along a heading', physicsNote: 'directional push along data-angle' },
51
+ { token: 'viscosity', label: 'Viscosity', family: C, klass: 'A', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: true, affectsNeutralMatter: true, designUse: 'damp motion / calm a region', physicsNote: 'linear drag −γv (removes kinetic energy)' },
52
+ { token: 'jet', label: 'Jet', family: C, klass: 'A', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: true, designUse: 'launch matter at a heading', physicsNote: 'velocity-replacing relaunch (kinematic)' },
53
+ { token: 'tether', label: 'Tether', family: C, klass: 'A', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: true, designUse: 'bind matter to an anchor', physicsNote: 'spring toward a rest length' },
54
+ { token: 'wall', label: 'Wall', family: C, klass: 'A', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: false, conservesSpeed: true, requiresCharge: false, requiresVelocity: true, affectsNeutralMatter: true, designUse: 'bounce matter off a boundary', physicsNote: 'velocity-replacing elastic reflection (kinematic, speed preserved)' },
55
+ { token: 'sink', label: 'Sink', family: C, klass: 'A', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: true, designUse: 'capture matter (accretion well)', physicsNote: 'pull + capture within data-absorb radius, budgeted by data-max' },
56
+ // ── natural primitives (§20.10): real field laws ─────────────────────────────────────────
57
+ { token: 'gravity', label: 'Gravity', family: N, klass: 'A', truthMode: 'physical', ownsField: true, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: true, designUse: 'universal attraction toward mass', physicsNote: 'softened inverse-square GM/(d² + ε²), always attractive' },
58
+ { token: 'charge', label: 'Charge', family: N, klass: 'A', truthMode: 'physical', ownsField: true, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: true, requiresVelocity: false, affectsNeutralMatter: false, designUse: 'attract/repel charged matter', physicsNote: 'F = σ·q·GM/(d² + ε²); like repels, opposite attracts; monopole E field()' },
59
+ { token: 'magnetism', label: 'Magnetism', family: N, klass: 'A', truthMode: 'physical', ownsField: true, usesFieldAt: false, movesParticles: true, doesWork: false, conservesSpeed: true, requiresCharge: true, requiresVelocity: true, affectsNeutralMatter: false, designUse: 'curve moving charges (cyclotron)', physicsNote: 'Lorentz F = q(v × B); perpendicular, does no work; dipole B field()' },
60
+ { token: 'thermal', label: 'Thermal', family: N, klass: 'A', truthMode: 'physical', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: true, designUse: 'agitate matter at a temperature', physicsNote: 'Langevin/Brownian kicks, σ = √(2T)' },
61
+ { token: 'collide', label: 'Collide', family: N, klass: 'B', truthMode: 'physical', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: true, affectsNeutralMatter: true, designUse: 'hard-sphere / granular collision', physicsNote: 'elastic pairwise impulse, momentum-conserving (energy too at e = 1)' },
62
+ { token: 'diffuse', label: 'Diffuse', family: N, klass: 'C', truthMode: 'physical', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: true, designUse: 'spread a quantity over the medium', physicsNote: 'scalar diffusion over env.grid' },
63
+ { token: 'propagate', label: 'Propagate', family: N, klass: 'C', truthMode: 'physical', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: true, designUse: 'travelling waves through the medium', physicsNote: 'wave propagation over env.grid' },
64
+ { token: 'memory', label: 'Memory', family: N, klass: 'C', truthMode: 'semantic', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: true, designUse: 'a decaying trail / hysteresis', physicsNote: 'a persistence METRIC (FORCE_KIND = metric), not a physical law: a decaying occupancy grid that biases motion toward worn paths. Lives in natural.ts (file grouping), but its truthMode is semantic — meaning→metric — not physical.' },
65
+ // ── extended designed forces (§20.3) ─────────────────────────────────────────────────────
66
+ { token: 'fieldflow', label: 'Fieldflow', family: E, klass: 'A', truthMode: 'hybrid', ownsField: false, usesFieldAt: true, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: true, designUse: 'solar prominences, aurora, plasma streams, guided matter', physicsNote: 'field-aligned transport: steers + accelerates matter along env.fieldAt(); carries neutral matter (magnetism does not)' },
67
+ { token: 'lens', label: 'Lens', family: E, klass: 'A', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: true, affectsNeutralMatter: true, designUse: 'bend passing matter (refraction)', physicsNote: 'velocity-replacing deflection (kinematic)' },
68
+ { token: 'gate', label: 'Gate', family: E, klass: 'A', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: true, affectsNeutralMatter: true, designUse: 'admit or deflect matter at a boundary', physicsNote: 'velocity-replacing gate (kinematic)' },
69
+ { token: 'buoyancy', label: 'Buoyancy', family: E, klass: 'A', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: true, designUse: 'sort matter by size/mass vertically', physicsNote: 'size-graded vertical lift' },
70
+ { token: 'shear', label: 'Shear', family: E, klass: 'A', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: true, designUse: 'a velocity gradient across a region', physicsNote: 'position-dependent directional shear' },
71
+ { token: 'crystallize', label: 'Crystallize', family: E, klass: 'A', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: true, designUse: 'snap matter onto a lattice', physicsNote: 'pull toward nearest lattice site' },
72
+ { token: 'align', label: 'Align', family: E, klass: 'B', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: true, affectsNeutralMatter: true, designUse: 'flocking — match neighbour heading', physicsNote: 'neighbour velocity averaging (boids alignment)' },
73
+ { token: 'wind', label: 'Wind', family: E, klass: 'A', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: true, designUse: 'a directional ambient current', physicsNote: 'uniform directional push' },
74
+ { token: 'cohesion', label: 'Cohesion', family: E, klass: 'B', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: true, designUse: 'flocking — pull toward neighbours', physicsNote: 'steer toward local neighbour centroid (boids cohesion)' },
75
+ { token: 'pressure', label: 'Pressure', family: E, klass: 'B', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: true, designUse: 'relax crowding (incompressibility)', physicsNote: 'SPH density relaxation, momentum-conserving' },
76
+ { token: 'hunt', label: 'Hunt', family: E, klass: 'B', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: true, designUse: 'predator/prey pursuit and flight', physicsNote: 'species-dependent neighbour pursuit/evasion' },
77
+ { token: 'spawn', label: 'Spawn', family: E, klass: 'S', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: false, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: true, designUse: 'emit new matter (a budgeted source)', physicsNote: 'creates matter via env.spawn, once per body per frame; budgeted by lifespan + pool ceiling' },
78
+ { token: 'link', label: 'Link', family: E, klass: 'B', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: true, designUse: 'ropes / cloth between neighbours', physicsNote: 'Verlet rest-length bonds to neighbours in radius' },
79
+ { token: 'morph', label: 'Morph', family: E, klass: 'D', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: true, conservesSpeed: false, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: true, designUse: 'assemble matter into a mark/shape (never words, §11)', physicsNote: 'springs matter to body.targets marks' },
80
+ { token: 'resonate', label: 'Resonate', family: E, klass: 'modifier', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: false, doesWork: false, conservesSpeed: true, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: false, designUse: 'amplify sibling forces rhythmically', physicsNote: 'no-op apply; modify() scales sibling strength per frame' },
81
+ { token: 'spotlight', label: 'Spotlight', family: E, klass: 'modifier', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: false, doesWork: false, conservesSpeed: true, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: false, designUse: 'gate sibling forces by region/condition', physicsNote: 'no-op apply; modify() gates siblings' },
82
+ { token: 'screen', label: 'Screen', family: E, klass: 'modifier', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: false, doesWork: false, conservesSpeed: true, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: false, designUse: 'quiet zones / shield text from noisy fields', physicsNote: "no-op apply; the integrator damps OTHER bodies' forces by clamp(1 − S·(1 − d/r)², min, 1) on matter inside data-range (cross-body, unlike spotlight/resonate which modify their own siblings)" },
83
+ { token: 'pigment', label: 'Pigment', family: E, klass: 'A', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: false, doesWork: false, conservesSpeed: true, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: true, designUse: 'transport color through matter', physicsNote: 'tints particle color; does not change motion' },
84
+ { token: 'warp', label: 'Warp', family: E, klass: 'A', truthMode: 'designed', ownsField: false, usesFieldAt: false, movesParticles: true, doesWork: false, conservesSpeed: true, requiresCharge: false, requiresVelocity: false, affectsNeutralMatter: true, designUse: 'relocate matter to a paired throat (a wormhole)', physicsNote: 'velocity-replacing teleport (kinematic): repositions to the data-pair body and rotates velocity by data-twist; speed preserved, count conserved' },
85
+ ];
86
+ /** The passport registry — `token → passport`, derived fields filled in. */
87
+ export const PASSPORTS = Object.freeze(Object.fromEntries(ROWS.map((r) => [r.token, finish(r)])));
88
+ /** The passport for a force token, or `undefined` if none is registered. */
89
+ export function passportFor(token) {
90
+ return PASSPORTS[token];
91
+ }
92
+ /**
93
+ * The conformance-check labels that prove a force (testing-and-conformance §2 "Conformance tests"),
94
+ * derived from the live conformance catalog so the passport's proof list never drifts from the
95
+ * tests that actually run. Empty when a force has no experiment.
96
+ */
97
+ export function conformanceTests(token) {
98
+ const c = EXPERIMENTS.find((e) => e.scenario.force === token);
99
+ return c ? c.expectations.map((x) => x.label) : [];
100
+ }
101
+ /**
102
+ * Validate the authored passports against the live registry and the conformance catalog. Returns
103
+ * every mismatch (empty array = all consistent). Used by the test suite — this is what keeps a
104
+ * passport honest: structural claims must match the implementation and the conformance class.
105
+ */
106
+ export function validatePassports(registry, catalog) {
107
+ const problems = [];
108
+ const byToken = new Map(catalog.map((c) => [c.scenario.force, c.scenario]));
109
+ for (const token of Object.keys(registry)) {
110
+ const p = PASSPORTS[token];
111
+ if (!p) {
112
+ problems.push({ token, issue: 'no passport (every force needs one)' });
113
+ continue;
114
+ }
115
+ const force = registry[token];
116
+ const ownsField = typeof force.field === 'function';
117
+ if (p.ownsField !== ownsField)
118
+ problems.push({ token, issue: `ownsField=${p.ownsField} but force.field ${ownsField ? 'exists' : 'is absent'}` });
119
+ if (p.canVisualizeFieldLines !== ownsField)
120
+ problems.push({ token, issue: 'canVisualizeFieldLines must equal ownsField' });
121
+ const scenario = byToken.get(token);
122
+ if (scenario) {
123
+ if (p.family !== scenario.family)
124
+ problems.push({ token, issue: `family=${p.family} but conformance says ${scenario.family}` });
125
+ if (p.klass !== scenario.klass)
126
+ problems.push({ token, issue: `klass=${p.klass} but conformance says ${scenario.klass}` });
127
+ }
128
+ if (p.isSource !== (p.klass === 'S'))
129
+ problems.push({ token, issue: 'isSource must equal (klass === S)' });
130
+ if (p.isModifier !== (p.klass === 'modifier'))
131
+ problems.push({ token, issue: 'isModifier must equal (klass === modifier)' });
132
+ }
133
+ return problems;
134
+ }
135
+ //# sourceMappingURL=passport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passport.js","sourceRoot":"","sources":["../../src/contracts/passport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * field-ui formal contracts (Phase 4 — system-contracts.md §1–§18).
3
+ *
4
+ * The engine already *implements* its contracts (the `Force`, `Body`, `Env` shapes in
5
+ * `core/types.ts`, the `ShadowRegistry`, the conformance framework). This module makes them
6
+ * **explicit, declarative, and inspectable**: named contract types plus a catalog that records,
7
+ * for each, the five questions every contract must answer —
8
+ *
9
+ * What must exist? · What may mutate state? · What must stay side-effect free?
10
+ * What must be testable? · What must be inspectable?
11
+ *
12
+ * Nothing here changes runtime behavior. The force/agent *semantics* live in `passport.ts`; the
13
+ * runtime enforcement lives in `guards.ts`.
14
+ */
15
+ /** The five questions every contract answers (system-contracts §Purpose). Inspectable metadata. */
16
+ export interface ContractMeta {
17
+ /** the contract's name, e.g. "Force Contract". */
18
+ name: string;
19
+ /** what must exist for the contract to hold. */
20
+ mustExist: string;
21
+ /** what the contract is allowed to mutate. */
22
+ mayMutate: string;
23
+ /** what must remain side-effect free (pure). */
24
+ sideEffectFree: string;
25
+ /** how the contract is proven. */
26
+ testable: string;
27
+ /** how the contract is observed/debugged. */
28
+ inspectable: string;
29
+ }
30
+ /** A budgeted matter source. No unbounded creation. */
31
+ export interface SourceBudget {
32
+ /** particles spawned per body per second (or per frame, documented by the source). */
33
+ spawnRate: number;
34
+ /** hard ceiling on live particles this source may sustain. */
35
+ maxParticles: number;
36
+ /** particle lifespan in seconds before despawn (mortal matter). */
37
+ particleLife: number;
38
+ /** optional energy budget; omit for unbounded-energy (still particle-capped) sources. */
39
+ energyBudget?: number;
40
+ /** seconds between spawn bursts. */
41
+ cooldown?: number;
42
+ }
43
+ /** A budgeted matter sink. */
44
+ export interface SinkBudget {
45
+ /** maximum captured particles. */
46
+ capacity: number;
47
+ /** what happens at capacity — release them, or stop capturing. */
48
+ saturation: 'release' | 'hold' | 'destroy';
49
+ /** fraction of capacity at which `field:saturated` fires. */
50
+ saturationThreshold: number;
51
+ }
52
+ /** Every field runs within a budget. */
53
+ export interface PerformanceBudget {
54
+ particles: number;
55
+ bodies: number;
56
+ localCells: number;
57
+ fieldLines: number;
58
+ /** heatmap cell size in px (4–8 recommended). */
59
+ heatmapResolution: number;
60
+ /** device-pixel-ratio cap. */
61
+ dprCap: number;
62
+ }
63
+ /** The suggested defaults (system-contracts §15). */
64
+ export declare const DEFAULT_BUDGET: PerformanceBudget;
65
+ /** A field event must be thresholded, debounced, inspectable, and traceable to a metric. */
66
+ export interface EventContract {
67
+ /** the event type, e.g. `field:lit` (with its `forces:` alias). */
68
+ type: string;
69
+ /** the field metric that triggers it. */
70
+ sourceMetric: string;
71
+ /** crossing value that fires it (no per-frame firing by default). */
72
+ threshold: number;
73
+ /** debounce window in ms. */
74
+ debounceMs: number;
75
+ }
76
+ /** Feedback writes field state back to the DOM. May mutate presentation; must stay accessible. */
77
+ export interface FeedbackContract {
78
+ /** CSS custom properties written (e.g. `--field-density`). */
79
+ cssVars: readonly string[];
80
+ /** data-* state attributes written. */
81
+ dataState: readonly string[];
82
+ /** does it require motion to convey meaning? Must be false (accessibility). */
83
+ motionRequiredForMeaning: false;
84
+ }
85
+ /** A visualization reveals state. It must not mutate physics unless declared as feedback. */
86
+ export interface VisualizationContract {
87
+ name: string;
88
+ /** what it reads — `field()`, particle history, scalar grid, relationship agents. */
89
+ readsFrom: string;
90
+ /** must be false unless reclassified as feedback/force. */
91
+ mutatesPhysics: boolean;
92
+ }
93
+ /** A transport primitive moves matter along field geometry (fieldflow is canonical). */
94
+ export interface TransportContract {
95
+ token: string;
96
+ /** transport may do work. */
97
+ doesWork: true;
98
+ /** transport reads existing field geometry via env.fieldAt(). */
99
+ usesFieldAt: true;
100
+ /** behavior when there is no field to follow. */
101
+ zeroFieldBehavior: string;
102
+ /** behavior beyond the source's range. */
103
+ rangeBehavior: string;
104
+ /** transport must not replace another force's physical law. */
105
+ replacesForceLaw: false;
106
+ }
107
+ /** Anything that can receive influence, hold state, change behavior, or affect another thing. */
108
+ export interface AgentContract {
109
+ kind: string;
110
+ identity: string;
111
+ inputs: readonly string[];
112
+ outputs: readonly string[];
113
+ /** metrics it emits. */
114
+ metrics: readonly string[];
115
+ /** events it can dispatch. */
116
+ events: readonly string[];
117
+ /** conformance tests that prove it. */
118
+ tests: readonly string[];
119
+ }
120
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/contracts/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * field-ui formal contracts (Phase 4 — system-contracts.md §1–§18).
3
+ *
4
+ * The engine already *implements* its contracts (the `Force`, `Body`, `Env` shapes in
5
+ * `core/types.ts`, the `ShadowRegistry`, the conformance framework). This module makes them
6
+ * **explicit, declarative, and inspectable**: named contract types plus a catalog that records,
7
+ * for each, the five questions every contract must answer —
8
+ *
9
+ * What must exist? · What may mutate state? · What must stay side-effect free?
10
+ * What must be testable? · What must be inspectable?
11
+ *
12
+ * Nothing here changes runtime behavior. The force/agent *semantics* live in `passport.ts`; the
13
+ * runtime enforcement lives in `guards.ts`.
14
+ */
15
+ /** The suggested defaults (system-contracts §15). */
16
+ export const DEFAULT_BUDGET = {
17
+ particles: 600,
18
+ bodies: 80,
19
+ localCells: 3,
20
+ fieldLines: 256,
21
+ heatmapResolution: 6,
22
+ dprCap: 2,
23
+ };
24
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/contracts/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAsDH,qDAAqD;AACrD,MAAM,CAAC,MAAM,cAAc,GAAsB;IAC/C,SAAS,EAAE,GAAG;IACd,MAAM,EAAE,EAAE;IACV,UAAU,EAAE,CAAC;IACb,UAAU,EAAE,GAAG;IACf,iBAAiB,EAAE,CAAC;IACpB,MAAM,EAAE,CAAC;CACV,CAAC"}