detached 7f91179

docs(perf): align observability manifest evidence

commit
7f9117924b82a74ec7417777ab948045042104dc
author
brice · · 2026-07-13 00:22 UTC
parent
9597b55
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
2 files · +37 -11
M docs/performance.md +14 -5
@@ -9,8 +9,10 @@ transport coverage are in [`testdata/perf/manifest.json`](../testdata/perf/manif
99 `1x4`, `4x1`, `4x4`, and `8x1`, all at `120x40` with 10,000 rows per pane;
1010 idle, active/all/inactive output, interactive flood, copy search, resize sweep,
1111 snapshot/output/resize, and attach/restore/tab switch; local, SSH stdio, UDP
12-baseline, UDP 25/100 ms, and UDP 1% loss. It has 216 scenarios (4×9×6), with
13-inapplicable cases required to be explicit.
12+baseline, UDP 25/100 ms, and UDP 0%/1% loss. It has 252 scenarios (4×9×7),
13+with inapplicable cases required to be explicit. The seven transport entries are
14+`local`, `ssh_stdio`, `udp_baseline`, `udp_loss_0pct`, `udp_25ms`, `udp_100ms`,
15+and `udp_loss_1pct`.
1416
1517 ### Trace schema and clock domains
1618
@@ -25,7 +27,10 @@ Every process JSONL record has exactly these fields:
2527 ```
2628
2729 `tick` is stamped only by the concrete JSONL observer using its process-local
28-injected monotonic clock; producers supply no timestamp. Components in one OS
30+injected monotonic clock; producers supply no timestamp. The harness sets `VEV_PERF_TRACE`,
31+`VEV_PERF_PROCESS_ID`, `VEV_PERF_SCENARIO`, and `VEV_PERF_RUN` for every
32+launched role, identifying its exclusive trace path and process/scenario/run
33+mapping. Components in one OS
2934 process share that observer. The harness clock is a separate monotonic domain
3035 and is the sole clock for input-injection → terminal-bytes-successfully-flushed
3136 end-to-end samples. Cross-process ticks are never ordered or subtracted;
@@ -50,10 +55,14 @@ go run ./cmd/vev-perf-harness --vev-bin /tmp/vev-perf \
5055 ```
5156
5257 The minimums are 30 seconds measured and 10 independent repetitions; warmup is
53-excluded. Each run must contain `manifest.json`, `raw-harness.jsonl`, per-process
58+excluded. During the measured interval the harness injects at most one event per
59+second. At least 10 complete event pairs are required: both injection and
60+successful terminal flush must fall inside the measured interval; straddling or
61+failed events are retained only as raw diagnostics and are not samples. Each run must contain `manifest.json`, `raw-harness.jsonl`, per-process
5462 JSONL, `runs.json`, and `summary.json`. Reject results with missing input/flush
5563 boundaries, unmatched IDs, bad correlation, nonmonotonic same-process sequence,
56-negative same-domain spans, insufficient measured events, invalid denominators,
64+negative same-domain spans, fewer than 10 complete in-interval event pairs,
65+invalid denominators,
5766 any cross-process tick arithmetic, or unmet duration/repetition minima. Raw
5867 JSONL and run manifests are the evidence files; no result authorizes a policy
5968 or optimization change.
@@ -9,8 +9,10 @@ transport coverage are in [`testdata/perf/manifest.json`](../testdata/perf/manif
9 `1x4`, `4x1`, `4x4`, and `8x1`, all at `120x40` with 10,000 rows per pane;9 `1x4`, `4x1`, `4x4`, and `8x1`, all at `120x40` with 10,000 rows per pane;
10 idle, active/all/inactive output, interactive flood, copy search, resize sweep,10 idle, active/all/inactive output, interactive flood, copy search, resize sweep,
11 snapshot/output/resize, and attach/restore/tab switch; local, SSH stdio, UDP11 snapshot/output/resize, and attach/restore/tab switch; local, SSH stdio, UDP
12-baseline, UDP 25/100 ms, and UDP 1% loss. It has 216 scenarios (4×9×6), with12+baseline, UDP 25/100 ms, and UDP 0%/1% loss. It has 252 scenarios (4×9×7),
13-inapplicable cases required to be explicit.13+with inapplicable cases required to be explicit. The seven transport entries are
14+`local`, `ssh_stdio`, `udp_baseline`, `udp_loss_0pct`, `udp_25ms`, `udp_100ms`,
15+and `udp_loss_1pct`.
14 16
15 ### Trace schema and clock domains17 ### Trace schema and clock domains
16 18
@@ -25,7 +27,10 @@ Every process JSONL record has exactly these fields:
25 ```27 ```
26 28
27 `tick` is stamped only by the concrete JSONL observer using its process-local29 `tick` is stamped only by the concrete JSONL observer using its process-local
28-injected monotonic clock; producers supply no timestamp. Components in one OS30+injected monotonic clock; producers supply no timestamp. The harness sets `VEV_PERF_TRACE`,
31+`VEV_PERF_PROCESS_ID`, `VEV_PERF_SCENARIO`, and `VEV_PERF_RUN` for every
32+launched role, identifying its exclusive trace path and process/scenario/run
33+mapping. Components in one OS
29 process share that observer. The harness clock is a separate monotonic domain34 process share that observer. The harness clock is a separate monotonic domain
30 and is the sole clock for input-injection → terminal-bytes-successfully-flushed35 and is the sole clock for input-injection → terminal-bytes-successfully-flushed
31 end-to-end samples. Cross-process ticks are never ordered or subtracted;36 end-to-end samples. Cross-process ticks are never ordered or subtracted;
@@ -50,10 +55,14 @@ go run ./cmd/vev-perf-harness --vev-bin /tmp/vev-perf \
50 ```55 ```
51 56
52 The minimums are 30 seconds measured and 10 independent repetitions; warmup is57 The minimums are 30 seconds measured and 10 independent repetitions; warmup is
53-excluded. Each run must contain `manifest.json`, `raw-harness.jsonl`, per-process58+excluded. During the measured interval the harness injects at most one event per
59+second. At least 10 complete event pairs are required: both injection and
60+successful terminal flush must fall inside the measured interval; straddling or
61+failed events are retained only as raw diagnostics and are not samples. Each run must contain `manifest.json`, `raw-harness.jsonl`, per-process
54 JSONL, `runs.json`, and `summary.json`. Reject results with missing input/flush62 JSONL, `runs.json`, and `summary.json`. Reject results with missing input/flush
55 boundaries, unmatched IDs, bad correlation, nonmonotonic same-process sequence,63 boundaries, unmatched IDs, bad correlation, nonmonotonic same-process sequence,
56-negative same-domain spans, insufficient measured events, invalid denominators,64+negative same-domain spans, fewer than 10 complete in-interval event pairs,
65+invalid denominators,
57 any cross-process tick arithmetic, or unmet duration/repetition minima. Raw66 any cross-process tick arithmetic, or unmet duration/repetition minima. Raw
58 JSONL and run manifests are the evidence files; no result authorizes a policy67 JSONL and run manifests are the evidence files; no result authorizes a policy
59 or optimization change.68 or optimization change.
M testdata/perf/README.md +23 -6
@@ -21,7 +21,9 @@ go run ./cmd/vev-perf-harness --vev-bin /tmp/vev-perf \
2121 Each run writes `manifest.json`, `raw-harness.jsonl`, one JSONL trace per
2222 launched process, `runs.json`, and `summary.json`. The process manifest records
2323 process ID, role, scenario/run, clock domain, exact exclusive trace path, and
24-identity. The harness owns only the end-to-end boundaries: input injection to
24+identity. Every launched role receives `VEV_PERF_TRACE`, `VEV_PERF_PROCESS_ID`,
25+`VEV_PERF_SCENARIO`, and `VEV_PERF_RUN`; the first is exclusive to that process
26+and the remaining values correlate it to the manifest. The harness owns only the end-to-end boundaries: input injection to
2527 terminal bytes successfully flushed. It never subtracts ticks from daemon,
2628 client, or adapter processes.
2729
@@ -43,10 +45,25 @@ fragments, retransmits, pending, and ACK RTT remain diagnostics. Reports retain
4345 raw records and counts plus p50/p95/p99 (and max where applicable). End-to-end
4446 reports are harness-clock distributions only.
4547
46-Reject a result for missing or unmatched boundaries, missing flush, invalid
47-correlation, nonmonotonic same-process sequence, negative same-domain duration,
48-insufficient measured events, invalid denominators, cross-process tick math,
49-less than 30 seconds measured, or fewer than 10 repetitions. Warmup is excluded
50-from measured samples. Raw traces are evidence, not a transport-policy or
48+The harness injects at most one measured event per second and requires at least
49+10 complete in-interval event pairs. Both the input-injection and successful
50+terminal-flush boundaries must be within the measured interval; warmup and
51+straddling pairs are excluded from percentile samples (but retained as raw
52+evidence). Reject a result for missing or unmatched boundaries, missing flush,
53+invalid correlation, nonmonotonic same-process sequence, negative same-domain
54+duration, fewer than 10 complete in-interval pairs, invalid denominators,
55+cross-process tick math, less than 30 seconds measured, or fewer than 10
56+repetitions. Warmup is excluded from measured samples. Raw traces are evidence, not a transport-policy or
5157 optimization gate; wire bytes, protocol version, rendering policy, pacing,
5258 compression, and loss behavior are unchanged.
59+
60+## Bounded manifest and harness checks
61+
62+Before a measurement, validate the manifest shape and run the harness tests without launching the full matrix:
63+
64+```sh
65+jq -e '(.topologies|length)==4 and (.workloads|length)==9 and (.transports|length)==7 and (.scenarios|length)==252' testdata/perf/manifest.json
66+go test ./cmd/vev-perf-harness
67+```
68+
69+The full command above is the measurement procedure; its 10-second warmup, 30-second measured interval, and 10 repetitions are the minimum accepted settings.
@@ -21,7 +21,9 @@ go run ./cmd/vev-perf-harness --vev-bin /tmp/vev-perf \
21 Each run writes `manifest.json`, `raw-harness.jsonl`, one JSONL trace per21 Each run writes `manifest.json`, `raw-harness.jsonl`, one JSONL trace per
22 launched process, `runs.json`, and `summary.json`. The process manifest records22 launched process, `runs.json`, and `summary.json`. The process manifest records
23 process ID, role, scenario/run, clock domain, exact exclusive trace path, and23 process ID, role, scenario/run, clock domain, exact exclusive trace path, and
24-identity. The harness owns only the end-to-end boundaries: input injection to24+identity. Every launched role receives `VEV_PERF_TRACE`, `VEV_PERF_PROCESS_ID`,
25+`VEV_PERF_SCENARIO`, and `VEV_PERF_RUN`; the first is exclusive to that process
26+and the remaining values correlate it to the manifest. The harness owns only the end-to-end boundaries: input injection to
25 terminal bytes successfully flushed. It never subtracts ticks from daemon,27 terminal bytes successfully flushed. It never subtracts ticks from daemon,
26 client, or adapter processes.28 client, or adapter processes.
27 29
@@ -43,10 +45,25 @@ fragments, retransmits, pending, and ACK RTT remain diagnostics. Reports retain
43 raw records and counts plus p50/p95/p99 (and max where applicable). End-to-end45 raw records and counts plus p50/p95/p99 (and max where applicable). End-to-end
44 reports are harness-clock distributions only.46 reports are harness-clock distributions only.
45 47
46-Reject a result for missing or unmatched boundaries, missing flush, invalid48+The harness injects at most one measured event per second and requires at least
47-correlation, nonmonotonic same-process sequence, negative same-domain duration,49+10 complete in-interval event pairs. Both the input-injection and successful
48-insufficient measured events, invalid denominators, cross-process tick math,50+terminal-flush boundaries must be within the measured interval; warmup and
49-less than 30 seconds measured, or fewer than 10 repetitions. Warmup is excluded51+straddling pairs are excluded from percentile samples (but retained as raw
50-from measured samples. Raw traces are evidence, not a transport-policy or52+evidence). Reject a result for missing or unmatched boundaries, missing flush,
53+invalid correlation, nonmonotonic same-process sequence, negative same-domain
54+duration, fewer than 10 complete in-interval pairs, invalid denominators,
55+cross-process tick math, less than 30 seconds measured, or fewer than 10
56+repetitions. Warmup is excluded from measured samples. Raw traces are evidence, not a transport-policy or
51 optimization gate; wire bytes, protocol version, rendering policy, pacing,57 optimization gate; wire bytes, protocol version, rendering policy, pacing,
52 compression, and loss behavior are unchanged.58 compression, and loss behavior are unchanged.
59+
60+## Bounded manifest and harness checks
61+
62+Before a measurement, validate the manifest shape and run the harness tests without launching the full matrix:
63+
64+```sh
65+jq -e '(.topologies|length)==4 and (.workloads|length)==9 and (.transports|length)==7 and (.scenarios|length)==252' testdata/perf/manifest.json
66+go test ./cmd/vev-perf-harness
67+```
68+
69+The full command above is the measurement procedure; its 10-second warmup, 30-second measured interval, and 10 repetitions are the minimum accepted settings.

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 2

Tags 13

↑↓ moveenter openesc close