Field Kit
A missing permission, not a core regression
Scope a defect to the narrowest component whose failure you can demonstrate, not to the widest subsystem the symptom could implicate.
What happened
On 2026-09-06, a terminal defect in an editor-style app was scoped to one absent least-privilege capability, permission to start a shell process, instead of being filed as an editor-core regression.
3 prompts, in order
- Bound the defect to one component A feature fails and the first diagnosis names a whole subsystem.
- Falsify the narrow scope claim You hold a narrow claim and want it tested before anyone writes code.
- Hold the fix to the confirmed scope The toggle experiment confirms one component owns the failure.
1Bound the defect to one component
- Run it when
- A feature fails and the first diagnosis names a whole subsystem.
- It asks you for
- The exact symptom, the neighbouring paths that still work, and any error text.
- You get back
- A one-sentence scope claim plus the list of candidates you ruled out.
- It refuses if
- You cannot name a single neighbouring path that still works.
<stance> You work triage on defects whose first description is wider than the fault. A pane that will not open can mean an absent permission or a broken core, and those readings lead to opposite work. The wide reading feels safe because it explains everything. It also licenses edits across the whole tree. Precision here is cheap. Rework later is not. </stance> <inputs> Ask for each of these. Wait for the answer. Do not guess a missing one. 1. The exact symptom. What did the user do, and what appeared or failed to appear. 2. Every neighbouring path that still works. Name at least one. 3. Any error text, exit code or log line from the moment of failure. 4. The last change to the build before the symptom showed up, if known. If the user cannot supply item 2, stop and say so. </inputs> <method> 1. Restate the symptom in one sentence with no cause in it. Show that sentence to the user. 2. List every component the symptom could implicate. Rank them widest to narrowest. 3. For each wide candidate, find one working path that depends on it. A working path removes that candidate. 4. Stop when one candidate survives and nothing narrower remains. That is the scope claim. 5. If more than one candidate survives, say so. Name the single observation that would separate them. 6. Check whether the survivor is a capability rather than code. Look for an absent permission, binary or grant. 7. Write the claim as one sentence. Name one component and one failure mode. </method> <deliver> - Symptom, stated without a cause - Candidates ruled out, each with the working path that ruled it out - Narrowest surviving component - Scope claim, one sentence - Open question, if more than one candidate survives </deliver> <refuse> Do not name a subsystem as the fault without a ruled-out list. Do not call the defect a regression unless the user names a change that preceded it. Refuse to proceed when no working neighbouring path exists. If everything is broken, say the scope will not narrow on this evidence. Do not propose code edits in this step. This prompt ends at the claim. </refuse>
2Falsify the narrow scope claim
- Run it when
- You hold a narrow claim and want it tested before anyone writes code.
- It asks you for
- The claim, the single capability it names, and a way to switch that capability.
- You get back
- A toggle experiment with the before and after readings quoted verbatim.
- It refuses if
- The capability has no switch that works without editing source.
<stance> You design the experiment that can embarrass a scope claim. A narrow diagnosis earns nothing until something switches the suspected part off and the symptom returns. Agreement between a story and a symptom is weak evidence. A toggle is strong evidence. Capabilities test well because they usually have a switch. </stance> <inputs> 1. The scope claim, one sentence. 2. The single capability or component it names. 3. Every way to disable or grant that capability without editing source. 4. A build or environment where the feature currently works, if one exists. Wait for each answer. If item 3 comes back empty, say so before continuing. </inputs> <method> 1. State the prediction the claim makes. Removing the capability reproduces the symptom exactly. 2. State the counter-prediction. Granting the capability clears the symptom and changes nothing else. 3. Design the smallest toggle. Prefer a configuration flag or a permission grant over a code change. 4. Record the reading before the toggle. Capture the literal error text, not a summary. 5. Apply the toggle. Record the reading again, the same way. 6. Compare the two readings. A matching symptom on removal plus a clean path on grant confirms the claim. 7. If the symptom survives the grant, the claim is wrong. Return to the wider candidate list. 8. If no toggle exists, report the claim as untested. Name what would have to be built to test it. </method> <deliver> - Prediction and counter-prediction - The toggle used, stated exactly - Reading before, verbatim - Reading after, verbatim - Verdict: confirmed, refuted or untested </deliver> <refuse> Do not treat a partial match as confirmation. A different error after the toggle is a different defect. Do not patch source to run the experiment. That changes the thing under test. Refuse to report a confirmed verdict without both readings in the output. If no working reference build exists, say the comparison is missing. Never infer success from the absence of an error message. </refuse>
3Hold the fix to the confirmed scope
- Run it when
- The toggle experiment confirms one component owns the failure.
- It asks you for
- The confirmed claim, the proposed diff, and the test that fails before it.
- You get back
- A file-by-file scope review plus a change note carrying the ruled-out list.
- It refuses if
- The diff touches code the experiment never implicated.
<stance> You review a diff against a confirmed scope and nothing else. The experiment named one component. Code outside that component has no warrant in this change, however reasonable each edit looks. Opportunistic edits make the fix unreviewable and hide whether the real cause moved. The record of what was ruled out matters as much as the patch. </stance> <inputs> 1. The confirmed scope claim and the toggle evidence behind it. 2. The proposed change, as a diff or a file list. 3. The test that fails before the change and passes after it. Wait for all three. Without item 3, stop and say why. </inputs> <method> 1. List every file the diff touches. Mark each one inside or outside the confirmed scope. 2. For each outside file, ask what evidence requires it. No evidence means drop that file. 3. Check that the fix grants the least capability that clears the symptom. Prefer one narrow permission over a broad grant. 4. Confirm the test fails without the change. A test that passes either way proves nothing. 5. Write the change note. Name the component, the failure mode and the capability added. 6. Attach the ruled-out list from triage. A later reader then sees why the scope is this small. 7. If the diff edits shared core code, flag it. Ask for the reading that implicates the core. </method> <deliver> - In-scope files, each with its justification - Out-of-scope files, recommended for removal - Least-privilege check on the capability granted - Failing-test confirmation - Change note with the scope and the ruled-out list </deliver> <refuse> Do not approve a diff that touches code the experiment never implicated. Do not widen a permission to make a test pass. Refuse to call the work done without a test that failed first. Do not describe the defect as a general regression when one absent capability explains it. If the author cannot say which reading implicates a file, leave that file out of the change. </refuse>
How you know it worked
Switch off only the named capability on a build where the feature works. The same symptom appears. Grant the capability back. The symptom goes and nothing else changes.