Plugin architecture
The plugin has four parts, and the agent stays as it is. HALO does not run the agent, wrap its model, or read its memory. It receives the steps the agent logs, over MCP or plain HTTP, and reads the loop off them.
The parts
Section titled “The parts”| Part | What it does | Where it lives |
|---|---|---|
| Tools | Nine MCP tools: six to log a step of the loop, and halo_trace, halo_report, and halo_guide to read. Each logging tool checks that the step names only earlier events of the same agent. The same server takes the same events over plain HTTP. |
halo/mcp/server.py |
| Ledger | Keeps every logged event, in order, with its links. Events are never edited or deleted, so a report can always be traced back to what the agent logged. | halo/mcp/ledger.py, a SQLite file on the machine that runs the server |
| Analysis | Reads channels, evidence steps, and the level from the links between events. It calls no model. | halo/mcp/analysis.py |
| Report | Returns the result in the rows of the survey’s tables, with the event ids behind every cell. | halo_report, or halo trace report on the command line |
One step, end to end
Section titled “One step, end to end”- The agent does something in its loop, for example it sends a reminder it decided on by itself.
- It calls
halo_actwith a short summary, triggerself, anduseslisting the observation and the memory the decision relied on. - HALO checks that the ids in
usesexist for this agent, stores the event ase5, and replies with the channels the links realized:Channels: S→A, M→A. - Later, the user replies that the reminder came too early. The agent calls
halo_outcomewithabout: e5. - When anyone asks,
halo_reportreads all of the agent’s events and returns channels, steps, and level.
Design choices
Section titled “Design choices”- Links carry the meaning. HALO does not interpret summaries. A channel, an evidence step, or a level appears only through the ids an event names in
usesandabout. Event model gives the rules. - One trace per agent. Events are kept per agent name, so a dot and Grok Bot can share one server without mixing their traces.
- Sessions mark time. State durability means something kept in one interaction is used in a later one, so every event carries a session label, such as a conversation or a wake-up.
- Nothing is inferred as absent. A missing channel is “not observed”. What a trace can show explains why.
- No model, no keys. The plugin is deterministic and stores no credentials. The host’s own model decides what to log.
Where the plugin stands among HALO’s modes
Section titled “Where the plugin stands among HALO’s modes”Read mode asks whether a system’s sources report each channel and step. Run mode asks whether cutting one changes the output. The plugin asks which channels and steps appear in what a running agent did. Run mode gives the strongest evidence, but it needs code. The plugin works on products whose code is closed, and a level it reports can then be checked against the product’s documentation in read mode.