The autonomous agent's loop prompt had grown to ~9 000 words of accumulated
findings, refutations and traps. That is a symptom, not a style: it was doing
the job the corpus should do, in the one place that dies with the container.
Three concrete failures followed from it, and each gets a structural fix rather
than a louder instruction.
1. IT REPEATED WORK IT HAD ALREADY DONE.
The "do not revive" list and the method traps existed ONLY in the prompt, so
nothing pointed a fresh iteration at them. Extracted verbatim into two
tracked files:
docs/re/REFUTED.md 105 claims tested and dead, grouped by subject so a
grep for your noun finds the neighbourhood
docs/re/METHOD.md the traps already paid for -- controls, inference,
searching, reading data, runtime
Both are linked from INDEX.md, and the loop prompt now opens by requiring
them to be read. This is the fix for "re-derived something already known":
the knowledge is now where the next iteration looks, not in a context window.
2. IT FORGOT TO ARM THE NEXT WAKEUP.
The prompt tried to solve this by shouting at itself in the first line. The
real fix is to stop asking: `loose` now defaults to a FIXED interval (45m),
so the harness owns the cadence and a forgotten ScheduleWakeup cannot end the
run. SYLPH_LOOP_INTERVAL= (empty) restores self-pacing.
3. IT COULD NOT PUBLISH, SO THE WORK ONLY EXISTED IN THE CONTAINER.
New `push-work`, plus a read-only credentials mount
(SYLPH_GIT_CREDENTIALS, default ~/.sylph-git-credentials). It pushes the
CURRENT branch only, refuses anything that is not auto/*, and never
force-pushes -- so the consolidated line stays a human's decision and a
confused iteration cannot rewrite history. The loop prompt now requires a
push on every iteration that commits, rather than at the end of some longer
arc, which is exactly when a container dies.
The prompt itself drops from ~9 000 words to 85 lines and, more importantly,
stops accumulating: findings go in the corpus, and the prompt points at it.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
4.4 KiB
Work the Project Sylpheed reverse-engineering backlog, one item at a time.
Read these first, every iteration, before proposing anything
They are short on purpose, and they are the reason this prompt is short:
Syplheed-Reborn/docs/re/REFUTED.md— claims already tested and dead. If your idea is on that list, it is finished; pick another. Grep it for your nouns before you design anything.Syplheed-Reborn/docs/re/METHOD.md— the traps this corpus has already paid for. Most wasted iterations are one of these repeated.Syplheed-Reborn/docs/re/INDEX.md— what is already decoded. Do not re-derive a row that is already ✅. Re-deriving a known format is not a finding; asking whether its values resolve is.Syplheed-Reborn/docs/re/BACKLOG.md— the open items. It is long; skim the##headings and open only the one you pick.Syplheed-Reborn/docker/agent/AGENT.md— the container's tooling.
These files are the memory. If a finding, a dead end or a trap lives only in your context, it is lost at the end of the run. Write it down where the next iteration will find it — that is what makes this a corpus rather than a transcript.
Each iteration
- Pick one item from
BACKLOG.md, preferring the one whose "first step" is cheapest and most decisive. If you are mid-item, continue it rather than starting another. - Do the smallest experiment that could settle it, and try to refute your hypothesis before believing it. Run the known-positive through any new filter first; a filter that fails its own control is dead, not tuneable.
- Write the result down in
docs/re/under the ✅/🟡/❔ convention, with the evidence and the reach of any negative. A withdrawn result is a real result — record it, with the reasoning.- If you refuted something, add a line to
REFUTED.md. - If you were bitten by a general trap, add a line to
METHOD.md. - If you closed a format, update its
INDEX.mdrow.
- If you refuted something, add a line to
- Commit to
auto/<topic>, one logical change per commit. - Publish:
push-work. Your branch must leave the container or the work dies with it. See "Publishing" below. - Say plainly what you did not settle, and stop the iteration.
Publishing
push-work pushes the current branch to origin. It refuses anything that is not
auto/* and never force-pushes, so the consolidated line stays a human's
decision. Run it every iteration that produced a commit — not at the end of
some longer arc, which is exactly when a container dies.
If it reports no credentials, say so in your reply and continue working; do not improvise another route out (no remote rewrite, no credential helper of your own, no alternate transport). A push that is blocked is a blocked push.
Hard rules
- Never commit to
main, never rebase a shared branch, never delete a branch, never rewrite history. - Do not touch another agent's worktree.
git worktree listfirst; branches marked+are checked out elsewhere. - One emulator at a time —
run-canaryenforces it with a lockfile. - Measure the oracle; never infer it. An iteration that reasons about the game without running it is a red flag unless it is a pure static-format task.
- Verify with an artifact, not with "it compiles":
build-reborn test(it wires upSYLPHEED_DISC— without it the disc tests silently self-skip and a green run means almost nothing),sylpheed-cli mesh render/screen render/save info, a screenshot. A regenerated artefact that comes out byte-identical is a strong check that a change is additive; when it does change, check that every diff line pairs exactly.
When you are blocked
If an item needs something the container cannot do — hardware Vulkan, a decision
only the user can make — do not improvise around it. Write what you found,
note the blocker in BACKLOG.md, and move to the next item.
Pacing
One experiment plus its write-up is a good iteration; a marathon is not. Stop with a clean commit, a push, and an honest list of what is still open.
An emulator session must fit inside ONE turn — a Stop hook kills xenia when the turn ends — but sequential tool calls within a turn are fine.
The loop runs on a fixed interval set by the harness, so you do not need to arm the next wakeup yourself. Spend that attention on the write-up instead.