Download Latest Version Semiotic v3.8.9 source code.zip (61.0 MB)
Email in envelope

Get an email when there's a new version of Semiotic

Home / v3.8.7
Name Modified Size InfoDownloads / Week
Parent folder
semiotic-3.8.7.provenance.json 2026-07-28 1.6 kB
semiotic-3.8.7.sbom.cdx.json 2026-07-28 90.8 kB
semiotic-3.8.7.tgz 2026-07-28 5.0 MB
semiotic-3.8.7.tgz.sha512 2026-07-28 149 Bytes
README.md 2026-07-28 22.5 kB
Semiotic v3.8.7 source code.tar.gz 2026-07-28 58.1 MB
Semiotic v3.8.7 source code.zip 2026-07-28 60.0 MB
Totals: 7 Items   123.2 MB 1

Changed

  • A high-touch evaluation example makes the prove track inspectable. /examples/the-benchmark-is-a-chart-too turns the completed 516-request GPT-5.6 compatibility baseline and its 603-request repeated follow-up into an evidence-first reading room. It separates answerable questions from correct abstentions, preserves the first-attempt failure matrix and cost/latency context, documents the scorer audit, and shows where the revised grounding payload and generation contracts held across repeated trials. Targeted result scoring now reports only submitted fixtures while retaining the available corpus size and distinguishes missing submissions from pending or otherwise unscored rows.
  • The HRA/WPP typology pilot now runs on the real kidney ASCT+B v1.6 digital object. A pinned generator produces a checked-in, workshop-ready artifact for the observed direct children of kidney, with ontology IDs kept as semantic keys, provisional cell-type review signals kept separate from measured counts, and a public /interoperability/hra-wpp walkthrough. The actual data exposed the pilot's first failure case: distinct ontology concepts share labels, while mixing parent and descendant rows turns hierarchy into a misleading rank. A focused regression test pins both corrections. A public workshop bundle now adds the exact kidney fixture, a 30-minute review protocol, response schema/template, explicit extension-vs-context decision rubric, and written co-sign template.
  • MCP 3.8.6 distribution is verified end to end. The official io.github.nteract/semiotic Registry entry marks 3.8.6 latest, and stable Cloud Run revision semiotic-mcp-server-00071-2rw now serves the exact release with commit/build identity. The production smoke passes health, initialize, public tools, resources/build-info, render evidence, and schema retrieval. Its initialize assertion is now channel-aware: stable requires semiotic plus the exact package version, while nightly retains the commit-qualified semiotic-nightly contract.
  • MCP Registry publication now follows every release instead of one pinned version. The reusable publisher derives the exact version from the checked-out package manifest, runs only after npm publication, and remains manually dispatchable for backfills. The local Registry gate now rejects a reintroduced literal version or a release workflow that stops calling the publisher. A source-controlled distribution inventory records canonical paths, stale secondary cards, and the distinction between Registry publication and assistant-vendor acceptance; the broken Smithery link and stale Glama badge are no longer promoted in the README.
  • SSR/RSC and accessibility positioning now matches the shipped surface. README, SSR, and migration guidance consistently show non-streaming chart HOCs imported directly by a Next.js Server Component through Semiotic's client boundary; an app-owned wrapper is reserved for hooks, callbacks, browser state, or push-driven streaming. Accessibility language now states the EAA date and the infrastructure Semiotic supplies without claiming that a chart library certifies application-level legal compliance.
  • Physics charts now consume and produce linked hover. The eight standard physics HOCs already resolved named selection stores over body.datum; their StreamPhysicsFrame.onBodyHover path now publishes the source datum through the shared hover store and clears it on leave. Authored wrapper bodies such as Gauntlet cores are unwrapped through sourceDatum, and frame-level hover callbacks still compose with the shared producer. Those eight charts now advertise supportsLinkedHover: true; ChainReactionChart, whose selectedTaskIDs is chart-specific, remains false. The capability gate recognizes the physics selection bridge so metadata cannot outrun behavior.
  • Accessibility audits now report the shipped texture surface accurately. perceivable.color-alone and flexible.textures-adjustable recognize serializable HatchFill descriptors authored through styleRules, without treating one rule as proof every category has a redundant cue. The remaining warning is precise: texture assignment is not yet automatic, theme-aware, or exposed as a reader-controlled toggle.
  • PhysicsPileChartUnitPileChart, PhysicalFlowChartPacketFlowChart. Both leaked the substrate into the user-facing name — nothing else in Semiotic is SVGLineChart — and "Physical" told a reader nothing about the reading protocol. The new names carry it: values unitize into countable bodies, and discrete packets travel authored routes. PacketFlowChart also gives the four flow names a rule: Packet = discrete items on routes, Process = stages with capacity, FlowMap = geographic, SankeyDiagram = static proportional. The old names stay exported indefinitely as deprecated aliases (same shape as the existing GuantletChart alias), and the pre-3.9.0 docs routes /charts/physics-pile-chart and /charts/physical-flow-chart still resolve. Registries (schema, validation, capabilities, MCP, server configs) carry only the canonical name, so suggestCharts can't recommend one chart under two names. PhysicsChartNames.test.ts pins all of this.

Two names I did not change, correcting my own earlier claim: ProcessFlowChart — "Process" names the domain being visualized, not the substrate, exactly like FunnelChart; and PhysicsCustomChart — the four custom-layout escape hatches are named by frame family (XY / Ordinal / Network / Geo / Physics), which is the correct axis.

Fixed

  • Static SVG output now preserves chart-level primitive styling. Server configs apply stroke, strokeWidth, and opacity with the same precedence as their browser chart HOCs across hierarchy, network, ordinal, XY, and value charts instead of silently falling back to built-in outlines. Heatmap cell borders and heat-cell opacity now reach SVG output as well. Focused SSR-to-browser fixtures cover treemap and chord primitives, Likert styling, and heatmap borders across Chromium, Firefox, and WebKit.
  • Horizontal legends no longer overlap axis ticks or titles. Browser and static renderers now reserve a shared axis-chrome gutter before placing top or bottom categorical and gradient legends, including XY, ordinal, heatmap, minimap, and realtime histogram paths. legendLayout.axisGutter exposes an exact override; setting it to 0 preserves plot-edge placement when that is intentional.
  • Value components no longer appear to inherit chart-HOC props in agent guidance. The common-prop section now states its boundary before the chart catalog, and the generated BigNumber behavior contract tells agents to validate against the value-component schema and remove title, accessibleTable, and other inherited chart-HOC props. The first-try fixture revision records this guidance change without rewriting the published 7/9 gauge-static follow-up result.
  • Targeted evaluation summaries no longer label every unscored row as a missing submission. Reports now expose unscored separately from missingSubmissions, so a queued or pending response remains visible without implying that its model output was omitted.
  • Runtime reduced-motion changes no longer fast-forward physics simulations. Entering the settled path clears the animation clock in both synchronous and worker modes; a preference change that arrives during worker work is replayed afterward. Returning to animation therefore starts with a zero delta instead of applying all wall-clock time elapsed while reduced motion was active.
  • ChainReactionChart task tiles no longer overlap. Tasks sharing a lane and a dependency depth were nudged apart by min(18, taskHeight * 0.3) while staying full height, so a 58px tile shifted 17px overlapped its neighbour by 41px — unreadable in any real plan, where several lanes carry 2–3 tasks at the same depth. The stack is now sized from the tile height: tiles shrink to fit their level band (floor 22px) and step by that height plus a gap, so they never collide and never drift into the neighbouring depth.
  • ChainReactionChart lane labels no longer collide with the chart title. They were pinned at y=23, the same band the frame draws the title in. They now derive from the topmost task, so they sit just above the first row of tiles regardless of size.
  • Physics: prefers-reduced-motion now reaches the settled end state. A settle only admitted the spawns already due at t=0 and never advanced simulated time, so a reduced-motion reader of a paced physics chart saw one body while the projection overlay reported the full count (measured: GaltonBoardChart with 60 rows rendered 1 ball), and elapsed-time event tapes — GauntletChart's gates, ChainReactionChart's dependencies — never fired at all, leaving the settled projection reporting the authored start rather than the outcome. PhysicsPipelineStore settles now advance elapsedSeconds per step and re-check due spawns inside the loop, so initialSpawnPacing, per-datum spawnAt, and time-driven event tapes all complete. Both settle entry points share one loop (physicsPipelineSettle.ts) so they cannot drift apart again. StreamPhysicsFrame additionally re-settles while the store reports pending work (bounded), because reduced motion never schedules a second frame and event-tape charts spawn bodies from onTick.
  • Physics chrome and projections now track the theme. Ten physics modules (plus MobileChartContainer, SentenceFilter, IntentMark) referenced CSS variables the library never emits — --semiotic-accent, -negative, -positive, -background, -text-primary, -text-muted, -muted, -highlight, -fg — a shadow vocabulary for real roles (primary, danger, success, bg, text, text-secondary, selection-color). Their fallback hex always won, so the settled projection — the layer the docs designate as the chart — was the one layer that ignored ThemeProvider and dark mode. All now point at real roles, keeping their previous hex as the fallback so untouched (unthemed) rendering is unchanged. A new vocabulary test diffs every referenced --semiotic-* name against what themeToCSS emits, with an allowlist for genuinely consumer-set knobs, so the class can't return. The last holdout, --semiotic-on-primary in MobileStandardControls, now reads --semiotic-bg — the contrasting surface for text on a primary-filled pill, which inverts correctly in dark themes instead of pinning white against a light primary. No phantom tokens remain.

Added

  • One-surface Stage C conference demo. The local /intelligence/conference-demo route now composes the October talk's full “question to a chart you can defend” path: ranked suggestions, deterministic refusal, declared production scale, governed audience, captured-model variant, the KStreams custom-chart escape, pinned server-render evidence, live reader grounding, and JSX handoff. Interactions record a fresh typed conversation arc that can be downloaded for rehearsal review. The committed recovery is now a normalized 13-event Playwright rehearsal arc rather than a hand-authored substitute. The talk-demo browser contract preloads the custom-chart chunk under throttling, takes the browser fully offline, and then exercises every beat with external requests and sockets blocked.
  • Conference recovery recording package. A reproducible Playwright capture produces an MP4, candidate/variant/handoff keyframes, the live typed arc, and a manifest with byte counts and SHA-256 digests. The conference page exposes the checked-in fallback, and a focused asset test authenticates all four files plus the required refusal, audience, evidence, grounding, and export events.
  • Prove-track evaluation substrate. evals/first-try now carries 22 generation prompts across static and push modes plus three guard cases, with first-attempt and post-repair scoring against validation, diagnostics, and renderChartWithEvidence. evals/grounding carries 10 rendered charts, 50 answerable/unanswerable questions, PNG and buildReaderGrounding artifacts, and a three-condition 150-trial expansion. Both suites have provider-result schemas, pinned run metadata, raw/summary output, and local regeneration and integrity checks. A spend-capped, resumable OpenAI Responses runner now reads credentials from the environment or macOS Keychain, disables provider storage, records hashes instead of raw outputs, estimates locked-rate cost, and backs off across TPM/HTTP retry signals. The first complete live run issued 516 requests across gpt-5.6-sol, gpt-5.6-terra, and gpt-5.6-luna for $2.2792. First-try scores were 21/22, 17/22, and 17/22. Grounding's combined PNG-plus-payload condition beat PNG alone for Sol (45/50 versus 43/50) and tied it for Terra (45/50) and Luna (44/50), but did not improve answerable-question accuracy. A paired manual audit hardened the provider-neutral scorer before publication: explicit passive abstentions are recognized, answerable abstentions cannot pass by repeating an expected label, numeric matches use token boundaries, and reports carry a scoring revision. The published evidence therefore supports an abstention benefit for Sol, not the stronger expected claim that the payload closes an answerable chart-reading gap.
  • Offline conference-demo hardening packet. docs/strategy/talk-demos.md now inventories the selected Stage C path, fused reader-grounding beat, and Stage B fallback with inputs, interactions, dependency class, timing, and a recovery cue for every beat. Four committed fixtures drive the trust-loop proposals, BoxPlot → RidgelinePlot bimodal discovery, deterministic stale-note stream, and a hand-authored Stage C recovery replay. The recovery artifact replaces the unrelated synthetic revenue arc and includes suggestion, refusal, repair, audience, scale, variant, render evidence, grounding, and export; it remains explicitly distinct from an arc recorded from the future composed stage app. A browser contract prevents external network access, locally neutralizes the optional font stylesheet, and exercises the newly hardened fixture-backed beats; the stale-note stream can also advance one committed tick at a time through fresh → aging → stale → expired.
  • Typed refusal and render-proof conversation events. proposal-refused records the deterministic gate, reason codes, and repair alternatives; render-evidence records mark count, emptiness, and render warning codes separately from the weaker fact that a render was attempted. The event vocabulary moved into a focused type module while the existing store, sinks, replay, and import path remain backward compatible. The Variant Discovery docs now install and clean up a real hand-written registerVariantDiscovery proposer over committed bimodal data, explicitly distinguishing source: "model" provenance from a live model call.
  • Experimental VACP 0.1.0 interoperability bridge. unstable_createSemioticVACPBridge at the neutral semiotic/experimental/vacp subpath exposes Semiotic chart grounding as a dependency-free, structurally typed VACP capability/state/action surface: stable graph references, scoped full-or-delta state, complete column discovery with bounded summaries, validated point/interval selection, unambiguous navigation, and explicitly registered custom actions. unstable_SemioticVACPBridge binds that facade to live LinkedCharts selection and observation stores without rendering UI. The React binding installs only after a client commit; the explicit installer refuses a server process global and any foreign page global, then removes only the bridge it installed.
  • Adopter-ready IDID v0.1 portability kit. The three library-neutral JSON Schemas and six canonical worked fixtures ship at documented semiotic/spec/v0.1/* resource paths, with Draft 2020-12 and dependency-free validation coverage. The spec guide now documents the paper/runtime annotation union, exact stretch-pick admission rule, npm CJS/ESM imports, and a core-vs-extension typology crosswalk. The standalone Vega-Lite binding preserves capability/audience metadata and annotation provenance through its strict attach/read round trip while ordinary Vega-Lite renderers safely ignore the namespaced usermeta.idid block.
  • Safe activation of transported capability policy. unstable_bindPortableCapability validates a carried descriptor, resolves it against an explicitly supplied host capability, and overlays its rubric, intent scores, variants, caveats, and mobile contract while retaining the host's executable fits, buildProps, numeric, scale, and quality gates. Structured refusal diagnostics cover invalid, unresolved, and mismatched descriptors. The Vega-Lite portability demo now routes both carried capability policy and audience metadata through suggestCharts.
  • ChainReactionChart is now a registered chart. It shipped exported from semiotic/physics with zero registry presence — no chart spec, capability descriptor, semiotic/ai export, MCP registry entry, docs page, nav entry, or CLAUDE.md mention — so it silently skipped schema validation, suggestCharts, MCP, and the docs-coverage gate. All of those now exist, plus an SSR test asserting the HOC path derives the settled task state (a blocked prerequisite leaves its dependents unarmed) with no simulation. Its serverChartConfigs exclusion is documented: the settled reading is an authored overlay over zero bodies, so a body-counting config would report an empty scene.
  • /examples/chain-reaction — "The Release Machine". The page existed but was routed nowhere, so it never shipped. It now does: two coordinate systems over one authored dependency graph — an intervalLanesLayout swimlane answering when and who, then ChainReactionChart re-plotting the same rows by dependency depth so a blocker's downstream reach becomes the reading. Its centerpiece swimlane was ~20 lines of hand-rolled SVG (hardcoded palette, 7px labels, a magic /17 day scale, index % 3 fake sub-track packing); that is now the shipped recipe, so bars are real hit-tested marks with keyboard nav, tooltips, a data table, and correct interval packing. Landed through all five example registries plus the nav.
  • Registry-independent chart-registration gate. check:surface-parity now walks entry-point chart exports from the filesystem and requires each to be in CHART_SPECS or explicitly allowlisted. Every other check in that script derives its expectations from the registry, so a chart absent from the registry was invisible to all of them. This is the check that would have caught ChainReactionChart on day one.
  • Terminal-state contract for event-tape physics charts. A tape-driven chart's end state must be computable from authored inputs with no simulation, because that pure result is what reduced motion, SSR, snapshot export, and describeChart receive. CrucibleChart and ChainReactionChart already satisfied it; GauntletChart did not. New resolveGauntletTerminalStates / resolveGauntletTerminalState (semiotic/physics) fold the authored tape, mirroring the live tick's effect order — with a regression test asserting the pure result equals a real simulated run. That test also surfaced and now documents a real property of the metaphor: with crashDetection armed (the default), physics is a second outcome source no pure fold can predict, so the pure result is "what the plan earns on paper". Pass crashDetection={false} for a fully authored reading.
  • Physics stage-geography kit (semiotic/physics + semiotic/recipes). physicsStageGeography names the charge → apparatus → destinations structure every physics chart had been re-inventing locally (Gauntlet startX/socketX/graveyardX, Crucible chamber/mouth/outlets; Galton bins and Pile tubes independently wrote the same lane formula). Companions: physicsStageColliders, physicsChargePoint, physicsDestination, describePhysicsStageGeography. Authoring vocabulary for new charts and PhysicsCustomChart layouts — shipped charts keep their layouts, and tests pin the builder to their exact lane math so anything built on it lands in the same visual family.
  • Physics family contracts filled in. seed on GauntletChart (the only physics HOC missing it); rerunMS on EventDropChart, PhysicsPileChart, ProcessFlowChart, and PhysicalFlowChart (it was on 4 of 8); plus standard selection inputs across all eight registered physics HOCs. selection accepts either a { name } store config or a resolved { isActive, predicate } body predicate; the store's datum predicate is lifted over body.datum, so chrome bodies (walls, pegs, tubes) never match a data selection. The linkedHover prop is retained as groundwork, but the capability remains false until body hover is wired to its producer callback. GaltonBoardChart and PhysicsPileChart also declare capability variants (observed vs mechanical; projected vs units-only) — no physics chart had any.
  • Settled ledger (semiotic/experimental). buildPhysicsSettledEvidence now reports queuedCount, sedimentedCount, and a warnings array, plus an optional ledger when the caller declares its charge (the total bodies the chart claims entered). Every physics chart shares one deep structure — a charge enters, an apparatus routes it, destinations hold it at rest — so they all owe the same invariant: every charged body is accounted for in exactly one place. PHYSICS_QUEUE_UNDRAINED and PHYSICS_LEDGER_MISMATCH surface a violation, and the SSR renderer declares initialSpawns.length as its charge so renderChartWithEvidence reports both warnings for physics charts.
Source: README.md, updated 2026-07-28