Applied diagnostic surface contract rules to Audit Log inspect modal and Support Diagnostics action context, consolidating raw diagnostic data into safe modals according to Spec 374. Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #445
20 KiB
Implementation Plan: Spec 374 - Diagnostic Entry Point and Support Diagnostics Consolidation v1
Branch: 374-diagnostic-entry-point-support-diagnostics-consolidation | Date: 2026-06-12 | Spec: specs/374-diagnostic-entry-point-support-diagnostics-consolidation/spec.md
Input: User-provided Spec 374 draft, completed Spec 373 artifacts, Spec 370 IA contract, and current repo routes/surfaces.
Summary
Productize the official environment diagnostics entrypoint decision without building a diagnostic hub.
The implementation should make these product truths explicit:
- Environment Dashboard remains the primary operator starting point.
- Support Diagnostics modal is the official quick diagnostics/support context entry.
- Environment Diagnostics is a secondary repair diagnostics page/deeplink for supported membership/access repair cases.
- Provider/Permission Diagnostics, System Diagnostics, Evidence questions, and Customer Review evidence stay in their existing or future owned surfaces.
The work is presentation, discoverability, and documentation over existing routes/actions. It must not add new diagnostic backend checks, Graph calls, provider logic, migrations, navigation trees, OperationRun behavior, or customer/auditor changes.
Technical Context
Language/Version: PHP 8.4.15, Laravel 12.52
Primary Dependencies: Filament v5.2.1, Livewire v4.1.4, Pest v4.3.1, Laravel Sail
Storage: PostgreSQL; no schema change planned
Testing: Pest Feature/Livewire plus bounded Browser smoke
Validation Lanes: confidence + browser + static diff/format checks
Target Platform: Laravel monolith under apps/platform
Project Type: web application
Performance Goals: DB-local render; no provider/Graph calls during page or modal render
Constraints: no new persistence, no new provider/permission/system/evidence runtime logic, no new navigation hub, no panel provider/global-search changes
Scale/Scope: one environment dashboard action area, one support diagnostics modal, one repair diagnostics page, and spec-local artifacts
Current Repo Truth That Constrains The Slice
apps/platform/routes/web.phpdefines:/admin/workspaces/{workspace}/environments/{environment:slug}->EnvironmentDashboard/admin/workspaces/{workspace}/environments/{environment:slug}/diagnostics->EnvironmentDiagnostics
EnvironmentDiagnosticshasprotected static bool $shouldRegisterNavigation = false.EnvironmentDiagnosticscurrently has existing repair actions:bootstrapOwnermergeDuplicateMemberships
- The repair actions already use
Action::make(...)->action(...),->requiresConfirmation(),UiEnforcement,Capabilities::TENANT_MANAGE, and service-owned repair methods. ManagedEnvironmentDiagnosticsService::tenantHasNoOwners()currently returnsfalse; missing-owner repair is an existing presentation/test seam, not repo-active detection. Spec 374 must not add missing-owner detection or owner-recovery logic.environment-diagnostics.blade.phpalready uses a first-viewport summary from Spec 373, but the page still reads as "Environment Diagnostics" rather than a clearly bounded repair diagnostics destination.EnvironmentDashboardalready exposesopenSupportDiagnosticsAction()from header/More actions.support-diagnostic-bundle.blade.phpalready presents recommended first check before lower support sections from Spec 373.ManagedEnvironmentLinks::diagnosticsUrl()exists; current preparation search found only its method definition. Implementation must re-run usage search before deciding whether to keep it as deeplink utility or adopt it for one secondary link.ActionSurfaceExemptionsandEnvironmentDiagnostics::actionSurfaceDeclaration()currently use ManagedEnvironment diagnostics terminology; if runtime copy adopts Repair Diagnostics as the canonical page noun, those metadata paths must be audited for consistency.- No
specs/374-*package existed before this preparation.
Source Inputs
Required implementation reads:
specs/374-diagnostic-entry-point-support-diagnostics-consolidation/spec.mdspecs/374-diagnostic-entry-point-support-diagnostics-consolidation/plan.mdspecs/374-diagnostic-entry-point-support-diagnostics-consolidation/tasks.mdspecs/373-diagnostic-surface-separation/spec.mdspecs/373-diagnostic-surface-separation/plan.mdspecs/373-diagnostic-surface-separation/tasks.mdspecs/373-diagnostic-surface-separation/artifacts/source-audit-summary.mdspecs/373-diagnostic-surface-separation/artifacts/diagnostic-surface-contracts.mdspecs/373-diagnostic-surface-separation/artifacts/browser-verification-report.mdspecs/373-diagnostic-surface-separation/artifacts/validation-report.mdspecs/370-global-surface-information-architecture-contract/artifacts/surface-contract.mdspecs/370-global-surface-information-architecture-contract/artifacts/surface-type-matrix.mddocs/ui-ux-enterprise-audit/page-reports/ui-002-environment-dashboard.mddocs/ui-ux-enterprise-audit/page-reports/ui-012-environment-diagnostics.mddocs/ui-ux-enterprise-audit/route-inventory.md
UI / Surface Guardrail Plan
- Guardrail scope: changed existing environment dashboard action, support diagnostics modal purpose/copy, and repair diagnostics page framing.
- Affected routes/pages/actions/states/navigation/panel/provider surfaces:
/admin/workspaces/{workspace}/environments/{environment}openSupportDiagnosticsaction/modal/admin/workspaces/{workspace}/environments/{environment}/diagnostics
- No-impact class, if applicable: N/A.
- Native vs custom classification summary: native Filament page/action/modal with existing Blade content; do not create a custom diagnostic UI system.
- Shared-family relevance: diagnostics entrypoints, support diagnostic bundle, repair diagnostics, action links, status/no-action messaging.
- State layers in scope: page/action/modal presentation only.
- Audience modes in scope: operator-MSP and support-platform.
- Decision/diagnostic/raw hierarchy plan: dashboard entrypoint decision first; support diagnostics first check second; repair diagnostics only when appropriate; raw/support detail lower or gated.
- Raw/support gating plan: support diagnostics remains capability-gated and rendered as a redacted support view while retaining the internal
default_redactedmode; repair diagnostics does not expose raw provider data. - One-primary-action / duplicate-truth control: "Open support diagnostics" remains the primary quick diagnostics path; repair diagnostics is secondary and conditional if surfaced.
- Handling modes by drift class or surface:
- Environment Dashboard: implementation target.
- Support Diagnostics modal: implementation target for purpose/first-check clarity if current copy is insufficient.
- Environment Diagnostics: implementation target for repair-only/no-action framing.
- Provider/Permission/System/Evidence/Customer review diagnostics: report-only or follow-up-spec.
- Repository-signal treatment: completed Spec 373 is context, not a rewrite target.
- Special surface test profiles:
standard-native-filament,shared-detail-family, andexception-coded-surfacefor partial repair-state browser fixtures. - Required tests or manual smoke: Feature/Livewire plus browser smoke.
- Exception path and spread control: fixture gaps are documented in feature artifacts; do not create auth/seed infrastructure inside this spec.
- Active feature PR close-out entry: Guardrail / Smoke Coverage.
- UI/Productization coverage decision: update coverage artifacts only for changed Environment Dashboard, support diagnostics modal, or Environment Diagnostics evidence/status. Do not churn Provider Connections/Required Permissions reports.
- Coverage artifacts to update:
docs/ui-ux-enterprise-audit/route-inventory.mdif screenshot/report references or classification materially change.docs/ui-ux-enterprise-audit/page-reports/ui-002-environment-dashboard.mdif dashboard action evidence changes.docs/ui-ux-enterprise-audit/page-reports/ui-012-environment-diagnostics.mdif page framing/evidence changes.docs/ui-ux-enterprise-audit/unresolved-pages.mdonly for scoped blocked reachability.
- Navigation / Filament provider-panel handling: no panel provider change; do not register
/diagnosticsas a top-level navigation item. - Screenshot or page-report need: yes for dashboard action/modal and direct repair diagnostics page if reachable; document blocked repair-state screenshots honestly.
Shared Pattern And System Fit
- Cross-cutting feature marker: yes.
- Systems touched:
App\Filament\Pages\EnvironmentDashboardApp\Filament\Pages\EnvironmentDiagnosticsApp\Support\Ui\ActionSurface\ActionSurfaceExemptionsonly if canonical action-surface terminology changesApp\Support\ManagedEnvironmentLinksApp\Support\SupportDiagnostics\SupportDiagnosticBundleBuilderonly if existing bundle copy/data is insufficientapps/platform/resources/views/filament/modals/support-diagnostic-bundle.blade.phpapps/platform/resources/views/filament/pages/environment-diagnostics.blade.php- focused feature/browser tests and spec-local artifacts
- Shared abstractions reused:
SupportDiagnosticBundleBuilderManagedEnvironmentLinksActionSurfaceDeclaration/ActionSurfaceExemptionsmetadata where existing surface terminology is materialOperationRunLinksfor existing support context onlyUiEnforcementCapabilities- Filament native actions, modals, sections, badges, and links
- New abstraction introduced? why?: none planned. A page-local derived label/helper is allowed only if it maps existing repair/no-action state and replaces duplicated view conditionals.
- Why the existing abstraction was sufficient or insufficient: Existing route/action/bundle truth is sufficient; only product entrypoint semantics are missing.
- Bounded deviation / spread control: do not reuse provider-readiness guidance as a generic diagnostic engine; keep provider-specific checks out of Environment Diagnostics.
OperationRun UX Impact
- Touches OperationRun start/completion/link UX?: no.
- Central contract reused: existing
OperationRunLinksonly if support diagnostics bundle already includes operation context. - Delegated UX behaviors: N/A.
- Surface-owned behavior kept local: entrypoint and reference presentation only.
- Queued DB-notification policy: N/A.
- Terminal notification path: N/A.
- Exception path: none.
Provider Boundary And Portability Fit
- Shared provider/platform boundary touched?: yes, presentation and destination mapping only.
- Provider-owned seams: provider connection readiness, Microsoft/Graph permission facts, provider-specific error/reason details.
- Platform-core seams: managed environment dashboard, support diagnostics entrypoint, repair diagnostics route, operation/evidence references.
- Neutral platform terms / contracts preserved: provider connection, required permissions, managed environment, operation, evidence, support diagnostics, repair diagnostics.
- Retained provider-specific semantics and why: provider-specific details stay in provider-owned destinations and lower support diagnostics sections where exact troubleshooting proof is necessary.
- Bounded extraction or follow-up path: provider/permission diagnostics productization remains a follow-up if needed.
Constitution Check
GATE: Must pass before implementation. Re-check after implementation if requirements change.
- Inventory-first / snapshots-second: N/A; no inventory/snapshot truth changes.
- Read/write separation: no new write action. Existing repair actions must retain confirmation, authorization, and service/audit ownership.
- Graph contract path: no new Graph calls. Page/modal render remains DB-local.
- Deterministic capabilities: existing capability checks remain authoritative.
- RBAC-UX: workspace/environment entitlement and support diagnostics capability remain server-side truth.
- Workspace/Tenant isolation: no query-string context shortcuts or remembered-environment overrides.
- OperationRun observability: no new OperationRun type/start/completion.
- OperationRun start UX: N/A beyond existing links.
- Data minimization: no secrets, tokens, raw provider payloads, or unrestricted logs in default-visible content.
- Test governance: confidence + browser lanes are explicit and bounded.
- Proportionality: no new persisted truth, framework, enum/status family, or diagnostic hub.
- Shared pattern first: reuse existing diagnostic/support/action/link patterns.
- Provider boundary: provider readiness stays provider-owned and is not imported into repair diagnostics.
- UI-COV-001: reachable UI impact declared; coverage artifact handling is proportional.
- DECIDE-001 / DECIDE-AUD-001: dashboard stays decision/context, support/repair diagnostics stay tertiary, raw/support depth remains lower or gated.
- Filament v5 / Livewire v4: required; no legacy APIs.
- Panel provider registration: unchanged in
apps/platform/bootstrap/providers.php. - Global search: no resource global-search behavior changes.
- Destructive actions: existing Environment Diagnostics repair actions stay
->action(...)+->requiresConfirmation()+ capability-gated + server-authorized. - Asset strategy: no new asset registration planned; no
filament:assetsdeployment change expected.
Test Governance Check
- Test purpose / classification by changed surface:
- Environment Dashboard diagnostic entry: Feature/Livewire + Browser.
- Support Diagnostics modal: Feature/Livewire + Browser.
- Environment Diagnostics repair/no-action framing: Feature/Livewire + Browser.
- Matrix/artifacts: static review.
- Affected validation lanes: confidence and browser.
- Why this lane mix is the narrowest sufficient proof: entrypoint clarity must be proven both in action state/rendered DOM and actual browser discoverability.
- Narrowest proving commands:
- exact Spec 374 diagnostic-entry test file/filter if created; otherwise record why no
DiagnosticEntryfilter exists and run the concrete dashboard/support/repair tests that cover it cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/Filament/TenantDiagnosticsRepairsTest.phpor the exact replacement Spec 374 repair-diagnostics test filecd apps/platform && ./vendor/bin/sail artisan test --compact --filter=SupportDiagnostics- bounded browser smoke for dashboard action/modal/direct page
cd apps/platform && ./vendor/bin/sail pint --dirtyif PHP changesgit diff --check
- exact Spec 374 diagnostic-entry test file/filter if created; otherwise record why no
- Fixture / helper / factory / seed / context cost risks: use existing fixture patterns; document unavailable repair/blocker screenshots instead of widening fixture infrastructure.
- Expensive defaults or shared helper growth introduced?: no.
- Heavy-family additions, promotions, or visibility changes: one bounded browser smoke only.
- Surface-class relief / special coverage rule: standard-native-filament for action state; shared-detail-family for modal; exception-coded-surface for direct repair page.
- Closing validation and reviewer handoff: reviewers should inspect source audit, matrix, browser report, screenshot index, validation report, and final diff for out-of-scope files.
- Budget / baseline / trend follow-up: none expected.
- Review-stop questions: Did implementation add a hub, new nav, provider/permission runtime checks, raw leakage, or weaken repair-action safety?
- Escalation path: document-in-feature for fixture gaps; follow-up-spec for provider/permission diagnostics, evidence/system browser reachability, or bloat guard.
- Active feature PR close-out entry: Guardrail / Smoke Coverage.
- Why no dedicated follow-up spec is needed: This is the dedicated entrypoint productization slice; broader diagnostic lanes are explicitly deferred.
Project Structure
Documentation (this feature)
specs/374-diagnostic-entry-point-support-diagnostics-consolidation/
├── spec.md
├── plan.md
├── tasks.md
├── checklists/
│ └── requirements.md
└── artifacts/
├── source-audit-summary.md
├── diagnostic-entrypoint-matrix.md
├── affected-files.md
├── implementation-notes.md
├── browser-verification-report.md
├── before-after-screenshot-index.md
├── validation-report.md
├── follow-up-recommendations.md
└── screenshots/
Source Code (repository root)
Likely affected runtime surfaces for later implementation:
apps/platform/app/Filament/Pages/EnvironmentDashboard.php
apps/platform/app/Filament/Pages/EnvironmentDiagnostics.php
apps/platform/app/Support/ManagedEnvironmentLinks.php
apps/platform/app/Support/SupportDiagnostics/SupportDiagnosticBundleBuilder.php
apps/platform/resources/views/filament/pages/environment-diagnostics.blade.php
apps/platform/resources/views/filament/modals/support-diagnostic-bundle.blade.php
apps/platform/tests/Feature/Filament/
apps/platform/tests/Feature/SupportDiagnostics/
apps/platform/tests/Browser/
docs/ui-ux-enterprise-audit/route-inventory.md
docs/ui-ux-enterprise-audit/page-reports/
Structure Decision: Single Laravel web application. Implementation should stay in existing page/view/support-diagnostics/test locations and spec-local artifacts. Do not create new base folders.
Complexity Tracking
No constitutional violation is planned.
| Violation | Why Needed | Simpler Alternative Rejected Because |
|---|---|---|
| N/A | N/A | N/A |
Proportionality Review
- Current operator problem: unclear official diagnostic entrypoint causes hidden-route confusion and future scope creep.
- Existing structure is insufficient because: existing surfaces show diagnostic content but do not clearly define which surface owns quick support, repair, provider/permission, system, evidence, or customer review questions.
- Narrowest correct implementation: label/copy/conditional entrypoint and no-action semantics over existing routes/actions, backed by a matrix and browser proof.
- Ownership cost created: focused tests, screenshots, and spec-local artifacts.
- Alternative intentionally rejected: generic Diagnostic Hub or provider-health framework.
- Release truth: current-release productization over existing diagnostic/support surfaces.
Implementation Phases
Phase 0 - Repo Truth And Source Audit
Re-read Spec 373/370 context, current dashboard/diagnostics/support code, route inventory, and tests. Re-run ManagedEnvironmentLinks::diagnosticsUrl() usage search. Complete source audit and matrix before runtime edits.
Phase 1 - Tests First
Add/update focused tests for dashboard support diagnostics entry, optional secondary repair diagnostics link behavior, direct repair diagnostics no-action state, repair action safety, DB-local/no-Graph rendering for dashboard/modal/page paths, and support modal purpose/first-check fallback.
Phase 2 - Dashboard Diagnostic Entry Productization
Refine Open support diagnostics label/description/placement if needed. Add a secondary repair diagnostics link only if repo-backed and low-risk. Keep the dashboard's primary decision hierarchy intact.
Phase 3 - Repair Diagnostics Page Framing
Reframe the direct diagnostics page as repair diagnostics. Improve no-action copy and support-diagnostics handoff. Preserve repair action authorization, confirmation, and service ownership. Audit existing action-surface metadata before changing canonical nouns so the page contract does not drift from the UI governance catalog.
Phase 4 - Support Diagnostics Purpose Check
Confirm the modal begins with recommended first check and purpose. Add calm fallback only if current bundle output can lack a recommendation. Do not add new support sections or inferred causes.
Phase 5 - Browser Smoke And Artifacts
Use the existing browser fixture/login path. Capture dashboard entry, support diagnostics modal, direct repair diagnostics page, and no-action state screenshots where reachable. Document any repair-blocker fixture gap.
Phase 6 - Validation And Close-Out Artifacts
Run targeted tests/static checks, complete implementation notes, browser report, screenshot index, validation report, affected files, and follow-up recommendations. Confirm no out-of-scope runtime files changed.