# agent-scope-9 — live-use fixes round 2 (operator, 2026-07-22)

> Kickoff: Fable, 2026-07-22. Source: operator prompt-line findings while
> using the live app. Four independent seats, one gate. The
> instruction-field overhaul is **NOT** this package (its own kickoff,
> grill in progress).

## Operator findings (verbatim intent)

1. **Right/wrong label UX is bad** — "hard to know if I labelled something
   and it is hard to clear a label". Stakes: examples are generated from
   these labels; a mis-set label teaches the bot wrong.
2. **Feed vs Needs-action inconsistent** — label state renders
   inconsistently between the two presets; Needs-action doesn't show the
   mark at all.
3. **Playground case settings incomplete AND wrong** — not all channels
   listed; impossible combos selectable (WhatsApp + comment case).
4. **Comment replies should CTA to DMs** — live case: comment "Details" got
   "Happy to help with all the details! 🙂". Not wrong, but a comment reply
   should steer to DMs and acknowledge that the DM automation continues the
   conversation there.
5. **No auto-interpretation of new posts on live** — code wiring verified
   complete this session (enqueue at sync-create posts.service.ts:190-192,
   comment-time discovery :614, FB equivalents; worker processor
   main.ts:255-263 → internalApi.interpretPost). So the failure is
   prod-side. Root-cause it, don't symptom-patch.

## Verified facts seats may rely on

- Interpretation REPLACES caption in agent context (comment-policy.ts:65-74)
  — correct per directive 2026-07-20 ①; do not change.
- Caption cache is written on every fresh LLM interpret
  (posts.service.ts:528-532) and read before any spend (:422) — identical
  captions never pay twice.
- Golden-pin precedent (DECISIONS 2026-07-22): WhatsApp goldens stay
  byte-identical; IG/FB pins may regenerate deliberately with the diff
  logged.

## Seats

### Seat A — Activity label UX + preset consistency (findings 1+2)
- Scope: `apps/web` Activity (+api only if the label state shape forces it).
- Acceptance: labelled state instantly visible on the row in BOTH presets;
  clearing = one obvious gesture; identical label rendering Feed vs
  Needs-action; Needs-action shows the mark; tests cover set/clear/render
  in both presets.
- Out of scope: examples generation logic, outcome vocabulary.

### Seat B — Playground channel×case matrix (finding 3)
- Scope: Playground settings; matrix derived from the shared channel/case
  registry (data-driven rule — no hardcoded pairs).
- Acceptance: every real channel listed; impossible combos unselectable;
  a test pins the UI matrix to the engine registry so drift is impossible.

### Seat C — Comment-reply DM CTA (finding 4)
- Scope: comments seed/policy so IG/FB comment replies steer to DMs,
  acknowledging the DM automation. Seed = data (seeded default, operator
  editable), never a hardcoded constant.
- Acceptance: assembled IG/FB comment prompts carry the CTA guidance;
  WhatsApp goldens byte-identical; IG/FB pin changes deliberate + logged;
  a "Details"-style playground turn shows a DM-steering reply.

### Seat D — Auto-interpretation live diagnosis + VPS loose ends (finding 5)
- Scope: prod VPS (SSH root@channels.silveroakglobal.com, key ~/.ssh/sop_vps).
  Diagnose: recent posts without interpretation rows, post-interpret queue
  state, worker logs, internalApi.interpretPost auth/path. Fix root cause,
  deploy, prove with a live interpreted post.
- Also: inspect `stash@{0}` (ig-dm-spike.mjs conflict) and `stash@{1}` on
  main ("deploytemp") — REPORT contents; apply only a trivially-safe
  resolution, else leave and report.
- Out of scope: running the DM spike (needs operator coordination).

## Shared-tree rules (all seats)

Atomic `git commit -- <pathspec>`, rebase with backoff, never delete
index.lock, pushed state must build. Per-package tests (forks pool,
maxForks=2). Deploy loop per CLAUDE.md; health-check after backend deploys.

## Gate (Fable)

- Own-oracle: touched suites green, typecheck/build pass, health green,
  web built + published.
- Each finding demonstrably closed or honestly reported blocked.
- Golden discipline held (WhatsApp byte-identical).

## Stage log

- 2026-07-22: kickoff written; 4 seats dispatched.
