Added UiBloatRegressionGuardTest to enforce known UI bloat and customer/auditor safety regression patterns across configured runtime UI source paths as defined in Spec 375. Registered the test in Pest.php and added to TestLaneManifest. Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #446
17 KiB
Implementation Plan: UI Bloat Regression Guard v1
Branch: 375-ui-bloat-regression-guard | Date: 2026-06-13 | Spec: specs/375-ui-bloat-regression-guard/spec.md
Input: Feature specification from specs/375-ui-bloat-regression-guard/spec.md
Summary
Build a narrow repository guard that scans TenantPilot UI source paths for known UI bloat and customer/auditor safety regression patterns from Specs 368 and 370-374. The implementation should prefer existing Pest guard conventions and surface-guard lane ownership, create spec-local rule/design/allowlist/scan artifacts, run an initial scan in warn mode, and avoid any runtime UI page refactor.
Technical Context
Language/Version: PHP 8.4.15, Laravel 12.52, Filament 5.2.1, Livewire 4.1.4
Primary Dependencies: Pest 4.3, PHPUnit 12, existing Laravel/Filament app and test harness
Storage: N/A - no database or product persistence; spec-local Markdown reports only
Testing: Pest guard/source-scan tests preferred; optional Artisan command test only if a command is selected
Validation Lanes: heavy-governance / surface-guard by default; targeted command/test for local validation
Target Platform: local Laravel app and Gitea-compatible CI runners
Project Type: Laravel monolith under apps/platform plus repo-level scripts/docs
Performance Goals: deterministic local scan; no browser, DB, provider, queue, or network dependency
Constraints: no runtime UI refactor; no fast-feedback lane pollution unless scan cost is proven narrow; hard-fail only clear customer/auditor default-surface leakage in v1
Scale/Scope: configured scan over selected UI source directories, not full repository or generated assets
UI / Surface Guardrail Plan
- Guardrail scope: workflow-only guardrail change.
- Affected routes/pages/actions/states/navigation/panel/provider surfaces: none.
- No-impact class, if applicable: tooling-only / test-only / documentation-artifact change.
- Native vs custom classification summary: N/A - no rendered UI.
- Shared-family relevance: status messaging, header actions, dashboard/stat cards, evidence/report viewers, customer/auditor defaults, diagnostic entrypoints.
- State layers in scope: none for runtime; source-scan surface classification only.
- Audience modes in scope: customer/read-only, operator-MSP, support-platform as scanner classifications.
- Decision/diagnostic/raw hierarchy plan: derive guard rules from Spec 370-374 hierarchy: decision/customer-safe content first, diagnostics second, support/raw third.
- Raw/support gating plan: guard reports raw/support terms in customer/auditor defaults as blocking or manual review depending on context/allowlist.
- One-primary-action / duplicate-truth control: scanner flags missing primary question/next action, header action overload, repeated status/lifecycle/timestamp/count noise, and zero-card spam.
- Handling modes by drift class or surface: clear customer/auditor leakage is hard-stop candidate; diagnostic/operator ambiguity is review-mandatory; allowlisted legacy debt is report-only.
- Repository-signal treatment: report/warn by default, future hard-stop candidate for additional rules after allowlist cleanup.
- Special surface test profiles: surface-guard; no browser smoke.
- Required tests or manual smoke: targeted source-scan fixture/sample coverage and initial scan report.
- Exception path and spread control: allowlist entries must be explicit, reasoned, reviewed, and scoped by rule/file/pattern.
- Active feature PR close-out entry: Guardrail.
- UI/Productization coverage decision: No UI surface impact.
- Coverage artifacts to update: none.
- No-impact rationale: no reachable UI is added, removed, renamed, or materially changed.
- Navigation / Filament provider-panel handling: no panel/provider changes.
- Screenshot or page-report need: no; guard-only spec.
Shared Pattern & System Fit
- Cross-cutting feature marker: yes, because the guard reviews cross-surface UI interaction classes; no runtime shared interaction family changes.
- Systems touched: likely
apps/platform/tests/Feature/Guards,apps/platform/tests/Architecture,apps/platform/tests/Pest.php,apps/platform/tests/Support/TestLaneManifest.phpwhen heavy-governance ownership is selected, optionalapps/platform/app/Console/Commands, optional repo scripts, and spec-local artifacts. - Shared abstractions reused: existing source-scan guard patterns, Pest group/lane conventions, and
scripts/check-ui-productization-coverageas a reference for report/fail behavior. - New abstraction introduced? why?: at most one narrow scanner helper or guard test. It is justified only if inline test code would be too duplicated or unreadable.
- Why the existing abstraction was sufficient or insufficient: current UI coverage guard checks acknowledgement of UI impact, not source content bloat or customer-safety leakage.
- Bounded deviation / spread control: no product runtime abstraction; no framework under
app/Supportunless implementation proves test-local code is insufficient.
OperationRun UX Impact
- Touches OperationRun start/completion/link UX?: no.
- Central contract reused: N/A.
- Delegated UX behaviors: N/A.
- Surface-owned behavior kept local: none.
- Queued DB-notification policy: N/A.
- Terminal notification path: N/A.
- Exception path: none.
Provider Boundary & Portability Fit
- Shared provider/platform boundary touched?: no runtime provider seam.
- Provider-owned seams: N/A.
- Platform-core seams: N/A.
- Neutral platform terms / contracts preserved: guard language must describe provider/internal term leakage rather than making provider-specific labels platform truth.
- Retained provider-specific semantics and why: provider terms can remain legitimate in provider-owned diagnostic/operator surfaces and should be manual-review/allowlisted there.
- Bounded extraction or follow-up path: none.
Constitution Check
GATE: Must pass before implementation. Re-check after guard design is finalized.
- Inventory-first: N/A - no inventory/snapshot behavior.
- Read/write separation: passes - no product write/change function; guard only reads source files and writes spec-local reports.
- Graph contract path: passes - no Graph calls.
- Deterministic capabilities: N/A - no capability resolver changes.
- RBAC-UX: passes - no authorization behavior changes; future implementation must not treat UI visibility as security.
- Workspace isolation: passes - no runtime workspace/tenant queries.
- Tenant isolation: passes - no tenant-owned data reads.
- Run observability: passes - no long-running remote/queued work and no OperationRun semantics.
- OperationRun start UX: N/A.
- Data minimization: guard reports must not include secrets, credentials, provider raw responses, or sensitive customer data.
- Test governance: surface-guard/heavy-governance classification is explicit; no hidden browser/DB fixtures.
- Proportionality: one narrow guard is justified by current UI safety/productization risk.
- No premature abstraction: prefer a single test/scanner path; avoid reusable framework unless needed for readability and tests.
- Persisted truth: no product persistence; spec-local reports only.
- Behavioral state: rule IDs are tooling diagnostics, not product state.
- UI semantics: guard consumes Spec 370-374 UI semantics and must not create a new UI interpretation framework.
- Shared pattern first: reuse existing guard/test/script conventions.
- Provider boundary: provider terms are scanner indicators only.
- V1 explicitness / few layers: direct text scanning and simple heuristics preferred over AST-heavy or browser-required tooling.
- Spec discipline / bloat check: proportionality review is complete.
- Filament-native UI: no rendered Filament UI changes; if implementation touches Filament source only by scanning it, no asset or provider updates are needed.
- UI/Productization coverage: no-impact decision is checked and rationalized.
Test Governance Check
- Test purpose / classification by changed surface: Heavy-Governance / surface-guard for broad source scanning; unit-like sample cases may live inside the guard test.
- Affected validation lanes: heavy-governance or explicit targeted guard test/command; no browser lane.
- Why this lane mix is the narrowest sufficient proof: The feature protects cross-surface source patterns and does not render UI.
- Narrowest proving command(s):
cd apps/platform && php vendor/bin/pest tests/Feature/Guards/UiBloatRegressionGuardTest.phpor exact selected guard file.- If heavy-governance ownership is registered: targeted lane manifest/placement contract coverage proving the guard is discoverable by
test:heavy, or a documented targeted-only validation if not registered. - If an Artisan command is selected:
cd apps/platform && php artisan tenantpilot:check-ui-bloat --strictness=warn. git diff --check.cd apps/platform && php vendor/bin/pint --dirtyif PHP changed.
- Fixture / helper / factory / seed / context cost risks: none expected; use source fixture strings/files only.
- Expensive defaults or shared helper growth introduced?: no; any scanner helper must avoid DB/application boot beyond what Pest already needs.
- Heavy-family additions, promotions, or visibility changes: one new bounded surface-guard family or test.
- Surface-class relief / special coverage rule: no product page browser smoke.
- Closing validation and reviewer handoff: reviewer confirms no runtime UI refactor, no raw hard-fail expansion beyond customer/auditor defaults, no hidden fast-feedback lane cost, and report artifacts are complete.
- Budget / baseline / trend follow-up: record guard runtime and lane impact in validation report.
- Review-stop questions: lane fit, breadth, false positives, allowlist quality, hidden cost, and scope creep.
- Escalation path: document-in-feature; follow-up-spec only if CI hardening or browser integration becomes structural.
- Active feature PR close-out entry: Guardrail.
- Why no dedicated follow-up spec is needed: v1 guard setup is bounded; follow-up specs are limited to browser fixture coverage, scorecard integration, and CI strictness expansion.
Project Structure
Documentation (this feature)
specs/375-ui-bloat-regression-guard/
|-- spec.md
|-- plan.md
|-- tasks.md
|-- checklists/
| `-- requirements.md
`-- artifacts/
|-- source-summary.md
|-- guard-rules.md
|-- scanner-design.md
|-- allowlist-policy.md
|-- initial-scan-report.md
|-- affected-files.md
|-- validation-report.md
`-- follow-up-recommendations.md
Likely Source/Test Surfaces
apps/platform/tests/Feature/Guards/
apps/platform/tests/Architecture/
apps/platform/tests/Pest.php
apps/platform/tests/Support/TestLaneManifest.php # if heavy-governance lane ownership is selected
apps/platform/app/Console/Commands/ # only if command is narrower than Pest-only guard
scripts/ # only if repo-level script is chosen
Initial Scan Scope
apps/platform/app/Filament
apps/platform/resources/views/filament
apps/platform/app/Support/EnvironmentDashboard
apps/platform/app/Support/Navigation
apps/platform/app/Support/OpsUx
apps/platform/app/Support/SupportDiagnostics
apps/platform/app/Support/Ui
apps/platform/app/Support/Workspaces
Candidate paths apps/platform/resources/views/components and apps/platform/app/View are not present in current repo truth and must be recorded as not available if still absent during implementation. Additional apps/platform/app/Support subpaths may be added only when scanner-design.md documents why they are UI-support paths; apps/platform/app/Support must not be scanned wholesale in v1.
Exclusions / Separate Classification
vendor
node_modules
storage
bootstrap/cache
public/build
database dumps
spec artifacts
screenshots
generated reports
tests unless explicitly used as scanner fixtures
translation dictionaries unless implementation proves rendered default UI copy is being checked
Structure Decision: Use a single repo-conform guard entrypoint. Prefer apps/platform/tests/Feature/Guards/UiBloatRegressionGuardTest.php because existing broad UI/source guard tests live under tests/Feature/Guards. If the guard is intended to run in test:heavy, it must be grouped in apps/platform/tests/Pest.php and registered as a surface-guard family/hotspot in apps/platform/tests/Support/TestLaneManifest.php; otherwise the source summary and validation report must document targeted-only ownership.
Complexity Tracking
| Violation | Why Needed | Simpler Alternative Rejected Because |
|---|---|---|
| New source scanner/guard | Existing UI coverage guard does not detect specific bloat/customer-safety copy patterns | Manual checklist alone does not reliably catch cross-surface drift |
| Rule IDs and allowlist policy | Findings need stable review language and controlled exceptions | Unstructured grep output would be noisy and unactionable |
Proportionality Review
- Current operator problem: Future UI work can reintroduce unsafe customer/auditor copy and noisy, unprioritized surfaces without early review feedback.
- Existing structure is insufficient because:
scripts/check-ui-productization-coverageproves coverage acknowledgement, not the content quality of changed source. - Narrowest correct implementation: One source scanner/test/command, ten bounded rule groups, warn default, hard-fail only clear customer/auditor leakage, and spec-local artifacts.
- Ownership cost created: Rule maintenance, initial scan debt triage, allowlist review, and one guard lane/test.
- Alternative intentionally rejected: Full browser visual regression and broad screenshot diffs are too expensive and unnecessary for v1; page refactors are explicitly not this spec.
- Release truth: Current-release truth protecting completed UI productization.
Implementation Phases
Phase 1 - Repo Truth And Source Inputs
Verify existing guard/test/script conventions, existing console command patterns, Spec 368 inputs, and Spec 370-374 artifacts. Record available and missing inputs in artifacts/source-summary.md.
Phase 2 - Guard Rules And Design Artifacts
Create guard-rules.md, scanner-design.md, and allowlist-policy.md before runtime/tooling changes so review can stop scope growth early.
Phase 3 - Tests First / Fixture Cases
Add targeted sample cases proving customer/auditor hard failures, manual-review heuristics, allowlist shape, and strictness behavior.
Phase 4 - Scanner / Entrypoint Implementation
Implement one repo-conform entrypoint. Prefer Pest guard unless final discovery proves Artisan command or script is narrower.
Phase 5 - Initial Scan And Report
Run the guard in warn mode, generate initial-scan-report.md, and classify findings without broad UI fixes.
Phase 6 - Validation And Close-Out Artifacts
Complete affected files, validation report, follow-up recommendations, and run targeted validation commands.
Deployment / Ops Considerations
- Environment variables: none.
- Migrations: none.
- Queues/scheduler: none.
- Storage/volumes: none.
- Filament assets: no registered assets expected;
filament:assetsis not required unless implementation unexpectedly registers assets, which should be treated as scope drift. - CI: v1 may run as a targeted guard or report-only heavy-governance check. Do not make broad heuristic failures CI-blocking before allowlist cleanup.
Filament v5 Output Contract
- Livewire v4.0+ compliance: The app has Livewire 4.1.4; this spec must not introduce Livewire v3 references.
- Provider registration location: No panel providers are changed. If an implementation unexpectedly touches panel providers, Laravel 12 registration remains
apps/platform/bootstrap/providers.php. - Global search: No resources or global search behavior are changed.
- Destructive actions: No destructive/high-impact actions are added or changed. Any existing destructive actions observed by scanner remain runtime-owned and must retain confirmation, authorization, and audit behavior.
- Asset strategy: No new Filament assets. No deploy
filament:assetsimpact expected. - Testing plan: targeted Pest/source-scan guard or selected command test; no browser smoke required.
Risk Controls
- Keep scanner deterministic and text-based.
- Default ambiguous findings to manual review.
- Keep hard failures narrow.
- Separate existing debt from new blocking failures.
- Do not auto-fix files.
- Document every allowlist entry.
- Record any chosen implementation option and rejected alternatives.