Passante A Passante publication

En Passante

In Passing
Field Kit

The field you named was not on screen

When a user says a control is not on screen, treat it as evidence about the running build and verify the element, not the person.

What happened

On 2026-09-24, an assistant directed a user to type into a named input box in a local web UI that the user could not see, and progress came only once the assistant investigated the interface itself and changed the code so the field was visible.

2026-09-24 a local web UI · an AI coding agent measured: none recorded
3 prompts, in order
  1. Verify the control exists at all A user says they cannot see the field or button you named.
  2. Make the field reachable without weakening checks The diagnosis shows the control is absent, gated off, or on another build.
  3. Prove the user can see it You ship a change and need proof the field now renders.

1Verify the control exists at all

Run it when
A user says they cannot see the field or button you named.
It asks you for
The exact label text, the screen or URL, and the start command.
You get back
A search result with file and line, the render gates, and a verdict.
It refuses if
The label search finds nothing and the user cannot name an entry point.
copy this into a model
<stance>

A user who says a control is not on screen is describing the build in front of them. Treat that report as evidence about the code. An agent that answers by restating the click path spends turns and learns nothing. This error looks reasonable from the inside: assume the screen matches the code in mind, then keep guiding. Stop at the first report.

</stance>

<inputs>

Ask for these four things. Wait for all of them.
1. Exact label text the user was told to find.
2. URL or screen the user is looking at.
3. Command that starts the app, and the port.
4. One other control the user does see on that screen.
If an answer is missing, ask again. Do not proceed on a gap.

</inputs>

<method>

1. Search the codebase for the exact label string. Report the file and line. Report zero matches plainly when there are none.
2. If there are zero matches, conclude the control is not in this code under that name. Say so. Move to step 5.
3. If there is a match, read the render conditions around it. List every gate. A gate is a flag, a role check, an environment variable or a route.
4. Ask the user for each gate value on their machine. Compare the entry point they run against the file you matched. A different entry point explains an absent control.
5. If the evidence does not settle the question, name the single observation that would settle it. Request that one thing and stop.

</method>

<deliver>

- Label search: file and line, or zero matches
- Gates: what decides whether the element renders
- Verdict: absent, gated off, or wrong entry point
- Next observation: the one thing still needed

</deliver>

<refuse>

Never restate the click path the user already followed. Never assert that the element should be visible. Do not suggest the user looked in the wrong place without a gate value from step 4. Do not propose a code change in this step. Stop when the label search returns nothing and the user cannot name an entry point. Say the cause is undetermined. Report the gap instead of filling it with a likely explanation.

</refuse>

2Make the field reachable without weakening checks

Run it when
The diagnosis shows the control is absent, gated off, or on another build.
It asks you for
The verdict, the label, the value the control supplies, and the start command.
You get back
A diff that renders the field, plus full steps and the surviving check.
It refuses if
No code reads the value, or the diagnosis verdict is missing.
copy this into a model
<stance>

Value behind an unreachable control still matters. A field nobody can see does not retire its requirement, and code that reads that value keeps reading it. Work here means putting the field in front of the user, or supplying the same value through a path the user can run. Dropping the check that consumes the value is a different change, not this one. Name the consumer first.

</stance>

<inputs>

Ask for these and wait.
1. Verdict from the diagnosis: absent, gated off, or wrong entry point.
2. Exact label text, with file and line if one was found.
3. Value the control is meant to supply, in the user's words.
4. Command the user runs to start the app.
Do not design a change from the label alone.

</inputs>

<method>

1. Find where the code reads this value. Quote the line. If nothing reads it, stop and say so.
2. Accept the verdict from the diagnosis. Do not re-diagnose from guesswork.
3. If the element is absent, write the change that renders it in the user's entry point. Keep every validation on the value intact.
4. If a gate hides it, show how to satisfy the gate locally. Offer rendering the field in that mode as a second option.
5. Write the user's steps in full text. Because the user cannot see the control, name no screen landmark they must hunt for.
6. State what the code still enforces after the change. Quote the check verbatim.

</method>

<deliver>

- Consumer: the line that reads the value
- Cause: carried from the diagnosis
- Change: the diff, one file at a time
- Steps for the user: full text, no screen hunting
- Still enforced: the check that survives the change

</deliver>

<refuse>

Do not delete the check that reads the value. Do not make the value optional to end a stuck exchange. Do not send the user back to the control they cannot see. Stop when no code reads the value. Say the requirement may not exist in this build. Stop when the diagnosis verdict is missing. Ask for it rather than assuming the element is absent.

</refuse>

3Prove the user can see it

Run it when
You ship a change and need proof the field now renders.
It asks you for
A fresh restart, the text the user reads on screen, and a consumer log line.
You get back
A pass or fail verdict built from the user's reading and the log.
It refuses if
Either reading is missing, or the only evidence is your own diff.
copy this into a model
<stance>

A diff is not a screen. Proof that the field is reachable comes from the person at the keyboard, in their own words, after a fresh start. An agent that reads its own change and declares success repeats the original error one step removed. Ask for the screen reading and the consumer log before any verdict.

</stance>

<inputs>

Ask for these and wait.
1. Confirmation that the user restarted the app with the same command as before.
2. Exact text the user reads on screen, typed out by them.
3. A log line showing the consumer received the value.
4. Label text from the diagnosis, for comparison.
Items two and three are both required. Neither one alone proves the fix.

</inputs>

<method>

1. Check the restart used the same command and port. If it did not, stop and ask for a rerun.
2. Compare the user's typed text with the label from the diagnosis. A mismatch means they found a different control.
3. Check the log line names the consumer and the value. A generic success message does not count as evidence.
4. If the user reports nothing on screen, mark the change failed. Return to diagnosis. Do not ask them to look harder.
5. If the user sees the field but the log stays silent, mark the path unproven. Name the log statement to add.
6. Write the verdict as pass or fail. Give no partial credit.

</method>

<deliver>

- Restart: command and port used
- Screen reading: what the user typed back
- Log reading: consumer name and value
- Verdict: pass or fail
- Next step if fail: the diagnosis question to repeat

</deliver>

<refuse>

Do not treat your own diff as evidence of a visible field. Do not accept a bare "it works now" without both readings. Do not ask the user to search the screen again. Stop when either reading is absent. Say the fix is unproven. Record which reading is missing.

</refuse>
How you know it worked

Search the running code for the exact label text the assistant named. Record the file and line, or record zero matches. Then ask the user to type back the text they read on screen.

from a real incident, 2026-09-24 · stack a local web UI · an AI coding agent · verified by none recorded · ui-mismatchagent-behaviorverification

← every Field Kit