Skip to content

Semiotic v3.8.7

Latest

Choose a tag to compare

@github-actions github-actions released this 28 Jul 15:42
f86ec9c

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.