I read this as a read-only projection trace - I’ll inspect both source packages, tests, and generated runtime boundaries, then return one falsifiable diagnosis without edits.

WORKING: UI projection - architecture survey and call-graph trace


WORKING: UI projection - mutation semantics, wiring, and generated-boundary comparison


WORKING: UI projection - targeted test verification and suppression diagnosis


I read this as a completed read-only projection trace - below is the exact call graph and one falsifiable suppression diagnosis.

## Projection diagnosis

A correctly revived record is mutated to `status:"running"` and reaches the mutation observer. For a correctly scoped TUI session, the first row-specific condition that can suppress it is:

```ts
manager.wasBackground(record.task_id) === true
```

The real manager always implements `wasBackground`, so status UI selects `backgroundWidgetRows`, not `buildWidgetRows`. A revived foreground task remains non-background and is removed before the active-status filter or `setWidget` row path.

## Exact source call graph

1. `packages/omo-senpi/src/components/task/index.ts:registerTaskTools`
   - Registers `createTaskSendTool` at lines 122-143.

2. `packages/senpi-task/src/tools/control/send.ts:createTaskSendTool.execute`
   - Line 109 calls `runTaskSend`.
   - `runTaskSend` lines 41-61 calls `manager.sendToTask(... deliverAs:"steer")`.

3. `packages/senpi-task/src/manager/manager.ts:TaskManagerImpl.sendToTask`
   - Lines 336-337 delegates to `#steering.sendToTask`.

4. `packages/senpi-task/src/steering/engine.ts:createSteeringEngine.sendToTask`
   - Lines 44-70 resolves the record, classifies it with `messageability`, and dispatches to `reviveTerminal`.
   - `packages/senpi-task/src/state/messageability.ts:messageability`, lines 10-13, classifies `completed/resident` as `"revive"`.

5. `packages/senpi-task/src/steering/engine.ts:reviveTerminal`
   - Lines 80-87:
     - awaits `handle.followUp(message)`;
     - calls `buildRevived`;
     - calls `port.store.replace(revived)`;
     - appends the `revived` event;
     - invokes `reacquireForRevive`.

6. `packages/senpi-task/src/steering/engine.ts:buildRevived`
   - Lines 214-224 strips terminal output/error/stats and produces:
     - `status:"running"` at line 220;
     - `residency_state:"resident"`;
     - incremented `notification.run_epoch` at line 223.

7. Store wrapper chain:
   - `packages/omo-senpi/src/components/task/engine.ts:composeTaskEngine`
     - Base store: line 104.
     - Completion-observing wrapper: line 136.
     - Mutation-notifying wrapper: lines 143-146.
     - Manager receives that notifying store at line 161.
   - `packages/omo-senpi/src/components/task/store-mutation-observer.ts:createMutationNotifyingStore.replace`
     - Lines 13-15 calls the backing replace first, then synchronously calls `onMutation()`.
   - `packages/omo-senpi/src/components/task/completion-bridge.ts:createCompletionObservingStore.replace`
     - Line 35 passes revival replacement directly through; revival is not a terminal notification.
   - `packages/senpi-task/src/store/record-store.ts:createTaskRecordStore.replace`
     - Lines 69-72 atomically writes and refreshes the cache.

8. Observer to UI:
   - `packages/omo-senpi/src/components/task/index.ts:createTaskComponent.register`
     - Line 87 creates `statusUi`.
     - Line 88 registers `engine.onStoreMutation(() => statusUi.scheduleSync())`.
   - `packages/omo-senpi/src/components/task/engine.ts:composeTaskEngine.onStoreMutation`
     - Lines 143-145 fan mutations out to listeners.

9. `packages/omo-senpi/src/components/task/status-ui.ts:createTaskStatusUi.scheduleSync`
   - Lines 132-143 immediately calls `refreshCachedRecords`, caching the post-replace running record before the debounced render.
   - `refreshCachedRecords`, lines 91-98, requires a captured UI and TUI mode, then calls `scopedRecords`.
   - `scopedRecords`, lines 215-219, returns nothing without a session ID and otherwise requests parent-session scope.
   - `TaskManagerImpl.list`, `manager.ts` lines 357-359, filters with `manager-helpers.ts:inSession`, lines 81-82.

10. `packages/omo-senpi/src/components/task/status-ui.ts:renderCachedRecords`
    - Lines 113-115 filters records through `manager.wasBackground`.
    - Because the real manager defines that method, line 120 calls `backgroundWidgetRows`.
    - `packages/omo-senpi/src/components/task/status-row-format.ts:backgroundWidgetRows`
      filters terminal statuses at lines 129-137. A valid revived record is running, so this filter passes.
    - Empty rows call `setWidget("omo-task", undefined)` at lines 121-124.
    - Non-empty rows call `setWidget("omo-task", rows, {placement:"belowEditor"})` at line 126.

## Why background classification is falsifiable

Source manager ownership:

- `manager.ts` line 262 adds tasks only when `run_in_background === true`.
- `promoteToBackground`, lines 399-402, is the other promotion path.
- `wasBackground`, line 405, reads the private background set.
- Neither `task_send` nor revival promotes a foreground task.

Therefore:

> If the revived record is `running/resident`, has the incremented epoch, belongs to the active session, and `manager.wasBackground(taskId)` is false, its absent row is explained by the status-UI filter.

If `wasBackground` is true, this diagnosis is disproven.

## Evidence needed to distinguish it

Capture these facts from the same process/render:

1. `task_send` result is `{kind:"revived"}`.
2. Post-send record is `status:"running"`, `residency_state:"resident"`, with incremented `run_epoch`.
3. Record `parent_session_id` or `root_session_id` equals the captured runtime session ID.
4. Runtime has a UI and `mode` is undefined or `"tui"`.
5. `manager.wasBackground(taskId)`:
   - `false` confirms this suppression;
   - `true` disproves it and shifts attention to observer/debounce/setWidget execution.
6. Last widget call:
   - `undefined` with `wasBackground:false` is the expected projection;
   - rows missing despite `wasBackground:true` requires separate observer/render evidence.

An executable source probe produced:

```json
{"background":false,"lastWidget":{}}
{"background":true,"lastWidget":{"content":["⠇ st_probe · agent:? · model:probe/model · running · 2s"],"placement":"belowEditor"}}
```

## Generated runtime boundary

The installed plugin does not execute the TypeScript component directly:

- `plugin/extensions/omo.js` line 2354 dynamically imports `#omo-task-runtime`.
- `plugin/package.json` line 8 maps that specifier to `extensions/omo-task.js`.

The generated bundle preserves the same projection:

- `omo-task.js:_P/g/O/Pq` line 980: send resolution, revival, record replacement.
- `omo-task.js:N2.sendToTask/N2.wasBackground` line 983: manager delegation and background classification.
- `omo-task.js:s_/XT` line 1021: `runTaskSend` and tool factory.
- `omo-task.js:RW/UW/bU` line 1032: scoped records, background filter, active filter, and both `setWidget` calls.
- `omo-task.js:O9/P9/ER` line 1063: mutation store, engine composition, and component registration.

Boundary difference: generated `N2.wasBackground` reads persisted `TaskRecord.notify_on_terminal`; current source uses an in-memory `#background` set. Generated `Pq` spreads that marker through revival, so an originally background generated-runtime task should remain visible.

Artifact parity cannot be established from this checkout: `build-extension.mjs` lines 47-48 and 99 expect `src/extension/omo-task.ts`, but that entry is absent. The generated artifact can still be inspected directly, and its relevant suppression predicate matches source.

## Verification

Ran the six relevant suites together:

```text
54 pass, 0 fail, 171 assertions
```

They cover same-instance revival for in-process and RPC children, manager epoch mutation, concurrency reacquisition, background rendering, terminal filtering, debounce, and `setWidget`. Notably, no existing status test covers the full revive → mutation observer → real-manager foreground filter path; the live TUI revival scenario uses `run_in_background:true` (`task-tui-scenarios.mjs` lines 9-21). No files were edited.