Repository navigation
Releases: armoryworks/md-agent
Release list
v1.11.0
md-agent v1.11.0 — script mode, the merged-tree gate, per-worktree setup
Supersedes v1.10.0 (unpublished). Everything from 1.10.0 plus:
Script mode. "script": "./drive.mjs" replaces the model orchestrator with a JS driver: h.dispatch(seat, ask) resolves with the seat's reply, Promise.all batches asks into one turn, h.read(seat, path) reads a sibling's file, the returned string is the completion reason. Dispatch order, phases and completion become code; orchestrator cost is zero. Verify, auto-commit, heal, budgets and teardown are unchanged.
The merged tree is judged. With more than one changed workspace, the gate merges every changed branch into a scratch worktree and runs the check there once. A conflict fails the gate naming the branch and paths. Teardown prints merged together: PASS | FAIL | CONFLICT, so "safe to merge" means all of them.
Per-worktree setup. "setup": "npm ci" runs once in each fresh worktree before its seat starts and in the merged tree before its check.
agy under budget.usd. budget.agyUsdPerMTokens prices Antigravity turns so they count toward the USD ceiling; launch warns when nothing bounds an agy seat.
Also in this line since 1.9.0: auto-heal ladders, auto-committed verified replies with sibling worktree access, VERIFY-READY, [TURN CAPPED] with booked spend, the gate waiting for busy seats, idle re-invoke, the wind-down rule, lean seats (no skills, projectInstructions, readOnly, per-tier turn budgets, 120k recycle, read discipline), opus-for-judging measured and encoded, the launch-time verify dry-run.
v1.10.0
md-agent v1.10.0 — seats that reach each other, heal, and stay cheap
From a field audit of two live review runs (docs/analysis-2026-09-05-v1.9.0-field.md), then measured again.
Seats reach each other's work. A verified reply is committed on the seat's branch by the harness and the orchestrator's event names the sha; the completion gate commits every changed workspace before judging; claude seats can read sibling worktrees. The orchestrator is told to sequence a consumer after its producer replies.
Auto-heal. roles[].fallback (or a run-level fallback) is a ladder of {provider, model}. A provider that is dry at preflight moves its seats to their rung before launch; a seat that runs dry mid-run reseeds itself on the rung from its transcript and replies with [SEAT HEALED].
Honest accounting. A turn stopped by its cap reports [TURN CAPPED] with its partial work on disk, and its spend is booked. The gate waits for busy seats. Idle turns re-invoke in seconds, not ten minutes. The soft budget carries a wind-down rule.
Explicit readiness. VERIFY-READY on its own line is the completion claim; slice reports are attached, never bounced.
Lean seats. No skills by default; projectInstructions: false drops a large CLAUDE.md from a read-only seat's every call; readOnly: true gives a judging seat Read/Grep/Glob only; per-tier turn budgets; recycle at 120k resident tokens; a READ DISCIPLINE block in every mandate. Measured on the same review: $11.67 → $9.78, re-read tokens −39%.
Tiering, measured. Opus on every judging seat; sonnet/haiku only behind a mechanical check. The planner, init, the skill and the README encode it.
Guards. The verify command is dry-run at launch and a malformed one refuses the run. Older items closed: huddle timeout, quota probe false positives, expired self-stops revived on resume, verify output attached only to the failing seat, process-group kill on verify timeout, a second completion request answered rather than dropped.
v1.9.0
Full Changelog: v1.8.0...v1.9.0
v1.8.0 — --watch and --status; fixes the 1.7.0 first-dispatch crash
Published to npm as @armoryworks/md-agent@1.8.0. 1.7.0 crashed on the first dispatch — upgrade.
Fixed
- First-dispatch crash in 1.7.0. The loop guard's state was declared after the kickoff dispatch that reads it (a TDZ error). Declared first.
New
md-agent --watch <run-dir>— the umbrella, built from the run's files alone, so it can be shown from anywhere. Terminal: live, repainted every 2s until the run ends.--once: one frame (plain text when piped) — what a Claude Code session pastes into a message. Piped without--once: a digest printed whenever it changes (--every Nseconds) until the run ends — what a background monitor wants.--json: the frame as data.md-agent --status <run-dir>— one digest: elapsed, per seat what it is on right now, tool calls by kind, last line, cost; the ledger's artifacts; recent events.- Skill: showing the umbrella is the default when Claude reports on a run.
docs/analysis-2026-09-04.md: an md-agent team's review of md-agent — sixteen findings with file:line and a smallest fix each.
v1.7.0 — small turns, review each seat
Published to npm as @armoryworks/md-agent@1.7.0.
The day's Antigravity log showed where a weekly quota went: one md-agent turn is a 70–130-call agentic loop inside the CLI, each call re-reading the whole conversation, so a single turn reached 5–7M tokens — and the same task ran three times at that size.
Changed
- Turn discipline + turn cap. Every seat's mandate now says one slice per turn, one check, then report;
roles[].turnTimeoutSec(300s agy / 600s claude) stops a turn that runs long and reports it as an ask too big for one turn. - Recycle by size. A session whose last turn processed ≥ 200k tokens (
MD_AGENT_ROLE_RECYCLE_TOKENS) is reseeded from a handoff before its next dispatch. - agy tiers at low/medium reasoning:
gemini-3.1-pro-low/gemini-3.8-flash-medium/gemini-3.8-flash-low. A-highturn spends ~60k thinking tokens; name one explicitly if a seat needs it. - Seats get large briefs by pointer to
context.md; an identical verify tail isn't re-attached twice.
New
- Review each seat. After the planner's proposal: each seat's recommendation with the planner's one-line reason first, then every provider · tier with what it's good for and what it costs; your pick replaces the plan's. The skill tells Claude Code to do the same in conversation — never choose a seat's provider silently.
v1.6.0 — a seat out of quota stops itself; loop guard
Published to npm as @armoryworks/md-agent@1.6.0.
Fixed
- A run stalled when an agy seat hit its quota ("Individual quota reached … Resets in 164h48m"): the turn error was swallowed in the role loop and nothing reached the orchestrator. Now every turn error is reported to it as
[ROLE ERROR], and provider exhaustion — agy's quota text, or a clauderate_limit_eventthat isn'tallowed— makes the seat stop itself: stop + reset time instate.json, a[SEAT STOPPED … OUT OF QUOTA]note in its outbox, no respawn. The orchestrator reassigns its work.
New
- Loop guard. One seat dispatched to repeatedly with nothing verified in between (the "confirm the tests exist" loop that burned 470k tokens) is warned about at 4 consecutive dispatches and HALTs the run at 6. Any other dispatch, or a verify PASS, resets it.
smoke-providers.ts: both adapters tested against fake CLIs on PATH — stream parsing, usage, plan windows, quota text with reset time, claude rate-limit status. Runs innpm test.
v1.5.0 — agy seats stay in their worktree; --stop
Published to npm as @armoryworks/md-agent@1.5.0.
Fixed
- agy seats ignored the worktree. agy resolves paths against its project, not the process cwd (started bare it works in
~/.gemini/antigravity-cli/scratch), so an isolated agy seat's files landed outside its workspace. Every agy turn now carries--add-dir <seat dir>. Verified live under worktree isolation: files in the workspace, verify PASS, main tree clean. --help/ unknown flags printed a stack trace; now usage.
New
md-agent --stop <run-dir>— end a run that has no console (detached, or from another terminal). Places a STOP file the run polls every 2s; clean teardown (seats told to exit, workspaces audited,endedAtstamped); SIGTERM only if the process lingers.touch runs/<dir>/STOPor a hand-placedHALT.txtdo the same. SIGTERM itself now tears down cleanly.- The orchestrator treats a seat that fails verify twice on the same work as stuck — route to another seat (the reviewer), re-scope, or split — instead of bouncing it a third time while the reviewer idles.
- Skill: Watching a run covers
--stop.
v1.4.3 — watching a run
Published to npm as @armoryworks/md-agent@1.4.3.
- Skill: Watching a run. How to follow a run from another terminal (
tail -f runs/<dir>/transcript.md,md-agent --inspect), whatHALT.txtmeans, and the rule that Claude launches runs detached and watches the transcript so results are reported as they land. - Launch and resume print the
tail -fand--inspectcommands for the run.
v1.4.2 — journal index, no install script
Published to npm as @armoryworks/md-agent@1.4.2.
- Master index in the journal repo. Every push regenerates
index.json(for md-agent) andJOURNALS.md(for people) at the root — every run across every project with status, spend, goal and journey reference, linked to its cover page. One pull tells the home screen what the repo holds. - Mailboxes (
inbox/,outbox/) travel with the journal; emptied on pull. - No install script. Current npm hides install-script output and flags packages that have one, so the postinstall notice produced a trust warning and no message. The first-run offer on the home screen is now the single path to the Claude Code skill.
v1.4.1 — version everywhere
Published to npm as @armoryworks/md-agent@1.4.1.
md-agent --version(also-v,md-agent version).- The version shows in the home banner, the panel header (
ARMORY WORKS · md-agent v1.4.1), and at every run/resume start.