From c6c1d54c2c16f8a57512cb805fc9474694ceb7a0 Mon Sep 17 00:00:00 2001 From: Bill Date: Tue, 17 Feb 2026 09:06:54 -0700 Subject: [PATCH] Step 523: add sprint 26 integration summary and closure gate --- editor/CMakeLists.txt | 9 +++ editor/src/Sprint26IntegrationSummary.h | 90 ++++++++++++++++++++++++ editor/tests/step523_test.cpp | 92 +++++++++++++++++++++++++ progress.md | 39 +++++++++++ 4 files changed, 230 insertions(+) create mode 100644 editor/src/Sprint26IntegrationSummary.h create mode 100644 editor/tests/step523_test.cpp diff --git a/editor/CMakeLists.txt b/editor/CMakeLists.txt index 4589846..f147da6 100644 --- a/editor/CMakeLists.txt +++ b/editor/CMakeLists.txt @@ -3586,4 +3586,13 @@ target_link_libraries(step522_test PRIVATE tree_sitter_javascript tree_sitter_typescript tree_sitter_java tree_sitter_rust tree_sitter_go) +add_executable(step523_test tests/step523_test.cpp) +target_include_directories(step523_test PRIVATE src) +target_link_libraries(step523_test PRIVATE + nlohmann_json::nlohmann_json + unofficial::tree-sitter::tree-sitter + tree_sitter_python tree_sitter_cpp tree_sitter_elisp + tree_sitter_javascript tree_sitter_typescript + tree_sitter_java tree_sitter_rust tree_sitter_go) + # Step 12: Dear ImGui shell scaffolding created (main.cpp exists but not built due to dependencies) diff --git a/editor/src/Sprint26IntegrationSummary.h b/editor/src/Sprint26IntegrationSummary.h new file mode 100644 index 0000000..bd0511a --- /dev/null +++ b/editor/src/Sprint26IntegrationSummary.h @@ -0,0 +1,90 @@ +#pragma once +// Step 523: Sprint 26 Integration + Summary + +#include "Phase26aIntegration.h" +#include "ThemeTokenSystemV2.h" +#include "SignatureVisualIdentity.h" +#include "ControlLibraryRestyle.h" +#include "IconTypographyHarmonizer.h" +#include "ModifierEdgeNotation.h" +#include "CompletionOverlayUXHardening.h" +#include "NotificationStatusRefresh.h" +#include "CrossPanelConsistencySweep.h" + +#include +#include + +struct Sprint26Summary { + bool phase26aPass = false; + bool tokenSystemPass = false; + bool visualIdentityPass = false; + bool controlsPass = false; + bool typographyPass = false; + bool modifierEdgePass = false; + bool overlayPass = false; + bool notificationPass = false; + bool panelConsistencyPass = false; + bool sprintPass = false; + std::vector notes; +}; + +class Sprint26IntegrationSummary { +public: + static Sprint26Summary build() { + Sprint26Summary s; + + auto p26a = Phase26aIntegration::run(); + s.phase26aPass = p26a.pass; + + auto tokens = ThemeTokenSystemV2::baseBlackStone(); + s.tokenSystemPass = ThemeTokenSystemV2::validateAA(tokens) && + !ThemeTokenSystemV2::hasHardcodedPurple(tokens); + + auto grad = SignatureVisualIdentity::blackSurfaceGradient(true); + auto link = SignatureVisualIdentity::electricBlueLink(true, 0.2f); + s.visualIdentityPass = grad.size() == 3 && + SignatureVisualIdentity::isElectricBlue(link); + + auto idle = ControlLibraryRestyle::styleFor(ControlKind::Button, 1.0f, false); + auto pressed = ControlLibraryRestyle::styleFor(ControlKind::Button, 1.0f, true); + s.controlsPass = ControlLibraryRestyle::hasClearPressedSignal(idle, pressed) && + ControlLibraryRestyle::validContrast(idle); + + auto ty = IconTypographyHarmonizer::darkSurfaceTypography(1.0f); + auto ic = IconTypographyHarmonizer::iconProfileFor(1.0f, false); + s.typographyPass = IconTypographyHarmonizer::harmonized(ty, ic); + + auto glyph = ModifierEdgeNotation::buildGlyph('P', true, true, false, false, true); + s.modifierEdgePass = ModifierEdgeNotation::activeEdgeCount(glyph.edges) == 2 && + glyph.fallbackText == "Ctrl+Shift+P"; + + CompletionOverlayState overlay; + overlay.dismissed = true; + overlay.lastTriggerToken = "foo"; + auto reopened = CompletionOverlayUXHardening::onTrigger(overlay, "bar", false); + s.overlayPass = reopened.visible && !reopened.dismissed; + + auto noteStyle = NotificationStatusRefresh::styleFor(NotifyLevel::Critical); + s.notificationPass = noteStyle.defaultDurationMs == 0.0f && + NotificationStatusRefresh::readable(noteStyle); + + PanelVisualContract base{"base", 12, 6, 1, "v2", "v2"}; + std::vector panels = { + {"explorer", 12, 6, 1, "v2", "v2"}, + {"editor", 12, 6, 1, "v2", "v2"}, + {"status", 12, 6, 1, "v2", "v2"} + }; + auto sweep = CrossPanelConsistencySweep::run(panels, base); + s.panelConsistencyPass = sweep.pass; + + s.sprintPass = s.phase26aPass && s.tokenSystemPass && s.visualIdentityPass && + s.controlsPass && s.typographyPass && s.modifierEdgePass && + s.overlayPass && s.notificationPass && s.panelConsistencyPass; + + s.notes.push_back("Sprint 26 integration summary generated"); + s.notes.push_back(s.sprintPass + ? "Sprint 26 complete: UX foundations, visual language, and hardening gates pass" + : "Sprint 26 incomplete: one or more integration gates failed"); + return s; + } +}; diff --git a/editor/tests/step523_test.cpp b/editor/tests/step523_test.cpp new file mode 100644 index 0000000..696e53a --- /dev/null +++ b/editor/tests/step523_test.cpp @@ -0,0 +1,92 @@ +// Step 523: Sprint 26 Integration + Summary (8 tests) + +#include "Sprint26IntegrationSummary.h" + +#include + +static int passed = 0, failed = 0; +#define TEST(name) { std::cout << " " << #name << "... "; } +#define PASS() { std::cout << "PASS\n"; ++passed; } +#define FAIL(msg) { std::cout << "FAIL: " << msg << "\n"; ++failed; } +#define CHECK(cond, msg) if (!(cond)) { FAIL(msg); return; } else {} + +static Sprint26Summary runNow() { + return Sprint26IntegrationSummary::build(); +} + +void test_phase26a_gate_passes() { + TEST(phase26a_gate_passes); + auto s = runNow(); + CHECK(s.phase26aPass, "phase 26a should pass"); + PASS(); +} + +void test_visual_system_gates_pass() { + TEST(visual_system_gates_pass); + auto s = runNow(); + CHECK(s.tokenSystemPass, "token system should pass"); + CHECK(s.visualIdentityPass, "visual identity should pass"); + CHECK(s.controlsPass, "control restyle should pass"); + CHECK(s.typographyPass, "typography harmonization should pass"); + PASS(); +} + +void test_modifier_edge_system_passes() { + TEST(modifier_edge_system_passes); + auto s = runNow(); + CHECK(s.modifierEdgePass, "modifier-edge system should pass"); + PASS(); +} + +void test_overlay_hardening_passes() { + TEST(overlay_hardening_passes); + auto s = runNow(); + CHECK(s.overlayPass, "overlay hardening should pass"); + PASS(); +} + +void test_notification_refresh_passes() { + TEST(notification_refresh_passes); + auto s = runNow(); + CHECK(s.notificationPass, "notification refresh should pass"); + PASS(); +} + +void test_panel_consistency_passes() { + TEST(panel_consistency_passes); + auto s = runNow(); + CHECK(s.panelConsistencyPass, "panel consistency should pass"); + PASS(); +} + +void test_sprint_pass_flag_true() { + TEST(sprint_pass_flag_true); + auto s = runNow(); + CHECK(s.sprintPass, "sprint pass flag should be true"); + PASS(); +} + +void test_notes_include_completion_statement() { + TEST(notes_include_completion_statement); + auto s = runNow(); + CHECK(s.notes.size() >= 2, "expected summary notes"); + CHECK(s.notes[1].find("Sprint 26") != std::string::npos, + "expected Sprint 26 completion statement"); + PASS(); +} + +int main() { + std::cout << "Step 523: Sprint 26 Integration + Summary\n"; + + test_phase26a_gate_passes(); // 1 + test_visual_system_gates_pass(); // 2 + test_modifier_edge_system_passes(); // 3 + test_overlay_hardening_passes(); // 4 + test_notification_refresh_passes(); // 5 + test_panel_consistency_passes(); // 6 + test_sprint_pass_flag_true(); // 7 + test_notes_include_completion_statement(); // 8 + + std::cout << "\nResults: " << passed << "/" << (passed + failed) << " passed\n"; + return failed == 0 ? 0 : 1; +} diff --git a/progress.md b/progress.md index 1f8934e..2d10945 100644 --- a/progress.md +++ b/progress.md @@ -8489,3 +8489,42 @@ histograms and normalization helpers for rapid alignment. - `editor/src/CrossPanelConsistencySweep.h` within header-size limit (`81` <= `600`) - `editor/tests/step522_test.cpp` within test-file size guidance (`152` lines) - Header-only architecture and naming conventions remain aligned with `ARCHITECTURE.md` + +### Step 523: Sprint 26 Integration + Summary +**Status:** PASS (8/8 tests) + +Implements the Sprint 26 closure gate by integrating Phase 26a reliability, +visual token + identity systems, control/typography harmonization, +modifier-edge shortcuts, overlay hardening, notification semantics, and +cross-panel consistency into a single summary signal. + +**Files added:** +- `editor/src/Sprint26IntegrationSummary.h` - sprint integration summary module: + - aggregates Step 514-522 validation signals + - computes final Sprint 26 pass flag + - emits Sprint completion summary notes +- `editor/tests/step523_test.cpp` - 8 tests covering: + - phase and domain gate pass signals + - final sprint pass synthesis + - completion-note emission + +**Files modified:** +- `editor/CMakeLists.txt` - `step523_test` target + +**Verification run:** +- `cmake -S editor -B editor/build-native` - PASS +- `cmake --build editor/build-native --target step523_test` - PASS +- `./editor/build-native/step523_test` - PASS (8/8) +- `./editor/build-native/step522_test` - PASS (12/12) regression coverage + +**Architecture gate check:** +- `editor/src/Sprint26IntegrationSummary.h` within header-size limit (`90` <= `600`) +- `editor/tests/step523_test.cpp` within test-file size guidance (`92` lines) +- Header-only architecture and naming conventions remain aligned with `ARCHITECTURE.md` + +**Sprint 26 totals (509-523):** +- **Steps completed:** 15 +- **New tests in this sprint plan:** 172/172 passing +- **Phase 26a (509-514):** 68/68 passing +- **Phase 26b (515-519):** 60/60 passing +- **Phase 26c (520-523):** 44/44 passing