autopoiesis

A self-evolving LLM paper-trading agent, graded against its own broker evidence. Paper only: the Guardian's limits cannot be weakened by any configuration, and every number on this site names the command that produced it.

One execution path, and the journal underneath it. Nothing in the system has a second place a fact lives, which is the only reason every number can be recomputed from the record.

cli -> daemon -> loop -> guardian -> executor -> journal
  ^          ^                                            |
  |          +-- curriculum, reflection, maintenance -> lessons
  +-- evidence ingest (broker fills) -> evaluator -> attribution

What owns what

componentowns
guardianthe hard limits. Every order is checked here, independently of whoever proposed it, and a non-finite limit is refused rather than treated as no limit
executorthe broker call, and nothing else. It cannot decide
journalevery cycle and every event, append-only, the only source of truth
evaluatorPnL attribution: which of signal, model, strategy, allocation, execution or cost produced the result
researchcandidate generation and offline screens. Quarantined: production code cannot import it, checked by a gate
doctor52 check classes over the code and the running system

How the record survives itself

The journal rotates at a size cap. A generation reaching the horizon is moved into journal-archive/ and read back first, so the record is the whole record and not a rolling window. If a rotation cannot archive, the append fails rather than deleting history to keep going.

There is no copy anywhere else. The archive keeps the record from being deleted on one host; nothing ships it off that host, and no test claims otherwise.

What the loop changes