You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The per-task journal is markdown with a structured key-value schema — machine-parseable by tools that know the format. But the pre-existing ecosystem for agent traces (CodeTracer, AgentStepper, dashboards, eval scripts) expects JSON or JSONL.
Dual-writing a parallel .mothership/events/<slug>.jsonl alongside the markdown journal was proposed and rejected: two serializations of the same data diverge; dual-write discipline is expensive; the markdown is canonical by design.
Proposal
Add a read-time transformer. Markdown stays authoritative; JSON/JSONL is a view.
mship journal --task <slug> --json # all entries as a JSON array
mship journal --task <slug> --format jsonl # one entry per line
mship journal --task <slug> --action hypothesis --json
mship journal --task <slug> --since last-phase-change --json
mship journal --task <slug> --since <iso-timestamp> --json
Each entry emits a stable JSON object with known fields from the existing LogEntry schema:
Problem
The per-task journal is markdown with a structured key-value schema — machine-parseable by tools that know the format. But the pre-existing ecosystem for agent traces (CodeTracer, AgentStepper, dashboards, eval scripts) expects JSON or JSONL.
Dual-writing a parallel
.mothership/events/<slug>.jsonlalongside the markdown journal was proposed and rejected: two serializations of the same data diverge; dual-write discipline is expensive; the markdown is canonical by design.Proposal
Add a read-time transformer. Markdown stays authoritative; JSON/JSONL is a view.
Each entry emits a stable JSON object with known fields from the existing
LogEntryschema:{ "timestamp": "2026-04-24T14:03:12Z", "action": "hypothesis", "message": "Token refresh race between middleware and frontend retry logic", "id": "a3f4c2e1", "evidence": "api/tests/auth_test.py:44-71", "repo": null, "iteration": null, "test_state": null, "parent": null, "category": null, "open_question": null }Filters (
--action,--since,--repo) narrow the emission without changing the field shape. Unknown fields in the markdown source round-trip faithfully.Why a read-time transformer, not dual-write
mship journal --format jsonlonce per ingestion pass.Minimum filters for v1
--action <value>— only entries with that action.--since <iso-timestamp>— entries newer than a given time.--since last-phase-change— entries since the most recent phase-change entry.--repo <name>— entries tagged with that repo.Additional filters (by id, by parent chain, etc.) are followups if demand surfaces.
Out of scope
Related
mship context).