crewship consolidate
Trigger the Consolidate worker — the background process that compacts recent agent/crew journal activity into semantic rules appended to.memory/topics/learned-*.md. Normally runs on a 6h schedule; this command forces an immediate pass.
Subcommands
Every subcommand honours the global
--format flag (json/yaml/ndjson) — see
Output Formats.
crewship consolidate run
The command takes no positional args — scope is passed via flags. A bare
crewship consolidate run backend-team fails (unknown command).
Sample outputs:
accepted=true on a triggered run confirms the request was genuinely accepted (not just that a 202 came back). Accepted, but skipped (202) with a note means the consolidator is wired but lacks a summarizer client — set OLLAMA_HOST and install a chat model.
crewship consolidate proposed
The human-in-the-loop half. When the consolidator runs with
CREWSHIP_CONSOLIDATE_HITL=1 it does not write extracted rules straight
into a crew’s canonical learned-*.md. It stages them in .proposed/, records
a pending row, and raises an inbox item — and these four verbs are the decision
side of that.
Finding a proposal id
There is no list endpoint — proposals are addressed by id and nothing enumerates them. The id travels on the inbox item the proposal raises:payload.proposal_id, and looks like
mp_20260826T101500-abcdef0123456789.
Reviewing one
explain reports the crew, the rule count, how many journal entries were
scanned, the evidence the rules rest on and the scores the consolidator
assigned. Under --format json the evidence and scores blobs stay JSON
rather than being flattened to strings.
diff prints the unified diff between the crew’s canonical file and what it
would become. The server builds this preview through the same code path
approve writes through, so it is byte-for-byte what lands.
Approving and rejecting
Approving merges the staged rules into the canonical file and records a new
memory version, so it prompts first. With
--diff the preview is fetched
before the prompt — a preview shown after the decision would not be one.
Under --format json/yaml/ndjson the preview is not printed alongside the
result — it travels inside it, on a preview key, so stdout stays a single
parseable document.
--reason is sent and echoed back, but the server does not persist it:
memory_proposals has no reason column yet. The command says so rather than
implying an audit trail that is not there. Put anything you need to keep in the
crew’s journal instead.Requirements and errors
Requirements
- Auth:
OWNERorADMINrole (403 otherwise). - Ollama: The consolidator needs a summarizer LLM. In local dev, start Ollama with the external-SSD model path:
Errors
Journal entries emitted
Even when skipped, the run emits bothsystem.consolidation_triggered and system.consolidation_completed so the audit trail captures the no-op. See the Consolidate guide for payload shapes.
Related
- Consolidate guide.
- Consolidate API.
- Episodic memory — indexer runs on the same schedule.