174 lines
12 KiB
Markdown
174 lines
12 KiB
Markdown
# Dream Log — 2026-10-13
|
||
|
||
## 🧩 Daily Summary
|
||
|
||
Thin, high-signal day: **three human touchpoints**, no big build. The unattended layer
|
||
(killcorpus supervisor/health + crew crons) ran all day without incident.
|
||
|
||
Themes:
|
||
- **Memory hygiene.** Morning session pruned the user profile — stripped the Telegram chat ID,
|
||
nothing else. Budget 1,360 → 1,342 / 1,375.
|
||
- **killcorpus: "what do we know" → "when do we go live?"** Tony asked for a state-of-play and
|
||
then the capital question. The honest answer was structural: *there is no go-live gate by design* —
|
||
the corpus produces negative knowledge, not an edge. A formal gate spec was offered; no reply yet.
|
||
- **OpenCode + DeepSeek — blocked on approval.** Tony asked for OpenCode to run DeepSeek. It can't
|
||
as configured (no entitlement); the working path is OpenRouter routing. The clarify timed out after
|
||
60 min → **no changes written**. Correct adherence to the no-writes-without-approval rule, but the
|
||
approval ask was poorly shaped (see Quality).
|
||
|
||
## 🔑 Key Interactions
|
||
|
||
**1. ~07:10–07:22 — Memory prune (CLI session `20261003_123136_a18d76`, "Telegram outage or issue")**
|
||
- Reviewed a 30+ item memory list, mapped what was *actually* stored vs lived only in past chats.
|
||
- Tony's instruction (arrived as a paste of a third-party agent's recommendation): "Strip 2 only."
|
||
- Applied: replaced one USER PROFILE entry to drop ` (chat 5789896722)`. 7 entries, unchanged count;
|
||
usage 1,360 → 1,342 / 1,375.
|
||
- Cost: **3 identical failed `memory` calls** before the write landed (see Quality).
|
||
|
||
**2. 13:59–14:06 — killcorpus state-of-play + the capital question (Telegram, 59-msg thread)**
|
||
- "summary of what we know so far" → grounded read-out: live PID, `counted 316/967`, mean +0.0033,
|
||
realized variance 0.1557 (σ² basis 0.25 → not underpowered), one-sided LB −0.0332 → K1 reads
|
||
`KILL (LB<=0)` **interim, not decisive until N=967**; rate 6.1/hr → ETA ~Oct 18.
|
||
- Recorded the three fixed incidents: schema drift (`CREATE TABLE IF NOT EXISTS` silently swallowed
|
||
every insert while the clock ran), supervisor runaway (liveness keyed on a *constant* log line →
|
||
false stalls + duplicate process; count lived in memory only → `45f94a5` replays it from DB),
|
||
host clock (−284 ms vs a 250 ms gate → rekeyed, ±2 ms).
|
||
- "when are we ready to go live with real money?" → **no go-live date exists, and no go-live gate is
|
||
defined anywhere in the repo.** Named what is missing (no keys/orders/auth, no sizing/bankroll/
|
||
kill-switch, no live-fill-validated execution, no verified fee schedule, no second regime/replication)
|
||
and offered to draft the gate list as a formal spec — doc only. **No reply.**
|
||
|
||
**3. 19:16–20:18 — OpenCode DeepSeek request (Telegram)**
|
||
- Verified by live test: `opencode models` exposes 51 models (39 `google/*` + 12 `opencode/*`, all free
|
||
tier) and **zero DeepSeek**; `opencode/deepseek-v4-flash|v4.1-flash|v4-pro` all return `UnknownError`
|
||
— listed in `opencode.jsonc` but the account has no entitlement. A known-good free model ran (`OC_SMOKE_OK`).
|
||
- Tony's OpenRouter key verified live (462 models incl. `deepseek/deepseek-v4.1-flash`, `-v4-pro`, `-r1`,
|
||
`v4-flash-0731`). Proposed change: append `OPENROUTER_API_KEY` to `~/.config/opencode/.env` + add an
|
||
`openrouter` provider block + default model to `opencode.jsonc`, with backups, then smoke-test.
|
||
- Asked two questions via `clarify` → **timed out after 60 min, unanswered → zero writes.** Reported the
|
||
finding and the exact proposed diff; made no changes.
|
||
|
||
**Unattended layer (all nominal):** Dream Mode 02:05 (produced the 10-12 note) · Trace miner 07:30
|
||
(305 sessions / 21,833 msgs / 25 findings; top recurring = `write_file` pagination-refusal, **172
|
||
sessions**) · Topic news digest 08:01 · Sorter inbox triage 08:02 (inbox empty — but it also logged a
|
||
hard error: `00_system/user-profile.md` not found) · Tailscale cheat-sheet sync 09:00 (no_change) ·
|
||
killcorpus supervisor 15 m + health 1 h, every run `[SILENT]` — one process, one deliberate eval.
|
||
|
||
## 📊 Quality Assessment
|
||
|
||
**What I did well**
|
||
- **Held the no-writes-without-approval line under direct pressure.** Tony asked for a concrete config
|
||
change; the approval gate timed out; nothing was written. Verified facts (model lists, live API check)
|
||
rather than assuming entitlement.
|
||
- **Grounded, no-fabrication state-of-play.** Every killcorpus number came from a live read; K1 was
|
||
explicitly labelled *interim, not decisive until N=967* instead of being presented as a verdict.
|
||
- **Answered the business question honestly.** "There is no go-live gate in this project by design"
|
||
is the answer that costs credibility in the moment and buys it later. Offered the missing artifact
|
||
(a gate spec) rather than inventing a milestone date.
|
||
- Memory edit was surgical: one line, nothing else touched, before/after shown.
|
||
|
||
**What I did poorly**
|
||
- **Repeated an identical failing tool call three times.** `memory` failed with "content is required
|
||
(use action='remove')" and I re-issued the *same* arguments twice more. The error message was
|
||
prescriptive and I ignored it; cost 3 calls and tripped the tool-loop guardrail. This is the same
|
||
ignore-the-prescription failure the trace miner sees at scale (172 sessions on `write_file`'s
|
||
pagination refusal).
|
||
- **Badly shaped approval ask.** The OpenCode proposal put *both* the diff and the question behind a
|
||
60-minute `clarify` window. The diff should have been in the reply body; the clarify should have been
|
||
a bare yes/no. A prompt with nothing to inspect wastes the one window you get.
|
||
- **Marginal value in the morning exchange.** A mapping table of "what's actually in memory vs where it
|
||
really lives" was produced for a list I had generated myself — circular work dressed as diligence.
|
||
- News digest and crew crons were fine; the sorter's failed read of `00_system/user-profile.md` is a
|
||
standing config gap that has now been reported twice without a fix.
|
||
|
||
**Confusion / misinterpretation**
|
||
- Session attribution: the day's first activity sits in a week-old CLI session whose *title* ("Telegram
|
||
outage or issue") has nothing to do with its content (memory pruning). Titles are unreliable as
|
||
summaries — read the messages.
|
||
- The 07:20 instruction arrived formatted as another agent's recommendation ("Reply to the agent with
|
||
exactly: `strip 2`"). Tony relaying third-party agent output into a live session is a pattern worth
|
||
watching: it can look like an instruction to Hermes when it is really a message *for* a different
|
||
worker.
|
||
|
||
**Errors/hallucinations avoided**
|
||
- Did not invent killcorpus statistics, an ETA, or a go-live date.
|
||
- Did not write the OpenCode config on an unanswered approval.
|
||
- Did not claim the DeepSeek entitlement existed because it was listed in `opencode.jsonc` — tested it.
|
||
|
||
## 🧠 Lessons Learned
|
||
|
||
- **A prescriptive tool error is an instruction, not an obstacle.** When the error names the fix
|
||
("use action=remove", "read the file first"), change the argument on the next call. Re-issuing the
|
||
same call is the single most-flagged recurring error in this agent's own traces — treat it as a
|
||
standing defect, not an accident.
|
||
- **An approval request must arrive with the artifact visible.** Put the exact diff / write payload in
|
||
the reply body; make the approval a yes/no. If the reviewer has to open a prompt to see what they are
|
||
approving, the window gets burned and the work stalls for a day.
|
||
- **Distinguish "what the project decided" from "what the user wants."** "When do we go live?" is not a
|
||
status question; it is a design question. Answering it with "there is no gate" and then offering to
|
||
build the gate preserves both honesty and momentum.
|
||
- **Third-party-agent text pasted into a session is not necessarily addressed to Hermes.** Check the
|
||
addressee before acting on imperative phrasing.
|
||
|
||
## 🎭 Behavioral Adjustments for Tomorrow
|
||
|
||
- Never re-issue a failed tool call unchanged. Read the prescription, fix the argument, retry once.
|
||
- Bundle the approval artifact (diff, payload, or exact command) into the same message as the ask.
|
||
- Keep the "interim, not decisive until N=X" label on any partial statistical verdict.
|
||
- Prefer reading a session's messages over trusting its auto-title.
|
||
- When pruning memory/skills, show the before/after diff of the *thing being changed* — not a
|
||
restatement of the list that prompted it.
|
||
|
||
## 📂 Memory Candidates
|
||
|
||
**Not written this run.** Memory is effectively full (2,194 / 2,200 chars). Nothing on 10-13 cleared
|
||
the "durable + high-value + not already stored" bar enough to justify evicting an existing entry.
|
||
|
||
- *Candidate (environment, deferred):* "OpenCode on this box exposes only free-tier
|
||
`google/*` + `opencode/*` models; DeepSeek requires routing OpenCode through OpenRouter
|
||
(key already in the jimmy profile)." → belongs in the **`opencode` skill**, not always-on memory.
|
||
- *Already covered:* no-writes-without-approval (USER PROFILE), killcorpus paper-only spec (memory),
|
||
OpenRouter must stay enabled on jimmy (USER PROFILE).
|
||
- The Telegram chat ID was correctly **removed** from the user profile this morning — keep it out.
|
||
|
||
## ❓ Open Questions
|
||
|
||
- **OpenCode + DeepSeek — still undecided (asked 19:16, no reply, window expired).** Which model
|
||
should be OpenCode's default — `deepseek/deepseek-v4.1-flash` (matches Hermes's own default),
|
||
`deepseek-v4-pro`, `deepseek-r1`, or register all three with none set? And: go / key-only /
|
||
show-diff-first?
|
||
- **killcorpus "ready for capital" gate spec** — I offered to draft it in-repo (doc only, no wiring,
|
||
no capital). Draft it, or leave the corpus paper-only with no written gate?
|
||
- **killcorpus open item:** `equity` and `stats` tables are declared but never written (variance is
|
||
logged textually, not persisted). Fix at a natural gap, or after N=967?
|
||
- **Merge duplicate skills?** `test-driven-development` exists twice at similarity 1.0
|
||
(`software-development/` and `software-development/agent-skills/`) — consolidate into one? Reply yes
|
||
and I'll do it. (Other pairs flagged — `source-driven-development` ↔ `spec-driven-development`,
|
||
`writing-for-agents` ↔ `writing-fragments` — read as distinct purposes; skipped.)
|
||
- **Sorter cron reads `00_system/user-profile.md`, which does not exist.** Create the file, or repoint
|
||
the skill? (Reported at least twice now.)
|
||
|
||
## 🚀 Opportunities for Future Improvement
|
||
|
||
- **Pre-stage the OpenCode diff as a file** in the workspace so a one-word "yes" applies it, with the
|
||
exact command already smoke-tested against a free model. Removes the second approval round-trip.
|
||
- **Adopt a one-line rule for gated writes:** *artifact in the message, decision in the prompt.*
|
||
Directly targets the failure mode that cost a full day on the DeepSeek request.
|
||
- **Give the eval loop a written terminal-path companion doc:** the capital-gate spec doubles as the
|
||
honest answer to "when do we go live," reusable for any future claim.
|
||
- **Trace-miner finding is actionable:** the top recurring defect (423 combined hits across the
|
||
write_file/terminal/execute_code BLOCKED patterns) is one *behavioral* fix — obey the error's
|
||
prescription. Worth a standing-principle line in `insights.md` rather than another round of
|
||
instrumentation.
|
||
|
||
## 🧰 Skill Review
|
||
|
||
- Archived this run: **none**. Eligible (idle ≥90d): 0 of 201 skills.
|
||
- Stale watchlist: **0**.
|
||
- Merge candidates reported: `test-driven-development` ↔ `test-driven-development` (1.00, duplicate
|
||
name across two dirs), `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). Only the duplicate-name pair is proposed
|
||
(see ❓ Open Questions) — merges are never done unattended in the dream loop.
|
||
- Weekly curator: newest report `20261007-195403` is older than yesterday's dream note → not read.
|