diff --git a/AUDIT-2026-11-01.md b/AUDIT-2026-11-01.md new file mode 100644 index 0000000..adc73ee --- /dev/null +++ b/AUDIT-2026-11-01.md @@ -0,0 +1,1121 @@ +# Audit: repository alignment with P-03 rev20.2 and Use Case 1 (1 November 2026) + +Status: Phase 1 audit, read-only. Phase 2 fix PRs are linked in the section "Fix pull requests". +This file records findings; it changes no decision. Every value comes from the register; the +P-03 addendum and the Use Case 1 baseline are provenance only. + +## Scope and sources + +- Register: `decisions.yaml` on openAMRobot/.github main `1678735` (in force: P-03-rev20.2, 2026-11-01). +- P-03 Decision Addendum rev20.2 (items 24, 25, 26): read from the plan set on 2026-11-01. Provenance only; not held in any repository. +- Use Case 1 Requirements Baseline for OpenAMRobot 2.0 rev18.5: read on 2026-11-01. It is confidential, so this report cites it only by UC1-nn identifier and robot-level values. +- BOM Issue 7.14: file metadata confirmed (Issue 7.14, modified 2026-11-01); the content was not read by the lead. One reviewer reported a BOM decision line on wired versus wireless charging; it is listed as an unverified D finding for the owner. +- Repositories audited (14, each on origin/main): .github `1678735`, openamr-platform-sw `4926f40`, openamr-platform-fw `f96014d`, openamr-platform-hw `8ed2b06`, openamr-upperbody-sw `f57e54c`, openamr-upperbody-fw `ba1a53f`, openamr-upperbody-hw `e760126`, openamrobot-interfaces `14912e1`, openamrobot-manipulation `be76d30`, openamrobot-ui `0ca798b4`, openamrobot-comm `73fa694`, openamrobot-docs `cd780d6`, openamrobot-manifest `d9ab9db`, openamrobot-release `c39eda7`. openamrobot-embodied-ai (`56bbd36`) is not in rollout/repositories.yaml; the register check found 0 findings there and its reading notes are not part of the counts. +- openamr-upperbody-sw is audit only: no branch or PR (its PR stack is being merged). + +## Method + +1. Register check, from this checkout, once per repository: + `python3 tools/check_decisions.py --decisions decisions.yaml --maintainers maintainers.yaml --root --repository ` +2. Reading review of README and docs pages, package READMEs, configuration and parameter files, URDF/xacro comments, launch files, firmware and hardware docs, against every register decision area and the UC1 requirements each repository implements or documents. +3. Open PRs of every repository were fetched (`refs/pull//head`) and diffed, so each finding records whether an open PR already changes the same lines. +4. Classes: A = retired value presented as current (text); B = imprecise or incomplete description of a current decision; C = implementation differs (code, config, geometry, parameter); D = conflict between sources (register, P-03, Use Case 1 baseline, or between repositories); E = missing coverage. +5. "fixable" means class A or B, pure text, outside the out-of-scope list (safety logic or safety-path wording that changes a function, message/service/action definitions, topic names, launch argument names, configuration IDs, URDF/xacro geometry, joint origins, masses, dependency pins, CI thresholds and allowlists) and outside the safety paths in maintainers.yaml. +6. Historical text (dated logs, changelogs, evidence records, lines labelled superseded, legacy, historical or Gate A) is kept; only text presenting a retired value as current is a finding. +7. Personal names, prices, contact data and internal links found in repositories are reported here without reproducing them. + +Verification of this repository on `1678735`: `bash rollout/verify.sh` PASS (289 tests executed, 0 skipped); `check_decisions.py --validate-only` exit 0 (46 loaded, 41 recorded, 2 open, 3 superseded); `check_agent_rules.py --file AGENTS.md` PASS (v2). + +## Summary count per class and repository + +Counts are table rows; one row can group several lines that share one issue. "checker findings" is the number of lines the register check reported; they are classified in each repository's checker table and are not double-counted in A to E. + +| repository | checker findings | A | B | C | D | E | total | +|---|---|---|---|---|---|---|---| +| .github | 0 | 1 | 10 | 0 | 9 | 14 | 34 | +| openamr-platform-sw | 55 | 11 | 14 | 12 | 4 | 7 | 48 | +| openamr-platform-fw | 2 | 3 | 15 | 1 | 2 | 6 | 27 | +| openamr-platform-hw | 24 | 42 | 25 | 0 | 6 | 12 | 85 | +| openamr-upperbody-sw | 2 | 0 | 9 | 6 | 4 | 5 | 24 | +| openamr-upperbody-fw | 0 | 2 | 5 | 0 | 1 | 4 | 12 | +| openamr-upperbody-hw | 0 | 3 | 7 | 0 | 1 | 6 | 17 | +| openamrobot-interfaces | 0 | 2 | 3 | 1 | 1 | 1 | 8 | +| openamrobot-manipulation | 0 | 1 | 5 | 0 | 2 | 5 | 13 | +| openamrobot-ui | 1 | 8 | 6 | 3 | 0 | 5 | 22 | +| openamrobot-comm | 0 | 0 | 0 | 0 | 0 | 1 | 1 | +| openamrobot-docs | 31 | 23 | 17 | 0 | 9 | 6 | 55 | +| openamrobot-manifest | 0 | 0 | 3 | 0 | 0 | 0 | 3 | +| openamrobot-release | 2 | 1 | 1 | 0 | 0 | 1 | 3 | +| **total** | 117 | 97 | 120 | 23 | 39 | 73 | 352 | + +## Conflicts between sources (class D, owner decisions) + +These are disagreements between the register, P-03 rev20.2 and the Use Case 1 baseline. The audit does not choose; each needs the named entry's owner. + +| # | topic | register | P-03 rev20.2 | Use Case 1 baseline rev18.5 | owner action | +|---|---|---|---|---|---| +| S1 | IMU topic used by the EKF | IMU-TOPIC-OWNERSHIP: "the host filter and EKF own /imu/data" | item 24: the EKF fuses only angular_velocity.z and reads /imu/data_raw directly; /imu/data stays reserved for a host orientation filter | not stated | decide; platform-sw ekf.yaml reads /imu/data today | +| S2 | Actuator precharge | not recorded (STATE.md known gap) | item 26: precharge fitted, Kpre with resistor and fuse across K2 | step 1 of the recovery chain mentions pre-charge only as a dependency | record in the register (safety path, electrical owner) | +| S3 | "Chest E-stop" wording | not recorded | item 26: retired in text; "the second E-stop on the static lift column"; ESTOP_CHEST stays as a signal name until the I8 rename | UC1-04 already uses the static column | record in SAFETY-PROCUREMENT with a check pattern | +| S4 | K1/K2 contactors | SAFETY-PROCUREMENT: Gigavac GX11CAC | item 26: GX11CAC stays recorded until the decision of 2 November 2026 (option B: industrial contactor with mirror contacts) | not stated | update after the 2 November decision | +| S5 | tof_front / tof_rear x | NEAR-FIELD-FRAMES: x +/-0.399 (lens face, owner confirmation 20 Oct) | item 19 D6 still writes x +/-0.390 | not stated | correct P-03 item 19 D6 at the next revision, or the register | +| S6 | Base camera height | CAMERAS: 144 mm (0.098 + 0.046), base_camera_link (0.387, 0, 0.046) | item 15 still writes 142.5 mm; item 19 D3 update has (0.387, 0, 0.046) | UC1-52 and the camera-angle tables still use about 243 mm and 0 to 15 degrees | correct P-03 item 15 and UC1-52 | +| S7 | imu_link | FRAMES-REP105: (0.0544, 0, 0.1210), yaw -90 deg | item 15 still writes (0.195, 0, -0.044); item 19 D5 update and item 26 agree with the register | not stated | correct P-03 item 15 | +| S8 | Head camera | HEAD-CAMERA-IDENTITY: lens 0.042 m ahead, baseline 30 deg (hp30) | items 15, 17, 18 agree with the register | UC1-50 still writes about 22 mm ahead and baseline 25 deg; camera-angle section uses 25 deg | correct UC1-50 (decision-allow: HEAD-CAMERA-IDENTITY audit quotes the retired text) | +| S9 | Lift holding | LIFT: DOLD written confirmation received 14 Oct 2026; gate closes with the holding test on the delivered unit | item 26 agrees | UC1-14 and UC1-75 still Open, "written confirmation before ordering" | update UC1-14 and UC1-75 | +| S10 | Brake engagement with suppression diode | DRIVETRAIN: "engagement at most 30 ms without diode" only | item 21: at most 100 ms with a diode; suppression set by the F2S stopping rerun | UC1-27: brakes alone about 100 N; P-03 item 21 about 120 N | add the diode value; reconcile the holding figure | +| S11 | E-01 revision cited | sources cite E-01 rev1.1, rev1.3, rev1.5 | item 20 cites rev1.0; item 26 cites rev1.6 | header cites rev1.6 | name the E-01 revision in force in the register | +| S12 | Final alignment markers | DOCK-NO-CONTACTS, DOCKING-NOT-CHARGING (positioning only) | not stated | UC1-47 names a marker family that differs from the AprilTag implementation in openamr-platform-sw | confirm the marker family for 2.0 | +| S13 | UC1-04 citation | SAFETY-PROCUREMENT cites P-03 rev20.0 item 24 | item 24 records the second E-stop | UC1-04 cites "P-03 rev20.0 item 15" | correct the citation in the baseline | +| S14 | Charging in BOM Issue 7.14 (unverified by the lead) | CHARGING: WCM-500-24 is the 2.0 path; PWR-019 removed | item 20 agrees with the register | not stated | owner checks the BOM 7.14 decisions sheet, reported to say "wired only in 2.0" and to reuse PWR-019 | +| S15 | Platform pin | PLATFORM-PIN: platform-sw dfd44a5 | item 25 D7: moves to platform-sw main with the 2.0 base after PR #14, with a full A6/A7 rerun | not stated | .github #74 (131e500) and upperbody-sw #21, #22, #26, #27 pin different SHAs | +| S16 | Register coverage of P-03 item 24 equipment | no entries for F-PANEL 3 A always-on 24 V, lift node CTL-017 on CAN3, SICK IME12 stop sensors, head light, near-field sensor supply | item 24 records them | UC1-53, UC1-54 | add entries (class E for the register) | +| S17 | Name of the 30 Oct / 6 Nov milestone | UI-GATE-A: "full UI Gate A on 6 November 2026", a UI milestone distinct from hardware Gate A | item 24: "Gate A (simulation): the full Gate A moves to 6 November 2026"; 30 Oct partial A1 result | not stated | decide whether the milestone is the UI Gate A or the simulation Gate A; openamrobot-docs roadmap pages use "Gate A" for it | + + +## Fix pull requests + +Phase 2 fixes class A and B findings marked fixable, one draft PR per repository. Each row marked fixable "yes" that a PR changed is listed under "Fixed in" in its repository section; every other row stays open (owner decision, covered by another open PR, safety path, or value unknown). + +| repository | fix PR | status | +|---|---|---| +| .github | [.github#80](https://github.com/openAMRobot/.github/pull/80) | draft; 8 rows fixed; skipped rows and reasons in the PR body | +| openamr-platform-sw | [openamr-platform-sw#107](https://github.com/openAMRobot/openamr-platform-sw/pull/107) | draft; 33 rows fixed; skipped rows and reasons in the PR body | +| openamr-platform-fw | [openamr-platform-fw#32](https://github.com/openAMRobot/openamr-platform-fw/pull/32) | draft; 16 rows fixed; skipped rows and reasons in the PR body | +| openamr-platform-hw | [openamr-platform-hw#42](https://github.com/openAMRobot/openamr-platform-hw/pull/42) | draft; 62 rows fixed; skipped rows and reasons in the PR body | +| openamr-upperbody-sw | none | audit only (PR stack #14, #20 to #27 being merged); its fixable rows stay open | +| openamr-upperbody-fw | [openamr-upperbody-fw#13](https://github.com/openAMRobot/openamr-upperbody-fw/pull/13) | draft; 6 rows fixed; skipped rows and reasons in the PR body | +| openamr-upperbody-hw | [openamr-upperbody-hw#14](https://github.com/openAMRobot/openamr-upperbody-hw/pull/14) | draft; 10 rows fixed; skipped rows and reasons in the PR body | +| openamrobot-interfaces | [openamrobot-interfaces#32](https://github.com/openAMRobot/openamrobot-interfaces/pull/32) | draft; 2 rows fixed; skipped rows and reasons in the PR body | +| openamrobot-manipulation | [openamrobot-manipulation#26](https://github.com/openAMRobot/openamrobot-manipulation/pull/26) | draft; 5 rows fixed; skipped rows and reasons in the PR body | +| openamrobot-ui | [openamrobot-ui#58](https://github.com/openAMRobot/openamrobot-ui/pull/58) | draft; 4 rows fixed; skipped rows and reasons in the PR body | +| openamrobot-comm | none | no class A or B finding (one class E) | +| openamrobot-docs | [openamrobot-docs#67](https://github.com/openAMRobot/openamrobot-docs/pull/67) | draft; 53 rows fixed; skipped rows and reasons in the PR body | +| openamrobot-manifest | [openamrobot-manifest#20](https://github.com/openAMRobot/openamrobot-manifest/pull/20) | draft; 3 rows fixed; skipped rows and reasons in the PR body | +| openamrobot-release | [openamrobot-release#17](https://github.com/openAMRobot/openamrobot-release/pull/17) | draft; 2 rows fixed; skipped rows and reasons in the PR body | + +# Findings per repository + +## .github + +### Fixed in [.github#80](https://github.com/openAMRobot/.github/pull/80) + +- .github/ISSUE_TEMPLATE/contract_change_request.yml:10 (CONFIG-IDS) +- contract_change_request.yml:44 (LIFT) +- ROADMAP.md:68 (NAV-LIDAR) +- ROADMAP.md:109 (BASE-CONTROLLER-GATES) +- profile/README.md:26 (ARM-MOUNT) +- profile/README.md:473 (DRIVETRAIN) +- profile/README.md:474 (ESTOP-SCOPE, UC1-70) +- profile/README.md:82 (CHARGING) + + +Reviewed: AGENTS.md, STATE.md, README.md, ROADMAP.md, profile/README.md, CONTRIBUTING.md, RELEASE_POLICY.md, GOVERNANCE.md, ENGINEERING_QUALITY_STANDARD.md, WATCHDOG.md, .github/ISSUE_TEMPLATE, public-extract-allowlist.yaml, decisions.yaml (46 entries) against the P-03 rev20.2 facts and UC1 IDs in the brief. Open PRs: #74 diffed (decisions.yaml); #41, #69, #70, #76 file lists (no overlap with findings). +Prices in README.md:153-172 and profile/README.md:70-80 are allowlisted by the platform lead (public-extract-allowlist.yaml, 29 Sep 2026); (contact address) is allowlisted; public-extract check: 0 findings. Not reported. + +Verification run on 1678735 (2026-11-01): +- `bash rollout/verify.sh`: PASS, exit 0; "Tests executed: 289 of 289 (skipped 0)"; stages test and evidence PASS. +- `python3 tools/check_decisions.py --decisions decisions.yaml --maintainers maintainers.yaml --validate-only`: exit 0; "46 loaded, 41 recorded and scanned, 2 open, 3 superseded". +- `python3 tools/check_agent_rules.py --canonical agent-rules/SHARED_RULES.md --file AGENTS.md`: "PASS AGENTS.md (v2)", exit 0. + +### Policy and public files + +| file | line | class | decision ID or UC1-nn | current text or behaviour (short quote) | correct text or behaviour | source | fixable | overlap | +|---|---|---|---|---|---|---|---|---| +| .github/ISSUE_TEMPLATE/contract_change_request.yml | 10 | A | CONFIG-IDS | "configuration IDs (for example mast_1350)" | "configuration IDs (for example base_plate bp050)" | CONFIG-IDS (mast_id superseded) | yes | none | +| .github/ISSUE_TEMPLATE/contract_change_request.yml | 44 | B | LIFT | placeholder "MAST-INSTALL-HEIGHT / none" (a superseded entry) | "LIFT / none" | LIFT | yes | none | +| STATE.md | 12, 16, 23 | B | process (STATE.md) | "on main ed98001 ... it is P-03-rev20.1"; "#78 ... draft, rebased on ed98001" | #78 merged as 1678735; main in_force P-03-rev20.2 (2026-11-01); add this verify result | git log | yes | none | +| ROADMAP.md | 64 | D | none (not in register) | "Dual 6-DoF Arms" | profile/README.md:471 says "two OpenArm 2.0 arms (7 DoF each)"; value unknown (owner) | profile/README.md | no (D) | none | +| ROADMAP.md | 68 | B | NAV-LIDAR | "3D LiDAR" | "navigation LiDAR (SLAMTEC RPLIDAR S3, S3M1-R2)" | NAV-LIDAR | yes | none | +| ROADMAP.md | 109 | B | BASE-CONTROLLER-GATES | "STM32 / Teensy / MCU" | "STM32H723ZG base controller (2.0); Teensy only in the Gate A legacy configuration and as the release fallback" | BASE-CONTROLLER-GATES, BASE-CONTROLLER-IO | yes | none | +| ROADMAP.md | 63-69 | E | LIFT | robot components list has no lift | add "lift (approved in principle for 2.0)" | LIFT | no (E) | none | +| profile/README.md | 26 | B | ARM-MOUNT | "arm profile 180 mm ahead of the column axis" | "arm mount point 180 mm ahead of the column axis" | ARM-MOUNT (P-03 rev19.0 item 19) | yes | none | +| profile/README.md | 473 | B | DRIVETRAIN | "Hub-motor drive with fail-safe holding brakes" | "hub-motor drive with holding brakes (fail-safe behaviour still needs verification evidence)" | DRIVETRAIN check | yes | none | +| profile/README.md | 474 | B | ESTOP-SCOPE, UC1-70 | "two E-stops that cut motor power" | "two hardwired E-stops that cut actuator power (traction, both arms, lift); the Jetson, 5 V and regulated 24 V stay powered" | ESTOP-SCOPE | yes (descriptive text; platform lead review) | none | +| profile/README.md | 82 | B | CHARGING | "every package includes a Daly charger for manual charging" | Daly 28.4 V / 20 A charger (PWR-005) is bench only, through the SB50 connector with the E-stop pressed; 2.0 charging is the WCM-500-24 wireless path | CHARGING | yes (commercial text; platform lead wording) | none | +| profile/README.md | 466 | B | PUBLICATION | "hackathon with the robot at (venue)" (partner or venue named) | docs owner decides | AGENTS.md Publication | no (owner) | none | +| profile/README.md | 44 | B | PUBLICATION | names an application domain as "one of our first demonstration use cases" | docs owner confirms it is acceptable under the Use_Case_1 naming rule | AGENTS.md Publication | no (owner) | none | + +### Register (decisions.yaml): D and E for the owner, never fixable here + +| file | line | class | decision ID or UC1-nn | current text or behaviour (short quote) | correct text or behaviour | source | fixable | overlap | +|---|---|---|---|---|---|---|---|---| +| decisions.yaml | 615, 621 | D | IMU-TOPIC-OWNERSHIP | "the host filter and EKF own /imu/data" | P-03 item 24: EKF fuses only angular_velocity.z and reads /imu/data_raw directly; /imu/data reserved for a host orientation filter when needed; firmware also publishes /imu/temperature | P-03 rev20.2 item 24 | no | none | +| decisions.yaml | 409 | D | NEAR-FIELD-FRAMES | tof_front (0.399, 0, -0.0066) | P-03 item 19 D6 still writes 0.390; register follows owner confirmation 20 Oct; P-03 needs correcting | P-03 item 19 D6 | no | none | +| decisions.yaml | 648 (CAMERAS), 369 (FRAMES-REP105) | D | CAMERAS, FRAMES-REP105 | 144 mm, imu_link (0.0544, 0, 0.1210) | P-03 item 15 still writes 142.5 mm and imu_link (0.195, 0, -0.044); P-03 internal staleness | P-03 item 15 | no | none | +| decisions.yaml | 831-846 | E | SAFETY-PROCUREMENT | no precharge | actuator precharge fitted, no longer conditional (Kpre with resistor and fuse across K2; SAF-004, PWR-014, PWR-015) | P-03 rev20.2 items 2, 26 | no (safety path) | none | +| decisions.yaml | 838, 848 | E | SAFETY-PROCUREMENT | retirement of "chest E-stop" wording not recorded | text says "the second E-stop on the static lift column"; ESTOP_CHEST stays only as a signal name until the I8 rename | P-03 rev20.2 item 26 | no | none | +| decisions.yaml | 840 | E | SAFETY-PROCUREMENT | K1/K2 Gigavac GX11CAC recorded without a pending marker | GX11CAC stays until the decision on Mon 2 Nov 2026 (option B industrial contactor with mirror contacts); owner updates after it | P-03 rev20.2 item 26 | no (safety path) | none | +| decisions.yaml | 67, 1469 | E | OPERATOR-PANEL | source text "whole chest layout" | retired "chest" wording (item 26) | P-03 rev20.2 item 26 | no | none | +| decisions.yaml | 490 | E | DRIVETRAIN | brake engagement only "at most 30 ms without diode" | add at most 100 ms with a diode; holding about 120 N at the wheel; ZLAC8015D and arms stay on raw SAFE bus | P-03 item 21 | no | none | +| decisions.yaml | (absent) | E | UC1-04, UC1-13, UC1-19, UC1-34 | item 24 equipment not registered | F-PANEL 3 A on always-on regulated 24 V (replaces F-PD; Getac USB-PD PWR-008 and head light stay on during E-stop); lift node CTL-017 (MCU + H-bridge on CAN3, motor stage from SAFE 24 V converter, logic from always-on rail); three SICK IME12-04BNSZC0S stop sensors at z 120/295/470 mm (L1000/L1175/L1350); head light Falcon FLDL-i150x15-W (24 V, 0.32 A); Banner WLS28 and HELLA S800 dropped; no lift duty-cycle limit in firmware; second E-stop spare NO to a lift-node input; base E-stop and RESET hole positions | P-03 item 24 | no | none | +| decisions.yaml | 884-887 | E | SAFETY-CHAIN-IO | base E-stop spare NO "as a diagnostic input" | add: diagnostics only, does not show the second E-stop; falling-edge reset setting is an open gate; TPL7407L outputs from regulated 24 V | P-03 item 22 | no (safety path) | none | +| decisions.yaml | 1151 | E | NAV-LIDAR, UC1-10 | "connected over USB" | USB through a USB to UART adapter; sllidar_ros2 at 1,000,000 baud; /scan in lidar_link; backup RPLIDAR S2E only if S3 unavailable | P-03 item 13 | no | none | +| decisions.yaml | 718-728 | E | POWER-RAILS, UC1-53 | aux converters not named | RSD-60G-5 and RSD-100B-24 for the auxiliary rails | P-03 item 2 | no | none | +| decisions.yaml | 912 | E | ESTOP-SCOPE, UC1-70 | "the Jetson, the 5 V rail and the regulated 24 V rail stay powered" | UC1-70 also names the base controller and sensors as staying powered | UC1-70 | no | none | +| decisions.yaml | 846, 891, 917, 944, 973, 1083, 1110, 1440 | D | E-01 citations | cites E-01 rev1.1, rev1.3 and rev1.5 | P-03 rev20.2 item 26 says E-01 rev1.6 carries item 26; P-03 item 20 still says rev1.0; rev in force unknown (owner) | P-03 items 20, 26 | no | none | +| decisions.yaml | 1051 | D | PLATFORM-PIN | "pinned platform-sw commit (dfd44a5 on 20 Oct 2026)" | open #74 moves it to 131e500 per P-03 rev20.1 item 25 D7; #74 is based on in_force 2026-10-18 and must be rebased; item 25 D1 to D4 (lift and adapter-plate datums) are not in the register (E) | PR #74 | no | #74 | +| decisions.yaml | 189 | E | BOM-ISSUE-IN-FORCE | supersedes lists 7.11, 7.10, 7.8 ...; check says "Issue 7 to 7.13 ... are retired" | supersedes history for 7.12 and 7.13 missing (or confirm they never existed) | P-03 rev20.2 item 26 | no | none | +| decisions.yaml | 1226-1227 | D | LIFT, UC1-14 | DOLD confirmation received; holding test is the gate | UC1-14 baseline rev18.5 still says Open | UC1 baseline | no | none | +| decisions.yaml | 691 (HEAD-CAMERA-IDENTITY), 648 (CAMERAS) | D | UC1-50, UC1-52 | 42 mm, hp30; base camera 144 mm, bt05/bt10/bt15 | UC1 baseline still says 22 mm and 25 deg; about 243 mm and 0 to 15 deg | UC1 baseline | no | none | +| decisions.yaml | (absent) | D | UC1-47 | no fiducial named in DOCK entries | UC1-47 names ArUco final alignment; platform-sw AGENTS.md and release v0.0.1 notes name AprilTag docking | UC1-47 | no | none | +| decisions.yaml | (absent) | E | STATUS-VOCABULARY, CHARGING | not settled whether a chain opened by charging (charge relay opens PNOZ supply) is SAFETY_STOPPED | owner decides (open as Q8 in interfaces #31) | interfaces #31 | no | none | +| decisions.yaml | (absent) | E | UC1-01, UC1-07, UC1-09, UC1-55, UC1-61, UC1-62, UC1-71, UC1-72, UC1-73, UC1-74, UC1-84, UC1-90..93 | no register entries | gross mass <= 120 kg weighed; no teleoperation during a run; four rigid castors 52 mm; four cameras, head camera on its own USB root hub; one timebase; LeRobot camera keys; recovery within 2 min (target 15 s), no re-homing, no automatic resume; arms have no brakes; JetPack isolated; bounded progress and recovery | UC1 baseline rev18.5 | no | none | + +### Checker findings classification + +None (0 findings in /tmp/audit/.github.json). + +## openamr-platform-sw + +### Fixed in [openamr-platform-sw#107](https://github.com/openAMRobot/openamr-platform-sw/pull/107) + +- bringup/config/ekf.yaml:3-4 (BASE-CONTROLLER-GATES) +- bringup/README.md:134-135 (BASE-CONTROLLER-GATES) +- drivers.launch.py:2-6 (BASE-CONTROLLER-GATES) +- drivers/README.md:4, 11-12 (BASE-CONTROLLER-GATES, IMU-TOPIC-OWNERSHIP) +- perception/config/scan_body_filter_real.yaml:6-7 (NAV-LIDAR) +- nav2/config/nav2_params.yaml:339 (SPEED-CEILING) +- docs/real_robot/00_overview.md:10-33 (COMPUTE, BASE-CONTROLLER-GATES, DRIVETRAIN, POWER-RAILS) +- docking/docs/00_overview.md:11 (DOCKING-NOT-CHARGING) +- docking/docs/02_architecture.md:3, 8-9 (DOCKING-NOT-CHARGING) +- docking/docs/14_docking_research.md:46, 59 (CHARGING) +- docs/real_robot/04_compute_and_thermal.md:114 (PUBLICATION) +- docs/navigation/03_planner_controller.md:5 (COMPUTE) +- docs/navigation/04_real_robot_tuning.md:111 (CAMERAS) +- docs/real_robot/00_overview.md:18, 28 (COMPUTE) +- docs/real_robot/00_overview.md:31, 96 (CAMERAS) +- docs/real_robot/00_overview.md:70 (IMU-TOPIC-OWNERSHIP) +- docs/real_robot/01_bringup.md:56, 59, 60, 167 (CAMERAS) +- docs/real_robot/01_bringup.md:69 (IMU-TOPIC-OWNERSHIP) +- docs/real_robot/02_networking_and_dds.md:17 (COMPUTE) +- docs/real_robot/02_networking_and_dds.md:112, 03_vision_pipeline_and_cpu.md:47, 04_compute_and_thermal.md:28, 05_calibration.md:84, 94, 95, 07_troubleshooting.md:76 (CAMERAS) +- docs/real_robot/04_compute_and_thermal.md:14, 114 (COMPUTE (+ PUBLICATION)) +- docs/troubleshooting/diagnostics.md:52 (BASE-CONTROLLER-GATES) +- docs/troubleshooting/diagnostics.md:102 (CAMERAS) +- bringup/README.md:122 (CAMERAS) +- bringup/launch/bringup.launch.py:213 (CAMERAS) +- bringup/launch/real_bringup.launch.py:55, 60 (CAMERAS) +- docking/docs/00_overview.md:13 (DOCKING-NOT-CHARGING) +- docking/docs/02_architecture.md:8 (DOCKING-NOT-CHARGING) +- docking/docs/09_troubleshooting.md:224 (DOCK-NO-CONTACTS) +- docking/docs/14_docking_research.md:664 (CAMERAS) +- docking/launch/apriltag.launch.yml:4 (CAMERAS) +- drivers/launch/drivers.launch.py:85 (IMU-TOPIC-OWNERSHIP) +- perception/launch/camera.launch.py:2 (CAMERAS) + + +Read-only review. Simulation, URDF and frames mostly follow the register (base_link 0.098, imu_link, base_camera_link bt10, lidar_link, wheel radius 0.100, track 0.400 placeholder labelled). The main gaps: near-field frames (us_* x, tof_* pitch) still differ from the register (fix is in PRs #103 and #105), the real-robot path still runs Gate A only (Teensy serial, IMX708, identity static TFs, A1 default) with no 2.0 path, and the safety and real_robot docs describe the existing robot without labelling it. + +| file | line | class | decision ID or UC1-nn | current text or behaviour (short quote) | correct text or behaviour | source | fixable | overlap | +|---|---|---|---|---|---|---|---|---| +| ros2/src/openamrobot_description/urdf/sensors.xacro | 133-136 | C | NEAR-FIELD-FRAMES | us_front_* x="0.3906", us_rear_* x="-0.3886" | x +/-0.390 (panel outer face) | register NEAR-FIELD-FRAMES | no (URDF geometry) | covered by #103 and #105 | +| ros2/src/openamrobot_description/urdf/sensors.xacro | 142-143 | C | NEAR-FIELD-FRAMES | tof_front/tof_rear pitch="0.3491" (20 deg down) | pitch 0.1745 (10 deg down), confirmed only by the bench test | register NEAR-FIELD-FRAMES | no (URDF geometry) | covered by #103, #105 (also #93, whose comment wrongly says "confirmed by the bench test") | +| ros2/src/openamrobot_description/urdf/sensors.xacro | 139-141 | A | NEAR-FIELD-FRAMES | "20 deg down is the screening value until the bench test (platform lead decision 2026-10-12)" | "Pitched 10 deg down (register NEAR-FIELD-FRAMES); the bench test confirms it" | register | yes (comment) | covered by #103 and #105 | +| ros2/src/openamrobot_description/config/sensor_frames.yaml | 43, 49, 55, 61 | C | NEAR-FIELD-FRAMES | xyz [0.3906, ...] / [-0.3886, ...] | x +/-0.390 | register | no (frame values) | covered by #103 and #105 | +| ros2/src/openamrobot_description/config/sensor_frames.yaml | 69, 75 | C | NEAR-FIELD-FRAMES | rpy [0.0, 0.3491, ...] "# 20 deg down, screening value" | 0.1745, 10 deg down | register | no | covered by #103 and #105 | +| ros2/src/openamrobot_description/urdf/robot.sdf | 692-709 | C | NEAR-FIELD-FRAMES | us_* 0.3906 / -0.3886; tof pitch 0.3491; comment "20 degree down screening value" | x +/-0.390; pitch 0.1745 | register | no | covered by #103 and #105 | +| docs/navigation/01_architecture.md | 100-101 | A | NEAR-FIELD-FRAMES | "(0.3906, ±0.130, −0.0066)" / "(−0.3886, ±0.130, −0.0066)" | "(±0.390, ±0.130, −0.0066)" | register | yes, after #103 or #105 merges (the doc tracks the URDF) | file not in any open PR | +| docs/navigation/01_architecture.md | 104 | A | NEAR-FIELD-FRAMES | "tof_rear ← (−0.399, 0, −0.0066), pitch 0.3491, yaw π" | "pitch 0.1745 (10° down), yaw π" | register | yes, after #103 or #105 | file not in any open PR | +| ros2/src/openamrobot_bringup/config/ekf.yaml | 2, 32 | D | IMU-TOPIC-OWNERSHIP | imu0: /imu/data | P-03 item 24: EKF reads /imu/data_raw directly; /imu/data is kept for a host filter. Register: "the host filter and EKF own /imu/data". Owner decides | P-03 rev20.2 item 24 vs register | no (topic name) | none | +| ros2/src/openamrobot_bringup/config/ekf.yaml | 3-4 | A | BASE-CONTROLLER-GATES | "The MPU6500 IMU has NO valid orientation ... (~14deg tilted mounting)" presented as the IMU | "Gate A (legacy) IMU MPU6500: ...; the 2.0 IMU is the ICM-42688-P on the TDK EV_ICM-42688-P; the EKF fuses only angular_velocity.z (P-03 item 24)" | register | yes (comment) | none | +| ros2/src/openamrobot_bringup/README.md | 134-135 | A | BASE-CONTROLLER-GATES | "The MPU-6500 has no valid orientation quaternion..." | name it the Gate A (legacy) IMU; 2.0 IMU ICM-42688-P (TDK EV_ICM-42688-P) | register | yes | none | +| ros2/src/openamrobot_bringup/launch/real_bringup.launch.py | 90 | C | FRAMES-REP105 | static base_link -> base_footprint identity (not labelled Gate A) | base_footprint on the floor, 0.098 m below base_link (URDF via robot_state_publisher) | register | no (launch geometry) | none | +| ros2/src/openamrobot_bringup/launch/real_bringup.launch.py | 88 | C | FRAMES-REP105 | static base_link -> imu_link identity (Gate A) | 2.0: imu_link (0.0544, 0, 0.1210), yaw -pi/2 from the URDF | register | no | none | +| ros2/src/openamrobot_bringup/launch/real_bringup.launch.py | 54-97 | E | FRAMES-REP105, CAMERAS, NAV-LIDAR | real path starts no robot_state_publisher; only Gate A static TFs (lidar 0.335/0.18, camera_link) | 2.0 real path loads the URDF so 2.0 frames exist on the robot | register | no | none | +| ros2/src/openamrobot_drivers/launch/drivers.launch.py | 86-89 | E | BASE-CONTROLLER-IO, UC1-81 | micro-ROS agent "serial -b 115200" to the Teensy only | 2.0: STM32H723ZG to Jetson, micro-ROS over Ethernet UDP; USB for the bench only | register, UC1-81 | no (launch) | none | +| ros2/src/openamrobot_drivers/launch/drivers.launch.py | 2-6 | A | BASE-CONTROLLER-GATES | docstring "micro-ROS agent (Teensy) ... runs in the Teensy firmware" as the current design | label Teensy as Gate A (legacy); name the 2.0 base controller STM32H723ZG (transport not yet in this launch) | register | yes (docstring) | none | +| ros2/src/openamrobot_drivers/README.md | 4, 11-12 | A | BASE-CONTROLLER-GATES, IMU-TOPIC-OWNERSHIP | "runs in the Teensy"; "bridges the Teensy topics ... /imu/data" | label as Gate A (legacy) Teensy; 2.0 firmware publishes /imu/data_raw | register | yes | none | +| ros2/src/openamrobot_drivers/launch/drivers.launch.py | 81 | C | NAV-LIDAR, UC1-10 | lidar_model default 'a1' (documented interim until the S3 is mounted) | 2.0 default s3 (sllidar_ros2, 1,000,000 baud, already prepared) once mounted | register, P-03 item 13 | no (launch default) | none | +| ros2/src/openamrobot_perception/launch/camera.launch.py | whole file | E | CAMERAS | real camera path is only the IMX708 via camera_ros | a Gemini 336L real driver launch (base_camera_link) | register CAMERAS | no | #101, #103, #57 touch this file (other lines) | +| ros2/src/openamrobot_gazebo/config/gz_bridge.yaml | 37-38 | C | IMU-TOPIC-OWNERSHIP | sim IMU bridged as "imu" (/imu) | /imu/data_raw for the sensor stream (2.0 firmware contract) | register | no (topic name) | #53, #105 touch this file | +| ros2/src/openamrobot_nav2/config/navigation_status_profile.yaml | 39-41 | C | IMU-TOPIC-OWNERSHIP | topic "/imu" "# nothing publishes this in the sim", frame base_link | sim does bridge /imu (gz_bridge.yaml:37); 2.0 raw topic /imu/data_raw in imu_link | register | no (topic) | none | +| ros2/src/openamrobot_perception/config/scan_body_filter_real.yaml | 6-7 | B | NAV-LIDAR | "Not yet re-measured with the RPLIDAR S3 ... re-measure ... before relying on them" | contradicts lines 13-16 and the register: filter from v0.0.1 unchanged, S3 side posts inside the close-mask sectors | register NAV-LIDAR | yes (comment) | none | +| ros2/src/openamrobot_nav2/config/nav2_params.yaml | 172, 217 | C | ARM-MOUNT (chassis 780 x 582) | footprint front x 0.415 (rear updated to -0.390) | front edge value unknown (owner); chassis x +/-0.390 in the URDF | register ARM-MOUNT | no (config) | #90, #91, #92 touch this file (other lines) | +| ros2/src/openamrobot_nav2/config/nav2_params.yaml | 339 | B | SPEED-CEILING, UC1-02 | "SINGLE approved real-robot limit" (0.20 m/s) | tuning limit only; the accepted operating speed follows from the stability model and stopping tests; 1.5 m/s is the command ceiling | register | yes (comment) | same file in #90/#91/#92, different lines | +| ros2/src/openamrobot_nav2/config/nav2_params.yaml | 384, 394-396 | C | DOCKING-NOT-CHARGING | docking_server block with SimpleChargingDock, wait_charge_timeout 5.0; docking_server is not in lifecycle_nodes (navigation_launch.py:43) | dormant; if launched it is a charger plugin waiting for charge. Positioning only (non-charging dock plugin): unknown (owner) | register | no (config) | same file in #90/#91/#92, different lines | +| docs/safety/00_safety_overview.md | 7-9, 84-87 | E | ESTOP-SCOPE, SAFETY-PROCUREMENT, UC1-03, UC1-04, UC1-70, UC1-73 | "There is currently no hardware E-stop" with no 2.0 statement | existing robot: no E-stop; 2.0: exactly two hardwired E-stops (base front, rear face of the static lift column), PNOZ s3, K1/K2 GX11CAC, actuator power only, monitored manual reset | register | no (safety wording, platform lead) | #66 changes these lines but writes "two LEV100H contactors" (superseded; register: Gigavac GX11CAC) and proposes an /estop topic (contract) | +| docs/safety/00_safety_overview.md | 30-47, 58-62 | B | TELEMETRY-NOT-SAFETY-EVIDENCE | collision_monitor and firmware watchdog called "the safety layers"; watchdog "the most robust" | functional layers, never safety evidence; E-stop, brake and actuator power removal are hardwired | register | no (safety wording, platform lead) | #66 same file, different lines | +| docs/safety/00_safety_overview.md | 36, 47, 60 | A | BASE-CONTROLLER-GATES, COMPUTE | "firmware (Teensy)", "if the Pi 5 freezes" as current | label "(existing robot, Gate A)"; 2.0: STM32H723ZG, Jetson Orin NX 16 GB on J401 | register | yes (label only) | #66 same file, different lines | +| docs/safety/02_limits_and_watchdog.md | 86-87 | A | POWER-RAILS, BATTERY-PLACEMENT | "The system is 2× 12 V lead-acid in series" | label as existing robot; 2.0: one 8S1P EVE LF105 LiFePO4 pack, 25.6 V, 105 Ah, no 12 V rail; 2.0 voltage thresholds unknown (owner) | register | yes | same file in #90, different lines (#90 changes 22, 32-34) | +| docs/safety/02_limits_and_watchdog.md | 40-44 | A | BASE-CONTROLLER-GATES, COMPUTE | "The Teensy motor firmware ... if the Pi 5 freezes" | label "(existing robot, Gate A)" | register | yes (label only) | same file in #90, different lines | +| docs/safety/02_limits_and_watchdog.md | 20-21, 25-27 | B | SPEED-CEILING | quotes max_accel [0.5, 0.0, 0.5], max_decel [-2.5, 0.0, -2.0], "approved real-robot limits" | config has max_accel [1.0, 0.0, 3.0], max_decel [-2.5, 0.0, -3.0] (nav2_params.yaml:342-343); tuning limits, not an accepted operating speed | nav2_params.yaml, register | yes | same file in #90, different lines | +| docs/safety/README.md; docs/navigation/00_overview.md; README.md | 5; 42; 379 | E | ESTOP-SCOPE, UC1-03 | "no hardware E-stop / safety_io yet" | state that this is the existing robot; 2.0 has two hardwired E-stops (see above) | register | no (safety wording) | #66 changes all three (README.md:379 and 00_overview.md:42 covered; LEV100H issue as above) (decision-allow: SAFETY-PROCUREMENT audit quotes the retired text) | +| docs/real_robot/00_overview.md | 10-33 | A | COMPUTE, BASE-CONTROLLER-GATES, DRIVETRAIN, POWER-RAILS | "What the real robot is": Teensy 4.0, Pi 5, ZBLD drivers, "2× 12 V lead-acid" with no existing-robot label | header label: "This series records the existing robot (Gate A, release 001 / v0.0.1). OpenAMRobot 2.0: Jetson Orin NX 16 GB on J401, STM32H723ZG, ZLAC8015D on CAN1 with 200 mm wheels, Gemini 336L, RPLIDAR S3, 25.6 V LiFePO4, no 12 V rail." | register | yes | file not in any open PR | +| ros2/src/openamrobot_docking/docs/00_overview.md | 11 | B | DOCKING-NOT-CHARGING | "dock onto a charging station" | "dock at a docking station (positioning only; docking never establishes charging)" | register | yes | none | +| ros2/src/openamrobot_docking/docs/02_architecture.md | 3, 8-9 | B | DOCKING-NOT-CHARGING | "the Nav2 / opennav_docking integration ... is otherwise current"; "Real robot uses SimpleChargingDock ... config/openamrobot_docking.yaml" | not current: docking_real.launch.py starts dock_trigger.py, docking_server is not launched, config/openamrobot_docking.yaml does not exist | code | yes | none | +| ros2/src/openamrobot_docking/docs/14_docking_research.md | 46, 59 | B | CHARGING | "No vendor recommendation"; "not designed against a single charger's spec" with no reference to the decision | add: "The 2.0 charging path is the TZBOT WCM-500-24 (register CHARGING); docking stays positioning only" | register | yes | none | +| ros2/src/openamrobot_docking (whole package), AGENTS.md scope | - | D | UC1-47 | AprilTag 36h11 3-tag bundle for final alignment | UC1-47: ArUco final alignment; register has no marker-family entry. Owner decides | UC1 baseline rev18.5 vs repo | no | none | +| ros2/src/openamrobot_description/config/sensor_frames.yaml | 68 | D | NEAR-FIELD-FRAMES | tof_front x 0.399 (follows the register) | P-03 item 19 D6 still writes 0.390; the register (0.399) wins. Owner updates P-03 | P-03 rev20.2 vs register | no | none | +| ros2/src/openamrobot_description/config/sensor_frames.yaml | 16-22 | D | CAMERAS, UC1-52 | base_camera_link (0.387, 0, 0.046), bt10 (follows the register, 144 mm) | UC1-52 baseline still says about 243 mm, 0 to 15 deg; P-03 item 15 still 142.5 mm. Owner updates the sources | UC1 rev18.5, P-03 vs register | no | none | +| ros2/src/openamrobot_nav2/config/nav2_params.yaml | 303, 312-313 | E | UC1-07 | AssistedTeleop enabled; TELEOP "UNPROTECTED" (navigation_status_profile.yaml:57); no gate against teleop during a run | no teleoperation during a run; how it is enforced: unknown (owner) | UC1-07 | no | #90 adds twist_mux / stop lock (partial) | +| docs (all) | - | E | STOP-SCOPE | no statement of "Stop (software)" as a functional, base-only stop | "Stop (software)" is a robot-side functional stop, base motion only today; "E-stop" means only the hardwired buttons | register | no | #90 (stop lock, Proposed per UI-MANUAL-VELOCITY-INPUT) | +| README.md | 22 | B | RELEASE-MILESTONES | "part of the **OpenAMRobot vX.X.X** release" | the actual release tag; which one: unknown (owner) (v0.0.1 published; v2.0.0-rc.1 on 20 Nov 2026) | register, P-03 item 12 | no (value unknown) | #103 touches README.md (other lines) | +| README.md | 425-452 | B | PUBLICATION | backer tiers with prices ((price) ...(price)/mo) and payment links | no prices in public material; owner decides | AGENTS.md Publication | no (owner) | #103 and #66 touch README.md (other lines) | +| docs/real_robot/04_compute_and_thermal.md | 114 | B | PUBLICATION | "((price) clip-on" | drop the price | AGENTS.md Publication | yes | none | +| docs/navigation/01_architecture.md | 87 | B | PUBLICATION | "Values from the platform lead decision 2026-10-12" | whether a maintainer first name counts as a private person: unknown (owner); neutral form "maintainer decision 2026-10-12" | AGENTS.md Publication | yes, if the owner agrees | none | +| tools/cad/base_mesh_map.yaml | 35-36 | B | PUBLICATION | drive.google.com links to BOM Issue 7.14 and B-02 | internal document links in a public repository (path outside the listed public paths); owner decides | AGENTS.md Publication | no (owner) | #105 touches this file | +| ros2/src/openamrobot_description/README.md | 44 | B | BASE-CONTROLLER-GATES | "STM32 click mount plate" | no click shield in 2.0 (P-03 item 26); whether the plate MMP.04.00.00.003 stays and its name: unknown (owner) | register, P-03 item 26 | no (value unknown) | #105 same file, different lines | +| STATE.md | 45-46 | B | BOM-ISSUE-IN-FORCE | "Register BOM-ISSUE-IN-FORCE still names BOM Issue 7.10" | the register now names Issue 7.14; remove the stale gap | register 1678735 | yes | #101, #103, #105 and others touch STATE.md; #103 rewrites these lines to "Issue 7.10; 7.11 is a source only" (stale) | + +### Checker findings classification + +| file:line | ID | class | proposed exact replacement text (if fixable) | overlap | +|---|---|---|---|---| +| AUTHORS.md:65 | DOCKING-NOT-CHARGING | false positive (upstream class name in a credit line) | - | none | +| STATE.md:47 | BASE-CONTROLLER-GATES | false positive (records that the envelope is still the MIKROE outline; already names TDK as 2.0) | - | many PRs touch STATE.md | +| docs/navigation/01_architecture.md:103 | NEAR-FIELD-FRAMES | A (after the code fix) | `├─ tof_front ← (0.399, 0, −0.0066), pitch 0.1745 (10° down), TF-Luna` | none; apply after #103/#105 | +| docs/navigation/01_architecture.md:112 | NEAR-FIELD-FRAMES | A | "The TF-Luna pitch is 10° down (register NEAR-FIELD-FRAMES); the bench test confirms it." | none | +| docs/navigation/03_planner_controller.md:5 | COMPUTE | A | "heavy, slow diff-drive robot on a Raspberry Pi 5, legacy (existing robot)" | none | +| docs/navigation/04_real_robot_tuning.md:111 | CAMERAS | A | "lower sensor or a physical bumper; the 2.0 Gemini 336L base camera tilts up (bt05/bt10/bt15))" | none | +| docs/safety/00_safety_overview.md:92 | CAMERAS | A | "sensor, physical bumper; the 2.0 Gemini 336L base camera tilts up). See" | #66 same file, other lines | +| docs/real_robot/00_overview.md:18, :28 | COMPUTE | historical, allow-label | append ", legacy (existing robot)" after "Raspberry Pi 5" (plus the section label above) | none | +| docs/real_robot/00_overview.md:31, :96 | CAMERAS | historical, allow-label | "IMX708, legacy (existing robot)" | none | +| docs/real_robot/00_overview.md:70 | IMU-TOPIC-OWNERSHIP | historical, allow-label | "`/imu/data` (Gate A Teensy; 2.0 firmware publishes `/imu/data_raw`)" | none | +| docs/real_robot/01_bringup.md:56, :59, :60, :167 | CAMERAS | historical, allow-label | "IMX708, legacy (existing robot)"; for 59/60 (kernel strings) a section label "Existing robot (Gate A) camera" | none | +| docs/real_robot/01_bringup.md:69 | IMU-TOPIC-OWNERSHIP | historical, allow-label | "The agent bridges the Gate A Teensy: ... `/imu/data` (2.0 firmware: `/imu/data_raw`)" | none | +| docs/real_robot/02_networking_and_dds.md:17 | COMPUTE | historical, allow-label | alt text "Raspberry Pi 5, legacy (existing robot)" | none | +| docs/real_robot/02_networking_and_dds.md:112, 03_vision_pipeline_and_cpu.md:47, 04_compute_and_thermal.md:28, 05_calibration.md:84, :94, :95, 07_troubleshooting.md:76 | CAMERAS | historical, allow-label | "IMX708, legacy (existing robot)" | none | +| docs/real_robot/04_compute_and_thermal.md:14 | COMPUTE | historical, allow-label | "Raspberry Pi 5 Model B Rev 1.1, legacy (existing robot)" | none | +| docs/real_robot/04_compute_and_thermal.md:114 | COMPUTE | historical, allow-label; also PUBLICATION price | "fit the official Raspberry Pi 5 Active Cooler, legacy (existing robot) (clip-on" (price removed) | none | +| docs/troubleshooting/diagnostics.md:52, :102 | BASE-CONTROLLER-GATES, CAMERAS | historical, allow-label (dated log, 2026-06-18) | label the file "Existing robot (Gate A) diagnostics log" or add "legacy (existing robot)" on the line | none | +| ros2/src/openamrobot_bringup/README.md:122 | CAMERAS | historical, allow-label | "`camera_ros` (IMX708, legacy (existing robot))" | none | +| ros2/src/openamrobot_bringup/launch/bringup.launch.py:213 | CAMERAS | historical, allow-label | `description='Real only: launch the IMX708 camera, legacy (existing robot) (false = lighter load).'` | #53, #73, #105 touch the file, other lines | +| ros2/src/openamrobot_bringup/launch/real_bringup.launch.py:55, :60 | CAMERAS | historical, allow-label | "IMX708 camera, legacy (existing robot)" in the comment and description | none | +| ros2/src/openamrobot_description/meshes/PROVENANCE.yaml:791, :3916; tools/cad/base_mesh_map.yaml:135, :350 | BASE-CONTROLLER-GATES | false positive (CAD-instance provenance; text already names TDK EV_ICM-42688-P as the 2.0 board); generated/map files | - | #105 touches both files | +| ros2/src/openamrobot_description/urdf/sensors.xacro:61, :72 | FRAMES-REP105 | false positive (says "was the MIKROE-4237 Click" and that the outline is the STEP instance) | - | #103, #105 touch the file, other lines | +| ros2/src/openamrobot_docking/docs/00_overview.md:13 | DOCKING-NOT-CHARGING | A | "... engages perpendicular to the tag at a configurable distance, aligned at the docking pose (positioning only; docking does not establish charging)." | none | +| ros2/src/openamrobot_docking/docs/02_architecture.md:8, :88, :138, :173 | DOCKING-NOT-CHARGING | historical, allow-label (file header says LEGACY; upstream class name) but see B row on line 3/8 | line 8: "- **Real robot (legacy design, not launched)**: `opennav_docking::SimpleChargingDock` (upstream class name; docking is positioning only)" | none | +| ros2/src/openamrobot_docking/docs/07_reproduce_results.md:165, 10_diagrams.md:27, 12_lessons_learned.md:480, 14_docking_research.md:686 | DOCKING-NOT-CHARGING | false positive (upstream opennav_docking class name; no charging claim) | - | none | +| ros2/src/openamrobot_docking/docs/09_troubleshooting.md:224 | DOCK-NO-CONTACTS | A | "the robot stops further from the dock and won't reach the docking pose;" | none | +| ros2/src/openamrobot_docking/docs/14_docking_research.md:664 | CAMERAS | A | "OpenAMRobot 2.0 uses the Orbbec Gemini 336L RGB-D base camera (register CAMERAS); visual SLAM in support of lidar SLAM is an anticipated direction ..." | none | +| ros2/src/openamrobot_docking/docs/14_docking_research.md:684 | CAMERAS | false positive (third-party industry reference, MiR) | - | none | +| ros2/src/openamrobot_docking/launch/apriltag.launch.yml:4 | CAMERAS | historical, allow-label | "# Does NOT start a camera: the real camera (camera_ros / IMX708, legacy (existing robot)) is already" | none | +| ros2/src/openamrobot_drivers/launch/drivers.launch.py:85 | IMU-TOPIC-OWNERSHIP | historical, allow-label | "# micro-ROS agent: bridges the Gate A Teensy (/cmd_vel, /odom/unfiltered, /imu/data); 2.0 firmware publishes /imu/data_raw." | none | +| ros2/src/openamrobot_nav2/config/nav2_params.yaml:396 | DOCKING-NOT-CHARGING | C, not text (dormant upstream plugin; docking_server not launched) | no text fix; owner decides the plugin | #90/#91/#92 same file, other lines | +| ros2/src/openamrobot_perception/launch/camera.launch.py:2 | CAMERAS | historical, allow-label | "Camera bring-up for the existing robot (Sony IMX708, legacy (existing robot), via camera_ros)." | #101, #103, #57 touch the file, other lines | + +## openamr-platform-fw + +### Fixed in [openamr-platform-fw#32](https://github.com/openAMRobot/openamr-platform-fw/pull/32) + +- README.md:3-5 (BASE-CONTROLLER-GATES (A)) +- README.md:7-11 (BASE-CONTROLLER-GATES (B)) +- README.md:36-46, 136 (BASE-CONTROLLER-IO (B)) +- docs/architecture/base-controller-2-0-io.md:19 (and 18) (BASE-CONTROLLER-IO (B)) +- docs/architecture/control-loop.md:3 (BASE-CONTROLLER-GATES (B)) +- docs/architecture/debug-telemetry.md:3 (BASE-CONTROLLER-GATES (B)) +- docs/architecture/encoder-calibration.md:3 (BASE-CONTROLLER-GATES (B)) +- docs/bringup/micro-ros-bringup.md:3 (BASE-CONTROLLER-GATES (B)) +- docs/flashing/build-and-flash.md:3 (BASE-CONTROLLER-GATES (B)) +- docs/troubleshooting/common-issues.md:3 (BASE-CONTROLLER-GATES (B)) +- docs/bringup/micro-ros-bringup.md:13 (COMPUTE, IMU-TOPIC-OWNERSHIP (B)) +- docs/bringup/diagrams/micro-ros-node-topology.svg:2, 12, 15 (COMPUTE (B)) +- docs/architecture/encoder-calibration.md:62 (COMPUTE (B)) +- tools/encoder-calibration/README.md:5 (COMPUTE (B)) +- boards/teensy_4_0/linorobot2_overlay/README.md:3-4 (BASE-CONTROLLER-GATES (B)) +- boards/teensy_4_0/linorobot2_overlay/README.md:17 (PUBLICATION (B)) + +Not fixed (removed from the fix PR by the lead): checker: firmware.ino:404 (IMU-TOPIC-OWNERSHIP (historical, allow-label)). Upstream-derived firmware is left untouched to keep third-party provenance. + + +Register: decisions.yaml main 1678735 (P-03 rev20.2). AGENTS.md and STATE.md read from refs/pr/24 (not on main). +Open PRs touching reviewed files: #31 and #19 (both docs/architecture/base-controller-2-0-io.md, overlapping hunks at line 10), #18 (docs/safety/motion-safety.md), #22/#23/#27/#28/#29 (STM32 project, CI, overlay README, NOT in this text review except where noted). +Main finding: on main the only 2.0 text is base-controller-2-0-io.md, which still has MIKROE-4237, x 0.195 m, BOM Issue 7.7 and no safety I/O; #31 fixes the board/SPI4/no-click-shield lines, #19 fixes the pose and adds safety I/O; /imu/temperature is in neither. (decision-allow: BASE-CONTROLLER-GATES audit quotes the retired text) + +| file | line | class | decision ID or UC1-nn | current text or behaviour (short quote) | correct text or behaviour | source | fixable | overlap | +|---|---|---|---|---|---|---|---|---| +| README.md | 3-5 | A | BASE-CONTROLLER-GATES | "Low-level motor-control firmware ... running on a **Teensy 4.0**." | "... Gate A (legacy): Teensy 4.0 linorobot2 overlay. Gate B and 2.0: STM32H723ZG on the NUCLEO-H723ZG (CubeMX project in PR #22, not on main)." | register BASE-CONTROLLER-GATES | yes | none | +| README.md | 7-11 | B | BASE-CONTROLLER-GATES | "The firmware currently ships as a Teensy 4.0 linorobot2 overlay ... what runs on the robot today" | add "(Gate A unit, existing robot; also the release fallback behind I8; STM32 go/no-go 6 November 2026)" | register BASE-CONTROLLER-GATES | yes | none | +| README.md | 14 | B | RELEASE-MILESTONES | "part of the **OpenAMRobot vX.X.X** release" | unknown (owner); openamrobot-release is ground truth (v0.0.1 current public release; v2.0.0-rc.1 20 Nov 2026) | register RELEASE-MILESTONES | yes | none | +| README.md | 36-46, 136 | B | BASE-CONTROLLER-IO | prerequisites and agent over "serial --dev /dev/ttyACM0", unlabelled | label "Gate A (Teensy, USB serial)"; 2.0: Ethernet to the Jetson, micro-ROS over UDP, USB for the bench only | register BASE-CONTROLLER-IO | yes | none | +| docs/architecture/base-controller-2-0-io.md | 10 | B | BOM-ISSUE-IN-FORCE | "Source: P-03 Decision Addendum rev19.0 items 14 and 19 (12 October 2026), BOM Issue 7.7." | "Source: P-03 rev20.2 (items 19, 22, 24 and 26); OpenAMRobot 2.0 Detailed Hardware BOM Issue 7.14." | register BOM-ISSUE-IN-FORCE | yes | covered by #31; #19 changes the same line to rev19.6 / BOM Issue 7.10 (stale, conflicts with #31) | +| docs/architecture/base-controller-2-0-io.md | 19 | B | BASE-CONTROLLER-IO | TF-Luna "one UART each; pin 5 tied to 3.3 V" (no supply) | add supplies: TF-Luna on 5 V (pin 5 to 3.3 V), MB7060 on 3.3 V from a dedicated regulator off 5 V (P-03 item 24; not in register) | P-03 item 24 | yes | not covered by #19 or #31 | +| docs/architecture/base-controller-2-0-io.md | 26 | A | BASE-CONTROLLER-GATES | "ICM-42688-P (MIKROE-4237) on a dedicated SPI, Mode 0, at most 8 MHz." | "ICM-42688-P on the TDK EV_ICM-42688-P board, SPI4, Mode 0, at most 8 MHz; no click shield, wired directly" | register BASE-CONTROLLER-GATES | yes | covered by #31 (decision-allow: BASE-CONTROLLER-GATES audit quotes the retired text) | +| docs/architecture/base-controller-2-0-io.md | 29 | E | IMU-TOPIC-OWNERSHIP | "Publishes /imu/data_raw; the host filter owns /imu/data." | add "/imu/temperature" (P-03 item 24); see D row below for ownership wording | P-03 item 24 | yes | not covered by #19 or #31 | +| docs/architecture/base-controller-2-0-io.md | 29 | D | IMU-TOPIC-OWNERSHIP | register: "the host filter and EKF own /imu/data" | P-03 item 24: EKF fuses only angular_velocity.z and reads /imu/data_raw directly; /imu/data stays reserved for a host orientation filter when one is needed | register vs P-03 item 24 | no (register owner) | none | +| docs/architecture/base-controller-2-0-io.md | 30 | A | FRAMES-REP105 | "Mounted on the centreline at x 0.195 m from base_link." | "imu_link (0.0544, 0, 0.1210) m from base_link, rpy (0, 0, -pi/2), chip +Y forward, on the electronics bracket MMP.04.00.00.002; raw sensor-frame values, mapping in the URDF, no firmware remap" | register FRAMES-REP105 | yes | covered by #19 (not by #31; #31 leaves line 30 unchanged) | +| docs/architecture/base-controller-2-0-io.md | 32-38 | E | BASE-CONTROLLER-GATES | CAN table, no statement on the click shield | "No click shield: IMU board and CAN isolator wired directly to SPI4 and FDCAN2" | register BASE-CONTROLLER-GATES | yes | covered by #31 | +| docs/architecture/base-controller-2-0-io.md | 37 | E | BMS-FAULTS | "FDCAN2 CAN2 isolated BMS (Daly via CTL-014)" | add: on a BMS warning the STM32 stops motion and locks; the BMS disconnects the pack itself on a hard fault; RUN_OK (D26) dropped | register BMS-FAULTS | yes (requirement text, no logic) | not covered | +| docs/architecture/base-controller-2-0-io.md | (missing section) | E | SAFETY-CHAIN-IO, RESET-BUTTON, CHARGING | no safety and charging I/O | Y32 through one ISO1212; base E-stop spare NO as diagnostic input (diagnostics only, does not show the second E-stop); RESET NC input (hold 5 s: Jetson reboot request, then controller reset); charger fault input; TPL7407L outputs for RESET lamp and KCHG from regulated 24 V; no separate K1/K2 feedback | register SAFETY-CHAIN-IO, RESET-BUTTON; P-03 item 22 | no (safety path) | covered by #19, but #19 names a partner ("On the (partner build) build") and a private person ("owner (team member)") in public docs/ | +| docs/architecture/base-controller-2-0-io.md | 47 | B | PUBLICATION | "Pin allocation is owned by (team member) (I8 work package)." | "Pin allocation is owned by the I8 work-package owner." | AGENTS.md Publication | yes | not covered: #31 keeps "owned by (team member)" | +| docs/architecture/control-loop.md, debug-telemetry.md, encoder-calibration.md, docs/bringup/micro-ros-bringup.md, docs/flashing/build-and-flash.md, docs/safety/motion-safety.md, docs/troubleshooting/common-issues.md | 3 | B | BASE-CONTROLLER-GATES | "*Applies to the Teensy 4.0 linorobot2_overlay firmware.*" | "*Applies to the Gate A (legacy) Teensy 4.0 linorobot2_overlay firmware, also the release fallback; not the 2.0 STM32H723ZG firmware.*" | register BASE-CONTROLLER-GATES | yes | motion-safety.md: same file in #18, different lines | +| docs/bringup/micro-ros-bringup.md | 13 | B | COMPUTE, IMU-TOPIC-OWNERSHIP | alt text "micro-ROS agent on the Pi 5 ... host EKF/Madgwick produces filtered /imu/data" | "agent on the host (existing robot: Raspberry Pi 5, legacy; Gate A: Jetson) ..." | register COMPUTE, BASE-CONTROLLER-GATES (Gate A = Jetson + Teensy) | yes | none | +| docs/bringup/micro-ros-bringup.md | 59-60 | D | IMU-TOPIC-OWNERSHIP | "the host Madgwick/EKF pipeline fuses them into the filtered /imu/data and /odom" | consistent with register; P-03 item 24 says EKF reads /imu/data_raw directly (angular_velocity.z only); owner to settle | register vs P-03 item 24 | no | none | +| docs/bringup/diagrams/micro-ros-node-topology.svg | 2, 12, 15 | B | COMPUTE | "Teensy 4.0 and Raspberry Pi 5" in title and labels | add "(existing robot, legacy)" to the title | register COMPUTE | yes | none | +| docs/safety/motion-safety.md | 6-7 | B | SAFETY-PROCUREMENT, TELEMETRY-NOT-SAFETY-EVIDENCE | "not a substitute for a hardware E-stop (none is wired yet ...)" | label Gate A unit; 2.0 has the hardwired chain (two XB4BS8445 + ZBE-102, PNOZ s3, K1/K2) | register SAFETY-PROCUREMENT | no (safety wording) | #18 adds an E-01 section here but names "two LEV100H contactors" and "contactor feedback" (register: GX11CAC, no separate K1/K2 feedback to firmware) (decision-allow: SAFETY-PROCUREMENT audit quotes the retired text) | +| docs/safety/motion-safety.md | 13 | B | TELEMETRY-NOT-SAFETY-EVIDENCE | "This is the primary software safety net" (watchdog) | "functional stop, never safety evidence" | register TELEMETRY-NOT-SAFETY-EVIDENCE | no (watchdog wording) | #18 adds the functional wording in a new section; line 13 unchanged | +| docs/architecture/encoder-calibration.md | 62 | B | COMPUTE | "host-side (they run on the Pi / a dev PC ...)" | "on the host (Jetson, or the Pi on the existing robot) or a dev PC" | register COMPUTE | yes | none | +| tools/encoder-calibration/README.md | 5 | B | COMPUTE | "(the Pi or a dev PC)" | "(the host computer or a dev PC)" | register COMPUTE | yes | none | +| boards/teensy_4_0/linorobot2_overlay/README.md | 3-4 | B | BASE-CONTROLLER-GATES | "Firmware for the **real OpenAMRobot differential base**, running on a Teensy 4.0" | "Gate A (legacy) firmware for the existing OpenAMRobot base ..." | register BASE-CONTROLLER-GATES | yes | #23/#27/#28/#29 change this file (not diffed for these lines) | +| boards/teensy_4_0/linorobot2_overlay/README.md | 17 | B | PUBLICATION | "## Module mapping (platform lead's plan -> linorobot2 internals)" | "## Module mapping (planned modules -> linorobot2 internals)" | AGENTS.md Publication | yes | #23/#27/#28/#29 change this file (not diffed for this line) | +| boards/teensy_4_0/linorobot2_overlay/src/firmware.ino | 398-405 | C (latent) / historical | IMU-TOPIC-OWNERSHIP | `#ifndef USE_FAKE_MAG "imu/data_raw" #else "imu/data"` | built config publishes /imu/data_raw (USE_FAKE_MAG not defined in lino_base_config.h); the /imu/data branch is upstream linorobot2 code, not built. Gate A legacy firmware, legitimately historical; becomes C only if USE_FAKE_MAG is defined. No /imu/temperature (Gate A; 2.0 requirement only) | register IMU-TOPIC-OWNERSHIP; P-03 item 24 | no (topic names, Apache-derived code) | none | +| boards/stm32/ (main holds .gitkeep) | n/a | E | BASE-CONTROLLER-IO, BASE-CONTROLLER-GATES, IMU-TOPIC-OWNERSHIP, UC1-81 | no 2.0 firmware on main: no SPI4 IMU driver (WHO_AM_I 0x47), no /imu/data_raw or /imu/temperature publisher, no Ethernet UDP micro-ROS, no CAN1/2/3 | STM32H723ZG firmware per register | register entries listed | no (implementation) | #22 adds the CubeMX project (SPI4, FDCAN1/2/3 configured; IMU CS PE11 a candidate) | +| firmware/safety_io/ (placeholder) | n/a | E | SAFETY-CHAIN-IO, BMS-FAULTS, UC1-70, UC1-73 | no 2.0 safety-chain observation or BMS stop-and-lock | issue #17 (E-01 safety state machine) | register SAFETY-CHAIN-IO, BMS-FAULTS | no (safety path; agents must not author) | none | + +### Checker findings classification + +| file:line | ID | class | proposed exact replacement text (if fixable) | overlap | +|---|---|---|---|---| +| boards/teensy_4_0/linorobot2_overlay/src/firmware.ino:404 | IMU-TOPIC-OWNERSHIP | false positive for built behaviour: `"imu/data"` sits in the `#else` of `#ifndef USE_FAKE_MAG`, which this configuration does not build (comment at line 403 already says so); Gate A legacy firmware, historical; allow-label rather than edit (topic name and Apache-derived code are out of scope) | none (allow entry: `decision-allow: IMU-TOPIC-OWNERSHIP upstream linorobot2 branch not built, USE_FAKE_MAG undefined, Gate A`) | none | +| docs/architecture/base-controller-2-0-io.md:26 | BASE-CONTROLLER-GATES | A | "- ICM-42688-P on the TDK EV_ICM-42688-P board, on SPI4, Mode 0, at most 8 MHz; no click shield (MIKROE-4237 superseded, P-03 rev20.2 item 26)." | covered by #31 | + +## openamr-platform-hw + +### Fixed in [openamr-platform-hw#42](https://github.com/openAMRobot/openamr-platform-hw/pull/42) + +- README.md:29-30 (MAIN-PROTECTION) +- README.md:38-40 (COMPUTE, BASE-CONTROLLER-GATES) +- README.md:46-47, 52 (DRIVETRAIN, BATTERY-PLACEMENT) +- README.md:60 (CHARGING) +- README.md:137 (BASE-CONTROLLER-GATES) +- product-architecture.md:8-9 (LIFT, CHARGING) +- product-architecture.md:25 (BATTERY-PLACEMENT, BMS-FAULTS) +- product-architecture.md:47 (SHARED-BASE) +- product-architecture.md:50 (BATTERY-PLACEMENT, BMS-FAULTS) +- product-architecture.md:51 (DRIVETRAIN) +- product-architecture.md:52 (COMPUTE) +- diagrams/system-block.svg title (COMPUTE) +- power.md:47 (POWER-RAILS) +- motors-drivers.md:1-135 (DRIVETRAIN) +- motor-driver-fault-codes.md:1-3 (DRIVETRAIN) +- raspberry-pi.md:1 (COMPUTE) +- teensy.md:1 (BASE-CONTROLLER-GATES) +- imu.md:14 (BASE-CONTROLLER-GATES) +- lidar.md:87 (NAV-LIDAR) +- camera.md:12-13 (CAMERAS) +- camera.md:15 (CAMERAS, CONFIG-IDS) +- camera.md:131 (CAMERAS) +- near-field.md:31 (NEAR-FIELD-FRAMES) +- near-field.md:42-43 (NEAR-FIELD-FRAMES) +- near-field.md:45-46, 53 (NEAR-FIELD-FRAMES) +- encoders.md:1-6 (BASE-CONTROLLER-GATES) +- wiring-pinout.md:1 (BASE-CONTROLLER-GATES) +- datasheets/README.md:14, 18, 20 (DRIVETRAIN) +- datasheets/ZLTech/README.md:2-3 (DRIVETRAIN) +- datasheets/ZDmotor/README.md:1-10 (PUBLICATION) +- motor-sizing-calculations.md:1 (DRIVETRAIN) +- components-bom.md:3-23 (BOM-ISSUE-IN-FORCE) +- components-bom.md:17, 20 (BOM-ISSUE-IN-FORCE) +- components-bom.md:50-52 (DRIVE-TRACK) +- mechanical-bom.md:39-40, 53 (DRIVETRAIN) +- mechanical-bom.md:56-58 (SHARED-BASE) +- mechanical-bom.md:79 (BASE-CONTROLLER-GATES) +- mechanical-bom.md:87-91 (COMPUTE) +- mechanical-bom.md:122, 131, 141 (BOM-ISSUE-IN-FORCE) +- mechanical-bom.md:139 (BATTERY-PLACEMENT) +- mechanical-bom.md:157 (DRIVETRAIN) +- mechanical-bom.md:161 (DRIVETRAIN) +- mechanical-bom.md:162 (DRIVETRAIN, RS485-NOT-IN-2-0) +- mechanical-bom.md:166-173 (COMPUTE) +- mechanical/README.md:6-7 (AGENTS.md layout) +- mechanical/README.md:55-60 (DRIVE-TRACK, DRIVETRAIN) +- mechanical/cad/README.md:67 (stale link) +- mechanical/cad/README.md:81-104 (PUBLICATION) +- manufacturing/assembly/README.md:9 (DRIVETRAIN) +- README.md:44, 81 (COMPUTE) +- README.md:51 (CAMERAS) +- datasheets/README.md:19 (RS485-NOT-IN-2-0) +- datasheets/ZLTech/README.md:2 (DRIVETRAIN) +- ZLTech/wheel_ZLLG80ASM250/readme.md:6, 7 (DRIVETRAIN) +- motor-sizing-calculations.md:132, 133, 134, 143 (RS485-NOT-IN-2-0, COMPUTE) +- raspberry-pi.md:1, 12, 68 (COMPUTE) +- motors-drivers.md:22 (RS485-NOT-IN-2-0) +- power.md:114 (COMPUTE) +- lidar.md:59 (COMPUTE, NAV-LIDAR) +- components-bom.md:21 (COMPUTE) +- mechanical-bom.md:90, 101 (COMPUTE) +- product-architecture.md:13, 22 (COMPUTE) + + +Register: decisions.yaml main 1678735 (P-03 rev20.2). AGENTS.md and STATE.md read from refs/pr/35 (not on main). +Open PRs touching reviewed files: #27 (power.md, safety.md, new e01-safety-and-power.md), #29 (imu.md, lidar.md, near-field.md, product-architecture.md); #35, #37, #38 touch no reviewed text file. +Main finding: almost every electrical, BOM and mechanical page still describes the existing robot (v0.0.1: Pi 5, Teensy, ZD/ZBLD, lead-acid) without a legacy label, and main has no 2.0 power, protection, safety-chain, battery, CAN or compute page (E). PR #27 would add one, but it carries retired values (see the PR #27 rows). + +| file | line | class | decision ID or UC1-nn | current text or behaviour (short quote) | correct text or behaviour | source | fixable | overlap | +|---|---|---|---|---|---|---|---|---| +| README.md | 17 | B | RELEASE-MILESTONES | "part of the **OpenAMRobot vX.X.X** release" | name the real release: unknown (owner); openamrobot-release is ground truth (v0.0.1 current public release; v2.0.0-rc.1 20 Nov 2026, v2.0.0 18 Dec 2026) | register RELEASE-MILESTONES; P-03 item 12 | yes | none | +| README.md | 29-30 | A | MAIN-PROTECTION | "No fuse and no battery-side disconnect are fitted yet" (unlabelled warning) | label as existing robot (v0.0.1); 2.0 has main fuse F0 110 A Class T, then a lockable disconnect, no circuit breaker | register MAIN-PROTECTION | yes (label only) | none | +| README.md | 38-40 | A | COMPUTE, BASE-CONTROLLER-GATES | "## Current validated hardware configuration ... has run the real robot" | retitle "Existing robot (release v0.0.1, Gate A unit) hardware configuration"; add one line: 2.0 is Jetson Orin NX 16 GB on reComputer J401 + STM32H723ZG (NUCLEO-H723ZG) + ZLAC8015D V4.2 / ZLLG80ASM250-L-B | register COMPUTE, BASE-CONTROLLER-GATES, DRIVETRAIN | yes | none | +| README.md | 46-47, 52 | A | DRIVETRAIN, BATTERY-PLACEMENT | ZD Z4BLD60 + ZBLD drivers; "Power: 24 V battery (any chemistry; reference build = 2x 12 V)" as current | under the legacy label; 2.0: two ZLLG80ASM250-L-B with brakes, one ZLAC8015D V4.2 on CAN1; one 8S1P EVE LF105 pack, 25.6 V, 105 Ah near the rear edge | register DRIVETRAIN, BATTERY-PLACEMENT | yes (covered by the row above) | none | +| README.md | 60 | B | CHARGING | alt text "reserved zones ... the optional wireless charger" | "the wireless charger receiver (TZBOT WCM-500-24, the 2.0 charging path)" | register CHARGING | yes | none | +| README.md | 116-119 | A | MAIN-PROTECTION, SAFETY-PROCUREMENT | "Add a 15-20 A fuse/breaker on the battery +"; "ideally an E-stop mushroom on +" | label as existing robot only; 2.0: F0 110 A Class T + lockable disconnect, no breaker; two XB4BS8445 + ZBE-102 E-stops into PNOZ s3 | register MAIN-PROTECTION, SAFETY-PROCUREMENT | no (E-stop wording; label only is possible) | none | +| README.md | 137 | A | BASE-CONTROLLER-GATES | "openamr-platform-fw: Teensy motor-control firmware" | "base-controller firmware: STM32H723ZG (2.0, Gate B); Teensy 4.0 overlay (Gate A, legacy)" | register BASE-CONTROLLER-GATES | yes | none | +| product-architecture.md | 8-9 | A | LIFT, CHARGING | "nothing here implies the base build ships with a lift ... or a wireless charger: it does not" | true only for the existing robot; 2.0: lift approved in principle (DOLD Hexalift V4 350 primary), WCM-500-24 wireless charging is the 2.0 path | register LIFT, CHARGING | yes | same file in #29, different lines | +| product-architecture.md | 25 | A | BATTERY-PLACEMENT | "Power: 24 V bus (any chemistry; reference build 2x 12 V ...)" | Gate A list (labelled at line 27), but 2.0 battery missing from the 2.0 list: 8S1P EVE LF105, 25.6 V, 105 Ah, near rear edge; Daly BMS on CAN2 | register BATTERY-PLACEMENT, BMS-FAULTS | yes | same file in #29, different lines | +| product-architecture.md | 30-31 | A | CAMERAS | "housing centre 142.5 mm above the floor, base_camera_link (0.376, 0, 0.0445), up-tilt 5, 10 or 15 degrees (baseline 10)" | "camera centre 144 mm above the floor, base_camera_link (0.387, 0, 0.046), pitch from base_tilt bt05/bt10/bt15, default bt10" | register CAMERAS | yes | partly covered by #29 (fixes base_camera_link only; leaves 142.5 mm) | +| product-architecture.md | 32-33 | A | FRAMES-REP105, BASE-CONTROLLER-GATES | "on a dedicated SPI, on the centreline at x 0.195 m from base_link" | "on SPI4 (Mode 0), no click shield; imu_link (0.0544, 0, 0.1210), rpy (0, 0, -pi/2), chip +Y forward" | register FRAMES-REP105, BASE-CONTROLLER-GATES | yes | covered by #29 for the pose, but #29 reintroduces "MIKROE-4237 6DOF IMU 14 Click" (superseded) and BOM Issue 7.8 | +| product-architecture.md | 47 | B | SHARED-BASE | "Extra safety pack: ultrasonic (JSN-SR04) + IR (E18-D80NK)" listed as not on the base | release 001 build uses JSN-SR04T ultrasonic and E18-D80NK IR; 2.0 uses MB7060 and TF-Luna (same mounting approach) | register SHARED-BASE | yes | same file in #29, different lines | +| product-architecture.md | 49 | B | CHARGING | WCM-500-24 "is the 2.0 ... charging path" placed under "NOT on the base build" | move charging to the 2.0 list | register CHARGING | yes | #29 rewrites this line (adds WCM-500-24 text, same placement) | +| product-architecture.md | 50 | A | BATTERY-PLACEMENT, BMS-FAULTS | "Battery/BMS: 24 V smart battery pack + BMS (serial)" as an option | 2.0 battery: 8S1P EVE LF105 25.6 V 105 Ah, Daly BMS reporting over CAN2 (LiTech second option) | register BATTERY-PLACEMENT, BMS-FAULTS | yes | same file in #29, different lines | +| product-architecture.md | 51 | A | DRIVETRAIN | "Higher-power drives: ZLTech ZLAC8015D/8030L drivers, hub-motor wheels" as an option | ZLTECH is the selected 2.0 drivetrain: two ZLLG80ASM250-L-B with brakes, one ZLAC8015D V4.2 on CAN1 | register DRIVETRAIN | yes | same file in #29, different lines | +| product-architecture.md | 52 | A | COMPUTE | "on-board NVIDIA (Jetson) for heavier perception" as an option | Jetson Orin NX 16 GB on reComputer J401 is the 2.0 reference compute | register COMPUTE | yes | same file in #29, different lines | +| product-architecture.md | (whole page) | E | LIFT, ARM-MOUNT, NO-SUSPENSION, UC1-04, UC1-09, UC1-34 | no 2.0 upper-body interface, chassis 780 x 582, no-suspension statement | add: no suspension in 2.0; lift base plate on the steel deck (deck 294 mm, base-plate top 304 mm), bp000/bp050; exactly two E-stops (base front, static lift column) | register NO-SUSPENSION, DATUM-HEIGHT-STACK, LIFT, SAFETY-PROCUREMENT | no (new content, owner) | none | +| diagrams/system-block.svg | text | A | COMPUTE, BASE-CONTROLLER-GATES | title "OpenAMRobot mobile base: system block diagram" with Raspberry Pi 5, Teensy 4.0, ZBLD, MPU6500 | add "existing robot (v0.0.1)" to the title | register COMPUTE | yes | none (decision-allow: COMPUTE audit quotes the retired text) | +| electrical/power_distribution/power.md | 1-143 | A | POWER-RAILS, MAIN-PROTECTION | whole page (any 24 V battery, lead-acid thresholds, mains in parallel, 15-20 A fuse) unlabelled | page banner: existing robot (v0.0.1) as built; link the 2.0 E-01 page | register POWER-RAILS, MAIN-PROTECTION | yes (banner only) | covered by #27 (banner), but #27 banner names "two LEV100H contactors" (superseded by GX11CAC) | +| electrical/power_distribution/power.md | 47 | B | POWER-RAILS | "No 12 V rail and no 24 V LiDAR branch" (only 2.0 rail statement on main) | add 25.6 V nominal battery bus (not regulated 24 V), regulated 24 V (RSD-100B-24), regulated 5 V (RSD-60G-5), SAFE 24 V converter DDR-240B-24 behind F-LIFT 15 A, 2.5 mm2 | register POWER-RAILS; P-03 item 2 (RSD parts) | yes | same file in #27, different lines | +| electrical/power_distribution/ (no 2.0 page on main) | n/a | E | POWER-RAILS, MAIN-PROTECTION, ESTOP-SCOPE, SAFETY-PROCUREMENT, RESET-BUTTON, CHARGING, BMS-FAULTS, UC1-03, UC1-04, UC1-53, UC1-70, UC1-73 | main has no page for 2.0 power distribution, fuses, safety chain, RESET, charging interlock or battery | E-01 page with register values | register entries listed | no (safety path; owner) | #27 adds it but is stale: LEV100H at lines 71-72 and 121 (register GX11CAC), "S2 chest, the OpenArm kit button" line 67 and gate line 134 (register: second XB4BS8445 + ZBE-102 on the static lift column), "F-LIFT 10 A ATO 1.5 mm2" line 58 (register F-LIFT 15 A, 2.5 mm2), no DDR-240B-24 SAFE converter, open gate "written DOLD holding" line 140 (register: confirmation received 14 Oct, holding test on delivered unit is the gate), BMS/brake gate line 137 (brake data recorded); #27 also names a partner ("(partner build)", lines 10, 56, 119) and a private person ("(team member)", line 141) (decision-allow: SAFETY-PROCUREMENT audit quotes the retired text) | +| (PR #27) electrical/power_distribution/e01-safety-and-power.md | 45 | D | (not in register) | "Precharge across K2 stays conditional" | P-03 item 26: actuator precharge fitted (Kpre with resistor and fuse across K2; SAF-004, PWR-014, PWR-015); register has no precharge entry | P-03 rev20.2 item 26 vs PR #27 | no (safety path) | #27 | +| (register vs P-03) | n/a | D | SAFETY-PROCUREMENT | register K1/K2 Gigavac GX11CAC | P-03 item 26: GX11CAC stays recorded until the 2 Nov 2026 decision (option B industrial contactor with mirror contacts); "chest E-stop" wording retired, register does not record the retirement | P-03 rev20.2 item 26 | no | none | +| safety/safety.md | 6-11 | A | SAFETY-PROCUREMENT, UC1-03 | "keep a hand on the 24 V cut-off"; "A ROS-independent physical E-stop is recommended (not confirmed present yet)" unlabelled | label as existing robot (v0.0.1); 2.0 hardwired chain per E-01 | register SAFETY-PROCUREMENT, TELEMETRY-NOT-SAFETY-EVIDENCE | no (safety wording) | covered by #27 (banner), with the stale LEV100H wording | +| electrical/motor_control/motors-drivers.md | 1-135 | A | DRIVETRAIN | whole page (ZD Z4BLD60 + ZBLD.C20-120L2R, Teensy PWM) unlabelled | page banner: existing robot (Gate A unit, ZBLD/PWM); link the 2.0 drivetrain | register DRIVETRAIN, BASE-CONTROLLER-GATES | yes | none | +| electrical/motor_control/ (no 2.0 page) | n/a | E | DRIVETRAIN | no page for ZLLG80ASM250-L-B with brakes and ZLAC8015D V4.2 on CAN1 (CANopen) | 2.0 drivetrain page: brakes 24 V, 12.5 W per motor, 6 Nm, release <= 100 ms, engagement <= 30 ms without diode (<= 100 ms with diode); fail-safe behaviour still needs evidence | register DRIVETRAIN; P-03 item 21 | no (new content touching brake wording) | none | +| electrical/motor_control/motor-driver-fault-codes.md | 1-3 | B | DRIVETRAIN | ZBLD.C20-120L2R fault codes, no legacy label | add "existing robot (Gate A unit)" | register DRIVETRAIN | yes | none | +| electrical/computing/raspberry-pi.md | 1 | A | COMPUTE | "# Raspberry Pi 5: main computer" | "# Raspberry Pi 5: main computer of the existing robot (v0.0.1, legacy)"; add a pointer that 2.0 uses the Jetson Orin NX 16 GB on reComputer J401 | register COMPUTE | yes | none | +| electrical/computing/teensy.md | 1 | A | BASE-CONTROLLER-GATES | "# Teensy 4.0: real-time microcontroller" | "# Teensy 4.0: Gate A controller (legacy) and release fallback" | register BASE-CONTROLLER-GATES | yes | none | +| electrical/computing/ (no 2.0 pages) | n/a | E | COMPUTE, BASE-CONTROLLER-IO, UC1-80, UC1-81 | no Jetson Orin NX / J401 page, no STM32H723ZG (NUCLEO-H723ZG) page; no statement of micro-ROS over Ethernet UDP (USB bench only) | add pages | register COMPUTE, BASE-CONTROLLER-IO | no (new content) | none | +| electrical/sensors/imu.md | 14 | B | BASE-CONTROLLER-GATES | "dedicated SPI, Mode 0" | "SPI4, Mode 0; no click shield, wired directly" | register BASE-CONTROLLER-GATES | yes | #29 same region, stale (pre-EV board) | +| electrical/sensors/imu.md | 17 | A | FRAMES-REP105 | "imu_link ... x 0.0544 m, z 0.133 m ... 177 mm above the base plate top, 231 mm above the floor; axes aligned with base_link" | "imu_link (0.0544, 0, 0.1210) m, rpy (0, 0, -pi/2), chip +Y forward; 165.043 mm above the base-plate top, 219.04 mm above the floor; raw sensor-frame values, mapping in the URDF, no firmware remap" | register FRAMES-REP105 | yes | covered by #29 (pose); #29 also rewrites line 5 back to MIKROE-4237: reject that hunk (decision-allow: BASE-CONTROLLER-GATES audit quotes the retired text) | +| electrical/sensors/imu.md | 18 | B | FRAMES-REP105 | "CAD 2026-10-15. Was x 0.195 m ... (platform lead decision 2026-10-12)" | "CAD Rev B; supersedes (0.0544, 0, 0.133) and the earlier x 0.195 m" (private name not needed) | register FRAMES-REP105 | yes | covered by #29 | +| electrical/sensors/imu.md | 5-18 | E | IMU-TOPIC-OWNERSHIP | 2.0 section states no topics | firmware publishes /imu/data_raw (P-03 item 24 adds /imu/temperature) | register IMU-TOPIC-OWNERSHIP; P-03 item 24 | yes | none | +| electrical/sensors/lidar.md | 20 | A | NAV-LIDAR | "existing MMP.07 A1 bracket and its 10 mm standoffs plus a 7.1 mm spacer plate ... 222.0 mm above the floor" | "MMP.07 bracket with the 17.5 mm printed spacer MMP.07.00.00.002, no standoffs; scan plane 222.05 mm above the floor" | register NAV-LIDAR | yes | covered by #29 | +| electrical/sensors/lidar.md | 21 | A | NAV-LIDAR | "scan plane at 222.0 mm above the floor, as on the A1" | "scan plane 222.05 mm above the floor" | register NAV-LIDAR | yes | covered by #29 | +| electrical/sensors/lidar.md | 27-28 | B | NAV-LIDAR | "Driver parameters (baud rate, scan mode) ... to be set" | sllidar_ros2 at 1,000,000 baud, /scan in lidar_link (P-03 item 13; not in register) | P-03 item 13 | yes | same file in #29, different lines | +| electrical/sensors/lidar.md | 87 | B | NAV-LIDAR | "scan_body_filter (provided in openamrobot_nav2)" | "openamrobot_perception scan_body_filter (scan_body_filter_real.yaml)" | register NAV-LIDAR | yes | same file in #29, different lines | +| electrical/sensors/camera.md | 12-13 | A | CAMERAS | "142.5 mm above the floor"; "base_camera_link (0.376, 0, 0.0445)" | "camera centre 144 mm above the floor"; "base_camera_link (0.387, 0, 0.046)" | register CAMERAS | yes | none | +| electrical/sensors/camera.md | 15 | B | CAMERAS, CONFIG-IDS | "Up-tilt 5, 10 or 15 degrees, baseline 10 degrees" | add IDs: base_tilt bt05, bt10, bt15 (default bt10) | register CAMERAS, CONFIG-IDS | yes | none | +| electrical/sensors/camera.md | 131 | A | CAMERAS | "The 2.0 base camera frame is base_camera_link (0.376, 0, 0.0445)" | "(0.387, 0, 0.046)" | register CAMERAS | yes | none | +| (register vs P-03) camera height | n/a | D | CAMERAS, UC1-52 | register 144 mm, (0.387, 0, 0.046) | P-03 item 15 still writes 142.5 mm and imu_link (0.195, 0, -0.044); UC1-52 baseline still about 243 mm | P-03 item 15; UC1 rev18.5 | no | none | +| electrical/sensors/near-field.md | 30 | B | BASE-CONTROLLER-IO | "one UART per sensor, pin 5 tied to 3.3 V" (no supply rails) | TF-Luna on 5 V with pin 5 to 3.3 V; MB7060 on 3.3 V from a dedicated regulator off 5 V (P-03 item 24; not in register) | P-03 item 24 | yes | same file in #29, different lines | +| electrical/sensors/near-field.md | 31 | A | NEAR-FIELD-FRAMES | "pitched down; 20 degrees is a screening value until the bench test" | "pitched 10 degrees down (platform lead decision 20 Oct 2026), confirmed only by the bench test; lens face 9 mm ahead of the panel on mount MMP.00.00.00.005" | register NEAR-FIELD-FRAMES | yes | same file in #29, different lines | +| electrical/sensors/near-field.md | 42-43 | A | NEAR-FIELD-FRAMES | tof_front x 0.390, tof_rear x -0.390 | tof_front (0.399, 0, -0.0066), tof_rear (-0.399, 0, -0.0066, yaw pi) | register NEAR-FIELD-FRAMES | yes | same file in #29, different lines | +| electrical/sensors/near-field.md | 42 | D | NEAR-FIELD-FRAMES | register tof x 0.399 (owner confirmation 20 Oct) | P-03 item 19 D6 still writes tof_front (0.390, 0, -0.0066) | P-03 item 19 D6 | no | none | +| electrical/sensors/near-field.md | 45-46, 53 | A | NEAR-FIELD-FRAMES | "(20 degree screening value until the bench test)"; "the ToF pitch (20 degrees) are screening values" | 10 degrees down; confirmed only by the bench test | register NEAR-FIELD-FRAMES | yes | same file in #29, different lines | +| electrical/sensors/near-field.md | 49 | B | PUBLICATION | "Rev B front and back panels: (team member)." | unknown (owner): confirm whether "(team member)" is a private person or supplier name; non-public path | AGENTS.md Publication | no (owner) | none | +| electrical/sensors/encoders.md | 1-6 | B | BASE-CONTROLLER-GATES | AS5040 encoders on the Teensy, no label | label existing robot (Gate A unit); 2.0 hub motors have built-in encoders on the ZLAC8015D | register DRIVETRAIN | yes | none | +| electrical/wiring/wiring-pinout.md | 1 | A | BASE-CONTROLLER-GATES | "# Wiring & Teensy 4.0 pinout" (unlabelled, "Logic level 3.3 V" convention for the whole robot) | "# Wiring & Teensy 4.0 pinout (existing robot, Gate A unit)" | register BASE-CONTROLLER-GATES | yes | none | +| electrical/wiring/wiring-pinout.md | 139 | A | SAFETY-PROCUREMENT | "Harmony XB4-BS542 ... the one to use for anything CE-facing" | 2.0 E-stops are Schneider XB4BS8445 with ZBE-102 | register SAFETY-PROCUREMENT | no (E-stop wording) | none | +| electrical/wiring/ (no 2.0 page) | n/a | E | BASE-CONTROLLER-IO, SAFETY-CHAIN-IO | no 2.0 pinout (MB7060 UARTs, TF-Luna UARTs, SPI4 IMU, FDCAN1/2/3, Y32 via ISO1212, RESET NC, spare NO, charger fault, TPL7407L for RESET lamp and KCHG) | add the 2.0 harness/pin page (contract in #37 is a PROPOSAL) | register BASE-CONTROLLER-IO, SAFETY-CHAIN-IO | no (pins owner) | #37 / #38 add interfaces/electrical/base-controller-io.yaml (not reviewed here) | +| datasheets/README.md | 14 | A | DRIVETRAIN | "base ... uses the ZD motor + driver. The ZLTech parts ... are alternative / optional ... not on the base build" | "The existing robot (v0.0.1) uses the ZD motor + driver. The ZLTECH ZLLG80ASM250-L-B and ZLAC8015D V4.2 are the selected 2.0 drivetrain. The TZBOT battery and BMS are optional." | register DRIVETRAIN | yes | none (decision-allow: DRIVETRAIN audit quotes the retired text) | +| datasheets/README.md | 18 | A | DRIVETRAIN | ZDmotor row: "yes, this is the base" | "existing robot (v0.0.1), legacy" | register DRIVETRAIN | yes | none | +| datasheets/README.md | 20 | A | DRIVETRAIN | "ZLLG80 hub-motor wheel ... option (alternative drivetrain)" | "ZLLG80ASM250-L-B hub motor with brake ... yes, the 2.0 drivetrain" | register DRIVETRAIN | yes | none | +| datasheets/ZLTech/README.md | 2-3 | A | DRIVETRAIN | "Wheel: ZLLG80ASM250-L V1.0"; "Driver: ZLAC8015D" | "Wheel: ZLLG80ASM250-L-B (B2 V1.01 double-shaft drawing); V1.0 superseded"; "Driver: ZLAC8015D V4.2 (CANopen on CAN1)" | register DRIVETRAIN | yes | none (decision-allow: DRIVETRAIN audit quotes the retired text) | +| datasheets/ZLTech/wheel_ZLLG80ASM250/readme.md | 5 | D | DRIVETRAIN | vendor drawing "ZLLG80ASM250-L-B2 V1.01 double-shaft ... Selected 2.0 drivetrain part" | register names ZLLG80ASM250-L-B; whether B2 is the order code of L-B: unknown (owner) | register DRIVETRAIN vs vendor drawing | no (owner) | none | +| datasheets/ZLTech/drivers/readme.md | 1 | E | DRIVETRAIN | empty readme | source, revision and SHA-256 per AGENTS.md layout; note the manuals do not state V4.2 | AGENTS.md (pr/35) layout rule | yes | none | +| datasheets/TZBot/README.md, datasheets/TZBot/battery_BMS/readme.md | 1 | E | BATTERY-PLACEMENT | empty readmes; folder holds a 24 V 20 Ah battery and serial BMS protocol | source/revision/SHA-256; state these are not the 2.0 battery (8S1P EVE LF105 with Daly BMS on CAN2) | register BATTERY-PLACEMENT, BMS-FAULTS | yes | none | +| datasheets/TZBot/charger/readme.md | 3 | E | CHARGING | "Its datasheet belongs in this folder." (no WCM-500-24 datasheet) | add the WCM-500-24 datasheet or link-only metadata | register CHARGING | no (needs the file) | none | +| datasheets/ZDmotor/README.md | 1-10 | B | PUBLICATION | vendor e-mail addresses, postal address and phone number in a README | remove contact data, keep the web link | AGENTS.md Publication | yes | none | +| datasheets/motor-sizing-calculations.md | 1 | A | DRIVETRAIN | sizing for "ZDBLD60-24GN-30S" with no label | add "existing robot (v0.0.1) ZD drivetrain; the 2.0 drivetrain is the ZLTECH ZLLG80ASM250-L-B" | register DRIVETRAIN | yes | none | +| manufacturing/bom/components-bom.md | 3-23 | A | BOM-ISSUE-IN-FORCE, COMPUTE, DRIVETRAIN | whole table (Teensy, ZBLD, Z4BLD60, Pi 5, "any 24 V pack") with no label | banner: existing robot (v0.0.1) as built; 2.0 hardware BOM is BOM Issue 7.14 | register BOM-ISSUE-IN-FORCE | yes | none | +| manufacturing/bom/components-bom.md | 17, 20 | B | BOM-ISSUE-IN-FORCE | "Gate A unit, superseded by BOM Issue 7.7" | "Gate A unit, superseded (BOM Issue 7.14 is canonical)" | register BOM-ISSUE-IN-FORCE | yes | none | +| manufacturing/bom/components-bom.md | 50-52 | B | DRIVE-TRACK | "Track = 0.46 m ... The CAD/URDF value of 0.4075 m is wrong" | "Gate A unit measured 0.46 m (19 June 2026); the 2.0 drive track is open (model placeholder 0.400 m)" | register DRIVE-TRACK | yes | none | +| manufacturing/bom/components-bom.md, mechanical-bom.md | n/a | E | COMPONENT-AVAILABILITY | no supplier count or second source recorded per part | record two or more stocked suppliers per part, or a named option next to a second-sourced alternative | register COMPONENT-AVAILABILITY | no (BOM owner) | none | +| manufacturing/bom/ (no 2.0 parts list) | n/a | E | BOM-ISSUE-IN-FORCE | no BOM Issue 7.14 part list in the repo (README line 11 only cites it) | add or link BOM Issue 7.14 lines (PNOZ s3 750103, GX11CAC, XB4BW36B5, DDR-240B-24 PWR-030, RSD-60G-5, RSD-100B-24, F0, WCM-500-24, LF105 pack, Daly BMS, EV_ICM-42688-P, Jetson J401) | register BOM-ISSUE-IN-FORCE | no (BOM owner) | none | +| manufacturing/bom/mechanical-bom.md | 39-40, 53 | A | DRIVETRAIN, UC1-09 | "Heavy duty drive wheel: Blickle GEVN 200/30H7"; "Light duty swivel castor"; "BLDC Motor: Z4BLD60-24GN-30S/4GN 25K" | label existing robot; 2.0 drive is the ZLLG80ASM250-L-B hub motor; 2.0 castor spec: unknown (owner) | register DRIVETRAIN; UC1-09 | yes (label) | none | +| manufacturing/bom/mechanical-bom.md | 56-58 | B | SHARED-BASE | "Camera module: NVision Assem"; E18-D80NK; JSN-SR04T, unlabelled | label as release 001 build sensors; 2.0 uses MB7060, TF-Luna, Gemini 336L | register SHARED-BASE | yes | none | +| manufacturing/bom/mechanical-bom.md | 79 | B | BASE-CONTROLLER-GATES | "STM32 Click mount plate ... STM32 and Click boards" | "NUCLEO-H723ZG and the CAN isolator click; no click shield (MIKROE-1581 removed)" | register BASE-CONTROLLER-GATES; P-03 item 26 | yes | none | +| manufacturing/bom/mechanical-bom.md | 87-91 | A | COMPUTE, BASE-CONTROLLER-GATES | "Preliminary Electronics BOM ... Raspberry Pi 5 ... Teensy 4.0" | label "existing robot (v0.0.1)"; 2.0 per BOM Issue 7.14 | register COMPUTE | yes | none (decision-allow: COMPUTE audit quotes the retired text) | +| manufacturing/bom/mechanical-bom.md | 122, 131, 141 | B | BOM-ISSUE-IN-FORCE | "superseded by BOM Issue 7.7" | "superseded (BOM Issue 7.14 is canonical)" | register BOM-ISSUE-IN-FORCE | yes | none | +| manufacturing/bom/mechanical-bom.md | 139 | A | BATTERY-PLACEMENT | "Battery: 24V Li-ion / LiFePO4 pack" | "8S1P EVE LF105 LiFePO4, 25.6 V, 105 Ah (2.0); existing robot: 24 V lead-acid pair" | register BATTERY-PLACEMENT | yes | none | +| manufacturing/bom/mechanical-bom.md | 142-143 | A | MAIN-PROTECTION, SAFETY-PROCUREMENT | "Inline fuse (rated above motor current)"; "Emergency stop switch: Manual power cutoff" | label existing robot; 2.0: F0 110 A Class T + lockable disconnect; two XB4BS8445 + ZBE-102 into PNOZ s3 | register MAIN-PROTECTION, SAFETY-PROCUREMENT | no (E-stop wording) | none | +| manufacturing/bom/mechanical-bom.md | 157 | A | DRIVETRAIN | "## Alternative Drive Option (ZL Tech)" | "## 2.0 drivetrain (ZLTECH)" | register DRIVETRAIN | yes | none | +| manufacturing/bom/mechanical-bom.md | 161 | B | DRIVETRAIN | "exact order code under confirmation in PR #17" | drop the stale PR pointer; brake data recorded (ZLTECH 18 Oct 2026) | register DRIVETRAIN | yes | none | +| manufacturing/bom/mechanical-bom.md | 162 | A | DRIVETRAIN | "ZLAC8015D, Qty 1-2, RS485/CAN interface. Gate A unit, superseded by BOM Issue 7.7" | "ZLAC8015D V4.2, Qty 1, CANopen on CAN1 (2.0 driver; RS485 not used in 2.0)" | register DRIVETRAIN, RS485-NOT-IN-2-0; issue #36 | yes | none | +| manufacturing/bom/mechanical-bom.md | 166-173 | A | COMPUTE | "System Interfaces Summary: Raspberry Pi <-> Teensy ..." | label existing robot; 2.0: Jetson <-> STM32H723ZG over Ethernet, micro-ROS over UDP | register COMPUTE, BASE-CONTROLLER-IO | yes | none | +| mechanical/README.md | 6-7 | B | (AGENTS.md layout) | "Binary CAD files ... are stored with Git LFS" | "marked binary in .gitattributes; Git LFS is not used" | AGENTS.md (pr/35) | yes | none | +| mechanical/README.md | 55-60 | A | DRIVE-TRACK, DRIVETRAIN | "## Drivetrain (as-built) ... track 0.46 m ... Blickle parts" | "## Drivetrain (existing robot, as built)"; 2.0 track open (placeholder 0.400 m), 2.0 drive ZLLG80ASM250-L-B | register DRIVE-TRACK, DRIVETRAIN | yes | none | +| mechanical/ (no 2.0 page) | n/a | E | DATUM-HEIGHT-STACK, ARM-MOUNT, NO-SUSPENSION, UC1-09, UC1-15, UC1-17 | no datum stack (deck 294 mm, base plate 304 mm), lift base plate 360 x 230 bp000/bp050, column axis 330 mm behind front edge, chassis 780 x 582, no suspension | add a 2.0 mechanical interface page | register DATUM-HEIGHT-STACK, ARM-MOUNT, LIFT, NO-SUSPENSION | no (geometry owner) | none | +| mechanical/cad/README.md | 67 | B | (stale link) | link to "OpenAMR/tree/main/docs/hardware/BOM" | link manufacturing/bom/ in this repo | repo layout | yes | none | +| mechanical/cad/README.md | 81-104 | B | PUBLICATION | backer and subscription tiers with prices (EUR 5 to EUR 1,500/mo) in a README | remove prices from the README (link a sponsor page instead) | AGENTS.md Publication | yes | none | +| manufacturing/assembly/README.md | 9 | B | DRIVETRAIN | "drive-wheel assembly (motor + gearbox + drive shaft + brackets, MMP.03.*)" unlabelled | label existing robot ZD drivetrain; 2.0 hub-motor mounting: unknown (owner) | register DRIVETRAIN | yes | none | +| (register vs UC1 baseline) | n/a | D | LIFT, UC1-14 | register: DOLD confirmation received 14 Oct, holding test on delivered unit is the gate | UC1-14 baseline still says Open | P-03 item 26 vs UC1 rev18.5 | no | none | + +### Checker findings classification + +| file:line | ID | class | proposed exact replacement text (if fixable) | overlap | +|---|---|---|---|---| +| README.md:44 | COMPUTE | A | row: "\| Compute \| **Raspberry Pi 5, 8 GB**, legacy (existing robot); the 2.0 compute is the Jetson Orin NX 16 GB on reComputer J401 \| ..." and retitle line 38 "## Existing robot (release v0.0.1, Gate A unit) hardware configuration" | none | +| README.md:51 | CAMERAS | A | "\| Camera \| **Raspberry Pi Camera Module 3 NoIR (IMX708)**, legacy (existing robot); the 2.0 base camera is the Orbbec Gemini 336L \| CSI ribbon, not USB. ..." | none | +| README.md:81 | COMPUTE | A | "- Computing: [Raspberry Pi 5 (legacy, existing robot)](electrical/computing/raspberry-pi.md) · [Teensy 4.0 (Gate A)](electrical/computing/teensy.md)" | none | +| datasheets/README.md:19 | RS485-NOT-IN-2-0 | A | "\| [`ZLTech/drivers/`](ZLTech/drivers/) \| ZLAC8015D V4.2 driver (CANopen on CAN1; RS485 not used in 2.0); ZLAC8030L reference only \| yes, the 2.0 drivetrain \|" | none | +| datasheets/ZLTech/README.md:2 | DRIVETRAIN | A | "Wheel: ZLLG80ASM250-L-B (B2 V1.01 double-shaft drawing); ZLLG80ASM250-L V1.0 superseded" | none (decision-allow: DRIVETRAIN audit quotes the retired text) | +| datasheets/ZLTech/wheel_ZLLG80ASM250/readme.md:6 | DRIVETRAIN | false positive (row is labelled "reference only"; allow-label) | none | none | +| datasheets/ZLTech/wheel_ZLLG80ASM250/readme.md:7 | DRIVETRAIN | false positive (row is labelled "superseded by B2 V1.01"; allow-label) | none | none | +| datasheets/motor-sizing-calculations.md:132 | RS485-NOT-IN-2-0 | A | "\| RS485 bus \| not used: the existing robot drives the ZBLD drivers by PWM + FWD/REV; no RS485 in 2.0 \|" | none | +| datasheets/motor-sizing-calculations.md:133 | COMPUTE | A | "\| Raspberry Pi 5 (ROS2), legacy (existing robot) \| High-level control (navigation, SLAM, teleoperation) \|" | none | +| datasheets/motor-sizing-calculations.md:134 | RS485-NOT-IN-2-0 | A | "\| Motor driver modes \| PWM on the existing robot (legacy); no RS485 in 2.0 \|" | none | +| datasheets/motor-sizing-calculations.md:143 | RS485-NOT-IN-2-0 | A | lines 142-143: "- Motor controller reads the Hall sensors for commutation only (existing robot, legacy); RPM data over RS485 is not used, and RS485 is not in 2.0." | none | +| electrical/computing/raspberry-pi.md:1 | COMPUTE | A | "# Raspberry Pi 5: main computer of the existing robot (v0.0.1, legacy)" | none | +| electrical/computing/raspberry-pi.md:12 | COMPUTE | historical, allow-label (covered once line 1 is labelled) | none beyond line 1 | none | +| electrical/computing/raspberry-pi.md:68 | COMPUTE | historical, allow-label (covered once line 1 is labelled) | none beyond line 1 | none | +| electrical/motor_control/motors-drivers.md:22 | RS485-NOT-IN-2-0 | false positive (vendor terminal list of the legacy ZBLD driver in alt text); page still needs the legacy banner (row above) | none | none | +| electrical/power_distribution/power.md:114 | COMPUTE | A (page unlabelled) | banner after line 3: "> Existing robot (v0.0.1) as built. Legacy: the 2.0 power design is E-01." | covered by #27 (banner; #27 banner wording names LEV100H, superseded) | +| electrical/sensors/imu.md:7 | BASE-CONTROLLER-GATES | false positive (text says EV_ICM-42688-P "replaces" MIKROE-4237; allow-label "superseded") | optional: "(it replaces the superseded MikroElektronika MIKROE-4237 6DOF IMU 14 Click)" | same file in #29, same region (#29 stale, would reintroduce MIKROE-4237) | +| electrical/sensors/lidar.md:59 | COMPUTE | historical (section "Legacy (existing robot): RPLIDAR A1") | none | same file in #29, different lines | +| electrical/sensors/lidar.md:59 | NAV-LIDAR | historical (same legacy section) | none | same file in #29, different lines | +| manufacturing/bom/components-bom.md:21 | COMPUTE | A | "\| 8 \| SBC \| **Raspberry Pi 5** (Model B Rev 1.1, 8 GB), legacy (existing robot); 2.0 compute: Jetson Orin NX 16 GB on reComputer J401 \| ..." | none | +| manufacturing/bom/mechanical-bom.md:90 | COMPUTE | A | "- **High-level control**: Raspberry Pi 5 (existing robot, legacy)" | none | +| manufacturing/bom/mechanical-bom.md:101 | COMPUTE | A | "\| Main Computer \| Raspberry Pi 5 (8GB), legacy (existing robot) \| 1 \| ... \|" | none | +| product-architecture.md:13 | COMPUTE | A (vision diagram alt text names Pi 5 as the general node) | append to alt text: "(existing robot era diagram; the 2.0 compute is the Jetson Orin NX)" | same file in #29, different lines | +| product-architecture.md:22 | COMPUTE | historical, allow-label (list labelled "Gate A unit" at line 27, after it) | "- **Compute:** Raspberry Pi 5 + ROS 2 Jazzy + Nav2 (legacy, existing robot)." | same file in #29, different lines | + +## openamr-upperbody-sw + +Checkout: origin/main f57e54c. Register main 1678735 (P-03 rev20.2). AGENTS.md and STATE.md are absent on main; STATE.md arrives only in open PR #27. Reviewed: README.md, CONTRIBUTING.md, NOTICE.md, LICENSING.md, all package.xml, openamrobot_upperbody_description (config yaml, both xacro files, launch, tests, CMakeLists). +Open PRs with local refs: #14 (4629075), #20 (03933c0), #21 (53450b8), #22 (b45376b), #26 (4d8b138), #27 (68848ef). They are a stack: each contains #14 (443 to 475 files) and each changes README.md and the description package. No local refs exist for #23, #24 or #25 (STATE.md in #27 names them as Proposed equipment/ACM and ideal-camera work), so they were not diffed. +"fixable" is given for information only. This repository is audit-only. + +| file | line | class | decision ID or UC1-nn | current text or behaviour (short quote) | correct text or behaviour | source | fixable | overlap | +|---|---|---|---|---|---|---|---|---| +| ros2/src/openamrobot_upperbody_description/config/upperbody_configuration.yaml | 76 | C | HEAD-CAMERA-IDENTITY | `x_ahead_of_arm_mount: 0.022` | 0.042 (lens 0.042 m ahead of the arm mount point) | register HEAD-CAMERA-IDENTITY (P-03 rev20.1 items 15, 18) | no (geometry) | covered by #22 (yaml L78 0.042; also in #26, #27) | +| ros2/src/openamrobot_upperbody_description/config/upperbody_configuration.yaml | 18 | C | CONFIG-IDS | `baseline: head_pitch: hp25` | baseline hp30 | register CONFIG-IDS (P-03 rev20.1 item 17) | no (configuration ID baseline) | covered by #22 (yaml L20 hp30; also #26, #27) | +| ros2/src/openamrobot_upperbody_description/urdf/openamrobot_upperbody.urdf.xacro | 17 | C | CONFIG-IDS | `` | default hp30 | register CONFIG-IDS | no (xacro argument default) | covered by #22 (L18 default hp30) | +| ros2/src/openamrobot_upperbody_description/launch/upperbody_description.launch.py | 30 | C | CONFIG-IDS | launch default for head_pitch read from yaml baseline, so hp25 | hp30 (follows the yaml fix) | register CONFIG-IDS | no (launch argument default) | covered by #22 through the yaml baseline | +| ros2/src/openamrobot_upperbody_description/test/test_upperbody_configurations.py | 74 | C | HEAD-CAMERA-IDENTITY | test asserts camera x = axis + 0.180 + 0.022 | axis + 0.180 + 0.042 | register HEAD-CAMERA-IDENTITY | no (test of geometry) | covered by #22 (L74 0.042) | +| ros2/src/openamrobot_upperbody_description/urdf/openamrobot_upperbody.xacro | 66 | C | LIFT | `lift_joint` limit `effort="0.0" velocity="0.0"` (comment: limits pending, set to 0 so the model cannot command the lift) | register has 800 N push and 18 mm/s; whether the model should carry them is unknown (owner); current zero is deliberate | register LIFT | no (URDF joint limits) | not changed in #22; #27 STATE says dynamic lift actuation is absent | +| README.md | 23 | B | LIFT, ARM-MOUNT | "Decision of record: P-03 revision 18.9 item 18, 9 October 2026." | Decision of record: P-03 rev19.0 item 19 (ARM-MOUNT, column position), P-03 rev20.1 items 15, 17, 18 (head camera, hp30), P-03 rev20.2 item 26 (LIFT) | register LIFT, ARM-MOUNT, CONFIG-IDS sources | yes | same file in #22/#26/#27, line unchanged there | +| ros2/src/openamrobot_upperbody_description/urdf/openamrobot_upperbody.xacro | 3 | B | ARM-MOUNT | comment "option B (P-03 revision 18.9 item 18, 9 October 2026)" | cite P-03 rev19.0 item 19 and P-03 rev20.1 items 15, 17, 18 | register ARM-MOUNT, HEAD-CAMERA-IDENTITY | yes (comment only) | same file in #22/#27, L4 unchanged there | +| ros2/src/openamrobot_upperbody_description/config/upperbody_configuration.yaml | 2 | B | ARM-MOUNT | comment "Decision of record: P-03 revision 18.9 item 18" | add P-03 rev19.0 item 19 and rev20.1 items 15, 17, 18 | register ARM-MOUNT, HEAD-CAMERA-IDENTITY | yes (comment only) | partly covered by #22 (adds rev20.0 items 15, 17, 18; register cites rev20.1) | +| ros2/src/openamrobot_upperbody_description/test/test_upperbody_configurations.py | 5 | B | ARM-MOUNT | docstring "Option B values (P-03 revision 18.9 item 18)" | P-03 rev19.0 item 19 | register ARM-MOUNT | yes (docstring only) | same file in #22, L5 unchanged | +| README.md | 27 | B | LIFT | "DOLD Hexalift V4, 350 mm (530 mm retracted, 880 mm extended), 240 mm side fore-aft" | add: approved in principle; order code BS-HM240G350530-MFF24; 800 N push; 18 mm/s; TiMOTION TL3 400 mm fallback | register LIFT | yes | same file in #22/#27, line unchanged | +| README.md | 28 | B | ARM-MOUNT | "`bp050` (+0.050 m)" | `bp050` (x +0.110 from base_link, +0.050 m from bp000) | register ARM-MOUNT | yes | same file in #22/#27, line unchanged | +| README.md | 30 | B | ARM-MOUNT | "x = column axis + 0.180 m, y = ±0.031 m, roll/pitch/yaw 0" | add: shoulder spacing 307 mm; one 1 mm spacer under each J1_A plate | register ARM-MOUNT | yes | same file in #22/#27, line unchanged | +| README.md | 9 | B | LIFT | "with the lift as a planned joint" | add: lift motion only in the stowed or carry safe pose with the base stopped; hold-and-move limits 0.05 m/s and 0.3 m/s | register LIFT; UC1-19, UC1-41, UC1-46 | yes | same file in #22/#27, line unchanged | +| README.md | 12 | B | LIFT | "the lift driver and its interlocks are owned by the firmware and safety work packages" | name the lift node CTL-017 on CAN3; release gates per LIFT (holding test on the delivered unit, supplier CAD, weighed mass, CAN3 lift interface, F2S rerun) | register LIFT; P-03 rev20.2 item 24, 26 | yes | same file in #22/#27, line unchanged | +| README.md | 65-69 | E | PLATFORM-PIN | "Depends on ... openamr-platform-sw" with no pinned SHA | combined-model evidence uses one pinned platform-sw SHA (dfd44a5); pin moves only with a full A6/A7 rerun | register PLATFORM-PIN | no (E) | #21 to #27 add config/upstream_pins.yaml, see D rows | +| refs/pr/21, 22, 26: ros2/src/openamrobot_upperbody_description/config/upstream_pins.yaml | 14 | D | PLATFORM-PIN | `openamr_platform_sw: "131e500..."` | register records dfd44a5; a pin move needs a register update and A6/A7 rerun | register PLATFORM-PIN | no (dependency pin) | PR content, not main | +| refs/pr/27: config/upstream_pins.yaml and STATE.md | 14; 5 | D | PLATFORM-PIN | pin `5d575816...` (STATE.md: "Platform pin 5d57581..."), while .github/workflows/model-tests.yml L20 still has `PLATFORM_PIN_DEFAULT: dfd44a55...` | one pin; register dfd44a5 until the register entry is updated | register PLATFORM-PIN | no (dependency pin) | PR content, not main | +| refs/pr/27: STATE.md | 5 | D | (manipulation pin) | "OpenArm ... ROS2 `4e837e1d...` remain unchanged" | manipulation PR #20 pins enactic/openarm_ros2 f0f6b63; owners must agree one pin | manipulation PR #20 integration/README.md | no (dependency pin) | cross-repository | +| README.md | 33 | D | UC1-50 | model and register: lens 42 mm ahead, hp30 | Use Case 1 baseline rev18.5 still says 22 mm ahead and a 25 degree baseline; owner to align the baseline | brief (UC1-50) vs register HEAD-CAMERA-IDENTITY | no (D) | n/a (decision-allow: HEAD-CAMERA-IDENTITY audit quotes the retired text) | +| urdf/openamrobot_upperbody.xacro | 96-115 | E | CAMERAS; UC1-55 | only head-camera frames; no wrist-camera frames | two in-hand RGB wrist cameras; no torso scene camera | register CAMERAS | no (geometry) | #27 STATE mentions provisional wrist-camera markers (Proposed) | +| urdf/openamrobot_upperbody.xacro | whole file | E | TABLET-MOUNT, OPERATOR-PANEL; UC1-34 | no Getac ZX80, head light or second E-stop geometry on main | Getac ZX80 on rotatable mount (landscape default, portrait second), Falcon FLDL-i150x15-W head light, second E-stop on the rear face of the static column | register TABLET-MOUNT; P-03 rev20.2 items 24, 26 | no (geometry) | #26/#27 add upper_body_equipment.xacro (datums.yaml uses `chest_equipment_*` names; second E-stop named `second_estop_*`, acceptable) | +| README.md | whole file | E | STATUS-VOCABULARY, STOP-SCOPE | no status or stop vocabulary stated | when bringup lands: robot states per STATUS-VOCABULARY; "Stop (software)" base-only, functional; "E-stop" only the hardwired buttons | register STATUS-VOCABULARY, STOP-SCOPE | no (E) | not in #22/#27 README | +| (repository root) | n/a | E | process (Decisions rule) | AGENTS.md and STATE.md missing on main | shared AGENTS.md block and STATE.md | AGENTS.md shared rules | no (E) | STATE.md added by #27; AGENTS.md in none | + +### Checker findings classification + +| file:line | ID | class | proposed exact replacement text | overlap | +|---|---|---|---|---| +| README.md:33 | HEAD-CAMERA-IDENTITY | A (0.022 m presented as current) | `\| Head camera \| Stereolabs ZED Mini (ZED-121210) on the lift carriage, lens 0.042 m ahead of and 0.223 m above the arm mount point, y = 0; pitch 15 to 35 degrees down, baseline 30 degrees \|` | covered by #22 (0.042 m; SKU still missing there), also #26, #27 | +| README.md:36 | CONFIG-IDS | A (hp25 baseline presented as current) | replace "baseline `hp25`" with "baseline `hp30`" | covered by #22 (also #26, #27) | + +Not a finding: README.md:62 example `head_pitch:=hp25` is a valid ID, not a baseline claim. + +## openamr-upperbody-fw + +### Fixed in [openamr-upperbody-fw#13](https://github.com/openAMRobot/openamr-upperbody-fw/pull/13) + +- README.md:26 (HEAD-CAMERA-IDENTITY, CONFIG-IDS (A)) +- README.md:29 (LIFT (A)) +- README.md:7 (LIFT (B)) +- README.md:16, 28, 33, 35 (LIFT (B)) +- README.md:21 (LIFT (B)) +- README.md:33-34 (LIFT (B)) + + +Checkout: origin/main ba1a53f. Register main 1678735 (P-03 rev20.2). AGENTS.md and STATE.md are absent on main; no open PR refs exist locally, so no governance PR adds them. Reviewed: README.md, CONTRIBUTING.md, NOTICE.md, LICENSING.md, .github files list. The checker reported 0 findings. + +| file | line | class | decision ID or UC1-nn | current text or behaviour (short quote) | correct text or behaviour | source | fixable | overlap | +|---|---|---|---|---|---|---|---|---| +| README.md | 26 | A | HEAD-CAMERA-IDENTITY, CONFIG-IDS | "pitch 15 to 35 degrees down in 5 degree steps, baseline 25 degrees (`hp15` to `hp35`)" | "pitch 15 to 35 degrees down in 5 degree steps, baseline 30 degrees (`hp15` to `hp35`, baseline `hp30`); lens 0.042 m ahead of and 0.223 m above the arm mount point" | register HEAD-CAMERA-IDENTITY, CONFIG-IDS (P-03 rev20.1 items 15, 17, 18) | yes | no open PR | +| README.md | 29 | A | LIFT | "Release gates still open: DOLD holding confirmation on E-stop and power loss, supplier CAD, F2S rerun, CAN-to-lift module selection and its CAN message set" | "Release gates still open: the holding test on the delivered unit after an E-stop during motion and after power loss (DOLD written confirmation of 800 N held with power off received 14 Oct 2026), supplier CAD, weighed mass, the CAN3 lift interface (lift node CTL-017) and its CAN message set, and the F2S rerun" | register LIFT (P-03 rev20.2 item 26); P-03 rev20.2 item 24 (CTL-017) | yes (gate list text; no function change) | no open PR | +| README.md | 7 | B | LIFT | "approved in principle ... (P-03 Decision Addendum revision 19.0) ... a small CAN-to-lift interface module, an MCU or ready-made module acting as a CAN node on CAN3" | cite P-03 rev20.2 item 26 for LIFT; the lift node is CTL-017 (MCU + H-bridge on CAN3; motor stage from the SAFE 24 V converter, logic from the always-on rail) | register LIFT; P-03 rev20.2 item 24 | yes | no open PR | +| README.md | 16, 28, 33, 35 | B | LIFT | "the lift interface module" / "CAN-to-lift interface module" | "the lift node CTL-017" | P-03 rev20.2 item 24 | yes | no open PR | +| README.md | 21 | B | LIFT | "DOLD Hexalift V4 350 mm primary, order code BS-HM240G350530-MFF24: 530 mm retracted, 880 mm extended, 11.7 kg catalogue mass, 24 V DC" | add 800 N push and 18 mm/s; column mounted with its 240 mm side fore-aft | register LIFT | yes | no open PR | +| README.md | 33-34 | B | LIFT | "reads the Hall pulses and both end switches"; "Lift position comes from the Hall count, referenced to an end switch" | add the three SICK IME12-04BNSZC0S stop sensors at z 120/295/470 mm on the static profile (L1000/L1175/L1350), steel flag; whether the Hall count stays the position source is unknown (owner) | P-03 rev20.2 item 24 | yes (description text) | no open PR | +| README.md | 16 | B | POWER-RAILS, MAIN-PROTECTION | "Lift power runs through the hardwired safety chain." | lift motor stage fed from the SAFE 24 V converter MEAN WELL DDR-240B-24 behind F-LIFT 15 A, 2.5 mm2 | register POWER-RAILS, MAIN-PROTECTION | no (safety-path wording) | no open PR | +| README.md | 38 | E | LIFT; UC1-41 | lift motion rule stated, hold-and-move limits absent | hold-and-move limits 0.05 m/s (drawer reversal) and 0.3 m/s (carrying) | register LIFT | no (E) | no open PR | +| README.md | 31-38 | E | (P-03 item 24) | no statement on lift duty cycle | no lift duty-cycle limit in firmware | P-03 rev20.2 item 24 | no (E) | no open PR | +| README.md | 31-38 | E | SAFETY-PROCUREMENT; UC1-04 | second E-stop not mentioned | second E-stop (Schneider XB4BS8445 + ZBE-102) on the rear face of the static lift column; its spare NO goes to a lift node input | register SAFETY-PROCUREMENT; P-03 rev20.2 item 24 | no (safety path) | no open PR | +| README.md | 29 | D | LIFT; UC1-14 | (gate wording) | Use Case 1 baseline rev18.5 still lists lift holding as Open; P-03 rev20.2 item 26 and register LIFT record the DOLD confirmation, with the delivered-unit test as the gate; owner to align the baseline | brief (UC1-14) vs register LIFT | no (D) | n/a | +| (repository root) | n/a | E | process (Decisions rule) | AGENTS.md and STATE.md missing | shared AGENTS.md block and STATE.md | AGENTS.md shared rules | no (E) | none | + +### Checker findings classification + +No checker findings for this repository (/tmp/audit/openamr-upperbody-fw.json is empty). The A finding at README.md:26 was missed because the line says "baseline 25 degrees", not "hp25". + +## openamr-upperbody-hw + +### Fixed in [openamr-upperbody-hw#14](https://github.com/openAMRobot/openamr-upperbody-hw/pull/14) + +- docs/mechanical/upper_body_option_B.md:66 (HEAD-CAMERA-IDENTITY, ARM-MOUNT (A)) +- README.md:12 (TABLET-MOUNT, OPERATOR-PANEL (A)) +- docs/mechanical/upper_body_option_B.md:27 (TABLET-MOUNT, OPERATOR-PANEL (A)) +- README.md:8 (LIFT (B)) +- docs/mechanical/upper_body_option_B.md:13 (LIFT (B)) +- README.md:9 (ARM-MOUNT (B)) +- README.md:31 (LIFT; UC1-14 (B)) +- docs/mechanical/upper_body_option_B.md:104 (LIFT (B)) +- README.md:17 (LIFT, HEAD-CAMERA-IDENTITY (B)) +- docs/mechanical/upper_body_option_B.md:3 (LIFT, TABLET-MOUNT (B)) + + +Checkout: origin/main e760126. Register main 1678735 (P-03 rev20.2). AGENTS.md and STATE.md are absent on main; no open PR refs exist locally, so no governance PR adds them. Reviewed: README.md, docs/mechanical/upper_body_option_B.md, CONTRIBUTING.md, NOTICE.md, LICENSING.md. The checker reported 0 findings. + +| file | line | class | decision ID or UC1-nn | current text or behaviour (short quote) | correct text or behaviour | source | fixable | overlap | +|---|---|---|---|---|---|---|---|---| +| docs/mechanical/upper_body_option_B.md | 66 | A | HEAD-CAMERA-IDENTITY, ARM-MOUNT | "Head-camera lens \| x +0.262 at `bp000`, +0.312 at `bp050` from `base_link` (arm mount point + 22 mm)" | "x +0.282 at `bp000`, +0.332 at `bp050` from `base_link` (arm mount point + 42 mm)" (0.240 + 0.042; 0.290 + 0.042) | register HEAD-CAMERA-IDENTITY, ARM-MOUNT | yes (docs table) | no open PR | +| README.md | 12 | A | TABLET-MOUNT, OPERATOR-PANEL | "Getac ZX80 tablet mounted landscape" | "Getac ZX80 tablet on a rotatable mount with two locked positions, landscape by default (234 x 149.8 mm), portrait second (149.8 x 234 mm)" | register TABLET-MOUNT (P-03 rev20.2 item 26) | yes | no open PR | +| docs/mechanical/upper_body_option_B.md | 27 | A | TABLET-MOUNT, OPERATOR-PANEL | "Getac ZX80 tablet (8 inch, 234 x 149.8 x 17.6 mm, ...) mounted landscape" | "... on a rotatable mount, landscape by default, portrait the second locked position; the position is a mount setting, not a configuration ID" | register TABLET-MOUNT | yes | no open PR | +| README.md | 8 | B | LIFT | "DOLD Hexalift V4, 350 mm stroke (530 mm retracted, 880 mm extended), mounted with its 240 mm side fore-aft" | add: approved in principle; order code BS-HM240G350530-MFF24; 800 N push; 18 mm/s; TiMOTION TL3 400 mm fallback | register LIFT | yes | no open PR | +| docs/mechanical/upper_body_option_B.md | 13 | B | LIFT | "Lift column \| DOLD Hexalift V4, 350 mm stroke" | add order code BS-HM240G350530-MFF24, 800 N, 18 mm/s, TL3 400 mm fallback | register LIFT | yes | no open PR | +| README.md | 9 | B | ARM-MOUNT | "`bp050` (+50 mm)" | "`bp050` (+50 mm, x +0.110)" | register ARM-MOUNT | yes | no open PR | +| README.md | 17 | B | LIFT, HEAD-CAMERA-IDENTITY | "Decision of record: P-03 revision 19.0 items 16 to 19, 12 October 2026 (option B)." | add P-03 rev20.1 items 15, 17, 18 (head camera, hp30) and P-03 rev20.2 items 24, 26 (equipment, tablet mount, DOLD confirmation) | register sources | yes | no open PR | +| docs/mechanical/upper_body_option_B.md | 3 | B | LIFT, TABLET-MOUNT | "head camera, chest equipment and second E-stop from P-03 revision 20.0 items 15, 17, 18 and 24" | add P-03 rev20.2 item 26 (tablet mount, DOLD confirmation); register cites rev20.1 for the head camera | register sources | yes | no open PR | +| README.md | 31 | B | LIFT; UC1-14 | "Lift holding on E-stop and power loss ... are open release gates owned elsewhere" | "DOLD confirmed in writing on 14 Oct 2026 that the column holds 800 N with power off; the gate closes only when the delivered unit passes the holding test after an E-stop during motion and after power loss" | register LIFT (P-03 rev20.2 item 26) | yes (gate text) | no open PR | +| docs/mechanical/upper_body_option_B.md | 104 | B | LIFT | "Lift holding on E-stop and power loss ... are separate release gates" | same wording as README.md:31 fix | register LIFT | yes | no open PR | +| docs/mechanical/upper_body_option_B.md | 28 | E | SAFETY-PROCUREMENT | second E-stop row has no contact allocation | spare NO of the second E-stop goes to a lift node input (CTL-017) | P-03 rev20.2 item 24 | no (safety path) | no open PR | +| docs/mechanical/upper_body_option_B.md | 9-29 | E | LIFT; UC1-13 | no stop-sensor mounting | three SICK IME12-04BNSZC0S stop sensors at z 120/295/470 mm on the static profile (L1000/L1175/L1350), steel flag | P-03 rev20.2 item 24 | no (E) | no open PR | +| README.md | 13 | E | (P-03 item 24) | cable routing without the always-on feed | F-PANEL 3 A on the always-on regulated 24 V rail feeds the Getac USB-PD and the head light; both stay on during E-stop | P-03 rev20.2 item 24 | no (E, power path) | no open PR | +| docs/mechanical/upper_body_option_B.md | 16-17 | E | UC1-15 | base plate thickness and positions only | base plate 360 x 230 mm | UC1-15 | no (E; value not in register) | no open PR | +| README.md | 14 | E | COMPONENT-AVAILABILITY | "Release package: CAD, drawings, BOM, ..." | BOM states the availability rule (two or more independent suppliers in stock; single-source only as a named option; no-stock parts not selected) | register COMPONENT-AVAILABILITY | no (E) | no open PR | +| README.md | 31 | D | LIFT; UC1-14 | (gate wording) | Use Case 1 baseline rev18.5 still lists lift holding as Open; register and P-03 rev20.2 item 26 record the confirmation; owner to align | brief (UC1-14) | no (D) | n/a | +| (repository root) | n/a | E | process (Decisions rule) | AGENTS.md and STATE.md missing | shared AGENTS.md block and STATE.md | AGENTS.md shared rules | no (E) | none | + +"Chest equipment" (README.md:12, doc:3, doc:27) is not flagged: P-03 item 26 retires only the "chest E-stop" wording, and these files already say "second E-stop on the static lift column". + +### Checker findings classification + +No checker findings for this repository (/tmp/audit/openamr-upperbody-hw.json is empty). The A finding at doc line 66 was missed because the line says "+ 22 mm", not "0.022 m ahead". + +## openamrobot-interfaces + +### Fixed in [openamrobot-interfaces#32](https://github.com/openAMRobot/openamrobot-interfaces/pull/32) + +- ros2/openamr_nav_msgs/README.md:23-24 (CHARGING, DOCKING-NOT-CHARGING) +- STATE.md:12, 19, 29 (process) + + +Reviewed: AGENTS.md, STATE.md, README.md, docs/*.md (C9 contract, compatibility, verification), ros2/openamr_nav_msgs (README, CONTRACT.md, msg comments), ros2/openamr_ui_msgs README, schemas. Open PRs: #25 (file list), #28 (file list), #31 (docs/proposals/robot-status.md diffed). Definitions themselves are reported only. +No IMU topic names, no stop-scope text and no `ESTOP_CHEST` signal exist on main (only `ESTOP_ACTIVE` 9003). C9 scope on main matches EMBODIED-AI-REPO (docs/c9-lerobot-dataset-contract.md:7-8 excludes recorder, training and policy). Public-extract check: 0 findings. + +| file | line | class | decision ID or UC1-nn | current text or behaviour (short quote) | correct text or behaviour | source | fixable | overlap | +|---|---|---|---|---|---|---|---|---| +| ros2/openamr_nav_msgs/README.md | 23-24 | A | CHARGING, DOCKING-NOT-CHARGING | "No charging states live in either, since manual charging is the current release baseline." | "No charging states live in either: docking is positioning only and never establishes charging; the 2.0 charging path is the TZBOT WCM-500-24 wireless charger (CHARGING)." | CHARGING (P-03 rev19.2 item 20), DOCKING-NOT-CHARGING | yes | none (#28 changes CONTRACT.md and msgs, not README) | +| ros2/openamr_nav_msgs/CONTRACT.md | 49-53 (DockingStatus validity) | E | DOCKING-NOT-CHARGING | `ENGAGEMENT_DOCKED` has no statement that docked is a pose result only | state "ENGAGEMENT_DOCKED means an accepted pose within tolerance; it never establishes charging or external power" | DOCKING-NOT-CHARGING | no (E; contract text, needs contract owner) | same file in #28, different lines | +| ros2/openamr_nav_msgs/CONTRACT.md / msg/NavigationStatus.msg | 65-66 / 103 | D | STATUS-VOCABULARY, SAFETY-CHAIN-IO | `ESTOP_ACTIVE` "only on fresh I8 telemetry reporting E-stop" | P-03 rev20.2 item 22: base E-stop spare NO is diagnostics only and does not show the second E-stop; register: SAFETY_STOPPED only from the hardwired chain diagnostic (Y32). Which signal sets ESTOP_ACTIVE: unknown (owner) | P-03 rev20.2 items 22/24; STATUS-VOCABULARY | no (definition) | same file in #28, different lines | +| STATE.md | 12, 19, 29 | B | process (STATE.md) | "PR #26 ... in review"; "last PASS on main at 87ab8a9"; "as of main 87ab8a9" | #26 merged as d048fb8; main is 14912e1 (#29); record the current verify result or "not recorded" | git log | yes | same file in #31 (adds one row; these lines unchanged) | +| STATE.md | 18, 31 | C | EMBODIED-AI-REPO | C10 dataset quality gate tracked here via PR #25 (adds tools/check_c10_dataset.py, c10 workflow, tests) | C10 dataset QA lives in openamrobot-embodied-ai python/ (it already has python/oa_embodied_ai/dataset_qa); interfaces keeps only the C9 schema and its conformance test | EMBODIED-AI-REPO (platform lead decision 2026-10-20) | no (placement, PR #25) | #25 | +| docs/proposals/robot-status.md (PR #31 only) | 51, 58, 74, 120, 124, 190, 191 | A | P-03 rev20.2 item 26 (chest wording retired; not yet in register) | "chest E-stop status", "Chest E-stop observation", "Head light, Getac and chest E-stop" | "second E-stop (static lift column)"; field `estop_chest` (line 145) and signal `ESTOP_CHEST` (line 60) may stay as names until the I8 rename | P-03 rev20.2 item 26; SAFETY-PROCUREMENT | yes (prose in #31) | in #31 only | +| docs/proposals/robot-status.md (PR #31 only) | 60 | B | LIFT, UC1-14, UC1-75 | "Lift holds on E-stop and power loss (supplier written confirmation recorded in E-01)" | add: release gate is the holding test on the delivered unit after an E-stop during motion and after power loss | LIFT (P-03 rev20.2 item 26) | yes | in #31 only | +| docs/proposals/robot-status.md (PR #31 only) | 58 | B | in_force | cites "P-03 rev20.1 item 24" | P-03 rev20.2 is in force (item 24 content unchanged) | decisions.yaml in_force | yes | in #31 only | + +### Checker findings classification + +None (0 findings in /tmp/audit/openamrobot-interfaces.json). + +## openamrobot-manipulation + +### Fixed in [openamrobot-manipulation#26](https://github.com/openAMRobot/openamrobot-manipulation/pull/26) + +- integration/openarm_v2_combined_model_inventory.md:88 (LIFT) +- ...inventory.md:72 (BOM-ISSUE-IN-FORCE, LIFT) +- ...inventory.md:77 (LIFT) +- ...inventory.md:87 (LIFT) +- ...inventory.md:130 (AGENTS.md (SO-101)) + + +Checkout: origin/main be76d30. Register main 1678735 (P-03 rev20.2). AGENTS.md present (OpenArm 2.0 reference, SO-101 secondary: consistent with README.md lines 7, 13, 42-43). STATE.md absent on main; open PR #20 adds it. Reviewed: AGENTS.md, README.md, integration/README.md, integration/openarm_v2_combined_model_inventory.md, fake-baseline tests (xfail markers). Open PRs: #18 (6f2bb65, portability/so101/ only, no overlap) and #20 (65d4408). The checker reported 0 findings. + +| file | line | class | decision ID or UC1-nn | current text or behaviour (short quote) | correct text or behaviour | source | fixable | overlap | +|---|---|---|---|---|---|---|---|---| +| integration/openarm_v2_combined_model_inventory.md | 88 | A | LIFT | "Release gates (open, as listed in P-03 rev18.9) \| DOLD holding on E-stop and power loss; supplier CAD; F2S rerun" | "Release gates (open, P-03 rev20.2 item 26) \| holding test on the delivered unit after an E-stop during motion and after power loss (DOLD written confirmation received 14 Oct 2026); supplier CAD; weighed mass; CAN3 lift interface; F2S rerun" | register LIFT | yes | same file in #20, different lines (L19, L124) | +| integration/openarm_v2_combined_model_inventory.md | 72 | B | BOM-ISSUE-IN-FORCE, LIFT | "Source: P-03 Decision Addendum revision 19.0, items 15 to 19 ... and the hardware BOM Issue 7.7 ... marked \"P-03 rev19.0 to record\"" | cite BOM Issue 7.14 (in force) and P-03 rev20.2 item 26 for LIFT; drop the stale "to record" note (register now records the values) | register BOM-ISSUE-IN-FORCE, LIFT | yes | same file in #20, different lines | +| integration/openarm_v2_combined_model_inventory.md | 77 | B | LIFT | "DOLD Hexalift V4 350 mm, order code BS-HM240G350530-MFF24; column 530 mm retracted / 880 mm extended; 11.7 kg" | add 800 N push, 18 mm/s, TiMOTION TL3 400 mm fallback, mounted with its 240 mm side fore-aft | register LIFT | yes | same file in #20, different lines | +| integration/openarm_v2_combined_model_inventory.md | 87 | B | LIFT | "the lift is driven on CAN3 through a CAN-to-lift interface module" | "through the lift node CTL-017 on CAN3" | P-03 rev20.2 item 24 | yes | same file in #20, different lines | +| integration/openarm_v2_combined_model_inventory.md | 130 | B | AGENTS.md (OpenArm 2.0 / SO-101) | "This repository's `README.md` (main @ `6198d48`) still names **ReBot**" | README.md on main now names SO-101 (lines 7, 13, 43); mark the item resolved | README.md on be76d30 | yes | same file in #20, different lines | +| integration/README.md | 5 | B | PUBLICATION | "Owners: Om Jagtap, Adnan Khalid. Reviewer: (team member) Sayed." | role names only (for example "Owners: common manipulation/Device Package work-package owners; reviewer: integration reviewer") | AGENTS.md Publication rule | yes | same file in #20, different lines; #20 adds another personal name ("Adnan accepted A3/I1", new "Current validation boundaries" section) | +| integration/openarm_v2_fake_baseline/test/test_moveit_planning.py | 34-36 | E | Tests rule (xfail names a tracking issue) | `pytest.mark.xfail(strict=True, ... reason='upstream v2.0 joint_limits.yaml has no acceleration limits; ...')` with no issue | xfail line names the tracking issue (issue #10 per #20) | AGENTS.md Tests rule | no (test code) | covered by #20 (xfails removed after the upstream pin move to f0f6b63) | +| integration/openarm_v2_combined_model_inventory.md | 74-89 | E | LIFT; UC1-19, UC1-41 | no lift motion rule in the lift context table | lift motion only in the stowed or carry safe pose with the base stopped; hold-and-move limits 0.05 m/s and 0.3 m/s | register LIFT | no (E) | not in #20 | +| integration/openarm_v2_combined_model_inventory.md | 74-89 | E | CAMERAS; UC1-55 | head and base cameras only | two in-hand RGB wrist cameras; no separate torso scene camera | register CAMERAS | no (E) | not in #20 | +| README.md | 24, 46 | E | UC1-74, UC1-40 | base/arm mutual exclusion stated; arm droop not covered | arms have no brakes; droop on E-stop must be managed | UC1-74 | no (E, safety-adjacent) | not in #20 | +| refs/pr/20: integration/README.md | (new section "Current validation boundaries") | D | (cross-repo pin) | PR #20 pins enactic/openarm_ros2 f0f6b63; upperbody-sw PR #21/#27 keep 4e837e1 | owners adopt one openarm_ros2 pin and rerun combined-model checks (PR #20 states this itself) | PR #20 vs upperbody-sw #27 STATE.md L5 | no (dependency pin) | PR content | +| integration/openarm_v2_combined_model_inventory.md | 84 | D | UC1-50 | "lens 42 mm ahead ... baseline hp30" (matches register) | Use Case 1 baseline rev18.5 still says 22 mm and 25 degrees; owner to align the baseline | brief (UC1-50) | no (D) | n/a | +| (repository root) | n/a | E | process (Decisions rule) | STATE.md missing on main | STATE.md | AGENTS.md shared rules | no (E) | covered by #20 (adds STATE.md) | + +Side note on #20 (not on main): integration/openarm_v2_combined_model_inventory.md L124 in #20 links `openAMRobot/openarmbot-manipulation/issues/10` (typo in the repository name). + +### Checker findings classification + +No checker findings for this repository (/tmp/audit/openamrobot-manipulation.json is empty). + +## openamrobot-ui + +### Fixed in [openamrobot-ui#58](https://github.com/openAMRobot/openamrobot-ui/pull/58) + +- web/src/features/blocks/README.md:83, 753, 755, 912, 920, 1186, 1724 (+ note after 738) (STOP-SCOPE) +- web/src/features/blocks/README.md:1652 (STOP-SCOPE) +- AGENTS.md:123 (STOP-SCOPE) +- docs/lessons/06-the-pages.md:226-227 (DOCKING-NOT-CHARGING) + + +Reviewed: AGENTS.md (no STATE.md on main; STATE.md read from #49 and #56), README.md, SECURITY.md, docs/lessons, web/src operator texts (StatusBar, MapPage, InfoPage, HealthPage, DevicesPage, EventsPage, helpContent, blocks), web/src/shared/constants, ros2 README and battery node. Open PRs diffed: #49, #50, #54, #56 (and file lists of #21, #40 to #55). +Not found anywhere on main: Getac ZX80 / ZX10, portrait-only text, IMU topic names, Jetson, UI Gate A date, robot status vocabulary. + +| file | line | class | decision ID or UC1-nn | current text or behaviour (short quote) | correct text or behaviour | source | fixable | overlap | +|---|---|---|---|---|---|---|---|---| +| web/src/features/blocks/blockDefinitions.js | 268 | A | STOP-SCOPE | block `openamr_stop` label "emergency stop" (operator-visible) | label "Stop (software), base only"; keep block type `openamr_stop` unchanged | STOP-SCOPE (E-01 rev1.5; platform lead decision 2026-10-30) | yes (label text only) | same file in #50/#54/#56, different lines (label unchanged in all) | +| web/src/pages/BlocksPage.jsx | 128 | A | STOP-SCOPE | plan step text "Emergency stop" | "Stop (software), base only" | STOP-SCOPE | yes | same file in #45/#50/#51/#54/#56, line unchanged (131 to 134 in PR heads) | +| web/src/features/blocks/README.md | 83, 386, 389, 735, 746, 753, 912, 920, 921, 1186, 1344, 1347, 1726 | A | STOP-SCOPE | "emergency stop" block / "Stop sends an emergency stop command" | "Stop (software)" (functional stop, base only, not an E-stop); E-stop only for the hardwired buttons | STOP-SCOPE | yes | same file in #50/#54/#56, these lines unchanged (14 occurrences remain) | +| web/src/features/blocks/README.md | 1652 | B | STOP-SCOPE | "No physical or software emergency stop is active." | "No hardwired E-stop is pressed and Stop (software) is not engaged." | STOP-SCOPE | yes | same file in #50/#54/#56, line unchanged | +| web/src/components/StatusBar.jsx | 116 | B | STOP-SCOPE | tooltip "Software stop: halts motion commands from this UI. This is not the hardwired E-stop." (no scope) | add "base motion only; arms and lift are not stopped" | STOP-SCOPE ("labelled base-only") | yes | same line rewritten in #50/#54/#56 (line 91), still without base-only | +| web/src/pages/MapPage.jsx | 451 | B | STOP-SCOPE | tooltip "Stop (software): halts motion from this UI..." (no scope) | add "base motion only" | STOP-SCOPE | yes | same line rewritten in #50/#54/#56 (line 485), still without base-only; #55/#56 add base-only only in UpperBodyPanel.jsx:101 | +| web/src/pages/EventsPage.jsx | 17 | B | STOP-SCOPE | comment lists "E-stops" as recorded events; EventRecorder.jsx records none | drop "E-stops" (no hardwired E-stop signal reaches the UI) | STOP-SCOPE, TELEMETRY-NOT-SAFETY-EVIDENCE | yes (comment) | none | +| web/src/shared/help/helpContent.js | 20 | A | DOCKING-NOT-CHARGING, DOCK-NO-CONTACTS | "Dock/Undock trigger the robot's charging-dock behaviors" | "Dock/Undock trigger docking (positioning only), when supported; docking never establishes charging." | DOCKING-NOT-CHARGING (P-03 rev18.1 item 3), CHARGING | yes | same file in #50/#54/#56, line unchanged | +| web/src/pages/InfoPage.jsx | 181-191 (text 185-186) | C | DOCKING-NOT-CHARGING, CHARGING | "Charging station" card from `/charge_station_connected`; false reads "Robot is not connected to the dock." | charge state only from the charge path (charge relay / charger fault, CHARGING); dock state never implies charging; producer topic unknown (owner) | DOCKING-NOT-CHARGING, CHARGING | no (behaviour) | none | +| web/src/pages/HealthPage.jsx | 199-200 | C | DOCKING-NOT-CHARGING | battery badge "Charging" when `/charge_station_connected` is true | show charging only from a charge-state source, else UNKNOWN; topic unknown (owner) | DOCKING-NOT-CHARGING | no | none | +| web/src/shared/hooks/useSystemDiagnostics.js | 98-108, 243 | C | DOCKING-NOT-CHARGING | `battery.charging` = station connected; suppresses low-battery alerts | same as above | DOCKING-NOT-CHARGING | no | none | +| docs/lessons/06-the-pages.md | 226-227 | B | DOCKING-NOT-CHARGING | "Charging station status is a simple connected/not-connected read" | state that the card is not a charge-state signal until a charge-state source exists | DOCKING-NOT-CHARGING | yes | same file in #49/#50/#52/#54/#56, line unchanged | +| web/src/pages/DevicesPage.jsx | 129 | A | COMPUTE | "a different Raspberry Pi than the one hosting this UI" | "a different computer than the one hosting this UI" (2.0 reference compute: Jetson Orin NX 16 GB on reComputer J401) | COMPUTE (P-00 rev18.1) | yes | none | +| README.md | 104 | A | STOP-SCOPE | "The red **E-STOP** in the dashboard is a *software* stop" | "Stop (software)" | STOP-SCOPE | yes | covered by #50 (also #54, #56) | +| docs/lessons/06-the-pages.md | 45 | A | STOP-SCOPE | "big red **E-STOP** button" | "Stop (software)" | STOP-SCOPE | yes | covered by #50 (also #54, #56) | +| docs/lessons/07-ui-components.md | 122, 283 | A | STOP-SCOPE | "top-bar E-STOP button", "battery + E-STOP" | "Stop (software)" | STOP-SCOPE | yes | covered by #50 (also #54, #56) | +| README.md | 367-387 | B | PUBLICATION | sponsorship prices "(price)" to "(price)/mo" (13 public-extract findings; allowlist covers only .github README.md and profile/README.md) | remove, or platform lead approves an allowlist entry | AGENTS.md Publication; public-extract-allowlist.yaml | no (owner decision) | README in #49/#50/#51/#54/#56, price lines unchanged | +| README.md | (absent) | E | OPERATOR-PANEL, TABLET-MOUNT, UC1-54 | no operator panel stated on main | "Getac ZX80, 8 inch, 1920 x 1200, rotatable mount, landscape default, portrait second locked position" | OPERATOR-PANEL, TABLET-MOUNT (P-03 rev20.2 item 26) | no (E) | #56 README:147 adds only "Getac ZX80" (no size, resolution, orientation) | +| README.md / STATE.md | (absent) | E | UI-GATE-A | no UI Gate A date on main | full UI Gate A 6 Nov 2026; 30 Oct 2026 was partial A1 | UI-GATE-A | no (E) | #56 STATE.md:303 "Gate A (6 Nov)" | +| web/src | (absent) | E | STATUS-VOCABULARY | no robot status / UI presentation states on main | READY ... FAULTED; DISCONNECTED, UNKNOWN, STALE, STOPPED (SOFTWARE); SAFETY_STOPPED only from the hardwired chain | STATUS-VOCABULARY | no (E) | covered by #54/#56 (reportingAdapter.js never derives SAFETY_STOPPED) | +| web/src/shared/constants/index.js | 60-64 | E | CAMERAS, UC1-55 | camera options "/camera/color/image_raw", "/rgb_image", "/camera/image_raw" only | base Gemini 336L, head ZED Mini, two wrist cameras; topic names unknown (owner) | CAMERAS, HEAD-CAMERA-IDENTITY | no (topic names) | same file in #50/#54/#55/#56; #55 adds a camera change (not diffed for topics) | +| STATE.md | (missing on main) | E | process (AGENTS.md Decisions) | no STATE.md on main | add STATE.md | AGENTS.md shared block | no | covered by #49 (also #56) | + +### Checker findings classification + +| file:line | ID | class | proposed exact replacement text | overlap | +|---|---|---|---|---| +| AGENTS.md:123 | STOP-SCOPE | A (retired label "software E-STOP" used as a current term in the repository-specific rules; the rename landed in #38) | `- Authentication, production command controls and Stop (software) labelling require` | same file in #49/#56 at different lines (line moves to 124; not changed). Fixable as text, but it is a rule-file change: repository-specific section only (outside the shared block, no marker bump), needs the work-package owner's adopt in the PR thread | + +## openamrobot-comm + +Reviewed: README.md, CONTRIBUTING.md, CHANGELOG.md, NOTICE.md, LICENSING.md, SECURITY.md; directory tree (scaffolding only, no protocol, schema or bridge content). No AGENTS.md and no STATE.md exist on main; no open PR file lists were supplied. +No register value (compute, LiDAR, release milestones, Raspberry Pi) is stated anywhere in the repository. Public-extract check: 0 findings. No findings against the register. + +| file | line | class | decision ID or UC1-nn | current text or behaviour (short quote) | correct text or behaviour | source | fixable | overlap | +|---|---|---|---|---|---|---|---|---| +| AGENTS.md, STATE.md | (missing) | E | process (shared rules: AGENTS.md copied into every repository; read STATE.md) | files absent on main | adopt the shared AGENTS.md block and a STATE.md through the rollout order (rollout/README.md) | .github AGENTS.md | no (rollout, CI owner) | none | + +### Checker findings classification + +None (0 findings in /tmp/audit/openamrobot-comm.json). + +## openamrobot-docs + +### Fixed in [openamrobot-docs#67](https://github.com/openAMRobot/openamrobot-docs/pull/67) + +- openamrobot-2/hardware-architecture.md:2, 5, 8 (BOM-ISSUE-IN-FORCE) +- openamrobot-2/hardware-architecture.md:10, 15, 53 (BOM-ISSUE-IN-FORCE) +- openamrobot-2/hardware-architecture.md:10 (COMPONENT-AVAILABILITY) +- openamrobot-2/hardware-architecture.md:23 (DRIVETRAIN) +- openamrobot-2/hardware-architecture.md:27 (FRAMES-REP105) +- openamrobot-2/hardware-architecture.md:29 (NAV-LIDAR) +- openamrobot-2/hardware-architecture.md:30 (CAMERAS) +- openamrobot-2/hardware-architecture.md:45 (NAV-LIDAR) +- openamrobot-2/index.md:23, 42 (BOM-ISSUE-IN-FORCE) +- openamrobot-2/index.md:36 (CAMERAS) +- openamrobot-2/index.md:39 (NAV-LIDAR) +- openamrobot-2/index.md:41 (FRAMES-REP105) +- openamrobot-2/index.md:45 (SAFETY-PROCUREMENT label) +- openamrobot-2/index.md:46 (CONFIG-IDS) +- openamrobot-2/general-arrangement.md:29 (UC1-34) +- openamrobot-2/general-arrangement.md:54 (CONFIG-IDS) +- openamrobot-2/mass-and-stability.md:50 (BATTERY-PLACEMENT) +- openamrobot-2/dark-store-simulation.md:58 (CAMERAS, NAV-LIDAR) +- assets/simulation/openamrobot2-dark-store-sim.html:205 (CAMERAS, NAV-LIDAR) +- foundations/navigation/docking.md:98-105 (DOCK-NO-CONTACTS, DOCKING-NOT-CHARGING, CHARGING) +- reference/openamrobot-ui/overview.md:34, 37 (STOP-SCOPE) +- reference/openamrobot-ui/setup.md:145-146 (STOP-SCOPE) +- reference/openamrobot-ui/troubleshooting.md:127 (STOP-SCOPE) +- use/monitoring/when-something-goes-wrong.md:16 (STOP-SCOPE) +- reference/openamr-platform-hw/overview.md:10 (COMPUTE, BASE-CONTROLLER-GATES) +- reference/openamr-platform-hw/{concepts,reference,configuration,tutorials}.md:11 (COMPUTE, BASE-CONTROLLER-GATES) +- reference/openamr-platform-fw/{overview:12, concepts, configuration, reference, setup, tutorials, troubleshooting:16} (BASE-CONTROLLER-GATES, BASE-CONTROLLER-IO) +- reference/openamr-platform-fw/reference.md:26 (COMPUTE, UC1-82) +- reference/openamr-platform-hw/configuration.md:147, 152, 155 (PUBLICATION (prices)) +- DOCUMENTATION_INFORMATION_ARCHITECTURE.md:438, 440, 571 (RELEASE-MILESTONES) +- academy/program-3.md:13 (RELEASE-MILESTONES) +- customize/index.md:23 (RELEASE-MILESTONES) +- assets/hardware/openamrobot2-general-arrangement.html:53 (MAST-INSTALL-HEIGHT, MAST-TOP-HEIGHT) +- ...general-arrangement.html:453 (MAST-TOP-HEIGHT) +- ...general-arrangement.html:621 (NAV-LIDAR) +- ...general-arrangement.html:626 (MAST-INSTALL-HEIGHT, MAST-TOP-HEIGHT, MAST-POSITIONS) +- ...general-arrangement.html:654, 658, 660, 713 (MAST-POSITIONS) +- ...general-arrangement.html:711 (MAST-POSITIONS) +- ...general-arrangement.html:717 (MAST-INSTALL-HEIGHT) +- ...general-arrangement.html:718 (MAST-POSITIONS) +- assets/roadmap/index.html:165 (SAFETY-PROCUREMENT) +- openamrobot-2/hardware-architecture.md:26 (SAFETY-PROCUREMENT) +- foundations/navigation/docking.md:18, 22 (DOCK-NO-CONTACTS) +- reference/openamr-platform-hw/concepts.md:26, 35 (COMPUTE) +- reference/openamr-platform-hw/overview.md:12, 19 (COMPUTE) +- reference/openamr-platform-hw/reference.md:33 (COMPUTE) +- reference/openamr-platform-hw/reference.md:104 (NAV-LIDAR) +- reference/openamr-platform-hw/reference.md:32 (CAMERAS) +- reference/openamr-platform-hw/concepts.md:50 (SHARED-BASE) +- reference/openamr-platform-hw/tutorials.md:35 (RS485-NOT-IN-2-0) +- openamrobot-2/general-arrangement.md:28 (BATTERY-PLACEMENT) +- openamrobot-2/index.md:35 (BATTERY-PLACEMENT) +- evidence/2026-10-28-chest-riser-rerender/README.md:25 (HEAD-CAMERA-IDENTITY) + +Not fixed (removed from the fix PR by the lead): openamrobot-2/roadmap.md:14 (UI-GATE-A); assets/roadmap/index.html:165, progress.html:169 (UI-GATE-A). See S17. + + +AGENTS.md is absent on main (STATE.md present, dated 1 Nov 2026). Open PRs: #32, #33, #57, #65 (heads 01b2acf, fbf9860, 01a97d1, 4d3cbfc). Every path under docs/ is public material. Lines already reported by check_decisions.py are classified only in the second table. + +| file | line | class | decision ID or UC1-nn | current text or behaviour (short quote) | correct text or behaviour | source | fixable | overlap | +|---|---|---|---|---|---|---|---|---| +| docs/reference/openamrobot-2/hardware-architecture.md | 2, 5, 8 | A | BOM-ISSUE-IN-FORCE | "Hardware architecture (BOM Issue 7.7)"; "following BOM Issue 7.7 and P-03 revision 19.0" | "Hardware architecture (BOM Issue 7.14)", following P-03 rev20.2 | register BOM-ISSUE-IN-FORCE | yes | none | +| docs/reference/openamrobot-2/hardware-architecture.md | 10, 15, 53 | A | BOM-ISSUE-IN-FORCE | "This page follows BOM Issue 7.7 of 12 October 2026"; "superseded by BOM Issue 7.7"; "The table follows BOM Issue 7.7" | BOM Issue 7.14 is in force; Issue 7 to 7.13 are retired | register BOM-ISSUE-IN-FORCE | yes | none | +| docs/reference/openamrobot-2/hardware-architecture.md | 10 | B | COMPONENT-AVAILABILITY | "Components follow the availability rule: in stock at two or more suppliers" | in stock at two or more independent suppliers; a single-source part only as a named option next to a second-sourced alternative; no-stock parts not selected | register COMPONENT-AVAILABILITY | yes | none | +| docs/reference/openamrobot-2/hardware-architecture.md | 23 | A | DRIVETRAIN | "integrated holding brakes (spring-applied function and ratings pending the supplier evidence, F2A)" | brake ratings recorded (ZLTECH 18 Oct 2026): 24 V, 12.5 W per motor, 6 Nm holding, release at most 100 ms, engagement at most 30 ms without diode; fail-safe behaviour still needs verification evidence | register DRIVETRAIN | yes | none | +| docs/reference/openamrobot-2/hardware-architecture.md | 25 | B | BASE-CONTROLLER-IO, UC1-19 | "CAN3 ... reserved for upper-body actuators; no CAN3 node is assigned yet" | CAN3 carries the lift node CTL-017 (MCU + H-bridge), no safety function | P-03 rev20.0 item 24 (not in register) | yes | none | +| docs/reference/openamrobot-2/hardware-architecture.md | 26 | E | SAFETY-PROCUREMENT, RESET-BUTTON, ESTOP-SCOPE, CHARGING, UC1-70, UC1-73 | safety-chain row names E-stops, K1/K2, precharge, DDR-240B-24 only | add Pilz PNOZ s3 (750103) with monitored manual reset, one RESET XB4BW36B5, E-stop cuts actuator power only (Jetson, 5 V, regulated 24 V stay on), charge-relay NC opens the PNOZ supply | register | no (safety wording) | none | +| docs/reference/openamrobot-2/hardware-architecture.md | 26 | D | (precharge, not in register) | "precharge fitted" | correct per P-03 rev20.2 item 26 (Kpre, SAF-004, PWR-014, PWR-015); register has no entry | P-03 rev20.2 item 26 vs register | no | none | +| docs/reference/openamrobot-2/hardware-architecture.md | 27 | A | FRAMES-REP105 | "`imu_link` on the centreline at x 0.195 m from `base_link`, axes aligned with `base_link`" | imu_link (0.0544, 0, 0.1210) m from base_link, rpy (0, 0, -pi/2), yaw -90 deg, chip +Y forward | register FRAMES-REP105 | yes | none | +| docs/reference/openamrobot-2/hardware-architecture.md | 27 | D | IMU-TOPIC-OWNERSHIP | "filtered data by the host EKF on /imu/data" | register: host filter and EKF own /imu/data; P-03 item 24: EKF reads /imu/data_raw (angular_velocity.z only), /imu/data reserved for a host orientation filter, firmware also publishes /imu/temperature | register vs P-03 rev20.0 item 24 | no | none | +| docs/reference/openamrobot-2/hardware-architecture.md | 29 | A | NAV-LIDAR | "beam 222.0 mm above the floor" | scan plane 222.05 mm above the floor | register NAV-LIDAR | yes | none | +| docs/reference/openamrobot-2/hardware-architecture.md | 30 | A | CAMERAS | "housing centre on the old camera centre, 142.5 mm above the floor; `base_camera_link` (0.376, 0, 0.0445)" | base_camera_link (0.387, 0, 0.046) from base_link; camera centre 144 mm above the floor | register CAMERAS | yes | none | +| docs/reference/openamrobot-2/hardware-architecture.md | 45 | A | NAV-LIDAR | "Existing MMP.07 A1 bracket and its 10 mm standoffs plus a 7.1 mm spacer plate" | MMP.07 bracket with a 17.5 mm printed spacer MMP.07.00.00.002 and no standoffs | register NAV-LIDAR | yes | none | +| docs/reference/openamrobot-2/hardware-architecture.md | 19-34 | E | POWER-RAILS, MAIN-PROTECTION, CHARGING, UC1-53 | no power or charging row in the architecture table | add: 25.6 V battery bus, regulated 24 V, regulated 5 V, SAFE 24 V DDR-240B-24 behind F-LIFT 15 A, no 12 V rail; F0 110 A Class T and lockable disconnect; TZBOT WCM-500-24 wireless charging, Daly charger bench only | register | no (E) | none | +| docs/reference/openamrobot-2/index.md | 23, 42 | A | BOM-ISSUE-IN-FORCE | "(follows BOM Issue 7.7)"; "BOM issue: OpenAMRobot 2.0 Detailed Hardware BOM, Issue 7.7" | Issue 7.14 (27 October 2026, with the 1 November 2026 changes) | register BOM-ISSUE-IN-FORCE | yes | none | +| docs/reference/openamrobot-2/index.md | 36 | A | CAMERAS | "housing centre on the old camera centre, 142.5 mm above the floor, `base_camera_link` (0.376, 0, 0.0445)" | (0.387, 0, 0.046), camera centre 144 mm; date platform lead decision 16 Oct 2026 (P-03 rev19.4 item 19 D3 update) | register CAMERAS | yes | none | +| docs/reference/openamrobot-2/index.md | 39 | A | NAV-LIDAR | "MMP.07 A1 bracket and 10 mm standoffs with a 7.1 mm spacer plate; beam 222.0 mm" | 17.5 mm printed spacer MMP.07.00.00.002, no standoffs, scan plane 222.05 mm | register NAV-LIDAR | yes | none | +| docs/reference/openamrobot-2/index.md | 41 | A | FRAMES-REP105 | "ICM-42688-P on the centreline at x = 0.195 m from `base_link`" | imu_link (0.0544, 0, 0.1210), yaw -90 deg | register FRAMES-REP105 | yes | none | +| docs/reference/openamrobot-2/index.md | 45 | B | SAFETY-PROCUREMENT (chest E-stop wording retired) | row label "Chest and second E-stop" | "Chest equipment and second E-stop on the static lift column" | P-03 rev20.2 item 26 (retirement not in register) | yes | none | +| docs/reference/openamrobot-2/index.md | 46 | B | CONFIG-IDS | "head pitch `hp15` to `hp35`; base tilt `bt05`, `bt10`, `bt15`" | add baselines hp30 and bt10; lift stops L1000/L1175/L1350 are calibration IDs | register CONFIG-IDS | yes | none | +| docs/reference/openamrobot-2/index.md | 49-56 | E | LIFT, UC1-14 | open inputs omit the lift release gates; "approved in principle" stated nowhere in docs/reference | lift approved in principle; DOLD written confirmation 14 Oct 2026 (800 N held, power off); gates: holding test on the delivered unit, supplier CAD, weighed mass, CAN3 lift interface, F2S rerun | register LIFT | no (E) | none | +| docs/reference/openamrobot-2/general-arrangement.md | 29 | B | UC1-34 | "the lift carriage carries the arms and the head camera" | the lift carriage carries the arms, head camera, Getac ZX80 and head light | UC1-34; P-03 rev20.0 item 24 | yes | none | +| docs/reference/openamrobot-2/general-arrangement.md | 54 | B | CONFIG-IDS | "Base-camera tilt: `bt05`, `bt10`, `bt15`" | mark bt10 as baseline | register CONFIG-IDS | yes | none | +| docs/reference/openamrobot-2/general-arrangement.md | 19-33 | E | LIFT | lift described as decided; "approved in principle" and holding-test gate missing | "Lift approved in principle"; holding test on the delivered unit is a release gate | register LIFT | no (E) | none | +| docs/reference/openamrobot-2/mass-and-stability.md | 50 | A | BATTERY-PLACEMENT | "Selected pack and the 25 percent placement decision" | placed as close to the rear edge as practical while preserving enclosure, service and safety clearances | register BATTERY-PLACEMENT | yes | none | +| docs/reference/openamrobot-2/dark-store-simulation.md | 58 | A | CAMERAS, NAV-LIDAR | "Gemini 336L housing centre 142.5 mm ... (0.376, 0, 0.0445) ...; RPLIDAR S3 beam 222.0 mm" | (0.387, 0, 0.046), 144 mm; scan plane 222.05 mm | register CAMERAS, NAV-LIDAR | yes | none | +| docs/assets/simulation/openamrobot2-dark-store-sim.html | 205 | A | CAMERAS, NAV-LIDAR | "Gemini 336L housing centre 142.5 mm ... (base_camera_link 0.376, 0, 0.0445 ...); RPLIDAR S3 beam 222 mm" | (0.387, 0, 0.046), 144 mm; 222.05 mm | register CAMERAS, NAV-LIDAR | yes (text paragraph) | none | +| docs/reference/openamrobot-2/roadmap.md | 14 | B | UI-GATE-A | "Gate A partial (A1 control only) ... Gate A full run 6 November 2026" | "UI Gate A partial (A1) 30 October; full UI Gate A 6 November 2026", kept distinct from hardware Gate A (Teensy, MPU6500) | register UI-GATE-A | yes | none | +| docs/assets/roadmap/index.html | 165 | B | UI-GATE-A | "Gate A on Jetson and Teensy ... (Gate A partial, A1 control only), Gate A full run 2026-11-06"; same in progress.html:169 | the 30 Oct / 6 Nov dates belong to UI Gate A; name it "UI Gate A" | register UI-GATE-A | yes (generator text) | none | +| docs/assets/roadmap/architecture.html | 186 | D | CHARGING, DOCK-NO-CONTACTS | "Wired only in 2.0; TZBOT in 3.0 (BOM Issue 7.14 Decisions sheet, charging row)" | register: TZBOT WCM-500-24 wireless is the 2.0 path; BOM Decisions sheet disagrees (owner to correct BOM) | register CHARGING vs BOM Issue 7.14 | no | none | +| docs/assets/roadmap/hardware.html | 186 | D | CHARGING | "PWR-019 ... SB50 charge connector" (ID reused) | register: "wired inlet PWR-019 ... removed"; BOM 7.14 reuses PWR-019 for the SB50 connector; owner to align the register text or BOM ID | register CHARGING vs BOM Issue 7.14 | no | none | +| docs/assets/roadmap/hardware.html | 175 | D | SHARED-BASE, BATTERY-PLACEMENT | release 001 "battery: own pack, voltage and chemistry to be decided"; Pi 5 vs Jetson as open differences | SHARED-BASE: battery and protection shared; only controller and sensor types differ; owner to resolve | register SHARED-BASE vs E-01 Sheet A | no | none | +| docs/assets/roadmap/architecture.html | 186 | D | IMU-TOPIC-OWNERSHIP | "Firmware /imu/data_raw; host filter /imu/data" as design value | P-03 item 24: EKF reads /imu/data_raw, /imu/data reserved for a host orientation filter | register vs P-03 rev20.0 item 24 | no | none | +| docs/assets/roadmap/model/model.js | 184 | D | NEAR-FIELD-FRAMES | "TOF_X: .39" (model geometry) | register: tof_front (0.399, 0, -0.0066), tof_rear (-0.399, ...); P-03 item 19 D6 still 0.390 | register vs P-03 rev19.0 item 19 D6 | no (geometry) | none | +| docs/assets/roadmap/robot.html | 349, 377 | D | NEAR-FIELD-FRAMES | "tof_front and tof_rear (±0.390, 0, -0.0066) ... (design, P-03 rev20.2)" | register 0.399; same conflict in progress.html:171 drift-3 and architecture.html:196 OA-10 ("register and P-03 give +/-0.390", register now 0.399) | register vs P-03 | no | none | +| docs/foundations/navigation/docking.md | 98-105 | B | DOCK-NO-CONTACTS, DOCKING-NOT-CHARGING, CHARGING | "Docking gets the robot to the contacts ... The dock should not be live until the robot reports engagement" | add: "OpenAMRobot 2.0 docking is positioning only: no dock contacts or pilot; charging is the TZBOT WCM-500-24 wireless path, and a docking pose never establishes charging" | register | yes | none (#32 touches other navigation files) | +| docs/reference/openamr-platform-sw/concepts.md | 84-97 | E | UC1-47, DOCK-NO-CONTACTS | AprilTag dock four-phase approach only | state that 2.0 docking is positioning only with final alignment on site ArUco markers (not implemented) | UC1-47; register | no (E) | none | +| docs/foundations/safety/emergency-stop.md | 1-44 | E | SAFETY-PROCUREMENT, ESTOP-SCOPE, RESET-BUTTON, UC1-03, UC1-04, UC1-70, UC1-73 | framework stub only | two hardwired E-stops (base front, rear face of static lift column), PNOZ s3 monitored reset, one RESET, actuator power only, no automatic resume | register | no (safety wording) | none | +| docs/reference/openamrobot-ui/overview.md | 34, 37 | A | STOP-SCOPE | "## The E-STOP is software only"; "The red **E-STOP** button in the dashboard" | the dashboard control is labelled "Stop (software)" (openamrobot-ui main 0ca798b, #38); a functional stop covering base motion only; "E-stop" means only the hardwired buttons | register STOP-SCOPE | yes (anchor in setup.md:146 must follow) | none | +| docs/reference/openamrobot-ui/setup.md | 145-146 | A | STOP-SCOPE | "the dashboard's E-STOP is software only" | "the dashboard's Stop (software) is a functional stop, not the E-stop" | register STOP-SCOPE | yes | none | +| docs/reference/openamrobot-ui/troubleshooting.md | 127 | A | STOP-SCOPE | "Dashboard E-STOP does not always stop the robot" | "Stop (software) does not always stop the robot" | register STOP-SCOPE | yes | none | +| docs/use/monitoring/safety.md | 23 | A | STOP-SCOPE | "The red E-STOP on the screen is not an emergency stop." | "The Stop (software) button on the screen is not an emergency stop." | register STOP-SCOPE | yes | none | +| docs/use/monitoring/when-something-goes-wrong.md | 16 | A | STOP-SCOPE | "The dashboard E-STOP is not a safety device" | "The dashboard Stop (software) is not a safety device" | register STOP-SCOPE | yes | none | +| docs/reference/openamr-platform-hw/overview.md | 10 | B | COMPUTE, BASE-CONTROLLER-GATES | "Current reference configuration" table (Pi 5, Teensy, ZBLD, MPU6500, Pi camera) unlabelled | label the table "Existing robot (release 001, Gate A, legacy)"; 2.0: Jetson Orin NX on J401, STM32H723ZG, ZLTECH | register | yes | none | +| docs/reference/openamr-platform-hw/{concepts,reference,configuration,tutorials}.md | 11 | B | COMPUTE, BASE-CONTROLLER-GATES | "**Applies to:** the documented OpenAMRobot reference mobile base" | "Applies to: the existing robot (release 001, Gate A, legacy reference build); not OpenAMRobot 2.0" | register | yes | none | +| docs/reference/openamr-platform-fw/{overview,concepts,configuration,reference,setup,tutorials,troubleshooting}.md | 16 (overview 12) | B | BASE-CONTROLLER-GATES, BASE-CONTROLLER-IO | "*Applies to the Teensy 4.0 `linorobot2_overlay` firmware.*" | add "Gate A (existing robot, legacy test configuration and release fallback); 2.0 is the STM32H723ZG with micro-ROS over Ethernet UDP" | register | yes | none | +| docs/reference/openamr-platform-fw/reference.md | 26 | A | COMPUTE, UC1-82 | image alt "the micro-ROS agent on the Pi 5" over USB serial | label legacy (Gate A, Raspberry Pi 5); 2.0 agent on the Jetson over Ethernet UDP | register COMPUTE, BASE-CONTROLLER-IO | yes | none | +| docs/reference/openamr-platform-fw/reference.md | 72-73 | D | IMU-TOPIC-OWNERSHIP | "the host Madgwick/EKF pipeline fuses them into the filtered `/imu/data`" | see the IMU topic conflict above (register vs P-03 item 24) | register vs P-03 | no | none | +| docs/reference/openamr-platform-hw/configuration.md | 147, 152, 155 | B | PUBLICATION | "Schneider (genuine, (price))"; "Chinese clone ((price))"; "(price)" | remove prices | AGENTS.md Publication | yes | none | +| docs/about/index.md; docs/about/visual-identity.md; docs/DOCUMENTATION_STANDARD.md; docs/academy/partner-program.md; docs/business/partner-portal.md; docs/business/partner-program.md; mkdocs.yml | 17, 47; 28; 154; 7, 271; 12; 1; 562 | B | PUBLICATION | "(contact address)" contact address on public pages | owner decision whether an organisational address is allowed; rule says no contact data | AGENTS.md Publication | no (owner) | academy/partner-program.md lines 7, 271 covered by #57 (changes to (contact address), still contact data); mkdocs.yml same file in #57, different lines | +| docs/assets/roadmap/index.html, progress.html, hardware.html, architecture.html | 165; 171-193; 175; 196 | B | PUBLICATION | personal GitHub handles as owners (e.g. (handle), (handle), (handle), (handle)) | owner decision; use roles only if private persons may not be named | AGENTS.md Publication | no (owner) | none | +| docs/assets/roadmap/progress.html | 174, 193 | B | PUBLICATION, UC1 confidentiality | 75 Use Case 1 requirement paraphrases published, including task-level items (UC1-56 "Display digit legibility", UC1-57 "Fluid level reading by camera") | owner (docs owner, use-case owner) confirms which UC1 texts are public; brief treats the baseline as confidential beyond IDs and robot values | Use Case 1 baseline rev18.5 confidentiality | no (owner) | none | +| docs/assets/hardware/openamrobot2-ga-{elevations,front-view,mast-detail,parts-list,side-view,top-view}.jpg | n/a | B | MAST-INSTALL-HEIGHT, LIFT | superseded fixed-mast drawings published, unreferenced, no label possible in the image | remove or label beside a link as superseded (owner) | register LIFT | no (binary) | none | +| docs/DOCUMENTATION_INFORMATION_ARCHITECTURE.md | 438, 440, 571 | A | RELEASE-MILESTONES | "target for 13 November"; column "**v0.2**"; "completeness sweep against the v0.2 list" | no v0.2 release; development cycle 2 ends 20 Nov 2026 with v2.0.0-rc.1; v2.0.0 on 18 Dec 2026 | register RELEASE-MILESTONES | yes | none (decision-allow: RELEASE-MILESTONES audit quotes the retired text) | +| docs/academy/program-3.md | 13 | A | RELEASE-MILESTONES | "upper-body repositories are planned for the v0.2 cycle" | "for development cycle 2 (v2.0.0-rc.1 on 20 Nov 2026, v2.0.0 on 18 Dec 2026)" | register RELEASE-MILESTONES | yes | none (not in #57) | +| docs/customize/index.md | 23 | A | RELEASE-MILESTONES | "planned for the v0.2 cycle" | as above | register RELEASE-MILESTONES | yes | none (decision-allow: RELEASE-MILESTONES audit quotes the retired text) | + +### Checker findings classification + +| file:line | ID | class | proposed exact replacement text (if fixable) | overlap | +|---|---|---|---|---| +| docs/assets/hardware/openamrobot2-general-arrangement.html:53 | MAST-INSTALL-HEIGHT, MAST-TOP-HEIGHT | historical, allow-label (superseded banner at line 50) | prepend line-52 comment `` and add `` on line 53 | none | +| ...general-arrangement.html:453 | MAST-TOP-HEIGHT | historical, allow-label | `decision-allow: MAST-TOP-HEIGHT superseded GA record of 28 Sep 2026` on line 452 or 453 | none | +| ...general-arrangement.html:621 | NAV-LIDAR | historical, allow-label | change "Hokuyo layout" to "Hokuyo layout, superseded" | none | +| ...general-arrangement.html:626 | MAST-INSTALL-HEIGHT, MAST-TOP-HEIGHT, MAST-POSITIONS | historical, allow-label; three IDs on one line, and the marker covers one ID per line (same or previous line), so the line must be split or reworded with "superseded" | reword start "Superseded fixed-mast arrangement (28 Sep 2026): ..." and split the three statements over separate lines, each with its marker | none | +| ...general-arrangement.html:654, 658, 660, 711, 713, 718 | MAST-POSITIONS | historical, allow-label | `decision-allow: MAST-POSITIONS superseded GA record of 28 Sep 2026` on the same or preceding line | none | +| ...general-arrangement.html:717 | MAST-INSTALL-HEIGHT | historical, allow-label | "Installation height was 1350 mm (superseded by the lift)" | none | +| docs/assets/roadmap/index.html:165 | SAFETY-PROCUREMENT | historical, allow-label ("withdrawn" is not an accepted label word) | "still names superseded LEV100H contactors"; "LEV100H is superseded" (generator text) | none | +| docs/reference/openamrobot-2/hardware-architecture.md:26 | SAFETY-PROCUREMENT | historical, allow-label | "LEV100H is superseded" | none | +| docs/reference/openamr-platform-hw/configuration.md:153 | SAFETY-PROCUREMENT | A (recommends an uncertified E-stop for prototypes) | not fixable here (safety wording; platform lead); remove the recommendation | none | +| docs/foundations/navigation/docking.md:18, 22 | DOCK-NO-CONTACTS | B (generic docking theory; no 2.0 statement) | keep generic text, add after line 22: "OpenAMRobot 2.0 docking is positioning only, with no dock contacts or pilot; charging is wireless (TZBOT WCM-500-24)." | none | +| docs/reference/openamr-platform-hw/concepts.md:26, 35 | COMPUTE | A | "Raspberry Pi 5 (legacy, existing robot)" in both | none | +| docs/reference/openamr-platform-hw/overview.md:12 | COMPUTE | A | "Raspberry Pi 5, 8 GB, Ubuntu Server 24.04 and ROS 2 Jazzy (legacy, existing robot; the 2.0 compute is the Jetson Orin NX 16 GB on a reComputer Robotics J401)" | none | +| docs/reference/openamr-platform-hw/overview.md:19 | COMPUTE | A | "... and no active Raspberry Pi 5 cooling in the legacy reference build (existing robot)." | none | +| docs/reference/openamr-platform-hw/reference.md:33 | COMPUTE | A | "**Raspberry Pi 5** (legacy, existing robot; Model B Rev 1.1, ...)" | none | +| docs/reference/openamr-platform-hw/reference.md:104 | NAV-LIDAR | historical, allow-label | "**LiDAR** (legacy, existing robot): confirm the model sticker (A1M8 vs other)." | none | +| docs/reference/openamr-platform-hw/reference.md:32 | CAMERAS | A | "**Sony IMX708** = Raspberry Pi **Camera Module 3 NoIR** (legacy, existing robot; the 2.0 base camera is the Orbbec Gemini 336L)" | none | +| docs/reference/openamr-platform-hw/concepts.md:50 | SHARED-BASE | A | "- **Charging**: **wireless charging** with the TZBOT WCM-500-24 (the WCM-300 is only the existing unit on the release 001 robot today), docking positioning only." | none | +| docs/reference/openamr-platform-hw/tutorials.md:35 | RS485-NOT-IN-2-0 | false positive (ZBLD driver terminal list of the existing robot; RS485 unused) | append "(RS485 A/B not used; legacy, existing robot)" to the alt text | none | +| docs/reference/openamrobot-2/general-arrangement.md:28 | BATTERY-PLACEMENT | A | "| Battery | One 8S1P EVE LF105 pack, as close to the rear edge as practical while preserving enclosure, service and safety clearances (P-03 revision 18.7 item 9) | ..." | none | +| docs/reference/openamrobot-2/index.md:35 | BATTERY-PLACEMENT | A | "...; placed as close to the rear edge as practical while preserving enclosure, service and safety clearances | 28 September 2026, recorded in P-03 revision 18.2; placement per P-03 revision 18.7 item 9 |" | none | +| evidence/2026-10-28-chest-riser-rerender/README.md:25 | HEAD-CAMERA-IDENTITY | historical, allow-label (dated evidence record, "Pending with their owners") | append " (decision-allow: HEAD-CAMERA-IDENTITY dated evidence record of 28 Oct 2026)" | none | + +## openamrobot-manifest + +### Fixed in [openamrobot-manifest#20](https://github.com/openAMRobot/openamrobot-manifest/pull/20) + +- STATE.md:29 (NAV-LIDAR) +- README.md:65 (NAV-LIDAR) +- README.md:66 (BASE-CONTROLLER-IO, UC1-81) + + +Reviewed: AGENTS.md, STATE.md, README.md, openamrobot.repos, releases/v2.0.0-rc.1.repos, CONTRIBUTING.md. Open PRs diffed: #11 (whole diff), #19 (STATE.md). No compute, release-date or Raspberry Pi text exists. Public-extract check: 0 findings. + +| file | line | class | decision ID or UC1-nn | current text or behaviour (short quote) | correct text or behaviour | source | fixable | overlap | +|---|---|---|---|---|---|---|---|---| +| STATE.md | 29 | B | NAV-LIDAR | "Manifest PR #11 proposes LiDAR source selection and is not superseded here." | main already carries the identical pin (openamrobot.repos:18, sllidar_ros2 34300099..., since #18), so #11's only change is on main; say so, and leave closing #11 to the owner. #11 also cites P-03 rev18.4 item 13 (register NAV-LIDAR source is P-03 rev19.4 item 19 D4) | git diff of refs/pr/11; NAV-LIDAR | yes | same file in #19, different lines (appends a section) | +| README.md | 65 | B | NAV-LIDAR | `sllidar_ros2` row names only the upstream and pin | add purpose: driver for the 2.0 navigation LiDAR, SLAMTEC RPLIDAR S3 (S3M1-R2), USB through a USB to UART adapter, 1,000,000 baud, `/scan` in `lidar_link` (P-03 rev20.2 item 13) | NAV-LIDAR; P-03 item 13 | yes | none | +| README.md | 66 | B | BASE-CONTROLLER-IO, UC1-81 | `micro_ros_agent` row has no transport note | add: micro-ROS runs over UDP on Ethernet between MCU and Jetson; USB for the bench only | BASE-CONTROLLER-IO | yes | none | + +### Checker findings classification + +None (0 findings in /tmp/audit/openamrobot-manifest.json). + +## openamrobot-release + +### Fixed in [openamrobot-release#17](https://github.com/openAMRobot/openamrobot-release/pull/17) + +- CITATION.cff:11-15 (26-27 unchanged) (LIFT) +- README.md:25 (checker) (COMPUTE) + + +Reviewed: README.md, RELEASE_PROCESS.md, CITATION.cff, release-metadata/*.md, docs/*.md. No AGENTS.md and no STATE.md on main (STATE.md is added by #15). Open PRs: #15 diffed in full; #12, #14, #16 RC1_RELEASE.md and README.md checked. Milestones in README.md:23-27 match RELEASE-MILESTONES and P-03 item 12 (v0.0.1 11 Jul 2026, v2.0.0-rc.1 20 Nov 2026, v2.0.0 18 Dec 2026). Public-extract check: 0 findings. + +| file | line | class | decision ID or UC1-nn | current text or behaviour (short quote) | correct text or behaviour | source | fixable | overlap | +|---|---|---|---|---|---|---|---|---| +| CITATION.cff | 11-15, 26-27 | B | LIFT | abstract "a differential-drive mobile base, a lift and two arms" while `version: "0.0.1"`, `date-released: "2026-07-11"` (the v0.0.1 robot had no lift or arms) | describe the v0.0.1 content, or say the lift (approved in principle) and two arms are OpenAMRobot 2.0 | LIFT; README.md:25 | yes (metadata text) | none | +| release-metadata/RELEASE_NOTES.md | 11 | A (historical document, unlabelled line) | COMPUTE | "Raspberry Pi 5 and Teensy 4.0 architecture" | "Legacy v0.0.1 architecture: Raspberry Pi 5 and Teensy 4.0" | COMPUTE | yes | covered by #15 | +| AGENTS.md, STATE.md | (missing on main) | E | process | absent | adopt shared AGENTS.md block; STATE.md | .github AGENTS.md | no (rollout) | STATE.md covered by #15 | + +### Checker findings classification + +| file:line | ID | class | proposed exact replacement text | overlap | +|---|---|---|---|---| +| README.md:25 | COMPUTE | historical, allow-label (v0.0.1 row in the dated version table, "existing robot"; the checker accepts only legacy/Gate A labels) | `\| v0.0.1 \| 11 July 2026 \| First public platform release: the existing robot (legacy compute: Raspberry Pi 5, Teensy 4.0 with the linorobot2 overlay, RPLIDAR A1). \|` | not in #15; same file in #12/#14/#16, different lines (they add a pointer at line 1) | +| release-metadata/RELEASE_NOTES.md:11 | COMPUTE | historical, allow-label (v0.0.1 release notes) | `- Legacy v0.0.1 architecture: Raspberry Pi 5 and Teensy 4.0` | covered by #15 (identical text) | + +# Class C, D and E findings that need an owner decision + +Every row below is reported only; this audit changes none of them. Source conflicts S1 to S17 above are also owner decisions. + +| repository | class | file | line | decision ID or UC1-nn | finding (short) | +|---|---|---|---|---|---| +| .github | D | ROADMAP.md | 64 | none (not in register) | "Dual 6-DoF Arms" | +| .github | E | ROADMAP.md | 63-69 | LIFT | robot components list has no lift | +| .github | D | decisions.yaml | 615, 621 | IMU-TOPIC-OWNERSHIP | "the host filter and EKF own /imu/data" | +| .github | D | decisions.yaml | 409 | NEAR-FIELD-FRAMES | tof_front (0.399, 0, -0.0066) | +| .github | D | decisions.yaml | 648 (CAMERAS), 369 (FRAMES-REP105) | CAMERAS, FRAMES-REP105 | 144 mm, imu_link (0.0544, 0, 0.1210) | +| .github | E | decisions.yaml | 831-846 | SAFETY-PROCUREMENT | no precharge | +| .github | E | decisions.yaml | 838, 848 | SAFETY-PROCUREMENT | retirement of "chest E-stop" wording not recorded | +| .github | E | decisions.yaml | 840 | SAFETY-PROCUREMENT | K1/K2 Gigavac GX11CAC recorded without a pending marker | +| .github | E | decisions.yaml | 67, 1469 | OPERATOR-PANEL | source text "whole chest layout" | +| .github | E | decisions.yaml | 490 | DRIVETRAIN | brake engagement only "at most 30 ms without diode" | +| .github | E | decisions.yaml | (absent) | UC1-04, UC1-13, UC1-19, UC1-34 | item 24 equipment not registered | +| .github | E | decisions.yaml | 884-887 | SAFETY-CHAIN-IO | base E-stop spare NO "as a diagnostic input" | +| .github | E | decisions.yaml | 1151 | NAV-LIDAR, UC1-10 | "connected over USB" | +| .github | E | decisions.yaml | 718-728 | POWER-RAILS, UC1-53 | aux converters not named | +| .github | E | decisions.yaml | 912 | ESTOP-SCOPE, UC1-70 | "the Jetson, the 5 V rail and the regulated 24 V rail stay powered" | +| .github | D | decisions.yaml | 846, 891, 917, 944, 973, 1083, 1110, 1440 | E-01 citations | cites E-01 rev1.1, rev1.3 and rev1.5 | +| .github | D | decisions.yaml | 1051 | PLATFORM-PIN | "pinned platform-sw commit (dfd44a5 on 20 Oct 2026)" | +| .github | E | decisions.yaml | 189 | BOM-ISSUE-IN-FORCE | supersedes lists 7.11, 7.10, 7.8 ...; check says "Issue 7 to 7.13 ... are retired" | +| .github | D | decisions.yaml | 1226-1227 | LIFT, UC1-14 | DOLD confirmation received; holding test is the gate | +| .github | D | decisions.yaml | 691 (HEAD-CAMERA-IDENTITY), 648 (CAMERAS) | UC1-50, UC1-52 | 42 mm, hp30; base camera 144 mm, bt05/bt10/bt15 | +| .github | D | decisions.yaml | (absent) | UC1-47 | no fiducial named in DOCK entries | +| .github | E | decisions.yaml | (absent) | STATUS-VOCABULARY, CHARGING | not settled whether a chain opened by charging (charge relay opens PNOZ supply) is SAFETY_STOPPED | +| .github | E | decisions.yaml | (absent) | UC1-01, UC1-07, UC1-09, UC1-55, UC1-61, UC1-62, UC1-71, UC1-72, UC1-73, UC1-74, UC1-84, UC1-90..93 | no register entries | +| openamr-platform-sw | C | ros2/src/openamrobot_description/urdf/sensors.xacro | 133-136 | NEAR-FIELD-FRAMES | us_front_* x="0.3906", us_rear_* x="-0.3886" | +| openamr-platform-sw | C | ros2/src/openamrobot_description/urdf/sensors.xacro | 142-143 | NEAR-FIELD-FRAMES | tof_front/tof_rear pitch="0.3491" (20 deg down) | +| openamr-platform-sw | C | ros2/src/openamrobot_description/config/sensor_frames.yaml | 43, 49, 55, 61 | NEAR-FIELD-FRAMES | xyz [0.3906, ...] / [-0.3886, ...] | +| openamr-platform-sw | C | ros2/src/openamrobot_description/config/sensor_frames.yaml | 69, 75 | NEAR-FIELD-FRAMES | rpy [0.0, 0.3491, ...] "# 20 deg down, screening value" | +| openamr-platform-sw | C | ros2/src/openamrobot_description/urdf/robot.sdf | 692-709 | NEAR-FIELD-FRAMES | us_* 0.3906 / -0.3886; tof pitch 0.3491; comment "20 degree down screening value" | +| openamr-platform-sw | D | ros2/src/openamrobot_bringup/config/ekf.yaml | 2, 32 | IMU-TOPIC-OWNERSHIP | imu0: /imu/data | +| openamr-platform-sw | C | ros2/src/openamrobot_bringup/launch/real_bringup.launch.py | 90 | FRAMES-REP105 | static base_link -> base_footprint identity (not labelled Gate A) | +| openamr-platform-sw | C | ros2/src/openamrobot_bringup/launch/real_bringup.launch.py | 88 | FRAMES-REP105 | static base_link -> imu_link identity (Gate A) | +| openamr-platform-sw | E | ros2/src/openamrobot_bringup/launch/real_bringup.launch.py | 54-97 | FRAMES-REP105, CAMERAS, NAV-LIDAR | real path starts no robot_state_publisher; only Gate A static TFs (lidar 0.335/0.18, camera_link) | +| openamr-platform-sw | E | ros2/src/openamrobot_drivers/launch/drivers.launch.py | 86-89 | BASE-CONTROLLER-IO, UC1-81 | micro-ROS agent "serial -b 115200" to the Teensy only | +| openamr-platform-sw | C | ros2/src/openamrobot_drivers/launch/drivers.launch.py | 81 | NAV-LIDAR, UC1-10 | lidar_model default 'a1' (documented interim until the S3 is mounted) | +| openamr-platform-sw | E | ros2/src/openamrobot_perception/launch/camera.launch.py | whole file | CAMERAS | real camera path is only the IMX708 via camera_ros | +| openamr-platform-sw | C | ros2/src/openamrobot_gazebo/config/gz_bridge.yaml | 37-38 | IMU-TOPIC-OWNERSHIP | sim IMU bridged as "imu" (/imu) | +| openamr-platform-sw | C | ros2/src/openamrobot_nav2/config/navigation_status_profile.yaml | 39-41 | IMU-TOPIC-OWNERSHIP | topic "/imu" "# nothing publishes this in the sim", frame base_link | +| openamr-platform-sw | C | ros2/src/openamrobot_nav2/config/nav2_params.yaml | 172, 217 | ARM-MOUNT (chassis 780 x 582) | footprint front x 0.415 (rear updated to -0.390) | +| openamr-platform-sw | C | ros2/src/openamrobot_nav2/config/nav2_params.yaml | 384, 394-396 | DOCKING-NOT-CHARGING | docking_server block with SimpleChargingDock, wait_charge_timeout 5.0; docking_server is not in lifecycle_n... | +| openamr-platform-sw | E | docs/safety/00_safety_overview.md | 7-9, 84-87 | ESTOP-SCOPE, SAFETY-PROCUREMENT, UC1-03, UC1-04, UC1-70, UC1-73 | "There is currently no hardware E-stop" with no 2.0 statement | +| openamr-platform-sw | E | docs/safety/README.md; docs/navigation/00_overview.md; README.md | 5; 42; 379 | ESTOP-SCOPE, UC1-03 | "no hardware E-stop / safety_io yet" | +| openamr-platform-sw | D | ros2/src/openamrobot_docking (whole package), AGENTS.md scope | - | UC1-47 | AprilTag 36h11 3-tag bundle for final alignment | +| openamr-platform-sw | D | ros2/src/openamrobot_description/config/sensor_frames.yaml | 68 | NEAR-FIELD-FRAMES | tof_front x 0.399 (follows the register) | +| openamr-platform-sw | D | ros2/src/openamrobot_description/config/sensor_frames.yaml | 16-22 | CAMERAS, UC1-52 | base_camera_link (0.387, 0, 0.046), bt10 (follows the register, 144 mm) | +| openamr-platform-sw | E | ros2/src/openamrobot_nav2/config/nav2_params.yaml | 303, 312-313 | UC1-07 | AssistedTeleop enabled; TELEOP "UNPROTECTED" (navigation_status_profile.yaml:57); no gate against teleop du... | +| openamr-platform-sw | E | docs (all) | - | STOP-SCOPE | no statement of "Stop (software)" as a functional, base-only stop | +| openamr-platform-fw | E | docs/architecture/base-controller-2-0-io.md | 29 | IMU-TOPIC-OWNERSHIP | "Publishes /imu/data_raw; the host filter owns /imu/data." | +| openamr-platform-fw | D | docs/architecture/base-controller-2-0-io.md | 29 | IMU-TOPIC-OWNERSHIP | register: "the host filter and EKF own /imu/data" | +| openamr-platform-fw | E | docs/architecture/base-controller-2-0-io.md | 32-38 | BASE-CONTROLLER-GATES | CAN table, no statement on the click shield | +| openamr-platform-fw | E | docs/architecture/base-controller-2-0-io.md | 37 | BMS-FAULTS | "FDCAN2 CAN2 isolated BMS (Daly via CTL-014)" | +| openamr-platform-fw | E | docs/architecture/base-controller-2-0-io.md | (missing section) | SAFETY-CHAIN-IO, RESET-BUTTON, CHARGING | no safety and charging I/O | +| openamr-platform-fw | D | docs/bringup/micro-ros-bringup.md | 59-60 | IMU-TOPIC-OWNERSHIP | "the host Madgwick/EKF pipeline fuses them into the filtered /imu/data and /odom" | +| openamr-platform-fw | C | boards/teensy_4_0/linorobot2_overlay/src/firmware.ino | 398-405 | IMU-TOPIC-OWNERSHIP | `#ifndef USE_FAKE_MAG "imu/data_raw" #else "imu/data"` | +| openamr-platform-fw | E | boards/stm32/ (main holds .gitkeep) | n/a | BASE-CONTROLLER-IO, BASE-CONTROLLER-GATES, IMU-TOPIC-OWNERSHIP, UC1-81 | no 2.0 firmware on main: no SPI4 IMU driver (WHO_AM_I 0x47), no /imu/data_raw or /imu/temperature publisher... | +| openamr-platform-fw | E | firmware/safety_io/ (placeholder) | n/a | SAFETY-CHAIN-IO, BMS-FAULTS, UC1-70, UC1-73 | no 2.0 safety-chain observation or BMS stop-and-lock | +| openamr-platform-hw | E | product-architecture.md | (whole page) | LIFT, ARM-MOUNT, NO-SUSPENSION, UC1-04, UC1-09, UC1-34 | no 2.0 upper-body interface, chassis 780 x 582, no-suspension statement | +| openamr-platform-hw | E | electrical/power_distribution/ (no 2.0 page on main) | n/a | POWER-RAILS, MAIN-PROTECTION, ESTOP-SCOPE, SAFETY-PROCUREMENT, RESET-BUTTON, CHARGING, BMS-FAULTS, UC1-03, UC1-04, UC1-53, UC1-70, UC1-73 | main has no page for 2.0 power distribution, fuses, safety chain, RESET, charging interlock or battery | +| openamr-platform-hw | D | (PR #27) electrical/power_distribution/e01-safety-and-power.md | 45 | (not in register) | "Precharge across K2 stays conditional" | +| openamr-platform-hw | D | (register vs P-03) | n/a | SAFETY-PROCUREMENT | register K1/K2 Gigavac GX11CAC | +| openamr-platform-hw | E | electrical/motor_control/ (no 2.0 page) | n/a | DRIVETRAIN | no page for ZLLG80ASM250-L-B with brakes and ZLAC8015D V4.2 on CAN1 (CANopen) | +| openamr-platform-hw | E | electrical/computing/ (no 2.0 pages) | n/a | COMPUTE, BASE-CONTROLLER-IO, UC1-80, UC1-81 | no Jetson Orin NX / J401 page, no STM32H723ZG (NUCLEO-H723ZG) page; no statement of micro-ROS over Ethernet... | +| openamr-platform-hw | E | electrical/sensors/imu.md | 5-18 | IMU-TOPIC-OWNERSHIP | 2.0 section states no topics | +| openamr-platform-hw | D | (register vs P-03) camera height | n/a | CAMERAS, UC1-52 | register 144 mm, (0.387, 0, 0.046) | +| openamr-platform-hw | D | electrical/sensors/near-field.md | 42 | NEAR-FIELD-FRAMES | register tof x 0.399 (owner confirmation 20 Oct) | +| openamr-platform-hw | E | electrical/wiring/ (no 2.0 page) | n/a | BASE-CONTROLLER-IO, SAFETY-CHAIN-IO | no 2.0 pinout (MB7060 UARTs, TF-Luna UARTs, SPI4 IMU, FDCAN1/2/3, Y32 via ISO1212, RESET NC, spare NO, char... | +| openamr-platform-hw | D | datasheets/ZLTech/wheel_ZLLG80ASM250/readme.md | 5 | DRIVETRAIN | vendor drawing "ZLLG80ASM250-L-B2 V1.01 double-shaft ... Selected 2.0 drivetrain part" | +| openamr-platform-hw | E | datasheets/ZLTech/drivers/readme.md | 1 | DRIVETRAIN | empty readme | +| openamr-platform-hw | E | datasheets/TZBot/README.md, datasheets/TZBot/battery_BMS/readme.md | 1 | BATTERY-PLACEMENT | empty readmes; folder holds a 24 V 20 Ah battery and serial BMS protocol | +| openamr-platform-hw | E | datasheets/TZBot/charger/readme.md | 3 | CHARGING | "Its datasheet belongs in this folder." (no WCM-500-24 datasheet) | +| openamr-platform-hw | E | manufacturing/bom/components-bom.md, mechanical-bom.md | n/a | COMPONENT-AVAILABILITY | no supplier count or second source recorded per part | +| openamr-platform-hw | E | manufacturing/bom/ (no 2.0 parts list) | n/a | BOM-ISSUE-IN-FORCE | no BOM Issue 7.14 part list in the repo (README line 11 only cites it) | +| openamr-platform-hw | E | mechanical/ (no 2.0 page) | n/a | DATUM-HEIGHT-STACK, ARM-MOUNT, NO-SUSPENSION, UC1-09, UC1-15, UC1-17 | no datum stack (deck 294 mm, base plate 304 mm), lift base plate 360 x 230 bp000/bp050, column axis 330 mm ... | +| openamr-platform-hw | D | (register vs UC1 baseline) | n/a | LIFT, UC1-14 | register: DOLD confirmation received 14 Oct, holding test on delivered unit is the gate | +| openamr-upperbody-sw | C | ros2/src/openamrobot_upperbody_description/config/upperbody_configuration.yaml | 76 | HEAD-CAMERA-IDENTITY | `x_ahead_of_arm_mount: 0.022` | +| openamr-upperbody-sw | C | ros2/src/openamrobot_upperbody_description/config/upperbody_configuration.yaml | 18 | CONFIG-IDS | `baseline: head_pitch: hp25` | +| openamr-upperbody-sw | C | ros2/src/openamrobot_upperbody_description/urdf/openamrobot_upperbody.urdf.xacro | 17 | CONFIG-IDS | `` | +| openamr-upperbody-sw | C | ros2/src/openamrobot_upperbody_description/launch/upperbody_description.launch.py | 30 | CONFIG-IDS | launch default for head_pitch read from yaml baseline, so hp25 | +| openamr-upperbody-sw | C | ros2/src/openamrobot_upperbody_description/test/test_upperbody_configurations.py | 74 | HEAD-CAMERA-IDENTITY | test asserts camera x = axis + 0.180 + 0.022 | +| openamr-upperbody-sw | C | ros2/src/openamrobot_upperbody_description/urdf/openamrobot_upperbody.xacro | 66 | LIFT | `lift_joint` limit `effort="0.0" velocity="0.0"` (comment: limits pending, set to 0 so the model cannot com... | +| openamr-upperbody-sw | E | README.md | 65-69 | PLATFORM-PIN | "Depends on ... openamr-platform-sw" with no pinned SHA | +| openamr-upperbody-sw | D | refs/pr/21, 22, 26: ros2/src/openamrobot_upperbody_description/config/upstream_pins.yaml | 14 | PLATFORM-PIN | `openamr_platform_sw: "131e500..."` | +| openamr-upperbody-sw | D | refs/pr/27: config/upstream_pins.yaml and STATE.md | 14; 5 | PLATFORM-PIN | pin `5d575816...` (STATE.md: "Platform pin 5d57581..."), while .github/workflows/model-tests.yml L20 still ... | +| openamr-upperbody-sw | D | refs/pr/27: STATE.md | 5 | (manipulation pin) | "OpenArm ... ROS2 `4e837e1d...` remain unchanged" | +| openamr-upperbody-sw | D | README.md | 33 | UC1-50 | model and register: lens 42 mm ahead, hp30 | +| openamr-upperbody-sw | E | urdf/openamrobot_upperbody.xacro | 96-115 | CAMERAS; UC1-55 | only head-camera frames; no wrist-camera frames | +| openamr-upperbody-sw | E | urdf/openamrobot_upperbody.xacro | whole file | TABLET-MOUNT, OPERATOR-PANEL; UC1-34 | no Getac ZX80, head light or second E-stop geometry on main | +| openamr-upperbody-sw | E | README.md | whole file | STATUS-VOCABULARY, STOP-SCOPE | no status or stop vocabulary stated | +| openamr-upperbody-sw | E | (repository root) | n/a | process (Decisions rule) | AGENTS.md and STATE.md missing on main | +| openamr-upperbody-fw | E | README.md | 38 | LIFT; UC1-41 | lift motion rule stated, hold-and-move limits absent | +| openamr-upperbody-fw | E | README.md | 31-38 | (P-03 item 24) | no statement on lift duty cycle | +| openamr-upperbody-fw | E | README.md | 31-38 | SAFETY-PROCUREMENT; UC1-04 | second E-stop not mentioned | +| openamr-upperbody-fw | D | README.md | 29 | LIFT; UC1-14 | (gate wording) | +| openamr-upperbody-fw | E | (repository root) | n/a | process (Decisions rule) | AGENTS.md and STATE.md missing | +| openamr-upperbody-hw | E | docs/mechanical/upper_body_option_B.md | 28 | SAFETY-PROCUREMENT | second E-stop row has no contact allocation | +| openamr-upperbody-hw | E | docs/mechanical/upper_body_option_B.md | 9-29 | LIFT; UC1-13 | no stop-sensor mounting | +| openamr-upperbody-hw | E | README.md | 13 | (P-03 item 24) | cable routing without the always-on feed | +| openamr-upperbody-hw | E | docs/mechanical/upper_body_option_B.md | 16-17 | UC1-15 | base plate thickness and positions only | +| openamr-upperbody-hw | E | README.md | 14 | COMPONENT-AVAILABILITY | "Release package: CAD, drawings, BOM, ..." | +| openamr-upperbody-hw | D | README.md | 31 | LIFT; UC1-14 | (gate wording) | +| openamr-upperbody-hw | E | (repository root) | n/a | process (Decisions rule) | AGENTS.md and STATE.md missing | +| openamrobot-interfaces | E | ros2/openamr_nav_msgs/CONTRACT.md | 49-53 (DockingStatus validity) | DOCKING-NOT-CHARGING | `ENGAGEMENT_DOCKED` has no statement that docked is a pose result only | +| openamrobot-interfaces | D | ros2/openamr_nav_msgs/CONTRACT.md / msg/NavigationStatus.msg | 65-66 / 103 | STATUS-VOCABULARY, SAFETY-CHAIN-IO | `ESTOP_ACTIVE` "only on fresh I8 telemetry reporting E-stop" | +| openamrobot-interfaces | C | STATE.md | 18, 31 | EMBODIED-AI-REPO | C10 dataset quality gate tracked here via PR #25 (adds tools/check_c10_dataset.py, c10 workflow, tests) | +| openamrobot-manipulation | E | integration/openarm_v2_fake_baseline/test/test_moveit_planning.py | 34-36 | Tests rule (xfail names a tracking issue) | `pytest.mark.xfail(strict=True, ... reason='upstream v2.0 joint_limits.yaml has no acceleration limits; ...... | +| openamrobot-manipulation | E | integration/openarm_v2_combined_model_inventory.md | 74-89 | LIFT; UC1-19, UC1-41 | no lift motion rule in the lift context table | +| openamrobot-manipulation | E | integration/openarm_v2_combined_model_inventory.md | 74-89 | CAMERAS; UC1-55 | head and base cameras only | +| openamrobot-manipulation | E | README.md | 24, 46 | UC1-74, UC1-40 | base/arm mutual exclusion stated; arm droop not covered | +| openamrobot-manipulation | D | refs/pr/20: integration/README.md | (new section "Current validation boundaries") | (cross-repo pin) | PR #20 pins enactic/openarm_ros2 f0f6b63; upperbody-sw PR #21/#27 keep 4e837e1 | +| openamrobot-manipulation | D | integration/openarm_v2_combined_model_inventory.md | 84 | UC1-50 | "lens 42 mm ahead ... baseline hp30" (matches register) | +| openamrobot-manipulation | E | (repository root) | n/a | process (Decisions rule) | STATE.md missing on main | +| openamrobot-ui | C | web/src/pages/InfoPage.jsx | 181-191 (text 185-186) | DOCKING-NOT-CHARGING, CHARGING | "Charging station" card from `/charge_station_connected`; false reads "Robot is not connected to the dock." | +| openamrobot-ui | C | web/src/pages/HealthPage.jsx | 199-200 | DOCKING-NOT-CHARGING | battery badge "Charging" when `/charge_station_connected` is true | +| openamrobot-ui | C | web/src/shared/hooks/useSystemDiagnostics.js | 98-108, 243 | DOCKING-NOT-CHARGING | `battery.charging` = station connected; suppresses low-battery alerts | +| openamrobot-ui | E | README.md | (absent) | OPERATOR-PANEL, TABLET-MOUNT, UC1-54 | no operator panel stated on main | +| openamrobot-ui | E | README.md / STATE.md | (absent) | UI-GATE-A | no UI Gate A date on main | +| openamrobot-ui | E | web/src | (absent) | STATUS-VOCABULARY | no robot status / UI presentation states on main | +| openamrobot-ui | E | web/src/shared/constants/index.js | 60-64 | CAMERAS, UC1-55 | camera options "/camera/color/image_raw", "/rgb_image", "/camera/image_raw" only | +| openamrobot-ui | E | STATE.md | (missing on main) | process (AGENTS.md Decisions) | no STATE.md on main | +| openamrobot-comm | E | AGENTS.md, STATE.md | (missing) | process (shared rules: AGENTS.md copied into every repository; read STATE.md) | files absent on main | +| openamrobot-docs | E | docs/reference/openamrobot-2/hardware-architecture.md | 26 | SAFETY-PROCUREMENT, RESET-BUTTON, ESTOP-SCOPE, CHARGING, UC1-70, UC1-73 | safety-chain row names E-stops, K1/K2, precharge, DDR-240B-24 only | +| openamrobot-docs | D | docs/reference/openamrobot-2/hardware-architecture.md | 26 | (precharge, not in register) | "precharge fitted" | +| openamrobot-docs | D | docs/reference/openamrobot-2/hardware-architecture.md | 27 | IMU-TOPIC-OWNERSHIP | "filtered data by the host EKF on /imu/data" | +| openamrobot-docs | E | docs/reference/openamrobot-2/hardware-architecture.md | 19-34 | POWER-RAILS, MAIN-PROTECTION, CHARGING, UC1-53 | no power or charging row in the architecture table | +| openamrobot-docs | E | docs/reference/openamrobot-2/index.md | 49-56 | LIFT, UC1-14 | open inputs omit the lift release gates; "approved in principle" stated nowhere in docs/reference | +| openamrobot-docs | E | docs/reference/openamrobot-2/general-arrangement.md | 19-33 | LIFT | lift described as decided; "approved in principle" and holding-test gate missing | +| openamrobot-docs | D | docs/assets/roadmap/architecture.html | 186 | CHARGING, DOCK-NO-CONTACTS | "Wired only in 2.0; TZBOT in 3.0 (BOM Issue 7.14 Decisions sheet, charging row)" | +| openamrobot-docs | D | docs/assets/roadmap/hardware.html | 186 | CHARGING | "PWR-019 ... SB50 charge connector" (ID reused) | +| openamrobot-docs | D | docs/assets/roadmap/hardware.html | 175 | SHARED-BASE, BATTERY-PLACEMENT | release 001 "battery: own pack, voltage and chemistry to be decided"; Pi 5 vs Jetson as open differences | +| openamrobot-docs | D | docs/assets/roadmap/architecture.html | 186 | IMU-TOPIC-OWNERSHIP | "Firmware /imu/data_raw; host filter /imu/data" as design value | +| openamrobot-docs | D | docs/assets/roadmap/model/model.js | 184 | NEAR-FIELD-FRAMES | "TOF_X: .39" (model geometry) | +| openamrobot-docs | D | docs/assets/roadmap/robot.html | 349, 377 | NEAR-FIELD-FRAMES | "tof_front and tof_rear (±0.390, 0, -0.0066) ... (design, P-03 rev20.2)" | +| openamrobot-docs | E | docs/reference/openamr-platform-sw/concepts.md | 84-97 | UC1-47, DOCK-NO-CONTACTS | AprilTag dock four-phase approach only | +| openamrobot-docs | E | docs/foundations/safety/emergency-stop.md | 1-44 | SAFETY-PROCUREMENT, ESTOP-SCOPE, RESET-BUTTON, UC1-03, UC1-04, UC1-70, UC1-73 | framework stub only | +| openamrobot-docs | D | docs/reference/openamr-platform-fw/reference.md | 72-73 | IMU-TOPIC-OWNERSHIP | "the host Madgwick/EKF pipeline fuses them into the filtered `/imu/data`" | +| openamrobot-release | E | AGENTS.md, STATE.md | (missing on main) | process | absent | + diff --git a/STATE.md b/STATE.md index 1f6b990..3ca03ea 100644 --- a/STATE.md +++ b/STATE.md @@ -9,18 +9,19 @@ The PR evidence check fails when STATE.md exists and a PR neither updates it nor - Type and lifecycle: governance, active - Readiness: not recorded - Owner role: platform-lead (decisions.yaml); ci-owner (tools/, workflows) -- Verification: `bash rollout/verify.sh`, `python3 tools/check_decisions.py --decisions decisions.yaml --maintainers maintainers.yaml --validate-only`, `python3 tools/check_agent_rules.py --canonical agent-rules/SHARED_RULES.md --file AGENTS.md`; last PASS on main not recorded here (file added 2026-11-01; branch rebased on ed98001) +- Verification: `bash rollout/verify.sh`, `python3 tools/check_decisions.py --decisions decisions.yaml --maintainers maintainers.yaml --validate-only`, `python3 tools/check_agent_rules.py --canonical agent-rules/SHARED_RULES.md --file AGENTS.md`; last PASS on main 1678735 (2026-11-01): verify.sh 289 tests, 0 skipped; validate-only exit 0; agent rules PASS (v2) ## Register in force -- `in_force`: P-03-rev20.2, 2026-11-01 (change request #77); on main ed98001 (#73 merged) it is P-03-rev20.1, 2026-10-30 +- `in_force`: P-03-rev20.2, 2026-11-01 (change request #77), on main since 1678735 (#78 merged) - Canonical BOM: Issue 7.14 (BOM-ISSUE-IN-FORCE), from 2026-11-01 ## Current work | Work package | Branch or PR | Status | Next step | |---|---|---|---| -| #77 | #78 (claude/optimistic-sagan-oqc2lu) | draft, rebased on ed98001 | owner review of the P-03 rev20.2 item 26 values and the OPERATOR-PANEL portrait change | +| #77 | #78 | merged as 1678735 (2026-11-01) | none | +| Repository alignment audit (1 Nov 2026) | audit/2026-11-01, AUDIT-2026-11-01.md | draft | owner decisions on the class C, D and E findings; fix PRs per repository linked in the report | | P-03 rev20.1 | #73 | merged as ed98001 (2026-11-01) | none; its OPERATOR-PANEL portrait check is narrowed in #78 | | PLATFORM-PIN | #74 | open, not merged (2026-11-01) | touches decisions.yaml; rebase after whichever merges first | @@ -36,4 +37,4 @@ This repository holds the register (decisions.yaml) and its checkers; it impleme ## Not verified - Register values against the P-03 rev20.2 source document (held outside any repository), since 2026-11-01 -- Scans of consumer repositories against the new patterns, since 2026-11-01 +- BOM Issue 7.14 content against the register (the 2026-11-01 audit read only its metadata)