# Round 2 Business Results Coverage Matrix

Snapshot date: `2026-05-11`

Base ref: `origin/main` @ `88073fa`

Inputs:

1. `#1212`
   - Round 2 re-test of `#780`, `#166`, `#730`, `#731`, `#732`
2. `#1111` comment `4417013885`
   - opportunity / activity / approval regression cluster
3. `#1216`
   - quote / contract / order browser workflow retest

Goal:

1. summarize the current business-test signal
2. classify each finding by watchdog proof type
3. decide which gaps are already covered, partially covered, or still need new cases

## Overall Reading

The three QA inputs collapse into four proof classes:

1. direct API/runtime defects
   - watchdog API should prove these directly
2. readiness / seed blockers
   - watchdog readiness cases should isolate these before business scenes run
3. browser-only UI gaps
   - API watchdog cannot close these; browser watchdog is required
4. mixed gaps
   - API already proves backend truth, but business AC still depends on browser affordance or richer contract detail

Current coverage shape:

1. `#1212` family is mostly represented in API watchdog now
2. `#1111` opportunity/activity family is only partially represented
3. `#1216` quote/contract/order family has decent API/readiness coverage, but the dominant remaining blockers are browser-only

## Classification

### A. Already Covered Well By Existing API/Readiness Cases

| Story / area | QA signal | Current watchdog coverage | Reading |
| --- | --- | --- | --- |
| `#780` OAuth revoke path | `#1082` fully fixed | `oauth-revoke-contract-api` | direct API proof already exists |
| `#166` custom object create | `#1087` fully fixed | `custom-object-ddl-create-api` | direct API proof already exists |
| `#166` pluralization contract | standard-object plural fix confirmed; custom-object path still wrong | `custom-object-pluralization-contract-api` | direct API proof already exists for the remaining custom-object gap |
| `#731` role hierarchy seed | round-2 role graph is present | `security-bootstrap-readiness-detail-api`, `user-role-hierarchy-contract-api` | readiness + business API proof already exists |
| `#732` FLS metadata shape | field-permission graph exists | `security-bootstrap-readiness-detail-api`, `opportunity-amount-field-permission-contract-api` | metadata/readiness proof already exists |
| `#745` stage patch side effects | `Probability` stays null after stage change | `opportunity-stage-progress-api` | direct API proof already exists |
| `#160` approval env | no seeded approval definitions | `approval-readiness-api`, `approval-definition-readiness-api` | readiness blocker already modeled |
| `#772` quote create backend path | product / quote graph unblocked after env fixes | `quote-create-api`, `quote-create-contract-api` | backend create contract already represented |
| `#773` quote line item backend path | blocked only because no Quote exists in browser round | `quote-line-items-api`, `quote-line-item-pricing-contract-api` | backend QLI coverage already exists |
| `#771` approval submit backend path | blocked only because browser round never reached a saved Quote | `quote-approval-submit-api`, `approval-submit-tab-api` | backend approval coverage already exists |
| `#172` order create backend path | browser blocked downstream of Quote save | `order-recordtype-readiness-api`, `order-create-api` | readiness + backend create proof already exists |
| `#173` contract management backend path | browser path inconclusive, contract stayed Draft | `quote-order-fixture-readiness-api`, `contract-management-api` | backend status/fixture proof already exists |

### B. Partially Covered; Existing Cases Prove Only Part Of The Business Result

| Story / area | QA signal | Current watchdog coverage | Missing proof |
| --- | --- | --- | --- |
| `#780` userinfo compatibility | `sub/user_id/urls/active` mismatch persists | `oauth-userinfo-claims-api`, `oauth-userinfo-compatibility-contract-api`, `oauth-userinfo-enterprise-url-contract-api`, `oauth-client-credentials-least-privilege-api`, `oauth-lookup-hydration-visibility-api` | API gap set is now present; remaining work is execution signal, not missing case IDs |
| `#730` permission sets | no pass-rate movement; #1093 still gates several ACs | `permission-set-admin-api` | CRUD/admin proof exists, but no direct contrasted write-enforcement case for the gated permission-set flow family |
| `#731` users/roles/sharing | `#1103` changed from validation miss to substrate 500 (`#1210`) | `users-roles-sharing-admin-api`, `sharing-rule-contract-api`, `nested-groups-effective-access-api`, `user-display-name-contract-api`, `user-role-membership-list-contract-api`, `sharing-settings-browser` | named API/browser gap surfaces are now represented; remaining work is runtime behavior, not inventory absence |
| `#732` RLS/FLS | hidden detail leak and hidden write still broken | `effective-access-contrast-api`, `restricted-record-detail-not-found-api`, `opportunity-amount-fls-deny-write-api`, `security-sosl-fls-filter-api`, `security-lookup-hydration-contract-api` | API gap set is now represented; remaining work is execution and runtime closure |
| `#744` products | seeded OLI rollup broken; UI modal missing | `product-catalog-readiness-api`, `opportunity-products-api` | API covers create/product path, but not explicit `OLI.TotalPrice -> Opportunity.Amount` rollup contract |
| `#746` subtabs/actions | partner data model exists but buttons/tabs absent | `opportunity-tabs-actions-api` | API proves backend/query surfaces; browser watchdog is still needed for tab/button rendering |
| `#747` MEDDPICC/forecast/ARR | MEDDPICC green, but ARR / Forecast field-name mismatch remains | `overlay-readiness-api`, `opportunity-field-updates-api` | API covers field update behavior, but no explicit overlay field-name parity contract for spec-named fields |
| `#748` weekly update | bundle missing feature code | `opportunity-weekly-update-api` | API covers persistence, not UI affordance / bundle presence |
| `#174` activity timeline | activity timeline UI regressed; Task.Type still lacks `Weekly Update` | `activity-timeline-api` | API covers seed/query behavior, not Opportunity detail mount behavior or Task.Type picklist parity |
| `#772` quote create browser path | hidden required fields mismatch blocks Save (`#1028`) | `quote-create-api`, `quote-create-contract-api` | backend create works; missing proof is browser required-marker parity |
| `#173` contract upload path | upload path not reached in browser | `contract-management-api` | backend contract status path exists; missing proof is upload button/Files behavior |
| `#172` archived order form upload | browser blocked by Quote path | `order-create-api` | backend create path exists; missing proof is upload affordance and persisted file path |

### C. Added Since The Original Matrix Snapshot

| Story / area | Added coverage | Case |
| --- | --- | --- |
| `#780` client-credentials least privilege | auth least-privilege API coverage landed | `oauth-client-credentials-least-privilege-api` |
| `#780` inaccessible lookup hydration | OAuth-scoped lookup visibility probe landed | `oauth-lookup-hydration-visibility-api` |
| `#166` custom RecordType/page-layout split | RecordType mutation/describe contract landed | `custom-object-recordtype-contract-api` |
| `#730` Permission Set Group surface | PSG route/data contract probe landed | `permission-set-group-contract-api` |
| `#731` per-role user list data surface | per-role membership list API probe landed | `user-role-membership-list-contract-api` |
| `#732` SOSL FLS-filtered search | search-visibility probe landed | `security-sosl-fls-filter-api` |
| `#732` inaccessible lookup hydration | security lookup-hydration probe landed | `security-lookup-hydration-contract-api` |
| `#744` OLI rollup computation | explicit rollup contract landed | `opportunity-oli-rollup-contract-api` |
| `#747` spec/overlay field-name parity | field-name parity API probe landed | `opportunity-forecast-arr-field-parity-api` |
| `#174` Task.Type weekly-update picklist | Task.Type option contract landed | `task-type-weekly-update-contract-api` |

### D. Browser-Only Gap Cases Added Since The Original Matrix Snapshot

| Story / area | Added coverage | Case |
| --- | --- | --- |
| `#748` Weekly Update feature affordance | UI affordance probe landed | `weekly-update-ui-behavior-browser` |
| `#746` subtabs and business actions | Opportunity subtab/action probe landed | `opportunity-subtabs-actions-browser` |
| `#174` Activity timeline mount on Opportunity | Opportunity detail activity-mount probe landed | `opportunity-activity-timeline-browser` |
| `#746` delete dialog wording | delete-dialog wording probe landed | `delete-recycle-bin-copy-browser` |
| `#772` Quote required-field markers | Quote form required-field probe landed | `quote-create-required-fields-browser` |
| `#773` QLI pricing columns in list UI | QLI columns browser probe landed | `quote-line-item-columns-browser` |
| `#771` approval chain / recall UX | approval surface browser probe landed | `quote-approval-submit-recall-browser` |
| `#173` archived contract upload UX | contract upload affordance probe landed | `contract-upload-archived-file-browser` |
| `#172` archived order form upload UX | order upload affordance probe landed | `order-upload-archived-form-browser` |
| `#731` sharing settings SPA behavior | sharing-settings route probe landed | `sharing-settings-browser` |

## Story-By-Story Coverage View

| Story | Current status | Coverage judgment | Next action |
| --- | --- | --- | --- |
| `#780` | mostly API-shaped; 2 deferred ACs remain | `partial` | add least-privilege + lookup-hydration API cases |
| `#166` | main API path covered; RT/layout split still absent | `partial` | add RecordType-focused API case |
| `#730` | basic admin CRUD covered; gated flows remain | `partial` | add PSG / assignment surface API case |
| `#731` | main runtime defects covered; user-list / settings gaps remain | `partial` | add role-membership API case; browser settings case if needed |
| `#732` | main RLS/FLS runtime leaks covered | `partial` | add SOSL + lookup-hydration API cases |
| `#744` | current case too broad for rollup root cause | `partial` | add explicit OLI rollup API case |
| `#745` | current flow case is enough | `covered` | keep existing `opportunity-stage-progress-api` |
| `#746` | backend partly covered; UI missing | `browser-heavy` | add browser subtabs/actions case |
| `#747` | behavior covered, field-name parity not | `partial` | add ARR/Forecast parity API case |
| `#748` | API persistence only; UI affordance missing | `browser-heavy` | add browser weekly-update case |
| `#174` | API seed/query exists; UI mount regression not modeled | `mixed` | add browser timeline case + Task.Type API case |
| `#160` | readiness coverage is already good | `covered` | no new API case needed now |
| `#772` | backend create covered; browser save blocked by required markers | `mixed` | add browser required-field case |
| `#773` | backend QLI data covered; browser columns not | `mixed` | add browser QLI columns case |
| `#771` | backend approval API covered; browser chain/recall not | `mixed` | add browser approval flow case |
| `#173` | backend status path covered; upload UX absent | `mixed` | add browser archived-contract upload case |
| `#172` | backend order path covered; upload UX absent | `mixed` | add browser archived-order upload case |

## Recommended Next Wave

Priority order for case expansion from these business results:

1. API:
   - `opportunity-oli-rollup-contract-api`
   - `security-sosl-fls-filter-api`
   - `task-type-weekly-update-contract-api`
   - `permission-set-group-contract-api`
   - `oauth-client-credentials-least-privilege-api`
2. Browser:
   - `quote-create-required-fields-browser`
   - `quote-approval-submit-recall-browser`
   - `opportunity-subtabs-actions-browser`
   - `weekly-update-ui-behavior-browser`
   - `contract-upload-archived-file-browser`

Bottom line:

1. `#1212` should now be treated as mostly API-covered, with only a few targeted API gaps left
2. `#1111` still needs a real browser lane for opportunity/activity UI behaviors
3. `#1216` is primarily blocked by browser workflow affordances, not by missing API cases
