Dated source reference. Current release status: handoff state. Full original relative paths are in the developer archive.
OpenHoops external working storage
Updated after Blender startup repair, November 8, 2026 UTC. External drive start page.
Additional internal data relocated — November 6 local / November 7 UTC
The workspace was already external. A further 39.4 GB of project support
data was found outside it and relocated to
/Volumes/MacStudioExternal/Modding/OpenHoops-support/. This includes the
25.2 GB ~/.local/share/openhoops tree (reference games, original staging
archive, toolchains, builds and private configuration), 14.1 GB of closed Codex
project history, Claude project history, generated images, shell snapshots,
project configuration, and Blender user settings/add-on and caches.
Original paths remain compatibility symlinks. All relocated content was SHA-256 verified before internal originals were removed, followed by a separate full content and path readback. Keep the support directory private and connected alongside the workspace. These are relocations, not independent backups.
Use python3 tools/with-external-storage.py COMMAND [ARG ...] for local project
commands. It checks the mounted drive UUID and directs temporary files, Python
bytecode and pip caches externally. It does not change global shell settings.
Explicit build/render/output directories must also be external.
Five live or loaded project logs (about 3.0 GB at handoff), shared application
databases and the Xcode Python installation remain internal. The old Documents
project folders are cloud-only placeholders with zero local payload allocation;
they were not downloaded or removed. Two small /private/tmp scripts retain
their original ownership internally (8 KB total allocation).
The Blender application stays at /Applications/Blender.app; its settings,
OpenHoops add-on and caches remain external. The November 7 restoration and
deferred startup check are historical: on November 8 the user reported a
damaged-app rejection. A fresh official 5.2.2 installation now passes direct
window launch and normal macOS launch, with the existing add-on loaded. The user
approved the separate external-drive permission. The previous app is preserved
externally, and all its file bytes matched the fresh official app before the
replacement. No global security policy was changed.
The cache wrapper needed an additional fix: Blender's embedded Python ignores
environment variables by default. with-external-storage.py now adds
--python-use-system-env when directly launching Blender, so its external
PYTHONPYCACHEPREFIX actually takes effect. A separate local startup module in
the external user settings sets the same cache location for normal desktop
launches, with a drive-UUID check and disabled bytecode writes on failure.
It does not alter the signed app or the portable add-on. Scripts that spawn
Blender as a child must pass --python-use-system-env themselves. The actual
four imports that previously added unsigned bundle caches were checked in both
launch modes; their cache paths now resolve externally.
See the Blender repair and startup evidence. The older migration receipts remain unchanged.
Residual-migration records include exact manifests, hashes, retained failed checks, final routing, Blender restoration/security-validation evidence and the internal exceptions. The final receipt supersedes the earlier intermediate Blender-move receipt; do not replay migration workers against the completed paths.
Working paths
The entire workspace physically lives at
/Volumes/MacStudioExternal/Modding/OpenHoops. This includes source code,
AGENTS, knowledge-base, API, native hook, presentation, editor, tools and Python
environment as well as bulk data. Open that external folder directly, or keep
using /Users/brentlane/Projects/NBA 2K14 Decomp:Recomp: the old root is now a
compatibility symlink to the external root.
| Material | Physical location under external OpenHoops |
|---|---|
| Source, notes, SDKs, editor and tools | Original project-relative paths, all physically external |
| All five arenas and editable assets | arena-projects/ |
| Shared arena kit and court templates | arena-authoring-kit-1.1.0/, assets/court-templates/ |
| All research, captured evidence and recovery archives | analysis/ |
| Original extracted game reference | NBA2K14-extracted/ |
| Original packages and research resources | resources/, rld-nba2k14.iso, Crack/ |
| Selected historical builds and releases | Selected children of build/ and distribution/ |
All new output beneath either workspace path now lands externally, including builds, distributions, research and assets. Former code backlinks and mixed internal parents were consolidated into real external files/directories. There is no dependency on an internal source checkout. System dependencies such as the Xcode Python interpreter remain installed in their normal locations. This is working storage, not an extra independent backup.
Two existing processes retained the old root as their cwd: preview PID90432 and
sleeping Claude PID45338 at cutover. A hidden internal directory,
/Users/brentlane/Projects/.OpenHoops-workspace-forwarder-20261024, retains only
24 forwarding symlinks and zero regular files, preserving relative-path access
without restarting them. Leave it until fresh process/handle checks prove it
unused. It is not another workspace copy. The original visible path is the
root compatibility link described above.
Keep the drive connected
Keep MacStudioExternal connected and mounted under that name when using
moved data. APFS volume UUID: F7CA45D6-9DDA-404E-B72B-72435671ADD5.
If files appear missing, reconnect this drive and verify the mount/UUID. Do not
replace dangling links with empty directories or write substitute data into
/Volumes/MacStudioExternal while the volume is absent. Close writers before
ejecting it.
Reversing a move requires enough internal space, stopped writers, a separate absent internal destination, a verified copy and coordinated atomic replacement of its compatibility link. Never delete the only payload or blindly rerun completed migration workers. Earlier per-child and analysis-parent receipts describe their original cutovers; the later full-root receipt supersedes their link topology and source-internal assumptions only.
Cleanup72/73 archives and helpers remain available through their old paths in
analysis/archives72 and analysis/archives73. Their explicit restore rules
still apply. Historical hardlinked caches remain immutable; materialize an
independent copy before editing. Read CLEANUP.md before replaying
old scripts.
Preservation and measurements
| Scope | Units | Files | Logical bytes | Original allocated bytes moved |
|---|---|---|---|---|
| Main corpus, research and history | 104 | 23,361 | 21,742,765,109 | 21,800,685,568 |
| All five arenas and shared arena material | 65 | 102,559 | 38,749,016,188 | 39,049,043,968 |
| Combined | 169 | 125,920 | 60,491,781,297 | 60,849,729,536 |
That table records the initial bulk migration. The full-workspace move adds 6,064 files, 277,623,836 logical bytes and296,497,152 original allocated bytes across44 remaining code/doc/tool units. Three Python symlinks were preserved. Cumulative source allocation relocated:61,146,226,688 bytes.
About 61 GB relocated in total. Internal free space was around80GB at the initial handoff and77.5GB at root cutover while other projects were active. Original allocation and live free space are separate measurements; concurrent projects/APFS accounting can change free space. Original packages, immutable releases, all five arenas, shared corpus, sources and history remain preserved. This is relocation, not another cleanup deletion or a new release.
Every file was SHA256-checked after copying and again before removing its
internal original. Membership, source-backed xattrs, ACLs, modes, modification
times and native creation timestamps were checked. Payload/directory fsync and
device F_FULLFSYNC preceded source removal; atomic swaps preserved old-path
availability. Originals were retained through final copy/source checks. An
independent main rehash and an actual archived SQLite restore passed. Arena
records include all five release-package readbacks and the existing preview
server's unchanged HTTP content. Final parent consolidation compared 45,042
recursive analysis members through both paths.
One exact metadata exception was recorded: macOS added com.apple.provenance
with bytes 010200903043494860dd32 where the source lacked that attribute.
Only that precise addition was accepted:14,857 main +811 arena entries in the
initial phase, plus5,888 in the remaining workspace copy. Three staged Python
symlink modification timestamps were repaired to the exact source nanoseconds
before verification/promotion; the repair journal and initial worker are kept.
Source-backed attributes, including quarantine, stayed exact; other differences
were rejected. Raw per-entry exception journals are retained.
No game, build, application test, render or new service was launched for this move. The existing Yuengling preview was left running. Dell games, saves, hosts, installations and custody settings were untouched. No automatic mount, cleanup or backup job was created. Storage coordination with the existing arena chats was explicitly authorized; ordinary cross-chat broadcasts remain user-managed.
Records
Records live outside the relocated project trees. Keep them with the payloads:
- Main full rehash and restore verification
- Arena completion
- Independent arena review
- Final analysis parent topology
- Combined final handoff
- Full workspace/root move
- Final root routing/documentation validation
These directories retain plans, per-file manifests, original metadata, hashes, copy/move receipts, exception journals and safety helpers. Do not rewrite historical receipts to match later authorized edits.