vault-sync: 2026-10-12 06:00 (jimmy)
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
# 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.
|
||||
@@ -13,17 +13,22 @@
|
||||
- **Honest-gap ledger.** Every build report names what's wired, what's offline-only, what remains. Never claim live behavior that hasn't run.
|
||||
- **Name which cost/branch you're invoking before concluding.** E.g. a *taker* fee says nothing about a *maker* edge's viability.
|
||||
- **A known root cause with a cheap fix should not survive the day it was found** — diagnose → propose → ask in the same turn; apply on approval.
|
||||
- **A defect in the instrument is not a death of the claim** (strengthened 2026-10-11). 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. The schema must carry a `never-tested`/`withdrawn` status so a documentation defect can't be written up as evidence of death.
|
||||
- **Durable-run integrity triad** (2026-10-11). Any multi-day/unattended run must: (a) keep its progress counter in the durable store and **replay it on startup** (in-memory `counted` reset → the run can never reach its N, silently); (b) key liveness/stall detection on a **quantity that changes when healthy** (log *file-size growth*, never "last log line unchanged" — constant verdict lines make that a false stall); (c) make the recovery action **idempotent and non-leaking** ("confirm zero live before starting one" — a restart-on-stall cron that never reaps the prior process compounds the fault it exists to repair).
|
||||
- **A cron's own recovery action is a code path that needs testing.** Treat every self-healing action as a first-class artifact: unit-check the idempotency guard and the resource-lifecycle on the restart path, not just the happy path.
|
||||
- **Read a gate at its registered N.** When a statistical gate (e.g. a one-sided LB>0) prints a verdict before its sample is met, label it *interim, not decisive until N=X* — lead with that. A mean and its lower bound move at different speeds (2026-10-11: mean +0.019 while LB −0.099); an early negative LB is noise, not evidence.
|
||||
|
||||
## 🛠️ Technical Notes
|
||||
|
||||
- **Kalshi fees (verified 2026-10-10):** taker = `round_up(0.07·C·P·(1−P))`, charged only when you take. **Maker fee = 0 on ~12,500 of 12,699 series** (only ~129 series tax resting orders, quarter rate; cancelling free; 14 niche series fee-free). Polymarket **US** is a separate, thinner, full-KYC venue with contested CA status; Kalshi CA is clean (CFTC DCM).
|
||||
- **Headless (`-q`/`--oneshot`) approval gate:** profiles with `approvals.mode` unset default to `manual` → no user → dangerous-pattern commands (`python -c`, `execute_code`, `rm -r`, `kill -9`, heredocs) time out to `BLOCKED`. The `execute_code` fallback is gated too → retry loop that burns context. Fix: `approvals.mode: smart` (+ `command_allowlist` for scoped safe patterns) + tool-loop guardrails (`hard_stop_after: 5`). Cron-safe only after allowlist/config applied.
|
||||
- **Cron/unattended tool limits:** `python -c`, `execute_code`, and heredoc script execution are blocked in unattended (-q) runs unless allowlisted; `write_file` refuses overwrite without a prior read (pagination paradox); `terminal` foreground cap 600s (else promoted to tracked background).
|
||||
- **killcorpus** (`C:\Users\fight\Projects\killcorpus`): paper-only. Spec `KXBTCD-lag-vs-spot` v1.1.1 (taker primary; maker secondary pending fill model). Harness `harness/paper_trader_instrumented.py` — instrumented (book_read_ts, ntp_offset_ms, spot_age_ms, realized_slippage), variance gate σ²=0.25, latency gates 1000/500/250 ms, fixed N=967 post-registration. Offline selftest green; live feed→fill→settlement path **not yet wired**. Gitea `Tony_tech/killcorpus` push **held**. Reference (read-only, do not edit): `polyterm/paper_trader.py`.
|
||||
- **killcorpus** (`C:\Users\fight\Projects\killcorpus`): paper-only. Spec `KXBTCD-lag-vs-spot` v1.1.1 (taker primary; maker secondary pending fill model). Harness `harness/paper_trader_instrumented.py` — instrumented (book_read_ts, ntp_offset_ms, spot_age_ms, realized_slippage), variance gate σ²=0.25, latency gates 1000/500/250 ms, fixed N=967 post-registration. Offline selftest green; live feed→fill→settlement path **wired and proven** (settle-through proof 2026-10-11: 40 signals / 5 trades / 5 settled, clock off). Gitea `Tony_tech/killcorpus` push superseded by Contents-API content-mirror. Reference (read-only, do not edit): `polyterm/paper_trader.py`. **Live eval launched 2026-10-11T16:24:28Z** (REG_TS). Supervision: cron `1da28c73cd5f` (15 m, supervisor) + `c7ea39ffb05a` (1 h, health check). Policy: **hold until N=967**; interim K1 non-actionable; only pre-registered early stops (sustained `measurement_artifact`, variance breach → UNDERPOWERED) may halt. Fixes shipped: `b833e3c` (smoke-arg parser), `45f94a5` (DB replay of `counted` on startup). Gitea `Tony_tech/killcorpus` **content-mirrored via Contents API, no `origin`** (git-level link deliberately held). Schema drift seen once: DB `signals` table lacked `book_read_ts_ms` the writer needs — deployed DB and writer must be reconciled at launch.
|
||||
- **Agent-loop roles:** planner=Proposer, reviewer=Critic, builder=Executor, jimmy=Recorder.
|
||||
|
||||
## 🧵 Open Threads
|
||||
|
||||
- Trace-fix (builder/reviewer `approvals.mode: smart` + guardrails + timeout 300) written, unapplied — awaiting Tony's approval. See [[../04_projects/trace-review-bot/2026-10-10-trace-analysis-and-fix]].
|
||||
- killcorpus deliberate eval **on hold**: `w32tm` unsynchronized, skew −284 ms vs 250 ms gate. Prereqs: clock fix (UAC, at PC), one live settlement observed, durable runner.
|
||||
- Dream Mode live as of 2026-10-10 (skill + `skill_review.py` + 2 AM cron + `dream/`). First note = this run.
|
||||
- killcorpus prereqs **cleared 2026-10-11**: clock fixed (±2 ms, was −284 ms); settlement observed (5 settled); durable runner proven; spec v1.1.1 approved. Eval **live** since 16:24:28Z, accruing toward N=967. Next gate = a valid run at N=967 → first autopsy (kept/killed/parked/inconclusive). Nothing else halts it except the pre-registered early stops.
|
||||
- killcorpus **open items**: git-level link (`origin`) held — decide at first autopsy; handoff docs (`docs/handoff-2026-10-11*.md`, `killcorpus-full-2026-10-11.md`) untracked — commit/push/delete undecided.
|
||||
- Dream Mode live as of 2026-10-10 (skill + `skill_review.py` + 2 AM cron + `dream/`). Note for 10-11 = second run.
|
||||
|
||||
Reference in New Issue
Block a user