subagent transcript

session 832fa851
delegated task
Review the state of a FreeCAD-to-WebAssembly porting project. Search breadth: thorough. The working root is /home/magik6k/lcad-wasm/ with the main eff
▸ Magik
Review the state of a FreeCAD-to-WebAssembly porting project. Search breadth: thorough. The working root is /home/magik6k/lcad-wasm/ with the main effort in /home/magik6k/lcad-wasm/freecad-port/. I already have STATUS.md content, so don't re-summarize it — instead VERIFY the actual state on disk against what docs claim, and characterize what exists: 1. /home/magik6k/lcad-wasm/freecad-port/deploy/ , deploy-gui/, deploy-jspi/, deploy-t1/ — what's in each (built wasm artifacts? html shells? sizes, internal file dates via `ls -la`). Which looks like the most recent/most complete build? Note deploy/ was modified Jul 5 13:33 (after STATUS.md Jul 4 20:03) — what changed there? 2. /home/magik6k/lcad-wasm/freecad-port/FreeCAD/ — is it a git checkout? Run `git -C ... status --short | head -50`, `git log --oneline -15`, current branch, and count of modified files. Are there uncommitted changes / patches? Check `git stash list` too. 3. /home/magik6k/lcad-wasm/freecad-port/research/ and toolchain/ — brief inventory. 4. Root /home/magik6k/lcad-wasm/ — the many .mjs test scripts (boot-test, boxrender, vpgui, uinew2, deployburst, deployhover, resizetest, etc.) and .log files: identify the newest few by mtime and what they test. Check the last ~30 lines of the newest 2-3 .log files to see the last test results (pass/fail). 5. Any WIP markers: files modified on Jul 5 anywhere in the tree (`find /home/magik6k/lcad-wasm -newermt "2026-07-05" -not -path "*/node_modules/*" -not -path "*/.git/*" -type f | head -40`), which indicate what the dying session was touching last. 6. /home/magik6k/lcad-wasm/freecad-port/00-OVERVIEW.md — skim and report the stage plan in 2-3 sentences, and which stage the on-disk evidence says we're actually in. 7. Also check /home/magik6k/lcad-wasm/porting/ and /home/magik6k/lcad-wasm/out/ directories briefly. 8. There's a screenshot 2026-07-04-205009_2396x2075_scrot.png in freecad-port/ — just note its existence/size, don't view it. Return a structured report: what's built and working, what's mid-flight, discrepancies between STATUS.md claims and disk reality, and the most likely "you are here" point.
Fable
thinking
I'll start by running some parallel exploration commands to investigate the problem.
Fable
I'll investigate the project state on disk in parallel.
Fable
⚙ Bash {"command": "ls -la /home/magik6k/lcad-wasm/freecad-port/deploy/ 2>/dev/null; echo \"=== deploy-gui ===\"; ls -la /home/magik6k/lcad-wasm/freecad-port/deploy-gui/ 2>/dev/null; echo \"=== deploy-jspi ===\"; ls -la /home/magik6k/lcad-wasm/fre…
tool result
total 300968
drwxr-xr-x 1 agent agent       578 Jul  5 13:33 .
drwxr-xr-x 1 agent agent       636 Jul  4 20:50 ..
-rw-r--r-- 1 agent agent    539683 Jul  5 14:39 FreeCAD.js
-rw-r--r-- 1 agent agent     99672 Jul  5 12:03 FreeCAD.js.gz
-rwxr-xr-x 1 agent agent 205911653 Jul  5 14:39 FreeCAD.wasm
-rwxr-xr-x 1 agent agent  73569116 Jul  5 12:03 FreeCAD.wasm.gz
-rw-r--r-- 1 agent agent      1613 Jul  4 20:38 README.md
-rw-r--r-- 1 agent agent       395 Jul  5 14:36 boot.py
-rw-r--r-- 1 agent agent    …[truncated]
Fable
⚙ Bash {"command": "echo \"=== git status ===\"; git -C /home/magik6k/lcad-wasm/freecad-port/FreeCAD status --short 2>&1 | head -50; echo \"=== git log ===\"; git -C /home/magik6k/lcad-wasm/freecad-port/FreeCAD log --oneline -15 2>&1; echo \"=== b…
tool result
=== git status ===
include/Inventor/scxml/ScXMLContentElt.h: Bad file descriptor
include/Inventor/scxml/ScXMLValidateElt.h: Bad file descriptor
src/vrml97/Material.cpp: Bad file descriptor
src/vrml97/ProximitySensor.cpp: Bad file descriptor
src/vrml97/Script.cpp: Bad file descriptor
test-code/SbMatrix/multRight/input.txt: Bad file descriptor
src/Mod/Part/App/FT2FC.cpp: Bad file descriptor
src/Mod/Part/App/FeatureOffset.cpp: Bad file descriptor
src/Mod/Part/App/FeatureScale.h: Bad file descriptor  …[truncated]
Fable
⚙ Bash {"command": "echo \"=== research ===\"; ls -la /home/magik6k/lcad-wasm/freecad-port/research/ 2>/dev/null; echo \"=== toolchain ===\"; ls -la /home/magik6k/lcad-wasm/freecad-port/toolchain/ 2>/dev/null; echo \"=== porting ===\"; ls -la /hom…
tool result
=== research ===
total 72
drwxr-xr-x 1 agent agent  512 Jul  4 06:16 .
drwxr-xr-x 1 agent agent  636 Jul  4 20:50 ..
-rw-r--r-- 1 agent agent 6998 Jul  3 18:01 R1-codebase-architecture.md
-rw-r--r-- 1 agent agent 4875 Jul  4 06:16 R10-eh-jspi-asyncify-findings.md
-rw-r--r-- 1 agent agent 6054 Jul  3 18:02 R2-dependency-matrix.md
-rw-r--r-- 1 agent agent 8157 Jul  3 18:03 R3-graphics-coin-webgl.md
-rw-r--r-- 1 agent agent 4751 Jul  3 18:03 R4-python-runtime.md
-rw-r--r-- 1 agent agent 5928 Jul  3  …[truncated]
Fable
⚙ Bash {"command": "echo \"=== root listing ===\"; ls -la /home/magik6k/lcad-wasm/ 2>/dev/null; echo \"=== newest mjs ===\"; ls -lat /home/magik6k/lcad-wasm/*.mjs 2>/dev/null | head -20; echo \"=== newest logs ===\"; ls -lat /home/magik6k/lcad-was…
tool result
=== root listing ===
total 1312
drwxr-xr-x 1 agent agent   2290 Jul  5 13:22 .
drwxr-xr-t 3 agent agent   4096 Jul  4 16:38 ..
-rw-r--r-- 1 agent agent   5830 Jun 29 16:33 00-OVERVIEW.md
drwxr-xr-x 1 agent agent    596 Jun 30 17:48 LibreCAD
-rw-r--r-- 1 agent agent  65394 Jul  3 18:22 aqtinstall.log
-rw-r--r-- 1 agent agent   1808 Jul  4 05:25 boot-test.mjs
-rw-r--r-- 1 agent agent   1307 Jul  4 05:26 boot-test2.mjs
-rw-r--r-- 1 agent agent   1319 Jul  4 06:45 bootshot.mjs
-rw-r--r-- 1 agent age  …[truncated]
Fable
⚙ Bash {"command": "echo \"=== Jul 5 files ===\"; find /home/magik6k/lcad-wasm -newermt \"2026-07-05\" -not -path \"*/node_modules/*\" -not -path \"*/.git/*\" -type f 2>/dev/null | head -40; echo \"=== screenshot ===\"; ls -la /home/magik6k/lcad-w…
tool result
=== Jul 5 files ===
/home/magik6k/lcad-wasm/pack-mods.sh
/home/magik6k/lcad-wasm/stepio.mjs
/home/magik6k/lcad-wasm/guiprobe.mjs
/home/magik6k/lcad-wasm/m0probe.mjs
/home/magik6k/lcad-wasm/skprobe.mjs
/home/magik6k/lcad-wasm/canvassize.mjs
/home/magik6k/lcad-wasm/resizetest.mjs
/home/magik6k/lcad-wasm/pyside-port/m1lite-build.sh
/home/magik6k/lcad-wasm/pyside-port/libpyside-build.sh
/home/magik6k/lcad-wasm/pyside-port/BUILD-PLAN.md
/home/magik6k/lcad-wasm/pyside-port/m0-build.sh
/home/magik6k/lc  …[truncated]
Fable
thinking
The git status is showing filesystem errors on the FreeCAD checkout—looks like an overlayfs quirk with 28 modified files on the wasm-port branch. I should check the latest logs, review the stage plan in the overview document, and dig into the pyside-port area since that's the most recently updated section.
Fable
Now let me read the newest logs, the overview stage plan, and inspect the freshest area (pyside-port, Jul 5 14:49).
Fable
⚙ Bash {"command": "echo \"=== newest logs tree-wide ===\"; find /home/magik6k/lcad-wasm -name \"*.log\" -not -path \"*/node_modules/*\" -not -path \"*/.git/*\" -type f -printf \"%TY-%Tm-%Td %TH:%TM %s %p\\n\" 2>/dev/null | sort -r | head -15", "d…
tool result
=== newest logs tree-wide ===
2026-07-05 15:05 73335 /home/magik6k/lcad-wasm/pyside-port/build/m2-qtcore/gen/mjb_shiboken.log
2026-07-05 15:05 278117 /home/magik6k/lcad-wasm/pyside-port/build/m2-qtcore/gen/mjb_rejected_functions.log
2026-07-05 15:05 1519 /home/magik6k/lcad-wasm/pyside-port/build/m2-qtcore/gen/mjb_rejected_enums.log
2026-07-05 15:05 10281 /home/magik6k/lcad-wasm/pyside-port/build/m2-qtcore/gen/mjb_rejected_fields.log
2026-07-05 15:05 10215 /home/magik6k/lcad-wasm/pyside-port/buil  …[truncated]
Fable
⚙ Bash {"command": "echo \"=== deployburst.log ===\"; cat /home/magik6k/lcad-wasm/deployburst.log; echo; echo \"=== deployhover.log ===\"; cat /home/magik6k/lcad-wasm/deployhover.log; echo; echo \"=== deploytest.log ===\"; cat /home/magik6k/lcad-w…
tool result
=== deployburst.log ===
saved burst frames 3,8,13,18,23 to deploy/
EXIT=0

=== deployhover.log ===
context errors seen: 0

EXIT=0

=== deploytest.log ===
STARTUP_DONE at 4 s
screenshot deploy/preview.png
log tail:
E Requested non-existent style parameter token 'GeneralBorderColor'.
E Requested non-existent style parameter token 'GeneralBorderColor'.
E Requested non-existent style parameter token 'GeneralBorderColor'.
E Requested non-existent style para  …[truncated]
Fable
⚙ Bash {"command": "ls -la /home/magik6k/lcad-wasm/pyside-port/ 2>/dev/null", "description": "List pyside-port"}
tool result
total 48
drwxr-xr-x 1 agent agent   494 Jul  5 14:49 .
drwxr-xr-x 1 agent agent  2290 Jul  5 13:22 ..
-rw-r--r-- 1 agent agent 26041 Jul  5 12:54 BUILD-PLAN.md
drwxr-xr-x 1 agent agent   234 Jul  5 15:05 build
drwxr-xr-x 1 agent agent   230 Jul  5 12:45 emscripten-crossbuild
drwxr-xr-x 1 agent agent   154 Jul  5 12:43 fc-pyside-usage
-rw------- 1 agent agent  1291 Jul  5 14:44 libpyside-build.sh
-rw------- 1 agent agent  2308 Jul  5 13:25 m0-build.sh
-rw------- 1 agent agent  2034 Jul  5 14:33 m  …[truncated]
Fable
⚙ Read {"file_path": "/home/magik6k/lcad-wasm/freecad-port/00-OVERVIEW.md"}
tool result
1	# FreeCAD → WebAssembly: Master Plan
2	
3	Successor project to the LibreCAD wasm port (`../00-OVERVIEW.md`, shipped —
4	see `../deploy/index.html`). This effort ports **FreeCAD** (Qt 6 / C++20 /
5	Python 3 parametric 3D CAD) to a browser-based application compiled to
6	WebAssembly via Emscripten, served as static files.
7	
8	> Feasibility analysis: `../freecad-feasibility.md`. Verdict: **feasible,
9	> conditionally** — no single impossibility, but two frontier workstreams
10	> (Coin3D-on-WebGL  …[truncated]
Fable
thinking
I'm getting a clearer picture of the codebase now. Let me quickly check the deploy boot.py file and the current state of the m2-qtcore work to understand what's been done recently, then I'll look at the mjb_shibo component to see how everything fits together.

Actually, I should focus on the shiboken generation log from the 15:05 timestamp since that's the most recent activity — checking the pass/fail status of that pyside-port shiboken generation will give me the true picture of what's currently being worked on.
Fable
Let me check the true-newest activity (pyside shiboken gen at 15:05) and the deploy/ boot.py that changed after STATUS.md.
Fable
⚙ Bash {"command": "echo \"=== m2-qtcore mjb_shiboken.log tail ===\"; tail -15 /home/magik6k/lcad-wasm/pyside-port/build/m2-qtcore/gen/mjb_shiboken.log 2>/dev/null; echo; echo \"=== m2-qtcore dir ===\"; ls -la /home/magik6k/lcad-wasm/pyside-port/b…
tool result
=== m2-qtcore mjb_shiboken.log tail ===
Removing "QDateTime::fromString(QStringView string, QStringView format, int baseYear, QCalendar cal)" due to presence of an overload taking a "QString" parameter.
Removing "QDateTime::fromString(QStringView string, Qt::DateFormat format)" due to presence of an overload taking a "QString" parameter.
Removing "QDateTime::fromString(const QString &string, QStringView format, int baseYear, QCalendar cal)" due to presence of an overload taking a "QString" param  …[truncated]
Fable
⚙ Read {"file_path": "/home/magik6k/lcad-wasm/freecad-port/deploy/boot.py"}
tool result
1	import FreeCAD as App
2	P = App.Console.PrintMessage
3	P("M1_START\n")
4	try:
5	    from PySide6 import QtCore
6	    s = QtCore.QSize(3, 4)
7	    p = QtCore.QPoint(10, 20)
8	    s.setWidth(7)
9	    P("M1_PASS QSize=%dx%d QPoint=(%d,%d) repr=%r\n" % (s.width(), s.height(), p.x(), p.y(), s))
10	except Exception as e:
11	    import traceback
12	    P("M1_FAIL %s\n%s\n" % (e, traceback.format_exc()))
13	P("STARTUP_DONE\n")
14	
Fable
⚙ Bash {"command": "echo \"=== deploy index.html head ===\"; head -30 /home/magik6k/lcad-wasm/freecad-port/deploy/index.html; echo \"=== ROADMAP head ===\"; head -40 /home/magik6k/lcad-wasm/porting/ROADMAP.md", "description": "Peek deploy index an…
tool result
=== deploy index.html head ===
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>FreeCAD in your browser — WebAssembly</title>
<style>
  html, body { margin: 0; height: 100%; font-family: system-ui, "Segoe UI", sans-serif; background:#2b2b30; color:#eee; }
  #bar { position: fixed; top: 0; left: 0; right: 0; z-index: 20; display:flex; align-items:center; gap:12px;
         background:#1d1d21; border-bottom  …[truncated]
Fable
thinking
I'm noticing some inconsistencies in the documentation—the overview mentions CPython 3.12/3.13 with PySide disabled for the MVP, but the roadmap references CPython 3.14.4 and Qt 6.11.1 with active PySide porting work. What's particularly revealing is that the deploy boot script actually tests for PySide6 QtCore imports and marks them as passing, suggesting the current build already has PySide6 integrated despite what the overview claims.

Looking at the deploy directory timestamps, there's a clear rebuild window around July 5 between 14:36 and 14:39 where the wasm binary and PySide data files were updated, though the compressed version appears stale. I have enough detail now to write up the   …
Fable
I have enough to compile the report. # FreeCAD→WASM Porting Project — On-Disk State Review ## 1. Deploy directories | Dir | Newest artifact | wasm size | Character | |---|---|---|---| | **`deploy/`** | **Jul 5 14:39** | `FreeCAD.wasm` **205 MB** (uncompressed), `.wasm.gz` 73 MB (stale, Jul 5 12:03) | **Most recent + most complete.** Full GUI build. Has an HTML shell (`index.html`, Jul 5 13:33), `boot.py`, three data bundles: `freecad.data` (15 MB, Jul 4), `freecad-mods.data` (2.8 MB, Jul 5 11:51), and **`freecad-pyside.data` (Jul 5 14:36)** — i.e. this build now bundles a PySide6 payload. | | `deploy-gui/` | Jul 4 20:58 | 188 MB | Previous full-GUI build. Rich set of test screenshots (vpgui, nw-*, vg-*, boot). Multiple HTML shells (index-boot/pytest/viewport/vp2/vpgui). This was the working GUI reference before the Jul 5 rebuild. | | `deploy-jspi/` | Jul 4 05:52 | 128 MB | JSPI-variant experiment (vs ASYNCIFY). Single `boot.png`. Superseded. | | `deploy-t1/` | Jul 3 19:34 | 62 MB | Tier-1 **headless** kernel (`FreeCADCmd.wasm`), smaller `freecad.data` (10 MB), `browser-test.js`/`test-memfs.js`. The T1 milestone artifact. | **What changed in `deploy/` after STATUS.md (Jul 4 20:03):** it was rebuilt Jul 5 — new `FreeCAD.wasm`/`.js` (14:39), new `index.html` (13:33), `boot.py` rewritten (14:36), and critically a **new `freecad-pyside.data` bundle + `freecad-mods.data`**. The `boot.py` now contains a **PySide6 QtCore smoke test** (`M1_START` → imports `PySide6.QtCore`, constructs `QSize`/`QPoint`, prints `M1_PASS`/`M1_FAIL`). So the Jul-5 session was integrating a PySide6 module into the live deploy build. Note the `FreeCAD.wasm.gz` (73 MB) is **stale** — 2.5h older than the uncompressed `.wasm`, so the compressed artifact does not match the current binary. Screenshot `2026-07-04-205009_2396x2075_scrot.png` exists in `freecad-port/` (161 KB, Jul 4 20:50) — not viewed. Also `deploy/gui-probe.png` (Jul 5 13:21) and `deploy/preview.png` (Jul 4 20:58). ## 2. FreeCAD git checkout Yes, a git checkout. Branch **`wasm-port`**. `git status --short` and `git log` both work but every status line is suffixed `: Bad file descriptor` (a sandbox/overlay-FS quirk on this mount, not real corruption). **28 modified files**, **no stash entries**. Recent commits are all wasm-port work, tip: - `8f36d38` wasm: inittab RegName=CInitSuffix form + FREECAD_WASM_EXTRA_PY_MODULES - `f512034` Sketcher edit-mode fit-all fix + two live threading guards - `84216de` enable Measure/Spreadsheet/Surface/Import workbenches - `80046491` enable PartDesign workbench - …down through the Coin/WebGL viewport bring-up commits (offscreen-FBO WasmGLWidget, GL emulation enum interception, selection-drag fixes). The 28 modified-but-uncommitted files are the current WIP layer on top of those commits. ## 3. research/ and toolchain/ - **`research/`** — 10 analysis docs, R1–R10 (Jul 3–4). R1 architecture, R2 dependency matrix, R3 Coin/WebGL, R4 python runtime, R5 dialogs/JSPI, R6 payload/memory, R7 threads decision, R8 JSPI migration, R9 Coin/WebGL strategy, R10 EH/JSPI/Asyncify findings. - **`toolchain/`** — build scripts: `assemble-python-prefix.sh`, `configure-stage1.sh`, `configure-stage2.sh` (Jul 4 06:19, newest), `patches/`, `run-freecadcmd.js`, `t1-smoke.py`, `versions.lock`, `__pycache__`. ## 4. Root .mjs test scripts and logs These are Puppeteer/node browser-drivers exercising the deployed build. Newest by mtime: - `m0probe.mjs` (Jul 5 13:22) — newest; a "M0" PySide probe. - `guiprobe.mjs` (13:01) → produced `deploy/gui-probe.png`. - `stepio.mjs` (12:05) — STEP import/export I/O test. - `resizetest.mjs`/`canvassize.mjs` (Jul 5 01:20–01:22) — canvas/viewport resize. - `skprobe.mjs` (01:03) — Sketcher probe. - Older Jul 4: `fileio`, `consolecheck`, `emitcount`, `deployburst`, `deployhover`, `deploytest`, `vpgui`, `vpnew`, `boxrender`, `uinew`, boot-test. **Newest .log results (all EXIT=0 / passing):** - `deployburst.log` (Jul 4 21:02): "saved burst frames 3,8,13,18,23 to deploy/ — EXIT=0" - `deployhover.log` (21:00): "context errors seen: 0 — EXIT=0" - `deploytest.log` (20:58): "STARTUP_DONE at 4 s … EXIT=0" — but note a **Coin GL-context warning** ("Error when setting up the GL context … no current context") and repeated benign `GeneralBorderColor` style-token warnings. - `vpgui.log`/`vpnew.log`: GUI boots, screenshots captured, EXIT=0, same benign style-token noise. **True newest activity is NOT in root logs** — it is the PySide build under `pyside-port/build/`: shiboken binding-generator logs at **Jul 5 15:05** (`m2-qtcore/gen/mjb_shiboken.log`). That log's tail shows normal shiboken overload-pruning ("Removing QDateTime::fromString… due to presence of an overload") — i.e. QtCore binding generation running to completion, not an error state. ## 5. Jul-5 WIP surface (what the dying session was touching) Overwhelmingly **`pyside-port/`** (created/edited Jul 5 12:41–15:05) plus the `deploy/` rebuild and `porting/` docs. Key WIP: - `pyside-port/BUILD-PLAN.md` (26 KB), staged build scripts `m0-build.sh`→`m1-build.sh`→`m1lite-build.sh`→`m2-qtcore/m2-qtgui/m2-qtwidgets/build.sh`, `libpyside-build.sh`, `shiboken-mod-build.sh`. - Patch sets: `static-nodlopen/000{1,2,3}-*.patch` (shiboken6/pyside6 emscripten-static), `qt-nothread-typesystem/0001-qtcore-guard-readwritelock-nothread.patch`, `fc-pyside-usage/*.patch/.cmake`. - `emscripten-crossbuild/01→03-build-*.sh` (host shiboken → wasm shiboken runtime → wasm pyside). - Build tree `pyside-port/build/` actively populated: `shiboken-host`, `shiboken-gen`, `shiboken-mod`, `m0-minimal`, `m1-qtcore`, `m1lite`, and **m2-qtcore (15:05, latest) / m2-qtgui / m2-qtwidgets** binding-gen dirs. - `porting/ROADMAP.md` + `GAPS.md` (11:20–11:25) and ~19 analysis subdirs (partdesign, measure, techdraw, fem, mesh, sketcher, modal-audit, threading-audit, pyside-*, etc.). - Root probes `m0probe.mjs`/`guiprobe.mjs`/`stepio.mjs`, `pack-mods.sh`. `out/` is **empty** (created Jul 5 12:41, likely a scratch output dir never populated). ## 6. Stage plan vs. actual position `00-OVERVIEW.md` defines 8 stages (0 toolchain → 1 headless kernel/T1 → 2 GUI link → 3 GUI boot → 4 WebGL2 Coin backend → 5 files/persistence → 6 productionize/T2 → 7 Python workbenches/T3), across three shippable tiers T1 (kernel), T2 (MVP GUI: Part+Sketcher+PartDesign+…), T3 (PySide6/pivy moonshot). Gates are blocking; stages 4 and 7 partly parallelize. **On-disk "you are here":** Stages 0–3 are done (headless T1 artifact shipped in `deploy-t1/`; full GUI links, boots, and renders — `deploy/` + passing vpgui/deploytest logs and screenshots). Work is **mid-Stage-4 (WebGL2 Coin backend)** — commits show the offscreen-FBO WasmGLWidget and GL-emulation fixes, and `deploytest.log` still shows a Coin GL-context warning, so the viewport isn't fully clean. Simultaneously the session had **jumped ahead into Stage 7 (PySide6-on-wasm)** — the entire `pyside-port/` effort and the PySide-bundled `deploy/` rebuild — which is where it was actively working when it stopped (last file activity 15:05, m2-qtcore QtCore bindings). ## 7. Discrepancies: STATUS.md/OVERVIEW claims vs. disk - **Python version:** `00-OVERVIEW.md` says "CPython 3.12/3.13 static-linked." `porting/ROADMAP.md` (Jul 5, newer) says **CPython 3.14.4**, **Qt 6.11.1 wasm_singlethread**, **ASYNCIFY + JS-EH** (not the "JSPI-first" the overview frames). The overview is stale on toolchain specifics; ROADMAP reflects reality. - **PySide "OFF for MVP / Stage-7 moonshot":** Overview and ROADMAP both say don't do PySide first — yet the Jul-5 session did exactly that, standing up a full PySide/shiboken wasm build (`pyside-port/`) and shipping a **PySide6 QtCore smoke test into the live `deploy/boot.py`** with a `freecad-pyside.data` bundle. So the actual last-session direction **contradicts the written roadmap's "highest-value next action"** (which was threading + modal-hang fixes, then PartDesign). - **Enabled workbench set:** ROADMAP header says enabled today = GUI/PART/SKETCHER/MATERIAL/START, but git log shows commits enabling **PartDesign, Measure, Spreadsheet, Surface, Import** — so more is enabled than the ROADMAP prose states (or those commits are the uncommitted/just-landed delta). - **Stale compressed artifact:** `deploy/FreeCAD.wasm.gz` (12:03) predates `deploy/FreeCAD.wasm` (14:39) by 2.5h — the served/compressed binary is out of sync with the actual rebuilt wasm. A deploy would ship a mismatched or stale gzip unless regenerated. - **`out/` empty**, `deploy/` `.wasm.gz` stale — signs of an interrupted build/pack cycle (the `pack-mods.sh` / gzip step didn't complete for the final 14:39 binary). **Most likely "you are here":** A GUI MVP build (Stages 3→4, Part/Sketcher/PartDesign viewport working under Coin GL-emulation with an unresolved GL-context warning) is deployed and passing browser smoke tests. The session then pivoted into the Stage-7 PySide6-on-wasm moonshot, got as far as generating QtCore bindings (m2-qtcore, 15:05) and wiring a PySide6 smoke test into the deployed build — and stopped mid-PySide-build, leaving a stale compressed wasm and an empty `out/`.