Tracking issue for the P1 findings from the 2026-07-15 pre-release audit. Root causes for all three long-standing known bugs are identified.
Known bugs (root cause identified)
1. "Rover observation file not found" although the file exists under /data/
2. Header shows MRTKLIB version "0.0.0"
3. Conversion tab: command preview does not update when Time Range fields change
4. #32 — cssr2rtcm3 Epoch progress line stalls the console
High-impact bugs
5. useWebSocket — zombie reconnect after unmount
6. WebSocket broadcast races
7. Container hardening
8. Reconcile version strings (release chore)
9. Minimal CI
Note
tasks/todo.md still lists "v0.7.6 UI relocation" and ".mrtklib-version bump" as TODO — both are done and should be checked off.
Tracking issue for the P1 findings from the 2026-07-15 pre-release audit. Root causes for all three long-standing known bugs are identified.
Known bugs (root cause identified)
1. "Rover observation file not found" although the file exists under
/data/validate_input_pathinsrc/mrtklib_web_ui/api/mrtk_post.py:173-180confirms glob matches exist but then returns the unexpanded pattern string.create_subprocess_execperforms no shell expansion, so mrtk receives a literal/data/*.obsand reports the file missing. (Plain-path resolution was empirically verified correct.)input_staging.py→shutil.copy2("/data/*.24d", …)→FileNotFoundError. Also, inputs without a recognized root prefix silently fall back under/workspace(paths.py:30), producing spurious "not found" errors.2. Header shows MRTKLIB version "0.0.0"
/api/mrtklib/versionto read.mrtklib-version(or shell out tomrtk --version)src/mrtklib_web_ui/main.py:97-113returns the web UI's own Python package version (importlib.metadata). Inside the Docker image there are no git tags, so it resolves to 0.0.0.3. Conversion tab: command preview does not update when Time Range fields change
-tr(rtcmRefTime) /-tt(epochTolerance) to the preview buildercommandPreviewmemo infrontend/src/components/ConversionPanel.tsx:452-539never readsform.rtcmRefTime/form.epochTolerance, whilehandleConvertdoes send them (L578, L580) — so only the preview is stale.4. #32 — cssr2rtcm3 Epoch progress line stalls the console
_pump_streamsplit on\ras well as\n(src/mrtklib_web_ui/services/process_manager.py:319) — port the fix already applied to the post/convert readers_processes/_log_tasks(leak per relay/CLAS run)High-impact bugs
5.
useWebSocket— zombie reconnect after unmountshouldReconnectflag) infrontend/src/hooks/useWebSocket.ts:106-135close()firesoncloseasynchronously after cleanup ran → 3 s laterconnect()opens a new socket on an unmounted component and it lives on indefinitely (connection leak + setState on a dead component).messagesarray (L96-98): unbounded and unread by bothApp.tsxcall sites, yet every message triggers a full page re-render (cap it and/or make list-tracking opt-in)6. WebSocket broadcast races
src/mrtklib_web_ui/api/convert.py:23-32/api/mrtk_run.py:27-37— iterating the client set while a disconnect handler mutates it raisesRuntimeError: Set changed size during iteration, aborting the rest of the broadcast. Use the copy-under-lock approach fromwebsocket_manager.py:69-70.services/mrtk_run_service.py:610,628—readline()raises on lines >64 KiB; switch to chunked reads.7. Container hardening
USERtodocker/Dockerfile(adjust/workspaceownership)data/(422 MB) andtmp/to.dockerignore(currently sent to the build context on every build)8. Reconcile version strings (release chore)
_version.py(0.1.1a1.dev — no v0.3.0 tag exists) /.env.example(0.1.0-alpha) /frontend/package.json(0.0.0) / CHANGELOG (stuck at 0.1.0, still says "RTKLIB 2.4.3" and "Mantine v7")docker pull ...:0.3.0-alphareferences a nonexistent tag (publishing is git-tag driven) — push the tag or fix the docs9. Minimal CI
Note
tasks/todo.mdstill lists "v0.7.6 UI relocation" and ".mrtklib-version bump" as TODO — both are done and should be checked off.