A self-check asks a model to re-examine its own answer. It can catch slips, but it reuses the same knowledge that produced the answer.
A self-check is therefore not verification. Independent evidence, such as a tool result or a recomputation, still decides.
EXAMPLE batch: 100 answers, 70 right, 30 wrong
self-check flags 15 of 30 wrong (50%) and 7 of 70 right (10%)
unflagged wrong = 30 - 15 = 15 remain
flagged = 15 + 7 = 22 sent for review
unflagged = 100 - 22 = 78, of which 15 are wrong
breakdown of 100: 63 right unflagged (63%), 15 wrong unflagged (15%), 15 wrong flagged (15%), 7 right flagged (7%)
63 + 15 + 15 + 7 = 100; residual wrong in unflagged = 15/78 = 5/26, about 19.2%Structured output fixes the answer shape in advance. Fixed keys and types let a script validate every field before use.
The transcript below is schematic, not a real reply from any system. It shows the fixed register-description shape the validator expects.
schematic transcript, invented for illustration
USER: Describe register ctrl as keys name, width, reset.
MODEL (schematic): {"name": "ctrl", "width": 8, "reset": 0}
VALIDATOR: keys present, width is a positive integer. Accept.The program below validates five fixed-shape records with plain checks. It accepts three and rejects two, by exact field rules.
import sys
REQUIRED = ["name", "width", "reset"]
def valid(rec):
for key in REQUIRED:
if key in rec:
pass
else:
return False
if isinstance(rec["width"], int):
pass
else:
return False
if rec["width"] > 0:
return True
return False
RECORDS = [
{"name": "ctrl", "width": 8, "reset": 0},
{"name": "stat", "width": 4, "reset": 1},
{"name": "data", "width": 32, "reset": 0},
{"name": "irq", "reset": 1},
{"name": "cfg", "width": 0, "reset": 0},
]
good = 0
for rec in RECORDS:
if valid(rec):
good = good + 1
if good == 3:
pass
else:
print("FAIL: valid count changed")
sys.exit(1)
print("PASS: validator accepts 3 of 5 records, rejects 2")Field | Rule | Rejected example |
|---|---|---|
| Present string key | Missing keys fail closed. |
| Positive integer | Zero and non-integer widths are rejected. |
| Present value | Unknown spellings are rejected, not guessed. |
High-stakes use keeps prompts on least privilege. Secrets stay out of prompts, proprietary IP goes only to deployments approved for its data class, file and log content is treated as untrusted input, and risky actions wait for human approval.
The independent check owns the verdict. A second model reading the same answer is a second opinion, while a tool recomputation is evidence.
Check kind | What it is | Strength |
|---|---|---|
Self-check | The same model re-reads its answer | Catches slips only. |
Second opinion | Another model reads the answer | Adds a view, shares blind spots. |
Independent check | Tools, tests, or hand recomputation | Decides correctness. |
The costliest mistake is treating a passed self-check as proven. The residual arithmetic above keeps 15 wrong answers inside the unflagged set.
15 of 30 stay unflagged. An independent check is still needed before use.
The irq record lacks the width key, and the cfg record has width zero. The presence rule rejects the first and the positive-integer rule rejects the second.