# agent-scope-15 — Activity: logic first, then the ordered rounds

> **Operator order, 2026-07-29:** Activity is "lacking and has low ux stats",
> and prior orders were not all delivered. Wanted: a functionalities mockup
> round, ideas, and a UX + logic review — **logic and functionality first**,
> possibly before the design sweep.
>
> Grounded in the order-vs-reality audit (Opus seat, 2026-07-29; findings
> spot-verified by the orchestrator against the code). Verdict in one line:
> scope-14's defects 9–13 are genuinely done; the overstatement concentrates
> in scope-12's follow-ups and the board's "DELIVERED" line. Two
> mockup-gated orders (ORD-018/019) had **zero work**.

## Phase A — logic/functionality fixes (executor seat, no design decisions)

TDD: each item starts with a failing test that encodes the defect.

- **A1 — the outcome filter must not lie.** The column shows the composite
  outcome (`activity-outcome.ts:80-121`, reads `reviewStatus`/`commentStatus`/
  `decisionSource`); the filter resolves raw `decision` only. Selecting
  "draft waiting" returns rows displaying "replied"; "skipped" misses rejected
  drafts; "deleted"/"flagged" miss commentStatus-derived rows; "failed" misses
  comment-send failures (needs the comment-status join — board follow-up
  12.11, whose pin `agent-feed.service.test.ts:295` must be REWRITTEN, it
  currently asserts the wrong behaviour as intended). Fix server-side: filter
  on the same composition the column displays. Failing tests = the audit's
  divergence cases, one per label.
- **A2 — flow trace-back opens the flow.** `Activity.tsx:128-133` returns
  `kind:"gone"` with a false "Flows screen isn't built yet" note even when
  `flowId` exists. `/automation/flows/:id` is live (`App.tsx:99`). Open it;
  keep the honest "session ended" fallback for null flowId.
- **A3 — no raw node ids on screen.** Details "step" renders
  `currentNodeId` verbatim. Show the node's human title from the flow graph
  (fallback: the flow name + "step" — honest words, never an id).
- **A4 — Needs-action parity.** Filters, checkbox column, bulk bar, replay
  and post-lens are all `preset === "feed"`-gated; the queue the operator
  drains is the less capable half, violating scope-5's own "actionable in
  BOTH presets" law. Un-gate them for the needs preset.
- **A5 — PostPicker everywhere posts are picked.** `Triggers.tsx:168-180`
  still renders a raw caption `<select>`; adopt the shared `PostPicker`.
- **A6 — the table survives 320px.** No `overflow-x` container exists on the
  6-column table; wrap it (tokens-conformant), pending the operator's real
  phone glance.

Oracles: per-package vitest (forks, maxForks=2) green in `apps/web`,
`apps/api`, `packages/shared`; typecheck; builds. The A1 tests must be shown
red first.

## Phase B — the ordered rounds (orchestrator + operator; AFTER A1 lands)

- **B1 — filtration UI round-4 mockups** (ORD-019). Sequenced after A1
  deliberately: a pure-UI round now would ship a prettier wrong filter.
- **B2 — review detail panel redesign mockups** (ORD-018) — the surface the
  operator acts through; zero rounds exist.
- **B3 — ideas + UX review** of the whole screen (impeccable `audit` once the
  plugin is enabled) feeding B1/B2.
- All mockups ship with BINDING/DEMO sheets; operator reaction gates each.

## Phase C — operator-eye-only (no build time; surface at gate)

Defect-12 mark subtlety (Feed row, `wrong` mark under a `flagged` pill, and
its Needs twin) · keyboard shortcuts on live · IG pink 4.48:1 ruling ·
320/375 look after A6.

## Out of scope

Visual redesign outside B's reacted mockups; the design-sweep pipeline
(separate package); any funnel/flow engine change.

## Gate

Phase A: audit items 12.4/12.6/12.10/12.11/12.12/5.3 re-verified DONE by the
orchestrator's own oracles + deployed. Phase B: operator-reacted mockups
ledgered. Board line B.6 ("Activity end-state DELIVERED") corrected at gate.
