Living with it · Chapter 31 · Time: 1 hour to read; the 24-hour run takes two days with preparation · Level: Intermediate · Status: Reconstructed, not test-built
Where milestones M1-M4 stand, a concrete procedure for the 24-hour unattended run that has never been attempted, the open problems area by area, every place the docs and the machines disagreed on 2026-10-07, the leftovers to clean up, the vendor credential to remove, and the missing work light.
This chapter is the list of what the rebuild did not finish, as of 2026-10-07. Read it before you plan the next
weekend or spend money. The hardest open item, the 24-hour unattended run, is blocked by the charger and by missing
definitions before it is blocked by software. Nothing in this chapter has been run on the robot in the form given here:
the 24-hour procedure, the cleanup commands and the credential removal are proposals built from the record.
docs/PLAN.md has five milestones; each must pass before the next starts, and "pass" means Matt sees it and the logs
agree.
| Milestone | Pass line (PLAN.md) | Status on 2026-10-07 | Evidence |
|---|---|---|---|
| M0 Clean baseline | every stop path stops the wheels at once | passed 2026-10-02 | stand 12/12, then 14/14 after the driver changes; floor 14/14 (docs/motion_safety.md) |
| M1 Drive the room without touching anything | 10 min of self-exploration, zero contacts, it finishes and goes home | not passed | see below |
| M2 Find Matt | from anywhere in the room it finds him and comes to about 1 m facing him, 5 of 5 | never tested | the head finds and follows him, but holds him for a median of 2-4 s before losing him (whole_project_review.md finding 6); a "come here" task exists (rosorin-task@come), never scored |
| M3 Light his work | light on, it finds his hands or work and keeps it lit for 10 min, no fidgeting | blocked | no light the robot can switch off (chapter 30); the detector reported a hand in 1 of 14 frames where one was visible (finding 24); the camera tops out at about 0.46 m, below a desk top |
| M4 Independent | powers up, runs all day, recovers itself, trains nightly; 24 h with no help | never attempted | next section |
M1 in detail, from docs/status.md:
AGENTS.md rule 8 sets the bar for the whole project: it runs 24 hours with no help from the owner or Claude. It has
been the next step of stage 1 since 2026-10-01 and has never been attempted.
docs/research/power_and_charging_reference.md).ARM_OPTIONAL = (10,) keeps the rest of theNot test-built
Nobody has run this procedure. It uses the logs the robot already writes and commands the record used. The
definition of help below is a proposal: the owner rules on it, and on power, before the run starts.
Before the run
readback.sh. Every line must be good (chapter 29). ~/selfcare/DISABLED must not exist, so self-care acts.On your laptop:
mkdir -p ~/rosorin-24h && cd ~/rosorin-24h
date -u +%FT%TZ > start.txt
ssh rosorin-wifi 'journalctl --list-boots --no-pager | tail -1; for u in rosorin-base rosorin-nav rosorin-mind rosorin-camera rosorin-vslam rosorin-api rosorin-contact; do echo "$u restarts $(systemctl show -p NRestarts --value $u)"; done; wc -l ~/selfcare/data/actions.jsonl' >> start.txt
ssh bigbuddy 'bash -s' <<'EOF' >> start.txt
for u in buddy-voice robot-mic; do echo "$u restarts $(systemctl --user show -p NRestarts --value $u)"; done
EOF
bash ~/CCode/rosorin-pro/scripts/ops/readback.sh >> start.txt 2>&1
cat start.txt
The boot line gives the boot ID; if it is the same at the end, the robot never rebooted. NRestarts counts how often
systemd restarted each service; the difference between start and end is what the robot recovered by itself. On
2026-10-07 actions.jsonl held 4 lines, all from the self-care fault tests of 2026-10-05: every new line during the run
is a repair self-care made.
~/rosorin-24h/help.log and keep it open. Every intervention gets one line at the moment it happens: UTCDuring the run: what counts as help (proposal)
| Help: write it in help.log; the run does not pass | Not help |
|---|---|
Any command typed on the robot or bigbuddy that changes something: a restart, a stop, deploy.sh, an edit, audio_levels.sh, buddy_ears.sh |
readback.sh and reading logs; note each read-back in help.log as "read only" |
| A reboot or power cycle done by a person | A restart or reboot the robot does by itself and recovers from (it shows in the end-of-run numbers) |
| Re-plugging the array or any other USB device | Talking to Buddy the way you would on any day |
| Moving the robot, freeing it, pressing the gamepad e-stop | |
| A Claude session that acts on the robot or bigbuddy | A Claude session that only reads |
| Plugging in the charger, unless the power ruling says otherwise |
Read back three times at most: at the start, at about 12 hours, at the end. readback.sh starts DDS participants on
the robot, and a new participant is a suspected (unproven) trigger of the navigation fault (chapter 29).
After the run: read it back
Replace 2026-10-08 18:00 with your start time (UTC) and the two day folders with the run's days:
On the robot:
journalctl --list-boots --no-pager | tail -3
for u in rosorin-base rosorin-nav rosorin-mind rosorin-camera rosorin-vslam rosorin-api rosorin-contact; do echo "$u restarts $(systemctl show -p NRestarts --value $u)"; done
systemctl --failed --no-legend
wc -l ~/selfcare/data/actions.jsonl; tail -5 ~/selfcare/data/actions.jsonl | cut -c1-160
journalctl -k --since "2026-10-08 18:00" --no-pager -o cat | grep -c "SER catches"
journalctl -u rosorin-nav --since "2026-10-08 18:00" --no-pager -o cat | grep nav_supervisor | grep -c " -> "
cat ~/vision/mind/20261008/events.jsonl ~/vision/mind/20261009/events.jsonl | grep -o '"event": "[a-z_]*"' | sort | uniq -c | sort -rn | head -15
cut -d, -f2 ~/battery/20261008.csv ~/battery/20261009.csv | sort -n | head -1
What each line tells you: whether it rebooted; how many times each service was restarted; anything left failed;
what self-care repaired; how many Wi-Fi firmware resets happened; how many state changes the navigation supervisor
made (a -> line is one transition, such as ready -> localizing); what the mind did (counts of thought,
found, lost, arm_refused, camera_silent and the rest); and the lowest battery reading in mV (the battery file's
columns are Unix time, mV, wheels enabled, arm enabled; a reading taken with the wheels enabled sags under load). On
bigbuddy, compare the NRestarts of buddy-voice and robot-mic with start.txt, and read Buddy's journal for the
window.
Pass, as proposed: help.log holds no line except read-backs, all seven robot services and both bigbuddy services
are active at the end, the boot ID is unchanged or every reboot recovered by itself, and the owner saw it working during
the day. Report alongside: how long it actually ran, how many self-repairs it made, and what share of the 24 hours it
spent awake (mode events) versus asleep. That last number plays the role of the "autonomy percentage" used by the
STRANDS robots, which ran for weeks: a long run means little if the robot does nothing
(docs/research/long_term_autonomy_reference.md).
Base system and backups
docs/restore.md)./dev/ttyACM0 with no udev name, and the driver has no reopen logic; what happensNetwork
config/fastdds_shm.xml (a 32 MB shared-memory segment and a longer port health check) was tested on an isolatedNavigation and driving
footprint_padding). Needs the owner.docs/motion_safety.md)./odom_vslam is not an EKF input.Arm
/look still aims with the wrist model from before 2026-10-05. Whether it aims correctly now isPerception and the mind
identify, which does nothing; it is still on the menu in vision/think.py. Replayed with it~/vision/questions.jsonl go nowhere (finding 9).Self-care
Voice and audio
Learning
On 2026-10-07 read-only inventories of the robot and bigbuddy were compared with the repo's docs. Where they disagree,
this guide teaches what is live. None of these has been fixed yet. Fixing the docs is part of the project's own rule 11:
keep the record short and true.
| Topic | The docs say | Live | Record of the change |
|---|---|---|---|
| Buddy's microphone | the echo-cancelled buddy_aec_source (code default) |
robot_mic, from the drop-in 60-mic.conf (BUDDY_MIC=robot_mic); the echo-cancel chain still runs, nothing reads it |
command log 2026-10-07 01:29 UTC: "Point Buddy's microphone at the robot's array output directly with no boost"; no commit, no doc |
| Wake threshold | 0.4 from 20-wake.conf (runbook, hardware.md) |
0.5, the code default; 20-wake.conf is in ~/voice/reverted-20261006/ |
commit 448b466, "Audio reverted to the ears-and-mouth milestone (owner)" |
| Autologin | "bigbuddy has no autologin" (voice/README.md) | on: /etc/plasmalogin.conf has [Autologin] User=burgerbarn, file dated 2026-07-31; the journal shows an autologin session at the 2026-10-04 boot |
none |
| Face screen at login | buddy-face-screen disabled at 15:04 on 2026-10-01 (lessons.md) |
enabled; its link is dated 2026-10-01 15:13 | none |
| face_server bind | 127.0.0.1 (repo voice/face_server.py) |
0.0.0.0 through BUDDY_FACE_HOST, a live edit of 2026-10-06 so the robot's touchscreen could show the face; backup face_server.py.bak-20261006 |
not in the repo |
| Mic gain | robot_mic +12 dB (hardware.md, lessons.md) |
robot_mic 0 dB, buddy_aec_source +12 dB from run_buddy_voice.sh; nothing stores a robot_mic gain, so a PipeWire restart resets it |
command log 2026-10-07 01:06 and 01:29 UTC |
Smaller ones on bigbuddy: run_buddy_voice.sh line 9 says "0 dB" and line 10 sets 12 dB; media/README.md still
describes a Firefox kiosk on HDMI; the buddy-voice.service description still says "Kokoro on HDMI"; the WirePlumber
rule 51-hdmi-no-suspend.conf matches an HDMI sink that no longer exists; docs/hardware.md still lists the Komplete
Audio 6; the live jukebox page lacks the repo's album command.
| Item | Repo | Live |
|---|---|---|
| Units with no install script | systemd/rosorin-vslam.service, -contact, -practice, -face, -cam .service |
installed by hand (cp or tee, then systemctl enable): vslam and contact enabled, practice static, face and cam disabled |
| API stop timeout | not in the repo | /etc/systemd/system/rosorin-api.service.d/10-fast-stop.conf, TimeoutStopSec=5 (2026-10-06 17:10) |
| The face program | robot_face/face_fb.py is newer (adds the mic display) and has uncommitted changes; an untracked buddy_link/face_fb.py also exists |
~/face/face_fb.py, older. Which copy is canonical is not recorded. rosorin-face is disabled (light mode) |
| Isaac ROS install script | scripts/install_isaac_ros.sh installs occupancy-grid-localizer and pointcloud-utils |
~/setup/install_isaac_ros.sh and its rollback are older, without them; the packages themselves were installed on 2026-10-02 |
| rf2o laser odometry | not in the repo | ~/ext_ws, MAPIRlab/rf2o_laser_odometry branch ros2 at b38c68e; rosorin-base needs it |
| Nav2 and web_video_server | no install script | installed with apt on 2026-09-28 and 09-29 |
| explore_lite | no script, no commit | m-explore-ros2 at 326cf8a, with a hand-made map_merge/COLCON_IGNORE |
| reSpeaker tools | described in docs only | ~/tools clone at 4b49bfd and the xvfenv venv |
| The kept map's pose graph | maps/ holds the image, keepout and home pose only |
~/maps/room_20260928.posegraph and .data; install_live_map.sh needs them |
| Mic gain at API start | hardware.md: "mic gain 135 set by the robot API at every start" | robot_api.py (the milestone version since commit 448b466) has no mic-gain code; only audio_levels.sh sets 135 |
| Extra software | none | mesa-utils (a kiosk test), py-spy 0.4.2 in the vision venv, ~/voice/venv with openWakeWord used by no unit |
~/setup |
copy not scripted | copied file by file; 29 files missing or older (chapter 29) |
docs/runbook.md expects "array card 1" and wake threshold 0.4: live is card 2 and 0.5 (chapter 29).docs/navigation.md lists 0.15 m/s and 0.6 rad/s; nav2.yaml runs 0.35 m/s. docs/motion_safety.md rule 5 saysdocs/decisions.md (2026-10-01) and docs/status.md mention a "wheel lock in board_driver"; no such code exists.docs/status.md (2026-10-05) says a pose is accepted at fit 0.75; the code uses 0.65 plus a 0.10 marginarm_poses.yaml "default" and the SRDF rest state are the fold pose, not the current rest pose.On 2026-10-06 the robot briefly showed Buddy's face through an X kiosk. The decision of 2026-10-07 ("light mode",
headless) removed most of it; these pieces remain (read on the robot on 2026-10-07):
| Leftover | What it is |
|---|---|
~/.bash_profile |
starts xinit ~/setup/face_kiosk.sh on tty7; that script no longer exists. While this file exists, bash login shells skip ~/.profile |
/etc/systemd/system/getty@tty7.service.d/ |
empty directory; the autologin file in it was removed on 2026-10-06 21:31 |
/etc/apparmor.d/local/usr.bin.surf |
empty file, a leftover of the surf browser |
surf |
removed, but its configuration is left (dpkg state rc) |
mesa-utils |
installed for the kiosk test, still installed |
~/.config/face-kiosk, ~/.config/org.gnome.Epiphany.WebApp-buddyface, ~/.surf, ~/.face_kiosk.log |
browser and kiosk state |
~/setup/face_kiosk.sh.unused-20261007 |
the parked kiosk script |
~/setup/webtest/ (one file, t.html) is also robot-only; the record does not say what it was for. Read it before you
decide.
Not test-built
These cleanup commands have not been run on this robot.
Keep a copy first, in ~/retired, the folder deploy.sh creates for each day:
On the robot:
mkdir -p ~/retired/20261007
tar czf ~/retired/20261007/kiosk-leftovers.tgz -C ~ .bash_profile .config/face-kiosk .config/org.gnome.Epiphany.WebApp-buddyface .surf .face_kiosk.log setup/face_kiosk.sh.unused-20261007
tar tzf ~/retired/20261007/kiosk-leftovers.tgz | head
Then remove the home-folder pieces, the empty drop-in directory and the two packages:
On the robot:
rm -r ~/.bash_profile ~/.config/face-kiosk ~/.config/org.gnome.Epiphany.WebApp-buddyface ~/.surf ~/.face_kiosk.log ~/setup/face_kiosk.sh.unused-20261007
sudo rmdir /etc/systemd/system/getty@tty7.service.d
sudo systemctl daemon-reload
sudo apt-get purge -y surf
sudo rm -f /etc/apparmor.d/local/usr.bin.surf
sudo apt-get remove -y mesa-utils
Safety
Never runapt autoremoveon the robot, even when apt suggests it after these removals: it offers to remove
initramfs-tools, which the Jetson needs to boot (chapter 1).
Check what is left:
On the robot:
ls -a ~ | grep -E "bash_profile|surf|face_kiosk"
ls /etc/systemd/system | grep getty@tty7
dpkg -l surf mesa-utils 2>/dev/null | grep -E "^(ii|rc)"
Check
All three commands print nothing. Then runreadback.shfrom the Mac: nothing it reads depends on these files, so
it must look exactly as before.
If it fails
tar: ...: Cannot stat: No such file or directory: that leftover is already gone. Take its name out of both the
tarand thermline and run them again.rmdir: failed to remove ...: Directory not empty: something was put into the tty7 drop-in directory after
2026-10-07. Read it before you remove anything.
The Aurora 930 driver in ~/vendor_ws/src/deptrum-ros-driver-aurora930-0.2.11 was copied from the factory partition,
including its .git folder. Its remote origin points at the vendor's internal GitLab with a CI credential written
into the URL. On 2026-10-07 the only file on the robot holding it was that folder's .git/config. Nothing uses the
remote: install_aurora930.sh copies the folder with cp -a and never fetches.
Never print it
Do not rungit remote -v,git config -lorcat .git/configin that folder: each prints the credential to your
terminal, and from there into logs and scrollback. The commands below only count it.
Check that it is there (prints a count and the remote's name, not the URL):
On the robot:
D=~/vendor_ws/src/deptrum-ros-driver-aurora930-0.2.11
grep -c gitlab-ci-token $D/.git/config
git -C $D remote
Check
On 2026-10-07:1andorigin.
Remove the remote. Chapter 15 does the same at install time with git remote set-url; on the current robot it has not
been done. There is no public URL to point it at, so removing it is the cleaner choice:
On the robot:
git -C $D remote remove origin
grep -c gitlab-ci-token $D/.git/config
Check
0. (grep -cexits with status 1 when it counts nothing; that is expected here.)
If it fails
grep: .../.git/config: No such file or directory: the driver folder has another name on your robot. Find it with
ls ~/vendor_ws/src/and setDto it.
Not test-built
Not done on this robot. Removing it from the live folder does not remove it from the copies: the three golden sets
made since 2026-09-28 (on the robot in~/goldenand on bigbuddy in~/rosorin-golden) contain the same
.git/configinside their root-file-system archives, and the factory partition (APP_old,nvme0n1p1) still
holds the original. The record has no plan for those copies.
The objective is "the robot finds Matt and lights up what he is working on". There is no light that serves it:
PLAN.md's rule: one milestone at a time, nothing added that the current milestone does not need. The current milestone
is M1: a 10-minute exploration on the floor with zero contacts that ends at home. The record's own review
(docs/research/whole_project_review.md, section 6) lists what follows, each as something the robot learns or decides:
The review ends with "Order is the owner's." So does this guide.
grep -c gitlab-ci-token on the vendor folder's .git/config prints 0, or you know why it still prints 1.Where this comes from
docs/PLAN.md(milestones, rules);AGENTS.mdrules 8, 10, 11;docs/status.md(2026-10-02 to 2026-10-07: floor
runs, deaf transform, self-care, array #2, light);docs/decisions.md2026-10-01 (stages) and 2026-10-07 (headless,
kiosk removal);docs/lessons.md(clock, claw, array re-plug, autoremove, work light);docs/motion_safety.md;
docs/restore.md;docs/research/whole_project_review.md(findings 1-43, sections 5-6),
power_and_charging_reference.md,long_term_autonomy_reference.md;scripts/install_aurora930.sh;
selfcare/playbook.py(actions.jsonl);ros2/rosorin_base/rosorin_base/board_driver.py(battery CSV columns);
commits 448b466, bfb61d8. Surveys: survey_live_robot.md (units, drop-ins, kiosk leftovers, vendor remote, source
builds), survey_bigbuddy.md (six contradictions, stale docs), survey_software.md sections 4-5, survey_rosstack.md
section 7, survey_base.md section 4. Command log: cmdlog_bigbuddy.md 2026-10-07 01:06 and 01:29 UTC. Read-only
lookups on the robot on 2026-10-07: kiosk files, unit drop-ins,actions.jsonl, the count of the credential in
the vendor folder (never its value).