An agent can produce more correct-looking code in a day than a team can understand in a week. Nothing stops that except a rule about what you are allowed to merge. Every team says it wants to understand its own code. A standard is what turns that sentiment into something you can adopt, cite in a policy, check in a pull request, and argue about when it gets inconvenient. This is that document, and it is deliberately short.
github.com/tacoda/fulcorum-comprehension-standardThe whole standard is one law, one block of four fields, and a bar for when it's enforced. Three moves put it into a repo. Read the rest of the page afterward if you want the reasoning.
git clone https://github.com/tacoda/fulcorum-comprehension-standard.git
# 1. the claim: every PR now asks for four fields
cp fulcorum-comprehension-standard/.github/pull_request_template.md .github/
# 2. the gate: refuse a PR whose block is missing or unfilled
cp fulcorum-comprehension-standard/hooks/comprehension-gate.py .github/scripts/
# 3. the law: put it where the agent reads it, not just where people do
cat fulcorum-comprehension-standard/LAW.md >> CLAUDE.md
Then decide one thing as a team and write it down: which changes require which level (section 4). That decision is the standard. Everything else is plumbing.
Wiring this up takes an afternoon. Meaning it takes longer, because the first week it will block a change somebody wants merged, and the standard is only worth anything if it holds that week. A gate the team routinely waves through is worse than no gate: it teaches people that written rules here are decorative.
Everything below is machinery for enforcing a single sentence.
Don't merge a change you can't explain. Not to a reviewer, not to the agent, not out loud in your own words. If you cannot say what it does, you have not finished reading it.
"Explain" is doing real work in that sentence, so pin it down. Explaining is not summarizing the diff back. A diff summary is a restatement of syntax, and the agent will write you a beautiful one on request. Explaining means you can say what the change does to the system, where it enters and where it leaves, what rule it obeys, and what would have to be true for it to be wrong. Those four things are section 2.
The law binds the person who merges, not the person or process that wrote the code. This is the point. When an agent writes the change, authorship stops being a useful place to put accountability, because the author has none: it doesn't get paged, doesn't sit in the postmortem, doesn't answer for the outage. Merging is the last human decision in the chain, so that is where the obligation lands.
Guidelines lose to deadlines, quietly and every time. The one obligation that cannot be delegated to a tool is the obligation to understand, so it gets stated as an absolute and the exceptions get written down in advance (section 4) rather than invented under pressure.
"I understand it" is unfalsifiable. Four short fields are not. This block goes in the pull request body, written by the person asking for the merge.
comprehension:
does: <what this change does to the system, in one sentence>
seam: <where it enters> -> <where it leaves>
policy: <the rule or doc this obeys> | CHARTER-GAP
falsifier: <the case that would make this wrong>
covered by: <test name> | NONE
CHARTER-GAP and open the gap as an issue. That is a finding, not a failure, and it is one of the more valuable things a junior produces.
NONE is permitted, and it means you shipped a declared risk instead of a hidden one.
Four fields, well under a minute when you actually understand the change, and genuinely hard when you don't. That asymmetry is the entire mechanism. The block is not paperwork about the work, it is the shortest test that the work was understood.
Asking the agent to write your comprehension block produces four fluent, plausible, often correct sentences and teaches you nothing, which inverts the point of the exercise. Write it first, in your own words. Then, if you like, ask the agent to argue with it. Getting corrected after you have committed to an answer is how the judgment actually forms.
Understanding is not binary, so the standard grades it. Each level is defined by evidence somebody else can check, not by how confident the author feels.
| Level | The claim | Observable evidence |
|---|---|---|
| L0 Passing | "The tests passed." | A green pipeline. No claim is made about the change itself, and none should be inferred from green. |
| L1 Restatement | "I can say what it does and where it lands." | does and seam filled and accurate. The author can restate both without opening the diff again. |
| L2 Falsification | "I can say how it would be wrong, and I checked." | All four fields filled. falsifier is covered by a named test, and that test goes red when the change is reverted or broken. |
| L3 Defense | "I can say why this way and not the other way." | L2, plus the author names the alternative that was not taken and why this one is the choice the codebase's policy requires. Survives a reviewer arguing the alternative. |
The jump from L1 to L2 is the one that matters and the one people skip. L1 is a description, and an agent can hand you a correct description of code that is quietly wrong. L2 requires you to have imagined the failure and gone looking for it. That is the habit the whole standard exists to install, and it is exactly the habit that shipping-fast erodes first.
L3 is where architecture lives. Most contested engineering decisions have several answers that all work, and the right one is the one consistent with how this system already does things. An agent optimizes for a working answer and has no stake in that consistency, which is why drift compounds silently in agent-heavy codebases.
A level describes a change at merge time, not an engineer's seniority. A staff engineer merges an L1 dependency bump on Tuesday. A first-year engineer merges an L3 change to a pricing rule on Wednesday. Reading the levels as a career ladder is the fastest way to turn a useful tool into an insult.
A standard that demands maximum rigor everywhere gets ignored everywhere. Set the bar at L2, raise it to L3 where being wrong is expensive, and write the exemptions down before you need them.
One rule of thumb keeps the L3 list honest: ask what the cost is of being confidently wrong. If the answer is a refund program, an incident, a regulator, or a migration you cannot reverse, it is L3. If the answer is a follow-up commit, it is L2.
The bar does not erode by being argued down. It erodes by exemption creep: one urgent change waved through, then the next one citing the first as precedent. If you skip the bar, record that you skipped it and why, in the PR, in the same block. A logged exception is a decision. An unlogged one is a new default.
Conformance is a property of a team's process. There is no auditor, no badge, and no way to fail it other than by not doing it.
A team conforms to CS v0.1 if all five of these hold:
CHARTER-GAP is routed somewhere a human owns and answers. If it is only typed into a box and never read, field three of the block is theater.
falsifier is not reviewing comprehension. Reverse-review is the exercise that trains this.
Every conformance item describes something the team does, never something a person scores. This is not politeness. A standard that produces per-person numbers becomes a performance instrument within a quarter, and the moment it does, people optimize the number instead of the understanding, and you have paid for the ceremony without buying the comprehension.
A template that asks for the claim, and a gate that refuses a pull request without one. Both are short enough to read in full, which is deliberate.
## What and why
<!-- Required by the Comprehension Standard v0.1. Write this yourself,
before you ask the agent for anything. Level: L2 default, L3 for
money, security, data integrity, or a written policy. -->
```comprehension
does:
seam:
policy:
falsifier:
covered by:
```
level: L2
exception: none
import re, sys
REQUIRED = ("does", "seam", "policy", "falsifier")
PLACEHOLDER = re.compile(r"^(todo|tbd|n/?a|\.+|\?+)$", re.I)
def check(body):
block = re.search(r"```comprehension\n(.*?)```", body, re.S)
if not block:
return ["no comprehension block in the PR body"]
text = block.group(1)
# [ \t] not \s: \s spans newlines, so an empty field eats the next one
fields = dict(re.findall(r"^[ \t]*(\w+):[ \t]*(.*)$", text, re.M))
problems = []
for name in REQUIRED:
value = fields.get(name, "").strip()
if not value:
problems.append(f"{name}: empty")
elif PLACEHOLDER.match(value):
problems.append(f"{name}: placeholder ({value!r})")
falsifier = fields.get("falsifier", "").strip()
if falsifier and falsifier.upper() != "NONE":
if not re.search(r"covered by:[ \t]*\S+", text):
problems.append("falsifier: named, but no covering test")
return problems
if __name__ == "__main__":
found = check(sys.stdin.read())
for p in found:
print(f"comprehension-gate: {p}")
sys.exit(1 if found else 0)
Roughly twenty-five lines, and that is the whole enforceable surface. Everything else in this document is a decision a team makes, which is the correct division of labor: machines are good at insisting a step happened, and bad at judging whether it happened well.
It checks that four fields exist and are not placeholders. It has no opinion about whether the sentences are true. A confident, articulate, entirely wrong block passes cleanly, and any honest description of this standard has to say so. The gate buys one thing: nobody merges without making the claim, and a claim on the record is something a reviewer can dispute. Disputing it is human work. Reverse-review is how a team gets good at that work.
What this standard refuses to be, and where it is most likely to fail you. Both stated before you adopt it rather than after.
falsifier is the field people fake first. The tell is a falsifier that restates the happy path inverted ("it would be wrong if it returned the wrong value"). A real falsifier names a specific input and a specific wrong outcome.Diffs and reviews. Never people. If your adoption of this standard ends with a dashboard ranking engineers, you have built something else and should stop calling it this.
v0.1, CC BY 4.0. Forking is the expected case, not the exception.
seam for blast-radius. A team on regulated data might add data-class. Four to five fields is the working range; past that, people stop reading them.The standard sets the bar. Reverse-review is the weekly exercise that trains people to clear it and to dispute a claim that only looks cleared. The junior-to-senior workshop is the one-hour lab where the whole idea starts, with a green test suite and a customer quietly overcharged a nickel.