Handoff — commit & push everything in battlebox's WSL before the rebuild
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:
| Tier | Repos | What'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
| Repo | Branch | Commits | Remote |
|---|---|---|---|
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 |
1 — e33dcc1 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
| Repo | Untracked | Call |
|---|---|---|
pytorchinstancesegmentation | 60 files — test/placer_images/*.json + *.png pairs (footer0–4, header0–…) | Generated fixtures. Repo dead since 2023-03-24. Gitignore or discard. |
3dai.iolabs.orchestrator | pipelines/helpers/abschnitt_4_5_render_perspective.yaml | Check 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-seg3d | out_masks/ | Output. Discard. Note: same remote as guardrails — this is a second clone on feat/AI3D-344-point-masks. |
pdfpropertyai | data, 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.py | Mostly 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.lanefinder | scripts/jobs/run_from_step5_abschnitt_4_5.sh; modified .gitignore, uv.lock | The 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.
| Repo | Count | Span | Note |
|---|---|---|---|
3dai.lanefinder | 33 | 2024-10-24 → 2026-05-20 | Nearly 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.rasterizer | 1 | 2026-07-17 | Most likely live WIP on zrange-extra-channels off 65b9308 AI3D-337. Repo is otherwise clean — this stash is the working state. |
windowchecker | 1 | 2024-01-19 | AI-98 better library import / extra IFC handling. |
pdfpropertyai | 1 | 2023-05-26 | AI-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
- Step 0 safety net — rsync all
.gitdirs to/mnt/d/wsl-rescue. Verify withdu -sh. - tablecloth — confirm the Bitbucket URL with Miro,
git remote set-url origin, pushmain. Nothing else proceeds until these 9 commits are on a real server. - asphaltedge (5) and linebitmapimagerasterizer (1) — straight
git push, remotes are fine. - 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. - rasterizer stash — promote; it's current work.
- lanefinder — promote the two deliberate stashes; commit the job script and
.gitignore/uv.lockchanges; leave the other 31 in the archive. - orchestrator yaml and windowchecker
obj.py— inspect, then commit or discard. - Dead repos —
pytorchinstancesegmentation(2023),pdfpropertyai(2023),windowchecker(2024): confirm with Miro they're archive-only, then discard the untracked output. - 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
- Commit subjects are
AI3D-<n>: <summary>orAI3D-<n> <summary>(both forms appear); older repos useAI-<n>. - Default branch is inconsistent —
masterin some repos,mainin others, feature branches in the rest. Check per repo; don't assume. - All real remotes are
git@bitbucket.org:ioholding/<repo>.git. - Merges arrive via Bitbucket PRs ("Merged in … (pull request #N)") — so a PR may be the expected route for the Tier 2 work rather than a direct push.
Environment gotchas
- Over
ssh battlebox "bash -s", never usesudo— the password prompt hangs the session to timeout. None of the work here needs it. - Long
git pushoperations over the Czech VPN can drop. Consider running on-box instead; the rebuild handoff compares the runner options (codex-bb, thecursor-agentalready installed in this WSL, or ssh from Battlebook). /mnt/dis mounted and writable from WSL — confirmed 3.7 TB, ~744 GB free.- The
~/devworking trees total 129 GB;linebitmapimagerasterizeralone is 63 GB andlanefinder21 GB. Don't try to copy working trees wholesale.
Suggested skills
battlebox-ssh— required if driving remotely.codex-bb-runtimeorcursor-cli-runtime— if running on battlebox itself.
Open questions for Miro
- tablecloth: does a Bitbucket repo exist for it, or does one need creating? What is the URL?
- Tier 2: should guardrails / visualizationoverlays / trajectoryfilter go via Bitbucket PRs or direct pushes? And is the ~2.5-month-old trajectoryfilter change still wanted?
- visualizationoverlays: the
pyproject.toml+uv.lockchange looks like an unreleased version bump after v0.2.0 — intended as a release? - lanefinder: confirm it's acceptable to keep 31 of the 33 stashes only in the
/mnt/d/wsl-rescuearchive. - Dead repos: confirm
pytorchinstancesegmentation,pdfpropertyaiandwindowcheckerare archive-only and their untracked output can go.