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
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.
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.
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
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.
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.
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
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.
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.
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
Kind
Details
Outcome
Comment
investor.ae
is this still available?
sent
Moderation
spam_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
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.
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.
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
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.
Warn before overwriting a note you typed, and otherwise leave the rest alone. Fixes the loss without building the reading surface.
Stop writing notes and keep corrections as bare verdicts. Honest, and it closes the question permanently.