## 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
6.3 KiB
6.3 KiB
Research: Quality Gates / No-Legacy Enforcement
Decision 1: Spec 288 owns enforcement only, not runtime completion
- Use this package to enforce the post-
287cutover truth through bounded guard tests, targeted browser smoke, and contributor-facing quality-gate docs. - Do not reopen route migration, provider-core runtime rewrites, RBAC redesign, or any product-surface rewrite here.
- Keep Spec
289explicitly reserved for Package Execution Contract work.
Decision 2: Guard exact retired route/path families instead of broad /admin/t bans
- The cutover still has valid canonical managed-environment routes, so the guard layer must forbid only the exact retired management-only families and duplicate-prefix emissions.
- The enforcement inventory should pin concrete forbidden shapes such as
/admin/tenants/{tenant:slug}/provider-connections...,/admin/t/{tenant}/provider-connections,/admin/t/{tenant}/required-permissions,/admin/t/{tenant}/memberships, and duplicate/admin/t/t/{tenant}/...emissions. - Do not turn this package into a blanket ban on every surviving
/admin/t/...route without repo proof that the whole family is retired.
Decision 3: Helper enforcement targets retired panel bootstrapping, not generic tenant vocabulary
- The risk to guard is the return of retired tenant-panel bootstrapping semantics, not the presence of every
tenant-named helper or variable. - Guard scans should target direct
tenantpanel selection, retired bootstrapping helpers such assetTenantPanelContext(), and any similar owned-seam helper that would recreate panel-era assumptions. - Any exception beyond pinned historical directories must be file-scoped and justified.
Decision 4: Provider-core enforcement should reuse existing boundary seams
- Reuse
ProviderBoundaryCatalog,ProviderOperationRegistry, and the current provider-boundary tests instead of inventing a new provider-core validator. - The enforcement targets are shared identity resolution and shared operation-definition seams where provider-specific request shaping or provider binding truth would be a regression.
- Provider-owned nested detail remains allowed only where the provider itself is the subject.
Decision 5: Role-authority enforcement should prove current semantics, not redesign them
- Reuse the existing workspace-first policy and managed-environment scope tests to prove the current contract remains true.
- The core invariants are: workspace membership is the only role-bearing authority, wrong-scope denials stay
404, in-scope capability denials stay403, and direct role edits on managed-environment scope rows remain rejected. - Do not let this package become an RBAC rewrite.
Decision 6: Targeted browser proof should stay anchored to the current Spec 281 and Spec 285 smoke tests
- The two highest-signal user-visible anchors already exist in
apps/platform/tests/Browser/Spec281ProviderConnectionScopeSmokeTest.phpandapps/platform/tests/Browser/Spec285WorkspaceRbacEnvironmentAccessSmokeTest.php. - Extend those tests to keep canonical route continuity honest after the new guard pack lands.
- Do not widen the browser lane beyond those named surfaces under this spec.
Decision 7: Broader baseline fallout is classified only through the current lane/report seams
- Use
apps/platform/tests/Support/TestLaneManifest.php,apps/platform/tests/Support/TestLaneReport.php, and the existing classification-contract tests to describe how cutover guard or browser failures should be reported. - Do not run or own a full-suite repair program here.
- README guidance should point contributors to the targeted proof commands and the classification-only boundary.
Rejected Alternatives
Rejected: absorb runtime cutover repair into 288
That would collapse the intentional 287 / 288 split and make it impossible to tell whether the package is guardrail work or unfinished runtime work.
Rejected: ban every tenant-named helper or route token globally
That would create false positives and force ad hoc exceptions because some canonical managed-environment flows still use bounded tenant-language or route segments legitimately.
Rejected: introduce a new linting or baseline-report framework
The repo already has working guard, browser, manifest, and report seams. A second framework would increase ownership cost without improving the cutover signal.
Rejected: take ownership of full-suite repair under the label of “baseline classification”
The user explicitly excluded full-suite repair work. Classification is in scope; broad stabilization is not.
Evidence Anchors
apps/platform/tests/Feature/ProviderConnections/LegacyRedirectTest.phpalready proves one retired provider-management path family must stay404without redirects.apps/platform/tests/Feature/ManagedEnvironment/LegacyTenantCoreGuardTest.phpalready proves the legacytenantpanel is gone at runtime, but it does not yet own the full helper and route inventory.apps/platform/tests/Feature/Guards/ProviderBoundaryPlatformCoreGuardTest.phpalready guards one provider-boundary seam and current provider operation definitions.apps/platform/tests/Feature/Rbac/ProviderConnectionWorkspaceFirstPolicyTest.phpandapps/platform/tests/Feature/Filament/ManagedEnvironmentAccessScopeManagementTest.phpalready prove the intended role-authority semantics.apps/platform/tests/Feature/Guards/BrowserLaneIsolationTest.php,apps/platform/tests/Feature/Guards/CiLaneFailureClassificationContractTest.php,apps/platform/tests/Feature/Guards/CiHeavyBrowserWorkflowContractTest.php,apps/platform/tests/Support/TestLaneManifest.php, andapps/platform/tests/Support/TestLaneReport.phpalready define the current classification/report seams.README.mdalready documents lane ownership and budgets, making it the right place for the contributor-facing quality-gate rule.
Implementation Boundary Summary
- The package is implementation-ready only when the enforcement layer stays inside the named guard, browser, and documentation seams.
- If implementation starts changing live provider-core behavior, RBAC behavior, or unrelated product flows to make the guards pass, stop and split that work out of
288. - The canonical executable command set lives only in
spec.md,plan.md,tasks.md, andquickstart.md; this note references that authority without restating a second variant.