feat: Phase 4 IA — COMMAND / FLEET / LAYOUTS / SYSTEM + Command Center - #94
Merged
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
Changes
Tests
Senior review
Phase 4 senior review found 11 issues (1 critical); all addressed in this PR:
Docs
Test plan
🤖 Generated with Claude Code