§2 of this file is COMPILED from the machinery it describes. If it disagrees with the machinery, the machinery is right and the build is broken. §1 and §3 are authored and change only by owner ruling; their sources are docs/agents/. The whole file is generated by foundry agents — do not hand-edit it, because the next compile reverts you and the guard fails.
Per-project research invariants live beside their code and are not repeated here: foundry/AGENTS.md, eightfold/AGENTS.md, proof-census/AGENTS.md, desert-map/AGENTS.md.
These are judgment laws. They are authored, not compiled, and they change only by owner ruling — which is why they live in a file a person writes rather than in a table a build regenerates.
Each was paid for. Where a law has a scar, the scar is named, because a rule whose cost is invisible gets optimised away by the next person who finds it inconvenient.
A decision that exists only in a conversation does not exist. Rulings go into the maptrail, reasoning into the methods thread, sequence into commits. If you find yourself about to rely on something "we agreed earlier", stop and go read the artifact — and if the artifact does not say it, the agreement is not binding, however clearly you remember it.
The corollary is stronger than the rule: provenance is emitted at event time, by the machinery performing the act. A trail composed afterwards from what someone remembers is a reconstruction wearing a record's clothes. This is why writing and recording are one step and not two.
A guard is a rule someone must respect. Physics is a state the system cannot occupy. Where both are available at comparable cost, take physics.
The frontier is the standing example: reserved rows are not withheld from capture, they are never captured at all, so predictions are hashed before their frames exist. That is strictly stronger than withholding frames that already exist, because it removes the person from the loop entirely. The write surface being a separate binary is the same move: a verb absent from what ships cannot be typed by someone who should not hold it.
The scar: three guards once checked row names and a reserved region was reproduced under a different name. Every guard passed. Only an unrelated failure stopped the capture. Reservation is a property of the region, not of the label above it.
Say what the machinery actually does before saying what it means. Investigate before proposing: check whether the eight copies had really drifted rather than asserting the smell.
This is not thoroughness for its own sake. A conclusion reached before the expression is a hypothesis that will recruit evidence; a conclusion reached after it is a finding. The difference shows up later, as the thing nobody can reproduce.
Where a declaration and a measurement disagree, the measurement wins and the disagreement is preserved, not resolved quietly.
A derived census once corrected a hand-written list of confounded rows — finding six where three had been
named, acquitting one that had been accused, and catching one inside an already-frozen artifact. Rows
that declare themselves flat but move are carried as declared_flat_but_moves rather than reconciled to
either side. The disagreement is the finding.
An unfinished thing in a known state beats a finished thing in an unknown one. Leave the tree green, the artifacts fresh, the trail written, and the next question named. If you cannot finish, finish the part that verifies and say plainly what you left.
Act through foundry verbs. Never write an artifact directly.
The verbs carry the emission, the refusals, and the guards. A hand-written artifact is a write that escaped its own provenance: no maptrail record, no freshness stamp, no roster check, no reservation guard. It will look exactly like a legitimate one and will be indistinguishable from it later — which is the whole problem, because the archive's value is that every row in it can say where it came from.
If a verb does not exist for what you need, that is the finding. Say so and stop; do not route around the front door by writing the file yourself. Adding the verb is cheap. Discovering in six months that one artifact has no provenance and nobody can say which is not.
The same rule covers deletion and repair. Frozen bytes stay byte-identical forever, pre-reading declarations are epistemically frozen even where they are not mechanically frozen, and append-only logs are corrected by appending — never by editing the record that was wrong.
Everything below is read from the machinery at build time. Nothing here is a description someone maintained by hand.
Act through these. A verb's consumes column is its refusal: the dispatch will not run it against a compiled artifact whose sources have moved. A producer consumes nothing, which is why no verb needs an exemption.
| verb | refuses on stale | what it does | |
|---|---|---|---|
foundry agents |
lifted | observatory.db |
compile AGENTS.md from the machinery |
foundry audit |
lifted | — | what is lifted, what is delegated |
foundry census |
lifted | — | batch census: declare / verify / list |
foundry db |
lifted | — | compile observatory.db from the hashed artifacts |
foundry fresh |
lifted | — | freshness of every compiled artifact |
foundry frontier |
lifted | — | reserved rows (declared, not captured) |
foundry guards |
lifted | — | reservation guard status |
foundry migrate |
lifted | — | one-time history: status / run |
foundry next |
lifted | observatory.db |
compile NEXT.md from the trail |
foundry open |
lifted | — | open items, replayed from the trail |
foundry queries |
lifted | observatory.db |
the worked queries: list / refresh their outputs |
foundry roster |
lifted | observatory.db |
which rows are ELIGIBLE to be rostered, and why the rest are not |
foundry supply |
lifted | observatory.db |
how many rows of a class exist, are built, remain |
foundry trail |
lifted | — | maptrail records |
foundry ambient-census |
delegated | — | ground-set width across every ramp |
foundry bimodality-fill |
delegated | — | BC minus matched-r control mean, retro-filled |
foundry catalog |
delegated | — | compile the catalog from panels + extractor |
foundry mint-prereg |
delegated | observatory.db |
mint a prereg from a slated candidate |
foundry reach-census |
delegated | — | reach classes over the atlas |
foundry wave |
delegated | observatory.db |
one Helm wave: sweep, screen, slate |
14 lifted, 6 delegated. Delegated verbs still hold their logic in dev/; freshness reaches them at the boundary but event-time emission cannot, since emitting on a script's behalf from outside is the reconstruction the trail exists to prevent. That count only goes down.
A candidate reaching the slate has passed all of these, in order. fired counts how many times each has actually disposed of a candidate, per disposition, across every wave so far. One rule can carry more than one verdict: null-missing HOLDS a bet with no typed null yet and REJECTS one consuming a seal-prohibited descriptor.
| screen | disposition(s) | fired |
|---|---|---|
null-missing |
HELD / REJECTED | HELD 161 · REJECTED 328 |
netting |
REJECTED | REJECTED 165 |
F2-foreclosed |
REJECTED | REJECTED 0 |
degenerate-series |
REJECTED | REJECTED 0 |
structurally-flat |
REJECTED | REJECTED 0 |
power-fail |
HELD | HELD 1262 |
path-gated |
HELD | HELD 3 |
definitional-consumption |
REJECTED | REJECTED 7 |
needs-r-stratification |
HELD | HELD 0 |
size-marginal |
REJECTED | REJECTED 7 |
needs-r-conditioning |
HELD | HELD 2 |
population-mismatch |
HELD | HELD 0 |
12 screens. A screen added to helm/screens.py appears here on the next compile without anyone remembering to add it.
hardmap verify runs 11 checks. All must pass before anything is committed.
- Gates inspected something (meta-gate)
- Suspicious cleanliness (tidy-number gate)
- Lift denominators match (acc and null share rows)
- Anatomy passports complete + bridges pinned
- Stratified V known-answer gate (defect #15)
- Cramér's V in [0,1]
- Factors k* inside verdict interval
- Netted association <= raw (Cai-Chen)
- Point estimates inside their CIs
- Census Jaccard in [0,1] and below plurality line
- Contingency marginals sum to n
16 rows are reserved. They are declared and not captured — no frames exist for them, which is what lets predictions be hashed before their frames do.
This page reports the count, not the list. Not because the identities are secret — QUERIES.md Q6 (hardmap query frontier) publishes them, and a reserved row has no frames and no catalog cells, so there is nothing measured about it to leak. The reason is narrower: a list with a canonical home one query away, which changes with every batch, has no business being copied into a compiled guide. If you need to know whether a specific row is reserved, run the query — or build the batch and let the guards answer.
Not verbs. Named, ordered, applied once, checksummed.
| migration | state |
|---|---|
0001-census-schema-history |
applied |
0002-typing-precedence-backfill |
applied |
7 items, in declared order — compiled from the same trail as NEXT.md, which carries the full statement of each.
- Decide the REACH-assignment capture path —
assignment-capture-path - Declare the nine within-instance dials for batch 11, one per row, at session start —
batch-11-ramp-declarations - An exclusion-at-birth cannot be re-derived — the record names no generator sha —
exclusion-records-carry-no-code-provenance - Contact sheet for steiner-forest's dual-motion trajectory —
steiner-forest-contact-sheet - Find an ambient-stable framing for covering-radius, or let the exclusion stand —
covering-radius-framing - Whether the five in-use family ramps are secretly thresholds (Q20) —
lexicon-v3-question - Lift the six delegated verbs out of dev/ into the library —
lift-delegated-verbs
What follows is authored. It is the list of things an agent does not decide.
Everything else is ordinary work: build it, verify it, report it. The point of naming the exceptions precisely is so the rest can proceed without asking — an agent that escalates everything is as useless as one that escalates nothing, and rather more annoying.
| Situation | What to do | Why it is not yours to call |
|---|---|---|
| Anything touching reserved ground — capturing a reserved row, releasing a reservation, changing the reserved fraction, or building a region that might reproduce a reserved one | Stop and ask. Report the row, the region, and how you noticed. | Reserved rows are the blindness mechanism. A capture cannot be undone: once a frame exists, no ruling can restore the state where predictions were sealed before it. |
| Minting, voiding, or amending a preregistration | Stop and ask. Bring the candidate record and the honest power number. | A seal is a claim about what was known when. Only the owner can make one, and a void is a judgement about a claim already on the record. |
| A schema version bump — any change to an extraction rule, a descriptor, or a declared shape | Stop and ask. Name the old rule, the new rule, and what it does to existing rows. | F4: a changed rule is a new version. Whether the change is worth the discontinuity is a research call, not an engineering one. |
| Two rules that appear to conflict | Stop and ask — and say which way you would resolve it and why. | See the precedent below. |
| An artifact and its documentation disagree | The artifact is right. Say so, stop, and do not "fix" either to match the other. | The disagreement is evidence. A doc corrected to match a wrong artifact destroys it; an artifact corrected to match a doc is a write that escaped its provenance. |
| A test encodes the defect as its expectation | Stop and ask. Show the test and what it asserts. | It happened: a green suite certified consistency with the code, not correctness. Fixing the fixture is usually right and is never obviously right. |
Irreversibility loses ties. Where two rules point different ways and neither obviously governs, take the recoverable branch — and where the choice is outcome-blind, take the one that can be undone.
The standing example is §0.1 over §5. Section 5 said reserved rows are captured last in the batch; section 0.1 said predictions must be hashed before their frames exist. Read together, the stronger reading is that reserved rows are declared and never captured — "last" meaning after the wave's predictions are sealed. The stricter rule was adopted not because it was written more forcefully but because the looser one is unrecoverable if wrong: frames that exist cannot be made not to exist, while frames that do not exist can always be built later.
The related case: a partial release of the optimization rows was ruled over a full one on exactly this ground — recoverable beats irreversible wherever the choice is outcome-blind.
Bring three things: what you found, what you would do, and what it costs if you are wrong in each direction. A question with a recommendation attached is a decision the owner can make in a sentence. A question without one is a research task handed upward.
Do the parts that do not depend on the answer first. Then ask.