Changed
-
A high-touch evaluation example makes the prove track inspectable.
/examples/the-benchmark-is-a-chart-tooturns 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-wppwalkthrough. 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.6distribution is verified end to end. The official
io.github.nteract/semioticRegistry entry marks3.8.6latest, and stable
Cloud Run revisionsemiotic-mcp-server-00071-2rwnow 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
semioticplus the exact package version, while nightly retains the
commit-qualifiedsemiotic-nightlycontract. -
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 overbody.datum; their
StreamPhysicsFrame.onBodyHoverpath now publishes the source datum through
the shared hover store and clears it on leave. Authored wrapper bodies such as
Gauntlet cores are unwrapped throughsourceDatum, and frame-level hover
callbacks still compose with the shared producer. Those eight charts now
advertisesupportsLinkedHover: true;ChainReactionChart, whose
selectedTaskIDsis 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-aloneandflexible.textures-adjustablerecognize
serializableHatchFilldescriptors authored throughstyleRules, 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. -
PhysicsPileChart→UnitPileChart,PhysicalFlowChart→PacketFlowChart.
Both leaked the substrate into the user-facing name — nothing else in Semiotic
isSVGLineChart— 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.PacketFlowChartalso 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 existingGuantletChartalias), and the pre-3.9.0 docs routes
/charts/physics-pile-chartand/charts/physical-flow-chartstill resolve.
Registries (schema, validation, capabilities, MCP, server configs) carry only
the canonical name, sosuggestChartscan't recommend one chart under two
names.PhysicsChartNames.test.tspins 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 likeFunnelChart; andPhysicsCustomChart— 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 applystroke,strokeWidth, andopacitywith 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.axisGutterexposes an
exact override; setting it to0preserves 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 removetitle,
accessibleTable, and other inherited chart-HOC props. The first-try fixture
revision records this guidance change without rewriting the published 7/9
gauge-staticfollow-up result. - Targeted evaluation summaries no longer label every unscored row as a
missing submission. Reports now exposeunscoredseparately 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. ChainReactionCharttask tiles no longer overlap. Tasks sharing a lane
and a dependency depth were nudged apart bymin(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.ChainReactionChartlane labels no longer collide with the chart title.
They were pinned aty=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-motionnow reaches the settled end state. A
settle only admitted the spawns already due att=0and 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:
GaltonBoardChartwith 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.PhysicsPipelineStoresettles now advanceelapsedSeconds
per step and re-check due spawns inside the loop, soinitialSpawnPacing,
per-datumspawnAt, and time-driven event tapes all complete. Both settle
entry points share one loop (physicsPipelineSettle.ts) so they cannot drift
apart again.StreamPhysicsFrameadditionally re-settles while the store
reports pending work (bounded), because reduced motion never schedules a
second frame and event-tape charts spawn bodies fromonTick. - Physics chrome and projections now track the theme. Ten physics modules
(plusMobileChartContainer,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 ignoredThemeProviderand 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 whatthemeToCSSemits, with an
allowlist for genuinely consumer-set knobs, so the class can't return. The last
holdout,--semiotic-on-primaryinMobileStandardControls, 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-demoroute 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-trynow 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/groundingcarries 10 rendered charts, 50
answerable/unanswerable questions, PNG andbuildReaderGroundingartifacts,
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 acrossgpt-5.6-sol,gpt-5.6-terra, and
gpt-5.6-lunafor $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-refusedrecords the deterministic gate, reason codes, and repair
alternatives;render-evidencerecords 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
registerVariantDiscoveryproposer over committed bimodal data, explicitly
distinguishingsource: "model"provenance from a live model call. - Experimental VACP 0.1.0 interoperability bridge.
unstable_createSemioticVACPBridgeat the neutral
semiotic/experimental/vacpsubpath 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_SemioticVACPBridgebinds that facade to liveLinkedCharts
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 namespacedusermeta.ididblock. - Safe activation of transported capability policy.
unstable_bindPortableCapabilityvalidates 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 executablefits,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 throughsuggestCharts. ChainReactionChartis now a registered chart. It shipped exported from
semiotic/physicswith zero registry presence — no chart spec, capability
descriptor,semiotic/aiexport, 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. ItsserverChartConfigs
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 — anintervalLanesLayoutswimlane answering
when and who, thenChainReactionChartre-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/17day scale,index % 3fake 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-paritynow
walks entry-point chart exports from the filesystem and requires each to be in
CHART_SPECSor 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
ChainReactionCharton 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
describeChartreceive.CrucibleChartandChainReactionChartalready
satisfied it;GauntletChartdid 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: withcrashDetectionarmed (the default), physics is a second
outcome source no pure fold can predict, so the pure result is "what the plan
earns on paper". PasscrashDetection={false}for a fully authored reading. - Physics stage-geography kit (
semiotic/physics+semiotic/recipes).
physicsStageGeographynames the charge → apparatus → destinations
structure every physics chart had been re-inventing locally (Gauntlet
startX/socketX/graveyardX, Cruciblechamber/mouth/outlets; Galton
bins and Pile tubes independently wrote the same lane formula). Companions:
physicsStageColliders,physicsChargePoint,physicsDestination,
describePhysicsStageGeography. Authoring vocabulary for new charts and
PhysicsCustomChartlayouts — 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.
seedonGauntletChart(the only
physics HOC missing it);rerunMSonEventDropChart,PhysicsPileChart,
ProcessFlowChart, andPhysicalFlowChart(it was on 4 of 8); plus standard
selectioninputs 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 overbody.datum, so chrome bodies (walls, pegs, tubes) never match a
data selection. ThelinkedHoverprop is retained as groundwork, but the
capability remains false until body hover is wired to its producer callback.
GaltonBoardChartand
PhysicsPileChartalso declare capabilityvariants(observed vs mechanical;
projected vs units-only) — no physics chart had any. - Settled ledger (
semiotic/experimental).buildPhysicsSettledEvidence
now reportsqueuedCount,sedimentedCount, and awarningsarray, plus an
optionalledgerwhen the caller declares itscharge(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_UNDRAINEDandPHYSICS_LEDGER_MISMATCHsurface a
violation, and the SSR renderer declaresinitialSpawns.lengthas its charge
sorenderChartWithEvidencereports both warnings for physics charts.