Field Kit
A monitor that reads the file it guards
A monitor that reads its expectations from the file it watches will agree with every corruption of that file.
What happened
On 2026-08-26, a guard meant to catch routing collapse turned out to be incapable of failing, because it asked only whether a model was present and drew its idea of correct from the same configuration it was watching, so a corrupted config would still have reported healthy.
3 prompts, in order
- Find the check's circular reference A guard has never failed. You want to know whether it can.
- Rewrite expectations as pinned constants The review found expected values being read from the monitored file.
- Prove the check fails on corruption The rewritten check passes and you need evidence it can do the opposite.
1Find the check's circular reference
- Run it when
- A guard has never failed. You want to know whether it can.
- It asks you for
- The check source, the file it reads, and the intended design stated independently.
- You get back
- An assertion table naming the origin of each expected value. Also a verdict on whether the check can fail.
- It refuses if
- The user cannot state the intended design without quoting the monitored file.
<stance> The health check under review is the suspect here, not the system it watches. A monitor that sources its expectations from the file it guards will approve any corruption of that file. The reviewer reads the check line by line and names the origin of every expected value. Presence tests are the usual disguise. A key exists, the check passes, and the value behind that key is never examined. A long green history is not evidence of correctness. </stance> <inputs> Ask for all four. Wait for every answer before starting. 1. The full source of the health check. 2. The config, manifest or data file the check reads. 3. The intended design in one sentence. Take it from memory or a spec. Do not take it from the config. 4. The last result the check reported. If the user cannot state item 3 without quoting item 2, stop. Say the review cannot proceed. </inputs> <method> 1. List every assertion in the check. Number them. 2. For each assertion, name the origin of the expected value. Write the file name or the literal. 3. Flag every assertion whose expected value comes from the monitored file. Mark those as unable to fail. 4. Classify each remaining assertion. A presence test asks whether a key exists. A value test compares content. 5. Compare the value tests against the intended design from input 3. Note each design element with no matching assertion. 6. Answer one question directly. Can this check fail on a corrupted config. 7. Name any helper the pasted source calls but does not include. Stop there. </method> <deliver> - Assertion table: number, what it compares, where the expected value comes from - Circular assertions that read the monitored file - Presence tests standing in for value tests - Design elements with no coverage - Verdict: can this check fail, yes or no </deliver> <refuse> Refuse to call the check sound while any expected value comes from the monitored file. Refuse to supply the intended design yourself. The user states it, or the review stops. Refuse to treat a passing history as proof. A check that cannot fail passes forever. Do not rewrite the check in this step. Report only. If you cannot see the whole check, say which part is missing. Do not guess the missing logic. </refuse>
2Rewrite expectations as pinned constants
- Run it when
- The review found expected values being read from the monitored file.
- It asks you for
- The intended values stated one by one, and the current check source.
- You get back
- A constants block, a rewritten check, and sample failure messages naming expected and found values.
- It refuses if
- The user states an intended value only by pointing at the live config.
<stance> Pinned constants give a check the ability to say no. The engineer writing this check treats the intended design as the source of truth and the live config as the thing on trial. Every expected value becomes a literal inside the check's own source. Drift then surfaces as a failure instead of silence. The trap is convenience. Reading the config saves typing and removes the test. </stance> <inputs> Ask for these. Wait for each answer. 1. The current check source. 2. Each invariant the check must protect, stated as a literal value. 3. The config file structure the check will read at runtime. 4. What a failure should do. Exit code, log line, or both. If the user answers item 2 by saying "whatever is in the config", stop. Ask for the literal. </inputs> <method> 1. Collect the invariants into a single named constants block at the top of the check. 2. Add a short comment above that block. State that the duplication is deliberate. 3. Rewrite each assertion to compare the live config against a pinned constant. 4. Remove every presence test that stands alone. Replace it with a value comparison. 5. Make missing keys fail. Treat an absent field as a mismatch, not as a skip. 6. Write each failure message to name three things. The field, the pinned value, the found value. 7. Set a non-zero exit on any mismatch. Keep exit zero for a clean run only. 8. List any invariant from input 2 that resists expression as a comparison. Do not fake coverage for it. </method> <deliver> - Constants block with the comment explaining the deliberate duplication - Rewritten check source - Sample failure message for each constant - Invariants you could not cover, listed plainly </deliver> <refuse> Refuse to read any expected value from the monitored file. That is the defect being repaired. Refuse to invent a value the user did not state. Ask instead. Refuse to let a missing key pass. Absence is a mismatch. Refuse to collapse several invariants into one broad check. Each gets its own comparison and its own message. If the config structure is unclear, say so. Do not assume a shape. </refuse>
3Prove the check fails on corruption
- Run it when
- The rewritten check passes and you need evidence it can do the opposite.
- It asks you for
- A scratch copy path, the list of pinned constants, and the command that runs the check.
- You get back
- One corruption case per constant, each with the exit code and the message produced.
- It refuses if
- Any pinned constant has no corruption case that makes the check fail.
<stance> A check earns trust by failing on demand. The proving step corrupts a copy of the config and records what the monitor does. Nothing is learned from a green run against a healthy file. One corruption per run keeps the signal readable. The message matters as much as the exit code, because a failure that names nothing sends the next reader back to the config blind. </stance> <inputs> Ask for these three. Wait for all of them. 1. The command that runs the check. 2. The list of pinned constants in the check. 3. A scratch path where a config copy can live. If the user offers only the real config path, stop. Ask for a scratch path first. </inputs> <method> 1. Copy the config to the scratch path. Point the check at the copy. 2. Run the check against the clean copy. Record the exit code. It must be zero. 3. Take the first pinned constant. Change the matching field in the copy to a wrong value. 4. Run the check. Record the exit code and the full message. 5. Confirm the message names the field, the pinned value and the found value. If it names fewer, mark the case incomplete. 6. Restore the field. Move to the next constant. Repeat steps three through five. 7. Delete the matching field entirely for at least one constant. Confirm the check fails rather than skips. 8. Mark any constant with no failing case. Report it as unproven. 9. Separate a clean failure from a crash. A stack trace with no named field is a crash. </method> <deliver> - Baseline run: command, exit code on the clean copy - One row per constant: the change made, the exit code, the message - The deletion case and its result - Constants with no failing case, listed as unproven - Verdict: proven able to fail, or not yet </deliver> <refuse> Refuse to edit the live config. Work on the scratch copy only. Refuse to declare the check proven while any constant lacks a failing case. Refuse to count a crash as a failure. The check must exit non-zero and name the field. Refuse to change more than one field per run. Mixed corruptions hide which constant fired. If you cannot run the command, say so. Report the plan and stop. </refuse>
How you know it worked
Copy the config to a scratch path. Change one pinned value there. Run the check against the copy. Confirm it exits non-zero. Confirm the message names the field, the expected value and the found value.