| D-M6-11-0 |
2026-10-15 |
Base int/m1-wave24 at 2a72cca, branch feat/M6-11-viz-package in its own worktree; not merged locally and not pushed, the PR lane ports it. The base already holds every schema, operation and ruling the brief uses, so no contract change enters first. Names that differ from the brief (D-W-100): the spec chapters are 25-visualisierung.md, 15-client-architektur.md and 03-datenmodell.md on this base; the brief's harness_test.dart lives in packages/bothy_viz/harness/test/, because bothy_viz cannot import the harness that depends on it; StatsQuerySource throws the ApiProblem of M4-02 instead of returning it, as every call of the generated client does. Text this ticket adds is English, also inside the German chapters. |
Instructions of the launcher; merged layout wins over the brief (D-W-100). |
| D-M6-11-1 |
2026-10-15 |
View models are immutable classes built only from the generated types and app configuration values; they never call the network. Lanes group runs by space and channel in frame order; runs_truncated becomes the "More runs than shown" marker; a run card shows agent, state, step chip, badge, "Approval waiting" and the cost only in mode organization with cost_micros and currency present (cost_is_estimate gives "Estimate"); mode personal shows costs only in cost tiles with "information only"; a missing member, a missing cost response and a missing SLI are null ("not shown"), never 0. Executive tiles sum only the additive counters of the query responses (messages, threads_created, runs, completed, failed, cancelled, invocation_denials); a level (percentile, rate, distinct count such as active_people) shows the latest bucket of a single group and no tile with several groups; a metric name of an earlier query keeps its first tile. A series of a grouped query carries the display name of its group (VizNames.any), and the area mark names it in the legend and the semantics label, so two groups of one metric never differ by color alone. The traffic light only maps StatsSloState to role, icon and text; an unknown state reads "not enough data". |
Brief, design note 2; 25 4 rule 5 and 6.1. |
| D-M6-11-2 |
2026-10-15 |
The stale rule is part of the port: LiveFrameSourceBase waits viz.stale_after on an injected VizClock after start and after every frame and emits one stale until the next frame; start(spaceId) closes the previous stream; error events carry the wire code and its kind (forbidden, not_found, feature_disabled, rate_limited, other). The apps of M6-16 extend the base, so every implementation behaves the same. |
Brief, design note 3. |
| D-M6-11-3 |
2026-10-15 |
Every mark is one semantics container with a label built from its model and excludes its parts, so a screen reader reads it once; the run card is a button that reports its thread ID and never navigates. The traffic light announces politely (SemanticsService.sendAnnouncement) only when the state of the same SLO changes between two builds, never on an unchanged frame; it uses no liveRegion, which would announce every label change. Every run bar of the bar mark starts with the icon of its run state, so the state is never color alone. |
Brief, design note 4; 25 7.4. |
| D-M6-11-4 |
2026-10-15 |
Fixtures are <schema>.<state>.json, or <schema>.<query>.<state>.json when one schema serves several queries (StatsSeries.usage.normal.json); the table "Fixtures" of fixtures/README.md lists each with its schema and readers. The check viz-fixtures of make api-checks validates them with the jsonschema package already pinned through check-jsonschema (no new dependency), and fails on an unknown schema, an invalid file, an unlisted file and a listed schema without a file. The fixtures are also assets of the package, so the harness reads the same files on desktop and web. |
Brief, design note 5; 25 7.2. |
| D-M6-11-5 |
2026-10-15 |
tools/observability/sli_bounds.py writes slibounds.gen.go (sorted map metric to SLO, objective, threshold, period) and slo_catalog.g.dart (sorted list without thresholds), both DO NOT EDIT; modes --write and --check. Label rules (exactly one bothy_sli_metric per SLO, a value of the sli.* list of stats_minutes.metric, one SLO per metric) are enforced by the generator and by sli-labels; sli-bounds compares the files with a fresh run. Labels per SLO: bothy-api/requests-availability sli.api_availability, bothy-sync/delivery-latency sli.delivery_latency, bothy-sync/reconnect sli.reconnect, bothy-push/provider-acceptance sli.push_acceptance, bothy-agents/run-start sli.run_start, bothy-agents/turn-duration sli.turn_duration. |
Brief, design note 6; R-VZ-03. |
| D-M6-11-6 |
2026-10-15 |
The harness is the workspace member bothy_viz_harness under packages/bothy_viz/harness with the members of bothy_viz plus bothy_viz itself (rules.yaml, kind app, rule 6). Its platform folders are not checked in, like apps/client and apps/console: flutter create --platforms=macos,windows,web . makes them locally (README). Its time-lapse moves the fake clock by one frame interval per step; the tests pass reduced motion so the spinning run icon lets the tree settle. The repository tooling learns the nested member in the same change: the node bothy_viz_harness with its edges in the diagram of 15 3.1, the lcov path in sonar-project.properties, and the member discovery of the arch-check and CI toolchain tests (one level plus packages/*/harness, counts derived from the workspace list). |
Brief, design note 7; no generated native code in a package without native rule. |
| D-M6-11-7 |
2026-10-15 |
Golden matrix: every mark in light and dark, the three densities, text scale 1 and 2, de and en (24 cells per file), CI goldens on every host and platform goldens on macOS, both for the full matrix. Every file stays under repo.max_file_kb; the area mark shows the daily usage series, because the minute series of the timeline made the anti-aliased file exceed the limit. |
Brief, design note 8. |
| D-M6-11-8 |
2026-10-17 |
The ticket was ported from its integration base onto main with its own commits and the integration fixes INT-W27/3 (dartdoc of ReplayStep) and INT-W27/4 (term check exception for vizLaneLabel); the English docs of main win (spec 25 7.1 and 7.2, 15 3.1 diagram, docs/quality/gates.md, docs/observability/slos.md and the tool READMEs), code comments name the English chapter files, and the sli-labels test reads the English column "Metric of the own measurement". The run card and traffic light goldens are rerendered on main. |
Main carries its own value of color.warning.subtle (palette.amber.100, light #FEE6D4 instead of #FEF3EA on the integration base), which these marks show. |