Non-blocking residual from the fresh-context review of PR #2584 (closes #2501, Paper Inbox scope-replacement truth), tracked here rather than fix-cycled. References are at that PR's round-1 head c3258be.
LOW, latched replacement state with no retry affordance. After #2584, useInboxOrchestrator clears isScopeReplacement only when captureStore.fetchItems reports that it applied the response (~379-381). When the response is dropped (superseded request id) nothing clears the flag and nothing re-triggers a load. If the superseding request then succeeds (listError null, loadingList false), PaperTriageTable falls through every branch: the count span is hidden (!scopeReplacement), the Loading block needs loadingList, the empty state needs !hasItems, and the list renders hidden, so the user sees an empty table body under the count-free eyebrow with no Retry until they re-navigate or capture something.
Reachability today: the only production fetchItems caller other than the orchestrator is captureStore.batchTriage's unscoped post-POST refresh, reachable only through batchAction, which only LegacyInboxView destructures, and Legacy never renders isScopeReplacement; so it needs a Paper-theme toggle mid-batch to be seen. It becomes directly reachable the moment Paper gains a batch action or any second fetchItems call site.
Fix direction: when a scope-replacement load resolves as not applied, either re-issue the load for the current scope or clear the flag once a later applied load for the same scope lands; add a deferred-promise spec for the dropped-then-succeeded ordering.
Refs #2501, #2022, #2570, PR #2584.
Non-blocking residual from the fresh-context review of PR #2584 (closes #2501, Paper Inbox scope-replacement truth), tracked here rather than fix-cycled. References are at that PR's round-1 head c3258be.
LOW, latched replacement state with no retry affordance. After #2584, useInboxOrchestrator clears isScopeReplacement only when captureStore.fetchItems reports that it applied the response (~379-381). When the response is dropped (superseded request id) nothing clears the flag and nothing re-triggers a load. If the superseding request then succeeds (listError null, loadingList false), PaperTriageTable falls through every branch: the count span is hidden (!scopeReplacement), the Loading block needs loadingList, the empty state needs !hasItems, and the list renders hidden, so the user sees an empty table body under the count-free eyebrow with no Retry until they re-navigate or capture something.
Reachability today: the only production fetchItems caller other than the orchestrator is captureStore.batchTriage's unscoped post-POST refresh, reachable only through batchAction, which only LegacyInboxView destructures, and Legacy never renders isScopeReplacement; so it needs a Paper-theme toggle mid-batch to be seen. It becomes directly reachable the moment Paper gains a batch action or any second fetchItems call site.
Fix direction: when a scope-replacement load resolves as not applied, either re-issue the load for the current scope or clear the flag once a later applied load for the same scope lands; add a deferred-promise spec for the dropped-then-succeeded ordering.
Refs #2501, #2022, #2570, PR #2584.