Sprint 26: end-of-sprint architecture refactor pass

This commit is contained in:
Bill
2026-02-17 09:08:13 -07:00
parent c6c1d54c2c
commit 30440d04ac
4 changed files with 83 additions and 23 deletions

View File

@@ -34,9 +34,8 @@ public:
r.x = cursorX; r.x = cursorX;
r.y = cursorY + lineHeight; r.y = cursorY + lineHeight;
if (r.x + r.w > viewportW) r.x = std::max(0.0f, viewportW - r.w); if (r.x + r.w > viewportW) r.x = clampMin(viewportW - r.w, 0.0f);
if (r.y + r.h > viewportH) r.y = std::max(0.0f, cursorY - r.h - 4.0f); if (r.y + r.h > viewportH) r.y = clampMin(cursorY - r.h - 4.0f, 0.0f);
if (r.y < 0.0f) r.y = 0.0f;
return r; return r;
} }
@@ -63,7 +62,7 @@ public:
int index, int index,
int itemCount) { int itemCount) {
CompletionOverlayState out = in; CompletionOverlayState out = in;
out.selectedIndex = std::max(0, std::min(itemCount - 1, index)); out.selectedIndex = clampIndex(index, itemCount);
out.visible = itemCount > 0; out.visible = itemCount > 0;
return out; return out;
} }
@@ -77,11 +76,27 @@ public:
out.visible = false; out.visible = false;
return out; return out;
} }
int idx = in.selectedIndex + delta; out.selectedIndex = wrapIndex(in.selectedIndex + delta, itemCount);
while (idx < 0) idx += itemCount;
while (idx >= itemCount) idx -= itemCount;
out.selectedIndex = idx;
out.visible = true; out.visible = true;
return out; return out;
} }
private:
static float clampMin(float v, float lo) {
return v < lo ? lo : v;
}
static int clampIndex(int idx, int count) {
if (count <= 0) return 0;
if (idx < 0) return 0;
if (idx >= count) return count - 1;
return idx;
}
static int wrapIndex(int idx, int count) {
if (count <= 0) return 0;
int m = idx % count;
if (m < 0) m += count;
return m;
}
}; };

View File

@@ -32,24 +32,19 @@ public:
r.checkedPanels = (int)panels.size(); r.checkedPanels = (int)panels.size();
for (const auto& p : panels) { for (const auto& p : panels) {
if (std::abs(p.spacing - baseline.spacing) > spacingTolerance) { if (std::abs(p.spacing - baseline.spacing) > spacingTolerance) {
r.pass = false; recordDrift(r, "spacing:" + p.panelId);
r.drifts.push_back("spacing:" + p.panelId);
} }
if (std::abs(p.elevation - baseline.elevation) > elevationTolerance) { if (std::abs(p.elevation - baseline.elevation) > elevationTolerance) {
r.pass = false; recordDrift(r, "elevation:" + p.panelId);
r.drifts.push_back("elevation:" + p.panelId);
} }
if (std::abs(p.border - baseline.border) > borderTolerance) { if (std::abs(p.border - baseline.border) > borderTolerance) {
r.pass = false; recordDrift(r, "border:" + p.panelId);
r.drifts.push_back("border:" + p.panelId);
} }
if (p.stateModelVersion != baseline.stateModelVersion) { if (p.stateModelVersion != baseline.stateModelVersion) {
r.pass = false; recordDrift(r, "state-model:" + p.panelId);
r.drifts.push_back("state-model:" + p.panelId);
} }
if (p.tokenVersion != baseline.tokenVersion) { if (p.tokenVersion != baseline.tokenVersion) {
r.pass = false; recordDrift(r, "token-version:" + p.panelId);
r.drifts.push_back("token-version:" + p.panelId);
} }
} }
return r; return r;
@@ -78,4 +73,10 @@ public:
} }
return h; return h;
} }
private:
static void recordDrift(ConsistencyReport& r, const std::string& drift) {
r.pass = false;
r.drifts.push_back(drift);
}
}; };

View File

@@ -32,12 +32,12 @@ class NotificationStatusRefresh {
public: public:
static NotificationStyle styleFor(NotifyLevel level) { static NotificationStyle styleFor(NotifyLevel level) {
switch (level) { switch (level) {
case NotifyLevel::Info: return {0.28f, 5.4f, 3.8f, 2400.0f, 5}; case NotifyLevel::Info: return makeStyle(0.28f, 5.4f, 3.8f, 2400.0f, 5);
case NotifyLevel::Warn: return {0.34f, 5.6f, 4.0f, 3200.0f, 5}; case NotifyLevel::Warn: return makeStyle(0.34f, 5.6f, 4.0f, 3200.0f, 5);
case NotifyLevel::Error: return {0.42f, 6.0f, 4.5f, 4200.0f, 6}; case NotifyLevel::Error: return makeStyle(0.42f, 6.0f, 4.5f, 4200.0f, 6);
case NotifyLevel::Critical: return {0.52f, 7.0f, 5.0f, 0.0f, 8}; case NotifyLevel::Critical: return makeStyle(0.52f, 7.0f, 5.0f, 0.0f, 8);
} }
return {0.3f, 5.0f, 3.5f, 2400.0f, 5}; return makeStyle(0.3f, 5.0f, 3.5f, 2400.0f, 5);
} }
static bool shouldExpire(const NotificationMessage& m, float nowMs) { static bool shouldExpire(const NotificationMessage& m, float nowMs) {
@@ -69,4 +69,19 @@ public:
static bool readable(const NotificationStyle& s) { static bool readable(const NotificationStyle& s) {
return s.textContrast >= 4.5f && s.iconContrast >= 3.0f; return s.textContrast >= 4.5f && s.iconContrast >= 3.0f;
} }
private:
static NotificationStyle makeStyle(float borderAlpha,
float textContrast,
float iconContrast,
float durationMs,
int maxStack) {
NotificationStyle s;
s.borderAlpha = borderAlpha;
s.textContrast = textContrast;
s.iconContrast = iconContrast;
s.defaultDurationMs = durationMs;
s.maxStack = maxStack;
return s;
}
}; };

View File

@@ -8528,3 +8528,32 @@ cross-panel consistency into a single summary signal.
- **Phase 26a (509-514):** 68/68 passing - **Phase 26a (509-514):** 68/68 passing
- **Phase 26b (515-519):** 60/60 passing - **Phase 26b (515-519):** 60/60 passing
- **Phase 26c (520-523):** 44/44 passing - **Phase 26c (520-523):** 44/44 passing
## Sprint 26 End Refactor Pass (Architecture Compliance)
Performed a dedicated post-sprint refactor pass focused on maintainability and
architecture-rule alignment without behavior changes.
**Refactors applied:**
- `editor/src/CompletionOverlayUXHardening.h`
- extracted shared helpers for clamping/index wrapping
- removed duplicated inline clamp/wrap logic
- `editor/src/NotificationStatusRefresh.h`
- factored repeated style construction into `makeStyle(...)`
- reduced duplicated initializer literals
- `editor/src/CrossPanelConsistencySweep.h`
- centralized drift recording in `recordDrift(...)`
- reduced repeated pass/fail mutation logic
**Architecture compliance audit:**
- Header size gate: PASS (`<=600` across audited sprint files)
- `goto` usage in runtime path: PASS (none in Sprint 26 modules)
- Stale TODO markers in Sprint 26 modules: PASS
- Header-only pattern for Sprint 26 additions: PASS
**Refactor verification run:**
- `cmake --build editor/build-native --target step520_test step521_test step522_test step523_test` - PASS
- `./editor/build-native/step520_test` - PASS (12/12)
- `./editor/build-native/step521_test` - PASS (12/12)
- `./editor/build-native/step522_test` - PASS (12/12)
- `./editor/build-native/step523_test` - PASS (8/8)