You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Follow-on design ticket from #5685 — its decomposition sketch names this as a separate design, and the parent's acceptance requires these tickets to be filed and linked. Filed in the 2026-11-04 gap pass (WS-F) so the design work exists and can be prioritised on its own merits; implementation timing is a separate decision, possibly months out.
What this design must settle
Workloads × interfaces × configurations: the matrix, its results format, and publication.
Context from the parent
The parent programme fixes the adversarial DoS suite and the per-interface benchmark programme as CI regression gates sharing one load/measurement machinery. The parent issue carries the surrounding decisions this ticket must not re-decide; where this ticket's answer would change a parent decision, record that explicitly rather than silently forking it.
Decision record expected
Close this design with a recorded decision (on this issue or in a doc/ record linked from it): the chosen shape, the alternatives rejected and why, and the invariants implementation must hold. If the design splits further, file the splits and link them here rather than growing this issue.
Relations
Parent: #5685. Programme: epic #2056. Filed by WS-F (2026-11-04 ID design gap & expansion pass).
Triage outcome — task 10298 (2026-11-05, lane code-p)
Verdict: CONFIRMED as a valid standalone design ticket — routed, with axis-dependency guidance recorded (no parent-recorded ordering exists for this family yet).
Fresh verification (2026-11-05): issue #5896 OPEN, labels task/triage + queue/queued + app/id — no hard-stop labels. Parent #5685 (DoS suite & performance benchmark programme) is OPEN; the WS-F gap pass filed all seven children — #5891 (shared load & workload generator), #5892 (DoS scenario catalogue), #5893 (CI tiering), #5894 (standard server baseline), #5895 (scaling-technique comparisons), #5896 (this ticket), #5897 (benchmark regression gates) — all OPEN. Unlike the #5675/#5679 families, the parent has not yet been triage-ordered, so the dependency guidance below is this triage's recommendation, flagged as such.
Existing assets the design must build on (current main 04f78696ab):pkgs/id/benches/ holds the world_bench harness, committed baseline.txt medians, and BASELINES.md (reference machine = the fleet laptop; re-baseline procedure; slice-3 CI regression reporting diffs future runs against medians at >20%). There is no per-interface matrix, results format, or publication mechanism yet — that absence is exactly this ticket. The matrix results format should stay comparable with the existing baseline.txt line format where that makes sense, rather than orphaning the committed baselines.
Dependency guidance (recommendation, not a parent ruling):
id: design: benchmark regression gates (from #5685) #5897 (regression gates) consumes this ticket's results format — the format is a contract; state it as one (fields, units, machine-class tagging per the BASELINES.md comparability warning).
Deliverable (ticket's own terms): a recorded decision — matrix shape, results format, publication — with alternatives rejected and implementation invariants, on this issue or in a doc/ record linked from it. Implementation timing is a separate later decision.
Routing: follow-up design task enqueued with the axis-input guidance in its packet.
agent-note:v1
{"kind": "triage", "task": 10298, "issue": 5896, "state": "done", "outcome": "confirmed_design_ticket_routed", "evidence": "parent #5685 OPEN, children #5891-#5897 all OPEN, parent not yet triage-ordered; pkgs/id/benches has world_bench + committed baselines but no per-interface matrix or results format"}
agent-note:v1
{"kind":"worker","task":10503,"issue":5896,"state":"picked_up","outcome":"work_started","lane":"c8b9355e-319a-4640-8096-7ad19480d151","evidence":"Queue task 10503 claimed by repo-worker-code; issue #5896 OPEN with no linked PR and no hard-stop labels; parent #5685 OPEN. Revalidated 2026-11-05."}
Decision record — per-interface benchmark matrix, results and publication (2026-11-05)
Decision
The comparison unit is a matrix cell keyed by workload × interface × configuration. Workload IDs come from #5891 and configuration IDs from #5894; this record deliberately does not define either sibling's enumerations. The interface axis uses stable IDs for the actual protocol/transport being measured, not the presentation format. The existing shell contract names iroh, websocket and ssh-exec as distinct transport IDs; WorldSurface::Screen and WorldSurface::Text are presentation kinds, not additional transports. Add other interfaces only when an implementation exposes a separately measurable protocol surface, with a stable ID.
For each cell, use the same workload definition and shared load/measurement machinery across interfaces. A workload/configuration that does not apply to an interface is recorded explicitly as not_applicable or unsupported with a reason; it is never silently omitted or represented as zero. A failed run is also explicit and is distinct from a measured regression.
Publish a versioned results.jsonl bundle with a run-manifest record and one cell record per matrix tuple. The manifest carries schema_version, run_id, git_sha, started_at_utc, machine_class, OS/architecture, CPU/runner description, toolchain and build profile. Each cell carries run_id, workload_id, interface_id, configuration_id, status, and reason when not measured. A measured cell contains metric entries with metric, statistic, unit, numeric value, sample_count and raw sample values. The comparison identity is (machine_class, workload_id, interface_id, configuration_id, metric, statistic); each run also has a distinct run_id.
Use explicit units and statistics, e.g. throughput / median / operations_per_second; latency / p50, p95 and p99 / microseconds; CPU per operation / median / microseconds_per_operation. The machine_class is mandatory and is the canonical class supplied by #5894—not a free-form runner label. Include the commit and environment provenance so a consumer can reject incomparable results. Do not compare across machine classes, configuration IDs, units or workload/interface IDs.
Keep the existing bench <name> unit=<unit> median=<value> min=<value> reps=<n> output and baseline.txt representation for compatible world_bench medians. Treat it as a compatibility/human-readable view, not a second source of truth: p50/p95/p99 and other matrix metrics stay explicit in JSONL, and the legacy median field must not be used to disguise another statistic. #5897's comparator must key on the full matrix identity rather than only the current second-token benchmark name (the existing comparator keys by name and compares unit/median, so matrix rows can otherwise collide).
Publication
For every matrix workflow run, upload the JSONL bundle and raw benchmark output as a run artifact, and link that artifact from the GitHub Actions job summary. The summary is an index, not the record. Keep accepted reference baselines versioned in the repository and update them only through the documented BASELINES.md re-baseline procedure and review. #5897 owns the durable artifact-retention/archive period and the comparison/gate policy; #5893 owns CI tiering and triggers. Current precedent is the job summary plus uploaded artifacts in id-bench.yml; its workflow_dispatch-only trigger differs from the push behavior described in BASELINES.md, so that discrepancy is left to #5893 rather than changed here.
Rejected alternatives
Encoding interface/configuration into an informal display name alone: the current comparator's name-only key is collision-prone and does not establish machine-class comparability.
Every planned cell produces measurements or an explicit status/reason. Preserve raw samples, units, machine class and build/environment provenance; never silently mix units or machine classes.
Baseline changes remain versioned and reviewed under BASELINES.md; a changed baseline is not silently accepted from a quick run.
Evidence checked on main 04f78696ab: pkgs/id/benches/world_bench.rs currently has host-side microbenchmarks and many_worlds, not independent transport paths; pkgs/id/contract/shell-contract.v1.json names the shell transport IDs; pkgs/id/benches/baseline.txt and BASELINES.md establish the current line format and machine-class rule; .github/scripts/id-bench-compare.sh keys by benchmark name and compares unit/median. #5891 and #5894 are still open, so their axes remain named inputs.
agent-note:v1
{"kind":"worker","task":10503,"issue":5896,"state":"done","outcome":"design_record_posted","lane":"c8b9355e-319a-4640-8096-7ad19480d151","evidence":"Decision record posted here; cross-checked against main 04f7869 and parent #5685. Design-only; no code or benchmark runs."}
Activity
developing-today commentedon Nov 5, 2026
CODE-1579
dezren39 commentedon Nov 5, 2026
Triage outcome — task 10298 (2026-11-05, lane code-p)
Verdict: CONFIRMED as a valid standalone design ticket — routed, with axis-dependency guidance recorded (no parent-recorded ordering exists for this family yet).
Fresh verification (2026-11-05): issue #5896 OPEN, labels task/triage + queue/queued + app/id — no hard-stop labels. Parent #5685 (DoS suite & performance benchmark programme) is OPEN; the WS-F gap pass filed all seven children — #5891 (shared load & workload generator), #5892 (DoS scenario catalogue), #5893 (CI tiering), #5894 (standard server baseline), #5895 (scaling-technique comparisons), #5896 (this ticket), #5897 (benchmark regression gates) — all OPEN. Unlike the #5675/#5679 families, the parent has not yet been triage-ordered, so the dependency guidance below is this triage's recommendation, flagged as such.
Existing assets the design must build on (current main
04f78696ab):pkgs/id/benches/holds theworld_benchharness, committedbaseline.txtmedians, andBASELINES.md(reference machine = the fleet laptop; re-baseline procedure; slice-3 CI regression reporting diffs future runs against medians at >20%). There is no per-interface matrix, results format, or publication mechanism yet — that absence is exactly this ticket. The matrix results format should stay comparable with the existingbaseline.txtline format where that makes sense, rather than orphaning the committed baselines.Dependency guidance (recommendation, not a parent ruling):
Deliverable (ticket's own terms): a recorded decision — matrix shape, results format, publication — with alternatives rejected and implementation invariants, on this issue or in a
doc/record linked from it. Implementation timing is a separate later decision.Routing: follow-up design task enqueued with the axis-input guidance in its packet.
agent-note:v1
{"kind": "triage", "task": 10298, "issue": 5896, "state": "done", "outcome": "confirmed_design_ticket_routed", "evidence": "parent #5685 OPEN, children #5891-#5897 all OPEN, parent not yet triage-ordered; pkgs/id/benches has world_bench + committed baselines but no per-interface matrix or results format"}
dezren39 commentedon Nov 5, 2026
agent-note:v1
{"kind":"worker","task":10503,"issue":5896,"state":"picked_up","outcome":"work_started","lane":"c8b9355e-319a-4640-8096-7ad19480d151","evidence":"Queue task 10503 claimed by repo-worker-code; issue #5896 OPEN with no linked PR and no hard-stop labels; parent #5685 OPEN. Revalidated 2026-11-05."}
dezren39 commentedon Nov 5, 2026
Decision record — per-interface benchmark matrix, results and publication (2026-11-05)
Decision
The comparison unit is a matrix cell keyed by workload × interface × configuration. Workload IDs come from #5891 and configuration IDs from #5894; this record deliberately does not define either sibling's enumerations. The interface axis uses stable IDs for the actual protocol/transport being measured, not the presentation format. The existing shell contract names
iroh,websocketandssh-execas distinct transport IDs;WorldSurface::ScreenandWorldSurface::Textare presentation kinds, not additional transports. Add other interfaces only when an implementation exposes a separately measurable protocol surface, with a stable ID.For each cell, use the same workload definition and shared load/measurement machinery across interfaces. A workload/configuration that does not apply to an interface is recorded explicitly as
not_applicableorunsupportedwith a reason; it is never silently omitted or represented as zero. A failed run is also explicit and is distinct from a measured regression.Results contract for #5897
Publish a versioned
results.jsonlbundle with a run-manifest record and one cell record per matrix tuple. The manifest carriesschema_version,run_id,git_sha,started_at_utc,machine_class, OS/architecture, CPU/runner description, toolchain and build profile. Each cell carriesrun_id,workload_id,interface_id,configuration_id,status, andreasonwhen not measured. A measured cell contains metric entries with metric, statistic, unit, numeric value, sample_count and raw sample values. The comparison identity is(machine_class, workload_id, interface_id, configuration_id, metric, statistic); each run also has a distinctrun_id.Use explicit units and statistics, e.g. throughput / median /
operations_per_second; latency / p50, p95 and p99 /microseconds; CPU per operation / median /microseconds_per_operation. Themachine_classis mandatory and is the canonical class supplied by #5894—not a free-form runner label. Include the commit and environment provenance so a consumer can reject incomparable results. Do not compare across machine classes, configuration IDs, units or workload/interface IDs.Keep the existing
bench <name> unit=<unit> median=<value> min=<value> reps=<n>output andbaseline.txtrepresentation for compatibleworld_benchmedians. Treat it as a compatibility/human-readable view, not a second source of truth: p50/p95/p99 and other matrix metrics stay explicit in JSONL, and the legacymedianfield must not be used to disguise another statistic. #5897's comparator must key on the full matrix identity rather than only the current second-token benchmark name (the existing comparator keys by name and compares unit/median, so matrix rows can otherwise collide).Publication
For every matrix workflow run, upload the JSONL bundle and raw benchmark output as a run artifact, and link that artifact from the GitHub Actions job summary. The summary is an index, not the record. Keep accepted reference baselines versioned in the repository and update them only through the documented
BASELINES.mdre-baseline procedure and review. #5897 owns the durable artifact-retention/archive period and the comparison/gate policy; #5893 owns CI tiering and triggers. Current precedent is the job summary plus uploaded artifacts inid-bench.yml; itsworkflow_dispatch-only trigger differs from the push behavior described inBASELINES.md, so that discrepancy is left to #5893 rather than changed here.Rejected alternatives
Screen/Textpresentation kinds as transport IDs: they are a different layer fromiroh/websocket/ssh-exec.Implementation invariants and boundaries
BASELINES.md; a changed baseline is not silently accepted from a quick run.Evidence checked on main
04f78696ab:pkgs/id/benches/world_bench.rscurrently has host-side microbenchmarks andmany_worlds, not independent transport paths;pkgs/id/contract/shell-contract.v1.jsonnames the shell transport IDs;pkgs/id/benches/baseline.txtandBASELINES.mdestablish the current line format and machine-class rule;.github/scripts/id-bench-compare.shkeys by benchmark name and compares unit/median. #5891 and #5894 are still open, so their axes remain named inputs.agent-note:v1
{"kind":"worker","task":10503,"issue":5896,"state":"done","outcome":"design_record_posted","lane":"c8b9355e-319a-4640-8096-7ad19480d151","evidence":"Decision record posted here; cross-checked against main 04f7869 and parent #5685. Design-only; no code or benchmark runs."}