Files

174 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.