On the suite dashboard, scan COM ports, surface detected service cables in an
inline panel, and gate module entry until one is selected (modal warning + Rescan
/ Quit when none). Records the live finding that both cables are FTDI 0403:6001
and indistinguishable from each other by USB descriptor.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Drop the full VB6 source for two more service tools into their module
legacy/ baselines and register them as ComingSoonModule cards in the shell:
- cim_suite/modules/da07/legacy/ (DA-07 Service Tool Software)
- cim_suite/modules/iomodbus/legacy/ (IOModbus RS-485 service utility)
Both appear as "coming soon" launcher cards; rebuilding each into a live
module is its own spec → plan → implement cycle (see docs/BACKLOG.md).
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>
Introduces the `Module` Protocol in `cim_suite/core/module.py` (with
`ComingSoonModule` placeholder) and `Da12Module` in
`cim_suite/modules/da12/module.py` that wraps controller + MainWindow
behind the contract. Adds 2 tests (79 total passing).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Introduces cim_suite/core/config.py with app-scoped path helpers and JSON
load/save utilities that are independent of QApplication name. The DA-12
module config.py becomes a thin wrapper that binds APP_NAME and filenames
while keeping the same public API (load_config, save_config, data_dir,
cal_csv_path) so no call sites change.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Task-by-task, test-guarded plan implementing the approved reshape spec:
branch + scaffold, move VB6 baseline per-module, relocate the DA-12 package,
extract core (codecs/transport/theme+TableTab/config), Module contract +
Da12Module, the card-launcher shell, suite repackaging, docs, and the
drop-in recipe for apps #2/#3.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Concrete, approved design for turning the standalone DA-12 repo into the
CIMTechniques Service Suite monorepo: cim_suite/ import root, conservative
core extraction, a card-launcher shell, the Module contract, and a
test-guarded migration order. Legacy VB6 source moves per-module into
modules/<app>/legacy/. Supersedes the sketch in SUITE-ARCHITECTURE.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Establish the suite-wide visual design system as a self-contained theme
layer and apply it across the DA-12 module.
- theme package (da12_service/ui/theme): tokens -> fonts -> stylesheet ->
apply_theme; no app dependencies, shaped to move into core/ui/theme.
- Palette/fonts derived from the SmartScan brand: azure #0096FF accent on
cool-slate surfaces, Lato bundled (OFL) and loaded at runtime.
- Applied app-wide: branded toolbar header + primary Connect action,
underline tab bar, banded gridless tables, themed inputs/buttons/dialogs,
status-bar connection pill, primary-button variants.
- Alarm row colors now come from SEVERITY tokens (alarms red / warnings
amber) instead of hardcoded pastels.
- Packaging ships fonts in both the PyInstaller spec and the wheel.
Documented as the binding suite standard in docs/DESIGN-SYSTEM.md (rules +
per-module adoption checklist), cross-linked from SUITE-ARCHITECTURE.md and
CLAUDE.md. Backlog: BL-3 DONE, BL-4 (dark variant) and BL-5 logged.
ruff clean; 73 tests pass; app boots with --simulate.
Co-Authored-By: Claude Opus 4.8 (1M context) <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>
- BL-1: graceful shutdown on app close (close port / join reader via closeEvent).
- BL-2: connection status goes stale on unexpected disconnect (emit
connectionChanged(False) from the reader error path).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The bundled exe died at startup with 'attempted relative import with no known
parent package' because the spec ran da12_service/app.py as __main__ (no package
context). Dev was unaffected (python -m sets the context).
- packaging/da12_launcher.py: thin entry that imports the package absolutely so
app.py loads as a submodule and its relative imports resolve.
- spec: target the launcher; robust pathex via SPECPATH.
- app.py: DA12_SELFTEST hook (boot then auto-quit) for reliable build verification.
- tests/test_packaging_entry.py: runs the entry as PyInstaller does; asserts clean
boot — regression guard (73 tests total).
- RUNNING.md: correct verification method (a lingering window != a clean boot).
Rebuilt exe verified: boots and self-exits with code 0.
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>
Portable guide distilled from the DA-12 rebuild: why VB6 apps break, stack choice
(Python+PySide6 vs .NET), the phased process, how to read VB6 source, a VB6-quirk
-> Python reference (signed-16/32 hex, Int() floor, fixed-point/sentinels, OCX
replacements, serial specifics), the layered/simulator architecture, dropped-feature
discipline, testing, packaging/AV/signing, and a per-app reuse checklist.
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>
Phase 2:
- transport: BaseTransport interface, pyserial SerialTransport (19200-8-N-1 reader
thread), and a deterministic in-memory SimulatedStation speaking the wire protocol.
- domain: SensorTable/LimitsTable/StatsTable/StationSettings with partial updates;
two-point + offset-only calibration math with DACal.csv-compatible history;
per-sensor MeasurementLogger matching the legacy format.
- StationController (QObject) routes transport->framer->decoder->models->signals,
using AutoConnection so the simulator runs synchronously and the serial reader
thread is marshaled to the GUI thread. Full outbound command surface.
- 62 passing tests (protocol + transport + domain).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Imports the original Visual Basic 6 source (Main.frm, Support.bas, Calib.frm,
NewSensors.frm, ComSetup.frm, Error.frm, project files) and reference data
(DACal.csv, DAService.tab, Exceptions.txt) as the starting point, plus the
approved modernization design spec under docs/superpowers/specs/.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>