Handover 2026-10-03 — the facett release lane hands over to the "claude" session
nornir:class=design · written by the facett release lane (Claude session working in ~/runs/facett-0929 inside dwarf's claude container) at the owner's order: the two sessions merge into one; the tmux session claude continues alone. No agent of the facett lane is running.
0. Read first
- THE LAW:
~/git/workspace_nordisk/nornir-workspace.tomllines 1-90 (read only; never write in the law segment). - This file, then
.nornir/handover-2026-09-29-oden-end.md(the running "Not done" list, lanes D-M, Y, C2, step a, p021),.nornir/facett-benchmarks.md,.nornir/pypi-publish.md,.nornir/xtask-thin-door-audit.md. - Plan rows in
workspace_nordisk/nornir-workspace.tomlunder[repos.facett](2026-09-29 … 10-03),[repos.knut],[repos.korp],[repos.dwarves], rowknut-ui-out.
1. Where things stand (verified with git ls-remote / the live sites when written)
| what | state |
| facett main | 101030e — workspace version 0.2.0, license MIT, LICENSE + NOTICE in root and all 73 crates, ownership line "Copyright (c) 2026 Ignalina ApS (Rickard Ernst Björn Lundin)", PyPI name gate with the ownership-line exemption, PYPI_VERSION 0.2.1 |
| knut main | f51b296 — facett-pipeline >=0.1.19, <0.3, facett-pop >=0.1.9, <0.3 |
| dwarves main | 3aa037c (lock: dwarves-runa 0.2.4) — then possibly moved by the unexplained push (see §6) |
| edda main | b8d49b8 (lock fix) — MOVED to becde09 by the unexplained push 12:18-12:25 UTC |
| korp main | ecfe7f8 (proto comment without personal name) — MOVED to 89942c5 by the unexplained push |
| PyPI | facett + facett-demo 0.2.0 (2026-10-02, MIT OR Apache-2.0) and 0.2.1 (2026-10-03, MIT; sha256 wheel f4c5602d…, demo wheel a5d665f5…, sdist c9655ed0…, built from 101030e). Release files: dwarf ~/runs/facett-0929/release-0.2.1b/, t14s ~/runs/laneY-publish-021/ |
| Pages (web demo) | https://nordisk.codeberg.page/facett/ serves ?v=620444e (pages branch 9c8aaf8, wasm sha256 069f6f97…). Rollback: git push --force origin 3ef70a7d1d6eadbdfd194c3fd9a66e9544b3623a:refs/heads/pages. NOT yet redeployed from 101030e (only license/name/docs changes since — redeploy when convenient: cargo ops deploy-pages from an LFS-smudged main checkout) |
| Streamlit demo | container draupnir-facet-wrapped-demo on dwarf, 127.0.0.1:8501, runs the INSTALLED 0.2.0 wheels bound read-only from ~/runs/facett-0929/laneY/facett/{pkg-facet-wrapped,py}/dist (keep that worktree or rebind). Restart: cargo ops streamlit in that worktree. A reverse ssh tunnel to the t14s localhost:8501 may be up (ssh -f -N -R 127.0.0.1:8501:127.0.0.1:8501 rickard@100.67.148.64). Upgrade it to 0.2.1 when convenient |
| crates.io | facett crates still 0.1.19 (2026-09-02). Publish of 0.2.0 ON HOLD — owner order: dependency bump merged → name scrub/squash → publish (owner's go, asked right before) |
| egui 0.36 | NOT on main. Kept upgrade = lane H2: facett lane-h2/egui-0.36 @ 6179ea7 (+ korp a5481cf, dwarves d42ee7e, nornir a4a9df7, holger 513844e, edda 715d537 on branches egui-0.36). The claude session's extras (facett egui-0.36-extras @ 660d5fd5 GpuVello→Wgpu rename, nornir 200af82, dwarves 17c3b2a, tunnr 7fec871, knut 025c127, ordning a7e9855) were going into deps-integration-2026-10-03 |
2. What was built in this lane (2026-09-29 … 10-03), all on main unless noted
- navgraph phase 1 + plain-egui harvest + live read-back; 0 undeclared atoms (198 → 0 of 210); phase 2 in facett-app scenes and korp (robot test
tests/robot_navgraph_panes.rs). - GPU graph lanes at 100k: GridLane GPU layout, resident GPU cloud (
cloud::ResidentSlot) in graphnav, DecoratedGraphView, graphpan, falkor, World coderoom (O(V+E) layout), graph (budgeted AccessKit), graphview; Universe tab up to 1M. All tabs ≈60 fps at 100k on t14s Radeon 890M and loki RTX 5080 (numbers in facett-benchmarks.md). - Demo: grouped tab bar (
FacetDeck::with_groups), size/generator control (facett-graphgencrate: community, sbm, random, scale-free, grid, tree, crates, population;?gen=<src>:<size>:<seed>#<tab>links). - Bundle groups core/docs/model3d/sim declared in
facett-build-thingcode, routingbundles.jsonemitted from the recipe; packagefacet-wrapped-group(facet-wrapped must never declare a cargo feature — evendocs = []changes the wasm). - xtask is a thin door with ONE dependency; non-build verbs in
facett-ops(cargo ops <verb>); container road (eddacontainer_road) — no host builds. Toolchain pinnordisk-cargo-toolchain@sha256:668468e775ad…(clang + llvm added). - Pages deploy through the container (
cargo ops deploy-pages, eddanornir_pages::publish_dist); "no GPU" message instead of black screen; SwiftShader/llvmpipe refused as "no GPU"; fail-soft GPU buffers (gpu_errorin state). - Fixes: ortho depth bug (plan view drew no ground), lineage 45 → 60 fps (state published rolling, not every tab every frame), graphview
find_cyclescapped (froze at 120 nodes), osm2d adapter preflight/retry, graphview test flake (gputurn::hold). - Python:
facett(importfacett,facett[streamlit], 51 components, 4 bundles, platform-independent wheel) andfacett-demo(commandfacett-demo,[korp]extra, offline banner without korp). Rust uploadercargo ops publish-pypi(--dry-run, token from env or~/.pypirc, never printed, hard name gate).
3. Open items, in the owner's order
- Finish the dependency integration (
deps-integration-2026-10-03), take facett main101030e; merge to mains only after the full test pass. Decide with the owner: fix forward vs force-restore the 10 repos moved by the unexplained push (the facett lane recommends fix forward — a force-push is irreversible for anyone who pulled). - egui 0.36: merge H2 + extras together with the dependency integration. Owed before 0.3.0: publish
nornir-robotuion egui 0.36 (facett/korp/holger carry a temporary[patch]to edda715d537); vello has no wgpu-30 release (H2 keeps awgpu29alias for vello only; delete when vello ships); 16 heavy GPU test binaries (42 tests) need loki (too hot on the t14s); the demo snapshot golden is stale on main (lane G's size row) — re-bless on loki deliberately. - Name scrub / squash (
workspace_nordisk/PLAN-MOVE-SQUASH-RELEASE.md, owner GO 2026-10-02; who/when = owner). Exempt string: "Ignalina ApS (Rickard Ernst Björn Lundin)" on ownership lines only (facett's gate:facett-ops/src/pypi.rsis_ownership_credit). - crates.io facett 0.2.0 (owner's go). Blockers: publish rotaryengine 0.1.13 + znippy-zoomies 0.1.26 (the
gatling_mapre-export facett-graph3d needs — published 0.1.25/0.1.12 lack it; same-version drift), then raise facett-graph3d's znippy-zoomies floor to 0.1.26. korp must move its 30 facett requirements (Cargo.toml:964-1064, 1207, 1605 + 2 in crates/korp-embed) to 0.2 and eddacrates/step-board/Cargo.toml:46,53(facett-jobview "0.1.17") too. Publish order: 7 waves, computed by lane C2 (in handover-2026-09-29-oden-end.md / C2 report): wave 0 facett-confirm facett-core … wave 5 facett, wave 6 facett-demo. Command (the cascade tooldwarves crate-releasecannot build on dwarf): from an LFS-smudged main, on a temp commit with root[patch.crates-io]stripped:cargo publish --workspace --exclude facett-simview --exclude facet-wrapped --exclude facet-wrapped-group --exclude facett-build-thing --exclude facett-ops --exclude xtask. BEFORE any dry-run:rm -rf ~/.cargo/registry/src/-70f1a6198f08684d(stale overlay checked old code). New crates to publish first time: facett-graphgen, facett-dbexplorer. crates.io token:~/.cargo/credentials.tomlon dwarf and t14s (never print). - After the release: knut UI into facett (plan row
knut-ui-out: knut-pipelines gui/progress → facett-pipeline; knut-popviz app → facett-pop; korp features follow); input components for 0.3.0 (form, search, markdown, sdp, brokkr, auth-ui, file, deploykey, claude, video, korp via Streamlit two-waysetComponentValue; overlays about/confirm/menu/toast/filedialog/zoneui; live sources dbexplorer/git need a data seam). - Smaller: re-measure lineage at 100k on the RTX 5080 (fixed, measured only on the t14s); port
py/tests/robot_streamlit.py(python+playwright) to Rust (owner parked it);find_cyclesreturns a bounded sample (a Johnson-style walk would make it exact); facet_completeness backlog at its 52 limit; yanked chacha20 in Cargo.lock; optionalregion-connectorfeature in facett-demo uses a type deleted from korp-collectors.
4. Boxes
| box | reach | use | rules |
| dwarf | this container (claude), 12 cores, no GPU, rootless podman 5.7 |
ALL builds (nice -n 10, -j 4, wait if load > 20; one target dir per tree, delete when done) |
the gunnar session builds here too |
| t14s | ssh rickard@100.67.148.64 (tailscale) — owner's laptop, Radeon 890M, glibc 2.43 |
GPU tests + browser probes | HEADLESS Chrome only: --headless=new --enable-unsafe-webgpu --enable-gpu --ignore-gpu-blocklist --disable-software-rasterizer --enable-features=Vulkan --use-angle=vulkan --render-node-override=/dev/dri/renderD128; flock ~/runs/t14s.gpu.lock; one test binary/Chrome at a time; native tests with VK_LOADER_DRIVERS_SELECT=*radeon*; stop at Tctl > 85 °C, wait < 60 °C between heavy runs; never all-pairs layout at 100k; NEVER compile there; the owner's power profile (power-saver vs balanced) halves some fps — note it; ~/.pypirc holds the PyPI token (owner keeps it) |
| loki | ssh rickard@192.168.1.102 (LAN) — RTX 5080; often OFF |
GPU tests, 5080 rows; the owner approved its use | NEVER compile there (runs hot); headless NVIDIA set (as t14s without render-node, check adapter "nvidia blackwell"); DO NOT set VK_LOADER_DRIVERS_SELECT on NVIDIA (falls back to SwiftShader); flock ~/runs/loki.gpu.lock; stop at GPU > 85 °C; don't touch the korp-server unit or the owner's Chrome windows. Visible Chrome on loki's desktop works only via XWayland: DISPLAY=:0 XAUTHORITY=$(ls -t /run/user/1000/xauth_* | head -1) + --ozone-platform=x11 --enable-unsafe-webgpu --enable-features=Vulkan --ignore-gpu-blocklist (native Wayland gives a white window on NVIDIA/KDE) |
| oden | ssh rickard@100.115.167.95 (tailscale; LAN IP is DHCP) — RTX 4090, 32 cores, /home ~58 % after cleanup |
shared with the gunnar/holger work | dwarves-server.service is stopped + disabled (owner order); korp-server unit inactive with a new build installed (rollback in the oden-end handover) |
5. Rules learned the hard way (follow them)
- Never
pkill -f <pattern>over ssh/bash: the pattern matches its own shell and kills the command. Find PIDs first, kill exact PIDs you started. - Don't change
HOMEfor a cargo command (rustup loses its toolchain). - Fresh worktrees hold Git-LFS pointer stubs;
git lfs checkoutmay say "not installed". Working fix:git lfs fetchthenfor f in $(git lfs ls-files -n); do head -c 40 $f | grep -q '^version https://git-lfs' && git lfs smudge $f < $f > $f.t && mv $f.t $f; done. facett-docview / facett-core refuse to build on a stub font (good). - Codeberg often answers "Internal Server Connection Error"/"pre-receive hook declined": retry ×6 with 30 s pauses and verify with
git ls-remote— never by grepping push output (the rejection line also saysmain -> main). - The auto-mode permission classifier refuses: publishing (crates.io, PyPI uploads) without the owner's explicit go in that turn; writing the owner's full name into files (the owner did that edit through this session after deciding); force-pushes. Do not route around a refusal (other host, sub-agent, script): stop and hand the exact command to the owner.
- Same-version drift: a crate's local main can carry different code under the version already on crates.io; check the published source, not the number.
- Two egui versions in one build = compile errors with "two different types" — it is always a registry crate pulled next to a path crate (see knut's facett-pipeline pin).
- No pushes from another session's dev trees (
~/d-*); facett lane never wrote there.
6. The unexplained push 12:18:39-12:25:41 UTC (2026-10-03)
The facett lane checked: none of its 22 transcripts (main + 21 subagents) has a command touching ~/d-integrate (only one read-only reflog check at 15:45 UTC); no facett-lane agent ran in that window. A grep of the other Claude projects on dwarf (~, ~/git, transcripts touched after 11:00) found no command with d-integrate + push either. The reflog shows only the shared git identity (Rickard Lundin rickard@ignalina.dk). So it was not a Claude Bash command in any transcript on dwarf — look for a script file, a terminal, or another box. facett main was NOT moved by it (still 101030e). The facett lane recommends fixing forward (no force-push); the owner decides.
RESOLVED (claude session, 2026-10-03): the push was made by the claude session itself, on the owner's explicit instruction "commit and merge and push": main/master + deps-integration-2026-10-03 in 23 repos, then knut main 5a198631 (facett by git rev bd448a7, skade stays a sibling path) and edda main 5330566 (cherry-pick of 20c8814). facett main was deliberately NOT moved (branch only). Owner decision: keep main, fix forward, no force-push. Verification of main runs in ~/d-mainverify; fixes go to fix/post-bump-2026-10-03.
7. Where the evidence lives
Logs: ~/runs/facett-0929/lane*/logs, laneP021/, laneH2/logs, laneL/logs, laneM/logs, release-0.2.1b/build.log, tmp/. Saved WIP: tmp/laneH-egui036-wip.patch (superseded by H2). Worktree kept on purpose: ~/runs/facett-0929/laneY/facett (the Streamlit container binds its dist dirs).