- Add blockCounter to Agent, generating sequential hex IDs
- Include #blockId in all block headers: [[[role:name#id]]]
- GUI parses server-provided IDs from headers
- Falls back to client-generated IDs for legacy blocks without server IDs
- Block IDs are now deterministic based on chat history order
- Extract all [[[block]]] formatting constants/helpers into format/format.go
(EndTag, RoleDelim, ToolDelim, CallDelim, BlockHeader, ParseBlockHeader, IsEndMarker)
- Replace switch/case ctl dispatchers in fs/handlers.go with generic
ctlDispatch() from new fs/ctl.go
- Add LogValidator state machine to AgentLog enforcing:
- Every [[[block]]] MUST have an [[[end]]] marker
- Blocks SHALL NOT be nested
- Streaming line buffering across partial writes
- Fatal failure on first violation with line-number reporting
- UnclosedAtTeardown() for session/agent teardown checks
- Fix kde/kate ollie_ghost compile: stripPrefixEcho signature mismatch