# Protocol for this entry

Protocols: `protocols/local-model-runtime-v2.md` (pinned 2026-10-07; core steps and the "when the unit allows" steps a 24GB laptop can run), `protocols/adversarial-suite-v1.md` (passes 1, 2 and 3), and the five kit protocols under `protocols/kits/` (kit checks and live variants). Run through `bench/harness` (config `harness/configs/2026-10-07-gpt-oss-20b-m5-pro-suite.json`) on 2026-10-07; the session script that sequenced the commands is `harness/run-suite.sh` in this folder. Timestamps in the evidence are UTC (UK time is one hour later).

## Deviations and steps not run

- Step 1 (setup from zero) was not repeated: the runtime and model were installed for entry one. `evidence/setup.log` records this pass's own steps only.
- Speed (llama-bench) ran before any server was started, as in entries one and two, so only one copy of the model was resident.
- The server was started twice: `-c 32768` (four slots of 32,768, unified KV, the same as entry two) for every step but one, and `-c 49152` for the 32K prefix pass, whose first turn carries about 35,000 tokens. Both starts and their `/props` are in `setup.log`; the logs are `llama-server.log` and `llama-server-32k.log`.
- v2 step 7 (power draw) and the thermal sidecar: not run. The plug meter has not arrived and `powermetrics` needs a root shell the session did not have. The sustained-load step ran without power or temperature readings, so it reports tokens per second over time only.
- v2 step 9 (noise): not run; no meter.
- v2 step 10: warm load only (three starts). The cold-cache load needs `sudo purge`, not available to the script.
- v2 step 11 (two models resident) and step 14 (quantization and runtime pairs): not run. A 24GB machine does not hold two copies, and only the MXFP4 file is on hand; runtimes were held at llama.cpp.
- The egress sampler took its four samples during pass 1 only. Its first launch from the session script found no `lsof` (the script's PATH lacked `/usr/sbin`) and recorded four "not available" samples, which stay in `egress.json`; the sampler was re-run during pass 1 with the right PATH and the harness now falls back to `/usr/sbin` itself.
- Concurrency (v2 step 12) ran twice. The first run's time to first token was null in every request: the sampler timed the first visible token and this model spends its first tokens on reasoning, so a 256-token request produced no visible token at all. The sampler was corrected to time the first streamed token of any kind (and to keep the first visible token separately) and the step was re-run after the suite against a fresh `-c 32768` server. Both files are kept: `concurrency-first-run-no-ttft.json` and `concurrency.json`; throughput agrees between them within the run-to-run spread.
- Every adversarial pass and variant ran three runs per job at reasoning medium and temperature 1.0 unless the step says otherwise (the sweep: low and high on pass 1; the 32K pass: pass 1 with the fixed transcript ahead of every job).
- The manifest's self-check (every record re-scored from its own calls) failed on the three `remembers/planted/foreign-key-run<n>.json` records: the harness's refusal path had left out the `shownKeys` field the re-scorer reads for planted runs, so the stored nudge table and the re-scored one disagreed on "shown". The harness was fixed (with a test), the step was re-run (it makes no model call: the pack is refused before the first one), the first seal was discarded and the folder re-sealed, then the manifest was signed. All in `setup.log`.
- Anything the session log marks `FAIL` is reported as not run, with the log line as the evidence. Nothing was.

## Environment

| Item | Value |
|---|---|
| Host machine | Apple M5 Pro, 16 cores, 24GB unified memory, macOS 27.0 |
| Runtime | llama.cpp 0.5.0, build 11146 (7fe450e19); `llama-server --jinja -c 32768` and `-c 49152`; `llama-bench` |
| Model file | `gpt-oss-20b-MXFP4.gguf`, 12,109,566,624 bytes, 20.9B parameters, MXFP4 |
| Harness | `bench/harness` (91 tests passing on the day), nudge sets sandbox-v1 (variants) and adversarial-v1 (passes 1 to 3, the sweep, the 32K pass) |
| Model settings | reasoning medium (low and high in the sweep), temperature 1.0, top_p 1.0, max 4,096 tokens per turn, 14 turns per run, 3 runs per job |
| Kits | identitykit 0.0.2, mandatekit 0.1.0, budget-guard 0.1.0, witnesskit 0.0.2, rememberkit 0.0.2 (vendored, unmodified) |
| Other load on the host | the usual desktop apps; about 200MB of free pages before the model loaded |
| Signer | the entry-two key (same DID), seed kept outside the evidence folder |
