102 lines
14 KiB
Markdown
102 lines
14 KiB
Markdown
# 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.
|