| name | ncn-box |
| description | ncn box profile. A disposable Linux container (apple/container) on THIS machine, worktree mounted at its real path. Used by the ncn conductor when the chosen node is localhost; also use when the user wants a contained local Linux session to build/test/validate before shipping to a remote node. |
ncn-box: local contained session
You are the host conductor. The pane to your right is a box, a disposable
Linux VM (apple/container) on this machine, with the worktree mounted at its
real path. Edits and commits inside it land in the real worktree; execution stays
contained. There is no SSH. The box has its own IP on the apple/container
network (e.g. 192.168.64.x), routable from the host; it is not on the
host's localhost. A service must bind 0.0.0.0 and is reached at the box's IP.
Recover state from window options:
PANE=$(tmux show-options -wqv @ncn_ssh_pane)
Drive it through $PANE: tmux send-keys -t $PANE '<cmd>' Enter, read back with
tmux capture-pane -p -t $PANE.
nc and ncn collapse here: no ssh, no ncn tunnel. The box is not on
localhost; it has its own routable IP. Bind any endpoint to 0.0.0.0 and reach
it at the box's IP (read it from container ls).
Moves
0. Confirm the box is up. capture-pane the right pane; uname -a should
show Linux. If box failed to start, run box doctor and surface the result
(runtime/image/login) rather than working on the host.
1. Work in isolation. Build, run, and test here. This is the safe place for
full-auto or destructive steps: the blast radius is one worktree.
2. Expose an endpoint (ncn). Bind the program to 0.0.0.0 (binding 127.0.0.1
makes it unreachable from the host), then read the box's IP and hand over the box
IP URL (localhost will not reach it). JupyterLab + pip are baked into the
anu-agent image, so the default kernel endpoint is instant:
jupyter lab --no-browser --ip 0.0.0.0 --port 8888 --allow-root
container ls
container inspect <box-name> | grep -i address
curl -sI http://<box-ip>:8888/lab
Hand over http://<box-ip>:8888/lab?token=… (the container IP, not localhost).
Jupyter is preinstalled, so launch it directly (or a model server, dashboard, or
API). For a true localhost URL you'd publish the port at launch
(container run --publish), which the generic box does not do, so the box IP is
the supported path.
Why this profile is useful
The local stand-in for a remote node. The box mirrors a cluster compute node
(minus the GPU): iterate here, then ship the same image to the cluster's
Apptainer (or a remote Mac's box) once it works.
Caveats
- No GPU / CUDA in a Mac box: code/CPU paths only; real GPU work goes to the
cluster (
ncn --cluster).
- Arch: Apple-silicon boxes are linux/arm64 by default; build
--platform linux/amd64 for x86 cluster parity.
- Caps:
ANU_BOX_CPUS (2), ANU_BOX_MEMORY (4G).