What broke, and what it taught
Failure and recovery lab
Real problems from the JARVIS build: the symptom, the diagnosis, the repair, the test that now guards against it, and how the repair was verified. Problems without a repair yet are listed as open.
- Repaired and verified
- 9
- Repaired, verifying
- 2
- Open
- 3
Systems covered: Browser safety, Cognition / language model, Cognition / planning, Computer operator, Engineering, Engineering evidence, Evidence and verification, Fabrication / scene, Governance / HUD scene, HUD / Engineering, Memory, Memory / skills, Self system.
-
The Save As dialog that pretended to listen
- Symptom
Save As showed the typed file name but kept its own. Pressing Enter raised “Confirm Save As” for the source file, and something other than the test answered it: the source was rewritten in place and no copy was made.
- Diagnosis
Setting the name by a window message changes what the dialog displays, not what it uses. An observe-only reproduction, sampling every ~265 ms and sending nothing, still saw the confirmation answered.
- Repair
The name is typed only while the focused control is verified to be the file-name field, then read back. JARVIS never answers a confirmation: any extra dialog makes the result refused and uncertain.
- Guard
Disabling confirmation detection turns the test red.
- Verified
Live Save and Save As passed afterwards, checked by re-reading file bytes and identity (on the operator lane).
Lesson. What a dialog shows is not what it will do. Verify the effect, and never click through a question you did not expect.
- Symptom
-
A helpful duplicate sensor that overrode a real reading
- Symptom
A canonical merge test failed after new RAM, CPU and disk producers were added.
- Diagnosis
They were added on the claim that none existed. That claim was never checked: the second producer marked disk UNAVAILABLE over a real reading.
- Repair
The duplicate producer was reverted.
- Guard
The merge test that caught it.
- Verified
37 tests passed after the revert.
Lesson. Check the claim that something is missing before building it. Qualify the existing producer instead of adding a second.
- Symptom
-
The persona example that taught a fabricated check
- Symptom
Local-model candidates kept claiming to have checked things they had not, even after targeted training.
- Diagnosis
The system prompt’s own example of a “no record” answer described an inspection that never happened, and it appeared in every training row and every test case. The model was copying its instructions.
- Repair
Persona policy 2.1.0 allows “no record” only after a search shown in the same turn.
- Guard
521 tests passed; the negative control fails as intended.
- Verified
Not verified yet.
Lesson. Before blaming the model, read what you taught it. The policy is landed but not yet active; it ships with contract v2.
Read the journal entry Capability: Grounded “no record” answers (persona policy 2.1.0)
- Symptom
-
“Visible” windows that were minimised
- Symptom
Keep-visible reported success for windows that were minimised, invisible or off screen.
- Diagnosis
It only checked whether the window was covered, not whether it was rendered at all.
- Repair
A window only counts as visible if it is rendered: visible, not minimised, non-empty and on a monitor.
- Guard
8 new tests that fail on the old code.
- Verified
Live re-proof on the operator lane, with 0 foreign window changes.
Lesson. Never report verified without observing the thing you claim.
- Symptom
-
The engineering panel showed the previous run’s ID
- Symptom
After a new thermal bench solve, the values on the engineering panel were new, but its provenance line still named the previous run. The new run ID appeared only after a restart.
- Diagnosis
Seen on camera during the 22 September 2026 capture session. The published values were correct and labelled calculated; only the provenance line was stale, and a full restart cleared it. The cause has not been established yet.
- Repair
Not repaired yet.
- Guard
No regression test yet.
- Verified
Not verified yet.
Lesson. Provenance has to be at least as fresh as the value it describes, or it misleads more than it helps.
Read the journal entry See it on camera Capability: Local solver execution
- Symptom
-
A two-step request ran its first step and silently dropped the second
- Symptom
Asked to “run the tensile bar case, then open the 3D model”, JARVIS ran the solve, reported “Done”, and never opened the model. The plan it recorded had only one step.
- Diagnosis
The recorded plan contained a single step (engineering.solve), and that step verified, so the turn reported success. Nothing in the turn compared the plan with the full request. Why the planner dropped the second step has not been established yet.
- Repair
Not repaired yet.
- Guard
No regression test yet.
- Verified
Not verified yet.
Lesson. Verification only checks the steps that exist. A request that asks for two things needs a check that the plan asks for two things.
- Symptom
-
A stated fact was stored as a standing instruction
- Symptom
Told “remember that the website launch footage was recorded tonight on monitor two”, JARVIS answered “Noted, sir. Standing instruction on …”. Recall and forgetting worked, but the memory was filed under the wrong kind.
- Diagnosis
The remember path classified a statement of fact as a standing instruction. Recall and a governed forget both behaved correctly afterwards; the classification itself is the fault. Its cause has not been established yet.
- Repair
Not repaired yet.
- Guard
No regression test yet.
- Verified
Not verified yet.
Lesson. Keeping kinds of memory apart only helps if what enters is filed under the right kind.
Read the journal entry See it on camera Capability: Memory consolidation, supersession and forgetting
- Symptom
-
An emergency-stop fence that was created but never entered
- Symptom
After an E-stop trip, the 3D scene route could still deliver model bytes: a reproduction got 200 bytes back after the stop.
- Diagnosis
The route created its stop fence but built the response outside it, so the fence’s final check never ran.
- Repair
The response is now built inside the fence.
- Guard
32 regression tests, including a trip in the middle of loading.
- Verified
A live proof after the fix returned 403 and withheld the bytes.
Lesson. A safety check that exists is not the same as a safety check that runs. The live proof, not the code review, found it.
- Symptom
-
0.9999999999999999: parts that could never be sliced
- Symptom
Some objects asked for a geometry decision forever and could never reach the slicer.
- Diagnosis
Scale is a running product. Applying a factor and then its inverse left 0.9999999999999999, and the scene compared scale exactly with 1: this happened for 36 of 299 factors between 0.01 and 2.99.
- Repair
One tolerant “is this the identity?” check is now shared by the scene, readiness and targeting.
- Guard
A regression test with a mutation control.
- Verified
Not verified yet.
Lesson. Exact equality on floating-point results is a bug waiting for the right number.
- Symptom
-
CAD-kernel noise read as a design change
- Symptom
The first what-if live run treated a clone of the design as changed.
- Diagnosis
The bounding box differed by 2 × 10⁻⁷ mm, and exact equality counted that as a change.
- Repair
The tolerance is now explicit (10⁻⁶ mm).
- Guard
Covered by a regression test.
- Verified
The what-if proof then passed 213 of 213 checks across two boots.
Lesson. Every comparison of measured geometry needs a stated tolerance.
- Symptom
-
An observation in the closing second read as “after”
- Symptom
The evidence-class live proof rejected a valid observation.
- Diagnosis
An observation made within the same whole second as the run’s close was read as coming after it.
- Repair
The boundary was fixed.
- Guard
A regression test for the same-second case.
- Verified
The evidence-class proof passed across two boots.
Lesson. Time boundaries need an exact rule, written down, and a test at the edge.
- Symptom
-
The loopback filter let fixture.localhost through
- Symptom
While designing a navigation proof, the team found that names like fixture.localhost and .local hosts passed the browser’s loopback filter.
- Diagnosis
The filter only matched hosts that started with “localhost”, so the claim that the browser refuses loopback was overstated.
- Repair
Any *.localhost and *.local name is now refused.
- Guard
Negative-control cases in the navigation proof.
- Verified
The navigation proof’s three negative controls then sent 0 requests (on the operator lane).
Lesson. A security claim is only as good as the cases it was tested against.
Capability: Governed browser navigation with negative controls
- Symptom
-
10 million row visits to rank a few skills
- Symptom
Ranking skills by past attempts was slow.
- Diagnosis
The action history was scanned once per skill.
- Repair
One shared snapshot is read once.
- Guard
Output must stay record-for-record identical.
- Verified
Synthetic benchmark: 189.47 ms → 0.042 ms, 10,000,000 → 10,000 row visits, identical records.
Lesson. Measure before optimising, and prove the output did not change.
- Symptom
-
256 “live” capabilities that did not prove what the word said
- Symptom
On 28 July 2026 the build ledger recorded 256 of 341 capabilities as LIVE. Many of those readings could not show that a real owner action reached the code, or that the booted system itself had answered.
- Diagnosis
Two gaps. An audit at the end of July (AUDIT 03) found that for dozens of capabilities no production entry point constructed the code at all. And a probe could pass by exercising code near the registered path, in the same process as the test, rather than by asking the booted system.
- Repair
Reachability from a real entry point became a precondition for LIVE, and on 6 August the evidence rule was tightened: LIVE is reached “by asking the process, not by proximity”, with no test doubles, a real booted process on a real port, evidence written to disk, and expiry after 24 hours. 108 registry entries were demoted from LIVE in one step.
- Guard
Every adapter carries an is_test_double flag, and a probe whose call graph touches a double can produce IMPLEMENTED at most. LIVE decays after 24 hours unless probes run again.
- Verified
The census of 17 September 2026 recorded 9 of 342 capabilities as LIVE under the strict rule. The website shows that figure with its date.
Lesson. A smaller number you can defend beats a large one you cannot. The drop was a correction, not a loss of features.
- Symptom
Nothing in this state yet.