## Summary - add Spec 288 no-legacy route/helper and provider-core/role-authority guard coverage - extend the pinned Spec 281 and Spec 285 browser smokes plus lane/report classification wording for classification-only fallout handling - add the Spec 288 artifact package and contributor-facing quality-gate guidance while keeping Package Execution deferred to Spec 289 ## Validation - `export PATH="/bin:/usr/bin:/usr/local/bin:$PATH" && REPO_ROOT="$(git rev-parse --show-toplevel)" && (cd "$REPO_ROOT/apps/platform" && ./vendor/bin/sail artisan test --compact tests/Feature/Guards/Spec288NoLegacyRouteAndHelperGuardTest.php tests/Feature/Guards/Spec288ProviderCoreAndRoleAuthorityGuardTest.php tests/Feature/Guards/AdminWorkspaceRoutesGuardTest.php tests/Feature/Guards/ProviderBoundaryPlatformCoreGuardTest.php tests/Feature/ProviderConnections/LegacyRedirectTest.php tests/Feature/ManagedEnvironment/LegacyTenantCoreGuardTest.php tests/Feature/Spec080WorkspaceManagedTenantAdminMigrationTest.php tests/Feature/Rbac/ProviderConnectionWorkspaceFirstPolicyTest.php tests/Feature/Filament/ManagedEnvironmentAccessScopeManagementTest.php tests/Feature/Guards/BrowserLaneIsolationTest.php tests/Feature/Guards/CiLaneFailureClassificationContractTest.php tests/Feature/Guards/CiHeavyBrowserWorkflowContractTest.php tests/Unit/Auth/NoRoleStringChecksTest.php)` - `export PATH="/bin:/usr/bin:/usr/local/bin:$PATH" && REPO_ROOT="$(git rev-parse --show-toplevel)" && (cd "$REPO_ROOT/apps/platform" && ./vendor/bin/sail artisan test --compact tests/Browser/Spec281ProviderConnectionScopeSmokeTest.php tests/Browser/Spec285WorkspaceRbacEnvironmentAccessSmokeTest.php)` - `export PATH="/bin:/usr/bin:/usr/local/bin:$PATH" && REPO_ROOT="$(git rev-parse --show-toplevel)" && (cd "$REPO_ROOT/apps/platform" && ./vendor/bin/sail bin pint --dirty --format agent)` Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #347
18 KiB
Implementation Plan: Quality Gates / No-Legacy Enforcement
Branch: 288-quality-gates-no-legacy-enforcement | Date: 2026-05-10 | Spec: spec.md
Input: Feature specification from specs/288-quality-gates-no-legacy-enforcement/spec.md
Summary
Add the cutover enforcement layer that follows Spec 287 without reopening runtime work. The narrow implementation path adds bounded no-legacy and route-emission guards, forbids retired tenant-panel helper bootstrapping on owned seams, reinforces provider-core and role-authority boundaries, keeps targeted browser smoke proof on the current canonical admin/workspace surfaces, and documents that broader baseline fallout is classified only through existing lane/report seams instead of repaired under this spec.
This plan is intentionally not a runtime cutover package and not a Package Execution package. Filament remains v5 on Livewire v4, provider registration remains in apps/platform/bootstrap/providers.php, no new asset or deployment step is introduced, no new globally-searchable resource is created, no destructive-action contract changes are planned, and Spec 289 remains the explicit follow-up for Package Execution Contract work.
Inherited Baseline / Explicit Delta
Inherited baseline
- Spec
279established the managed-environment core cutover and remains historical context only. - Spec
280established workspace-first routing and route-family cleanup patterns. - Spec
281established provider-boundary groundwork and the current provider-connection browser smoke anchor. - Spec
282retargeted governance artifact surfaces and remains adjacent history only. - Spec
285established the workspace-role and environment-scope authority direction and the current RBAC browser smoke anchor. - Spec
286owns UI copy cleanup and remains explicitly out of scope here. - Spec
287completed the remaining runtime and helper prerequisites and explicitly handed quality gates and no-legacy enforcement to this spec.
Explicit delta in this plan
- Add one bounded guard pack for retired route/path families and retired tenant-panel helper patterns.
- Add one bounded guard pack for provider-core forbidden seams and environment-scope role-authority regressions.
- Extend the existing Spec
281and Spec285browser smokes so the guard pack keeps visible canonical route continuity honest. - Document the quality-gate contract and the rule that broader baseline/full-suite fallout is classified only, not repaired, under this spec.
- Keep Package Execution Contract explicitly deferred to Spec
289.
Technical Context
Language/Version: PHP 8.4.15, Laravel 12.52
Primary Dependencies: Pest 4, Filament 5.2.1, Livewire 4.1.4, existing guard-test seams, TestLaneManifest, TestLaneReport, and the current browser smoke suite
Storage: no new persistence; this package updates tests, contributor-facing documentation, and lane/report classification seams only
Testing: targeted Pest feature/unit guards, targeted browser validation, and formatting
Validation Lanes: heavy-governance, browser
Target Platform: Laravel monolith in apps/platform
Project Type: web application
Performance Goals: keep proof bounded to the named guard and browser files; no full-suite rerun or repair program
Constraints: no runtime cutover rewrites, no provider-core rewrite, no RBAC rewrite, no Package Execution work, no Guided Operations work, and no broad compatibility layer
Scale/Scope: one bounded enforcement slice over existing cutover-owned seams and contributor workflow documentation
Likely Affected Repo Surfaces
apps/platform/tests/Feature/Guards/Spec288NoLegacyRouteAndHelperGuardTest.phpapps/platform/tests/Feature/Guards/Spec288ProviderCoreAndRoleAuthorityGuardTest.phpapps/platform/tests/Feature/Guards/AdminWorkspaceRoutesGuardTest.phpapps/platform/tests/Feature/Guards/ProviderBoundaryPlatformCoreGuardTest.phpapps/platform/tests/Feature/Guards/BrowserLaneIsolationTest.phpapps/platform/tests/Feature/Guards/CiLaneFailureClassificationContractTest.phpapps/platform/tests/Feature/Guards/CiHeavyBrowserWorkflowContractTest.phpapps/platform/tests/Feature/ProviderConnections/LegacyRedirectTest.phpapps/platform/tests/Feature/ManagedEnvironment/LegacyTenantCoreGuardTest.phpapps/platform/tests/Feature/Spec080WorkspaceManagedTenantAdminMigrationTest.phpapps/platform/tests/Feature/Rbac/ProviderConnectionWorkspaceFirstPolicyTest.phpapps/platform/tests/Feature/Filament/ManagedEnvironmentAccessScopeManagementTest.phpapps/platform/tests/Unit/Auth/NoRoleStringChecksTest.phpapps/platform/tests/Pest.phpapps/platform/tests/Support/TestLaneManifest.phpapps/platform/tests/Support/TestLaneReport.phpapps/platform/tests/Browser/Spec281ProviderConnectionScopeSmokeTest.phpapps/platform/tests/Browser/Spec285WorkspaceRbacEnvironmentAccessSmokeTest.phpREADME.mdscripts/platform-test-report
Filament v5 / Surface Notes
- Livewire v4.0+ compliance: all touched surfaces remain on Filament v5 with Livewire v4.
- Provider registration location: provider registration remains in
apps/platform/bootstrap/providers.php; this package does not add a panel or move provider registration. - Global search rule: this package introduces no new globally-searchable resource and does not modify an existing resource's search surface.
- Destructive actions: no new destructive runtime action is introduced. Any touched browser smoke continues to observe existing destructive-action semantics only.
- Asset strategy: no new asset registration or deployment step is planned. Existing
php artisan filament:assetsexpectations remain unchanged because this package adds no assets.
Enforcement Fit
- Prefer exact retired route/path inventories over broad, ambiguous bans.
- Prefer explicit scan exclusions for immutable or historical material over open-ended allowlists.
- Prefer extending existing provider-boundary and role-authority tests over introducing a second policy or provider framework.
- Prefer targeted browser smoke on the two current high-signal cutover surfaces over a broader browser lane expansion.
- Prefer classification-only baseline/report wording over any ownership claim for unrelated full-suite repair.
UI / Surface Guardrail Plan
- Guardrail scope: browser proof and route continuity over existing canonical provider and workspace/environment surfaces only
- Native vs custom classification summary: existing native Filament resources and pages only; no new operator-facing surface
- Shared-family relevance: route emission continuity, environment access continuity, and contributor proof obligations
- State layers in scope: emitted URLs, browser-visible route continuity, test-support helper usage, provider-core seam inventories, and lane/report classification wording
- Audience modes in scope: maintainers and reviewers first; operator-facing surfaces are observed but not redesigned
- Decision/diagnostic/raw hierarchy plan: unchanged runtime disclosure; docs point maintainers to guard-first and browser-second proof
- Raw/support gating plan: provider-owned raw or support detail remains nested and out of platform-core enforcement seams
- One-primary-action / duplicate-truth control: no new action family is introduced
- Handling modes by drift class or surface: implementation-required for the named guards and browser smokes only; classification-only for broader baseline fallout
- Repository-signal treatment: review-mandatory, but bounded to cutover-owned seams
- Special surface test profiles: standard-native-filament, global-context-shell, browser-smoke
- Required tests or manual smoke: functional-core, targeted browser-smoke
- Exception path and spread control: any scan exception must be file-specific beyond the pinned historical exclusions
- Active feature PR close-out entry: NoLegacyGuardrail
Shared Pattern & System Fit
- Cross-cutting feature marker: yes
- Systems touched: guard tests, browser smoke tests, shared test helpers, lane/report classification seams, and contributor-facing quality-gate documentation
- Shared abstractions reused:
ProviderBoundaryCatalog,ProviderOperationRegistry, existing RBAC feature tests,TestLaneManifest,TestLaneReport, and the existing browser smoke anchors - New abstraction introduced? why?: none
- Why the existing abstraction was sufficient or insufficient: the abstractions already describe the current cutover truth; the missing piece is an explicit, bounded enforcement layer that uses them consistently.
- Bounded deviation / spread control: explicit exclusions for immutable or historical material only
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: N/A
- Queued DB-notification policy: N/A
- Terminal notification path: N/A
- Exception path: none
Provider Boundary & Portability Fit
- Shared provider/platform boundary touched?: yes
- Provider-owned seams: provider-specific identifiers, consent links, and diagnostics remain provider-owned nested detail only
- Platform-core seams: shared identity resolution and shared operation-definition contracts
- Neutral platform terms / contracts preserved:
provider connection,target scope,workspace,managed environment - Retained provider-specific semantics and why: current-release provider flows still need provider-owned nested detail, but the platform-core guard layer must not depend on it
- Bounded extraction or follow-up path: Spec
289for Package Execution Contract work after this enforcement baseline lands
Constitution Check
GATE: Must pass before implementation begins and again after design artifacts are complete.
- Inventory-first: PASS. No new inventory or snapshot truth is introduced.
- Read/write separation: PASS. The package adds guardrails and documentation only.
- Graph contract path: PASS by preservation. No new Graph integration surface is introduced.
- Deterministic capabilities: PASS by preservation. Capability families do not expand.
- RBAC-UX: PASS. Workspace membership remains role-bearing and environment scope remains narrowing-only.
- Workspace isolation: PASS. The package reinforces existing route and entitlement isolation.
- Managed-environment isolation: PASS. Wrong-scope and in-scope denial semantics remain distinct.
- Run observability: PASS. No new OperationRun behavior is introduced.
- OperationRun start UX: PASS. N/A for this package.
- Data minimization: PASS. No new persistence or ledger is introduced.
- Test governance: PASS. The proof set is explicit and bounded.
- Proportionality / no premature abstraction: PASS. Existing guard and report seams are extended instead of replaced.
- Persisted truth / behavioral state: PASS. No new state family is introduced.
- Provider boundary: PASS. Shared provider-boundary enforcement becomes stricter without widening runtime coupling.
Gate evaluation: PASS.
Post-design re-check: PASS while spec.md, plan.md, tasks.md, and quickstart.md keep the same literal proof commands and while the supporting artifacts keep the same retired-route, helper, provider-boundary, role-authority, and classification-only boundary.
Test Governance Check
- Test purpose / classification by changed surface: Feature, Browser
- Affected validation lanes: heavy-governance, browser
- Why this lane mix is the narrowest sufficient proof: route/helper scans and classification contracts are broad guard work, while visible route continuity belongs in targeted browser smoke. Anything broader would be a different package.
- Narrowest proving command(s):
export PATH="/bin:/usr/bin:/usr/local/bin:$PATH" && REPO_ROOT="$(git rev-parse --show-toplevel)" && (cd "$REPO_ROOT/apps/platform" && ./vendor/bin/sail artisan test --compact tests/Feature/Guards/Spec288NoLegacyRouteAndHelperGuardTest.php tests/Feature/Guards/Spec288ProviderCoreAndRoleAuthorityGuardTest.php tests/Feature/Guards/AdminWorkspaceRoutesGuardTest.php tests/Feature/Guards/ProviderBoundaryPlatformCoreGuardTest.php tests/Feature/ProviderConnections/LegacyRedirectTest.php tests/Feature/ManagedEnvironment/LegacyTenantCoreGuardTest.php tests/Feature/Spec080WorkspaceManagedTenantAdminMigrationTest.php tests/Feature/Rbac/ProviderConnectionWorkspaceFirstPolicyTest.php tests/Feature/Filament/ManagedEnvironmentAccessScopeManagementTest.php tests/Feature/Guards/BrowserLaneIsolationTest.php tests/Feature/Guards/CiLaneFailureClassificationContractTest.php tests/Feature/Guards/CiHeavyBrowserWorkflowContractTest.php tests/Unit/Auth/NoRoleStringChecksTest.php)export PATH="/bin:/usr/bin:/usr/local/bin:$PATH" && REPO_ROOT="$(git rev-parse --show-toplevel)" && (cd "$REPO_ROOT/apps/platform" && ./vendor/bin/sail artisan test --compact tests/Browser/Spec281ProviderConnectionScopeSmokeTest.php tests/Browser/Spec285WorkspaceRbacEnvironmentAccessSmokeTest.php)export PATH="/bin:/usr/bin:/usr/local/bin:$PATH" && REPO_ROOT="$(git rev-parse --show-toplevel)" && (cd "$REPO_ROOT/apps/platform" && ./vendor/bin/sail bin pint --dirty --format agent)
- Fixture / helper / factory / seed / context cost risks: low to moderate only because the package relies on explicit source-scan inventories and the current browser fixtures.
- Expensive defaults or shared helper growth introduced?: no; the guard pack should reduce legacy helper spread, not add new implicit defaults.
- Heavy-family additions, promotions, or visibility changes: none beyond the bounded cutover guard files and the matching classification wording.
- Surface-class relief / special coverage rule:
standard-native-filament,global-context-shell, andbrowser-smokeremain sufficient; no broader browser lane ownership is justified. - Closing validation and reviewer handoff: rerun the exact commands above, verify Filament stays on Livewire v4, provider registration remains in
apps/platform/bootstrap/providers.php, no global-search or asset drift was added, no destructive-action contract drift was introduced, and confirm Spec289remains the Package Execution follow-up. - Budget / baseline / trend follow-up: classification-only; no full-suite refresh or repair ownership is taken here.
- Review-stop questions: did the implementation widen into runtime cutover, provider-core rewrite, RBAC rewrite, UI copy cleanup, review-pack export, package execution, guided operations, or full-suite repair?
- Escalation path:
document-in-featurefor bounded classification wording,reject-or-splitfor scope expansion - Active feature PR close-out entry: NoLegacyGuardrail
Review Checklist Status
- Review checklist artifact:
checklists/requirements.md - Review outcome class:
acceptable-special-case - Workflow outcome:
keep - Test-governance outcome:
keep - Resolution note: the package is implementation-ready as a bounded enforcement slice following Spec
287 - Escalation rule: if implementation starts repairing unrelated full-suite failures or reopening runtime cutover work, stop and split the work out of
288
Rollout Considerations
- Land the route/helper guard inventories before touching browser-smoke or classification docs so the core enforcement vocabulary stabilizes first.
- Keep provider-core and role-authority enforcement adjacent so reviewers can judge shared-boundary and authorization truth together.
- Update contributor-facing quality-gate guidance only after the final proof-command set is stable.
- Do not let baseline classification wording imply ownership of unrelated full-suite repair.
Risk Controls
- Reject any implementation that broad-bans all
/admin/t/...paths instead of the exact retired management-only families already defined by the cutover. - Reject any implementation that solves helper enforcement by leaving open-ended or directory-wide allowlists.
- Reject any implementation that rewrites provider-core runtime services instead of extending the guard inventory.
- Reject any implementation that changes RBAC behavior instead of proving the current workspace-role and environment-scope contract.
- Reject any implementation that promotes
288into a full-suite stabilization effort.
Research & Design Outputs
research.mdrecords the guard-first decisions, explicit exclusions, and rejected full-suite repair alternative.data-model.mdcaptures the exact guard categories, forbidden pattern families, and classification-only boundary.quickstart.mdgives reviewers the scope boundary, review scenarios, and exact targeted proof commands.contracts/quality-gates-no-legacy-enforcement.logical.openapi.yamlmodels the logical enforcement contracts and the targeted validation authority.checklists/requirements.mdrecords the review outcome, bounded scope rules, and the explicit Spec289follow-up.
Project Structure
Documentation (this feature)
specs/288-quality-gates-no-legacy-enforcement/
├── checklists/
│ └── requirements.md
├── contracts/
│ └── quality-gates-no-legacy-enforcement.logical.openapi.yaml
├── data-model.md
├── plan.md
├── quickstart.md
├── research.md
├── spec.md
└── tasks.md
Source Code (repository root)
apps/platform/
├── app/
├── tests/
│ ├── Browser/
│ ├── Feature/
│ ├── Support/
│ └── Unit/
└── routes/
scripts/
├── platform-test-lane
└── platform-test-report
Structure Decision: keep the package inside the existing Laravel tests, support, and wrapper structure. Extend the current guard, browser, and lane/report seams instead of creating a new enforcement subsystem or documentation tree.