magus v0.4.3 is out. See what's new
¶ View markdown source · ✎ Suggest an edit
14 min read

A record of refusals

The decision to build and the decision to stop both stay with a person; what the tool owes them is a record that makes each one visible and cheap to revisit. Below is that record: capabilities magus could have had and does not, or had and removed, with what decided each and where to check it.

what what was decided where
an advisory when an agent edits a file it never looked up not built: 0.8% of 3,560 first edits were never anchored, and all 27 cases read by hand were matcher artifacts transcript measurement, 2026-09-02
denying a recursive grep of a bare identifier, to force refs measured and partly reversed: the original count (45 such greps, denominator unstated) undercounted the sample: a 2026-09-15 remeasurement over 1,116 transcripts found 699 matching the guard's own shape (about 2,700 individual greps), the same roughly-60%-answered-by-refs ratio holding on the larger sample; an advisory still ships for raw text the graph cannot vouch for, but since a05b4c414 a recursive grep of a DEFINITIVELY-indexed symbol is DENIED outright (denyRuleSymbolSearch), not merely advised f963a9f1b, measured with 9519797b3, remeasured 2026-09-15; denied since a05b4c414 (internal/guard/search.go)
sending every recursive literal grep to magus refs --text not built: measured 2026-09-29 over the read/discovery audit's Claude, Codex and Cursor transcripts, 3,498 recursive greps of literal text ran. refs --text is the same substring scan with no graph behind it, so a deny would cost a turn and return what grep returns, and a regex search has no equivalent at all. A search the graph answers better is already refused where it can be proven: symbol-search, search-translation and grep-reader the read/discovery audit, 2026-09-29; internal/guard/search.go
wiring Claude Code's Grep and Glob tools to the guard not built: measured 2026-09-29, the same transcripts held 2 Grep or Glob tool calls against thousands of shell searches, so a restatement like Cursor's would judge almost nothing. Cursor keeps its restatement, where those tools are how it searches. Revisit if a host's own search tool becomes the common path the read/discovery audit, 2026-09-29; docs/guides/integrations/agents/cursor-hook.buzz
an ask verdict, so a denial could be waved through in the moment built across 14 files and reverted the same day: two of the four host glues would have silently PERMITTED every raw-tool denial instead of prompting; ask returned later for consent to a costly or publishing act only (the push gate asks a session no lease binds), never to clear a denial, and a host that cannot prompt renders it as a deny internal/agent/guard.go guardDecisions; gradePushWithoutGate in internal/guard/push.go
47 half-built features found in an audit before the project was shared each one killed, finished, or pinned with its reason; one kill was wrong and the person reversed it 4f8cc295a
machine-wide memory admission control deleted in b6abdfe43, then brought back as a declared claim against one broker budget. A step claims its slots and memory_mb, and a refusal from another invocation is MGS3009, never queued. A claim is declared or measured from recorded runs, never observed live. status --wait reserves its seat for the run it feeds, and a bare run still refuses at once b6abdfe43, cc3d21b19 (#129), Concurrency
a pressure brake that withholds new claims while observed memory is high not built, refused 2026-10-16: it would make the verdict depend on what else is running, and the same command on the same machine would stop reaching the same answer. Observed pressure warns and never blocks Concurrency
rotating the activity trail from its write path deleted rather than keep promising bounded retention to a workspace running no daemon 42a0996c5
magus graph verify folded into doctor: no in-tree consumer, absent from the CLI registry, and filed under a graph it never read 3f805e159
magus_tail_log named in public as a duplicate of magus_output and shipped for two more weeks as a debt; deleted when the tool catalog became generated from the descriptor blog/2026-08-25-twenty-wrappers-and-a-teaching-layer.md
a model adapter never built; the one extension seam that is absent rather than sealed Scope
a paid tier, an account, a capability behind either never built; there is nothing to upsell Scope
generating code your build depends on never built; nothing magus writes into your repository has to exist for magus run build to work Scope
detecting where magus runs, to pick a default or an output removed: each shipped CI provider's check for its own system, the build provenance and job summary read from the runner unasked, and the agent host guessed from an event's shape or defaulted when unnamed; each became a flag, a charm, a setting the workflow passes, or the host name the generated hook configuration carries TestNoEnvironmentSniffing
a conformance check for a counterpart missing beside a new name (Open without Close) not built: with the pair table mined from the tree at 0.8 co-occurrence, every existing symbol treated as new produced 2 findings, and both read by hand were a helper that only ever needs one direction (prevWord with no nextWord) measured on this repository, 2026-09-23
a conformance check for a new function calling the same workspace symbols as an existing one not built: 85 findings with every existing symbol treated as new, and 12 of 30 read by hand were code worth folding; the rest were siblings of one family (parseX, compileX, a dashboard's tiles) sharing their infrastructure measured on this repository, 2026-09-23
a conformance check for a word already carrying other senses (Transport as a hook form and as a round-tripper) removed before release: which sense a word has is a judgment about meaning, not a fact the index holds; the exact name shared with a workspace entity stays naming-drift review, 2026-09-23
conformance checks for swap-prone positional arguments, oversized parameter lists and records, and one word with two meanings never built: each is a taste about API design or a claim about meaning, not this repository's measured majority naming-drift review, 2026-09-23
a conformance check for an interface with far more methods than those declared beside it removed before release: every existing symbol treated as new produced 4 findings, and all 4 were aggregates designed to be large (VCSDriver among them), so every finding was noise measured on this repository, 2026-09-23
conformance checks for a single-implementation interface or an export nothing uses never built: a review opinion, and a stacked change is exactly an export with no caller yet naming-drift review, 2026-09-23
a conformance check for a flag or command that reaches the network without saying so never built: that is magus's own CLI rule rather than a workspace norm, and static reachability is unsound through interfaces and function values naming-drift review, 2026-09-23
conformance checks for unpaired test files and config key shapes never built: test layout is libs/testlayout's opt-in analyzer, and key shape is magus's own schema rule; house rules belong in this repository's conventions tests naming-drift review, 2026-09-23
the hand-edited-generated pull-request advisor deleted: 18 of the 31 pull requests carrying it were read by hand and none held a hand edit; 15 flagged libs/*/MAGUS.md, which render graph-wide data no declared input keys, one checked the project owning the file's tree instead of the target declaring it, and two were deliberate regenerations. A hand edit of a keyed output already fails the drift gate, and the agent guard advises at write time measured on this repository, 2026-09-24
the code-search and doc-search guard advisories deleted: 0.9% uptake over 6,075 servings for code-search and 2.5% over 812 for doc-search, against a ceiling of 3.4% set by how rarely magus refs was invoked at all. A search every name of which the graph answers exactly is refused by symbol-search instead, and a one-name precedent hunt still advises hint uptake measurement, 2026-09-11; deleted 2026-09-24
the cd guard rule deleted: a cd ahead of magus is the same command as naming the project or passing --root, so nothing it refused was provably wrong. Of 238 measured denies, 207 already passed once it was narrowed to lines running magus, and the 31 left moved into a checkout and ran ./magus there. A cd into another checkout of the repository is still refused by sibling-checkout, and one into a temp copy by throwaway-copy guard precision measurement, 2026-09-26
--platform github never built: a hosted runner can neither mount the checkout nor return a store, so it is not another platform; a branch run is hack/remote/on-actions.buzz ADR 0004, 2026-09-26
dispatching a branch run on every push never built: on a public repository a run is a public record, opted into per commit ADR 0004, 2026-09-26
a private mirror for branch runs never built: billed minutes, duplicated secrets and a second remote in every agent's hands ADR 0004, 2026-09-26
a conformance check for constructor-prefix naming (New/Open/Load/Parse) on exported functions returning *T not built: 107 of 165 exported functions returning a same-package pointer use one of those prefixes (65%), short of the 0.8 floor either way; the affix lens already handles the case that matters (NewX beside New, OpenX beside Open) pattern-mining plan, measured on this repository 2026-09-27
a conformance check for error types named *Error not built: 31 of 41 types with an Error() string method are named *Error (76%), short of the 0.8 floor; the deviations (errSilent, errUsage, changeFailure, diagnostics.Code, SpellErrors, vcsUnsupported, four in gopherbuzz) are mostly deliberate small unexported types pattern-mining plan, measured on this repository 2026-09-27
a conformance check for ctx-returning setter naming (With*/ContextWith*) not built: With* 63, ContextWith* 13, other 29; 63% support, no norm at 0.8. Silent, and documented as a silence pattern-mining plan, measured on this repository 2026-09-27
a conformance check for a typed constant group's leading-token outliers not built as a headline: 55 of 67 groups (>=5 members) meet an 0.8 leading-token share, but hand-reading the outlier groups (guard.hint.MarkerKind, guard.denyRuleName, interp.PryResume, notes.IssueCode) found only 2 of 4 deliberate; at most ranked evidence under -o json pattern-mining plan, measured on this repository 2026-09-27
a conformance check for VCS capability interface parity across backends not built: of 33 capability interfaces in types/vcs*.go, only 14 are implemented by all four backends; no majority, so parity is a roadmap, not a norm pattern-mining plan, measured on this repository 2026-09-27
a conformance check for a type one method short of a >=4-method interface not built: 3 candidates found; hand-read precision 1 of 3 (dependency.Graph missing TopoSort is plausible; cache.Limiter and service.Registry short of broker.ServiceHost are name coincidences) pattern-mining plan, measured on this repository 2026-09-27
a conformance check for a VCS backend missing the declines stub not built: declines covers 31 of 33 backend/interface pairs (94%); the two it lacks (MergeDriverInstaller, VCSDriver) are the mandatory ones, so precision on deviations is 0 of 2 pattern-mining plan, measured on this repository 2026-09-27
a conformance check for a types/ interface missing a generated mock not built: 19 of 43 types/ interfaces (44%) have a generated mock; no norm pattern-mining plan, measured on this repository 2026-09-27
a conformance check for a std/*.go file missing a Module var not built: 29 of 39 std/*.go files (74%) declare a Module var; no norm pattern-mining plan, measured on this repository 2026-09-27
a conformance check for error as the last result in a multi-result return not built: 2046 of 2046 multi-result functions already put error last (100%). Covered by an enabled linter, revive's error-return rule, so the miner records it covered and ships nothing .golangci.yml revive rules (error-return), verified 2026-09-27; pattern-mining plan
a conformance check for context.Context as a function's first parameter not built: no function in this repo takes a context.Context after its first parameter. Covered by an enabled linter, revive's context-as-argument rule, so the miner records it covered and ships nothing .golangci.yml, enabled 2026-09-27
a conformance check for import direction between top-level directories (dep-direction) not built: replayed against the last 40 merged PRs, 5 new edges departed from an established precedent and only 3 read true (60%, short of the 0.8 floor). Both false positives were already sanctioned elsewhere: internal/interp/bindings importing std (the plan already treats std and internal/interp as one layer) and types/schema.go importing internal/json (already allowed by .golangci.yml's types-pure-domain depguard rule) pattern-mining plan, U2 replay, measured on this repository 2026-09-27
a skill as the home of a rule that must hold on every edit not built: magus-local-development loaded in 154 of 756 sessions that edited Go (20 percent; 30 percent of roots, 20 percent of subagents), counting host edit tools only, so the figure is a floor. The load rate rose from 4 to 20 to 61 percent across three windows only as job briefs began naming the skill; no hook demands it. A rule every session must follow goes in AGENTS.md; see Where a rule lives local skill audit, transcripts 2026-09-15 to 2026-10-13
a host prompt when a worker adds a compat marker not built: a worker has no person to answer it, and prose forbidding compatibility shims since 2026-09-24 did not hold (14 of 34 compat(until:) shims landed after it, 6 after 2026-10-08). A worker's marker gets an advisory and one attention row for the root, as a stall does delete-bias measurement, 2026-10-13; ADR 0009
a model that watches workers for stalls, of any size not built: magus never calls a model, and the watcher would cost more than the stalls it caught. Across 1,393 subagent transcripts in the 14 days to 2026-10-13, every model tier hit runs of three or more failed calls at 3.0 to 5.1 per 1,000 calls, and all 570 such runs ended on the worker's next successful call subagent transcript measurement, 2026-10-13; ADR 0009
an agent loop in the Go SDK: reading a model's tool call and choosing what runs next not built: magus is the substrate around a loop (leases, verdicts, graph answers, the trail, grades), and the loop belongs to the embedder. A loop would make magus a harness, the category its scope says it is not scope; the Go SDK
a model router: per-call model choice, live switching, escalation not built: the tier table is static and declared. A repository may pick a tier at fork time, with its answer and reason on the row; retrospective insight reports what each tier achieved; and a person changes the table, the human in the loop ADR 0009; Human in the loop
the root as the stall watcher not built: the root is the most expensive context in a session, so polling workers spends the dearest tokens on the cheapest work. The root receives one attention row for a block only it can clear ADR 0009, 2026-10-13
a stall message that gives the worker the answer not built: the message names a region (the job's criteria, its write paths, the command that answers the refusal), never the fix. Handing over the answer makes a cheap model a typist for magus, and the text grows into a second skill nobody maintains ADR 0009, 2026-10-13
per-model stall behavior, or a model name in a Go conditional not built until measured: the tiers showed no gap (Haiku 3.6, Sonnet 3.0, Opus 3.3 and Fable 5.1 runs per 1,000 calls; the Haiku sample was 33 agents), so a per-model ladder waits for two weeks of shadow verdicts and goes only to a tier that stalls at least twice as often. A row states the model and the block count and never suggests another model subagent transcript measurement, 2026-10-13; ADR 0009
a denial or a cap on a worker's calls from the stall rule not built: the rule changes wording and files a row, and a block that stops a worker's calls turns a stall into a lockout. The guard's own deny rules are the only denials ADR 0009, 2026-10-13
a heuristic over a model's prose to decide it is stuck not built: the signals are counted facts, a refusal repeated and failed calls in a row, and a sentence that "seems confused" is a guess that cannot be tested ADR 0009, 2026-10-13
a verb or flag for stalls not built: the rule is one entry in the guard profile table, reported by magus session show and magus session hints; a command-line flag that feeds a model is what Human-first is the AI integration rules out ADR 0009, 2026-10-13
a daemon sweep for idle workers not built until measured: the host's stop hooks already reach magus session notify and the job store's stale-after covers the long tail. Add the sweep only if shadow data shows idle stalls the hooks miss ADR 0009, 2026-10-13
a workspace trust store: content-hashed, or a path list set by magus init not built: running magus in a repository is the consent to run its code, and magus never runs that code passively. A content-hashed store would stall every agent on the 76 of 423 commits (2026-09-22 to 10-22) that changed magusfile.buzz or magus.yaml ADR 0014
a CLI root implied by the lease, or a MAGUS_ROOT variable not built: the root a run uses would depend on state the line does not show, a silent default. The guard places each magus call by its line instead, and lease-checkout denies one outside the holder's checkout ADR 0015
a staging wrapper: a command that classifies the tree and stages it not built: it made four choices at one call, untracked, generated, held and staged, and ran a mutating VCS operation. magus vcs ls-files lists the paths and names each choice as a flag; the person stages ADR 0016, 2026-10-22

The rows that record a measurement killing an idea somebody wanted are the only reason the rest of the list is worth anything. A ledger of things nobody was going to build proves nothing.

designrefusalsdecisions
Last updated (2df714e8)
Glossary

Workspace

The magus root directory that owns a set of projects and shared config; the unit magus operates over. Workspace in full.

Project

A directory magus recognizes as a unit of work (it has a magusfile); the unit of caching, scheduling, and dependency tracking. Project in full.

Magusfile

The magusfile.buzz that declares a project's targets (as export funs) and binds its spells. Magusfile in full.

Target

A named operation (build, test, ...) you invoke with magus run <target>; it may compose a spell's tool-native operations and depend on other targets. Target in full.

Op

A single tool-native command a target composes (long form: operation); the middle of the work hierarchy (Spell to Op to Target). Op in full.

Spell

A language/runtime adapter (e.g. go, md) that maps generic targets onto a toolchain's real commands. Spell in full.

Charm

An execution modifier attached with : (lint:rw) that changes how a target runs, not which one; the built-in rw flips a check-only target to mutate in place, and ci always strips it. Charm in full.

Module

A magus stdlib namespace a magusfile imports for host capabilities: filesystem, exec, vcs, and more. Module in full.

Buzz

The language magusfiles are written in (the .buzz engine). Buzz in full.

Cache

The content-addressed store magus consults before running a target, so unchanged work is skipped. Cache in full.

Service

A long-running or shared process magus manages across runs, distinct from a one-shot target. Service in full.

Broker

The per-user background process that holds this host's capacity: the machine budget every run claims slots from, and the shared services runs keep warm. A run starts it on demand; broker: off in magus.yaml runs without one. Broker in full.

Daemon

The background process a person starts with magus server start. It serves MCP, the console, background jobs and the warm knowledge graph, and adopts nested magus calls into one pool. Daemon in full.

CI

An ordinary target you compose yourself with ctx.needs; magus does not hardcode its stages. It is the anchor magus affected ci keys off, and ci strips the rw charm. CI in full.

Slot

One unit of the pool's capacity. A target acquires the slots it needs to run (most take one) and releases them when it finishes; the pool tracks capacity (total slots), running (acquired), and queued (blocked). Slot in full.

Concurrency

How many targets run at once. It is bounded by the pool's capacity and set with --concurrency, MAGUS_CONCURRENCY, or the concurrency config key. Concurrency in full.

Queued

A target that wants a slot while the pool is full; it blocks first-in-first-out until a slot frees. The dashboard colors a sample with queued > 0 accordingly. Queued in full.

MAGUS.md

The committed routing index at a workspace root, regenerated from the knowledge graph: it lists every node and points at the exact query for a given question, so it is the entry point an agent reads first. MAGUS.md in full.

Insight

The reports magus derives over the graph and history (hotspots, affinity, ownership, trend, volatility, unreferenced). Insight in full.

Agent

A model working through an agent host such as Claude Code, Codex, Cursor or OpenCode. magus treats an agent as one more caller of its CLI, MCP tools and console, held to the same checks as a person. Agent in full.

Tool

An action a model can call through its host: a name, a description, a typed input and a result. magus serves its tools over MCP, each a read of the workspace model or a run of the CLI it already has. Tool in full.

Harness

The deterministic scaffolding around the work on a change, for a person or an agent: compiler errors, formatters, linters, checks, gates, leases and hooks, placed at points a person chose. Around an agent's loop, magus supplies one and keeps it outside. Harness in full.

Skill

A packaged set of instructions an agent host loads when a task matches its description: a directory holding a SKILL.md. magus ships its magus-* skills in the binary and writes them with magus agent install. Skill in full.

Session

An agent host's conversation, by the id the host delivers to its hooks. magus never mints one: a record with no session is unattributed, and the OS user it carries says whose account ran it. Session in full.

Invocation

One magus process's recorded facts (the targets it finished, their outcomes, the lease it acted as, and the session it ran in when a host delivered one), kept in a repo-scoped store every worktree shares. magus session lists them; the store prunes itself by last-fact age. Invocation in full.

Window

The terminal a command runs in. It keys fire-once notices for a caller no host gave a session, and is never recorded as a session. Window in full.

Job

The unit of delegated work, and one row of the job store: what an orchestrating agent handed out, with its goal, the checkpoint it was cut against, the paths it may write or must not touch, and the one check it runs. A job's holder is either a session, for work an orchestrator handed out, or the daemon, for its own maintenance. The store records; the agent guard is what reads those facts back when grading a write. Job in full.

Run

One target executing under one magus invocation, such as magus run test web or magus affected ci. A run keeps its captured output behind an output reference. Every magus run is a run whether or not any job asked for it; see Job for how the two relate. Run in full.

Lease

The grant a holder takes on a job: the write and read paths that job declared, enforced in the checkout that took it with magus job exec. A job is the piece of work; a lease is permission over it. Lease in full.

Advisor

One read-only check from the advice suite: it reads the changeset through magus and writes one titled section of findings. The same advisors run as a pull request comment in CI and inside magus diff --impact locally. Advisor in full.

Conventions

This page uses none of the site's convention markers. The full set is on the conventions page.