Gitmoot v0.8.8
Pipeline stages can now be agents, not just shell commands — a stage can reason (ask/review), write code and open a PR (implement), wait for that PR to merge (a gate), or fan out a bounded sub-tree of agents (orchestrate). The persistent-memory system grows a curation loop alongside it: markdown ingest with a human confirm gate, deterministic distill-at-terminal, grooming proposals, and emergent knowledge clusters. Everything additive and off by default — existing pipelines, agents, and memory behave identically unless you opt in.
What's new since v0.8.7
Pipeline agent stages — put a model inside the assembly line (#757, #770, #768, #758)
A pipeline stage can now run a named managed agent in place of a shell cmd. Four kinds share the same mechanics (own-runtime dispatch, upstream needs-context injection, fold-by-decision); all are leaves except orchestrate:
- Read-only
ask/review(#757). A stage runs an agent on its own runtime and folds by itsgitmoot_resultdecision — model judgement inline in an otherwise-deterministic flow (e.g. an extract shell stage feeding a triage agent stage). Upstream stage results are fenced and injected into the prompt; a repo-bound stage runs in its own detached read-only worktree so same-repo stages parallelize without touching the live checkout. - Mutating
implement(#768).action: implement+write: truemakes a stage mutate the repo and open a pull request, folding on PR-opened, on a deterministicgitmoot/pipe-<run>-<stage>branch (a retry reuses the same branch/PR — never a duplicate). Guarded by awrite: truedouble-key, and — on a scheduled pipeline — a pipeline-levelallow_scheduled_writes, so an unattended nightly can never write code by accident. It never merges its own PR. - Composable
gate(#768). A joblessgate: pr_mergedstage waits — non-blocking, fail-open, bounded by the stagetimeout— until the PR opened by itssourceimplement stage merges, then lets the line continue. The clean way to express[implement] → [gate: pr_merged] → [deploy]. - Orchestrate sub-tree (#758).
orchestrate: truemakes a stage a bounded coordinator: itsdelegations[]fan out as owned children (inheriting the full depth / job-budget / wall-clock / loop bounds), the stage waits for the whole sub-tree via the deterministic continuation chain, then folds the synthesis. A daemon restart re-derives the wait from rows — it never restarts the tree.
All four are built on a shared stage-kind foundation (#770) that keeps existing shell and read-only stages byte-identical. See the Pipelines Workflow doc and the CLI reference. Off by default — pipelines are opt-in and mutating stages are double-gated.
Persistent memory: a curation loop (#737 P3/P4, #763)
- Markdown ingest + human-gated confirm (#753).
gitmoot memory ingeststages markdown notes into the brain as pending observations behind the pre-filter (trust_mark=low); nothing reaches confirmed memory without an explicitgitmoot memory confirm. A minimal human-gated promotion slice lands with it. - Deterministic distill-at-terminal (#760). An optional, config-gated hook distills durable facts at a job's terminal — deterministic and fail-safe, off by default.
- Grooming proposals (#759).
gitmoot memory groom --proposeemits a plan of retirement/rewrite suggestions and never applies anything; applying is always the owner's explicit--yescommand, and a nightly proposal pipeline can stage the plan for review. - Emergent clusters + repo-tier knowledge bridge (#763 Track A, #764, #766). Confirmed memories surface as emergent clusters with a repo-tier knowledge bridge, wired into the dashboard's Knowledge view (cluster hubs + fact-detail fields).
Docs (#774)
- The pipeline docs now cover the implement / gate / orchestrate stage kinds, their fields, and the mutating-stage safety model, across the site, the skill references, and
llms-full.txt.
Everything above is additive and defaults-off; upgrade is a drop-in binary replacement.