Implemented the first version of review output resolve actions. Included a ReviewOutputResolveActionMapper, commands to seed browser fixtures, updated CustomerReviewWorkspace, EnvironmentReviewResource, UI enforcement, and related views. Also added extensive unit, feature, and browser tests, and updated the design coverage matrix. Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #422
399 lines
20 KiB
Markdown
399 lines
20 KiB
Markdown
# Spec 351 Browser Flow Audit — Review Output Resolve Actions
|
||
|
||
## Executive Summary
|
||
- Overall readiness: not ready
|
||
- Main flow result: `Create next review` is browser-verifiziert and scope-safe on `environment_id=38`, but the operator loop does not close cleanly because the workspace loses the released-review entry once a draft exists.
|
||
- Top issues:
|
||
- P1: Workspace does not surface `Open draft review` or any successor action once a draft exists; both `environment_id=39` and the post-create state for `environment_id=38` fall back to an empty released-review state.
|
||
- P1: `Publish review` is visible on draft review `14` while the same page still says `Publication blocked` / `Output not customer-ready` and points to `Refresh review` as the next step.
|
||
- P2: `Refresh review` confirms cleanly but gives no browser-verifizierte success toast or obvious state delta, so the operator cannot tell whether anything changed.
|
||
- Recommendation: fix before close
|
||
|
||
## Repo State
|
||
- Branch: `351-review-output-resolve-actions-v1`
|
||
- Dirty tracked files: 26
|
||
- Untracked files: 7
|
||
- Spec 351 active/uncommitted: yes
|
||
- App code already changed: yes
|
||
- Browser flow ran against the current uncommitted working tree: yes
|
||
- Relevant Spec 351 files in the dirty tree:
|
||
- `apps/platform/app/Support/ResolutionGuidance/ResolutionAction.php`
|
||
- `apps/platform/app/Support/ResolutionGuidance/ResolutionCase.php`
|
||
- `apps/platform/app/Support/ResolutionGuidance/Adapters/ReviewPackOutputResolutionAdapter.php`
|
||
- `apps/platform/app/Support/ResolutionGuidance/ReviewOutputResolveActionMapper.php`
|
||
- `apps/platform/app/Filament/Pages/Reviews/CustomerReviewWorkspace.php`
|
||
- `apps/platform/app/Filament/Resources/EnvironmentReviewResource.php`
|
||
- `apps/platform/app/Filament/Resources/EnvironmentReviewResource/Pages/ViewEnvironmentReview.php`
|
||
- `apps/platform/resources/views/filament/pages/reviews/customer-review-workspace.blade.php`
|
||
- `apps/platform/resources/views/components/resolution-guidance-card.blade.php`
|
||
- `apps/platform/tests/Unit/ResolutionGuidance/Spec351ReviewOutputResolveActionMapperTest.php`
|
||
- `apps/platform/tests/Feature/Filament/Spec351CustomerReviewWorkspaceResolveActionTest.php`
|
||
- `apps/platform/tests/Feature/EnvironmentReview/Spec351EnvironmentReviewResolveActionTest.php`
|
||
- `apps/platform/tests/Browser/Spec351ReviewOutputResolveActionsSmokeTest.php`
|
||
- Tests executed during this audit: no
|
||
|
||
## Repo-Verified Action Inventory
|
||
|
||
### Repo-backed resolve actions
|
||
- `create_next_review`
|
||
- type: mutating / operation-backed
|
||
- browser surface: Customer Review Workspace and Environment Review detail
|
||
- confirmation: yes
|
||
- capability: `Capabilities::ENVIRONMENT_REVIEW_MANAGE`
|
||
- audit / operation backing: `AuditActionId::EnvironmentReviewSuccessorCreated`, `OperationRunType::EnvironmentReviewCompose`
|
||
- `refresh_review`
|
||
- type: mutating / operation-backed
|
||
- browser surface: Environment Review detail only
|
||
- confirmation: yes
|
||
- capability: `Capabilities::ENVIRONMENT_REVIEW_MANAGE`
|
||
- audit / operation backing: `AuditActionId::EnvironmentReviewRefreshed`, `OperationRunType::EnvironmentReviewCompose`
|
||
- `publish_review`
|
||
- type: mutating / domain action
|
||
- browser surface: Environment Review detail only
|
||
- confirmation: yes
|
||
- capability: `Capabilities::ENVIRONMENT_REVIEW_MANAGE`
|
||
- audit backing: `AuditActionId::EnvironmentReviewPublished`
|
||
- `open_successor_review`
|
||
- type: navigation
|
||
- browser surface: detail action when `superseded_by_review_id` resolves to a same-scope review
|
||
- confirmation: no
|
||
|
||
### Fallback / navigation actions
|
||
- `resolve_review_blockers`
|
||
- `open_evidence_basis`
|
||
- `open_operation_proof`
|
||
- `open_review`
|
||
- download actions such as `download_review_pack_with_limitations`
|
||
|
||
### Actions intentionally not offered as executable in workspace
|
||
- `refresh_review`
|
||
- `publish_review`
|
||
- generic “fix automatically”
|
||
- generic “make customer-ready”
|
||
|
||
## Browser Environment
|
||
- Base URL: `http://localhost`
|
||
- User: authenticated workspace manager; resulting compose operations were initiated by `Ahmed Darrazi` (repo-verifiziert after mutation)
|
||
- Workspace: `wp` / workspace `3`
|
||
- Environments used:
|
||
- `38` — `Spec342 Demo Evidence Incomplete`
|
||
- `39` — `Spec342 Demo Ready`
|
||
- Reviews used:
|
||
- `3` — published review for environment `38`, later superseded by `14`
|
||
- `14` — draft created during this audit for environment `38`
|
||
- `4` — superseded released review for environment `39`
|
||
- `13` — existing draft for environment `39`
|
||
- Review / pack state:
|
||
- environment `38` pre-action: published blocked output, review pack `4`, operation `24`
|
||
- environment `38` post-create: draft `14`, operation `47`, previous review `3` now `superseded_by_review_id=14`
|
||
- environment `39`: released review `4` already superseded by draft `13`
|
||
|
||
## Flow Walkthrough
|
||
|
||
### Step 0 — Existing-draft workspace state (`environment_id=39`)
|
||
- Step: reload current `Customer Review Workspace`
|
||
- URL: `http://localhost/admin/reviews/workspace?environment_id=39`
|
||
- Visible title: `Customer Review Workspace - TenantPilot`
|
||
- Primary guidance state: not present
|
||
- Primary action: not present
|
||
- Secondary actions: not present
|
||
- Clicked action: none
|
||
- Expected result: if an existing draft is the next repo-backed step, the workspace should guide to it
|
||
- Actual result:
|
||
- browser-verifiziert: workspace shows `No released customer reviews match the active environment filter.`
|
||
- repo-verifiziert: environment `39` has superseded review `4` plus draft `13`
|
||
- nicht vorhanden: `Open draft review`
|
||
- Scope preserved? yes
|
||
- Console errors? no
|
||
- Network/server errors? no visible server error page
|
||
- Toast/notification: none
|
||
- State changed? no
|
||
- Operator clarity: low; the workspace gives no next step for an environment that already has a draft successor
|
||
- Issue: successor/draft flow is unreachable from the workspace once the released review is superseded
|
||
- Severity: P1
|
||
- Screenshot: `00-workspace-env39-no-released-review.png`
|
||
|
||
### Step 1 — Published blocked workspace (`environment_id=38`)
|
||
- Step: open blocked released-review workspace state
|
||
- URL: `http://localhost/admin/reviews/workspace?environment_id=38`
|
||
- Visible title: `Customer Review Workspace - TenantPilot`
|
||
- Primary guidance state: `Output not customer-ready` / `Requires review`
|
||
- Primary action: `Create next review`
|
||
- Secondary actions:
|
||
- `Inspect review blockers`
|
||
- `Download review pack with limitations`
|
||
- `Open evidence basis`
|
||
- `Open operation proof`
|
||
- Clicked action: none
|
||
- Expected result: one dominant real next step with secondary supporting actions
|
||
- Actual result:
|
||
- browser-verifiziert: one dominant `Create next review` CTA
|
||
- browser-verifiziert: supporting actions are visually subordinate
|
||
- browser-verifiziert: acknowledgement copy distinguishes consumption from customer-ready status
|
||
- Scope preserved? yes
|
||
- Console errors? no
|
||
- Network/server errors? no visible server error page
|
||
- Toast/notification: none
|
||
- State changed? no
|
||
- Operator clarity: high on first screen
|
||
- Issue: none at this step
|
||
- Severity: none
|
||
- Screenshot: `01-customer-review-workspace-output-not-ready.png`
|
||
|
||
### Step 2 — Create next review confirmation
|
||
- Step: click `Create next review`
|
||
- URL: `http://localhost/admin/reviews/workspace?environment_id=38`
|
||
- Visible title: `Customer Review Workspace - TenantPilot`
|
||
- Primary guidance state: unchanged beneath modal
|
||
- Primary action: `Create next review`
|
||
- Secondary actions: unchanged beneath modal
|
||
- Clicked action: `Create next review`
|
||
- Expected result: confirmation before mutation
|
||
- Actual result:
|
||
- browser-verifiziert: confirmation modal appears with `Create next review?`
|
||
- Scope preserved? yes
|
||
- Console errors? no
|
||
- Network/server errors? no visible server error page
|
||
- Toast/notification: modal only
|
||
- State changed? not yet
|
||
- Operator clarity: high
|
||
- Issue: none
|
||
- Severity: none
|
||
- Screenshot: `02-create-next-review-primary-action.png`
|
||
|
||
### Step 3 — Result after create-next-review confirmation
|
||
- Step: confirm `Create next review`
|
||
- URL: `http://localhost/admin/workspaces/3/environments/spec342-demo-evidence-incomplete/environment-reviews/14?source_surface=customer_review_workspace&tenant_filter_id=38`
|
||
- Visible title: `View Review - TenantPilot`
|
||
- Primary guidance state: draft review detail, initially `Internal only`, then `Publication blocked` / `Output not customer-ready` after refresh interactions
|
||
- Primary action: `Refresh review`
|
||
- Secondary actions:
|
||
- `Inspect review blockers`
|
||
- `Open evidence basis`
|
||
- `Open operation proof`
|
||
- Clicked action: confirmed `Create next review`
|
||
- Expected result: new draft is created and opened in the correct environment scope
|
||
- Actual result:
|
||
- browser-verifiziert: detail page for review `14` opens
|
||
- repo-verifiziert: review `14` exists as draft and review `3` is now superseded by `14`
|
||
- browser-verifiziert: `tenant_filter_id=38` and environment scope are preserved in the URL
|
||
- Scope preserved? yes
|
||
- Console errors? no
|
||
- Network/server errors? no visible server error page
|
||
- Toast/notification: none clearly visible at landing time
|
||
- State changed? yes
|
||
- Operator clarity: medium; the draft opens correctly, but the route is a normal detail route rather than a suppressed customer-workspace detail route
|
||
- Issue: no direct break, but the operator has already left the calm workspace surface
|
||
- Severity: P2
|
||
- Screenshot: `03-after-create-next-review-draft.png`
|
||
|
||
### Step 4 — Draft review guidance
|
||
- Step: inspect the newly opened draft detail
|
||
- URL: `http://localhost/admin/workspaces/3/environments/spec342-demo-evidence-incomplete/environment-reviews/14?source_surface=customer_review_workspace&tenant_filter_id=38`
|
||
- Visible title: `View Review - TenantPilot`
|
||
- Primary guidance state: `Output not customer-ready` / `Publication blocked`
|
||
- Primary action: `Refresh review`
|
||
- Secondary actions:
|
||
- `Inspect review blockers`
|
||
- `Open evidence basis`
|
||
- `Open operation proof`
|
||
- Clicked action: none
|
||
- Expected result: next action should align with missing inputs / stale evidence
|
||
- Actual result:
|
||
- browser-verifiziert: detail guidance points to `Refresh review`
|
||
- browser-verifiziert: boundary copy remains non-customer-safe
|
||
- browser-verifiziert + repo-verifiziert: `Publish review` is still visible in the header on this not-ready draft
|
||
- Scope preserved? yes
|
||
- Console errors? no
|
||
- Network/server errors? no visible server error page
|
||
- Toast/notification: none
|
||
- State changed? no
|
||
- Operator clarity: medium; the guidance is clear, but the visible `Publish review` header CTA competes with it
|
||
- Issue: readiness and publish availability are contradictory on the same screen
|
||
- Severity: P1
|
||
- Screenshot: `04-draft-review-guidance.png`
|
||
|
||
### Step 5 — Refresh review inputs
|
||
- Step: open and confirm `Refresh review`
|
||
- URL: `http://localhost/admin/workspaces/3/environments/spec342-demo-evidence-incomplete/environment-reviews/14?source_surface=customer_review_workspace&tenant_filter_id=38`
|
||
- Visible title: `View Review - TenantPilot`
|
||
- Primary guidance state: remains blocked / refresh-oriented
|
||
- Primary action: `Refresh review`
|
||
- Secondary actions: unchanged
|
||
- Clicked action: `Refresh review`
|
||
- Expected result: obvious success feedback or visible state transition
|
||
- Actual result:
|
||
- browser-verifiziert: confirmation opens
|
||
- browser-verifiziert: confirm completes without console errors
|
||
- browser-verifiziert: no obvious success toast, no clear state delta, no new operator-facing completion cue
|
||
- plausibel: refresh may have run, but the UI does not make that outcome legible
|
||
- Scope preserved? yes
|
||
- Console errors? no
|
||
- Network/server errors? no visible server error page
|
||
- Toast/notification: none browser-verifiziert
|
||
- State changed? not obvious
|
||
- Operator clarity: low after confirmation
|
||
- Issue: refresh feedback is too weak for an action that is supposed to move the draft forward
|
||
- Severity: P2
|
||
- Screenshot: `05-refresh-review-inputs-if-available.png`, `06-after-refresh-result.png`
|
||
|
||
### Step 6 — Evidence basis target
|
||
- Step: click `View evidence snapshot`
|
||
- URL: `http://localhost/admin/workspaces/3/environments/spec342-demo-evidence-incomplete/evidence/5`
|
||
- Visible title: `View Evidence Snapshot - TenantPilot`
|
||
- Primary guidance state: evidence page
|
||
- Primary action: none in scope for this audit
|
||
- Secondary actions: page-local
|
||
- Clicked action: `View evidence snapshot`
|
||
- Expected result: correct environment-scoped evidence detail
|
||
- Actual result:
|
||
- browser-verifiziert: correct evidence detail opens
|
||
- browser-verifiziert: environment scope remains `Spec342 Demo Evidence Incomplete`
|
||
- Scope preserved? yes
|
||
- Console errors? no
|
||
- Network/server errors? no visible server error page
|
||
- Toast/notification: none
|
||
- State changed? navigated
|
||
- Operator clarity: good
|
||
- Issue: none
|
||
- Severity: none
|
||
- Screenshot: `08-evidence-basis-target.png`
|
||
|
||
### Step 7 — Operation proof target
|
||
- Step: click visible `Open operation` for the current draft
|
||
- URL: `http://localhost/admin/workspaces/3/operations/47`
|
||
- Visible title: `Operation #47 - TenantPilot`
|
||
- Primary guidance state: operation detail
|
||
- Primary action: none in scope for this audit
|
||
- Secondary actions: page-local
|
||
- Clicked action: `Open operation`
|
||
- Expected result: operation proof opens for the current review/compose context
|
||
- Actual result:
|
||
- browser-verifiziert: operation page opens
|
||
- browser-verifiziert: operation shows compose context and succeeded outcome
|
||
- Scope preserved? yes
|
||
- Console errors? no
|
||
- Network/server errors? no visible server error page
|
||
- Toast/notification: none
|
||
- State changed? navigated
|
||
- Operator clarity: good
|
||
- Issue: none
|
||
- Severity: none
|
||
- Screenshot: `09-operation-proof-target.png`
|
||
|
||
### Step 8 — Customer-workspace detail context
|
||
- Step: open released review `3` directly in customer-workspace detail mode
|
||
- URL: `http://localhost/admin/workspaces/3/environments/spec342-demo-evidence-incomplete/environment-reviews/3?customer_workspace=1&source_surface=customer_review_workspace&tenant_filter_id=38`
|
||
- Visible title: `View Review - TenantPilot`
|
||
- Primary guidance state: released review detail with customer-workspace context note
|
||
- Primary action: suppressed
|
||
- Secondary actions: suppressed in the guidance card
|
||
- Clicked action: direct route open
|
||
- Expected result: no duplicate CTA rail and clear context note
|
||
- Actual result:
|
||
- browser-verifiziert: context note `You are already on the review detail for this output.`
|
||
- browser-verifiziert: no visible `Create next review`, `Publish review`, or `Refresh review` buttons in the guidance surface
|
||
- browser-verifiziert: review status, output readiness, publication/sharing state, and limitations remain visible
|
||
- Scope preserved? yes
|
||
- Console errors? no
|
||
- Network/server errors? no visible server error page
|
||
- Toast/notification: none
|
||
- State changed? navigated
|
||
- Operator clarity: good
|
||
- Issue: none
|
||
- Severity: none
|
||
- Screenshot: `10-review-detail-customer-workspace-context.png`
|
||
|
||
### Step 9 — Final workspace state after create-next-review
|
||
- Step: return to `Customer Review Workspace` filtered to environment `38`
|
||
- URL: `http://localhost/admin/reviews/workspace?environment_id=38`
|
||
- Visible title: `Customer Review Workspace - TenantPilot`
|
||
- Primary guidance state: not present
|
||
- Primary action: not present
|
||
- Secondary actions: not present
|
||
- Clicked action: direct workspace return
|
||
- Expected result: show current draft / successor review as the next repo-backed step
|
||
- Actual result:
|
||
- browser-verifiziert: workspace now shows `No released customer reviews match the active environment filter.`
|
||
- repo-verifiziert: environment `38` has draft `14` and released review `3` is superseded by it
|
||
- nicht vorhanden: `Open draft review`
|
||
- Scope preserved? yes
|
||
- Console errors? no
|
||
- Network/server errors? no visible server error page
|
||
- Toast/notification: none
|
||
- State changed? yes, but the state is not actionable from the workspace
|
||
- Operator clarity: low
|
||
- Issue: the main operator loop breaks after the successful creation of a next review
|
||
- Severity: P1
|
||
- Screenshot: `11-final-customer-review-workspace-state.png`
|
||
|
||
## Screenshot Index
|
||
|
||
| Step | Screenshot | Notes |
|
||
| --- | --- | --- |
|
||
| Extra | `00-workspace-env39-no-released-review.png` | Existing-draft environment filtered to an empty released-review state |
|
||
| 1 | `01-customer-review-workspace-output-not-ready.png` | Good first-screen blocked-output hierarchy |
|
||
| 2 | `02-create-next-review-primary-action.png` | Confirmation modal present |
|
||
| 3 | `03-after-create-next-review-draft.png` | Draft detail opened after mutation |
|
||
| 4 | `04-draft-review-guidance.png` | Draft detail shows refresh-first guidance |
|
||
| 5 | `05-refresh-review-inputs-if-available.png` | Refresh confirmation |
|
||
| 5 result | `06-after-refresh-result.png` | No clear operator-facing success cue |
|
||
| 4 / 6 | `07-publish-review-if-available.png` | `Publish review` visible on not-ready draft |
|
||
| 6 | `08-evidence-basis-target.png` | Evidence target correct |
|
||
| 7 | `09-operation-proof-target.png` | Operation target correct |
|
||
| 8 | `10-review-detail-customer-workspace-context.png` | CTA suppression works in explicit customer-workspace mode |
|
||
| 9 | `11-final-customer-review-workspace-state.png` | Final workspace loses actionable successor/draft state |
|
||
|
||
## Findings
|
||
|
||
### P0 Blockers
|
||
- none confirmed
|
||
|
||
### P1 High
|
||
- Workspace successor flow is broken once a draft exists.
|
||
- browser-verifiziert: `environment_id=39` and post-create `environment_id=38` both end in `No released customer reviews match the active environment filter.`
|
||
- repo-verifiziert: both environments have a draft successor (`13` for env `39`, `14` for env `38`).
|
||
- impact: the operator cannot return to the workspace and continue with `Open draft review` or equivalent successor guidance.
|
||
- `Publish review` is visible on non-ready draft review `14`.
|
||
- browser-verifiziert: draft detail shows `Publication blocked` / `Output not customer-ready` and still surfaces a visible `Publish review` header CTA.
|
||
- repo-verifiziert: `publish_review` is only hidden when the review is not mutable; it is not readiness-gated in the page action.
|
||
- impact: the UI offers a competing high-impact mutation while the guidance says the draft is not yet publishable.
|
||
|
||
### P2 Medium
|
||
- Refresh confirmation lacks clear operator feedback.
|
||
- browser-verifiziert: confirming `Refresh review` produced no visible success toast or obvious page-state transition.
|
||
- impact: the operator cannot tell whether the action succeeded, retried, or no-op’d.
|
||
- Create-next-review leaves the calm workspace surface immediately and opens a normal detail surface.
|
||
- browser-verifiziert: redirect URL is a normal review detail route with `source_surface` and `tenant_filter_id`, not `customer_workspace=1`.
|
||
- impact: the flow is technically correct, but it weakens the “resolve from workspace” productization story and makes the return path more dependent on detail behavior.
|
||
|
||
### P3 Polish
|
||
- None worth separating from the medium issues in this slice.
|
||
|
||
## Productization Assessment
|
||
- Guidance quality: good on the first blocked workspace surface; mixed once the flow moves into mutable review detail.
|
||
- Next-action clarity: good before mutation, weak after mutation because successor/draft state disappears from the workspace and `Publish review` competes with `Refresh review`.
|
||
- Scope correctness: good; workspace `3`, environment scope, `tenant_filter_id=38`, evidence target, and operation target all stayed in the right tenant/environment.
|
||
- Customer-safe boundary: good on the workspace and customer-workspace detail surfaces; no false customer-ready claim was shown while blocked.
|
||
- UI density: improved on the workspace; draft detail is denser and mixes blocked guidance with broad lifecycle controls.
|
||
- Resolve vs Diagnose: partially successful; the flow resolves into a real draft, but the loop back to the workspace does not remain actionable.
|
||
|
||
## Recommended Fix Scope
|
||
|
||
### Must be fixed before closing Spec 351
|
||
- Restore a workspace-visible successor/draft action once a released review is superseded.
|
||
- Align `Publish review` visibility with actual readiness, or clearly demote/gate it when the draft is blocked.
|
||
|
||
### Can be deferred
|
||
- Stronger success feedback for `Refresh review` if the refresh semantics are otherwise correct.
|
||
|
||
### Should not be changed
|
||
- Keep the single dominant primary CTA and subordinate supporting actions on the blocked workspace surface.
|
||
- Keep the customer-workspace detail CTA suppression behavior.
|
||
- Keep the evidence-basis and operation-proof targets as repo-backed supporting actions.
|
||
|
||
## Final Recommendation
|
||
- Close Spec 351? no
|
||
- Continue polish? no, fix the P1 workflow issues first
|
||
- Next suggested spec? none until the Spec 351 operator loop is closed end-to-end
|