Activity + Posts lane · 2026-08-06 · after the deploy

What is left unplanned, drawn so you can rule it

Everything in the lane's build queue shipped today: the six ways live Activity missed its sheet, plus the two you raised this morning. These five are the remainder. Each one is a fact I verified in the code today, not a remembered claim, drawn at the size it would ship with the fork only you can settle.

Nothing here is built. Reading this is the decision: say yes, no, or pick a fork, and it becomes a work order. Two items come from an independent review of today's branch, and one is the direct answer to your own question this morning about whether prompt changes would show in Behaviour. They do not, and neither does anything else the agent says.
A

Everything the agent says is invisible in Behaviour

your question, answered

You asked this morning whether the changes being made would show in Behaviour rather than stay hidden. They would not, and the answer is bigger than the one text: three separate pieces of what the agent says live as settings rows with no screen behind them. Behaviour is driven entirely by the Situations structure plus the agent prompt, and it has no free-form field of any kind, so there is nowhere to put them without deciding where they belong first.

What Behaviour shows today
Situationseditable

The headings you wrote, and what the agent should do in each.

The agent prompteditable

The assembled instruction, shown read-back.

And that is all of it. Three more texts reach real customers and appear nowhere.

What it would show
The DM we open withlive

Sent privately the moment we reply to a comment, on Instagram and Facebook.

What we say if that DM cannot be deliveredlive

Posted publicly instead of the agent's own reply, so we never point someone at an empty inbox.

The comment rulesread-only

How it decides to answer a comment, what shape the answer takes, and the safety rail. Shown so nothing about the agent is hidden, even where it is not yours to edit.

Verified today. grep -rn "commentDmOpener\|COMMENT_DM_OPENER" apps/web returns zero hits. The opener has been live since 2026-08-05 and has never had a screen; the fallback shipped today with the same gap. Both are reachable only through a raw PATCH /api/settings. Your standing order of 2026-08-05 was "all the prompt should be organized and shown in behaviour and not hidden".

The fork

  1. One "What it says" section in Behaviour holding all three, editable where they are yours and read-only where they are not. Everything the agent utters is then in one place, which is what the order asked for. Recommended.
  2. Put them beside the channel gates in Settings instead, on the grounds that the opener is a channel behaviour. Cheaper to build, but splits "what the agent says" across two screens and leaves Behaviour still incomplete.
  3. Leave them as settings rows. Honest only if you accept that changing the public fallback means asking an engineer.
B

A skipped comment still shows a number instead of a reason

breaks a standing law

The row already carries the reason the agent left the comment alone. The screen renders · conf 0.42 instead. That is engineering vocabulary on a screen whose whole rule is plain words, and it has survived three rounds because the panel was never held against the row.

What ships today
Agent › Activity › a held row
held
Instagram · khalid_re · conf 0.42

What is 0.42? Against what? The operator cannot act on this.

What it would say
Agent › Activity › a held row
held
Instagram · khalid_re
The agent was not sure enough to answer this one on its own.

The number moves into the panel, next to the floor it was measured against, where it means something.

Verified today. Activity.tsx:1768 renders · conf {row.confidence.toFixed(2)}. The panel's Why it decided that section already shows the reason properly since today's deploy, so this is the row half of the same defect, not a new one.

The fork

  1. A plain sentence on the row, the number only in the panel. The row says why in words; the panel keeps the figure beside the floor it was judged against. Recommended.
  2. Keep the number, add the floor. 0.42 against a floor of 0.60 is at least complete, but it is still a number where a sentence belongs.
  3. Drop it from the row entirely and say nothing. Cleanest list, but a held row then gives no clue why it is waiting.
C

Two copies of the registry, and nothing keeps them equal

silent when it breaks

The registry decides what a row can be overruled into and what is permanently impossible. It exists twice: the mockup's copy, which the design sheets render, and the ported copy, which both screens and the server now read. Nothing compares them. When they drift, the sheet keeps drawing a control the product no longer offers, and the next design round is reviewed against a lie.

Verified today. packages/shared/src/agent/activity-registry.test.ts imports ./activity-registry.js, the port's own file. No test anywhere reads design/tiles/sweep-activity-posts/activity-registry.js. The lane's own state file has carried the line "the MOCKUP registry and the ported one must not drift, and NOTHING ENFORCES IT" since 2026-08-05, and it is still true.

The fork

  1. Delete the mockup's copy and have the sheet import the port. One registry, drift impossible by construction rather than by vigilance. The sheets become slightly harder to open standalone. Recommended.
  2. A conformance test that fails the build on any difference. Keeps both files, catches drift the moment it happens, and costs a test that has to parse a plain script.
  3. Accept the drift and mark the mockup copy as historical, so nobody reviews against it again.
D

The Kind filter can disagree with the Kind column

from today's review

Filtering by Comment can list rows whose own chip reads Moderation, and filtering by Moderation can return an empty list for rows that are plainly there when unfiltered. A comment held by the moderator is relabelled at display time, and the filter inverts the original derivation, which knows nothing about that relabelling.

Agent › Activity › filtered to Kind = Comment
KindDetailsOutcome
Commentinvestor.ae
is this still available?
sent
Moderationspam_acct
CHEAP CRYPTO DM ME
held

The second row is in a list that says it contains only comments, and its own column says it is not one.

Verified today. The feed service's own stated standard, in that same file, is "the filter can never return a row displaying a different word". Mostly masked on page one, because those rows are deduplicated into Needs action, which is exactly why it would reach you as a puzzle rather than an obvious bug.

The fork

  1. Teach the filter about the relabelling, so Kind = Moderation finds held comments and Kind = Comment excludes them. The filter and the column then agree by construction. Recommended.
  2. Drop the relabelling and let a held comment stay a Comment, with its held state carried by the outcome word alone. Simpler everywhere, but loses a distinction the sheet drew deliberately.
  3. Leave it. It is masked on page one today, and it will surface the first time somebody pages or sorts.
E

A correction explains itself to nobody

grew today

Every correction stores a verdict and a note. The verdict is read in three places. The note is read nowhere. The one method that returns it has no callers at all. So when you review corrections to improve the instructions, you get a list of things marked wrong with no record of why any of them was.

Today made this slightly worse in one specific way: asking the agent to redraft a comment now writes a correction, and that write replaces any verdict and note you had already put on that turn. That is the defined behaviour of the labels spine, and a redraft is genuinely the newer signal, but a sentence you typed can vanish without warning.

Verified today. Every reader selects the verdict only. The verdict half does land: it draws the right/wrong mark on the row and it feeds the replay corpus, so this is not the whole "corrections are kept and never read" item. It is the explanation that is missing.

The fork

  1. Show the note where the mark is. Widen the two reads and render it in the panel, so a correction says why. Small, and it makes the periodic review possible. Recommended.
  2. Warn before overwriting a note you typed, and otherwise leave the rest alone. Fixes the loss without building the reading surface.
  3. Stop writing notes and keep corrections as bare verdicts. Honest, and it closes the question permanently.