semiotic 3.8.5 → 3.8.7

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 (277) hide show
  1. package/CLAUDE.md +37 -10
  2. package/README.md +83 -56
  3. package/ai/behaviorContracts.cjs +88 -3
  4. package/ai/componentMetadata.cjs +5 -10
  5. package/ai/dist/mcp-server.js +99 -10
  6. package/ai/examples.md +198 -9
  7. package/ai/schema.json +2002 -165
  8. package/ai/surface-manifest.json +14 -10
  9. package/ai/system-prompt.md +9 -3
  10. package/dist/{chunk-chartContainerDataAudit-74TLKIP6.module.min.js → chunk-chartContainerDataAudit-JDSVSKGM.module.min.js} +1 -1
  11. package/dist/chunk-chunk-2JGJ5GUG.module.min.js +1 -0
  12. package/dist/chunk-chunk-2YAZHXL4.module.min.js +2 -0
  13. package/dist/chunk-chunk-3NGIKFD6.module.min.js +1 -0
  14. package/dist/{chunk-chunk-G7WFWHAD.module.min.js → chunk-chunk-4ITOQRXM.module.min.js} +1 -1
  15. package/dist/chunk-chunk-5SD6BHVW.module.min.js +2 -0
  16. package/dist/chunk-chunk-6V5VQVCT.module.min.js +2 -0
  17. package/dist/chunk-chunk-7TTBHSAG.module.min.js +2 -0
  18. package/dist/chunk-chunk-7ZDJSYKI.module.min.js +2 -0
  19. package/dist/chunk-chunk-BGHPD3RA.module.min.js +1 -0
  20. package/dist/chunk-chunk-BMRZ2SPU.module.min.js +2 -0
  21. package/dist/chunk-chunk-BNGBEY7N.module.min.js +2 -0
  22. package/dist/chunk-chunk-C7APLVQD.module.min.js +2 -0
  23. package/dist/chunk-chunk-DGWFBOGB.module.min.js +1 -0
  24. package/dist/chunk-chunk-DIVE2DRA.module.min.js +2 -0
  25. package/dist/chunk-chunk-FBUNUIPV.module.min.js +2 -0
  26. package/dist/chunk-chunk-FQPKOAIH.module.min.js +2 -0
  27. package/dist/chunk-chunk-FRO4TRXK.module.min.js +2 -0
  28. package/dist/chunk-chunk-G7QVPZUD.module.min.js +2 -0
  29. package/dist/chunk-chunk-GBPYV4FP.module.min.js +2 -0
  30. package/dist/chunk-chunk-GU2EJIDJ.module.min.js +2 -0
  31. package/dist/chunk-chunk-J5QD4RAM.module.min.js +2 -0
  32. package/dist/{chunk-chunk-LJLS6DY7.module.min.js → chunk-chunk-JWXLNZSM.module.min.js} +1 -1
  33. package/dist/chunk-chunk-KXAFCCDB.module.min.js +2 -0
  34. package/dist/chunk-chunk-LG7YKJAK.module.min.js +2 -0
  35. package/dist/{chunk-chunk-I36PJ4OC.module.min.js → chunk-chunk-LVHDZAT3.module.min.js} +1 -1
  36. package/dist/chunk-chunk-LWITSR2O.module.min.js +2 -0
  37. package/dist/chunk-chunk-MX35T6RX.module.min.js +2 -0
  38. package/dist/chunk-chunk-NH4MEAKP.module.min.js +2 -0
  39. package/dist/chunk-chunk-NJETWX42.module.min.js +2 -0
  40. package/dist/chunk-chunk-NW25WGLS.module.min.js +2 -0
  41. package/dist/{chunk-chunk-TMWIZL3K.module.min.js → chunk-chunk-OI7R7EJB.module.min.js} +1 -1
  42. package/dist/chunk-chunk-ONMLEXHR.module.min.js +2 -0
  43. package/dist/chunk-chunk-OY66GCE6.module.min.js +1 -0
  44. package/dist/chunk-chunk-PZFT457G.module.min.js +1 -0
  45. package/dist/chunk-chunk-Q3WW6JGR.module.min.js +1 -0
  46. package/dist/chunk-chunk-Q6XKQTOQ.module.min.js +1 -0
  47. package/dist/chunk-chunk-RJRM2E6P.module.min.js +1 -0
  48. package/dist/chunk-chunk-RPL7WYXI.module.min.js +1 -0
  49. package/dist/chunk-chunk-SV4XAZ3Q.module.min.js +1 -0
  50. package/dist/chunk-chunk-TSCFL235.module.min.js +1 -0
  51. package/dist/chunk-chunk-UOQRPGPK.module.min.js +2 -0
  52. package/dist/chunk-chunk-V3OAKG32.module.min.js +1 -0
  53. package/dist/chunk-chunk-WLOIUMWG.module.min.js +2 -0
  54. package/dist/chunk-chunk-XEGXX4F7.module.min.js +1 -0
  55. package/dist/chunk-chunk-XFRBLXYM.module.min.js +1 -0
  56. package/dist/chunk-chunk-Z2AJERX5.module.min.js +2 -0
  57. package/dist/chunk-chunk-ZXYDYAB7.module.min.js +2 -0
  58. package/dist/components/ai/SemioticVACPBridge.d.ts +22 -0
  59. package/dist/components/ai/chartCapabilities.d.ts +5 -3
  60. package/dist/components/ai/conversationArc.d.ts +2 -176
  61. package/dist/components/ai/conversationArcTypes.d.ts +202 -0
  62. package/dist/components/ai/readerGrounding.d.ts +12 -0
  63. package/dist/components/ai/vacpAdapter.d.ts +13 -0
  64. package/dist/components/ai/vacpAdapterActions.d.ts +2 -0
  65. package/dist/components/ai/vacpAdapterModel.d.ts +7 -0
  66. package/dist/components/ai/vacpAdapterRuntime.d.ts +26 -0
  67. package/dist/components/ai/vacpAdapterState.d.ts +3 -0
  68. package/dist/components/ai/vacpAdapterTypes.d.ts +169 -0
  69. package/dist/components/ai/vacpTypes.d.ts +160 -0
  70. package/dist/components/charts/custom/XYCustomChart.d.ts +3 -0
  71. package/dist/components/charts/geo/DistanceCartogram.d.ts +1 -1
  72. package/dist/components/charts/index.d.ts +7 -4
  73. package/dist/components/charts/ordinal/BarChart.d.ts +7 -14
  74. package/dist/components/charts/ordinal/GaugeChart.d.ts +3 -0
  75. package/dist/components/charts/ordinal/GroupedBarChart.d.ts +3 -0
  76. package/dist/components/charts/ordinal/StackedBarChart.d.ts +3 -0
  77. package/dist/components/charts/ordinal/SwimlaneChart.d.ts +4 -14
  78. package/dist/components/charts/physics/ChainReactionChart.capability.d.ts +9 -0
  79. package/dist/components/charts/physics/ChainReactionChart.d.ts +29 -0
  80. package/dist/components/charts/physics/CollisionSwarmChart.d.ts +1 -1
  81. package/dist/components/charts/physics/EventDropChart.d.ts +7 -2
  82. package/dist/components/charts/physics/GaltonBoardChart.d.ts +1 -1
  83. package/dist/components/charts/physics/{PhysicsPileChart.capability.d.ts → PacketFlowChart.capability.d.ts} +1 -1
  84. package/dist/components/charts/physics/{PhysicalFlowChart.d.ts → PacketFlowChart.d.ts} +22 -6
  85. package/dist/components/charts/physics/PhysicsCustomChart.d.ts +1 -1
  86. package/dist/components/charts/physics/ProcessFlowChart.d.ts +7 -4
  87. package/dist/components/charts/physics/{PhysicalFlowChart.capability.d.ts → UnitPileChart.capability.d.ts} +1 -1
  88. package/dist/components/charts/physics/{PhysicsPileChart.d.ts → UnitPileChart.d.ts} +19 -6
  89. package/dist/components/charts/physics/crucibleChartProps.d.ts +1 -1
  90. package/dist/components/charts/physics/crucibleChartUtils.d.ts +9 -0
  91. package/dist/components/charts/physics/gauntletChartProps.d.ts +6 -1
  92. package/dist/components/charts/physics/gauntletTerminal.d.ts +61 -0
  93. package/dist/components/charts/physics/packetFlowSemantics.d.ts +6 -0
  94. package/dist/components/charts/physics/physicsHocUtils.d.ts +45 -2
  95. package/dist/components/charts/shared/auditAccessibilityStyles.d.ts +9 -0
  96. package/dist/components/charts/shared/chartSpecCore.d.ts +2 -4
  97. package/dist/components/charts/shared/gaugeGradient.d.ts +4 -8
  98. package/dist/components/charts/shared/gradient.d.ts +35 -0
  99. package/dist/components/charts/shared/hatchFill.d.ts +3 -10
  100. package/dist/components/charts/shared/hooks.d.ts +2 -50
  101. package/dist/components/charts/shared/knownChartComponents.d.ts +1 -1
  102. package/dist/components/charts/shared/streamPropsHelpers.d.ts +1 -2
  103. package/dist/components/charts/shared/useChartLegend.d.ts +65 -0
  104. package/dist/components/charts/shared/useChartSetup.d.ts +12 -0
  105. package/dist/components/charts/shared/useCustomChartSetup.d.ts +6 -1
  106. package/dist/components/charts/shared/useNetworkChartSetup.d.ts +1 -0
  107. package/dist/components/charts/shared/useStreamingLegend.d.ts +1 -1
  108. package/dist/components/charts/xy/AreaChart.d.ts +25 -42
  109. package/dist/components/charts/xy/BumpChart.capability.d.ts +11 -0
  110. package/dist/components/charts/xy/BumpChart.d.ts +161 -0
  111. package/dist/components/charts/xy/DifferenceChart.d.ts +3 -10
  112. package/dist/components/charts/xy/Heatmap.d.ts +3 -0
  113. package/dist/components/charts/xy/LineChart.d.ts +6 -8
  114. package/dist/components/data/portability/capabilityBinding.d.ts +41 -0
  115. package/dist/components/data/portability/index.d.ts +2 -0
  116. package/dist/components/geometry/bumpRibbonGeometry.d.ts +36 -0
  117. package/dist/components/legendLayout.d.ts +75 -1
  118. package/dist/components/recipes/geographicDotGrid.d.ts +82 -0
  119. package/dist/components/recipes/geographicGrid.d.ts +100 -0
  120. package/dist/components/recipes/physics.d.ts +2 -0
  121. package/dist/components/recipes/physicsStageGeography.d.ts +137 -0
  122. package/dist/components/semiotic-ai.d.ts +6 -4
  123. package/dist/components/semiotic-experimental-vacp.d.ts +11 -0
  124. package/dist/components/semiotic-experimental.d.ts +6 -3
  125. package/dist/components/semiotic-geo.d.ts +5 -0
  126. package/dist/components/semiotic-network.d.ts +1 -0
  127. package/dist/components/semiotic-ordinal.d.ts +2 -0
  128. package/dist/components/semiotic-physics.d.ts +10 -6
  129. package/dist/components/semiotic-realtime-core.d.ts +1 -0
  130. package/dist/components/semiotic-recipes-core.d.ts +6 -1
  131. package/dist/components/semiotic-server-edge.d.ts +1 -1
  132. package/dist/components/semiotic-server.d.ts +1 -1
  133. package/dist/components/semiotic-xy.d.ts +4 -0
  134. package/dist/components/semiotic.d.ts +4 -4
  135. package/dist/components/server/renderEvidence.d.ts +1 -1
  136. package/dist/components/server/renderToStaticSVG.d.ts +2 -1
  137. package/dist/components/server/serverChartConfigHeatmap.d.ts +6 -0
  138. package/dist/components/server/serverChartConfigNetworkStyles.d.ts +12 -0
  139. package/dist/components/server/serverChartConfigShared.d.ts +16 -0
  140. package/dist/components/server/serverChartConfigs.d.ts +3 -2
  141. package/dist/components/server/serverChartConfigsPhysics.d.ts +2 -2
  142. package/dist/components/server/serverChartConfigsXY.d.ts +1 -1
  143. package/dist/components/server/staticLegend.d.ts +10 -2
  144. package/dist/components/server/staticSVGChrome.d.ts +14 -6
  145. package/dist/components/server/staticValue.d.ts +8 -0
  146. package/dist/components/stream/GeoSVGOverlay.d.ts +4 -10
  147. package/dist/components/stream/NetworkSVGOverlay.d.ts +2 -6
  148. package/dist/components/stream/OrdinalSVGOverlay.d.ts +2 -6
  149. package/dist/components/stream/SVGOverlay.d.ts +2 -6
  150. package/dist/components/stream/StalenessBadge.d.ts +2 -6
  151. package/dist/components/stream/geoPipelineConfig.d.ts +10 -0
  152. package/dist/components/stream/geoTypes.d.ts +3 -6
  153. package/dist/components/stream/legendRenderer.d.ts +10 -6
  154. package/dist/components/stream/ordinalTypes.d.ts +7 -31
  155. package/dist/components/stream/physics/PhysicsEvidence.d.ts +37 -0
  156. package/dist/components/stream/physics/PhysicsKernel.d.ts +1 -0
  157. package/dist/components/stream/physics/PhysicsPipelineStore.d.ts +9 -0
  158. package/dist/components/stream/physics/PhysicsSVGOverlay.d.ts +2 -6
  159. package/dist/components/stream/physics/PhysicsSettledScene.d.ts +5 -0
  160. package/dist/components/stream/physics/StreamPhysicsTypes.d.ts +2 -6
  161. package/dist/components/stream/physics/physicsFramePipelineConfig.d.ts +19 -0
  162. package/dist/components/stream/physics/physicsPipelineSettle.d.ts +52 -0
  163. package/dist/components/stream/physics/physicsRegionRuntime.d.ts +23 -0
  164. package/dist/components/stream/pipelineConfig.d.ts +7 -15
  165. package/dist/components/stream/renderers/canvasRenderHelpers.d.ts +9 -69
  166. package/dist/components/stream/renderers/cornerRadii.d.ts +2 -9
  167. package/dist/components/stream/renderers/thresholdLineSegments.d.ts +12 -0
  168. package/dist/components/stream/sceneToSVGShared.d.ts +3 -5
  169. package/dist/components/stream/types.d.ts +34 -56
  170. package/dist/components/stream/xySceneBuilders/areaGradient.d.ts +4 -20
  171. package/dist/components/stream/xySceneBuilders/types.d.ts +6 -6
  172. package/dist/components/types/legendTypes.d.ts +31 -6
  173. package/dist/controls.min.js +1 -1
  174. package/dist/controls.module.min.js +1 -1
  175. package/dist/geo.min.js +1 -1
  176. package/dist/geo.module.min.js +1 -1
  177. package/dist/network.min.js +1 -1
  178. package/dist/network.module.min.js +1 -1
  179. package/dist/ordinal.min.js +1 -1
  180. package/dist/ordinal.module.min.js +1 -1
  181. package/dist/physics.min.js +1 -1
  182. package/dist/physics.module.min.js +1 -1
  183. package/dist/physicsWorker.js +1 -1
  184. package/dist/realtime.min.js +1 -1
  185. package/dist/realtime.module.min.js +1 -1
  186. package/dist/semiotic-ai-core.min.js +1 -1
  187. package/dist/semiotic-ai-core.module.min.js +1 -1
  188. package/dist/semiotic-ai.d.ts +6 -4
  189. package/dist/semiotic-ai.min.js +1 -1
  190. package/dist/semiotic-ai.module.min.js +1 -1
  191. package/dist/semiotic-data.module.min.js +1 -1
  192. package/dist/semiotic-experimental-vacp.d.ts +11 -0
  193. package/dist/semiotic-experimental-vacp.min.js +1 -0
  194. package/dist/semiotic-experimental-vacp.module.min.js +1 -0
  195. package/dist/semiotic-experimental.d.ts +6 -3
  196. package/dist/semiotic-experimental.min.js +2 -1
  197. package/dist/semiotic-experimental.module.min.js +2 -1
  198. package/dist/semiotic-geo.d.ts +5 -0
  199. package/dist/semiotic-network.d.ts +1 -0
  200. package/dist/semiotic-ordinal.d.ts +2 -0
  201. package/dist/semiotic-physics.d.ts +10 -6
  202. package/dist/semiotic-realtime-core.d.ts +1 -0
  203. package/dist/semiotic-realtime-core.min.js +1 -1
  204. package/dist/semiotic-realtime-core.module.min.js +1 -1
  205. package/dist/semiotic-recipes-core.d.ts +6 -1
  206. package/dist/semiotic-recipes-core.min.js +1 -1
  207. package/dist/semiotic-recipes-core.module.min.js +1 -1
  208. package/dist/semiotic-recipes.min.js +1 -1
  209. package/dist/semiotic-recipes.module.min.js +1 -1
  210. package/dist/semiotic-server-edge.d.ts +1 -1
  211. package/dist/semiotic-server-edge.min.js +1 -1
  212. package/dist/semiotic-server-edge.module.min.js +1 -1
  213. package/dist/semiotic-server-node.min.js +1 -1
  214. package/dist/semiotic-server-node.module.min.js +1 -1
  215. package/dist/semiotic-server.d.ts +1 -1
  216. package/dist/semiotic-utils-core.min.js +1 -1
  217. package/dist/semiotic-utils-core.module.min.js +1 -1
  218. package/dist/semiotic-utils.min.js +1 -1
  219. package/dist/semiotic-utils.module.min.js +1 -1
  220. package/dist/semiotic-xy.d.ts +4 -0
  221. package/dist/semiotic.d.ts +4 -4
  222. package/dist/semiotic.min.js +1 -1
  223. package/dist/semiotic.module.min.js +1 -1
  224. package/dist/server.min.js +1 -1
  225. package/dist/server.module.min.js +1 -1
  226. package/dist/xy.min.js +1 -1
  227. package/dist/xy.module.min.js +1 -1
  228. package/package.json +18 -2
  229. package/spec/README.md +94 -2
  230. package/spec/bindings/README.md +14 -3
  231. package/spec/v0.1/examples/annotation-provenance-reviewed-revision.json +27 -0
  232. package/spec/v0.1/examples/annotation-provenance-watcher-threshold.json +21 -0
  233. package/spec/v0.1/examples/audience-profile-executive-review.json +24 -0
  234. package/spec/v0.1/examples/audience-profile-incident-operators.json +42 -0
  235. package/spec/v0.1/examples/chart-capability-bar-comparison.json +48 -0
  236. package/spec/v0.1/examples/chart-capability-service-flow.json +54 -0
  237. package/dist/chunk-chunk-4AANPFOX.module.min.js +0 -2
  238. package/dist/chunk-chunk-5I3UZV4Q.module.min.js +0 -2
  239. package/dist/chunk-chunk-5RKXZQ2P.module.min.js +0 -1
  240. package/dist/chunk-chunk-74CCPVXB.module.min.js +0 -1
  241. package/dist/chunk-chunk-7ALTGHK6.module.min.js +0 -1
  242. package/dist/chunk-chunk-ANYDWOZF.module.min.js +0 -1
  243. package/dist/chunk-chunk-AVBI6GDT.module.min.js +0 -1
  244. package/dist/chunk-chunk-BANTPINB.module.min.js +0 -2
  245. package/dist/chunk-chunk-C4YA6TDR.module.min.js +0 -1
  246. package/dist/chunk-chunk-C57LR3YG.module.min.js +0 -1
  247. package/dist/chunk-chunk-CKMD5NV3.module.min.js +0 -2
  248. package/dist/chunk-chunk-CO5KQMGH.module.min.js +0 -1
  249. package/dist/chunk-chunk-CWQ5YIHX.module.min.js +0 -2
  250. package/dist/chunk-chunk-E6TXX6MI.module.min.js +0 -1
  251. package/dist/chunk-chunk-GMQ5AYTD.module.min.js +0 -1
  252. package/dist/chunk-chunk-JCG72SGW.module.min.js +0 -2
  253. package/dist/chunk-chunk-K3DMEW22.module.min.js +0 -1
  254. package/dist/chunk-chunk-KT2VAZMZ.module.min.js +0 -1
  255. package/dist/chunk-chunk-L6EA5V3G.module.min.js +0 -2
  256. package/dist/chunk-chunk-LJPCLYSC.module.min.js +0 -2
  257. package/dist/chunk-chunk-LRIFN2HK.module.min.js +0 -1
  258. package/dist/chunk-chunk-N5DDKCCF.module.min.js +0 -1
  259. package/dist/chunk-chunk-NEVE562N.module.min.js +0 -1
  260. package/dist/chunk-chunk-NLO44TOS.module.min.js +0 -2
  261. package/dist/chunk-chunk-PZJ2SBLL.module.min.js +0 -2
  262. package/dist/chunk-chunk-QSQVBIJA.module.min.js +0 -1
  263. package/dist/chunk-chunk-QUJ6TTLY.module.min.js +0 -1
  264. package/dist/chunk-chunk-RBIDBUT4.module.min.js +0 -2
  265. package/dist/chunk-chunk-RCF52Z42.module.min.js +0 -2
  266. package/dist/chunk-chunk-RFLAG356.module.min.js +0 -1
  267. package/dist/chunk-chunk-RPU4IZAV.module.min.js +0 -2
  268. package/dist/chunk-chunk-SKMBCFIL.module.min.js +0 -2
  269. package/dist/chunk-chunk-TAE7W424.module.min.js +0 -2
  270. package/dist/chunk-chunk-TUBMTZMU.module.min.js +0 -2
  271. package/dist/chunk-chunk-UFFEXJQY.module.min.js +0 -1
  272. package/dist/chunk-chunk-XSCHTS4D.module.min.js +0 -2
  273. package/dist/chunk-chunk-XXWSHGPL.module.min.js +0 -2
  274. package/dist/chunk-chunk-ZOAQDIJO.module.min.js +0 -1
  275. package/dist/chunk-chunk-ZXIXAPRE.module.min.js +0 -2
  276. package/dist/chunk-statisticalOverlays-QGDLRUHX.module.min.js +0 -1
  277. package/dist/chunk-statisticalOverlays-T77OKLDY.module.min.js +0 -1
@@ -4,7 +4,7 @@ const CATEGORY_ORDER = ["xy", "ordinal", "network", "geo", "realtime", "physics"
4
4
 
5
5
  const COMPONENTS_BY_CATEGORY = {
6
6
  xy: [
7
- "LineChart", "AreaChart", "DifferenceChart", "StackedAreaChart", "Scatterplot", "QuadrantChart",
7
+ "LineChart", "BumpChart", "AreaChart", "DifferenceChart", "StackedAreaChart", "Scatterplot", "QuadrantChart",
8
8
  "MultiAxisLineChart", "CandlestickChart", "BubbleChart", "Heatmap",
9
9
  "ConnectedScatterplot", "ScatterplotMatrix", "MinimapChart",
10
10
  ],
@@ -25,8 +25,9 @@ const COMPONENTS_BY_CATEGORY = {
25
25
  "RealtimeWaterfallChart", "RealtimeHeatmap",
26
26
  ],
27
27
  physics: [
28
- "GaltonBoardChart", "EventDropChart", "PhysicsPileChart", "CollisionSwarmChart",
29
- "PhysicalFlowChart", "ProcessFlowChart", "GauntletChart", "CrucibleChart",
28
+ "GaltonBoardChart", "EventDropChart", "UnitPileChart", "CollisionSwarmChart",
29
+ "PacketFlowChart", "ProcessFlowChart", "GauntletChart", "CrucibleChart",
30
+ "ChainReactionChart",
30
31
  ],
31
32
  value: [
32
33
  "BigNumber",
@@ -67,17 +68,11 @@ function metadataForComponent(entryOrName) {
67
68
  // any other static HOC. Matches the name-prefix exclusion the
68
69
  // check-surface-parity script applies.
69
70
  const isPushOnly = category === "realtime" && name.startsWith("Realtime")
70
- // Value-family charts (BigNumber, future SingleValueFrame HOCs)
71
- // render via react-dom/server in a normal React tree, but they do
72
- // not route through the frame-driven `renderChart` path in
73
- // serverChartConfigs.ts — so they are not MCP-renderable. Mirrors
74
- // the `hoc-ssr-only` special feature documented in chartSpecs.ts.
75
- const isValueCategory = category === "value"
76
71
  return {
77
72
  name,
78
73
  category,
79
74
  importPath: importPathForCategory(category),
80
- renderable: !isPushOnly && !isValueCategory,
75
+ renderable: !isPushOnly,
81
76
  description: typeof entryOrName === "string" ? undefined : entryOrName.description,
82
77
  }
83
78
  }
@@ -6898,6 +6898,7 @@ var require_componentMetadata = __commonJS({
6898
6898
  var COMPONENTS_BY_CATEGORY = {
6899
6899
  xy: [
6900
6900
  "LineChart",
6901
+ "BumpChart",
6901
6902
  "AreaChart",
6902
6903
  "DifferenceChart",
6903
6904
  "StackedAreaChart",
@@ -6955,12 +6956,13 @@ var require_componentMetadata = __commonJS({
6955
6956
  physics: [
6956
6957
  "GaltonBoardChart",
6957
6958
  "EventDropChart",
6958
- "PhysicsPileChart",
6959
+ "UnitPileChart",
6959
6960
  "CollisionSwarmChart",
6960
- "PhysicalFlowChart",
6961
+ "PacketFlowChart",
6961
6962
  "ProcessFlowChart",
6962
6963
  "GauntletChart",
6963
- "CrucibleChart"
6964
+ "CrucibleChart",
6965
+ "ChainReactionChart"
6964
6966
  ],
6965
6967
  value: [
6966
6968
  "BigNumber"
@@ -6990,12 +6992,11 @@ var require_componentMetadata = __commonJS({
6990
6992
  const name = typeof entryOrName === "string" ? entryOrName : entryOrName.name;
6991
6993
  const category = categoryForComponent(name);
6992
6994
  const isPushOnly = category === "realtime" && name.startsWith("Realtime");
6993
- const isValueCategory = category === "value";
6994
6995
  return {
6995
6996
  name,
6996
6997
  category,
6997
6998
  importPath: importPathForCategory(category),
6998
- renderable: !isPushOnly && !isValueCategory,
6999
+ renderable: !isPushOnly,
6999
7000
  description: typeof entryOrName === "string" ? void 0 : entryOrName.description
7000
7001
  };
7001
7002
  }
@@ -7518,7 +7519,7 @@ var require_behaviorContracts = __commonJS({
7518
7519
  required: ["value"],
7519
7520
  staticRequired: ["value"],
7520
7521
  pushRequired: [],
7521
- summary: "GaugeChart is value-only. thresholds, min, max, sweep, and arcWidth are optional."
7522
+ summary: "GaugeChart is value-only. Its thresholds use { value, color, label? }; BigNumber thresholds use the distinct { at, level, color?, label? } vocabulary."
7522
7523
  },
7523
7524
  {
7524
7525
  component: "ForceDirectedGraph",
@@ -7556,7 +7557,16 @@ var require_behaviorContracts = __commonJS({
7556
7557
  "SankeyDiagram",
7557
7558
  "ChordDiagram",
7558
7559
  "ProportionalSymbolMap",
7559
- "DistanceCartogram"
7560
+ "DistanceCartogram",
7561
+ "GaltonBoardChart",
7562
+ "EventDropChart",
7563
+ "UnitPileChart",
7564
+ "CollisionSwarmChart",
7565
+ "PacketFlowChart",
7566
+ "ProcessFlowChart",
7567
+ "GauntletChart",
7568
+ "CrucibleChart",
7569
+ "ChainReactionChart"
7560
7570
  ];
7561
7571
  var STATIC_DATA_COMPONENTS = loadStaticDataComponentsFromSchema();
7562
7572
  var BEHAVIOR_CONTRACTS2 = [
@@ -7614,6 +7624,18 @@ var require_behaviorContracts = __commonJS({
7614
7624
  summary: "HOC push mode is selected by omitting the data prop entirely. Passing data={[]} is static empty data and can clear/reinitialize the frame on render.",
7615
7625
  agentAction: "For live charts, create a ref, omit data, then call ref.current.push() or pushMany(). For static renderChart/MCP snapshots, provide data because renderChart cannot push later."
7616
7626
  },
7627
+ {
7628
+ id: "streaming.serialized-proposal-snapshot",
7629
+ category: "streaming",
7630
+ title: "Serialized proposals keep the initial snapshot",
7631
+ severity: "warning",
7632
+ appliesTo: {
7633
+ components: PUSH_MODE_COMPONENTS
7634
+ },
7635
+ summary: "A JSON component/props proposal for MCP, SSR, or evaluation is a static snapshot even when the request mentions future pushes. Keep the supplied initial rows in the component's real data prop and do not invent pushRows, pushRequirement, ref, or method props.",
7636
+ agentAction: "Return renderable initial props in JSON. If the requested deliverable is React push code, separately omit the controlled data prop in JSX, attach a ref, and call the documented imperative method from an effect or event handler.",
7637
+ example: 'JSON snapshot: { "component": "LineChart", "props": { "data": [{"week":1,"users":120}], "xAccessor":"week", "yAccessor":"users" } }. React push code instead omits data and calls ref.current?.push(row).'
7638
+ },
7617
7639
  {
7618
7640
  id: "streaming.ref-mutations-require-id-accessors",
7619
7641
  category: "streaming",
@@ -7633,6 +7655,66 @@ var require_behaviorContracts = __commonJS({
7633
7655
  appliesTo: {},
7634
7656
  summary: "MCP renderChart and semiotic/server renderChart render a single static SVG/PNG snapshot. Browser-only realtime components and future ref pushes are not renderable through that path.",
7635
7657
  agentAction: "Use renderChart only with renderable HOC components and complete static data. For live behavior, return React code with a ref and do not promise MCP-rendered output."
7658
+ },
7659
+ {
7660
+ id: "serialization.formatters-are-react-callbacks",
7661
+ category: "serialization",
7662
+ title: "Axis formatters are React callbacks",
7663
+ severity: "error",
7664
+ appliesTo: {
7665
+ propsAny: ["xFormat", "yFormat", "categoryFormat", "valueFormat"]
7666
+ },
7667
+ summary: "xFormat, yFormat, categoryFormat, and valueFormat are callback props, not d3 format strings or axis-title strings. They are intentionally absent from JSON/MCP schemas and string values fail validation.",
7668
+ agentAction: "In serialized props, omit formatter callbacks and use xLabel, yLabel, categoryLabel, or valueLabel for axis titles. In React JSX, pass a function such as xFormat={value => formatAxis(value)}.",
7669
+ example: 'JSON: { "xLabel": "Payload (KB)", "yLabel": "Response time (ms)" }. React-only: xFormat={value => formatNumber(value, { maximumFractionDigits: 0 })}.'
7670
+ },
7671
+ {
7672
+ id: "value.bignumber-wire-contract",
7673
+ category: "value",
7674
+ title: "Value components do not inherit chart-HOC props",
7675
+ severity: "error",
7676
+ appliesTo: {
7677
+ components: ["BigNumber"]
7678
+ },
7679
+ summary: "BigNumber is a value component, not a chart HOC, so it does not inherit the common chart-HOC prop list. It uses label as its visible heading and supports description and summary; title and accessibleTable are invalid. Its percent format expects a ratio such as 0.97 and renders it as 97%.",
7680
+ agentAction: 'Validate BigNumber against its own prop schema and remove inherited chart-HOC props such as title and accessibleTable before returning a proposal. Use label, description, and summary for text. For a 97-of-100 KPI, either pass value={0.97} with format="percent" or pass value={97} with format="number" and suffix="%"; do not combine value={97} with format="percent".',
7681
+ example: '{ "component": "BigNumber", "props": { "value": 97, "label": "SLA attainment", "format": "number", "suffix": "%", "target": { "value": 99, "label": "target", "format": "number" } } }'
7682
+ },
7683
+ {
7684
+ id: "geo.proportional-symbol-wire-shape",
7685
+ category: "geo",
7686
+ title: "Proportional symbol maps use geographic props",
7687
+ severity: "error",
7688
+ appliesTo: {
7689
+ components: ["ProportionalSymbolMap"]
7690
+ },
7691
+ summary: "ProportionalSymbolMap reads point rows from points, longitude from xAccessor (default lon), latitude from yAccessor (default lat), and radius from sizeBy. sizeRange is the two-number pixel-radius range.",
7692
+ agentAction: "Use points, xAccessor, yAccessor, and sizeBy. Do not rename points to data or sizeBy to valueAccessor merely because the map renders circles.",
7693
+ example: '{ "points": [{"city":"A","longitude":-122.4,"latitude":37.8,"incidents":18}], "xAccessor":"longitude", "yAccessor":"latitude", "sizeBy":"incidents", "sizeRange":[5,40] }'
7694
+ },
7695
+ {
7696
+ id: "physics.sample-and-mechanical-inputs",
7697
+ category: "physics",
7698
+ title: "Physics charts separate chart mode from simulation input",
7699
+ severity: "warning",
7700
+ appliesTo: {
7701
+ components: ["GaltonBoardChart", "UnitPileChart", "CollisionSwarmChart"]
7702
+ },
7703
+ summary: `Sample simulations use data plus the chart's accessors. Seeded no-data demonstrations use simulationMode="mechanical" (legacy mode="mechanical" remains accepted); mode otherwise carries chart display modes such as primary or sparkline.`,
7704
+ agentAction: "For observed Galton values pass data + valueAccessor. For unit piles pass data + categoryAccessor + valueAccessor. Use seed for reproducibility, bins for Galton columns, and unitValue for the amount represented by one UnitPile body.",
7705
+ example: '{ "component": "GaltonBoardChart", "props": { "data": [{"id":"a","value":1}], "valueAccessor":"value", "bins":4, "seed":42 } }'
7706
+ },
7707
+ {
7708
+ id: "physics.push-uses-source-records",
7709
+ category: "physics",
7710
+ title: "Physics push methods ingest source records",
7711
+ severity: "error",
7712
+ appliesTo: {
7713
+ components: ["GaltonBoardChart", "EventDropChart", "UnitPileChart", "CollisionSwarmChart"]
7714
+ },
7715
+ summary: "Physics HOC refs push source records through the chart's accessors. pushRows and dataIdAccessor are not component props; stable source id fields are retained on spawned bodies without an invented accessor.",
7716
+ agentAction: "For React live code, call ref.current?.push(row) or pushMany(rows). For serialized snapshots, append the rows to data. Keep category/value/time accessors, but omit pushRows and dataIdAccessor.",
7717
+ example: 'ref.current?.push({ id: "c", team: "Blue", value: 2 }); <UnitPileChart ref={ref} categoryAccessor="team" valueAccessor="value" unitValue={1} />'
7636
7718
  }
7637
7719
  ];
7638
7720
  function hasOwn(value, key) {
@@ -7686,6 +7768,7 @@ var require_behaviorContracts = __commonJS({
7686
7768
  lines.push(` ${formatRequiredCombination(combo)}`);
7687
7769
  }
7688
7770
  }
7771
+ if (contract.example) lines.push(` Example: ${contract.example}`);
7689
7772
  lines.push(` Action: ${contract.agentAction}`);
7690
7773
  }
7691
7774
  return lines.join("\n");
@@ -7708,6 +7791,9 @@ var require_behaviorContracts = __commonJS({
7708
7791
  const combos = contract.combinations.map(formatRequiredCombination).join(" ");
7709
7792
  lines.push(` Required combinations: ${combos}`);
7710
7793
  }
7794
+ if (!compact && contract.example) {
7795
+ lines.push(` Example: \`${contract.example}\``);
7796
+ }
7711
7797
  }
7712
7798
  lines.push("", DOC_MARKER_END);
7713
7799
  return lines.join("\n");
@@ -33016,6 +33102,7 @@ var import_geo = require("semiotic/geo");
33016
33102
  var COMPONENT_REGISTRY = {
33017
33103
  LineChart: { component: import_ai.LineChart, category: "xy" },
33018
33104
  AreaChart: { component: import_ai.AreaChart, category: "xy" },
33105
+ BumpChart: { component: import_ai.BumpChart, category: "xy" },
33019
33106
  DifferenceChart: { component: import_ai.DifferenceChart, category: "xy" },
33020
33107
  StackedAreaChart: { component: import_ai.StackedAreaChart, category: "xy" },
33021
33108
  Scatterplot: { component: import_ai.Scatterplot, category: "xy" },
@@ -33057,12 +33144,14 @@ var COMPONENT_REGISTRY = {
33057
33144
  DistanceCartogram: { component: import_geo.DistanceCartogram, category: "geo" },
33058
33145
  GaltonBoardChart: { component: import_ai.GaltonBoardChart, category: "physics" },
33059
33146
  EventDropChart: { component: import_ai.EventDropChart, category: "physics" },
33060
- PhysicsPileChart: { component: import_ai.PhysicsPileChart, category: "physics" },
33147
+ UnitPileChart: { component: import_ai.UnitPileChart, category: "physics" },
33061
33148
  CollisionSwarmChart: { component: import_ai.CollisionSwarmChart, category: "physics" },
33062
- PhysicalFlowChart: { component: import_ai.PhysicalFlowChart, category: "physics" },
33149
+ PacketFlowChart: { component: import_ai.PacketFlowChart, category: "physics" },
33063
33150
  ProcessFlowChart: { component: import_ai.ProcessFlowChart, category: "physics" },
33064
33151
  GauntletChart: { component: import_ai.GauntletChart, category: "physics" },
33065
- CrucibleChart: { component: import_ai.CrucibleChart, category: "physics" }
33152
+ CrucibleChart: { component: import_ai.CrucibleChart, category: "physics" },
33153
+ ChainReactionChart: { component: import_ai.ChainReactionChart, category: "physics" },
33154
+ BigNumber: { component: import_ai.BigNumber, category: "value" }
33066
33155
  };
33067
33156
 
33068
33157
  // ai/renderHOCToSVG.tsx
package/ai/examples.md CHANGED
@@ -57,6 +57,34 @@ const data = [
57
57
 
58
58
  Key props: `lineBy` groups flat array into separate lines, `colorBy` colors them
59
59
 
60
+ ### LineChart (dynamic value accessor)
61
+
62
+ When each row identifies which numeric field to plot, use an accessor function
63
+ instead of forcing the value through a single field name. This is especially
64
+ useful for multi-line data with a different metric per series.
65
+
66
+ ```jsx
67
+ import { LineChart } from "semiotic/ai"
68
+
69
+ const data = [
70
+ { timestamp: 1, metricLabel: "valueA", valueA: 12, valueB: 60 },
71
+ { timestamp: 2, metricLabel: "valueA", valueA: 18, valueB: 55 },
72
+ { timestamp: 1, metricLabel: "valueB", valueA: 12, valueB: 60 },
73
+ { timestamp: 2, metricLabel: "valueB", valueA: 18, valueB: 55 }
74
+ ]
75
+
76
+ <LineChart
77
+ data={data}
78
+ xAccessor="timestamp"
79
+ yAccessor={(d) => d[d.metricLabel]}
80
+ lineBy="metricLabel"
81
+ colorBy="metricLabel"
82
+ />
83
+ ```
84
+
85
+ Key props: accessors accept a field-name string or a function. Prefer a string
86
+ for a direct lookup; use a function for a computed or dynamic value.
87
+
60
88
  ### Scatterplot
61
89
 
62
90
  ```jsx
@@ -147,7 +175,12 @@ const data = [
147
175
  data={data}
148
176
  xAccessor="month"
149
177
  yAccessor="revenue"
150
- gradientFill
178
+ gradientFill={{
179
+ stops: [
180
+ { offset: 0, opacity: 0.8 },
181
+ { offset: 1, opacity: 0.05 }
182
+ ]
183
+ }}
151
184
  xLabel="Month"
152
185
  yLabel="Revenue ($)"
153
186
  />
@@ -180,7 +213,12 @@ const data = [
180
213
  y0Accessor="p5"
181
214
  showLine={false}
182
215
  areaOpacity={0.3}
183
- gradientFill
216
+ gradientFill={{
217
+ stops: [
218
+ { offset: 0, opacity: 0.8 },
219
+ { offset: 1, opacity: 0.05 }
220
+ ]
221
+ }}
184
222
  width={600}
185
223
  height={400}
186
224
  />
@@ -235,6 +273,38 @@ Fills the region between two series with a color that switches based on which se
235
273
 
236
274
  Key props: `seriesALabel` / `seriesBLabel` (legend + tooltip), `seriesAColor` / `seriesBColor` (defaults to `var(--semiotic-danger)` / `var(--semiotic-info)`), `showLines` (default `true` — draws both series on top of the fill), `areaOpacity` (0.6), `gradientFill` (same shape as AreaChart), `windowSize` (max raw rows in push buffer; FIFO eviction). Push API: `ref.current.push({ x, a, b })` — accessor outputs coerce through a `toNumber` helper so `Date` (time series) and numeric strings (CSV/JSON) work transparently.
237
275
 
276
+ ### BumpChart
277
+
278
+ ```jsx
279
+ import { BumpChart } from "semiotic/ai"
280
+
281
+ const data = [
282
+ { quarter: "Q1", team: "North", sales: 420 },
283
+ { quarter: "Q1", team: "South", sales: 380 },
284
+ { quarter: "Q1", team: "East", sales: 510 },
285
+ { quarter: "Q1", team: "West", sales: 290 },
286
+ { quarter: "Q2", team: "North", sales: 460 },
287
+ { quarter: "Q2", team: "South", sales: 500 },
288
+ { quarter: "Q2", team: "East", sales: 480 },
289
+ { quarter: "Q2", team: "West", sales: 350 },
290
+ { quarter: "Q3", team: "North", sales: 610 },
291
+ { quarter: "Q3", team: "South", sales: 470 },
292
+ { quarter: "Q3", team: "East", sales: 520 },
293
+ { quarter: "Q3", team: "West", sales: 540 }
294
+ ]
295
+
296
+ <BumpChart
297
+ data={data}
298
+ xAccessor="quarter"
299
+ yAccessor="sales"
300
+ lineBy="team"
301
+ highlightTop={2}
302
+ xLabel="Quarter"
303
+ />
304
+ ```
305
+
306
+ Ranks every series within each x-column and connects each series' rank across columns — the classic "who's leading over time" chart. `yAccessor` is the magnitude used to rank (highest value = rank 1 by default; use `rankDirection="ascending"` when lower is better). `highlightTop` colors only the N best series by mean rank and greys the rest via `neutralColor`. Set `ribbon={true}` to encode the raw magnitude as true perpendicular-offset ribbon width instead of fixed-width lines — line and ribbon share the same centerline geometry, so `animate` tweens only the width. Endpoint labels show by default (`showLabels`).
307
+
238
308
  ### StackedAreaChart
239
309
 
240
310
  ```jsx
@@ -784,6 +854,33 @@ Key props: **`edges`** (required), shows bidirectional relationships in a circle
784
854
 
785
855
  ## Realtime — Push API via Ref
786
856
 
857
+ ### Serialized snapshot versus React push code
858
+
859
+ When an MCP, SSR, or evaluation request asks for component/props JSON and also
860
+ mentions future pushes, keep the supplied initial rows in the serialized
861
+ snapshot. `pushRows`, `pushRequirement`, `ref`, and `method` are orchestration
862
+ instructions, not chart props.
863
+
864
+ ```json
865
+ {
866
+ "component": "LineChart",
867
+ "props": {
868
+ "data": [
869
+ { "week": 1, "users": 120 },
870
+ { "week": 2, "users": 138 }
871
+ ],
872
+ "xAccessor": "week",
873
+ "yAccessor": "users",
874
+ "xLabel": "Week",
875
+ "yLabel": "Active users"
876
+ }
877
+ }
878
+ ```
879
+
880
+ React push code has a different lifecycle: omit `data`, attach a ref, and push
881
+ the initial or newly arrived rows from an effect. Formatter callbacks such as
882
+ `xFormat` are JSX-only; serialized axis titles belong in `xLabel` and `yLabel`.
883
+
787
884
  ### RealtimeLineChart
788
885
 
789
886
  ```jsx
@@ -1264,6 +1361,40 @@ Key APIs: `WordTrailsWordInfo` gives `word`, `column`, `weight`, and `segment` p
1264
1361
 
1265
1362
  ---
1266
1363
 
1364
+ ## Geographic Charts
1365
+
1366
+ ### ProportionalSymbolMap
1367
+
1368
+ ```jsx
1369
+ import { ProportionalSymbolMap } from "semiotic/geo"
1370
+
1371
+ const incidents = [
1372
+ { id: "a", city: "A", longitude: -122.4, latitude: 37.8, incidents: 18 },
1373
+ { id: "b", city: "B", longitude: -74.0, latitude: 40.7, incidents: 31 },
1374
+ { id: "c", city: "C", longitude: -87.6, latitude: 41.9, incidents: 12 },
1375
+ ]
1376
+
1377
+ <ProportionalSymbolMap
1378
+ points={incidents}
1379
+ xAccessor="longitude"
1380
+ yAccessor="latitude"
1381
+ sizeBy="incidents"
1382
+ sizeRange={[5, 40]}
1383
+ colorBy="city"
1384
+ showLegend
1385
+ />
1386
+ ```
1387
+
1388
+ The geographic wire vocabulary is deliberate: rows live in `points`,
1389
+ longitude and latitude use `xAccessor` and `yAccessor`, and symbol radius uses
1390
+ `sizeBy`. Do not substitute the generic `data` or `valueAccessor` names.
1391
+
1392
+ For live React code, omit `points` and push source records through the ref:
1393
+ `ref.current?.push({ id, longitude, latitude, incidents })`. For a static JSON
1394
+ snapshot, keep all observed records in `points`.
1395
+
1396
+ ---
1397
+
1267
1398
  ## Physics Charts — Motion With A Settled Projection
1268
1399
 
1269
1400
  ### GaltonBoardChart (distribution drop)
@@ -1310,12 +1441,12 @@ import { EventDropChart } from "semiotic/physics"
1310
1441
 
1311
1442
  Key props: `timeAccessor` assigns the event-time window, `arrivalAccessor` controls arrival replay, `windows.size` creates barriers, and `watermark.delay` sends late events to the late path.
1312
1443
 
1313
- ### PhysicsPileChart (unitized category piles)
1444
+ ### UnitPileChart (unitized category piles)
1314
1445
 
1315
1446
  ```jsx
1316
- import { PhysicsPileChart } from "semiotic/physics"
1447
+ import { UnitPileChart } from "semiotic/physics"
1317
1448
 
1318
- <PhysicsPileChart
1449
+ <UnitPileChart
1319
1450
  data={[
1320
1451
  { category: "Orders", value: 18 },
1321
1452
  { category: "Queued", value: 11 },
@@ -1331,6 +1462,34 @@ import { PhysicsPileChart } from "semiotic/physics"
1331
1462
 
1332
1463
  Key props: `unitValue` controls how many simulated bodies appear. Increase it for large values so the settled piles remain readable and the frame budget stays bounded.
1333
1464
 
1465
+ For a live unit pile, the ref ingests the same source-row shape the static
1466
+ `data` prop uses:
1467
+
1468
+ ```jsx
1469
+ import { useEffect, useRef } from "react"
1470
+ import { UnitPileChart } from "semiotic/physics"
1471
+
1472
+ const pileRef = useRef(null)
1473
+
1474
+ useEffect(() => {
1475
+ pileRef.current?.push({ id: "c", team: "Blue", value: 2 })
1476
+ }, [])
1477
+
1478
+ <UnitPileChart
1479
+ ref={pileRef}
1480
+ categoryAccessor="team"
1481
+ valueAccessor="value"
1482
+ unitValue={1}
1483
+ seed={42}
1484
+ title="Queued work by team"
1485
+ />
1486
+ ```
1487
+
1488
+ `pushRows` and `dataIdAccessor` are not physics chart props. Keep an `id` on
1489
+ source records when identity matters; the physics HOC retains it on the spawned
1490
+ bodies. For a static JSON proposal, append the incoming rows to `data` so the
1491
+ snapshot can render immediately.
1492
+
1334
1493
  ### CollisionSwarmChart (axis-preserving collision layout)
1335
1494
 
1336
1495
  ```jsx
@@ -1355,12 +1514,12 @@ import { CollisionSwarmChart } from "semiotic/physics"
1355
1514
  Key props: `xAccessor` preserves the quantitative position, `groupAccessor` creates lanes, and collision settings separate overlapping records without losing the axis.
1356
1515
 
1357
1516
 
1358
- ### PhysicalFlowChart (packet flow over routes)
1517
+ ### PacketFlowChart (packet flow over routes)
1359
1518
 
1360
1519
  ```jsx
1361
- import { PhysicalFlowChart } from "semiotic/physics"
1520
+ import { PacketFlowChart } from "semiotic/physics"
1362
1521
 
1363
- <PhysicalFlowChart
1522
+ <PacketFlowChart
1364
1523
  nodes={[
1365
1524
  { id: "Inbound", x: 0.08, y: 0.5 },
1366
1525
  { id: "Queue", x: 0.45, y: 0.32 },
@@ -1407,6 +1566,36 @@ import { ProcessFlowChart } from "semiotic/physics"
1407
1566
 
1408
1567
  Key props: `stages` declare force / capacity / absorb behavior, `groupBy` forms feature sockets that complete when every member is absorbed, and `liveCapacity` installs FIFO queue controllers for capacitated stages. Prefer ProcessFlowChart for many independent work items; use GauntletChart for one compound project degraded by gates.
1409
1568
 
1569
+ ### ChainReactionChart (dependency reach and blockers)
1570
+
1571
+ ```jsx
1572
+ import { ChainReactionChart } from "semiotic/physics"
1573
+
1574
+ const releaseTasks = [
1575
+ { id: "brief", title: "Brief", lane: "Product", dependsOn: [], status: "done", completedAt: 1 },
1576
+ { id: "privacy", title: "Privacy review", lane: "Product", dependsOn: ["brief"], status: "blocked", blocker: "Legal review" },
1577
+ { id: "schema", title: "Schema", lane: "Data", dependsOn: ["privacy"], status: "waiting" },
1578
+ { id: "ingest", title: "Ingest", lane: "Data", dependsOn: ["schema"], status: "waiting" },
1579
+ ]
1580
+
1581
+ <ChainReactionChart
1582
+ data={releaseTasks}
1583
+ taskIDAccessor="id"
1584
+ labelAccessor="title"
1585
+ laneAccessor="lane"
1586
+ dependencyAccessor="dependsOn"
1587
+ statusAccessor="status"
1588
+ completionTimeAccessor="completedAt"
1589
+ blockerAccessor="blocker"
1590
+ currentTime={10}
1591
+ mode="snapshot"
1592
+ insight="blocker-amplification"
1593
+ size={[800, 420]}
1594
+ />
1595
+ ```
1596
+
1597
+ Key props: `dependencyAccessor` must name explicit prerequisite ids — the chart never invents edges from a flat table. `statusAccessor` and `completionTimeAccessor` are authored task facts; delivery balls only enact satisfied prerequisites. Use `insight="blocker-amplification"` to expose how many unfinished downstream tasks and lanes each blocker reaches.
1598
+
1410
1599
  ### GauntletChart (compound project through timed gates)
1411
1600
 
1412
1601
  ```jsx
@@ -1548,7 +1737,7 @@ import { BigNumber } from "semiotic/value"
1548
1737
  />
1549
1738
  ```
1550
1739
 
1551
- Key props: `value` (the one number), `format` ("number"|"currency"|"percent"|"compact"|"duration"|fn), `comparison` derives a delta with auto-sentiment, `target` renders "X% of goal", `thresholds` map value to a semantic theme role (`--semiotic-{success|warning|danger|info}`). Suppress decoration via `mode="thumbnail"` for dense grids or `mode="inline"` for prose. Stream via `ref.current.push({ value, time })` — pair with `stalenessThreshold` to dim the card when updates stop.
1740
+ Key props: `value` (the focal number), `label` (the visible heading), `description` and `summary` (accessible text), `comparison`, `target`, and `thresholds`. BigNumber does not use chart-frame `title` or `accessibleTable` props. Built-in `format` values are `"number"`, `"currency"`, `"percent"`, `"compact"`, and `"duration"`; custom formatter functions are React-only. `"percent"` treats its input as a ratio, so `0.97` renders as 97%. For an existing 0–100 value such as 97, use `format="number"` with `suffix="%"`. Suppress decoration via `mode="thumbnail"` for dense grids or `mode="inline"` for prose. Stream via `ref.current.push({ value, time })` — pair with `stalenessThreshold` to dim the card when updates stop.
1552
1741
 
1553
1742
  ### BigNumber with a Semiotic chart embedded via `trendSlot` (wide / rectangular)
1554
1743