Foldkit Viz: visx parity and chart excellence
Date: 2026-10-05. Local source baseline: e28304a, managed promo worktree, branch codex/foldkit-0-166-0.
This is a source-grounded assessment and proposed roadmap, not an implementation plan or release claim. The latest bar/cloud APIs are committed locally and documented as unreleased. Public npm and Pages availability must be verified separately.
Intended outcome and recommendation
A developer should be able to compose a trustworthy instrument for investigating a system, or an expressive visualisation that invites useful exploration, using the same pure geometry and explicit Foldkit state. First useful success: load caller-owned records, compare two views, inspect an exact observation and explain what is selected, missing or uncertain.
Pursue a shared foundation with two visual directions. Precision and delight should share data identities, scales, selection, measurement, accessibility and provenance. Presentation can vary substantially. Precision means that a visual claim is traceable and testable; delight means that a surprising interaction makes a pattern easier to discover or understand.
Observed: the repository has broad geometry, application-level chart examples, reusable Cartesian adapters, six live promo explorers and an eighteen-chart promo gallery. Inferred: interaction composition and qualification offer more immediate value than adding another broad batch of chart types. Unknown: customer demand, operating contexts, adoption and real-task performance. A competitor checklist does not establish those.
Assumed first contexts: engineering telemetry and analytical data exploration. These are design fixtures, not claims that a critical-system deployment has been validated. No commercial, regulatory or operational suitability claim follows from this roadmap.
Three routes considered:
| Route | Benefit | Tradeoff | Recommendation |
|---|---|---|---|
| Copy every visx example first | Clear breadth and familiar demonstrations | Risks expanding the gallery faster than the shared APIs and evidence | Use as an inventory, not the delivery order |
| Build a shared interaction foundation and two reference experiences | Reuse is visible; precision and expressiveness can be tested together | Fewer new thumbnails initially | Recommended |
| Keep existing primitives and document app recipes only | Lowest package scope and migration cost | Consumers continue owning repeated plumbing | Retain for specialised recipes until reusable demand is demonstrated |
Evidence and interpretation
Compared the rendered visx gallery on 2026-10-05: 47 example links. Also inspected the public package inventory, tooltip API, annotation API and XYChart source. This is a gallery map plus selected capability comparison, not an exhaustive method-by-method audit of all visx packages.
Local evidence:
- Public exports, pure geometry, Foldkit adapters.
- Promo gallery inventory, new gallery geometry, web reference charts.
- Previous Cartesian qualification and bar/cloud qualification.
- Existing broader primitive audit: ROADMAP.md. Historical completion labels establish implementation history, not full behavioural parity or release availability.
Status vocabulary:
- Public: a corresponding exported primitive/adapter exists. This does not establish complete visx semantics or native acceptance.
- Partial: public support covers only part of the behaviour.
- App: an implementation exists in the demo/application; a reusable package contract is absent or narrower.
- Build: no dedicated corresponding primitive/recipe was found in the audited source.
- Promo Live means a dedicated explorer; Tile means a gallery rendering; Indirect means another explorer demonstrates the capability; Absent means no dedicated promo presentation.
Priorities are proposed: P1 composition and dependable inspection; P2 analytical breadth and expressive presentation; P3 specialised parity after a concrete use case. Do not infer a percentage parity score from unlike units.
Concrete gallery parity map
Paths in the first column are visx gallery routes. Local paths in the evidence column are relative to packages/foldkit-viz/src/ unless prefixed web:; web: means apps/web/src/ui/.
| # | visx example / route | Local evidence and capability status | Promo exposure | Remaining work / priority |
|---|---|---|---|---|
| 01 | Bars /bars | Public: chart/bars.ts, math/scale.ts | Live: bars | Maintain signed/sparse/orientation acceptance; P1 |
| 02 | Dots /dots | Public: scatter geometry + point adapter | Live: scatter; Tile | Expose dense point inspection recipe; P1 |
| 03 | Patterns /patterns | Partial: foldkit/paint.ts dots and hatch | Live: bars | Pattern sampler; line/image/custom patterns remain caller SVG; P2 |
| 04 | AreaClosed /areas | Public: shape/area.ts; web: area-chart | Tile | Live baseline and missing-data controls; P2 |
| 05 | Treemap /treemap | Public: hierarchy treemap; web: treemap-chart | Tile | Drill-down and label-budget recipe; P2 |
| 06 | Zoom /zoom-i | Partial/Public math: math/zoom.ts; App gesture wiring in zoomable-line-chart | Absent | Controlled zoom/pan with actual local coordinates and touch tests; P1 |
| 07 | Stacked Areas /stacked-areas | Public: shape/stack.ts + shape/area.ts | Indirect: streamgraph tile | Explicit stacked-area recipe and common-baseline mode; P2 |
| 08 | Axes & scales /axis | Public: foldkit/axes.ts, math/scale.ts | Indirect: live Cartesian explorers | Scale laboratory, time/log edge cases, collision policy; P1 |
| 09 | Chord /chord | Public: shape/chord.ts; web: chord-chart | Tile | Live matrix editing and retained relation inspection; P2 |
| 10 | Streamgraph /streamgraph | Public: stack + area; web: streamgraph-chart | Tile | Offset/order controls and exact values; P2 |
| 11 | Legends /legends | Partial: categorical foldkit/accessibility.ts | Indirect: line/scatter/bars | Continuous and threshold legends; controlled visibility recipe; P1 |
| 12 | Curves /curves | Public: shape/line.ts; web: curve-comparison-chart | Live: line; Tile controls | Differential audit of each supported curve; P1 |
| 13 | Area difference /threshold | Build: threshold scale exists, but no crossing-aware difference-area helper | Absent | Split fills at curve crossings, including exact roots; P2 |
| 14 | Annotation /annotation | Partial: foldkit/annotations.ts reference lines | Indirect: line | Callouts, connectors, subject regions and placement policy; P1 |
| 15 | Radial Lines /lineradial | Public: shape/lineRadial.ts | Indirect: radar tile | Polar coordinate/curve recipe; P2 |
| 16 | Drag i /drag-i | App: drag/pan handling in zoomable-line-chart; no general drag module | Absent | Pure drag state + controlled Foldkit wiring; P1 |
| 17 | Bar Group /bargroup | Public: chart/bars.ts, grouped vertical | Live: bars; Tile | Covered within documented scope |
| 18 | Bar Group Horizontal /bargrouphorizontal | Public: chart/bars.ts, grouped horizontal | Live: bars | Covered within documented scope |
| 19 | Pies & donuts /pies | Public: shape/pie.ts, shape/arc.ts; web: donut-chart | Tile | Live sorting/padding/selection controls; P2 |
| 20 | Brush /brush | Partial: math/brush.ts interval; interaction/selection.ts; web histogram-brush and linked-charts apps | Indirect: dataset explorer selection | Reusable interval and rectangle selection, handles and keyboard wiring; P1 |
| 21 | Bar Stack /barstack | Public: chart/bars.ts, signed vertical stack | Live: bars | Covered within documented scope |
| 22 | Bar Stack Horizontal /barstackhorizontal | Public: chart/bars.ts, signed horizontal stack | Live: bars; Tile | Covered within documented scope |
| 23 | Delaunay Triangulation /delaunay-triangulation | Public: math/delaunay.ts; web: voronoi-chart uses triangulation | Absent | Dedicated triangulation tile and nearest-point recipe; P2 |
| 24 | Voronoi Overlay /delaunay-voronoi | Public: Voronoi cells and paths; App: voronoi-chart | Absent | Reusable nearest-hit inspection overlay and empty/duplicate tests; P1 |
| 25 | Dendrograms /dendrograms | Public: hierarchy clusterLayout; web: radial-tree-chart | Absent | Add Cartesian/radial cluster recipe; P2 |
| 26 | Drag ii /drag-ii | App: related drag wiring, no multi-object drag contract | Absent | Keyed draggable marks, bounds, cancellation and retained identity; P2 |
| 27 | XYChart /xychart | Partial: Cartesian layout, series, axes, theme, legend, tooltip adapters | Live examples assembled explicitly | Multi-series registration/domain/inspection composition without hidden state; P1 |
| 28 | Custom Projection /geo-custom | Public: callable Projection accepted by shape/geo.ts | Indirect: map tile | Custom projection recipe; geographic limitations remain; P3 |
| 29 | AlbersUsa /geo-albers-usa | Partial: geoAlbersUsa; web: map-projections-chart | Absent | Compare projection behaviour and inset geometry to reference fixtures; P3 |
| 30 | Mercator /geo-mercator | Partial: geoMercator; web projection/choropleth apps | Indirect: map tile | Antimeridian, rotation and resampling are separate missing capabilities; P3 |
| 31 | Glyphs /glyphs | Public: shape/symbol.ts; web: symbol-scatter-chart | Indirect: live scatter symbols | Glyph sampler and hit-target recipe; P2 |
| 32 | Gradients /gradients | Public: linear/radial foldkit/paint.ts | Live: bars linear | Dedicated gradient sampler and radial use; P2 |
| 33 | Heatmaps /heatmaps | Public scales; App: heatmap-chart; tile renders cells | Tile: rectangular | Rect/circle renderer recipe and quantitative colour legend; P2 |
| 34 | Link Types /linktypes | Public: shape/link.ts | Indirect: hierarchy tiles | Link sampler and explicit direction markers; P2 |
| 35 | Network /network | Public: simulation and forces; App: force-graph | Absent | Seeded network explorer, bounded simulation and node inspection; P2 |
| 36 | Pack /pack | Public: hierarchy pack; web: packed-circles-chart | Tile | Drill-down, group emphasis and measured labels; P2 |
| 37 | Polygons /polygons | Public low-level path builder; standard SVG polygon | Absent | Recipe sufficient unless reusable polygon operations are required; P3 |
| 38 | Radar /radar | Public radial line; App: radar-chart | Tile | Explicit common scale, ordering and comparison limits; P2 |
| 39 | Radial Bars /radial-bars | Public arc geometry; App: wind-rose-chart | Absent | Dedicated radial-bar recipe; preserve area interpretation; P2 |
| 40 | Responsive /responsive | App: shared promo measurement, ResizeObserver Mount streams | All live explorers responsive | Optional reusable measurement adapter and hidden-container tests; P1 |
| 41 | Sankey /sankey | Public: shape/sankey.ts; web: sankey-chart | Tile | Live flow inspection, units and conservation diagnostics; P2 |
| 42 | SplitLinePath /splitlinepath | Build: line geometry exists; no dedicated styled segment helper | Absent | Segment at meaningful boundaries without curve discontinuities; P2 |
| 43 | Stats Plots /statsplot | Public: math/stats.ts; App: box/violin renderers | Tiles | Reusable statistics geometry with explicit method/sample size; P2 |
| 44 | Text /text | Partial: layout/text.ts measured wrapping | Indirect: source/API only | Label layout, truncation, rotation, anchoring and fit recipe; P1 |
| 45 | Tooltip /tooltip | Partial: SVG default and caller renderer in foldkit/annotations.ts | Live: scatter | Measured bounds, flip/clamp policy and optional HTML overlay; P1 |
| 46 | Trees /trees | Public: hierarchy tree + links; App: tidy-tree-chart | Tile | Retained tree navigation and collapsed-branch recipe; P2 |
| 47 | Wordcloud /wordcloud | Partial: layout/wordcloud.ts, deterministic rectangle collisions | Live: wordcloud | Pixel-mask packing only if density is a demonstrated need; P3 |
Covered rows mean a corresponding composition exists, not that every prop, algorithm or interaction matches visx. No new chart should be added merely to move a row from absent to present.
Public API gaps beneath the gallery
| ID | Gap | Existing foundation | Concrete exit criteria |
|---|---|---|---|
| F1 | Shared coordinate conversion and measurement | App measurement Commands/Mount streams; frame geometry | CSS-scaled/nested SVG, viewBox offsets, scrolling, resize, initially hidden containers and teardown produce correct local coordinates; no view/update DOM mutation |
| F2 | Controlled interaction contracts | Selection union, interval brush, zoom matrices | Interval/rectangle/key selection, translate/resize handles, drag cancellation, touch/pointer and keyboard work with parent-owned state; selection stays meaningful across resize/filter/reordering |
| F3 | Inspection and tooltip placement | Projected datum identity; custom SVG tooltip | Nearest datum and shared-X inspection are explicit policies; ties deterministic; transformed inputs accurate; measured tooltip stays inside declared bounds and exposes the same record through keyboard/data table |
| F4 | Composable multi-series view | Frame, series, grid, axes, theme | Line/point/bar/area layers share declared domains and units; visibility and selection are controlled; data identity survives layer changes; no package-owned data loading or hidden registry state |
| F5 | Rich legends and annotations | Categorical legend and reference line | Threshold boundaries and continuous ramp labels match actual scale; anchored callouts avoid plot clipping; threshold and region meanings available without colour |
| F6 | Segment/difference geometry | Existing line/area/curve primitives | Returned segments retain source references; crossings split correctly; equal runs, repeated X, missing observations and supported curves have reference fixtures; fill never connects across a declared gap |
| F7 | Text, paint and SVG utility recipes | Measured wrapping; four paint helpers; native SVG | Stable caller IDs; collision/truncation policy explicit; theme-safe text contrast; marker/clip recipes work across multiple charts; generic group/polygon wrappers only if they remove real friction |
| F8 | Deeper math parity | Vendored D3; existing geometry checks | Per-algorithm reference fixtures, documented tolerance and failure domain; audit known RGB-basis interpolation and geographic omissions; no aggregate claim of D3 parity |
Direct equivalents for React context, hooks or portals are not required. Preserve Foldkit composition through Model → view → Message → update → Model; browser effects stay in Commands/Mount/Subscriptions. Pure geometry remains independent of Foldkit, Effect and DOM. Optional render adapters consume the render-scoped HtmlBuilder. Data, keys, colours, units, fonts and themes stay caller-configurable.
Stretch goals: precision instruments
These are proposed capabilities beyond a gallery checklist. Acceptance means the stated evidence is obtained, not that the system is certified for any operational domain.
| ID | Goal and useful experience | First bounded deliverable | Acceptance evidence |
|---|---|---|---|
| P1 | Truthful signal rendering. Distinguish missing, invalid, stale, estimated and observed data instead of drawing one confident line | Explicit quality metadata and gap-aware line/band recipe | Null/non-finite values do not become zero; declared gaps are not interpolated; stale and estimated samples have non-colour cues; inspected raw values, units, timestamps and quality agree with table/export |
| P2 | Uncertainty as geometry. Show ranges and sample support beside an estimate | Interval band and error-bar geometry with caller-supplied bounds and metadata | Interval semantics labelled; inverted/invalid bounds rejected; low sample support shown; rescale/selection preserve bounds; no statistical inference manufactured by the renderer |
| P3 | Instrument-grade axes. Inspect small changes without losing unit or time context | Unit-aware formatting recipe, visible domain controls and pinned comparison baseline | Units/time zone explicit; repeated/irregular times, narrow domains, negative values and DST cases tested; formatting does not hide a decision-relevant difference; domain changes visible; no automatic misleading dual-axis comparison |
| P4 | Event correlation and replay. Freeze an incident and compare related signals at the same instant | Shared cursor, interval brush, event lane, pause/live indicator and deterministic app-owned replay | Freeze stops the inspected snapshot changing; late/out-of-order data policy visible; selections survive replay; timestamps align across charts; refresh/cancellation failures and retained stale data are testable |
| P5 | Dense data without hiding the event. Overview and detail remain faithful when records outnumber pixels | Viewport-aware line reduction with extrema preservation and declared aggregation | Proposed fixtures: 10k/100k/1m records; spikes, gaps and boundary samples preserved; inspector retrieves exact raw record; downsampling indicated; compare reference output and record memory/update timings on named hardware/browser |
| P6 | Reproducible evidence views. Hand a colleague the exact chart state and supporting data | Serializable app-owned view specification plus static SVG/PNG and raw-data export recipe | Dataset revision, filters, domains, units, selected keys, quality policy and theme recorded; replay gives equivalent semantic output; export includes title, legend, provenance and a full table; publication/release evidence remains separate |
Proposed performance budgets for P5, to be confirmed on recorded reference devices: geometry/interaction computation p95 ≤16ms, complete visible update p95 ≤33ms, and a configurable default ceiling of 2,000 rendered marks. This ceiling applies to overview rendering, not discarded source records. Measure initial load separately. A missed budget changes representation or scope; it must not silently remove anomalies. GPU/Canvas is a later adapter decision backed by these measurements.
Stretch goals: expressive exploration
| ID | Goal and analytical purpose | First bounded deliverable | Acceptance evidence |
|---|---|---|---|
| J1 | A chart that unfolds. Turn an overview into aligned small multiples while retaining the selected observation | One dataset switches between aggregate, grouped and per-series panels | Position/identity continuity explains the transition; units and raw values persist; interruption lands in a valid model; reduced motion performs the same operation immediately |
| J2 | Beautiful distribution anatomy. Reveal the observations underneath a summary | Raincloud composition: density + box summary + seeded jittered observations | Same source records drive all layers; sample size, bandwidth and quartile method explicit; jitter never changes encoded measurement; inspect an individual record and compare groups on a common scale |
| J3 | Flow with character. Dotted, hatched or gently moving flow traces explain direction and magnitude | Sankey/stateflow styling recipe with an explicit direction layer and selected path | Movement encodes declared direction only; widths encode quantities; conservation issues visible; selected edges are legible in both themes and static export; motion can stop without losing meaning |
| J4 | Unexpected but readable time. Discover cycles without concealing the exact sequence | Calendar/spiral comparison with an aligned linear reference | Period and projection labelled; gaps/overlaps visible; exact timestamps inspectable; switching forms retains selection; a linear view remains available for precise comparison |
| J5 | Typography that earns its space. Labels and direct annotations form part of the composition | Measured label allocator with priority, collision and truncation policies | No unexpected overlap/clipping across target widths, fonts and long labels; rejected labels explicitly available through inspection/table; layout deterministic after font measurement |
| J6 | A personal visual voice. Change colour, ink, texture and rhythm while keeping the chart honest | Theme recipes: daylight scientific, dark instrument, vivid editorial and quiet print | Four recipes use the same data/geometry; labels and meaningful boundaries meet declared contrast targets; colour is reinforced by shape/pattern; fonts and SVG IDs configurable; print and reduced-motion forms retain the claim |
Originality is a hypothesis about comprehension and satisfaction. Each expressive recipe must answer a real question before adding ornament. Avoid decorative motion that suggests data changes, overshoot that implies false values, and a novel projection that makes a required comparison harder.
Two reference experiences
Signal desk: an incident investigation instrument
Use synthetic, explicitly labelled system telemetry with timestamp, signal, value, unit, quality, source revision and optional caller-supplied interval. Compose an overview, a precise detail chart, an event lane and a record table. Brush a period, zoom into a spike, compare related signals, freeze a cursor and inspect provenance. Include empty/loading/stale/error fixtures and a late-arriving sample.
First slice: interval brush + zoom + linked cursor + table, using F1–F3. Subsequent precision work adds quality and uncertainty only after that composition is stable. Alarm thresholds are application inputs, never conclusions generated by Viz.
Foldout atlas: an expressive comparison explorer
Use illustrative community activity records with dates, groups and distributions. Unfold a compact overview into small multiples; change the view to a raincloud; follow one group through a flow view. Keep one selected record/group and the same units visible throughout. Use saturated colour, crisp rules, measured type and restrained patterned ink. Offer daylight/dark/print recipes.
First slice: J1 using existing bars and parent-owned selection. J2 adds a second analytical perspective. Novel time layouts and flow motion are optional later recipes, contingent on comprehension evidence.
Delivery sequence and decision gates
The cross-package roadmap remains docs/roadmap.md. This table proposes slices, not dates or approved implementation work. Keep each slice independently reviewable and separately released when appropriate.
| Slice | Scope | Result worth reviewing | Gate / scope cut |
|---|---|---|---|
| M0 — baseline map | This document, source pointers and current evidence | Shared inventory with explicit status and gaps | Complete as a planning artifact; refresh when code or upstream changes |
| M1 — controlled exploration | F1–F3; one Signal desk route; reuse existing geometry | Brush/zoom/shared inspection between two charts and table | Numeric and state tests, touch/keyboard/browser acceptance and an external consumer; cut rectangle handles before weakening interval selection or cancellation |
| M2 — trustworthy signals | P1–P3, F5; quality/uncertainty fixtures | Gaps, stale data, units and bounds remain explicit at every scale | Adversarial fixtures and exact-value inspection; no broad critical-system suitability claim |
| M3 — expressive composition | J1–J2, J5–J6; develop only the F4 composition needed by the examples | Foldout and raincloud experiences with retained identity | Comprehension task, motion interruption, label layout and accessible fallback; cut novel forms that obscure comparison |
| M4 — scale and reproducibility | P4–P6; measured F8 work required by these cases | Replayed/exported incident with a faithful dense overview | Device-labelled performance and semantic export fixtures; choose alternative rendering only when measurements justify it |
| M5 — specialised depth | F6, geographic omissions, cloud masks, advanced network/time recipes | One evidenced use case per capability | Separate algorithm/spec/qualification slice; no blanket visx clone |
Proposed learning appetite: four focused engineering days for M1, including qualification and a comprehension check; this is a suggested cap, not an estimate or accepted budget. Allocate two days to coordinate/interaction contracts, one to the reference composition, and one to fixtures/native checks and task review. If the first two days show incompatible ownership contracts, reduce to one interval brush and shared cursor and document the remaining gap. Later slices require their own scope and budget decisions.
Proposed learning tasks with three representative developers/analysts, recruited only through separately authorised activity: identify a spike and its raw value, isolate its interval, distinguish missing from zero, compare a related signal, and explain the chosen view. Primary measure: unassisted correct task completion; baseline unknown. Proposed threshold: all three distinguish missing/zero and retrieve the exact record, and at least two complete the linked selection without guidance. Small qualitative results indicate friction, not population success rates or market demand. Incorrect interpretation caused by an expressive form blocks that form; repeated interaction confusion reshapes M1. Inconclusive results extend neither scope nor budget automatically. If representative participants are unavailable within the learning window, finish the technical evidence and record comprehension as untested; do not substitute engineering acceptance for that evidence.
Definition of chart excellence
Every accepted chart/recipe should carry a small evidence record:
- Analytical claim: what question it answers, quantities/units, scale/domain, aggregation and meaningful omissions.
- Geometry: finite output, declared invalid-input policy, supported boundary conditions and per-algorithm reference/property tests. Extreme magnitude, cancellation, degenerate domains, repeated keys and sparse data are deliberate fixtures.
- State: controlled keys and selection; stale async completions cannot replace current data; identity persists across sorting/filtering/resize; side effects occur only at runtime boundaries.
- Perception: measured label layout, explicit baseline, distinguishable series without colour alone, legible light/dark/print output, and no texture that masks a critical boundary.
- Interaction: local coordinates, keyboard and touch, focus retention, cancellation, stable inspection and observable recovery.
- Performance: recorded dataset, render density, device/browser and p50/p95 update/memory measurements. No performance claim from a thumbnail or unit test.
- Evidence: focused tests, external consumer, native browser checks, static export comparisons and any publication proof recorded separately. Native accessibility task acceptance is distinct from generated ARIA markup.
For proposed accessibility targets, use WCAG 2.2 contrast guidance: 4.5:1 for ordinary text, 3:1 for qualifying large text; use non-text contrast guidance for meaningful graphical objects. Meeting these targets alone does not establish overall accessibility conformance.
Deliberate deferrals
- No rewrite of Foldkit into React-like context/hooks or a second state runtime.
- No full React API compatibility or exact package-count target.
- No automatic statistical conclusions, forecasting, alarm policy or domain certification.
- No 3D, ambient sound, generative chart choice or GPU rewrite without a task that needs it.
- No pixel-mask cloud or globe projection overhaul before a use case demonstrates the current limit.
- No migration of every existing web chart in one release; qualify representative contracts first.
Next proposed action: specify M1 as a bounded interaction/composition project, with exact public contracts and regression fixtures. The roadmap does not authorise that implementation.
M1 implementation evidence — 2026-10-05
The local Signal desk qualification records pure coordinate/domain/nearest-record APIs, typed SVG Mount composition, parent-owned interval brush/pan/zoom/pin state and the native /examples/signals/ route.
F1 now has general affine conversion, scoped measurement/readiness and transformed/hidden SVG evidence. F2 has controlled interval selection, navigation/cancellation and keyboard/range alternatives. F3 has deterministic nearest-X inspection linked to exact readout/raw table, including pinned outside-view notices. These are bounded advances: native touch remains unperformed because the browser input capability rejects touch delivery; rectangle/key brushes, resize handles, pinch and measured HTML tooltip placement remain gaps. No complete F1–F3 parity or production-critical suitability is claimed.
Recommended next: specify M2 quality and uncertainty, beginning with explicit missing/invalid/stale data and caller-owned thresholds. Keep representative-user comprehension and native touch acceptance separate from engineering test success.
M2 implementation evidence — 2026-10-05
The M2 qualification record records pure run/band APIs, validated metric quality and source freshness, gap-aware clipped rendering and exact interval/support/reference disclosures. This advances partial P1, interval-band P2 and units/domain/reference portions of P3/F5. Automated qualification and one independent review/fix pass are complete; native Firefox mouse/keyboard and390/1280 light/dark observations are recorded. Held-pointer and hardware touch acceptance remain open. Error bars and a pinned comparison baseline remain gaps. No full parity, statistical inference or critical-system suitability is claimed.
Captured comparison follow-up — 2026-10-05
P2 now includes exported, packed-consumer-qualified error-bar segment geometry for both axes. P3 now includes independent native Foldkit baseline capture, exact current-minus-baseline differences and captured provenance. The Signal desk composes selected error bars and clipped baseline references without changing supplied bounds or full-data domains. See local qualification: 523 workspace tests pass, with post-review browser evidence for responsive themes, off-screen baseline, table/source and held Capture/Clear/Escape interactions. Independent capture loss, hardware touch and assistive-technology acceptance remain open. This advances those bounded portions, not full P2/P3 or visx parity.
Event-lane design follow-up — 2026-10-05
A approved written design addresses only the event-lane portion of P4: an optional caller feed with independent provenance, exact event selection, aligned guides and retained raw event evidence. It reuses existing geometry and keeps events outside measured values/domains. The implementation plan is executed locally with qualification evidence. Only the event-lane portion of P4 is delivered; replay/live transport, device and assistive-technology acceptance remain open. Next: direct accessibility and device acceptance of these interactions.