doe_log.c's per-heartbeat-tick CSV gains two columns: fleet_k_q48 (vm_physics_fleet_heat_sum() over ALL live VMs -- the genuine fleet-wide conservation invariant K, not reconstructable from the 3 named-Tripod- member heat columns already logged, which omit every identity VM's own heat) and fleet_conserved (vm_physics_conserved() as 0/1). Requested explicitly after the first heartbeat-telemetry analysis pass (analysis-20260912/) omitted K entirely. Kernel rebuilt on all three architectures, full 3x9x3 campaign rerun (results-20260912-with-k/). K = 1.0000000000 (Q48.16 raw 65536) on every one of 775 heartbeat-tick observations, sd(K) = 0, 100% fleet_conserved, across amd64/aarch64/riscv64, nine identities, three replicates -- zero deviation. Also a free regression check on both recent Stadium fixes (§XVI/§XVII): neither disturbed the reservoir-transfer accounting K depends on. Found and fixed a tooling wrinkle along the way: fleet_conserved, being the CSV row's very last field with nothing after it to bound a regex match, can have a resumed trial digit merge into it with zero separator on the wire -- combine.py now derives it from fleet_k_q48 directly (same epsilon vm_physics_conserved() uses) instead of trusting the raw field. fleet_k_q48 itself is unaffected either way. Full analysis, discussion, and light/dark SVG->PDF figures written up as a proper LaTeX report (report-20260912/report/std79_doe_report.pdf), following experiments/bare_metal/analysis/report/bare_metal_doe_report.tex's established style -- supersedes analysis-20260912/'s markdown-only first pass as the primary deliverable for this dataset (kept, not discarded). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EXieurDfDSsDFdnSyusuWo
65 lines
3.6 KiB
Markdown
65 lines
3.6 KiB
Markdown
# std79-doe LaTeX report: the fleet conservation invariant K
|
||
|
||
**Read `report/std79_doe_report.pdf`** — this supersedes `../analysis-20260912/`
|
||
(the first, markdown-only pass) as the primary deliverable for this dataset.
|
||
That first pass was correctly flagged as inadequate: it never captured K
|
||
(the fleet-wide execution-heat conservation invariant) at all, and presented
|
||
results as a plain markdown page rather than in this project's established
|
||
LaTeX report style (see `experiments/bare_metal/analysis/report/` for the
|
||
precedent this follows — same document class, packages, colour palette,
|
||
light/dark figure pairs, abstract-first structure with headline numbers).
|
||
|
||
## What changed to make this possible
|
||
|
||
`src/starkernel/doe_log.c`'s per-heartbeat-tick CSV gained two new columns
|
||
(`fleet_k_q48`, `fleet_conserved` — see the file's own header comment for
|
||
the full 20-column schema), requiring a kernel rebuild and a fresh DoE
|
||
campaign rerun on all three architectures
|
||
(`../results-20260912-with-k/*-doe-raw.log` + `*-heartbeat.csv`).
|
||
|
||
## Pipeline (same shape as `../analysis-20260912/`, extended for K)
|
||
|
||
1. `correlate_doe.py <raw_log> <out_csv>` — per architecture, against
|
||
`../results-20260912-with-k/{amd64,aarch64,riscv64}-doe-raw.log` →
|
||
`{amd64,aarch64,riscv64}-correlated.csv` (committed, not scratch).
|
||
2. `combine.py <in1.csv> [in2.csv ...] <out.csv>` → `combined.csv` (775 rows).
|
||
Decodes `fleet_k_q48` to a plain float and **derives** `fleet_conserved`
|
||
from `fleet_k_q48` directly (using the same epsilon
|
||
`vm_physics_conserved()` uses, `capsule_vm_physics.c`) rather than
|
||
trusting the raw `fleet_conserved` field — that field is
|
||
`doe_log_tick_row()`'s very last printed column, with nothing after it
|
||
in the row to bound a regex match against, so a resumed trial digit can
|
||
merge into it with zero separator on the wire (confirmed live: raw
|
||
values like `19223372036854775807` where `0`/`1` was expected). See the
|
||
script's own comment for the full explanation.
|
||
3. `analysis.R` (run from this directory) — computes the K result
|
||
(trivial: one distinct value, `sd = 0`, reported directly rather than
|
||
via a formal test — see the report's own \S5.1 for why), per-cell
|
||
architecture × identity summaries, and two-way ANOVA for 12 secondary
|
||
metrics; writes `charts/*.svg` (light+dark pairs, matching
|
||
`experiments/bare_metal/analysis/analyse_bare_metal.R`'s theme
|
||
convention) and `tables/*.csv`.
|
||
4. SVGs converted to PDF for LaTeX via `rsvg-convert` into `report/figures/`.
|
||
5. `report/std79_doe_report.tex`, hand-authored following
|
||
`experiments/bare_metal/analysis/report/bare_metal_doe_report.tex`'s
|
||
structure and conventions; compiled with `pdflatex` (three passes for
|
||
cross-references/TOC).
|
||
|
||
## Headline result
|
||
|
||
$K = 1.0000000000$ (raw Q48.16 `65536`) on **every one of 775
|
||
heartbeat-tick observations**, `sd(K) = 0`, `fleet_conserved = 1` on 100% of
|
||
rows, across all three architectures, nine identities, and three
|
||
replicates. Zero deviation. See the report for the full discussion,
|
||
including why this is also a free regression check on the two Stadium
|
||
subsystem fixes (FABRIC-3.md §XVI–XVII) that landed the same week.
|
||
|
||
## Known limitation
|
||
|
||
Same interleaving-correlation caveat as `../analysis-20260912/`: 1 of 27
|
||
`run_id` markers was unrecoverable on 2 of 3 architectures this run
|
||
(aarch64/riscv64: `run_id` 1 folded into `run_id` 0). `fleet_k_q48` itself
|
||
is entirely unaffected by this — it's read directly at each tick regardless
|
||
of trial attribution, so the K result does not depend on trial labeling
|
||
being correct at all. See report §2.3/§6.4 for the full explanation.
|