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

Doctrine

Scope records what belongs in the tool. This page records how the tool is allowed to behave: the principles it is built by, the standard any addition is measured against, and the line between decisions magus automates and decisions it hands to you. Each entry names the mechanism that enforces it and the failure it prevents; check them against the tool you are running. An entry whose mechanism does not exist yet is listed at the bottom as a debt, because a rule that lives only in prose is a rule with roughly even odds.

Principles

Unix survives at the verb, not the binary

One tool that does one thing extremely well does not survive contact with a monorepo, and magus does not claim the lineage: a monorepo build tool has to understand several languages, every project in the tree, caching, scheduling, and what a change reaches. That is already many things. What survives the translation is the discipline, relocated to the verb. Each verb answers one question, deterministically, from declared sources, and stops. Output reads at a terminal and parses in a pipe (-o name, -o json, -o template=; the pipe is for people, and the agent guard routes an agent to -o instead, because a pipe replaces the exit status and a failing gate then reads as 0). A non-zero exit means what it has meant for fifty years. Every surface degrades to plain text when there is no terminal to draw on, and the pinned band never takes the screen, the alternate buffer, or your scrollback. Composition happens where a monorepo needs it - in the graph, through ctx.needs - not by pretending the binary can be smaller than the problem.

The scope test governs what a verb may be, and the one-vocabulary rule - target, spell, charm, op, each named once and reused everywhere - keeps the surface predictable. That prevents the failure in both directions: claiming a minimalism the tool cannot carry, and the house dialect with no rule you can hold in your head, the one that makes users look things up forever and then teaches their agents the same confusion.

Capability is not a reason

Building the wrong thing got cheap. Coherent, well-structured, completely misconceived work can be generated in minutes, so a design reading well proves less than it used to, and someone still has to say no to work that would otherwise ship. The default answer to a new capability is no, and the burden of proof is a failure removed, never a preference enabled. The version window needed four dead designs before one passed that bar; the knobs rule is the same principle applied to options.

The mechanism is the scope test, applied in review by reading the diff for what the tool had to learn. It prevents the accretion this project was a reaction to - each addition defending itself, nobody removing anything - now accelerated, because writing the unnecessary thing costs nearly nothing while maintaining it costs what it always did.

Optimize the loop that verifies, never the loop that generates

Producing code was never the bottleneck. Reviewing it and trusting it were, and both got harder as generating got cheap. So every mechanism here attacks the verify side: the cache makes re-checking free, affected makes the check minimal, the drift gate makes generated output self-verifying, the explain lenses make verdicts inspectable, describe file makes a diff triageable. Nothing in magus exists to make producing code faster. That is a commitment, not a gap.

The test for a proposed feature is whose loop it accelerates. A pitch of "produce more, faster" fails by construction; "know sooner, trust cheaper" is at least aimed at the right loop. This prevents magus from becoming a tool whose product is throughput - volume is the one metric that gets easier to move every year and proves less every year, and a build tool that helps ship more unverified work faster has joined the problem it was built against.

The horizon for that test is years. A tool that generates on your behalf compounds dependence: what its operator can ship drifts past what they can judge, and the gap is the crutch. A tool that verifies compounds judgment, one answered question at a time. Automation you can interrogate holds the enforcement half - helpful, never so helpful that the operator stops learning.

A cache is an accelerator, never a dependency

Every cache magus has - the local one, the remote one shared through CI, a published knowledge graph pulled as an OCI artifact - skips work that the machine in front of you could do itself. That is the whole contract. Delete the cache directory, revoke the registry credential, unplug the network, and a clean clone still builds, still gates, still answers. It is slower. It is not broken.

The line to hold: a cache may shorten a derivation, never be the only copy of one. The moment a clean clone cannot proceed without fetching something, the artifact has stopped being a cache and become an undeclared build input, and the questions that follow are the ones no cache should raise. Who can serve it. What happens when they do not. Whether the bytes are the ones the source would have produced, or the ones somebody uploaded. A tool that installs through none of the toolchains it drives, for reasons Scope states as a rule, does not get to quietly depend on a registry for its own derived state either.

This is why the remote cache is verified by a trust set rather than trusted for being reachable, why an unverifiable artifact is a miss rather than a warning, and why magus graph pull is an optimization over magus graph build rather than a step before it. It is also the test for any future store: if switching it off changes an answer rather than a duration, it was never a cache.

The failure it prevents is quiet. A cache that becomes load-bearing does not announce the change; it works, for months, until someone clones fresh on a plane and discovers the build was distributed all along.

Human-first is the AI integration

magus was built for humans, and agents drive it well anyway, because an interface legible to a person is legible to anything. That ordering is the design, and the reason underneath it is structural: models learned to use tools from decades of humans using tools, so a tool that honors the conventions humans settled - exit codes, a working directory that means what it means everywhere, a path as a project's name, plain text - inherits agent competence for free. A tool that invents its own dialect fails both audiences, then watches the models learn its workarounds forever. Buzz is the evidence we have: a language with close to no training data produces better agent output than the most-trained languages on earth, with explicitness the only variable in sight. Weigh that as experience rather than benchmark; it is still the strongest evidence on this page.

The mechanism is an ordering rule with one worked example: no surface is designed for an agent first. The agents key in affected ci --plan is the one agent-specific field in an otherwise human-first surface - the skill-routing hint sits quarantined inside it, so everything around it reads as what it is, ordinary build metadata a person wanted first. The one deliberate exception is the job store, an agent-to-agent declaration under Agents propose, humans dispose: it is written by agents through MCP and read by people at magus ls jobs, so the asymmetry is in who ordinarily authors it, not in who may see or write it. This prevents the bolted-on AI integration, papering over a tool people already struggle with, and the quiet inversion where a person becomes the secondary user of their own build tool.

The floor under the ordering rule is an absent seam: magus never calls a model (Scope records the missing adapter as deliberate). The closest feature, magus diff --prompt, prints the context magus holds for you to paste into your own model, and never a drafted review. Every capability on this surface is a person's to run with no agent anywhere in the loop; the agent surface is additive, never load-bearing. The installed skills are gitignored renderings of the binary, so nothing in CI can drift-gate them; magus doctor's agent-skills check is what observes staleness, per workspace (Scope). A workspace that goes a day, or a Friday, without an agent loses nothing but speed.

Verdicts are provenance-blind; disposition is not

A verdict - the cache saying a replay is honest, the drift gate saying generated output matches source, a diagnostic, a CI result - judges the work. No verdict conditions on who or what produced the change: cache keys hash content, the drift gate compares bytes, diagnostics read the tree. Whether a change was typed by hand or generated is invisible to every gate, on purpose, because good software is the only defensible standard at the tool layer, and a bar that moves with the byline is theater in both directions - extra suspicion for one author, unearned trust for another.

Disposition is the opposite case. Accepting a proposal, sending a review, landing a change: these are accountability, and accountability needs a true name. That is why authorship is stamped from the transport a write arrived on, never from what the writer claims about itself - the mechanism described under Agents propose, humans dispose. The blindness half is structural today and stated here so that a proposal to break it, a gate keyed on how code was written, has to argue with this page first.

Exactly one code path grades a write by who is acting, and naming it is what keeps the rule checkable. gradeLeasedWrite reads the lease ledger to decide whether a worker is editing outside the paths its lease declared. That is a concurrency-ownership question on the guard surface - who owns this file right now - rather than a judgment about the work, and it reaches no cache key, no drift comparison, and no diagnostic. Its uncertainties - no ledger, no live lease, a file that will not parse - fail open with at most an advisory.

Worth cloning

Assume magus can be reproduced. A model given the binary can recover the architecture; given the docs, it can recover the rest, and the cost of doing so falls every year. So no part of this project's value is allowed to rest on that being hard. What cannot be recovered from the artifact is the judgment that produced it: which capabilities were refused and why, what was measured before a mechanism shipped, where the line between the tool and the person was drawn and what it cost to hold. That record is the product, and it is published on purpose. A clone that carries it improves the lives of the people who run it, and a clone that drops it is a different tool wearing the name.

The test for what to build is therefore whether it is better when copied. A vocabulary that another build tool adopts makes every agent better at both. A guard rule that another harness lifts protects someone this project will never meet. A measurement that kills a feature here saves the same feature elsewhere. Each of those returns more to this project when it spreads than it would have kept by staying scarce, because the thing magus optimizes for, people who can still fix their own software, is not a market to corner.

The mechanisms are the license and the absences. GPL-3.0 makes the copy legal and keeps the copy's improvements public. Scope records that no account, paid tier, or capability behind either exists, so there is nothing a clone would have to route around. The refusals ledger and the measurements behind each rule on this page are in the tree, not in anyone's head. This prevents the failure that makes the assumption above dangerous: taking on debt to build a moat that will not exist, and then measuring the project by what it managed to keep from people instead of by what it left them able to do.

The standard

Adapted from Wendell Berry's nine standards for adopting a new tool ("Why I Am Not Going to Buy a Computer", 1987). His subject was a farm; the criteria survive the distance because they are about what a tool owes the person who takes it up. Held against magus in both directions - what magus asks of itself before adding anything, and what you should ask of magus before adopting it:

  1. Cheaper than what it replaces. Total cost: install, learning, upkeep. One binary, no account, nothing to upsell, no toolchain underneath it to break. The honest half: the learning cost is charged up front, and the claim is cheaper over a year, not cheaper in week one.
  2. At least as small in scale. The surface may not outgrow what one person can hold. Enforced today by judgment alone; the ledger that would measure it is a debt, below.
  3. Clearly and demonstrably better. A claim of better needs an artifact someone else can check: the benchmark results, committed with the hardware, the date, and the exact competing tool versions they were taken on; terminal recordings that are captured bytes rather than mockups; the drift gate. The claim that querying the graph beats grepping is argued from mechanism and not yet measured; weigh it accordingly.
  4. Uses less energy. affected and the cache are this criterion implemented: run only what a change reaches, never do the same work twice. The savings are real and currently invisible; a debt, below.
  5. Powered by what the work already produces. Berry said the body's own energy. Here it is the scope test verbatim: every capability reads the model that correctness already forced the build to hold, and the one exception, the release registry, is named there.
  6. Repairable by its user. Refusals carry a next step, every diagnostic code has a page, the host wiring is a template you own, no generated code sits between you and a running build, and the guard fails open with a notice rather than failing silent. The systematic version is missing; a debt, below.
  7. Repairable near home. The cache is a plain store on your disk, the console is loopback-locked, no capability requires a hosted service, the server accelerates and never gates. The exceptions run on infrastructure we operate; Scope names them.
  8. From a shop that will take it back. One maintainer, said plainly, and the mitigations are structural rather than social: a sealed engine kept small, documentation written before announcement, GPLv3 so the tool stays repairable in common if the shop ever closes. Choosing Buzz for its maintainers was this criterion applied to a dependency before we had read it stated.
  9. Disrupts nothing good that already exists. The terminal's decades of contract stay intact: scrollback, selection, the working directory, plain text, your toolchain visible and yours. The console is where this is under active tension, and it ships under a rule: what does not give genuine value over the good thing that already exists should not ship.

Judgment

The entries above say how the tool is built. The rest of the page records when magus automates a decision and when it hands the decision to you.

Agents propose, humans dispose

An agent surface can suggest work; it cannot accept it. magus records authorship from the surface that performed the write, so a change carries the origin the channel delivered (the OS account, the entry point, the credential or host) no matter what the writer reports about itself. Interrupting a person costs attention, and the suggestion operation reflects that: it requires a stated reason before the proposal reaches anyone. The job store is ordinarily written by agents, unlike the attention events notify raises, because an attention event is addressed to a person while a job is an agent-to-agent declaration read back by the guard and the console. A person still has a full door onto it: magus job forks, takes and returns a job, and magus ls jobs reads the plan back. What keeps the book honest is one author per row, enforced by the store rather than by a closed CLI.

Automated review is wrong at a steady rate, and wrong in a characteristic way: the confident finding that "fixes" behavior somebody chose on purpose. The person deciding whether a proposal lands is the one who catches those findings. If magus applied them itself, they would ship unexamined.

The host wiring is yours

magus owns the guard rules and the verdict. It does not own an integration with your agent host. The rules come from one binary and are identical everywhere; the part that knows your host - which event field carries the command, which reply channel reaches the model, what happens when the binary cannot be found - is a template you copy and edit. Adding a host is your change, not a magus release.

The contract is small enough to hold in your head. magus session hook takes the thing to judge on stdin, either plain text or a payload keyed by FIELD (tool_input.command, file_path, prompt), never by a host name or a tool name. -o template= renders the verdict into whatever shape the host's reply takes. TestNoHostSpecificBehaviorInCode fails the build when a host's NAME appears in code anywhere but a path on disk, and the magus-guard-coverage: line each template carries feeds a parity gate that fails when a host was never asked about a decision the contract grew.

A branch keyed on a host's tool vocabulary rather than its name - a switch over Read and Bash - is a per-host branch in everything but spelling, and the name test cannot see it. TestGuardDoesNotBranchOnHostToolVocabulary is the second layer: it fails the build when a host's word for a tool appears as a string literal in guard code at all, so a lookup table is no cheaper than a switch. The activity-event tool labels are magus's own vocabulary for that reason, chosen by which flag the wrapper passed.

A layer that made every host work with no friction is what is being traded away here, and it is worth being plain about the trade. Agent hosts change their event shapes and hook names on their own schedule. A workspace whose integration lives inside magus waits for a magus release to get unblocked; a workspace that owns fifteen lines of shell edits them that afternoon. The cost is charged up front and on purpose: you read your host's hook documentation once, and there is no zero-configuration path.

The second cost of such a layer is the one nobody sees until it matters. A guard you did not wire is a guard whose failure mode you do not know, and this one fails OPEN by design, so a hook that quietly stopped judging looks exactly like a session with nothing to deny. So a shipped template announces its fail-open arms rather than exiting quietly, and TestFailOpenArmsAnnounceThemselves fails the build when one stops. One template is exempt, and the test declares it rather than leaving it to be discovered: the path template stays silent. An empty response on that surface already means allow, a notice on every file edit was judged the worse noise, and hearing about it there is opt-in. Whoever runs the guard should be able to read what it does and repair it without us.

The same holds for credentials: the guard is a seatbelt, not a boundary against a process running as you, which can read any file magus can. So the guard refuses what an agent should not do, and magus separately enforces every layer it can prove, a planted token file that cannot grant more than a mint, a token that never mints a wider one, rather than claiming a sandbox it does not have (Tokens and grants).

A refusal carries its reason

A refusal names the mechanism and a next step. Diagnostics are coded and documented so you can look one up. A stale binary can surface as a typo and a missing tool as a lint finding; where magus can tell the difference, the message says what is happening underneath. The same rule reaches workflow refusals: notes edit declines to rewrite a note's anchors from a pipe, and the error says why anchors are not pipeable and what to do instead.

A denial that says no and nothing else sends you around the tool, and the workaround runs outside the cache and the sandbox, where magus can no longer account for the work. An error that leaves you with no next step is a doctrine bug; file it as one.

Misconfiguration is an error, never a warning

A setting magus cannot honor fails the command that read it. It is not logged and stepped over, not repaired with a default, not carried as a warning nobody reads in a CI log that scrolled past an hour ago.

The reason is what a warning actually communicates. You wrote the setting, so you believe it is in effect; a warning leaves that belief standing while the behavior underneath it is something else. Every subsequent decision rests on a premise the tool already knew was false, and the failure surfaces somewhere far away, as something else, long after the edit that caused it. A tool that knows a value is wrong and proceeds anyway has chosen to be misleading.

So the test for any warning is one question: is the value honored? If it is not, the warning is a bug in disguise, and the fix is to fail. If it is, say nothing, because a warning about something that works is noise that teaches people to skim past the warnings that matter.

The corollary binds the other direction: a knob magus accepts is a knob magus must obey. A field that reads as a retention window while the code enforces a fixed cap, or a flag documented as repeatable that silently keeps the last value, is the same defect as the ignored setting. It just fails later, and reads as a lie rather than an oversight.

Told, never guessed

magus does not guess where it runs in order to change what it does. It does not read CI, GITHUB_ACTIONS or GITLAB_CI, probe for a container, or work out which agent host is calling, and then pick a default, a result, or which provider or feature is on. When a caller needs different behavior, the caller asks for it: a flag, a charm, a key in magus.yaml, or a variable the workflow sets on purpose. The same command does the same work on a laptop, on a runner and inside an agent's shell.

The owner's words, when this was written down: "We should never be doing environment sniffing, ever. Thinking that we're smarter than the developer, or trying to be too clever, is incredibly dangerous."

The danger is the same one the previous entry names, arriving from the other side. A guess is a setting nobody wrote. It cannot be read in the file the reader is already looking at, it cannot be turned off without first learning it exists, and it is wrong exactly where the environment differs from the one its author pictured: a self-hosted runner that looks hosted, a laptop with CI=true exported by a test harness, an agent host that happens to share a field name with another. A command that passed locally and failed in CI because magus noticed it was in CI is the worst kind of red, because the difference is invisible in both places.

Two things are not guessing. The first is adapting to the terminal in front of the person: whether a stream is a terminal, what kind and how big, whether it is reached over ssh, and which window a once-only notice belongs to. That decides how magus talks to them (color, links, hover, which prompt it can show), never what work it does. The second is reading the input a caller actually sent: a flag, an argument, the event a hook was handed. NO_COLOR belongs with them: a person set it to say what they want.

An agent host is a caller like any other, so it says who it is. The hook configuration magus agent harness apply writes names the host explicitly, and a hook invoked without that name is refused rather than defaulted to one host.

TestNoEnvironmentSniffing in conventions_test.go fails the build when code reads a CI, hosting or agent-host variable outside a short list of inputs read after the caller chose them, and the failure says to take a flag instead.

Automation you can interrogate

Each automated verdict has a lens that shows its inputs. affected --explain says why a project is in the affected set. describe target --cache --inputs says what hashed into a cache key. describe file says whether a file is generated and by what. explain gives a graph node's provenance and edges. New behavior ships with its lens in the same change: an action magus cannot account for is a defect in the same class as a wrong answer.

The lens rule has a second half, and it is criterion 6 pointed at the tool itself: a step magus runs on your behalf should be expressible as the toolchain invocation it performed, so a year of running magus leaves you knowing more about go build and your own repository, not less. A spell wraps a tool without hiding it, and there is no shortcut in there where knowing what your toolchain does stops being your job. Helpful, but never so helpful that nobody using the tool learns anything from it.

Manual on purpose

magus could automate each row below, and does not.

stays manual because
disposing an agent request an event that means "blocked on input" or "blocked on approval" exists to reach a person; answering it for them removes the person it exists to reach
applying suggested changes a suggestion lands only when a person accepts it
writing the knowledge store notes are human-authored by construction: there is no author field to spoof, because authorship rides version control
sending a review a remark reaches a colleague under your name; an agent drafts into the session and a person sends the batch

All four would be cheap to build, and cheap is not the test. The test for any future row: does automating the step remove a repetition, or remove a rep? A repetition - the same build run again for no new information - is the tool's to eat, and the cache exists to eat it. A rep - reading the failure, deciding what it means, choosing what lands - is where judgment forms, and a workflow optimized until its operator no longer forms the judgment it depends on has automated the wrong half. Each row above removes the person at the point where the mechanism needs their judgment, so each stays out.

Sending a review is the newest of them and the one with the most surface to give away, so its refusals are worth naming: no review command carries a --publish flag, a self-review is always a comment rather than an approval, and authorship is stamped from the transport a write arrived on rather than from what the writer claims. A batch waits for a person because publishing is one outward-facing act; splitting it into a call per remark would turn the act that needs confirming into a series of small ones nobody confirms.

Corrective competence

The skill this page protects is narrow: your ability to fix the thing yourself when the agent is wrong, or gone. Not speed, and not thinking in general.

Two studies set the target. Bastani et al. measured nearly a thousand high school students with a tutor that handed over answers: 48% better on practice while it was available and 17% worse on the exam once it was taken away, against 127% better and no measurable residual harm for a version prompted to give hints instead.1 Sankaranarayanan found that 77% of novice programmers given unrestricted AI failed a 30-minute maintenance task once the assistant was withdrawn, against 39% of a group whose tool made them explain generated code's causal logic before it would integrate it. The two groups produced equally functional work; the explaining group took about a third longer to do it.2

The mechanisms are already on this page. Notes are human-authored by construction. --ack refuses without a terminal, agent hosts are denied it outright, and the count is shown to nobody but the reader. The guard advises where advice will do and denies only what cannot be undone. magus never calls a model, which is what makes the Friday above an option rather than a slogan.

This repository is built with agents at scale: 113,430 agent-run shell commands in twenty-one days. Our own oversight lapsed too. In 22 of 203 recent sessions the guard was not running, and those sessions carried 17% of all commands. The only reason that number exists is that we went looking for it.3 Whether the surface earns its cost is measured the same way rather than asserted: Benchmarks publishes every run beside the environment that produced it, controls first.

Where this is strained

Friction placed wrong is bureaucracy. A refusal that teaches and one that nags differ in nothing but their message text, and message text rots like any other prose; the doctrine holds while error messages get the same care as code.

The explain lenses cover verdicts magus computes. magus captures and replays the output of the tools a target drives, but it cannot make a third-party tool's reasoning inspectable; the lens stops at the tool boundary.

The host boundary still has costs, but the binary no longer owns host location lists. A harness descriptor declares a configuration path, native event matchers, response template, and skill locations; magus doctor verifies that contract as data, and agent install follows its declared skill paths. A host neither one names can still work through a portable adapter, while a new native host can add a collaborator without a Magus release. The envelope field names remain host-shaped, so a host that spells them differently reshapes its payload before piping it. And the OpenCode plugin carries a type-check and tests because it is real TypeScript, which is more upkeep than a shell template and more than an example should need.

Four rules on this page live only in prose today, and by this page's own standard that makes each a debt. Every one is a read of what magus already records, so each passes the scope test; none is built:

  • The surface ledger (criterion 2): a generated, committed inventory of verbs, flags, config keys, and diagnostic codes, regenerated by generate so the drift gate lands any growth in the diff of the change that caused it, where the person who can say no is already looking. Not a cap - a number nobody can fail to notice.
  • The savings lens (criterion 4): what the cache and the affected set actually bought - runs replayed against runs executed, wall time avoided - as arithmetic over run records that already exist, interrogable like any other verdict. Until it exists, "the cache is worth its complexity" is taken on trust, which is the one way this tool asks not to be taken.
  • The departure test (criterion 1): Scope claims that deleting everything magus wrote leaves magus run build working, and admits the claim is thinner than it sounds. An audit job that strips those artifacts in a throwaway worktree and builds would make the exit guarantee self-verifying instead of asserted.
  • When it breaks (criterion 6): the diagnostics reference covers coded refusals; the failures that never raise a code - a server that did not bind, a watcher gone stale, a cache entry that will not replay - are documented where someone thought to write them down and absent where nobody did. The systematic version is a failure-modes section per concept page, enforced the way this repository already enforces document shape.

The line between automated and manual moves as a mechanism earns confidence. To move a row out of the table above, or a debt off this list, edit this page in the same commit that changes the behavior.

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)
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 internal/agent/guard.go:25, still three decisions
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; memory_mb kept as a slot weight b6abdfe43
rotating the activity trail from its write path deleted rather than keep promising bounded retention to a workspace running no server 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 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.


  1. Hamsa Bastani, Osbert Bastani, Alp Sungu, Haosen Ge, Ozge Kabakci, Rei Mariman, "Generative AI without guardrails can harm learning: Evidence from high school mathematics", PNAS 122(26), e2422633122, 2025, https://doi.org/10.1073/pnas.2422633122. Figures are from the abstract: GPT Base and GPT Tutor practice gains of 48% and 127% over control, a 17% exam reduction for GPT Base, and an effect the authors describe as essentially eradicated for GPT Tutor. Checked 2026-09-10. ↩︎

  2. Sreecharan Sankaranarayanan, "Mitigating Epistemic Debt in Generative AI-Scaffolded Novice Programming using Metacognitive Scripts", arXiv 2602.20206 (preprint, v2 2026-03-31), https://arxiv.org/abs/2602.20206. N=78 novices (CS undergraduates and recent bootcamp graduates), Cursor with Claude 3.5 Sonnet. Failure rates on the AI-blackout maintenance task were 77% unrestricted and 39% with the Explanation Gate; functional utility did not differ (p=.64); the gated group was slower (about 64.6 versus 48.2 minutes, d=1.52). Checked 2026-09-10. ↩︎

  3. Measured in this repository on 2026-09-09 over the Claude Code, Codex and OpenCode transcripts on one machine, using the session-load recipes in the agents guide: 113,430 Bash tool calls in the 21 days to that date; 22 of 203 sessions carried the guard-not-running notice and accounted for 17% of those calls. Reproducible with magus session load over the same transcripts. ↩︎

doctrinedesignjudgmentagentsphilosophyunix
Last updated (a9ff8609)
Earlier changes on this page (7)

Full history ↗ · Blame source ↗

Glossary

Workspace

The magus root directory that owns a set of projects and shared config; the unit magus operates over. See workspace.

Project

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

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. See targets.

Op

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

Spell

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

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. See charms.

Ward

A coded diagnostic that inspects a resolved op and nudges or blocks an anti-pattern before it runs. See wards.

Buzz

The language magusfiles are written in (the .buzz engine). See engines.

Engine

The interpreter a magusfile runs on; magus embeds the Buzz engine. See engines.

Cache

The content-addressed store magus consults before running a target, so unchanged work is skipped. See cache.

Affected

The set of projects touched by a change; magus affected <target> runs a target only over them. See affected.

Sandbox

The restricted filesystem and environment a target runs in, so builds stay reproducible and side-effect-free. See sandbox.

Service

A long-running or shared process magus manages across runs, distinct from a one-shot target. See services.

Server

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. See server.

CI

An ordinary magusfile-defined target you compose yourself with magus\needs - magus does not hardcode its stages. Magus.RunCI treats it specially only in that it strips the rw charm, it is the anchor magus affected ci keys off, and a selected scope with no project declaring it is a load error rather than a silent no-op. See targets.

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). See server.

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. See server.

Remote cache

A CI-only backend that shares content-addressed artifacts across runners: a cold machine replays a build another runner already did instead of rebuilding. Every remote artifact must be signed by a trusted key. See remote.

Knowledge graph

The queryable graph of a workspace's spells, targets, docs, and code relationships; query it with magus query/explain/path. See knowledge.

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. See knowledge.

Ownership

An insight lens: author concentration - the primary author and their share, the distinct-author count (the bus factor), and abandonment. See insight.

Diagnostic code

A stable MGSxxxx identifier attached to a magus warning or error, so it can be referenced and looked up; some are guardrails (see wards), others hard errors.

Scope test

The question every proposed capability has to answer: does it read the model magus already had to build, or does it make magus learn something new about the world? Reads stay small; acquisitions are where a tool loses its shape. See scope.

One-vocabulary rule

Each concept gets one name, used everywhere: target, spell, charm, op. A second word for the same thing is a house dialect, and it costs every reader (and every agent) a lookup that never ends. See doctrine.

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.

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.

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.

Dispose

The human act of closing an attention request: a judgment rendered, recorded with who and why. Distinct from resolving a review thread or a merge conflict - a disposition answers a request; it does not merge anything.

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 server, for its own maintenance. The store records; the agent guard is what reads those facts back when grading a write. See doctrine.

A job is not a run. magus run build web is a run, and no job exists for it. A job causes runs: its check executes as one, and a server job records the invocation of its last one. Jobs are listed with magus ls jobs and in the console's Jobs view; runs are listed in the Runs view.

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.

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.

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.

Conventions

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