Skip to content

feat: Phase 4 IA — COMMAND / FLEET / LAYOUTS / SYSTEM + Command Center - #94

Merged
AreteDriver merged 8 commits into
mainfrom
feat/phase4-ia
Aug 6, 2026
Merged

feat: Phase 4 IA — COMMAND / FLEET / LAYOUTS / SYSTEM + Command Center#94
AreteDriver merged 8 commits into
mainfrom
feat/phase4-ia

Conversation

@AreteDriver

Copy link
Copy Markdown
Collaborator

Summary

Six v2.2 tabs collapsed into four IA-aligned tabs that match the operator's mental model. The Command Center (v3.3 OPS flagship surface) is the default home tab, with all live fleet operations under one roof.

New IA

Tab Container Inner widgets
Command CommandTab CommandCenterWidget (header, fleet rail, tactical grid, attention, ops timeline, truth bar)
Fleet FleetTab (60/40 splitter) CharactersTeamsTab + IntelTab
Layouts LayoutsContainer (70/30 splitter) LayoutsTab + HotkeysTab
System SystemTab (60/40 splitter) SettingsTab + SettingsSyncTab

Changes

  • New: src/argus_overview/ui/tabs/ — four IA container widgets.
  • New: src/argus_overview/ui/command/ — Command Center subsystem (shell, header, fleet rail, tactical grid, attention, operational truth, palette, integration).
  • Changed: MainWindowV21 — adds _TAB_LABELS, _create_tabs() entry point, four factory methods for the IA containers. _show_settings now lands on SYSTEM via _TAB_LABELS.index('System').
  • Fixed: LayoutsTab constructor order bug — was passing character_manager as the second positional arg, which crashed at runtime with "Main tab not initialized" when the user hit Apply. Now uses kwargs; pinned by a contract test.
  • Changed: ActionRegistry — section header comments note the Phase 4 IA mapping. PrimaryHome enum values unchanged.

Tests

  • +24 new tests across tests/test_tab_containers.py, tests/test_command_center.py, tests/test_command_integrator.py, and additions to tests/test_main_window_v21.py (TestPhase4InformationArchitecture).
  • Full suite: 2,580 passed, 5 skipped (target ≥ 2,561).
  • Lint: ruff check src/ tests/ clean.

Senior review

Phase 4 senior review found 11 issues (1 critical); all addressed in this PR:

  • Critical: LayoutsTab constructor kwargs bug — fixed and pinned.
  • Naming symmetry: inner widget renamed self.layouts_tab → self.presets_panel so the container attribute can claim self.layouts_tab consistently with the other three containers.
  • Duplicate signal: dropped redundant layouts_tab.layout_applied connection; main_tab.layout_applied remains the single canonical source.
  • Tautological alias: removed LayoutPresetsPanel re-export and its pinning test.

Docs

  • CHANGELOG.md — new [Unreleased] — IA Overhaul section with Added / Changed / Tests / Senior review fixes subsections.
  • CLAUDE.md — version 3.3.0 (unreleased), test count 2,580, Tab Structure table replaced with the IA container mapping.
  • docs/ux-report-v33.md — principal UX/UI audit of the v3.2 → v3.3 OPS Command Center uplift.
  • docs/screenshots/ — 6 new v3.3 screenshots (command-center, command-center-palette, command-tab, fleet-tab, layouts-tab, system-tab).

Test plan

  • pytest tests/ -q → 2,580 passed, 5 skipped
  • ruff check src/ tests/ → All checks passed
  • Manual smoke test: launch app, verify each new tab loads, verify Ctrl+K opens Command Palette, verify Refresh / Lock-Windows palette entries hit the new APIs

🤖 Generated with Claude Code

AreteDriver and others added 8 commits August 5, 2026 03:42
Surface the small accessors the Command Center depends on, plus a
sweep of ruff hygiene that piled up between the design-system
migration and the IA work.

API additions:
- AutoDiscovery.run_once — public alias for force_scan. The Command
  Palette's "Refresh window list" entry point scans once, emits the
  usual signals, and returns without starting the background timer.
- LayoutManager.position — lazy-initialized position registry. The
  Command Palette's "Lock windows" / "Unlock windows" entries call
  set_locked, which routes through this. Lazy init keeps the import
  cost off callers that never touch positions.
- LayoutManager.set_locked(locked) — operationally correct API for
  the lock-windows use case.
- SystemStatusBar.snapshot() — fresh dict copy of every subsystem's
  (status, detail) pair. Used by CommandIntegrator to seed its
  parallel status view without reaching into private state.
- design_system.painting.draw_threat_accent — ribbon + top-glow
  combo for fleet/tactical cards. Alpha-modulated by the live
  threat alpha so intel aging fades the chrome.

Ruff hygiene (auto-fix F401/I001, manual F841/UP045):
- Drop unused imports across intel_tab, main_tab, status_dock,
  integration, header, operational_truth, and the related tests.
- Reorder import blocks to satisfy I001 in command/header.py.
- Convert Optional[X] to X | None in command/integration.py
  (project targets Python 3.10+).
- Remove two dead variables (alert_color in header, total_w / text_w
  in operational_truth's chip paint) and a redundant layout() call
  in test_command_center.

All Phase 4 IA + Command Center commits sit on top of this one. The
full suite still reports 2,580 passed, 5 skipped.

Co-Authored-By: Claude <noreply@anthropic.com>
Collapse the six v2.2 tabs into four IA-aligned tabs that match the
operator's mental model and let the Command Center (v3.3 OPS flagship
surface) be the natural home for live fleet operations.

New top-level IA:
- COMMAND — hosts the Command Center (header, fleet rail, tactical
  grid, attention queue, ops timeline, operational truth bar).
- FLEET — CharactersTeamsTab + IntelTab side-by-side via QSplitter
  (60/40). "Your people and the intel that affects them."
- LAYOUTS — LayoutsTab + HotkeysTab side-by-side via QSplitter
  (70/30). "How your fleet is arranged on screen."
- SYSTEM — SettingsTab + SettingsSyncTab side-by-side via QSplitter
  (60/40). "App + EVE folder configuration."

Command Center subsystem (src/argus_overview/ui/command/):
- shell.py — CommandCenterWidget: header + fleet rail + grid holder
  + ops timeline + attention queue + truth bar.
- header.py — identity bar (ARGUS // OPS title, fleet count,
  intel health, alert badge with pulse).
- fleet_rail.py — permanent left rail of pilot identity cards.
- tactical_grid.py — center grid host for the existing preview grid.
- attention.py — top-right attention queue (severity-coded items).
- operational_truth.py — bottom bar with named subsystems + alert
  counter.
- palette.py — Command Palette (Ctrl+K): fuzzy-search gateway to
  focus a pilot, apply a layout, switch a theme, lock windows.
- integration.py — CommandIntegrator: wires the Command Center into
  MainWindow, attaches Ctrl+K, mirrors main_tab's character list,
  polls subsystem status, seeds alert count from existing UI.

MainWindowV21 changes:
- _TAB_LABELS now ["Command", "Fleet", "Layouts", "System"].
- _create_tabs() single entry point — builds the inner widgets via
  the legacy factories, then wraps them in IA containers.
- Inner widgets live under main_tab, characters_tab, presets_panel,
  hotkeys_tab, intel_tab, settings_tab, settings_sync_tab. The
  container attributes (command_tab, fleet_tab, layouts_tab,
  system_tab) match the IA labels.
- _show_settings now points at SYSTEM via
  _TAB_LABELS.index("System") — "Settings" is no longer a
  top-level tab, but it still lives inside the SYSTEM container.
- _create_layouts_tab uses kwargs for the LayoutsTab constructor
  (the signature is (layout_manager, main_tab, settings_manager=
  None, character_manager=None)) — passing character_manager as the
  second positional arg crashed at runtime with "Main tab not
  initialized" the moment the user hit Apply. Pinned by
  test_create_layouts_tab_passes_main_tab_to_main_slot.
- layout_applied signal is connected exactly once: from main_tab
  to _on_layout_applied / CommandIntegrator. Documented why the
  layouts_tab.path is not used.

ActionRegistry:
- Section header comments now note the Phase 4 IA mapping
  (OVERVIEW_TOOLBAR → COMMAND, ROSTER_TOOLBAR / INTEL_TOOLBAR →
  FLEET, LAYOUTS_TOOLBAR / CYCLE_CONTROL_TOOLBAR → LAYOUTS,
  SYNC_TOOLBAR / SETTINGS_PANEL → SYSTEM). PrimaryHome enum values
  are unchanged — actions still bind to the same inner widget.
- Refresh Layout Groups tooltip updated to "from the LAYOUTS tab
  (Cycle Control pane)".

Tests (24 new):
- tests/test_tab_containers.py — CommandTab signal forwarding,
  FleetTab/LayoutsContainer/SystemTab splitter structure, ratio
  pinning (60/40, 70/30, 60/40), objectName selectors, horizontal
  orientation, stub-injection smoke test.
- tests/test_command_center.py — structure of every Command Center
  component (header, fleet rail, attention, ops timeline, truth).
- tests/test_command_integrator.py — palette shortcut, attach
  semantics, alert count handoff, subsystem snapshot.
- additions to tests/test_main_window_v21.py
  (TestPhase4InformationArchitecture) — pins _TAB_LABELS, routes
  _show_settings to SYSTEM, and pins the LayoutsTab constructor
  kwargs contract.

Phase 4 senior review addressed all 11 findings (1 critical):
naming symmetry (inner widget → presets_panel), duplicate signal
connection, tautological alias, and the critical kwargs order bug.

Full suite: 2,580 passed, 5 skipped (target ≥ 2,561).

Co-Authored-By: Claude <noreply@anthropic.com>
Document the v3.3 OPS Phase 4 Information Architecture overhaul and
the Command Center flagship surface.

CHANGELOG.md:
- New [Unreleased] — IA Overhaul section after the Operational
  Truth UI Polish section. Documents the four new tabs, the new
  IA containers, the _create_tabs entry point, the IA contract
  pin (_TAB_LABELS), the _show_settings reshuffle, the
  ActionRegistry section comments, the tooltip refresh, and the
  senior review fixes (1 critical, 10 non-critical).

CLAUDE.md:
- Version bumped to 3.3.0 (unreleased).
- Test count updated to 2,580.
- Tab Structure table replaced with the IA container mapping
  (Command / Fleet / Layouts / System, inner widgets, toolbar
  homes).
- tabs/ directory note updated to mention the four containers.

docs/ux-report-v33.md:
- Principal UX/UI audit of v3.2 → v3.3 OPS Command Center uplift.
- Captures the five product moves: brand identity typography,
  Fleet Rail promotion, tactical awareness overlay, Command
  Palette (⌘K), polished Operational Truth bar.

docs/screenshots/ (v3.3):
- command-center-v33.png — flagship surface (full Command tab).
- command-center-palette-v33.png — Command Palette open state.
- command-tab-v33.png — stubbed Command tab for IA documentation.
- fleet-tab.png — FLEET (Roster + Intel).
- layouts-tab.png — LAYOUTS (presets + Cycle Control).
- system-tab.png — SYSTEM (Settings + Sync).

Targets Phase 4 senior review's visual evidence requirement and
gives the next maintainer a quick reference for what the new IA
looks like.

Co-Authored-By: Claude <noreply@anthropic.com>
Two CI checks failed on PR #94 (feat/phase4-ia): Lint & Format
(failed on pre-existing ruff errors in scripts/) and Validate
documented claims against reality (version_consistency caught the
CLAUDE.md → 3.3.0 bump without matching pyproject/README updates).

Scripts/ lint cleanup (12 ruff errors):
- capture_all_tabs.py — drop unused PySide6.QtGui.QPixmap, fix
  I001 (reorder imports), add # noqa: E402 with explanatory comment
  on the deliberate post-monkey-patch MainWindowV21 import.
- capture_screenshot.py — drop unused time, PySide6.QtGui.QPixmap.
- capture_screenshot_focus.py — drop unused time,
  PySide6.QtGui.QPixmap.
- capture_screenshot_matrix.py — drop unused PySide6.QtGui.QPixmap,
  fix I001, add the same # noqa: E402 with comment for the
  post-monkey-patch import.
- truth-baseline.py — drop unused os, fix I001 (import order).

Version bump:
- pyproject.toml: 3.2.0 → 3.3.0 (matches CLAUDE.md and CHANGELOG
  Phase 4 IA entry claiming the post-Phase-4 codebase is v3.3.0).
- README.md: title line v3.2.0 → v3.3.0. The FROZEN/archived
  notice at the top of README is left untouched — that's a
  portfolio-triage decision outside this PR's scope.

Verification:
- ruff check . → All checks passed.
- python scripts/truth-baseline.py → 7/7 passed.
- pytest tests/ → 2,580 passed, 5 skipped (unchanged).

Co-Authored-By: Claude <noreply@anthropic.com>
CI's `ruff format --check .` step was the remaining failure on
PR #94 — 34 files had drifted from the current ruff format output
(whitespace wrapping, import grouping, trailing comma placement).
This is a mechanical reformat with no semantic changes.

What's in scope:
- All 9 Phase 4 Command Center modules (ui/command/*).
- All 4 IA tab containers (ui/tabs/*).
- MainWindowV21 wiring.
- 5 test files I added or edited (test_command_center,
  test_command_integrator, test_main_window_v21, test_tab_containers,
  test_preview_health_paint — the last one picked up via the
  F401/import fix in the earlier chore commit).
- 6 pre-existing files with drift (scripts/truth-baseline.py,
  ui/{hotkeys,layouts,main,menu_builder,settings}_tab.py,
  ui/design_system/{colors,metrics,painting}.py).
- 4 pre-existing test files (test_layouts_tab, test_main_tab,
  test_menu_builder, test_system_status_bar).

Verified after format:
- ruff format --check . → all formatted.
- ruff check . → All checks passed.
- pytest tests/ → 2,580 passed, 5 skipped (unchanged).
- python scripts/truth-baseline.py → 7/7 passed.

Co-Authored-By: Claude <noreply@anthropic.com>
CI's `ruff format --check .` step (using ruff 0.16.1) catches
Markdown formatting drift that older ruff versions ignored. Five
pre-existing Markdown files had minor whitespace/blank-line
deviations from ruff's Markdown formatter:

- DEV_NOTES.md
- PACKAGE_INFO.md
- docs/API.md
- docs/ARCHITECTURE.md
- docs/SMOKE_TEST_v3.2.0.md

Mechanical reformat — no content changes. Verified locally after
upgrading ruff to 0.16.1:

- ruff format --check . → all formatted.
- ruff check . → All checks passed.
- pytest tests/ → 2,580 passed, 5 skipped.

Co-Authored-By: Claude <noreply@anthropic.com>
Phase 4 IA wraps every v2.2 inner widget in one of four containers
(CommandTab / FleetTab / LayoutsContainer / SystemTab), but the inner
factories (_create_main_tab, _create_characters_tab, _create_hotkeys_tab,
_create_intel_tab, _create_settings_sync_tab, _create_settings_tab)
still called self.tabs.addTab(...) — so the QTabWidget received both the
legacy label (Overview / Roster / Cycle Control / Intel / Sync / Settings)
AND the IA wrapper. User's screenshot set showed 5 visible tabs (10 in
total) with the Command Center flagship duplicated between Overview and
Command.

Strip the redundant addTab calls; keep every self.<inner> attribute
assignment and signal.connect(...) so cross-tab wiring stays intact.
Update each factory's docstring to reflect 'inner widget, not a tab'.

Add two regression tests in TestPhase4InformationArchitecture:

  * test_no_legacy_tab_labels_in_ia — forbids the v2.2 labels in
    _TAB_LABELS, so any future re-addTab in an inner factory surfaces as
    a label-drift failure.

  * test_four_ia_containers_register_tabs — patches the four IA
    containers and asserts addTab is called exactly four times with the
    IA labels. Inner-factory addTab shows up as count drift.

Update scripts/capture_all_tabs.py to iterate the four IA tabs
(command / fleet / layouts / system) instead of the legacy six.

truth-baseline.json: regenerate to match v3.3.0 across pyproject,
README, and CLAUDE.md.

Co-Authored-By: Claude <noreply@anthropic.com>
@AreteDriver
AreteDriver merged commit 971cc8b into main Aug 6, 2026
15 checks passed
@AreteDriver
AreteDriver deleted the feat/phase4-ia branch August 6, 2026 10:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant