Files
LithosAnanake/experiments/std79-doe/report-20260912/README.md
T
Robert Allan JamesandClaude Sonnet 5 66ba21adb4
Build / build-amd64-iso (push) Waiting to run
Build / build-aarch64-iso (push) Waiting to run
Build / build-riscv64-img (push) Waiting to run
Log fleet_k_q48/fleet_conserved; K holds exactly, 775/775 ticks (FABRIC-3.md §XVIII)
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
2026-09-12 13:25:09 -04:00

65 lines
3.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 §XVIXVII) 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.