# Certificate of Conformance to Pre-Registration PR-001 **Draft by build, 2026-09-29; architect's edit applied 2026-09-29 evening. Signed per §10. Published 29 September 2026 at tag `cert-001`, one day before the pre-registered date.** - **Practice:** Toceta. - **Workshop repository:** ARM-ANI (https://github.com/aniketmallick/robotics_research_arm_ani). - **Pre-registration:** PR-001, tag `prereg-001`, SHA-256 `81f371b286d7f250364782b03bf129471085eeea3626644ef2a30bc7ff43a2e1`. - **To be published at tag:** `cert-001`. **Result of record: PASS. 29 of 40**, Wilson 95 % [57 %, 84 %]. The policy of record is NULL-001, the pre-registered scripted null baseline; the readiness gate failed (erratum 5). **In one paragraph, for a reader with two minutes.** Before this robot moved, a document went public saying what it would try, how it would be judged, and that the result would be published either way. The learned policy the document hoped to test was not trained in time — a pre-registered gate decided that by the clock — so the evaluation ran on the pre-registered fallback: a fixed script with no camera and no learning, driven only from the rig's registration. It placed the cube in the zone 29 times out of 40 and passed the bar written for a learned policy. That is the finding: the task, as registered, is too easy to tell a learned policy from a script, and the next pre-registration's bar is set above this one's upper confidence bound. Everything that went wrong on the way — nine dated errata, a base guard that could not measure its own bar, a trial whose recorded read disagreed with its own photo — is in §2, first. ## 1. What "certified" means here "Certified" means every gate's pre-registered checks were run on named artifacts, and the results are published as measured. - It is not a safety certification. - It is not a performance guarantee outside the measured envelope. - It is not conformance to any external standard. - A FAIL certificate is published as a FAIL. The only form of the word is "Certificate of Conformance to Pre-Registration PR-001". Its first use in any public document, post or video links to or restates this definition (PR-001 §1, usage rule ratified 8 September 2026). ## 2. What is not covered **No learned policy.** "No learned policy was trained in the pre-registration window; this certificate covers the pipeline on the pre-registered null baseline; the learned policy is PR-002." (PR-001 §8; the readiness gate failed by the clock, erratum 5.) **The base guard is a disclosed measurement, not a gate (erratum 8).** - The hand-guided touch cannot resolve the guard's bar. On a clamped base, 12 far-right touches spread over ±7.5 mm radially, and the spread tracks the wrist angle (−2.35 mm per degree, r = −0.98). One degree at that corner is about 6.3 mm. - The guard's last run is disclosed with its verdict: 29 Sep 11:57 IST, erratum 4c bands, **STOP**. - Δ rotation −1.17°: the fit is −1.86° against the A9 of record's −0.69°, and the bar is 1°. - Far-right is 7.65 mm from its A9 touch; the bar is 5 mm. - This rig resolves base motion of order 1–1.5° and above (the class seen on 24 Sep, 3.9°). It cannot resolve smaller motion. - The null's result is read against that limit and against the A9 residuals. - The other three lines of evidence were logged before the session: - the camera re-check: the printed outlines within 2.5 px of the A2b of record, about 1 mm on the sheets; - the ruler: 116 / 116 mm against the registration's 115 / 115; - the clamp check: hand-tight and not moved. **The placement yaw was not enforced (erratum 9).** - PR-001 §4a pre-registered (cell, yaw) pairs. It registered a tolerance for position (±5 mm) and none for yaw, and the runner checked position only. This is an instrument gap, build's and the architect's. - A post-hoc audit of the sealed placement photos (method error about ±5–8°) finds **10 of 40 placements more than 20° from the listed yaw**. They cluster where a placement guide, given mid-session, applied (listed yaws above 45°). - NULL-001 has no yaw information, so the deviation could not have helped the script. - The result stands as recorded. The sensitivities are in §3. - The rule the result stands under: §5 exclusions are contemporaneous, and the instrument accepted every placement at the time. A tolerance invented after the result is not applied in either direction. **The kill switch's keyboard path.** - During the session the kill switch reported ESC four times, each while the pan returned to rest before a trial. The operator did not press it, and the terminal lacked macOS Input Monitoring. - No trial was running. Each freeze held, and the placement was repeated. - The cause is unexplained. The keyboard path of the kill switch is therefore not trusted for this certificate. The heartbeat and interlock path is what counts (a PR-002 item). **Loop time.** - Three counted trials had one control step of 85–90 ms: trial 10 (88.9 ms), trial 16 (87.3 ms) and trial 36 (85.0 ms). That is above the pre-session A4 band (max 85 ms) and under G3's in-trial bar (90 ms). Their p95s were 71–72 ms. - They are not exclusions. - The declared rate is 15 Hz; the measured A4 loop period is 70.0 ms p95. **Registration residuals.** A9 of record: rms 2.4 mm, max 4.2 mm, against the camera (r2). **Errata.** All nine, by number, with causes. Canonical text: `PR-001/PR-001.ERRATA.md` in ARM-ANI (also copied to the rig record): | Erratum | Date (IST) | What changed | Cause | |---|---|---|---| | 1 | 25 Sep | Posting date: 24 Sep in the document, posted 25 Sep | Not committed and tagged by 23:59 IST on 24 Sep; stated | | 2 | 25 Sep | The NULL-001 session moved to 26 Sep 10:00–12:00 | Build's miss: the G3 runtime layer, fault harness, base-guard code and runner were not built overnight | | 3 | 26 Sep 14:33 | NULL-001 re-frozen: grasp close target 1.81 % → 22.35 % | The 25 Sep grip measurement: the 1.81 % close overloads the gripper; 22.35 % is the smallest squeeze that held | | 4 | 26 Sep 14:33 | Base guard: three corners, a touch-validity check, a scripted approach pose | The 25 Sep touch carried at least 4.8 mm of placement error, which is not a measurement | | 4a | 26 Sep 19:10 | Validity judged against the camera's geometry; the verdict is change since registration | Erratum 4 as worded marked the A9 of record's own touches invalid | | 4b | 28 Sep 14:55 | Touch height within ±1.5 mm; the second re-check capture becomes the standing rule | Far-right touches read about 3 mm above the table; the re-check's A3 term sat at the 2.5 px boundary | | 4c | 29 Sep 11:24 | Bands set at the instrument's measured noise (height ±4 mm, distances 5 mm), for one run after a 4b INVALID | A resting tip's FK height varies about 4 mm with posture | | 5 | 26 Sep 14:33 | Readiness gate FAILED; NULL-001 is the policy of record | The clock: the four gate items were not all met by 26 Sep 12:00 | | 6 | 28 Sep 14:15 | New window, 28 Sep | The 27 Sep window passed without a session (the operator was not at the rig) | | 7 | 29 Sep 11:24 | New window, 29 Sep (start by 13:30) | 28 Sep: guard INVALID, and 15:30 passed | | 8 | 29 Sep 12:14 | The base guard is disclosed, not gating; ruler and clamp checks gate instead | The touch instrument cannot resolve the guard's bar | | 9 | 29 Sep 15:30 | Yaw tolerance omission disclosed; PR-002 registers a yaw tolerance | PR-001 registered none, and the runner did not check yaw | **The promised video does not exist (PR-001 §7).** The session runner records stills and per-step logs, not video. The evidence is 88 hashed placement and capture photos and 41 step logs (§8). If a freeze is filmed on 30 September it is labelled a demonstration and is not session evidence. **The G0 audit of the simulation environment was not performed (PR-001 §7, 28–29 Sep).** No learned policy exists, so no sim replay and no real-to-sim gap (G2.3) was produced. The audit is a PR-002 item. **Also not covered** (PR-001 §8): - generalization to other objects, lighting, placements, cameras, arms or firmware; - safety for anyone but the operator; - the simulation's role, which is audit and gap replay only (G2.3, the real-to-sim gap, is not applicable: no learned policy); - independent verification: the operator ran and signed, mitigated by the timestamped pre-registration, the append-only hash chain and the full data release; - the null's own limits: no yaw information, and thin jaw margins in the worst case. ## 3. Result of record **Session.** `NULL-001-S20260929T124459`, 29 Sep 2026, 12:45:58–15:05:23 IST, daylight. - Decided by the frozen code (`g2_decision.py` `84d2207a…`). - **Result of record: `decision_of_record_2026-09-29.json`.** Trial 35 is corrected to a failure there, per the ruling of 29 Sep 15:30. The chain row stays as written, and the correction note is attached. **G2.2: PASS.** 29 of 40 against a bar of ≥ 22 of 40. Wilson 95 % [57 %, 84 %]. | Cell | A1 | A2 | A3 | A4 | B1 | B2 | B3 | B4 | |---|---|---|---|---|---|---|---|---| | Successes of 5 | 4 | 3 | 3 | 3 | 4 | 4 | 4 | 4 | - **Tails:** - (a) no cell at 0/5; - (b) the longest failure run is 5 (the tail triggers at 7); - (c) no policy-attributable envelope violation. - **Exclusions:** 1 of the 8 allowed. Trial 11 was a hardware fault: one control step of 107 ms fired G3's `loop_dt`. It was re-run on the same placement as trial 12. - **G2.6, reported and not used:** - first 30 trials: PASS, 20/30 against a bar of 17; - with the "arm within ε of rest" conjunct relaxed: 29/40. - **Sensitivities for the yaw audit, reported and not used:** - only the 30 placements within 20° of the listed yaw: 22/30, Wilson [55.6 %, 85.8 %]; - the seven off-yaw successes counted as failures: 22/40, at the bar. - **As first recorded:** 30/40. Trial 35's capture photo shows the cube in the operator's hand over the spawn box, with the zone empty. The operator's account, verbatim: "I think a bit of my hand just came in, nothing else." **The session's record** (all of it in the chain; no counted trial changed): | Item | Count | |---|---| | Round re-checks | 5, all PASS. Rounds 1–4 had the A3 term at-boundary, logged under erratum 4b; round 4 needed a second capture | | Camera read failure at the first placement photo | 1 (12:47, before any trial). The runner now re-opens the camera once; that fired once, at 13:32 | | Stops because the arm was not within 1° of rest before a trial (1.1–2.5°) | 7 | | Session ends / resumes | 10 / 9 | ## 4. What the number means An open-loop script with no camera, driven from the registration alone, passed the bar written for a learned policy, at 29/40 with an upper confidence bound of 84 %. That is the pre-registered null doing what a null is for. **The task as registered is not discriminative for a learned policy.** PR-002's bar is set above the null's upper confidence bound. This is the finding of PR-001, more than the PASS. ## 5. The G3 monitors The fault-injection table (dry run, 28 Sep 14:18, `fault_injection_20260928T141801.json`) shows all rows as expected. **Six monitors were seen to fire live:** | Monitor | Seen live | |---|---| | Joint margin | Real excursion, 25 Sep 12:57: the gripper froze at 97.86 % (range limit 97.72) | | Joint speed | Live-fault test, 28 Sep 14:15: the pan at 3.9°/s against a **scaled** limit of 3°/s. The production limit, 292°/s, cannot be reached at 10 % speed | | Workspace box | Live-fault test, 28 Sep 14:16: the fingertip left the production box | | Gripper overload | Grip measurement, 25 Sep: fired 0.533 s after the load crossed the bar | | Loop time | Live-fault test, 28 Sep 14:15 (a 199 ms step), and in this session: trial 11 (107 ms), excluded | | Kill switch | A10, 18 Sep: the operator's stop froze the arm. In this session: 4 unexplained ESC freezes (§2) | - **No false alarm** in 20 nominal replays. - **Dry only:** the provenance chain (a deleted row is detected), the secrets scrubber, the heartbeat (freeze at 5:01 and not at 4:59), and the session-start refusal. - **Not applicable to NULL-001:** G3.2 image out-of-distribution and G3.10 intervention mode. ## 6. Named artifacts | Artifact | File | SHA-256 | |---|---|---| | PR-001 | `PR-001.md` | `81f371b286d7f250364782b03bf129471085eeea3626644ef2a30bc7ff43a2e1` (bytes) | | Registration r2 | `registration_2026-09-24_r2.json` | `9fb34cea93f5dddd379fad43c9f0a371b9a1575a7dc1556f0fe8113158605c88` (canonical) | | Arm calibration | `so101_follower_anchor.json` | `fe4e6e5ba56f79f8713eac4e583ea54f929160bff96984317b0df8db7580f4fa` | | Camera calibration (A2 of record) | — | `f9f4b9c15386541ddabcacf8262da14651b4641869b983a28b3f8f866e327266` | | NULL-001 specification (erratum 3) | `null/NULL-001.md` | `5ddbbb4f2573cc9a9549911d226e6c5a2df55041f59ec0bac857b5f7aac203b2` | | NULL-001 planner (erratum 3) | `null_plan.py` | `ea4a1fcc8ae9381e2d0063df597a7c83718def2124744edbc1308031ce412dda` | | NULL-001 plan table (erratum 3) | `null/NULL-001_plan_9fb34cea_e3.json` | `8ecf9a00d87f125206d1f2096e116204e665bf04137cb561142ac9511e226d39` (canonical, as the runner checks it) | | G2 placement list | `g2/placements_v1.json` | `09999e5914805f6c12953d9aeabc6faa90d7777a80b1be8edbbe5b24e9dfe6bf` (canonical) | | Layout v3 | `layout/layout_v3.json` | `e6e60f79d1c68753e16265b355bca546f010efd1f84277cec8105ee4df9f45c5` (canonical) | | G2 decision code | `g2_decision.py` | `84d2207ac04520f05e04f24be106ecb466756a380d9ab3730ad203693b65955c` | Superseded by erratum 3, never run: spec `3c8d80bb…`, planner `e544e2d1…`, plan `2be55a5b…`. ## 7. Instrument defects **Caught before any result.** These are PR-001 §9's items, each with a fix and a fixture: - one night, three tool failures (A2b, A9, A2); - five anchor steps that accepted garbage; - gates and records: a dry-run A10 that satisfied the kill-switch gate, a refused write that lost its block, a certificate line that printed "stable" for a failed bar, and a null that would have come down on the cube; - five evidence-loss defects. **Caught after posting, before a result:** - The guard as first worded marked the A9 of record's own touches invalid. Found from the record before the erratum was filed (4a). - The touch-height band sat below the instrument's noise. Found by the read-only tip check (4c, 8). - The re-check's second term (A3) sat at its 2.5 px boundary. The standing rule came before the second capture (4b). - Under the old two-term reading, the runner's between-round re-checks would have voided round 1. Fixed before the session started. - The camera dropped its first read, before any trial. The runner now re-opens it once. **Caught after the result:** - **Trial 35.** Its capture read disagreed with its own photo. Corrected to a failure (§3). - **The yaw.** The yaw tolerance omission was also found after the result, by build's audit. It is disclosed in §2 (erratum 9), not adjudicated. ## 8. Evidence manifest `phase0/null/sessions/NULL-001-S20260929T124459/EVIDENCE_MANIFEST_2026-09-29.json`, SHA-256 `60f34b75832e9d77cdd2ccceccab9bfeffcff731b00fd3b2d340107d155fb6ee`. It holds 231 files by SHA-256: - 88 photos (placement and capture); - 41 step logs; - 11 decision files; - the logs, the code and the frozen artifacts. | Item | SHA-256 | |---|---| | Trial chain `trials.jsonl` (72 rows, verifies) | `a16ca5ec8ebfb8fef1d351c753d996b84a5d8779a6930cacde6b9bc137a8f47d` | | `decision_of_record_2026-09-29.json` (29/40) | `937a5f2a64ce9d4268cf8f5b3ebe688b11a330b910648d552faa119fcfae8823` | | `decision_20260929T150523.json` (the session's own decision, 30/40 as recorded) | `f190ba70e443d97db80f0dfea0ce26316b7755c1f3e13f47425927d06112f51c` | | `decision_20260929T150540.json` (re-decided on a resume after completion; same table) | `b02c2f9c88889a6b6ab4d791ab0a1d1aed6201b1a72c8255bc77bc6709c27bc9` | ## 9. Fixtures The full negative and control fixture suite was re-recorded on the rig on 29 Sep 2026 at 15:22 IST: **189 of 189 as expected**, no missing steps. - Registry SHA-256: `44c96fdb5c9998fa0f74b81add7ba6f8908e00b828219af20d87623bd2c2fe6d`. - Anchor record SHA-256 after recording: `49f9e7b1913d82c6d00d389a356d09a69577b4a806aad36528a837be7b88e821`. ## 10. Signature Operator: Aniket Mallick — signed on 29 September 2026 by committing this file at tag `cert-001`; the tag's commit hash and this file's SHA-256 are posted beside it. Ratified by the architect channel against this file's SHA-256 (RULING-2026-09-29d), stamp posted beside the file. --- ### Open items (build → architect; not part of the certificate) 1. **Erratum 1's line.** Its text is in `PR-001/PR-001.ERRATA.md` in ARM-ANI (erratum 2 was committed `d89632a`, "awaiting push"). Neither is in the rig folder. Errata 3–9 need appending there before the tag. 2. **Erratum 9's text** is not yet filed in `phase0/`. The row above uses your ruling of 15:30. 3. **Video.** The runner records stills only. There is no video of the monitored runs or of a freeze unless the operator filmed one. Your call: publish without video, or film a demonstration freeze (for example `g3live`) on 30 Sep, labelled as a demonstration and not as session evidence. 4. **G0 audit of the sim environment.** Build has no record of it in this window. The draft lists G2.3 as not applicable; correct it if you hold a sim audit record. 5. **Publishing** is the operator's step: the tag, the push, and the site ledger line.