---
title: A record of refusals
order: 4
description: Capabilities magus could have had and does not, or had and removed, with what decided each and where to check it.
tags: [design, refusals, decisions]
---

# 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](../concepts/concurrency.md)                                              |
| 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](../concepts/concurrency.md)                                                                               |
| 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](../scope.md#where-others-drew-it)                                                                               |
| a paid tier, an account, a capability behind either                                                                           | never built; there is nothing to upsell                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | [Scope](../scope.md#the-line)                                                                                           |
| generating code your build depends on                                                                                         | never built; nothing magus writes into your repository has to exist for `magus run build` to work                                                                                                                                                                                                                                                                                                                                                                                                                               | [Scope](../scope.md#the-line)                                                                                           |
| 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`](https://github.com/egladman/magus/tree/main/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](https://github.com/egladman/magus/blob/main/CONTRIBUTING.md#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](../decisions/0009-cost-profiles-for-agent-sessions.md)                  |
| 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](../decisions/0009-cost-profiles-for-agent-sessions.md)          |
| 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](../scope.md#where-others-drew-it); [the Go SDK](../reference/go-sdk.md#what-the-sdk-leaves-out)                 |
| 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](../decisions/0009-cost-profiles-for-agent-sessions.md); [Human in the loop](principles/human-in-the-loop.md) |
| 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](../decisions/0009-cost-profiles-for-agent-sessions.md), 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](../decisions/0009-cost-profiles-for-agent-sessions.md), 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](../decisions/0009-cost-profiles-for-agent-sessions.md)          |
| 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](../decisions/0009-cost-profiles-for-agent-sessions.md), 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](../decisions/0009-cost-profiles-for-agent-sessions.md), 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](principles/human-first-is-the-ai-integration.md) rules out                                                                                                                                                                                                                                                          | [ADR 0009](../decisions/0009-cost-profiles-for-agent-sessions.md), 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](../decisions/0009-cost-profiles-for-agent-sessions.md), 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](../decisions/0014-running-magus-is-the-consent.md)                                                           |
| 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](../decisions/0015-a-call-runs-where-its-line-says.md)                                                        |
| 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](../decisions/0016-vcs-lists-the-person-stages.md), 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.
