Implemented the final operator workflow for the Governance Inbox. This includes refactoring the inbox page, updating finding resources, adding UI enforcement policies, updating related blade views, and adding comprehensive tests for operator workflow and scope contracts. Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #418
39 KiB
Feature Specification: Spec 346 - Governance Inbox Final Operator Workflow
Feature Branch: 346-governance-inbox-final-operator-workflow
Created: 2026-06-02
Status: Draft
Type: Platform productization / operator workflow / governance inbox closeout
Runtime posture: Narrow runtime productization over an existing strategic surface. No new governance engine or new persisted workflow truth.
Close-out posture: Not closed. The bounded density/productization polish requested on 2026-06-02 remains part of Spec 346 before close-out is claimed.
Input: User-provided full Spec 346 draft + repo truth from Specs 250, 257, 265, 306, 307, 308, 327, 338-345.
Dependencies And Historical Context
Depends on the existing governance and scope line:
- Spec 250 - Decision-Based Governance Inbox v1
- Spec 257 - Governance Decision Surface Convergence
- Spec 265 - Decision Register & Approval Workflow v1
- Spec 306 - Decision Register Reconciliation
- Spec 307 - Decision Register Evidence / OperationRun Link Polish
- Spec 308 - Decision Register Summary / Review Pack Inclusion
- Spec 327 - Governance Inbox Decision-First Workbench Productization
- Specs 338-341 - workspace / environment scope and canonical-link contracts
- Specs 342-344 - customer review completion, accepted-risk productization, and audience polish
- Spec 345 - Platform Productization Readiness / Roadmap Reconciliation Gate
Repo truth adjustment:
apps/platform/app/Filament/Pages/Governance/GovernanceInbox.phpalready exists and is repo-real.apps/platform/app/Support/GovernanceInbox/GovernanceInboxSectionBuilder.phpalready composes the current families:assigned_findingsintake_findingsfinding_exceptionsstale_operationsalert_delivery_failuresreview_follow_up
apps/platform/app/Filament/Pages/Governance/DecisionRegister.phpis already the historical/proof-oriented decision ledger.- The current UI audit route inventory tracks Governance Inbox as
UI-028, with page reportdocs/ui-ux-enterprise-audit/page-reports/ui-004-governance-inbox.md, not a newui-008-*artifact. - Existing test truth lives primarily under:
apps/platform/tests/Feature/Governance/*apps/platform/tests/Feature/Navigation/*apps/platform/tests/Browser/Spec327GovernanceInboxProductizationSmokeTest.php
Spec 346 must therefore productize the existing page, route, builder, and shared link/filter contracts instead of inventing a new queue family, a new persistence layer, or a second decision home.
Spec Candidate Check (mandatory - SPEC-GATE-001)
- Problem: Governance Inbox is repo-real and already shows governance attention, but it still reads more like a dense admin queue than the calm daily operator worklist that answers what needs attention, why it matters, and what the next action is.
- Today's failure: Operators can see findings, exceptions, operations, alerts, and review follow-up, but still need to reconstruct whether an item needs triage, a decision, evidence, risk review, or review handoff. The page does not yet consistently separate active work from blocked, review-ready, or recently resolved context.
- User-visible improvement:
/admin/governance/inboxbecomes the central operator queue for governance work: summary first, actionable lanes, explicit reason and impact, one primary next action per item, clear downstream links, visible environment filter state, and calmer disclosure of diagnostics. - Smallest enterprise-capable version: Rework only the existing Governance Inbox page, its view, and its derived payload composition over current repo-backed records. Add targeted Feature and Browser proof for lane classification, scope-correct links, empty/blocked/resolved states, and first-screen scanability.
- Explicit non-goals: No new governance engine, no new persisted inbox item, no Kanban board, no PSA/helpdesk handoff, no customer portal, no Decision Register rebuild, no broad Findings or Customer Review Workspace rewrite, no provider readiness redesign, no new workflow mutation surface by default, no new status family unless current repo truth proves one is unavoidable and proportional.
- Permanent complexity imported: One page-local operator lane contract, one repo-truth map, one lane-classification artifact, focused Feature tests, one bounded Browser smoke file, and screenshot artifacts. No new table, no global abstraction, no public framework, and no new persisted source of truth.
- Why now: Spec 345 explicitly identifies Governance Inbox Final Operator Workflow as the next central productization gap after shell/scope closure and customer-review maturity. The backlog wording is stale relative to current runtime truth; the operator queue itself is now the clearest remaining daily-use blocker.
- Why not local: Copy-only tweaks or one more summary card would leave the operator reconstruction problem intact. A new workboard would overbuild. The narrow correct slice is a derived, decision-oriented final workflow pass over the existing inbox runtime.
- Approval class: Core Enterprise.
- Red flags triggered: One strategic-surface and one cross-surface composition flag. Defense: the slice stays on one existing page, reuses existing truth and routes, forbids new persistence/frameworks, and explicitly preserves completed specs as context only.
- Score: Nutzen: 2 | Dringlichkeit: 2 | Scope: 2 | Komplexitaet: 2 | Produktnaehe: 2 | Wiederverwendung: 2 | Gesamt: 12/12
- Decision: approve.
Candidate Source And Completed-Spec Guardrail
- Candidate source:
- direct user-provided Spec 346 draft
docs/product/spec-candidates.mdmanual-promotion backlog itemdecision-based-governance-inbox-v1docs/product/roadmap.mddecision-based governance inbox priority lanespecs/345-platform-productization-readiness-roadmap-reconciliation-gate/next-spec-recommendation.md
- Completed-spec guardrail result:
- no
specs/346-*package existed before this prep - related Specs 250, 257, 265, 306, 307, 308, 327, 342, 343, 344, and 345 contain prepared, validated, completed-task, close-out, review-outcome, or implementation-history signals and are treated as historical context only
- these related packages must not be rewritten, normalized, or converted back into preparation-only wording
- no
- Close alternatives deferred:
- provider readiness / onboarding productization
- evidence and retained artifact lifecycle follow-through
- localization and customer-safe copy hardening
- PSA / ITSM handoff
- Smallest viable implementation slice: Existing Governance Inbox only: operator summary first, lane grouping over repo-real items, visible
environment_idfilter, scope-correct deep links into existing surfaces, calmer empty/blocked/resolved treatment, and focused tests/browser smoke.
Spec Scope Fields (mandatory)
- Scope: workspace canonical-view governance operator queue, optionally filtered by visible
environment_id. - Primary Routes:
- existing route
/admin/governance/inbox - related existing route
/admin/governance/decisions - linked existing workspace or environment surfaces for findings, finding exceptions, evidence, reviews, operations, and provider/readiness destinations when repo-backed
- existing route
- Data Ownership:
Findingremains the source of truth for findings, owner/due, severity, evidence summary, and current primary remediation/triage pathFindingExceptionandFindingExceptionDecisionremain the accepted-risk / exception truthManagedEnvironmentTriageReview,EnvironmentReview,EnvironmentReviewAcknowledgement, andReviewPackremain the review/customer-safe handoff truthEvidenceSnapshotand related artifact resources remain evidence truthOperationRunplus existing run-link helpers remain operation proof truthAlertDeliveryremains alert-delivery failure truthWorkspaceHubEnvironmentFilter,WorkspaceHubNavigation, and canonical navigation helpers remain scope/filter truth- the inbox itself remains a derived read surface only
- RBAC:
- workspace membership is required
- environment filtering must resolve only through current-workspace entitled environments
- non-members and out-of-scope
environment_idrequests remain deny-as-not-found - existing family/resource policies and capabilities remain authoritative for which lanes, items, and actions are visible
- the page must not hint at hidden work from invisible families or hidden environments
For canonical-view specs:
- Default filter behavior when tenant-context is active: clean
/admin/governance/inboxmust remain workspace-wide and must not inherit remembered environment shell state, hidden topbar environment context, legacy query aliases, or stale table filters. - Explicit entitlement checks preventing cross-tenant leakage:
?environment_id=must be visible, local to the page, resolved through current workspace membership, and denied as not found when out of scope.
UI Surface Impact (mandatory - UI-COV-001)
Does this spec add, remove, rename, or materially change any reachable UI surface?
- No UI surface impact
- Existing page changed
- New page/route added
- Navigation changed
- Filament panel/provider surface changed
- New modal/drawer/wizard/action added
- New table/form/state added
- Customer-facing surface changed
- Dangerous action changed
- Status/evidence/review presentation changed
- Workspace/environment context presentation changed
UI/Productization Coverage (mandatory when UI Surface Impact is not "No UI surface impact")
- Route/page/surface:
/admin/governance/inbox,GovernanceInbox,governance-inbox.blade.php,GovernanceInboxSectionBuilder - Current or new page archetype: Strategic operator queue / governance inbox workbench, continuing
UI-028 - Design depth: Strategic Surface
- Repo-truth level: repo-verified existing runtime surface
- Existing pattern reused: existing Governance Inbox page, workspace hub filter chip, Decision Register linkage, current shared navigation/link helpers, current page report
ui-004-governance-inbox.md - New pattern required: bounded page-local lane grouping and operator summary over existing truth; no new global runtime pattern
- Screenshot required: yes, under
specs/346-governance-inbox-final-operator-workflow/artifacts/screenshots/ - Page audit required: update the existing Governance Inbox page report
docs/ui-ux-enterprise-audit/page-reports/ui-004-governance-inbox.mdif the runtime diff changes the documented hierarchy materially; do not inventui-008-*by default - Customer-safe review required: operator-facing surface only, but downstream wording must remain customer-safe where review-ready or accepted-risk states appear
- Dangerous-action review required: no new dangerous action is expected. If a new governance mutation appears necessary, the spec and plan must be updated first and the action must follow confirmation, authorization, audit, and test rules
- Coverage files updated or explicitly not needed:
docs/ui-ux-enterprise-audit/route-inventory.mddocs/ui-ux-enterprise-audit/design-coverage-matrix.mddocs/ui-ux-enterprise-audit/page-reports/...docs/ui-ux-enterprise-audit/strategic-surfaces.mddocs/ui-ux-enterprise-audit/grouped-follow-up-candidates.mddocs/ui-ux-enterprise-audit/unresolved-pages.mdN/A - no reachable UI surface impact
- No-impact rationale when applicable: N/A
Cross-Cutting / Shared Pattern Reuse (mandatory)
- Cross-cutting feature?: yes
- Interaction class(es): status messaging, action links, workspace hub filtering, evidence/proof links, review/review-pack links, navigation continuity, governance queue hierarchy
- Systems touched:
GovernanceInboxGovernanceInboxSectionBuilderDecisionRegister- findings / finding-exception queues and detail resources
CustomerReviewWorkspace- evidence and review-pack resources
OperationRunLinks- workspace hub filter and navigation helpers
- Existing pattern(s) to extend: current inbox family payloads, workspace hub filter chip, canonical navigation/back-link behavior, current source routes and policy checks
- Shared contract / presenter / builder / renderer to reuse:
GovernanceInboxSectionBuilder,CanonicalNavigationContext,WorkspaceHubEnvironmentFilter,WorkspaceHubNavigation,OperationRunLinks, current resource/page URL helpers and policies - Why the existing shared path is sufficient or insufficient: existing paths are sufficient for truth, authorization, and drill-through. They are insufficient only for the final operator queue hierarchy because they still present family-level attention more prominently than the queue-clearing decision model.
- Allowed deviation and why: one bounded page-local derived lane contract or DTO is allowed if it keeps summary and item rendering testable without becoming a reusable workflow engine
- Consistency impact: lane copy, next-action labels, environment scope, evidence/proof labels, and customer-safe wording must stay aligned with current findings, exception, evidence, review, and Decision Register language
- Review focus: block any second decision home, new persisted queue state, unauthorized hidden-work hinting, diagnostics-first hierarchy, or local mutation semantics that duplicate existing surfaces
OperationRun UX Impact (mandatory)
- Touches OperationRun start/completion/link UX?: deep-link semantics only
- Shared OperationRun UX contract/layer reused: existing
OperationRunLinksand existing operations page/resource URLs - Delegated start/completion UX behaviors: N/A - no new operation start or lifecycle
- Local surface-owned behavior that remains: show blocked/proof context and operation-link next action only where current repo truth already supports it
- Queued DB-notification policy: N/A
- Terminal notification path: unchanged
- Exception required?: none
Provider Boundary / Platform Core Check (mandatory)
- Shared provider/platform boundary touched?: no new provider seam
- Boundary classification: platform-core operator workflow over existing environment-bound governance records
- Seams affected: presentation and routing only
- Neutral platform terms preserved or introduced: workspace, environment, governance inbox, decision, evidence, review-ready, accepted risk, blocked, proof, diagnostics
- Provider-specific semantics retained and why: any Microsoft/Intune wording remains only where the underlying repo-backed source item already uses it
- Why this does not deepen provider coupling accidentally: no Graph calls, no provider models, no provider connection changes, and no new provider-shaped persistence are introduced
- Follow-up path: provider readiness/onboarding productization remains a separate follow-up spec
UI / Surface Guardrail Impact
| Surface / Change | Operator-facing surface change? | Native vs Custom | Shared-Family Relevance | State Layers Touched | Exception Needed? | Low-Impact / N/A Note |
|---|---|---|---|---|---|---|
| Governance Inbox page | yes | Native Filament page plus existing Blade composition | governance queues, evidence/proof links, review linkage, navigation continuity | page, URL-query, derived payload | no | Existing route only |
| Operator summary zone | yes | page-local composition | queue-clearing summary, lane counts, primary next action | page payload | no | Repo-backed counts only |
| Lane groups | yes | page-local composition | decision-first work grouping over current families | page payload | no | Derived only; no new persistence |
| Work item cards / rows | yes | page-local composition over existing sections/items | reason, impact, next action, linked context | page payload | no | Must stay source-backed |
| Recently resolved / diagnostics areas | yes | page-local composition | disclosure hierarchy and calmness | page payload | no | Secondary or collapsed only |
Decision-First Surface Role
| Surface | Decision Role | Human-in-the-loop Moment | Immediately Visible for First Decision | On-Demand Detail / Evidence | Why This Is Primary or Why Not | Workflow Alignment | Attention-load Reduction |
|---|---|---|---|---|---|---|---|
| Governance Inbox | Primary Decision Surface | Operator decides what governance work to clear next | summary counts, lane, reason, impact, environment, age/state, primary next action | proof links, evidence detail, review context, decision history, technical diagnostics | Primary because it is the central operator queue | follows what needs my attention now? before what does this record contain? |
removes cross-page reconstruction |
| Decision Register | Secondary Context | Operator verifies historical decision/proof truth for a selected governance item | decision ledger and proof context | deeper decision history and related proof | Secondary because it is the ledger, not the queue | complements the inbox without replacing it | keeps history visible without flattening queue work |
| Diagnostics disclosure | Tertiary Evidence / Diagnostics | Support or operator confirms technical detail after choosing a path | collapsed availability only | raw/source diagnostics where authorized | Not primary | preserves support depth without dominating queue hierarchy | prevents debug-first experience |
Audience-Aware Disclosure
| Surface | Audience Modes In Scope | Decision-First Default-Visible Content | Operator Diagnostics | Support / Raw Evidence | One Dominant Next Action | Hidden / Gated By Default | Duplicate-Truth Prevention |
|---|---|---|---|---|---|---|---|
| Governance Inbox | operator-MSP, manager, support where authorized | lane, reason, impact, source, environment, linked context, primary next action | blocked reason, proof path, review/evidence/decision linkage | raw payloads, debug metadata, secrets, stack traces, low-level provider diagnostics | context-aware navigation action | diagnostics and raw detail | summary tells the operator once what matters; later sections add proof only |
| Decision / proof context inside inbox | operator-MSP, support where authorized | customer-safe and operator-safe proof summary | linked review/evidence/operation detail | raw payloads and internal-only support detail | one dominant open/review action | raw detail and unauthorized links | no repeated queue-level summary in every linked section |
UI/UX Surface Classification
| Surface | Action Surface Class | Surface Type | Likely Next Operator Action | Primary Inspect/Open Model | Row Click | Secondary Actions Placement | Destructive Actions Placement | Canonical Collection Route | Canonical Detail Route | Scope Signals | Canonical Noun | Critical Truth Visible by Default | Exception Type / Justification |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Governance Inbox | Utility / Workspace Decision | Read-only workflow hub | review or clear the next governance item | explicit primary action per item or section | forbidden unless implementation proves a native pattern fits cleanly | secondary links beside or below the primary action | none by default | /admin/governance/inbox |
existing source routes only | workspace shell, visible environment filter, lane, source, state | Governance inbox | why item appears, why it matters, what to do next | none |
| Decision Register | Utility / Evidence Ledger | Read-only register | open the related decision/proof context | explicit existing register affordance | current repo-real behavior only | existing secondary proof links | none | /admin/governance/decisions |
existing decision detail path | workspace shell, visible environment filter, register state | Decision register | historical/proof truth | existing runtime contract remains authoritative |
Operator Surface Contract
| Surface | Primary Persona | Decision / Operator Action Supported | Surface Type | Primary Operator Question | Default-visible Information | Diagnostics-only Information | Status Dimensions Used | Mutation Scope | Primary Actions | Dangerous Actions |
|---|---|---|---|---|---|---|---|---|---|---|
| Governance Inbox | MSP/workspace operator | choose the next governance item and route into the owning surface | workspace operator queue | What needs my attention, why does it matter, and what should I do next? | operator summary, lanes, reason, impact, source, environment, linked context, next action | raw diagnostics, debug metadata, low-level support detail | queue lane, urgency, evidence state, accepted-risk/exception state, blocked/review-ready/resolved posture | none by default | review finding, open decision register, review exception, open evidence, open review workspace, open operation, open provider readiness | none by default |
Proportionality Review (mandatory when structural complexity is introduced)
- New source of truth?: no
- New persisted entity/table/artifact?: no
- New abstraction?: possibly one page-local derived lane/view-model helper only
- New enum/state/reason family?: no persisted family; lane keys stay derived and local unless current repo truth proves a reused constant set is already available
- New cross-domain UI framework/taxonomy?: no
- Current operator problem: the repo-real Governance Inbox does not yet answer in one calm place whether an item needs triage, decision, risk review, evidence, customer review handoff, or support follow-up
- Existing structure is insufficient because: the current workbench and family sections still expose families more directly than the operator workflow, and active vs blocked vs recently resolved context is not clearly separated
- Narrowest correct implementation: derive operator lanes and a top summary over existing inbox sections/items, keep all routing on existing surfaces, and add tests/browser smoke
- Ownership cost: one lane contract artifact, page-local mapping logic, feature tests, browser smoke, and UI-report update
- Alternative intentionally rejected: a new governance work engine, persisted inbox-item table, new decision entity, or cross-domain queue framework
- Release truth: current-release operator workflow closure over existing governance truth
Compatibility posture
This feature assumes a pre-production environment.
Backward compatibility shims, legacy query aliases, or new compatibility paths are out of scope unless explicitly required by repo truth. Canonical environment_id behavior remains the only supported public filter contract.
Testing / Lane / Runtime Impact (mandatory for runtime behavior changes)
- Test purpose / classification: Feature, Browser
- Validation lane(s): confidence, browser
- Why this classification and these lanes are sufficient: Feature tests can prove lane classification, environment scope, empty/blocked/resolved states, and scope-correct link contracts cheaply. One bounded Browser smoke is required because this is a strategic operator surface and first-screen scanability is part of the product promise.
- New or expanded test families:
apps/platform/tests/Feature/Governance/Spec346GovernanceInboxOperatorWorkflowTest.phpapps/platform/tests/Feature/Navigation/Spec346GovernanceInboxScopeContractTest.phpapps/platform/tests/Browser/Spec346GovernanceInboxOperatorWorkflowSmokeTest.php- focused updates to existing Governance Inbox and workspace-hub filter tests only when reuse is more proportional than new files
- Fixture / helper cost impact: moderate. Reuse existing governance inbox fixtures and current factories for findings, finding exceptions, review follow-up, and operation proof. Avoid broad suite-wide fixture widening.
- Heavy-family visibility / justification: one explicit Browser smoke only
- Special surface test profile:
global-context-shellplus decision-first disclosure - Standard-native relief or required special coverage: special coverage required for summary-first hierarchy, lane grouping, blocked/empty states, environment filter visibility, and downstream link continuity
- Reviewer handoff: reviewers must confirm no hidden environment context, no forbidden query aliases, no new mutation lane, no false calmness, diagnostics-secondary ordering, and unchanged panel-provider/global-search/destructive-action posture
- Budget / baseline / trend impact: one explicit browser smoke addition; no broader lane expansion expected
- Escalation needed:
document-in-featureif an unreachable state cannot be proven without scope creep;follow-up-specif the page reveals missing backend truth rather than a UI/productization gap - Active feature PR close-out entry: Guardrail / Smoke Coverage
- Planned validation commands:
cd apps/platform && ./vendor/bin/sail artisan test tests/Feature/Governance/Spec346GovernanceInboxOperatorWorkflowTest.php tests/Feature/Navigation/Spec346GovernanceInboxScopeContractTest.php --compactcd apps/platform && ./vendor/bin/sail php vendor/bin/pest tests/Browser/Spec346GovernanceInboxOperatorWorkflowSmokeTest.php --compactcd apps/platform && ./vendor/bin/sail artisan test tests/Feature/Navigation/WorkspaceHubEnvironmentFilterContractTest.php tests/Feature/Navigation/WorkspaceHubClearFilterContractTest.php --compactcd apps/platform && ./vendor/bin/sail pint --dirtygit diff --check
Problem Statement
TenantPilot already has substantial governance building blocks:
- findings
- finding exceptions / accepted-risk truth
- evidence snapshots
- review packs and review workspace surfaces
- Decision Register
- operation proof
- workspace/environment filters
- audit records
The remaining product gap is not another backend foundation. It is the daily operator question:
What needs my attention, why does it matter, and what should I do next?
Governance Inbox must become the calm operator queue that connects current truth into actionable items without inventing a second governance system.
Product Intent
Governance Inbox is the operator command surface for governance work.
It is:
- not a raw table
- not a customer portal
- not a legal/compliance approval system
- not a new GRC engine
It is the workspace-owned queue that groups existing governance signals into clear next actions.
Current Repo Truth Summary
- The current page already has:
- a decision workbench
- a secondary queue context
- visible
environment_idfiltering - existing navigation and proof links
- current tests and browser smoke from Spec 327
- The current builder currently groups by source family, not final operator workflow lane.
DecisionRegisteralready exists and should stay the ledger/proof context, not become the queue.- Existing page audit
ui-004-governance-inbox.mdalready states the unresolved issues this spec should close:- one dominant queue-clearing action model
- clearer separation of decision evidence and status dimensions
- customer-safe downstream wording review
Goals
- Make Governance Inbox action-oriented.
- Group active work into clear operator lanes.
- Keep workspace/environment scope explicit and local.
- Reuse existing findings, exception, evidence, review, decision, and operation surfaces.
- Make decision/risk/evidence/review states visible without opening three other pages first.
- Preserve calm, operator-safe, non-legalistic wording.
- Add focused Feature and Browser proof for operator workflow behavior.
Scope Boundaries
In Scope
- existing Governance Inbox page, view, and derived payload composition
- lane grouping over current repo-real governance items
- operator summary first
- visible
environment_idfilter state - scope-correct links into existing findings, decision, evidence, review, operation, and readiness surfaces where repo-backed
- productized empty, blocked, and recently resolved treatment
- targeted tests, browser smoke, screenshots, and updated page-report coverage
Non-Goals
- new persisted queue state or workflow engine
- a new decision table or Decision Register rewrite
- customer portal or external customer routes
- PSA/ITSM handoff
- provider execution logic or provider readiness redesign
- broad shell/navigation rewrite
- review/evidence generation rewrite
- new legal approval/signature workflow
- broad notification platform work
- AI prioritization or autonomous governance behavior
Functional Requirements
- FR-346-001 Summary first: Governance Inbox must start with an operator summary that shows total visible governance work plus counts for the active lane model in the current scope.
- FR-346-002 Lane grouping: Governance Inbox must group active work into derived operator lanes instead of exposing source families alone as the primary hierarchy.
- FR-346-003 Minimal truthful lane set: The implementation must ship the smallest truthful lane set over existing runtime data.
Needs triage,Requires decision,Risk / exception review, andBlockedare the minimum target lanes.Evidence required,Review-ready, andRecently resolvedmust appear only when current repo truth can derive them without inventing new persistence or state families. - FR-346-004 Reason / impact / next action: Every visible active item must show why it appears, why it matters, and one primary next action.
- FR-346-005 Visible local environment filter:
/admin/governance/inbox?environment_id={environment}must remain the visible public scope contract. No hidden topbar/session-only environment filtering is allowed. - FR-346-006 Scope-correct links: Environment-owned detail links must preserve current scope rules and must not emit retired public query contracts such as
tenant,tenant_id,managed_environment_id, ortableFilters. - FR-346-007 Empty state: The empty state must explain that there are no governance items needing attention in the current scope and must not look like missing data.
- FR-346-008 Blocked state: Blocked items must show blocker reason and a truthful next action into the owning proof/readiness surface when available.
- FR-346-009 Resolved items stay secondary: recently resolved or acknowledged work may appear, but must not dominate active operator workload.
- FR-346-010 Decision Register linkage: items requiring decision must link to the existing Decision Register or existing decision-owning detail surfaces instead of inventing a new decision workflow.
- FR-346-011 Review linkage: review-ready or customer-safe follow-up items must link to current review surfaces using the visible
environment_idcontract when applicable. - FR-346-012 Diagnostics secondary: technical diagnostics must remain secondary, collapsed, or otherwise de-emphasized relative to the queue-clearing decision hierarchy.
- FR-346-013 Render contract hardening: every rendered lane, badge/count, action, source entry, and link payload must expose consistent keys before Blade consumes it. Missing action URLs must become absent actions, not partial arrays.
- FR-346-014 First viewport recommended action: when active work exists, the first viewport must expose a prioritized recommended item with a direct primary action, not only a summary-level lane CTA.
- FR-346-015 Zero-lane weight reduction: lanes with zero items must be visually secondary as compact clear indicators or equivalent compact status, while active lanes remain prominent.
- FR-346-016 Mobile card compression: active item cards must keep title, lane/status, environment, reason, impact, and primary action visible; source, owner/due, evidence, accepted-risk/decision, linked records, and secondary actions must be secondary or collapsible.
- FR-346-017 Hash lane behavior: if the UI emits
#lane-*links, the target lane must scroll/anchor correctly or be visibly marked. Unsupported hash behavior must be removed or deferred.
Non-Functional Requirements
- NFR-346-001 Enterprise calmness: first screen must be scannable and must not present equal-weight cards, repeated green success states, or raw diagnostic blocks as the primary story
- NFR-346-002 Operator-first language: use operator-safe language such as
review,decision recorded,accepted risk,blocked,requires attention, andready for review; avoid legal/compliance overclaims - NFR-346-003 Performance: no unbounded workspace scan. Counts and lane previews must remain bounded and eager-load only what the current view needs
- NFR-346-004 Accessibility: semantic lane headings, text-backed badges, keyboard-reachable actions, readable empty states, and non-color-only status cues
- NFR-346-005 No hidden scope: no remembered environment or hidden shell state may silently alter page data
Assumptions
- current Governance Inbox section items contain enough repo-backed data to derive a calm operator-lane contract without new persistence
- Decision Register remains the correct historical/proof surface and does not need new lifecycle semantics for this slice
- current review/evidence/run links are sufficient for truthful handoff when they exist, and omission/unavailable states are acceptable when they do not
- current page-report and route-inventory entries are stable enough that updating
ui-004-governance-inbox.mdis more truthful than inventing a new page ID
Risks
- Scope creep into a task engine: mitigated by explicit prohibition on new persistence/frameworks
- Overconfident lane semantics: mitigated by repo-truth-first lane-classification artifact and conservative omission of unsupported lanes
- Noisy first screen: mitigated by summary-first hierarchy, bounded previews, and collapsed diagnostics
- Link drift: mitigated by reusing current navigation/filter contracts and rerunning existing workspace-hub tests
- Completed-spec churn: mitigated by explicit guardrail that related completed specs remain untouched
Acceptance Criteria
- AC-001:
/admin/governance/inboxreads as the central operator queue, not only as a family queue/table - AC-002: the first major section is the operator summary
- AC-003: items are grouped into clear operator lanes backed by repo truth
- AC-004: active items show reason, impact, source/environment context, and one primary next action
- AC-005: workspace-owned scope is preserved and
environment_idremains visible and local - AC-006: downstream links are scope-correct and do not emit forbidden public query aliases
- AC-007: empty and blocked states are productized and calm
- AC-008: Decision Register and Customer Review Workspace are linked, not rebuilt
- AC-009: focused Feature tests, Browser smoke,
pint --dirty, andgit diff --checkare part of the implementation plan - AC-010: no customer portal, no PSA handoff, no new governance engine, and no shell rewrite are introduced
- AC-011: the
Undefined array key "label"failure is fixed by normalized ViewModel payload contracts, not only by defensive Blade checks - AC-012: active work pages show
Next recommended actionwith a direct item-level CTA in the first viewport - AC-013: zero-count lanes are secondary clear chips/status, and item cards keep secondary detail collapsed on mobile
- AC-014: emitted lane hashes scroll to or visibly mark the lane in browser smoke coverage
Follow-up Candidates
- Evidence and retained artifact lifecycle follow-through
- Provider readiness / onboarding productization
- Localization and customer-safe copy hardening
- Sellable smoke matrix
- PSA / ITSM handoff
Open Questions
These do not block safe preparation, but implementation must resolve them from repo truth:
- Should
alert_delivery_failuresandstale_operationsremain first-class queue lanes, or should they be folded into a broaderBlockedoperator lane with source-family tags? - Can
Recently resolvedbe derived honestly from current runtime timestamps/state, or should that lane be deferred until the repo truth proves a stable bounded rule? - Is
Review-readyalready derivable from current review/evidence/review-pack truth on the inbox page, or should it remain a linked supporting state rather than a first-class lane in v1?
User Scenarios & Testing (mandatory)
User Story 1 - See the governance work that matters first (Priority: P1)
As an MSP/operator user, I want Governance Inbox to show a summary first and group active work into operator lanes so I can decide what to clear next without reconstructing context across multiple pages.
Why this priority: This is the central operator workflow gap identified by Spec 345.
Independent Test: Seed visible findings, exceptions, blocked proof, and review follow-up states; open Governance Inbox; verify summary-first hierarchy, lane headings, and one dominant next action per visible item.
Acceptance Scenarios:
- Given visible governance attention exists, When the operator opens
/admin/governance/inbox, Then the summary appears before secondary queue context and the page groups work by operator lanes. - Given a visible active item exists, When the operator reads the lane item, Then the item shows reason, impact, source/environment context, and one primary next action.
- Given no visible governance work exists, When the operator opens the page, Then the page shows a calm empty state and does not imply hidden work exists elsewhere.
User Story 2 - Keep environment scope explicit and safe (Priority: P1)
As a workspace operator, I want Governance Inbox to remain workspace-owned while using a visible environment_id filter so filtered and clean states stay predictable and leak-free.
Why this priority: Specs 338-341 make this a hard workspace hub contract.
Independent Test: Open clean and filtered URLs, clear the filter, reload, and try retired query aliases plus cross-workspace environment_id values.
Acceptance Scenarios:
- Given the clean inbox URL, When the page loads, Then no hidden environment filter appears from remembered shell/session state.
- Given an entitled
?environment_id=filter, When the page loads, Then the visible environment chip appears and only scoped data is shown. - Given a cross-workspace or retired query alias input, When the page loads, Then the request remains safe and no unsupported filter contract is applied.
User Story 3 - Route into the right downstream truth (Priority: P2)
As an operator, I want each governance item to lead me to the correct existing detail or proof surface so the inbox helps me finish work instead of duplicating it.
Why this priority: the inbox must stay a queue, not another ownership surface.
Independent Test: Click primary actions for representative decision, risk, review, evidence, and blocked items and verify canonical scope-correct targets.
Acceptance Scenarios:
- Given an item requires decision, When the operator chooses its primary action, Then the target is the existing Decision Register or existing decision-owning surface.
- Given an item is blocked on proof or provider state, When the operator chooses its primary action, Then the target is the current operation/proof/readiness surface and the blocker is explicit.
- Given review-ready or customer-safe follow-up exists, When the operator chooses its primary action, Then the target is the existing review workspace or related review surface using
environment_idwhere appropriate.