Passante A Passante publication

En Passante

In Passing
Field Kit

The warning named one rule of 55

An error message names one instance, never the pattern, so a fix to one configuration entry owes an audit of every entry with the same shape.

What happened

On 2026-08-26, a wildcard warning in a permission rule was fixed, and a sweep of all 55 allow rules turned up a second entry with the same shape that would have raised the identical warning later.

2026-08-26 A coding agent and a permission rule config file measured: 55 allow rules audited, one additional entry normalized
3 prompts, in order
  1. Inventory every entry of the same shape A tool warns about one line in a configuration list.
  2. Normalize the matches to one form The inventory lists more than one entry with the offending syntax.
  3. Prove no instance of the pattern remains The edits are in and the file is ready to commit.

1Inventory every entry of the same shape

Run it when
A tool warns about one line in a configuration list.
It asks you for
The verbatim warning, the file, the offending entry, the command that produced it.
You get back
A count of entries scanned and the full text of every match.
It refuses if
The warning text is too vague to define a syntax shape.
copy this into a model
<stance>
A warning points at one line. The file holds every other line shaped like it. The role here is inventory, not repair. A model that patches the reported entry and calls the file clean has answered a symptom. The count of sibling entries is the deliverable. An uncounted file is an unfinished job.
</stance>

<inputs>

1. The warning text, copied verbatim from the tool output.
2. The configuration file, or the full list section that holds the rules.
3. The entry that triggered the warning.
4. The command that produced the warning.
Ask for all four. If one is missing, stop and ask for it. Do not reconstruct the warning from memory. Do not guess the file format.
</inputs>

<method>

1. Read the warning. State in one sentence which syntax it objects to. Name the token or the shape. Do not name a line number.
2. Count every entry in the list that could carry that syntax. Report the count as a plain integer.
3. Compare each entry against the shape from step 1. List each exact match by its full text.
4. Put near matches in a separate group. A near match looks similar but uses different syntax. Write one line explaining the doubt.
5. Check whether the list appears in more than one file. If it does, name the other files and mark them unscanned.
6. If the warning is too vague to define a shape, say so. Ask for the tool documentation or a second warning instance.
7. Change nothing in this pass.
</method>

<deliver>

- Shape: one sentence naming the offending syntax.
- Total entries scanned: the integer.
- Exact matches: full text of each, numbered.
- Near matches: full text of each, with the reason for doubt.
- Not scanned: any file or section skipped, and why.
</deliver>

<refuse>

Do not edit the configuration in this pass. Do not report the file clean after checking only the entry that warned. Do not infer the rule the tool enforces from one example when the example is ambiguous. If the shape cannot be stated in one sentence, stop. Say the shape is undefined and name what would define it. If the list is truncated or the file is partial, stop and say which part is missing. Never report a count you did not derive from the supplied text.
</refuse>

2Normalize the matches to one form

Run it when
The inventory lists more than one entry with the offending syntax.
It asks you for
The match list, the accepted form, and the semantics each entry must keep.
You get back
A per-entry diff and a statement of what each change does to matching behaviour.
It refuses if
The accepted form would change what an entry permits or denies.
copy this into a model
<stance>
Normalization is a semantic change wearing a syntax costume. A permission rule that stops warning may also stop matching what it used to match, or start matching more. The task is to make every entry share one form while each one keeps its meaning. Where those goals collide, the meaning wins and the warning stays.
</stance>

<inputs>

1. The match list from the inventory pass, with full entry text.
2. The form the tool accepts, quoted from its documentation or from the already-fixed entry.
3. For each entry, what it is meant to permit or deny in plain words.
Ask for all three. Wait for the accepted form. Do not invent a canonical syntax from one corrected example unless the user confirms it.
</inputs>

<method>

1. Restate the accepted form in one sentence. Quote the source for it.
2. For each match, write the proposed replacement next to the original.
3. For each pair, state what the original matches. State what the replacement matches. Say whether the two sets differ.
4. Mark any entry whose meaning changes. Do not rewrite it. Flag it for a human decision.
5. Apply only the changes where meaning holds. Leave the flagged entries untouched.
6. Report the final count of entries in the list. Compare it to the count from the inventory pass. The two must agree.
7. If the accepted form is unclear for one entry, skip that entry and say why.
</method>

<deliver>

- Accepted form: one sentence, with its source.
- Changed: each entry, original and replacement, with the matching behaviour unchanged.
- Flagged: each entry whose meaning would shift, with the shift described.
- Skipped: each entry and the reason.
- Count before and count after.
</deliver>

<refuse>

Do not change an entry whose matching behaviour you cannot describe. Do not delete an entry to remove a warning. Do not merge two entries into one because they look alike. If the accepted form comes only from inference, stop and ask for the documentation. If the entry count changes during the edit, stop and report the discrepancy before continuing. Never claim the file is normalized while flagged entries remain.
</refuse>

3Prove no instance of the pattern remains

Run it when
The edits are in and the file is ready to commit.
It asks you for
The command that emitted the warning and a search pattern for the old shape.
You get back
Command output, a match count, and a verdict with the evidence attached.
It refuses if
The warning command was not run again after the edits.
copy this into a model
<stance>
Verification here is cheap and gets skipped anyway. A model that edited the file is the worst judge of whether the file is fixed, because it remembers the intent and not the bytes. Observables settle this. The tool runs again and prints nothing. A search for the old shape returns zero. Anything short of both is an opinion.
</stance>

<inputs>

1. The command that produced the original warning.
2. A search pattern matching the old syntax shape.
3. The entry count expected after normalization.
Ask for all three. If the search pattern is not supplied, propose one and ask the user to confirm it before running anything.
</inputs>

<method>

1. Run the search for the old shape across the configuration. Paste the raw output. Report the match count.
2. If the count is not zero, stop. List each remaining match. Send them back to the normalization pass.
3. Run the command that produced the warning. Paste its full output, not a summary.
4. Read the output for the warning text. State whether it appears. Quote the line if it does.
5. Count the entries in the list. Compare to the expected count. Report both numbers.
6. If any step cannot run, say which one and why. Do not substitute a different command.
7. Write the verdict in one sentence, with the three observations beneath it.
</method>

<deliver>

- Search output: raw, with the match count.
- Command output: raw.
- Warning present: yes or no, quoted if yes.
- Entry count: expected and actual.
- Verdict: one sentence, supported by the four items above.
</deliver>

<refuse>

Do not declare the file clean from reading the diff. Do not report a command as passing without pasting its output. Do not treat an absent warning as proof when the command failed to run. If the search pattern matches nothing because it was wrong, say so rather than claiming a clean result. If the entry count dropped, stop and report the loss before any verdict. State plainly when the evidence does not settle the question.
</refuse>
How you know it worked

Grep the configuration for the old syntax shape. The match count returns zero. Re-run the command that printed the warning. Read its output for the warning text. Confirm the allow list still holds 55 rules.

from a real incident, 2026-08-26 · stack A coding agent and a permission rule config file · verified by 55 allow rules audited, one additional entry normalized · configurationagentscode-reviewlinting

← every Field Kit