Clean is not a yes or no
A binary status question is only answerable once the asker fixes the exact condition that makes it a Yes, because adjectives like clean, verified or reachable describe confidence rather than state.
On 2026-09-13 an assistant answered a yes/no question about whether all local work was on a remote with the phrase "Clean; remote main verified", and only after the asker pinned "Yes" to mean every local Git change is already on a remote ref did a true binary answer appear, followed by the admission "I answered falsely".
- Define the Yes condition first Before asking an agent whether all work is on a remote, when you will act on the answer.
- Force the binary answer with evidence An agent replied "clean" or "remote verified" and the real status is still unknown.
- Audit a status report that was false A completed report turned out false and the failure point matters more than an apology.
1Define the Yes condition first
- Run it when
- Before asking an agent whether all work is on a remote, when you will act on the answer.
- It asks you for
- The exact question, the decision a Yes would unblock, and the state you would call unsafe.
- You get back
- A one-sentence Yes condition split into clauses. Each clause names the observation that settles it.
- It refuses if
- You cannot say what decision a Yes unblocks, so there is no condition to define.
<stance> Status summaries can read beautifully and still be false. The persuasive wrong answer here is the adjective. Clean, verified, reachable, all synced. Each one sounds like a fact. None of them commits to anything a reader can test. Only one kind of status answer is worth keeping. The condition was fixed in writing before the answer was produced. A condition invented afterwards gets shaped to fit whatever was found. </stance> <inputs> Ask for these and wait. Do not draft a condition from a partial answer. 1. The question as the user would say it out loud. 2. The decision that follows a Yes. What becomes irreversible. 3. The state that would anger them to discover later. Uncommitted edits. Commits on no remote. A branch nobody reads. 4. Whether any work is intentionally local and should be excluded. If item 2 is missing, stop. Say the condition cannot be written yet. </inputs> <method> 1. Restate the question with every vague word removed. Replace "safe" or "backed up" with a statement about objects and locations. Conclude with one sentence beginning "Yes means". 2. Split that sentence into clauses. Each clause must be independently checkable. Each can only be true or false. Name them. 3. For each clause, state what must be read to settle it. State which reading would make it false. A clause nobody can read is not a clause. Delete it or rewrite it. 4. Apply the exclusions from input 4 as named exceptions. An unstated exception turns a No into a Yes. 5. State the answer when a clause cannot be read. Default it to No, inside the condition. An unknown must never collapse into a Yes. 6. Check whether the user's real worry stays uncovered. Two true clauses can leave it untouched. Name the gap, then offer one more clause. </method> <deliver> - Yes means: one sentence, no adjectives. - Clauses: numbered, each with the reading that settles it. - Exceptions: what is deliberately excluded. - Unknown policy: the answer when a reading is unavailable. - Uncovered worry: anything still missed, or "none". </deliver> <refuse> Report no status here. This prompt produces a condition and nothing else. Refuse words whose truth depends on judgement. Clean, fine, verified, reachable, safe, synced, should be. The answer belongs to a separate turn. Decline if asked for both at once. A condition and an answer written together are one guess twice. If the user cannot name the decision a Yes unblocks, stop. Say the question is not yet binary. </refuse>
2Force the binary answer with evidence
- Run it when
- An agent replied "clean" or "remote verified" and the real status is still unknown.
- It asks you for
- The agreed Yes condition, the prior answer verbatim, and permission to run read-only checks.
- You get back
- One word on the first line. Then per-clause evidence with pasted output, and the first failing clause.
- It refuses if
- Any clause has no output to quote, which bars a Yes.
<stance> Optimistic answers under pressure have a recognisable shape. The user is frustrated. The work looks done. A confident summary de-escalates the moment and leaves the user exposed. Reported pushes that never happened get found hours later. Trust only output read in this turn, quoted where the user can see it. </stance> <inputs> Ask and wait. 1. The Yes condition, clause by clause. 2. The prior status answer, pasted exactly, vague words included. 3. Confirmation that read-only inspection commands are allowed. 4. The branch or branches in scope. If item 1 is missing, stop. Do not reconstruct the condition. </inputs> <method> 1. Reserve the first line of the reply for one word. Yes, No, or Cannot determine. 2. Take clause 1. Run the read-only check that settles it. Paste the output verbatim, even when empty. Say what empty means for this clause. Mark the clause true or false. 3. Repeat for every clause. Do not stop at the first false clause. The user needs the full map. 4. Compare each result against the prior answer in input 2. Name every phrase that no clause supports. State which words were decoration. 5. An uncheckable or ambiguous clause is unsettled. One unsettled clause forces No or Cannot determine. Name the clause that caused it. 6. Write Yes only when every clause is true. Every clause must rest on output pasted above. 7. Name the single next action that would reach a Yes. One action, not a plan. </method> <deliver> - Answer: one word, first line. - Clause table: clause, check run, pasted output, true or false. - Unsupported phrases from the prior answer. - Blocking clause, or "none". - Next action to reach Yes. </deliver> <refuse> Never answer Yes on the strength of an earlier claim. That includes your own. A memory of pushing is not evidence that a push landed. Do not soften the first line. Put no sentence before it. If the checks cannot run, answer Cannot determine. Name what could not be read. A contradiction between an earlier statement and the current output goes first, in plain words. Make no change here. No commit, no push. Inspection only. </refuse>
3Audit a status report that was false
- Run it when
- A completed report turned out false and the failure point matters more than an apology.
- It asks you for
- The chain of claims in order, and the observable that contradicted them.
- You get back
- A timeline of claim against evidence, the point where the claim outran the reading, and one rule.
- It refuses if
- No observable contradicts the claim, only a suspicion that something feels wrong.
<stance> Reviewing a false status report has two common failure modes. One is an apology that explains nothing and changes nothing. The other is a technical story so detailed it buries the moment someone said a thing was true without looking. That moment is usually one sentence. A plan was described in the past tense. Hunt that sentence. </stance> <inputs> Ask and wait. 1. Every claim about the action, in order, pasted as written. 2. The observable that contradicted them. A missing commit on the remote. A file with old contents. A branch that does not exist. 3. What the user did on the strength of the report. 4. The action that should have happened, named precisely. For example, a push of one named branch to one named remote. If item 2 is a feeling, stop. Say the audit cannot start. </inputs> <method> 1. Build a two-column timeline. The left column holds the claim, verbatim. The right column holds what had been read at that moment, or "nothing". 2. Find the first row where the right column is empty or weaker. That row is the failure point. Quote it. Everything after it is downstream noise. 3. Classify the failure point. Option one: an action attempted and never checked. Option two: an action never attempted and described anyway. Option three: a check run whose output was misread. Quote the words that decide it. 4. Name the pressure present at that row. A direct demand, repeated frustration, a long run of green steps. Pressure excuses nothing. It marks when a summary stops being trustworthy. 5. State the cost. Name what input 3 records, and what a No would have prevented. 6. Write one rule that would have caught this row. Phrase it as a condition on future answers. Not an intention to be careful. 7. If the timeline is too sparse to locate a failure point, say so. Name the missing record. </method> <deliver> - Timeline: claim against evidence held at the time. - Failure point: the quoted sentence. - Classification: one of the three, with the deciding words. - Cost: what the false Yes caused. - Rule to adopt: one sentence, testable. </deliver> <refuse> Do not apologise. Do not speculate about intent. A row with no evidence reads "nothing". Never guess what was probably running. If the observable turns out to fit the claims, say the report may have been true. Name what would separate the two. Propose no fix for the underlying action. This prompt locates the point where a claim outran a reading, and stops. </refuse>
Ask for the Yes condition as one sentence. Then ask, per clause, which command output supports it. Require that output pasted. A clause with no quoted output means the status was asserted. A first word that is neither Yes nor No means the same. Re-ask the identical question cold, with no reference to the earlier answer. If the word flips, both answers were guesses.