Wipe clearance for field-data tablets

Wipe a tablet only after its last copy is safe.

Survey teams reset their tablets between rounds, and that reset is when unsent records and photos disappear for good. LastCopy compares every tablet’s original export with the server, byte for byte, and gives the coordinator one answer per device: safe to wipe, recover first or hold, with a certificate that proves why.

Tablets cleared live5 of 5 correct
Blind tablets wrongly cleared0 of 1,980
Judgement modelNemotron 3.5
tablet-03ODK Collect export · 2 completed records
Exported
SOn the server
MATCHED

1 record byte-for-byte, every referenced file included.

TOnly on the tablet
LAST COPY

The whole record uuid:fleet-03-b

Wipe gateRecover first
Fig. 1The five tablets from the live connected run on 27 Oct. Code compares the original bytes with the server and the wipe gate decides; Nemotron only investigates and explains.
LastCopy at a glance
Field tablets todayWith LastCopy
Before a resetWipe when the server count looks rightOne answer per tablet: safe to wipe, recover first or hold
Missing photosInvisible: the record shows as receivedEvery file reference compared, byte for byte
“Missing” answersThe CSV looks short, so people panic or resubmitRaw XML checked; export-only gaps are recognised as safe
ProofSomeone’s wordA hashed certificate of exactly which bytes were compared
ExplanationOpen the XML yourselfA plain sentence where every ID and filename is checked against the evidence
The problem

Field data went digital. Its last mile still runs on trust.

More than 2 million people use ODK to send over 250 million submissions a year, in 194 countries, including WHO surveillance for polio and cholera. Before every reset, someone has to decide whether a tablet still holds the only copy of something.

“Received” isn’t “complete”

A submission can arrive without its photo. The count shows every record as received, while the image survives only on the tablet.

The spreadsheet lies by omission

Repeated answers drop out of the CSV export, so data looks lost even though the raw XML on the server has all of it.

Checking by hand doesn’t scale

The only real check is opening XML and media files one by one, for every tablet, at the end of a long field day. So nobody does it.

Sources: getodk.org · Digital Public Goods registry.

How it works

Agents decide where to look. Code decides what’s true.

An investigation is a loop planned by a World Model. Nemotron forms and critiques hypotheses, a deterministic verifier settles them against the original bytes, and a fixed rule clears each tablet.

01

Scout the gaps

Four cross-source SQL joins over tablet exports, the server capture and the spreadsheet view find every suspicious record.

Zetaris
02

Argue about it

The Investigator turns each suspicion into a testable hypothesis. The Reviewer approves it or sends it back, before anything is fetched.

Nemotron
03

Settle it in bytes

The verifier compares original XML and every file slot. A refuted hypothesis is logged as a changed decision.

Code
04

Attack, then clear

The gate clears only what the bytes prove. An Adversary then tries to break every clearance, and code must answer each objection or the tablet is held.

Code + Nemotron
The decisions

One tablet, one answer, zero ambiguity.

Each verified record lands in exactly one bucket, and the buckets decide the answer in a fixed order: anything missing wins, then anything uncertain, and only then “safe”.

Records on the tablet=matched+only on the tablet+needs a person
Safe to wipeSAFE_TO_WIPE
MeansEvery completed record and file is on the server.
Triggered byPRESERVED, EXPORT_VIEW_ONLY
Next stepReset the tablet
Exampletablet-01 in the live run
Recover firstRECOVER_FIRST
MeansThe tablet holds the only copy of something.
Triggered byMISSING_SUBMISSION, MISSING_ATTACHMENT
Next stepUpload the named record or file, then check again
Exampletablet-02 and tablet-03
HoldHOLD
MeansA person must look before anything happens.
Triggered byCONTENT_CONFLICT, UNVERIFIABLE, no export
Next stepReview the conflict or collect the export
Exampletablet-04 and tablet-05
Try the gate

What would LastCopy say about this tablet?

Set what the verifier found when it compared the tablet’s export with the server, byte for byte.

Export received from tablet-07
Matched the server byte-for-bytePRESERVED2
Spreadsheet hides answers, raw XML has themEXPORT_VIEW_ONLY0
A photo or file never reached the serverMISSING_ATTACHMENT1
The whole record is only on this tabletMISSING_SUBMISSION0
Server copy has different answersCONTENT_CONFLICT0
Could not be read or comparedUNVERIFIABLE0
The wipe gate says
Recover first

The tablet holds the only copy of something the server lacks.

Records on this tablet3
Only copy is on this tablet1
Decided bycode · no model can reach this rule
certificate {"rule":"lastcopy-wipe-gate/1","device_id":"tablet-07","decision":"RECOVER_FIRST","export_received":true,"counts":{"PRESERVED":2,"MISSING_ATTACHMENT":1}}
sha256 …

Fig. 2The same rule, in the same order, as lastcopy/agents.py · wipe_gate. Missing data always beats “looks fine”, and a tablet that never exported is never treated as clean.

Blind tests

Hidden problems, planted at random. Found every time.

The obvious question is whether the answers were planted. So a generator builds fleets the agents have never seen, with a random hidden condition on every tablet, and the full loop runs: planner, SQL, hypotheses, verifier, gate and Adversary. The truth is revealed only after each decision.

python -m scripts.blind_eval --seeds 1-500

Result

Fleets decided entirely correctly500 / 500
Tablets decided correctly1,980 / 1,980
Tablets wrongly cleared to wipe0
Truth: Safe to wipe531/531
Truth: Recover first921/921
Truth: Hold528/528
Sample mode: the written offline policy fills the model roles; everything else is the production code. Full results with every planted condition: eval/blind-benchmark.json.
by hidden condition

Every kind of loss, caught

Answer edited on the server510/510
Whole record never arrived493/493
Tablet never exported237/237
Photo never uploaded530/530
Record matched the server997/997
Spreadsheet hides answers (raw XML has them)520/520
A tablet can carry several conditions at once; the strongest one decides. A tablet that never exported is always held, never guessed.
Who it’s for

Different people need different parts of the answer.

Field coordinators

Reset twenty tablets before tomorrow’s round without gambling on any of them.

With LastCopy

A list of tablets to wipe now, and the exact file to upload from each of the others.

Data managers

Stop chasing “missing” answers that are really just artefacts of the export view.

With LastCopy

Raw-XML checks that separate export gaps from real loss, with SQL and hashes to audit.

Programme & M&E leads

Show funders and ethics boards that nothing collected was silently lost.

With LastCopy

A hashed certificate per tablet, and a trace of how every decision was reached.

Under the hood

Ten roles, one planner, and a rule no model can touch.

The Meterless World Model holds the investigation as a graph and picks each next step from its state. Python only runs the step it picks.

Agents and what runs them
World Model planner

Selects the next action from graph state: triage, classify, review, fetch, evaluate, remedy, decide, explain.

Meterless
Scout

Four cross-source joins that find suspicious records.

Zetaris
Investigator

Proposes a hypothesis and the evidence that would test it.

Nemotron
Reviewer

Approves, revises or rejects. A code guard enforces it.

Nemotron
Evidence fetcher

Resolves exact source objects and re-checks every hash.

Zetaris
Verifier

Compares original bytes. The only source of verdicts.

Code
Remediation advisor

Chooses only among the actions code permits.

Nemotron
Wipe gate

Seven criteria must all hold; one decision and a hashed certificate per tablet.

Code
Adversary

Tries to break every clearance; each objection is re-checked from the raw tables.

Nemotron
Explainer

Plain sentence; every ID and filename checked.

Nemotron
Wipe gatelastcopy/agents.py
# decided by code from verified findings only
if device in missing_devices:
    decision = 'HOLD'          # never exported
elif any(v in MISSING for v in verdicts):
    decision = 'RECOVER_FIRST' # only copy is here
elif any(v in UNCERTAIN for v in verdicts):
    decision = 'HOLD'          # a person decides
elif not findings:
    decision = 'HOLD'
else:
    decision = 'SAFE_TO_WIPE'
Simplified. The certificate records the rule version, both archive hashes and every finding.
Models can’t make a tablet look safe

Verdicts come only from the byte comparison; the gate never reads model output.

Schema-bound, with labelled fallbacks

Strict JSON from every model call; one repair attempt, then a fallback that the trace names as one.

Bounded by design

12 steps, 2 critique rounds, 10 model calls, 300 seconds, or a controlled failure.

Live connected run

Run live through Zetaris and Nemotron, not mocked.

On 27 October the five-tablet fleet ran end to end: evidence through a local Zetaris install, judgement through NVIDIA Nemotron via Meterless Nightshift. The decisions match the keyless sample run, because code makes them.

Captured 27 Oct 2026 · connected mode

What each tablet got

Verify on GitHub ↗
TabletDecisionExplanation written by Nemotron, citations checkedCertificate
tablet-01Safe to wipeThe export is view-only, but 2 completed records matched the server byte-for-byte, including every referenced file.3817eee857f4…
tablet-02Recover firstFinding-3: the file b.bin for uuid:fleet-02-a is not on the server. Automatic recovery is not permitted, so recover it with a reviewed upload.010021268577…
tablet-03Recover firstFinding-5: the whole record for uuid:fleet-03-b is not on the server. Automatic recovery is not permitted, so recover it with a reviewed upload.d9283680e82a…
tablet-04HoldFinding-6: the server copy of uuid:fleet-04-a has different answers; a person must choose.2eccf72550b2…
tablet-05HoldNo export was received from this device, so nothing on it has been checked.231f4d001424…
7 Zetaris queries · 7 Nemotron calls (nvidia/nemotron-3.5-lightning-30b-a3b) · 2 critique rounds · 0 fallbacks · the Reviewer sent every hypothesis back once before testing.
Roadmap

From a hackathon gate to the step before every reset.

Now

Shipped

  • Five-tablet investigation with per-device decisions and certificates
  • World Model planner, Reviewer loop and code guards
  • Live run through Zetaris and Nemotron via Nightshift
  • Keyless Sample mode, JSONL traces and 317 tests
  • Reset guard and in-browser certificate verifier
  • Reviewed recovery into a synthetic ODK test project
  • Printable clearance sheet and an independent certificate verifier
  • Adversary agent and a blind benchmark of 500 random fleets
Pilot

Next

  • Pull exports straight from Collect over USB
  • Read-only connection to a team’s ODK Central
  • Batch mode for whole cohorts of tablets
Scale

Later

  • KoboToolbox and other ODK-compatible servers
  • Encrypted-form support with on-device keys
  • Offline coordinator app for low-connectivity sites
  • Independent security review
FAQ

Questions, answered.

Can the AI ever make a tablet look safe?

No. Verdicts come only from the deterministic byte comparison, and the wipe gate reads only those verdicts. Models choose where to look, critique hypotheses, pick among permitted remedies and write the explanation, and that explanation is checked token by token against the evidence.

What exactly does “safe to wipe” prove?

That every completed record and every referenced file from that tablet’s export was found on the server with identical bytes. The certificate names the rule version, both archive hashes and every finding. It does not prove the answers are true, and it only covers the exports you supplied.

Why is a short spreadsheet considered safe?

Because the CSV export can leave out repeated answers that the server actually holds. LastCopy checks the raw server XML; when every answer is there, the gap is in the view, not in the data.

Does it run without keys or internet?

Yes. python run.py runs the full loop in Sample mode in a few seconds: planner, SQL on SQLite, verifier, gate and checks. Only the model roles are replaced by a written policy, and every trace line says so.

Does LastCopy modify the original exports?

Never. Archives are read-only and sealed with SHA-256. Live recovery writes only to a dedicated synthetic ODK Central test project.

Which formats are supported?

ODK Collect v2026.3.5 exports against ODK Central v2026.3.1. Encrypted forms and KoboToolbox are on the roadmap, not claimed today.

Check your first fleet in ten seconds.

No keys, no network. Clone the repo and run one command, or step through the live investigation in your browser.

$ python run.py
  tablet-01  SAFE_TO_WIPE   raw XML holds every answer
  tablet-02  RECOVER_FIRST  b.bin is not on the server
  tablet-04  HOLD           server answers differ; a person must choose