Handoff — commit & push everything in battlebox's WSL before the rebuild

2026-07-30 13:05 JST · for the next agent session · machine: battlebox, WSL Ubuntu 20.04, user ai, repos under /home/ai/dev

Summary

Continuation target: get every piece of real work in /home/ai/dev on battlebox's WSL safely committed and pushed to its Bitbucket remote, so the distro can be deleted without losing anything.

This is the blocking prerequisite for the WSL rebuild described in the disk/rebuild handoff. That page covers the C: cleanup and the Ubuntu 26.04 install on D: — don't duplicate it here. 14 repos need attention, and two categories of work (15 unpushed commits and 36 stashes) exist only inside the VHDX being destroyed.

Bitbucket SSH auth from the box is confirmed working — ssh -T git@bitbucket.org returns "authenticated via ssh key". Keys are ~/.ssh/id_ed25519 and ~/.ssh/id_ed25519_bitbucket_battlebox.

Critical find — do this one first

Data loss 3dai.iolabs.pointcloud.tablecloth has no real remote. Its origin is /home/ai/tablecloth.bundle — a 97 KB file inside the very home directory that the rebuild deletes, last written 2026-07-17 01:05.

It has 9 unpushed commits (the whole AI3D-345 slope-handling line: implementation plan, cross-slope / crowned-road / embankment fixtures, elev_scalar slope-scaled SMRF gate, csf_slope_smooth, smrf_edge_pad_enabled boundary padding, acceptance + parity tests, precision QA). Running git push writes to the bundle in the same doomed filesystem and saves nothing.

A real Bitbucket remote must be added and the branch pushed. Confirm the target repo URL with Miro — there may or may not be an existing 3dai.iolabs.pointcloud.tablecloth on bitbucket.org/ioholding. Note the sibling ~/dev/3dai.iolabs.pointcloud.tablecloth.bundle is also a file, not a directory.

Step 0 — cheap safety net before touching anything

Copy every .git directory out of the VHDX to the D: drive first. This is full-fidelity — it preserves reflogs and all stash entries, which a git push does not — and it is small, since the working trees (the bulk of the 129 GB) stay behind.

mkdir -p /mnt/d/wsl-rescue
cd ~/dev
for d in */; do
  [ -d "${d}.git" ] || continue
  rsync -a --info=progress2 "${d}.git" "/mnt/d/wsl-rescue/${d%/}/"
done
du -sh /mnt/d/wsl-rescue

Do not rely on git bundle --all for the stashes. Multiple stash entries live in the reflog of refs/stash, not as separate refs — bundling refs/stash captures only the most recent one. Copying .git wholesale is the only simple way to keep all 36.

Also note this copy is only a stopgap. /mnt/d/wsl-rescue survives the distro deletion, but it is not a substitute for pushing to Bitbucket — finish the pushes.

What's at risk, by tier

Not all 14 repos matter equally. Sorted by what is actually lost if the distro is deleted right now:

TierReposWhat's lost
1 tablecloth, asphaltedge, linebitmapimagerasterizer 15 unpushed commits of finished, committed work. tablecloth's 9 are unrecoverable-by-push (see above).
2 guardrails, visualizationoverlays, trajectoryfilter 37 modified tracked files + 5 new test files of uncommitted source. Real work, never committed.
3 lanefinder, rasterizer, windowchecker, pdfpropertyai 36 stashes (33 in lanefinder alone, back to 2024-10-24). Never travel with a push.
4 pytorchinstancesegmentation, 3dsegmentation, orchestrator, guardrails-seg3d, + untracked in the above Mostly build output and generated fixtures — gitignore or discard. One possible exception flagged below.

Per-repo detail

Tier 1 Unpushed commits

RepoBranchCommitsRemote
3dai.iolabs.pointcloud.tablecloth main 9 — AI3D-345 slope handling, tip 66a8c9f (merge of ai3d-345-slope-handling PR #1) bundle file
3dai.iolabs.pointcloud.asphaltedge feature/zrange-evidence-channel 5 — AI3D-337 experiments e1_texture, e2_changepoint, e3_dp_path, e4_segmentation, e5_gutter bitbucket ✓
3dai.iolabs.imageanalyzer.linebitmapimagerasterizer master 1e33dcc1 AI3D-226 scripts/infer_interim.py full-tile U-Net overlay generator bitbucket ✓

The last one also has a deleted data/03_raw/.gitkeep and two untracked output dirs (data/04_raw/, data/interim_overlays) — decide whether the .gitkeep deletion is intentional before committing.

Tier 2 Uncommitted source

3dai.iolabs.pointcloud.guardrails — 20 modified + 4 new tests, on main

Last commit b4a2742 2026-07-16 (merge of refactor/shared-code-extraction PR #1). Work is sitting directly on main — consider a feature branch before committing.

Modified (14 source): guardrails/colors.py, config.py, corridor.py, dedupe.py, detect.py, export.py, features.py, geometry.py, guardrails.default.json, overlay_topdown.py, perspective.py, perspective_overlay.py, raster.py, render_perspective.py

Modified (6 tests): tests/test_classify_export.py, test_colors.py, test_config.py, test_geometry.py, test_perspective.py, test_render.py

New tests to add: tests/test_alignment.py, tests/test_detect_wall_integration.py, tests/test_overlay_extent.py, tests/test_wall_geometry.py

Discard / ignore: out_full/, out_masks/, out_qc/, probe.py (check probe.py — may be a scratch script worth keeping)

3dai.iolabs.pointcloud.visualizationoverlays — 11 modified + 1 new test, on master

Last commit cab1a15 2026-06-13 AI3D-261 Release v0.2.0. Both pyproject.toml and uv.lock are modified — this looks like an unreleased version bump; check whether a release/tag was intended.

README.md, pyproject.toml, uv.lock, src/iolabs_point_cloud_visualization_overlays/collage.py, collage_cli.py, raster_tile.py, renderer.py, xml_topdown_overlay.default.json; tests/test_collage.py, test_raster_tile.py, test_renderer.py. New: tests/test_config.py.

3dai.iolabs.pointcloud.trajectoryfilter — 6 modified, on master

Last commit c22da77 2026-05-18 AI3D-303 multi-branch trajectory filter selection — so this uncommitted work is ~2.5 months old and may be stale. Check with Miro before assuming it's wanted.

src/iolabs_point_cloud_trajectory_filter/_config.py, trajectory_filter.default.json, trajectory_filter.py; tests/test_config_validation.py, test_integration.py, test_multi_branch_selection.py. No untracked files — clean, self-contained change.

Tier 4 Junk, ignore-candidates, and one to check

RepoUntrackedCall
pytorchinstancesegmentation60 files — test/placer_images/*.json + *.png pairs (footer0–4, header0–…)Generated fixtures. Repo dead since 2023-03-24. Gitignore or discard.
3dai.iolabs.orchestratorpipelines/helpers/abschnitt_4_5_render_perspective.yamlCheck A pipeline definition, not output — plausibly real work. Branch ai3d-two-stage-step7.
3dai.iolabs.pointcloud.3dsegmentation.claude/Agent config. Gitignore.
3dai.iolabs.pointcloud.guardrails-seg3dout_masks/Output. Discard. Note: same remote as guardrails — this is a second clone on feat/AI3D-344-point-masks.
pdfpropertyaidata, models/desktop.ini, notebooks/*.ckpt, notebooks/lightning_logs/All output. Repo dead since 2023-05-26.
windowchecker.is_checkpoint, checkpoint, data_links/, MeshNetProbs.npz, meshnet_confusion.png, src/data/external/obj.pyMostly output, but src/data/external/obj.py is source — check it. Also 2 modified: IFC_classes.json, src/models/meshnet.py. Repo dead since 2024-06-03.
3dai.lanefinderscripts/jobs/run_from_step5_abschnitt_4_5.sh; modified .gitignore, uv.lockThe job script is plausibly worth keeping.

Stashes — 36 across 4 repos

Stashes are not carried by git push and are not reachable from any branch. They die with the distro. Each one needs an explicit decision: promote or drop.

To promote one: git stash branch <name> 'stash@{n}' checks out its parent commit, applies it, and drops the stash — then commit and push the branch.

RepoCountSpanNote
3dai.lanefinder332024-10-24 → 2026-05-20Nearly all WIP on master auto-stashes across AI3D-99 … AI3D-285. The newest is deliberate: "pre-merge backup 2026-05-20 (limit_planes branch)". There's also one "CPU-step6 stash before switching to master" (2026-04-08).
3dai.iolabs.imageanalyzer.rasterizer12026-07-17Most likely live WIP on zrange-extra-channels off 65b9308 AI3D-337. Repo is otherwise clean — this stash is the working state.
windowchecker12024-01-19AI-98 better library import / extra IFC handling.
pdfpropertyai12023-05-26AI-77 trained siamese network.

Pragmatic suggestion for lanefinder: 33 stashes going back to 2024 is not worth triaging one by one. The .git copy from Step 0 preserves all of them. Propose to Miro: promote the two named/deliberate ones, keep the rest only in the /mnt/d/wsl-rescue archive, and move on.

Work order

  1. Step 0 safety net — rsync all .git dirs to /mnt/d/wsl-rescue. Verify with du -sh.
  2. tablecloth — confirm the Bitbucket URL with Miro, git remote set-url origin, push main. Nothing else proceeds until these 9 commits are on a real server.
  3. asphaltedge (5) and linebitmapimagerasterizer (1) — straight git push, remotes are fine.
  4. guardrails, visualizationoverlays, trajectoryfilter — review each diff with Miro, commit under the right AI3D- ticket, push. Prefer a feature branch for guardrails rather than committing straight to main.
  5. rasterizer stash — promote; it's current work.
  6. lanefinder — promote the two deliberate stashes; commit the job script and .gitignore/uv.lock changes; leave the other 31 in the archive.
  7. orchestrator yaml and windowchecker obj.py — inspect, then commit or discard.
  8. Dead repospytorchinstancesegmentation (2023), pdfpropertyai (2023), windowchecker (2024): confirm with Miro they're archive-only, then discard the untracked output.
  9. Final gate: re-run the audit script (below) and confirm every repo reports zero unpushed commits and zero unexplained dirt. Only then is the rebuild safe to start.
Audit script — re-run this to verify (returns nothing when clean)
cd ~/dev
for d in */; do
  d=${d%/}; [ -d "$d/.git" ] || continue
  st=$(git -C "$d" status --porcelain 2>/dev/null)
  un=$(git -C "$d" log --branches --not --remotes --oneline 2>/dev/null)
  stash=$(git -C "$d" stash list 2>/dev/null | wc -l)
  [ -z "$st" ] && [ -z "$un" ] && [ "$stash" = "0" ] && continue
  echo "$d: $(echo "$st" | grep -c .) dirty, $(echo "$un" | grep -c .) unpushed, $stash stashes"
done

Notes for the next session

Nothing here is urgent-destructive. The old distro is untouched and stays on C: as a live fallback — the rebuild plan installs the new Ubuntu 26.04 alongside it on D:. So take the time to review diffs properly with Miro rather than bulk-committing.

Conventions observed in these repos

Environment gotchas

Suggested skills

Open questions for Miro

  1. tablecloth: does a Bitbucket repo exist for it, or does one need creating? What is the URL?
  2. Tier 2: should guardrails / visualizationoverlays / trajectoryfilter go via Bitbucket PRs or direct pushes? And is the ~2.5-month-old trajectoryfilter change still wanted?
  3. visualizationoverlays: the pyproject.toml + uv.lock change looks like an unreleased version bump after v0.2.0 — intended as a release?
  4. lanefinder: confirm it's acceptable to keep 31 of the 33 stashes only in the /mnt/d/wsl-rescue archive.
  5. Dead repos: confirm pytorchinstancesegmentation, pdfpropertyai and windowchecker are archive-only and their untracked output can go.