## Summary - add the Spec 340 browser verification gate package for the post-338/339 workspace and environment scope contract - add a bounded Pest browser smoke that verifies clean workspace origin, environment origin, explicit `environment_id` hub filtering, remembered-environment non-authority, and Provider Connections create/view/edit authority signals - record the verification inventory, matrix, findings, checklist, and audit report under `specs/340-post-scope-contract-browser-verification-gate/` - document a `GO` recommendation with no confirmed P1/P2 drift and one backlog wording follow-up - keep the change verification-only with no runtime behavior, schema, or route-family changes ## Validation - `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Browser/Spec340PostScopeContractVerificationSmokeTest.php` - `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/ProviderConnections --filter=ScopeHardening` - `cd apps/platform && ./vendor/bin/sail bin pint --dirty --format agent` - `git diff --check --no-index /dev/null apps/platform/tests/Browser/Spec340PostScopeContractVerificationSmokeTest.php` - `git diff --check` ## Notes - Livewire v4 compliance unchanged - Filament provider registration remains in `apps/platform/bootstrap/providers.php` - no globally searchable resource behavior changed - no destructive action behavior changed or executed in this verification gate - no new Filament assets; deploy `filament:assets` posture is unchanged Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #411
12 KiB
Implementation Plan: Spec 340 - Post-Scope Contract Browser Verification Gate
- Branch:
340-post-scope-contract-browser-verification-gate - Date: 2026-05-31
- Spec:
specs/340-post-scope-contract-browser-verification-gate/spec.md - Input: User-provided Spec 340 draft and repo inspection after Specs 338 and 339.
Summary
Prepare and later execute a browser-level scope/IA verification gate after Specs 338 and 339. The implementation work is verification-first: create Spec 340 audit artifacts, run browser checks against in-scope surfaces, classify findings, and return a go/no-go recommendation before new feature work resumes.
The planned implementation must not start with runtime fixes. Runtime code changes are allowed only after browser/test evidence proves a narrow P1/P2 contract break and the active Spec 340 artifacts are updated or a follow-up spec is split.
Technical Context
- Language/Version: PHP 8.4.15, Laravel 12.52.x.
- Primary Dependencies: Filament 5.2.x, Livewire 4.1.x, Pest 4.x browser testing, PostgreSQL through Sail.
- Storage: no runtime storage change; Spec-local Markdown artifacts only.
- Testing: browser verification, optional focused Pest Browser test, optional targeted Feature tests for Provider Connections or route/query classification.
- Validation Lanes: browser, optional fast-feedback. No PostgreSQL lane unless a later bounded runtime fix touches DB behavior.
- Target Platform: local Sail for verification; Dokploy/runtime deployment posture unchanged.
- Project Type: Laravel monolith under
apps/platform. - Performance Goals: verification should avoid broad suite expansion and keep any new browser test bounded to representative surfaces.
- Constraints: no migrations, env vars, queues, scheduler, storage, provider/OAuth changes, new packages, new persisted truth, or broad UI redesign in this gate.
- Scale/Scope: in-scope representative surfaces are the post-338/339 workspace/environment scope contract surfaces, not the full application.
UI / Surface Guardrail Plan
- Guardrail scope: verification-only, no planned operator-facing surface change.
- Affected routes/pages/actions/states/navigation/panel/provider surfaces: browser-inspected Workspace Sidebar, Environment Sidebar, Topbar, Workspace Hubs, Provider Connections, Baselines, Evidence, Operations, Alerts, Audit Log, Reviews, Governance Inbox, Decision Register, and related environment-to-hub links.
- No-impact class: QA/spec-artifact-only unless browser evidence proves a narrow runtime contract break.
- Native vs custom classification summary: current native/custom surfaces are inspected, not changed.
- Shared-family relevance: navigation entry points, scope presentation, action links, local filters, Provider Connection authority.
- State layers in scope: shell, sidebar, topbar, page header, URL query, local filter state, reload/back-forward state.
- Audience modes in scope: operator/MSP admin; customer-safe review surfaces are inspected only for scope/truth signals where reachable.
- Dangerous action posture: no destructive action execution is planned. Credential-adjacent Provider Connection actions are inspected for confirmation/authorization affordance and record-derived scope only.
- Coverage artifact posture: no UI coverage registry update is expected unless implementation makes a runtime UI change. The go/no-go report records checked no-impact if verification-only.
Current Repo Surfaces To Inspect
Implementation should inspect these surfaces and helpers before browser execution:
apps/platform/routes/web.phpapps/platform/app/Providers/Filament/AdminPanelProvider.phpapps/platform/app/Support/Navigation/AdminSurfaceScope.phpapps/platform/app/Support/Navigation/WorkspaceHubRegistry.phpapps/platform/app/Support/Navigation/WorkspaceHubEnvironmentFilter.phpapps/platform/app/Support/Navigation/WorkspaceSidebarNavigation.phpapps/platform/app/Support/ManagedEnvironmentLinks.phpapps/platform/app/Support/OperationRunLinks.phpapps/platform/app/Support/Workspaces/WorkspaceContext.phpapps/platform/app/Filament/Pages/EnvironmentDashboard.phpapps/platform/app/Filament/Pages/Monitoring/Operations.phpapps/platform/app/Filament/Pages/Monitoring/EvidenceOverview.phpapps/platform/app/Filament/Resources/ProviderConnectionResource.phpapps/platform/app/Policies/ProviderConnectionPolicy.php- existing browser tests under
apps/platform/tests/Browser/Spec314*,Spec316*,Spec322*,Spec338*, and Provider Connection browser tests.
Shared Pattern & System Fit
- Shared patterns reused: existing workspace/environment scope contract,
environment_idlocal filter semantics, deny-as-not-found authorization posture, existing browser smoke patterns, and Spec 322 browser harness patterns where applicable. - New abstraction introduced?: none.
- New persisted truth introduced?: none.
- Provider boundary: verify platform-core authority (
workspace,environment_id, record ownership) stays separate from provider-owned Microsoft tenant identity. - OperationRun: verify Operations hub/link scope only; no OperationRun lifecycle or notification changes.
- Audit/observability: the go/no-go report is the evidence artifact for this gate; no runtime
AuditLogwrites are introduced.
Implementation Approach
Phase 1 — Preflight and completed-spec guardrail
- Confirm current branch, clean working tree, baseline commit, and that related completed specs are read-only context.
- Confirm no existing
specs/340-*package or340-*branch existed before this preparation. - Re-read
spec.md,plan.md,tasks.md, constitution, and relevant guidelines.
Phase 2 — Repo discovery and verification matrix setup
- Create Spec 340 artifacts:
surface-inventory.mdscope-verification-matrix.mdfindings.mdaudit-report.mdartifacts/screenshots/if screenshots are captured.
- Populate first-pass route/surface inventory from repo files and existing route list.
- Classify each surface into Workspace-owned source of truth, Workspace Hub with local environment filter, Environment-owned detail surface, or credential-adjacent provider surface.
Phase 3 — Browser verification
- Resolve the local app URL through Laravel Boost
get_absolute_urlor documented local/Sail configuration. - Use existing smoke-login or seeded fixture conventions without modifying seeders.
- Verify:
- clean Workspace origin,
- Environment Dashboard origin,
- environment-to-hub filtered entry,
- clean hub entry with remembered environment,
- reload and browser back/forward,
- Topbar workspace/environment selector semantics,
- Provider Connections create/list/view/edit/action affordances.
Phase 4 — Finding classification
- Classify each matrix row as pass, P1, P2, P3, backlog, blocked, or not applicable.
- P1 means a critical scope/authority error or credential-adjacent ambiguity blocks feature work.
- P2 means contract drift should be fixed soon but does not expose immediate credential/security risk.
- P3 means polish/cleanup.
- Backlog means non-blocking improvement or broader productization.
- Blocked means missing route/data/tooling prevented proof and requires explicit next action.
Phase 5 — Optional focused regression coverage
Add focused Pest Browser coverage only if automation is stable and valuable:
- Prefer one bounded
Spec340PostScopeContractVerificationSmokeTest.php. - Reuse existing browser setup/harness patterns.
- Do not add broad fixture defaults or seeders without updating the spec first.
- Keep exhaustive route/query permutations in Feature tests, not browser tests.
Phase 6 — Go/no-go close-out
- Update
audit-report.mdwith final commands, browser tooling, screenshots, blocked checks, and go/no-go status. - If no P1/P2 drift is found, recommend moving to the next roadmap candidate.
- If P1/P2 drift is found, recommend the smallest safe follow-up or bounded fix and stop unrelated feature work.
Constitution Check
- Inventory-first / snapshots-second: N/A, no inventory/snapshot behavior changed.
- Read/write separation: pass; this is read-only verification unless a later bounded fix is explicitly authorized by updated artifacts.
- Single Graph contract path: pass; no Graph calls are added.
- Deterministic capabilities / RBAC: pass; existing capabilities are verified, not changed.
- Workspace and environment isolation: primary verification focus.
- Provider boundary: pass; verify provider credential-adjacent scope without adding provider abstractions.
- No new persisted truth: pass.
- No new state/status family: pass; P1/P2/P3/backlog is report-only taxonomy.
- UI/Productization coverage: pass; no planned UI surface impact. Any runtime UI fix must update this decision.
- Test governance: pass; browser lane is explicit and central to the gate.
- Proportionality: pass; the gate is narrower than a new feature or broad cleanup chain.
Project Structure
Expected Spec 340 artifact layout:
specs/340-post-scope-contract-browser-verification-gate/
├── spec.md
├── plan.md
├── tasks.md
├── checklists/
│ └── requirements.md
├── surface-inventory.md
├── scope-verification-matrix.md
├── findings.md
├── audit-report.md
└── artifacts/
└── screenshots/
Optional implementation test:
apps/platform/tests/Browser/Spec340PostScopeContractVerificationSmokeTest.php
Data Model
No runtime data model change.
Spec-local artifact concepts:
- Surface inventory row: surface name, route/entry point, expected taxonomy, origin, filter support, related helper/code owner, verification status.
- Matrix row: surface, browser origin, URL/query, shell, sidebar, breadcrumb/header, visible filter evidence, reload/back-forward result, screenshot path, status, finding ID.
- Finding: ID, severity, expected behavior, actual behavior, evidence, likely owner, smallest next action, go/no-go impact.
Testing Strategy
- Use Pest 4 browser testing if automation is added.
- Browser tests must include
assertNoJavaScriptErrors()where stable. - Prefer targeted browser coverage over full-app smoke.
- Use specific HTTP assertions in any Feature probes (
assertNotFound(),assertForbidden(),assertSuccessful()). - Do not delete or relax existing Spec 322/338/339 tests.
Target commands for later implementation:
cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Browser --filter=Spec340
cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/ProviderConnections --filter=ScopeHardening
git diff --check
If no automated browser test is added, the implementation close-out must say browser verification was manual/in-app and list exact routes checked, screenshots captured, and tooling limitations.
Filament / Livewire Contract
- Filament v5 remains on Livewire v4.0+.
- No panel provider registration change is planned; Laravel 12 providers remain in
apps/platform/bootstrap/providers.php. - Global search behavior is not changed. If a runtime fix later touches a globally searchable resource, the implementer must verify View/Edit page availability or disabled global search.
- Destructive/high-impact actions are not executed in this gate. Provider Connection actions are inspected for existing confirmation, authorization, and audit posture only.
- No registered Filament assets are added;
filament:assetsdeployment posture is unchanged.
Deployment / Ops Impact
- Migrations: none.
- Env vars: none.
- Queues/scheduler: none.
- Storage/volumes: none, except local screenshot artifacts under the spec package if captured.
- Dokploy/Staging/Production: no runtime deployment impact unless a later bounded fix changes code.
Risk Controls
- Do not treat blocked checks as pass.
- Do not create follow-up specs automatically unless P1/P2 evidence proves a concrete gap.
- Do not rewrite completed specs.
- Do not broaden into customer review, localization, governance inbox, or commercial lifecycle productization.
- Do not add seeders or global browser fixtures unless the active spec is updated with the fixture-cost decision.
Phase Completion Criteria
spec.md,plan.md,tasks.md, andchecklists/requirements.mdexist and are internally aligned.- The implementation task list is ordered, small, and verification-first.
- No application implementation is included in preparation.
- The package is ready for a separate implementation loop.