Files
LithosAnanke/experiments/std79-doe/analysis-20260912
Claude 3bd81097e1 chore(license): an SPDX header on every source file that had none (LicenseRef-Starship-1.0) [skip ci]
The header scan (Captain Bob, 2026-11-10): 788 source files -- 351 with the
SL-1.0 header, 12 with the old name (docs/working/experiments, kept by
ruling), 31 under someone else's licence (tools/kconfig, Linux's, GPL-2.0:
kept), and 394 with none. Ruled: the SPDX form; capsules (.4th, .f18) and
proofs (.thy) left for a ruling of their own (mkcapsule's 64x16 block format,
content-addressed capsules).

253 files now begin
    SPDX-License-Identifier: LicenseRef-Starship-1.0
    Copyright (c) 2023-2026 Robert A. James
as a /* */ block (C, headers, assembly, linker scripts) or # lines (scripts,
Makefiles, Kconfig; below a shebang or a coding line); tools/mkcapsule.c,
which had the copyright line, gets the SPDX line only.

Not touched: docs/working/ (archive and old campaign material, as the
ruling kept the experiments); v4/system/post_cases.c (generated by
v4/tools/mkpost.py, "do not edit" -- the generator has the header).

Comments only: the kernel builds on amd64, aarch64, riscv64; make -C v4
test-32: 39 programs, 0 failures; every changed script parses.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
2026-11-10 04:12:49 +00:00
..

std79-doe 3×9 factorial analysis (heartbeat/physics telemetry)

Read ANALYSIS.md for the report itself (key findings, per-metric cell means, two-way ANOVA tables, boxplot SVGs). This file just documents the pipeline.

Pipeline

  1. Source data: ../results-20260912-with-heartbeat-csv/{amd64,aarch64,riscv64}-doe-raw.log — raw QEMU serial logs from the HB-ON/HB-OFF-instrumented std79 DoE campaign (see ../README.md and FABRIC-3.md §XV/§XVI/§XVII for the campaign itself).

  2. correlate_doe.py <raw_log> <out_csv> — reconstructs which DoE trial (run_id, id_idx, id_label, rep) was active for every heartbeat-tick CSV row, despite the async tick printer splicing rows mid-token into the trial loop's own console output on the shared serial line (see the script's own docstring for the two-pass reconstruction method, and its RUN_ID_MAP for why identity/rep are looked up from a known-clean prior run rather than re-parsed from each log — one aarch64 marker was unrecoverable, see below). Output committed as {amd64,aarch64,riscv64}-correlated.csv (255-257 rows each, data in their own right — the per-trial-labeled telemetry, one step before merging) — never discarded as scratch, regenerable exactly via:

    python3 correlate_doe.py ../results-20260912-with-heartbeat-csv/amd64-doe-raw.log amd64-correlated.csv
    python3 correlate_doe.py ../results-20260912-with-heartbeat-csv/aarch64-doe-raw.log aarch64-correlated.csv
    python3 correlate_doe.py ../results-20260912-with-heartbeat-csv/riscv64-doe-raw.log riscv64-correlated.csv
    
  3. combine.py <in1.csv> [in2.csv ...] <out.csv> — merges the three committed per-architecture correlated CSVs into combined.csv (committed, 768 rows), decoding Q48.16 fixed-point fields to plain floats and jitter_bits' raw IEEE754 bit pattern to a real jitter_ns value:

    python3 combine.py amd64-correlated.csv aarch64-correlated.csv riscv64-correlated.csv combined.csv
    
  4. analysis.R (run from this directory) — reads combined.csv, computes per-cell (architecture × identity) summary statistics and a two-way ANOVA for each of the 12 varying telemetry metrics, renders one boxplot SVG per metric to svg/, and writes ANALYSIS.md:

    Rscript analysis.R
    

    Requires dplyr, tidyr, ggplot2, svglite (all present in this environment already).

Known limitation

aarch64's raw log lost 1 of 27 DOE-RUN markers to interleaving beyond recovery — trial 12 (identity rajames, rep 1). Its rows fold into trial 11 (identity rajames, rep 0) in combined.csv, so aarch64's rajames cell isn't perfectly separable between those two replicates specifically. Every other cell, on every architecture, is unaffected — see ANALYSIS.md's own note and correlate_doe.py's docstring for the full explanation.