Skip to content

v0.4.0 - MCP registry listings, systemd deployment, overlord autonomy, MCP tool surface hygiene

Choose a tag to compare

@motock motock released this 23 Sep 12:20
· 382 commits to master since this release

What's new in 0.4.0

Added

MCP registry listings

  • Added server.json for the official MCP registry
    (io.github.motock/fagan) and a Dockerfile for Glama's build/
    introspection check, plus a Glama badge and dashboard screenshots in the
    README (#811, #812).

Linux systemd deployment

  • Added systemd user-unit templates for the advance-scheduler daemon and
    the usage-poller, a service+timer pair, a logrotate template, a
    scripts/generate_systemd_units.sh generator, and README documentation
    for the Linux setup path (#822, #824, #825, #831, #838).

Dashboard plan-ingest picker & Comms polish

  • A new backend endpoint lists plans available to ingest, backing a
    dynamic select in the ingest picker in place of free-text plan-name
    entry; the Comms panel shows a typing indicator while a reply is
    pending (#820, #821, #823, #828, #830).

Local-dispatch observability (LD90-W0)

  • Every escalation, fallback, park and rework notice across
    story_status, triage, escalation, review_orchestrator,
    dispatch and advance now carries event, story_key and
    correlation_id. A first_pass_clean/disqualifying_events rollup and
    a new pure local_success classifier feed a local_success_report CLI:
    rolling first-pass-clean rate by dispatch tier, with a reason breakdown,
    read from the plan notification sidecars (#850-#858, #865).

Reviewer & scheduler hardening (LD90-W5, MFR, SWH)

  • The reviewer now recognizes and classifies transport failures (502/503/
    504, timeouts) and defers the review like a rate limit instead of
    charging them against review_inconclusive_count; a diff file-inventory
    criterion was added to the review checklist. The reviewer's bash tool
    and the notification-outbox drain phase are now bounded by a hard
    timeout so a runaway command or a wedged drain can no longer hold a
    scheduler tick open. The scheduler now publishes the checkout revision
    it's actually running, and preflight reports it too (#861, #863,
    #866-#873, #906, #907, #909).

Rework & done-bar correctness (FSU, TGE, SST, SU, HRG, ASB, RFW)

  • A red full suite gets one retry before the done-gate rejects it.
    Pre-existing baseline failures are now exempted from the tick-side
    detached grade and both agent-side full-suite gates, with the baseline's
    failing node ids recorded in the worktree for the agent to read. A
    rework round that carries an acceptance block is graded on the same
    done-bar the agent was originally held to; a rework transcript that
    already claims done is never resumed; a reviewer-feedback rework round
    can no longer be marked done on oracle-green alone. The agent scratchpad
    is untracked before grading, and the planner/dispatch prompts now state
    it must never be committed (#874-#885).

Overlord autonomy round 2 (OA2)

  • Triage now recovers born-broken-oracle stories (blocked_oracle),
    resets its own attempt counter after a successful recovery, and skips
    stories with an unresolved infra-transport failure instead of ruling on
    them. Watchdog kills converge via a streak counter so repeated hangs
    escalate. request_decision fails open - parking the story for a human
    • when the overlord backend errors. Agent give_up now routes through
      the existing rebrief diagnosis path instead of notify-only. Merge-park
      re-adjudication was widened to the risk-threshold reasons the gate
      actually emits, and PIPELINE_AUTO_TRIAGE now ships enabled in the
      shipped launchd template (#834, #886-#893).

Resume-rebase remote sync (SRB)

  • A resumed agent's story branch is force-pushed after the resume rebase
    so the resumed agent's own push is a fast-forward, and the seed prompt
    is now forbidden from pulling, merging, or rebasing the branch from
    origin itself (#894, #895).

Post-LD90 priorities: file-size discipline & plan-conflict handling
(PLD90)

  • dispatch.py, story_status.py and advance.py were each split to
    bring their line counts under 1000, extracting dispatch_routing,
    dispatch_attempt, dispatch_baseline, dispatch_worktree,
    detached_grade and advance_merge as their own modules. A new
    plan-conflict classifier and overlord-ruling module distinguish a red
    suite caused entirely by pre-existing, branch-untouched tests from a
    real regression, routing the former to an overlord ruling instead of
    burning a rework cycle. A scope gate sends a branch with out-of-scope
    production changes back before review, naming the exact offending
    paths. ingest_plan gained an optional files field to scope and size
    stories, with an ingest-time warning when a local/cloud-open-source
    story's file scope exceeds the documented dispatch-sizing caps. The
    reviewer prompt now receives the story's brief, sibling status and
    Deferred lines (#833, #841, #896-#920).

MCP tool surface hygiene (MCPHYG)

  • Prompted by an external tool-quality review: check_story_status is now
    actually registered as an MCP tool - it was fully implemented and
    documented but never decorated, making it unreachable via MCP.
    mark_story_in_progress and mark_story_done now serialize their
    manifest writes under the same plan lock every other write path uses,
    closing a race with the scheduler's tick. The duplicated
    _VALID_STORY_STATUSES allowlist (each copy listing "done" twice) is
    now a single source of truth. A new patch_plan tool edits plan-level
    fields (currently role_config) under the same locked, allowlisted
    pattern as patch_story. checkpoint is renamed to checkpoint_story
    for naming consistency with the rest of the tool surface, with
    checkpoint kept as a working alias (#922-#926).

Changed

  • get_role_config removed. It was a strict subset of
    get_effective_config (5 roles vs. 9, fewer fields, same underlying
    resolver) - use get_effective_config(plan_name=None) instead. This is
    a breaking change for any external caller of the MCP tool surface
    (#924).
  • resource_status now uses a provider-aware default free-memory floor
    (2048MB for MLX, 512MB generic default for Ollama/LM Studio), and local
    model context sizing (num_ctx) is now driven by an empirically-tuned
    per-model table and sized per parallel slot, in place of a single static
    override (#818, #844-#846, #849).

Fixed

Merge & dispatch correctness

  • Merge now pushes from the plan's own worktree instead of the pipeline's
    REPO_ROOT; dirty worktree state is committed before the merge-gate
    rebase instead of retrying the same unstaged-changes failure verbatim;
    the merge gate persists its own fresh test result onto the story instead
    of leaving last_test_check stale; the squash-merge commit gets an
    explicit, stable title instead of trusting GitHub's single-commit
    default, and no longer repeats the story key in the PR title; two
    dispatch/decision-log bugs found while live-diagnosing a parked plan
    were fixed (#819, #829, #835, #839, #840, #879).

Circular imports

  • Broke a pipeline.ci <-> pipeline.build_detect <-> pipeline.server
    circular import that failed whenever pipeline.ci was imported first
    (#843).

Scratchpad tracking

  • A checkpoint commit no longer tracks .agent_scratchpad.md, even if an
    earlier commit already had (#836).

Rebrief & triage prompts

  • The rework diagnosis prompt now receives the story's original brief so
    it can't invent a fix that contradicts an already pre-authorized edit;
    triage skips stories with an unresolved infra-transport failure instead
    of misclassifying them, and keeps the real exception once the
    escalation ladder is exhausted (#834, #837).

[no-new-tests] anchoring

  • The opt-out token is now anchored to the start of the brief, so a
    sentence elsewhere in the brief that merely mentions the token can no
    longer accidentally trigger it (#833).

Dashboard/UI polish

  • The Comms typing indicator now anchors after the thread with tighter
    panel spacing, and the stale plan-board progress bar is hidden once the
    executor signals completion (#830, #905).

Docs accuracy

  • Fixed a stale gpt-oss:20b 32768 num_ctx claim and documented the
    gpt-oss-20b-high override; documented the launchd install+reload
    requirement and added a reload helper so a plist edit actually reaches
    the running daemon; fixed the "Both routes" wording in the patch review
    & apply section (#827, #846, #847).