Correct drift that predated IOModbus and persisted after the merge:
- RUNNING.md: retitled to the suite; run commands for all 3 modules; per-module
data locations; generalized architecture map and simulator note.
- SUITE-ARCHITECTURE.md: 'one real module' -> three; sequencing steps 4/5 done.
- DESIGN-SYSTEM.md: theme path corrected to cim_suite/core/ui/theme (it moved in
the monorepo reshape); import examples fully qualified.
- REBUILD-STATUS.md: hover help now spans all modules (IOModbus included).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The serial reader thread caught a read error and flashed a status message but
never told the UI the link was down, so the "Connected" label and green pill
stayed lit after the cable was yanked.
Add a third transport callback, connection_callback(bool), parallel to
data_callback/error_callback (Qt-free core). SerialTransport._reader fires it
with False in its error path (reached only on an unexpected drop; a deliberate
stop() exits via the while-condition). Both controllers bridge it to
connectionChanged in attach(), so the existing _on_connection(False) slots grey
the pill and flip the label -- no UI changes. Fixes BL-5 (same signal) for both
DA-12 and DA-07. Report-only; auto-reconnect deferred to BL-9.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The DA-07 rebuild loaded nothing from real hardware: unlike the DA-12 (which
streams its reply unsolicited), a real DA-07 runs a polled handshake -- it sends
a refresh one frame per ACK and interleaves Z2 idle polls, advancing only when
the tool answers both. The rebuild sent "A" once and answered nothing, so the
station stopped after frame one. The simulator hid this by dumping every frame
at once.
Fix (hardware-verified on a real DA-07, COM5):
- controller._process now ACKs (Z1) every inbound data frame to pull the next.
- controller._handle_poll answers the station's Z2 idle polls (and Z0 NAK ->
resend). Idle-polling turned out to be required for the initial load, not just
live mode -- an ACK-only build deadlocked partway through the stream.
- SimulatedStation models the frame-per-ACK stream (handshake=True); the
frame-content round-trip tests opt out with handshake=False.
A full Refresh now loads config + 45 device types + 28 settings + present
devices + channels (~120 frames over ~20s) where the broken build loaded 1.
Loading overlay (requested): a blocking, dimmed, gradient-blue panel covers the
DA-07 window during the multi-second refresh and clears when it completes.
- New reusable core/ui/loading_overlay.py (LoadingOverlay + animated gradient bar,
colors from theme tokens) and a SCRIM token + QSS rules.
- Controller emits loadStarted/loadProgress/loadFinished; completion is inferred
by a 1.5s idle-settle timer (no end marker on the wire; 1.5s clears the real
~0.55s max inter-frame gaps with margin). Verified: clears 1.5s after the last
frame, no premature clear.
233 tests pass (new test_handshake.py, test_loading.py), ruff clean. Docs updated
(CLAUDE.md, HARDWARE-VERIFICATION.md, BACKLOG.md, REBUILD-STATUS.md).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Update REBUILD-STATUS (test count 112->127, phase 7, what-works,
stale branch line), add BL-6 DONE in BACKLOG, and list core/export +
export_action.py in SUITE-ARCHITECTURE.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Update all five named files to reflect the completed suite-monorepo reshape:
run/entry commands point at cim_suite.shell.app; architecture tables and paths
updated to cim_suite/core + cim_suite/modules/da12 + cim_suite/shell; SUITE-
ARCHITECTURE.md status changed from "not yet built" to done with actual layout
and updated Module contract; REBUILD-STATUS.md records 88 tests and Phase 5;
BACKLOG.md marks reshape done and adds BL-S1/S2/S3 follow-ups including the
config/data-path migration caveat; transport __init__ docstring points to
cim_suite.core.transport.serial_transport for the real transport.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Reciprocal pointers so the live to-do list (backlog) and the point-in-time status
stay in sync regardless of which is opened first; status 'Known gaps' now flagged as
candidates to promote into the backlog.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- SUITE-ARCHITECTURE.md: agreed direction (unified modular app on a shared core),
rationale, target monorepo structure, thin module contract, rule-of-three caution,
and sequencing (awaiting source for apps #2/#3). Not yet built.
- REBUILD-STATUS.md: 'Next direction' pointer to the suite plan.
- VB6-MIGRATION-PLAYBOOK.md: new section on consolidating multiple apps into one
suite (when to unify vs separate shells; don't over-build core from one app).
No code changes — documentation only, per request, ahead of receiving the other apps.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- decode_float(): scale/offset use VB AddFloat semantics with NO 8000 sentinel
(8000 is a real negative value there, not no-value). decoder 'A' branch updated.
- encode_scaled(): use math.floor to match VB Int() (floors toward -inf), correct
for negative calibration offsets.
- Simulator F-frame: comment that its layout is not verified ground truth.
- REBUILD-STATUS: record the review + the deferred F-counter display.
- +3 regression tests (72 total).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>