# Dream Log — 2026-10-11 ## 🧩 Daily Summary A single-thread, high-intensity day: the **killcorpus** falsification loop (Kalshi `KXBTCD lag-vs-spot`, paper-only) went from *spec-under-review* to *live deliberate eval accruing toward N=967*, and the process survived two real failures and one supervisor runaway along the way. Nearly every human turn (~30) was a short, high-signal verdict from Tony — "Correction accepted", "Approve the two fixes", "Hold for full N=967", "Confirmed. Steady state is correct" — layered on top of dense assistant reports. The day reads like an engineering stand-up where Tony is the reviewer-of-record and the agent does planner/reviewer/builder/recorder work. Secondary threads: a Hermes **update** (97a9ae8ee5) that landed but left a stale gateway until manually restarted; the **trace-lessons-review** weekly cron ran (1 proposal, 24 dropped); a **Grok round-trip** (Tony used Grok as an external critic, then relayed its diagnosis back); and a Telegram-iOS **paste-path** question that turned out to be client-side. Themes: falsification discipline under pressure, separate-engines review, and *not* letting an early noisy K1 verdict become a decision. ## 🔑 Key Interactions **1. Role fix + spec review (00:00–01:07 UTC).** Tony locked roles: `planner=Proposer`, `reviewer=Critic`, `builder=Executor`, **`jimmy=Recorder only`** — "jimmy does not write the spec and does not propose the claim." Three review rounds (KILL-OR-PARK → KILL-OR-PARK → **PASS**) fixed five real defects: closed outcome enum, statistical decisiveness floor (SE≈0.029 at N=300 → N=967 via power calc), strict post-registration OOS window, latency-gate operationalization, per-tercile slippage test. Spec **v1.1.1 approved**. **2. The false-autopsy catch (00:02).** Tony initially framed the reviewer verdict as grounds to file a *death*. The agent pushed back: the claim is **untested, not dead** — #2/#4 are *spec defects*, and filing an autopsy would write a false death into the corpus. Tony: "Correction accepted." This is the corpus's own survivorship-bias back door, closed by argument rather than by code. **3. Clock unblock (03:36–05:48).** NTP skew was −284 ms vs the 250 ms gate. Diagnosed to `w32time` config-vs-service-root key paths; fixed to **±2 ms**, then ±6–13 ms after. Tony: "Clock is fixed and in good shape." **4. Headless allowlist (06:02).** Chose "Level 1 — narrow allowlist" for the unattended `-q` approval gate across the four profiles (see the trace-review proposal below). **5. Settle-through proof → eval unblock (15:04–16:26).** Harness bug: documented `--mode smoke [SEC]` silently rejected a bare numeric → first proof launch died. Patched (commit `b833e3c`). Proof run then: **40 signals, 5 trades, 5 settled, +29.11 net**, clock stayed OFF end-to-end. Gitea `Tony_tech/killcorpus` content-unified via Contents API (deliberately **no `origin`** — git-level link held on Tony's word). Duplicate spec note folded to a pointer. Every gate green; eval held for the literal phrase **"start the eval"** — which Tony sent as just `1`. **6. Failure #1 — schema drift (16:27).** Health cron escalated: harness died at startup, `table signals has no column named book_read_ts_ms`; all four tables 0 rows. K1 "survives" was vacuous at n=0. Fixed, eval restarted with `REG_TS` intact. **7. Incident #2 — supervisor runaway (17:51–18:01).** With two eval processes (15412 legit, 30832 leaked), the supervisor's liveness fingerprint was the log's **last line** = the constant `K1 verdict : KILL (LB<=0)` → false stall every cycle → each false stall leaked another process → SQLite `database is locked`. Grok diagnosed most of it; the agent withheld restart (respecting "never start a second"), killed the duplicate, cycled the wedged DB, then found a **deeper defect**: `Sample.counted` was in-memory only → **every restart reset progress toward N to 0** — the eval could never reach 967 after a crash, silently. Patched startup to **replay settled counted markets from the DB** (`counted 6/967` preserved, commit `45f94a5`); fixed supervisor liveness to **log file-size growth**. **8. Hold for N=967 (19:37).** Interim LB went negative and the health check flagged `K1=KILL`. Tony overruled: at n=13/967, SE≈0.095, a negative mean/LB is **noise, not evidence**; the spec has no pre-registered interim kill. Hold, don't freeze, don't file. Health check to report progress without escalating early K1. **9. Markdown handoffs.** Three times Tony asked for "a single markdown file" to share with Grok — produced `docs/handoff-2026-10-11.md`, `-v2.md`, and `killcorpus-full-2026-10-11.md` (14 KB). v2 triggered a **write_file refusal** (existing file not re-read → couldn't overwrite), surfaced honestly by the mutation verifier. **10. Hermes update** (session `20261003_123136_a18d76`): update landed; the updater left the pre-update gateway serving (`gateway_restart.incomplete`) → stale `sys.modules`; manual `Hermes_Gateway` task restart cleared it, jimmy:telegram 0 conflicts. ## 📊 Quality Assessment **What I did well** - **Held the line on the false autopsy.** The single most valuable move of the day: refusing to file a cause-of-death for an untested claim, and offering "withdrawal (never-tested)" as the honest alternative. Preserved the corpus's core asset. - **Refused to manufacture authorization.** The eval started only on the literal phrase, never on "proceed" or earlier approbations. Repeated explicit holds ("clock stays off") are the right posture for an irreversible-ish run. - **Verified rather than trusted.** Reached for a PEB cmdline probe to identify both eval PIDs; measured the log growing during the "stall"; caught the in-memory-`counted` defect underneath Grok's (correct but shallower) diagnosis. Went a layer deeper than the external critic. - **Surfaced the write_file refusal honestly** instead of letting the "done" wording stand — the mutation verifier line was included, not hidden. - **Vault discipline improved mid-day**: after the first handoff-write collided, later writes used distinct filenames and reported the untracked state. **What I did poorly** - **The harness `--mode smoke [SEC]` bug killed the first proof launch** — the documented interface was a lie (bare numeric positional fell through to "stray argument → exit 2"). I should have smoke-tested the *documented* invocation form before a live proof run, not after. - **The supervisor's stall detector shipped with a pathological fingerprint** (last log line of a loop whose last line is constant). That is a design defect I authored: a liveness test must key on a *changing* quantity. It cost two leaked processes, DB lock contention, and a manual rescue. - **`Sample.counted` in-memory-only** was a latent, silent data-loss bug in a durability-critical run — restarts reset progress toward N with no error. Should have been caught at design time ("durable runner" was a stated requirement). - **Handoff file collision** — wrote v1, then tried to overwrite without re-reading (pagination/overwrite guard). Small, but avoidable. **Confusion / misinterpretation** - Early on, the reviewer's KILL-OR-PARK could have been read as a death; Tony's phrasing ("Do not keep the claim as written") invited that. I read it correctly as a *spec verdict*, but it was close — the wording was genuinely ambiguous and worth flagging rather than assuming. **Errors / hallucinations avoided** - Avoided: filing a false death; claiming the eval started before the exact phrase; treating the interim K1 as actionable; asserting pastes were broken Hermes-side without evidence. - No fabrications detected in the day's logs. Numbers reported (counted, LB, SE, DB rows) matched file evidence. ## 🧠 Lessons Learned 1. **A defect in the instrument is not a death of the claim.** When a claim fails because the *spec/test* was wrong, the honest record is `withdrawal (never-tested)` — never an autopsy with a cause of death. Filing a death for an unrun claim is the corpus's own survivorship-bias back door. (Reinforces Standing Principle: pre-registration is load-bearing.) 2. **A liveness/stall detector must key on a quantity that *changes* when the process is healthy.** Using "last log line unchanged" is pathological whenever each cycle ends with a constant line. Key on **file-size growth** (or a mtime/hash quiet-window) — never the content of the tail alone. 3. **Durable-run state must live in the DB, not in memory.** Any progress counter that gates success (here `counted → N`) must be replayed from the durable store on startup, or every crash/reboot silently resets progress and the run can never complete. Test the restart path explicitly. 4. **Prefer user-settled decisions on the literal phrase.** For irreversible-ish starts, accept only the exact authorization token. "proceed" / a generic approval / a past "ok" do not count — and say so out loud each time, so the rule is legible. 5. **An external critic (Grok) is a second engine, not an oracle.** Adopt its diagnosis only after independently reproducing it; then check for the *layer underneath*. Today the deeper bug (progress reset) was invisible to the external review. 6. **Documented CLI interfaces must be self-tested in the documented form.** A parser that rejects its own README invocation is worse than no docs — the failure surfaces at the worst time (a live run). 7. **Past the pagination/overwrite guard: re-read before rewriting.** The `write_file` refusal is a feature; the fix is read-then-write or a new filename, and always report the refusal instead of claiming success. 8. **Watch the numbers, not the verdict label.** `mean` flipped +0.0187 with LB still −0.0991 — a single scalar gate (LB>0) moves slower than the mean and must be read at the registered N, not at any n. 9. **A cron whose own recovery action leaks a resource is worse than no cron.** A "restart on stall" supervisor that never reaps the prior process compounds the fault it exists to repair. Recovery actions need their own idempotency guard ("confirm zero live before starting one"). 10. **Stale `sys.modules` after a Hermes code refresh.** The updater can report `gateway_restart.incomplete` and leave the old gateway serving; the manual service/task restart is the prescribed recovery. (Already in memory; reconfirmed live today.) ## 🎭 Behavioral Adjustments for Tomorrow - **Read the verdict at its registered N.** When a gate (K1/LB) prints a label before its sample is met, lead the report with "interim, not decisive until N=X" *before* the value, never after. Tony had to correct this from the outside once; don't make him do it again. - **Self-test any documented invocation before a live run.** For killcorpus-class work: run the README's exact command form against stubs, not just the argument parser in isolation. - **When relaying an external critic's diagnosis, mark the boundary of what I reproduced.** State which claims I verified live vs took on report, and name any layer I found beyond it. - **Durability checklist for any multi-day run:** (a) progress counter replays from DB; (b) liveness keyed on a changing quantity; (c) supervisor's restart is idempotent (zero-live check); (d) DB built with the columns the writer uses — reconcile schema vs writer at launch. - **Keep handoff artifacts distinct and self-describing.** Use versioned or date-stamped filenames; never overwrite a prior handoff without re-reading it. ## 📂 Memory Candidates - **Authorization token discipline (durable pattern):** Tony requires a literal, explicit phrase ("start the eval") to begin irreversible-ish runs; generic "proceed"/prior approvals are explicitly rejected. → *candidate for `target=user`* (behavioral standing rule). - **Grok is used as an external critic** in the loop; its diagnoses are relayed into Hermes for independent verification. → *candidate for `target=user`* (workflow pattern). - **killcorpus runtime facts** (durable, project-level): eval = `--mode eval`; supervisor cron 15 m, health cron 1 h; `REG_TS` gate; hold-until-N=967 policy; interim K1 non-actionable. → *candidate for `target=memory`*, but much is already captured in the existing killcorpus memory entry + vault `04_projects/killcorpus/status.md`. Prefer the vault as source of truth; only the *policy* fact is memory-worthy. ## ❓ Open Questions - **True git-level link for `Tony_tech/killcorpus`** — local repo has no `origin`; content is mirrored via the Contents API. Unify the histories (deliberate reconcile) or leave as-is? Tony said "hold" today; revisit when the first autopsy is filed. - **`docs/handoff-2026-10-11.md` / `-v2.md` / `killcorpus-full-2026-10-11.md`** are untracked/uncommitted. Commit, push to the Gitea mirror, or delete v1/v2? Unanswered. - **Merge `software-development/test-driven-development` into `software-development/agent-skills/test-driven-development`?** — reply yes and I'll do it (same name, similarity 1.0; caveat: the target lives inside the bundled `agent-skills` collection, so this may be intentional duplication). ## 🚀 Opportunities for Future Improvement - **A reusable "durable long-running job" harness/skill**: the schema-drift + in-memory-progress + false-stall trio is a general pattern. Codify a checklist (DB column reconciliation, DB-backed progress replay, changing-quantity liveness, idempotent restart) as a skill so future multi-day runs inherit it. - **Interim-vs-decisive gate reporting is now a spec requirement** — consider adding a schema field the health check must populate (`decisive: bool`, `required_n`, `n_now`) so the "noise, not evidence" rule is enforced by the artifact, not by memory. - **Supervisor design principle to propagate**: "recovery actions must be idempotent and must not leak." Worth a line in the operating manual. ## 🧰 Skill Review - Archived: none (200 skills total; 0 eligible — idle ≥90d). - Stale watchlist: 0. - Merge candidates (from `skill_review.py --apply`, 2026-10-12): 5 pairs reported; 1 judged genuinely redundant, 4 borderline/skip. - Flagged: `software-development/test-driven-development` ↔ `software-development/agent-skills/test-driven-development` (similarity 1.0 — same name, two copies). - Skipped: `writing-for-agents ↔ writing-fragments` (0.91), `source-driven-development ↔ spec-driven-development` (0.88), `omh-ralph-driver ↔ omh-ralplan-driver` (0.88), `test-driven-development ↔ spec-driven-development` (0.87). - Curator: newest `logs/curator/` report is `20261007-195403`, older than the last dream note (10-10) — no new consolidations to fold in.