v1.21.0 — mq-hal operator layer readiness. Done. Next: v1.23.0 — Cross-repo release automation.
All phases complete through v1.21.0.
| Version | Theme | Status |
|---|---|---|
| v1.8.0 | Stack alert | Done |
| v1.9.0 | Stack report + release gate | Done |
| v1.10.0 | Stack release notes | Done |
| v1.11.0 | Stack contract gate | Done |
| v1.12.0 | CI integration for stack gates | Done |
| v1.13.0 | mqobsidian stack truth export | Done |
| v1.14.0 | Stack release orchestration | Done |
| v1.15.0 | Brain-integrated stack workflow | Done |
| v1.16.0 | Runtime consolidation | Done |
| v1.17.0 | Ollama runtime | Done |
| v1.18.0 | Memory engine | Done |
| v1.19.0 | Operator dashboard | Done |
| v1.20.0 | Autonomous stack | Done |
| v1.21.0 | mq-hal operator layer readiness | Done |
| v1.22.0 | Inbox ranking and promotion orchestration | Done |
| v1.23.0 | Cross-repo release automation | Released v1.23.0 |
Goal: keep mq-agent focused as the orchestrator while reducing parallel paths.
The rule remains:
mqlaunch → starts
mq-agent → orchestrates
mq-mcp → runs
repo-signal → measures
mqobsidian → remembers
ollama → reasons
mq-hal → presents
- Consolidate overlapping entrypoints by making
mq-agent run --stackthe canonical root runtime while keepingsignal,review,learn, andtruth-exportas focused escape hatches. - Define one canonical orchestration pipeline in runtime output: discover → repo-signal → review → learn → truth-export → release → dashboard.
- Add
mq-agent stack runas the first stack runtime surface with--dry-run,--json,--markdown,--brain,--ci, and--approve; expose it from the canonical root surface asmq-agent run --stack. - Add
docs/MQ_CONTROL_PLANE.md— one system map for signal, review, learn, memory and release.
Goal: make Ollama a first-class runtime dependency with explicit model profiles instead of incidental learn-backend support.
- Add
mq-agent modelscommand group. - Add
mq-agent models listfor local Ollama inventory. - Add
mq-agent models currentfor active profile/model visibility. - Add
mq-agent models switchwith explicit--approvefor writes to~/.mq-agent/models.json. - Add
mq-agent models benchfor a small local model smoke test. - Surface active model profile in
mq-agent stack runOllama checks. - Add release docs/status sync for v1.17.0.
- Run full suite and release gates before PR.
Default profiles:
fast
review
planner
memory
Goal: make mqobsidian usable as a local long-term memory engine from mq-agent, not just a write target for exports.
- Add
mq-agent memory ingestfor a read-only Markdown index across truth, reviews, learn, releases, architecture, decisions and stack runs. - Add
mq-agent memory query/memory search-vaultfor local vault search without requiring mq-mcp or a vector store. - Add
mq-agent memory summarizefor section-level note, word and tag summaries. - Add
mq-agent memory linkfor read-only link candidates between notes. - Register
memory_engine.v1in the repo contract. - Add
docs/MEMORY_ENGINE.md. - Keep write-backed links out of v1.18.0 and defer them to a later explicit approval flow.
- v1.19.0 — Operator dashboard foundation:
mq-agent dashboardread-only snapshot for stack health, release, brain, Ollama, repos and contracts. - TUI startup now shows the operator snapshot before command execution.
- Add refresh-oriented TUI panels for stack, release, brain and models.
- Add operator dashboard reference documentation.
- Add dashboard documentation to the GitHub Pages index.
- v1.20.0 — Autonomous stack foundation:
mq-agent stack loopcontrolled planning and approved one-step execution. - Add explicit loop contract schema and rollback behaviour documentation.
- Add mqlaunch menu entry for manual
mq-agent stack loopplanning. - Add approved execution after command-specific rollback behaviour is implemented and tested.
Goal: keep mq-agent as the control-plane truth producer and make its
operator-facing outputs stable enough for mq-hal to become the daily
operator layer.
mq-agent should produce the truth. mq-hal should show the truth.
mqobsidian should remember the truth.
- Lock stable JSON outputs for the surfaces
mq-halshould read:mq-agent stack cockpit --json,mq-agent stack brain-gate --json,mq-agent run --stack --json,mq-agent stack release-check --json, andmq-agent dashboard --json. - Add or update contract tests for the fields needed by
mq-hal stack,mq-hal brain-status,mq-hal release-status, andmq-hal next-action. - Document the
mq-agent → mq-halread contract, including thatmq-halmust not own gates or write flows. - Add a compact
next_actioncontract section covering source command, severity, suggested route and whether approval is required. - Add stack-loop audit history now that the
mq-haloperator layer can display approved execution attempts cleanly. - Register
mq_hal_operator_contract.v1in the repo contract.
Goal: make mq-agent the owned execution layer for inbox analysis, ranking,
and review-gated promotion, reading truth from mqobsidian exports and never
taking over truth ownership or shell runtime.
mq-agent runs the workflow. mqobsidian owns the schema and remembers the
result. mqlaunch stays a thin delegate surface.
- Add
mq-agent obsidian inbox list/inbox readover canonicalmqobsidianinbox exports (read-only). - Add
mq-agent obsidian inbox rank: score candidates against the canonical ranking fields, merging evidence across sources. - Add a review-needed vs auto-promotable classification flow using the
mqobsidianpromotion-state model. - Add
mq-agent obsidian promote --dry-runand--confirm, plusreject/deferandrollback/deprecateflows. - Require traceable source evidence before any promotion; keep mutation paths explicit and review-gated.
- Validate expected
mqobsidianmanifests/views before workflow execution; fail safely on stale, missing, or drifted truth surfaces. - Blocked — accept
repo-signalreadiness andmq-mcpreview outputs as evidence inputs without moving truth ownership out ofmqobsidian. Blocked by producer contracts (mqobsidian DEC-004):mq-mcp review_fileemits prose, not JSON;repo-signaldeclaresreadiness_score.v1/publish_checklist.v1but emits neither; and no repo-signal output carries a candidate key. Unblocks when a producer emits candidate-bearing, bounded JSON evidence with an explicitproducerandschema_id. - Expose a stable, machine-readable CLI/API surface for
mqlaunchto delegate to; keep ranking and promotion logic out of shell. - Register
inbox_promotion_orchestration.v1in the repo contract.
Goal: automate the MQ release workflow across repos while preserving repo ownership boundaries, branch protection, and review gates.
Release automation should coordinate:
mq-agentas the orchestration and contract authorityrepo-signalfor readiness and release gate scoringmqobsidianfor durable truth and release manifest exportsmq-mcpfor local test/review orchestration and machine-readable outputmq-halfor operator visibility and next-action guidance
Superseded 2026-07-17 by the reframe below. This list predates stack release and most of it would rebuild what already ships. It is kept for
provenance only; the live checklist is under Recommended reframe. The
unchecked boxes here are not open work.
- Add
mq-agent release planto generate a repo-aware release plan from currentCHANGELOG.md,VERSION, andrepo-signalreadiness output.- This plan should list repos, next version, blockers, and proposed branch or PR flow.
- Add
mq-agent release prepare --repo <name>for single-repo release preparation.- Validate
CHANGELOG.mdcontains the planned version. - Validate
README.mdversion badge matchesVERSION. - Validate
repo-signalreadiness andmq-mcpreview pass status. - Update
VERSION, README badge, and release section in one atomic step.
- Validate
- Add
mq-agent release execute --repo <name>to commit, tag, and push.- For non-protected repos, push directly to the release branch.
- For protected repos, create a
chore/release-v<version>branch and push the changes there. - Optionally support
--create-prto open the branch as a PR.
- Add
mq-agent release syncto align branch protection requirements with actual repo rule state.- Detect repos needing PR-based flow vs direct push.
- Use protected repo workflow rules to choose whether to open a PR.
- Add
mq-agent release gate --jsonas a machine-readable release gate step for CI andmq-hal.- Output should include
repository,version,blocked,blockers, andevidence.
- Output should include
- Add
mq-agent release-check --codegraphto automatically validate release workflow impact when.codegraph/is available.- Auto-query callers/impact for
mq-agent stack release-check,stack release, and release-related release orchestration files. - Include
codegraph_applied,codegraph_queries, andcodegraph_findingsin JSON output.
- Auto-query callers/impact for
- Add
repo-signal readiness --format jsoncompatibility for release automation. - Add
mqobsidian release manifestexport for each planned release.- Include repo version, changelog heading, branch/PR target, and gate status.
- Add
mq-hal release-statusandmq-hal next-actionto show pending releases and which repos need PR creation, review, or merge. - Add a
docs/STACK_RELEASE.mdupdate section describing the new cross-repo release workflow and PR gating behavior.
Goal: make Claude/Codex grounding fast and low-cost by prioritizing compact,
controlled exports before falling back to the full mqobsidian vault.
- Run
mq-agent agent-views rebuildas the first prepare step- Explanation: builds
memory/learn/agent/<system>.mdfromhot.md+index.md. - Result: model step‑0 view; small, focused first-read surface.
- Explanation: builds
- Export
.mq/context/*snapshots for relevant repos- Explanation:
mq-agent context export --repo <repo> --output-root <dir> - Result: repo-local
repo-card.md,integration-map.md,token-budget.md,active-contract.md.
- Explanation:
- Prioritize read order in agent workflows
- Explanation: prefer
memory/learn/agent→.mq/context/*→ full vault as fallback. - Result: reduced token usage, faster grounding, less noise.
- Explanation: prefer
- Add drift guard in CI/prep
- Explanation:
mq-agent agent-views checkfails when views are stale. - Result: CI can refuse runs when generated views are out of sync.
- Explanation:
- Create a repeatable prepare step (script/CI target)
- Explanation: combine rebuild + export into one
prepare-contextstep. - Result: deterministic, reproducible context preparation for all agent runs.
- Explanation: combine rebuild + export into one
- Release automation is the highest-leverage workflow because it spans all repos and is currently the biggest source of manual coordination.
- It preserves the existing architecture:
mq-agentremains the orchestrator,mqobsidianremains the durable memory,repo-signalremains the gate,mq-mcpremains the runtime/assertion engine, andmq-halremains the operator UI. - It reduces human error by turning
Unreleased/version mismatch/changelog drift into deterministic validation and release branch creation. - It gives the operator layer an observable workflow rather than a hidden, manual sequence of commits and tags.
mq-agent release planshows all repos and planned next versions.mq-agent release prepare --repo <name>passes only if the repo is ready.mq-agent release execute --repo <name>either pushes a release branch or opens a PR when required.mq-hal release-statusshows a coherent release pipeline state for all MQ repos.- Protected repos no longer require manual branch selection for release.
- Release notes and truth exports are generated consistently after each successful release.
The checklist above predates stack release. Before building it, reconcile it
with what already ships.
Already built. mq_agent/tools/stack_release.py implements single-repo
release automation end to end: plan_stack_release (gate + clean-tree +
on-main + unreleased-commits + semver check) and execute_stack_release
(bump-version → sync-contract → update-changelog → commit → tag → push →
truth-export, with rollback of pre-commit edits on any failed step). The
planned mq-agent release plan|prepare|execute items are largely this under
new names — building them as specified would duplicate stack release, the
exact consumer-before-producer / duplicate-work pattern this stack has now hit
four times.
The real gap this session surfaced. Each repo also carries its own
release.sh, and that path — not stack release — is the one operators used.
release.sh bumps VERSION but never .mq/repo-contract.json, so three repos
shipped tags (macos-scripts v1.0.1, mq-mcp v2.0.1, repo-signal v1.4.1)
with the contract one version behind, each tagged off a feature branch and
never merged to main. (Correction 2026-07-19: macos-scripts v1.0.1 does not
hold up on inspection — see the tag-disposition item below. Only mq-mcp v2.0.1 and repo-signal v1.4.1 were actually drifted.) The drift stayed
invisible because those repos had no contract-version gate. Gates now exist
across the stack (mq-agent#135, mq-hal#15, mq-mcp#45, repo-signal#14, and the
pointer check on macos-scripts main), so drift fails a repo's own CI instead of
mq-agent's stack gate — but a gate only catches drift after the fact. It does
not stop the two-path, tagged-off-main release shape that produced it.
Recommended reframe. Point v1.23.0 at making the correct path the only path, not at rebuilding the plan/prepare/execute surface:
- Converge the release paths: either retire each repo's
release.shin favour ofstack release, or makerelease.shsync.mq/repo-contract.jsonthrough the same logic, so the contract cannot drift regardless of which path runs. Done — each repo'srelease.shnow syncs the contract (or validates it): mq-mcp #46, macos-scripts #55, repo-signal #15. - Add multi-repo orchestration over the existing single-repo primitive
(
stack releaseis one repo at a time) — refuse any repo that is dirty, off main, or already tagged at the target version.stack release --all(#141) aggregates the per-repo plan; the plan refuses dirty and off-main, and now also refuses a target version whose tag already exists locally or on origin — the drift shape that would otherwise abort mid-release after the commit. - Enforce on-main releases: a tag cut off a feature branch that never
reaches
mainis the failure mode that produced the current drift. The plan blocks off-main, andexecute_stack_releasenow re-verifies on-main and a clean tree against the live repo before any mutation — so a plan built on main cannot cut a tag once the checkout has moved off main or gone dirty. Broader enforcement (server-side branch protection) stays out of scope; this is the local release-shape guard. - [~] Multi-repo execute (
stack release --all --execute) — design locked in docs/STACK_RELEASE_ALL_EXECUTE.md (fail-fast preflight gate, stop-on-first-failure, no destructive rollback). Slice 1 shipped: the read-only preflight hookstack release --all --preflight(preflight_stack_release_all, schemamq_stack_release_all_execute.v1) — the full refusal surface incl. each repo'srelease-check.sh(repo_release_check.v1), never mutates. Slice 2 (per-reporelease-check.shrollout) done — 8/8: mq-agent #147, mq-hal #17, mqobsidian #50, repo-signal #17, mq-mcp #48, mq-ums #13, mq-image-analyze #11, macos-scripts #57. The five that were off-main in the live drive have since landed onmain; verified by runningrelease-check.sh --jsonin each repo — all eight answer with schemarepo_release_check.v1and statusREADY, andstack release --all --preflightreportsblocked 0. Slice 2 is closed; the rollout needs no further work. - Multi-repo execute (
--execute --approve) — done.execute_stack_release_allruns the read-only preflight, fail-fast gates on anyBLOCKEDrepo before a single mutation, then executes theREADYrepos in explicitMQ_STACK_REPOS(dependency) order with stop-on-first-failure. Repos after a failure are reportedSKIPPEDand never started; an already-released repo is left released, because un-releasing it would mean deleting a pushed tag or rewriting history.--executewithout--approveprints what would be released and touches nothing. Both locked execute-phase tests ship with it — repo 2 of 5 fails → 3–5SKIPPED, and the released repo keeps its commit and its pushed tag — and the failure is real (one repo is given no reachable remote so itsgit pushfails mid-run) rather than a patched return value. - Disposition of the drifted tags — decided 2026-07-19: keep as known-bad
history and fix forward. Tag deletion was rejected as destructive; the
operator's rule for these operations is run from clean
main, verify the target tag does not already exist, no remote tag deletion, no force-push, no history rewrite, protectedmain→ branch/PR, and stop on any deviation.mq-mcp v2.0.1— kept as known-bad. Fixed forward tov2.0.2: the package, stability, tool-contract and repo-contract surfaces had stayed at2.0.0. The fix also stoppedtests/test_cli.pyandtests/test_server_observability.pyasserting a hardcoded"2.0.0"— they readVERSIONfrom disk now, which is what let the drift ship.repo-signal v1.4.1— kept as known-bad. Fixed forward tov1.4.2: the repo contract had stayed at1.4.0.macos-scripts v1.0.1— not drifted, contrary to the earlier note above. Verified 2026-07-19: annotated tag, an ancestor ofmain, and.mq/repo-contract.jsonreads1.0.1at the tag, matchingVERSION. Nothing to fix forward; its next release proceeds normally.stack release --all --preflightis clean —blocked 0.
Releasing v1.23.0 exposed a structural gap the design had not modelled.
stack release --execute pushes straight to main; three stack repos
(mq-agent, macos-scripts, mqobsidian) require a pull request, so the
push was refused with GH013 after the bump, commit and tag already
existed locally. All of it had to be unwound by hand.
The tool knew versions, tags, clean tree, unpushed commits, release-check.sh,
README and uv.lock — but nothing about whether a repo may be pushed to at
all, so it learned about branch protection by failing at the most expensive
possible point.
-
release_modeis declared data in.mq/repo-contract.json, read before any mutation (#157). Execute refuses anything that is notdirect, and an absent field is refusal rather than permission.--all --preflightstays a pure readiness measurement; the mode gate belongs to the mutating path. - Next slice — the PR-mediated release path.
pull_requestrepos need release branch → PR → merge → tag the merged SHA, as a first-class flow rather than a manual recovery. Until then those three repos are released by hand and the other five stay blocked until they declare their mode. - Declare
release_modein the remaining seven repos. - Fold README's status badge and status section into the declared version
surfaces.
stack releasebumps VERSION, pyproject,uv.lockand the contract; README drifted and only CI's docs job caught it, whilerelease-check.sh --jsonstill reportedREADY. Two gates, two different definitions of releasable.
State of v1.23.0 at the point the work was paused. Four of five reframed
slices are done: release paths converged, multi-repo dry-run orchestration,
on-main enforcement, and the read-only preflight incl. the 8/8
release-check.sh rollout. The tag disposition is decided — mq-mcp v2.0.1
and repo-signal v1.4.1 kept as known-bad, fixed forward to v2.0.2 and
v1.4.2, no tag deletion, no force-push, no history rewrite.
Last preflight run for this checkpoint (stack release --all --preflight --json, schema mq_stack_release_all_execute.v1):
ready 7 blocked 0 up-to-date 1
would_execute true aborted_phase none
All eight repos are on main and clean. repo-signal is the up-to-date one
(v1.4.2 already released). mq-mcp reads READY 2.0.2 -> 2.0.3 rather than
up-to-date because of one docs commit landed after its tag (#50) — expected,
not drift.
Only the execute slice remains open, and it is deliberately a separate work session. This checkpoint added no wiring, no tags, and ran no releases.
Goal: make mq-agent the stable conductor of the full loop — repo status → review → learn extract → brain write → stack truth export → next action. mq-agent orchestrates; mq-mcp thinks/runs, repo-signal measures, mqobsidian remembers, mqlaunch launches.
-
mq-agent stack cockpit— one table for the whole stack: repo, status, branch, dirty, version, contract, release gate, brain export freshness, next action. Later the input to mq-hal. - Consistent flag behaviour across write-capable commands:
--dry-runnever writes,--jsonmachine-readable,--brainnever writes without an explicit command,--approverequired for write flows. - Standard mqobsidian export structure:
memory/stack-truth/,memory/reviews/,memory/learn/,mq-stack/runs/,mq-stack/roadmaps/—mq-agent brain structure(check /--init --approve) - Brain release gate:
mq-agent stack brain-gate—contract-check+release-check+ truth-export dry-run + vault structure + the review→brain write path, all green before release - Docs sync: README, docs/ROADMAP, MQ_ECOSYSTEM, CHANGELOG, repo-contract
- Tag v1.15.0
Goal: close the loop. The stack suite observes (status, report, sweep,
history), gates (alert, release-check, contract-check), remembers
(truth-export), and drafts (release-notes) — but the release itself is
still manual, per repo, across 7 repos. stack release makes the pipeline act.
-
mq-agent stack release --repo <name>— orchestrated single-repo release: release-check as pre-gate, version bump, changelog update from the release-notes draft, tag, push - Dry-run by default (same pattern as
sweep);--executeto apply -
--json— machine-readable output for CI - Automatic
truth-exportafter a successful release, so the release lands in mqobsidian memory - Abort cleanly on any failed step — no half-released repos
-
docs/STACK_RELEASE.md— reference doc - Tests for gate refusal, dry-run plan, step failure rollback (27 tests)
- Tag v1.14.0
Goal: turn stack gate results into durable mqobsidian memory, not transient CI logs.
-
mq-agent stack truth-export— truth note from contract-check + release-check -
mq-agent stack exportkept as backwards-compatible alias - Dated default note path under
~/mqobsidian/memory/stack-truth/ -
--cimode for stack gates; two-job CI workflow (fast PR gate + full stack gate) - 25 new tests (439 total)
- Tag v1.13.0
See docs/ROADMAP.md for the full release history.