- cmd/projax/main.go: PROJAX_BACKEND=mbrian now sets BOTH srv.Items
(reader) AND srv.Writes (writer=MBrianWriter HTTP client, reading
PROJAX_MBRIAN_API_URL/PROJAX_MBRIAN_API_TOKEN). =store sets both to the
legacy *Store. The flip is atomic — the slice-B half-flip (reader only)
was the production bug. Warns (not exits) if mbrian is selected without
the API env vars: reads work direct-DB, writes fail closed legibly.
- mcp/tools.go: RegisterProjaxTools split from a single *Store into
(reader, writer, legacy *Store, agg). Read tools take the reader, write
tools take reader+writer, both flipping with the backend. Leaving MCP
reads on projax.items while writes targeted mBrian would recreate the
slice-B bug on the MCP surface (read an id from one backend, write it to
the other). The timeline tool keeps the legacy *Store + aggregator
(out of slice-C scope, consistent with the web dashboard). main.go
passes srv.Items/srv.Writes so MCP follows the same flip as the web UI.
NOTE: this widens slice C beyond the handover's 'MCP reads deferred' —
necessary because migrating MCP writes alone is incoherent with
atomicity. Flagged to head.
- store/mbrian_writer_test.go: httptest-backed unit tests for request
construction + error mapping (401/403/404→ErrNotFound/503/500/400),
fail-closed on empty token/URL (no empty Bearer sent), AddLink self-edge
+ metadata shaping, AddLinkDated date+note, per-ref_type edge metadata,
projax bundle defaults + public nesting, uuid v4 format. Pool-backed
read-backs (Create/Update round-trip) are covered by head's live cutover
test + the reader parity tests.
Build + vet green. store/mcp/itemwrite tests pass in isolation.