CedarCopilot wants to merge 0 commits into staging from feat/channel-sync-two-tier
Live on prod, no production signal yet
OTEL fallback found no prod spans matching ChannelMessageList since deploy.
OTEL fallback found no prod spans matching inbox.slackChannelMessages and channels.backfill since deploy.
OTEL fallback found no prod spans matching useChannelReactions / crm.toggleReaction since deploy.
Only 9 prod OTEL spans matching Slack DM channel sync reached Libra since the deploy, below the 20-span floor for calling a change verified. Nothing is failing; there is not yet enough traffic to confirm it.
OTEL fallback found no prod spans matching getProxiedImageUrl / SlackStructuredBody image rendering since deploy.
OTEL fallback found no prod spans matching ChannelThreadView and SlackThreadPanel Slack message rendering since deploy.
single_user
single_user
Libra has verdicts on 0 of 7 tracked behaviors on prod; 7 are still being checked. Libra checks hourly for 3 days after each deploy.
Slack and LinkedIn channel-sync work: DMs that sync themselves, Slack images that reach the timeline and the agent's eyes, and the OAuth scopes both depend on.
Three things, each invisible in a different way.
A Slack DM with a customer never synced itself. Both admission routes in bufferSlackMessageEvent are keyed on a channel NAME, and a D… has none , conversations.info returns no name, so the pattern branch continues before it can match. A DM was not unlikely to be admitted; it was structurally unable to be. Measured: 10 DM containers against 811 channels, 8 of the 10 link rows manual, and not one in any connection's selectedChannelIds. Every DM in Cedar got there because a person linked it by hand , while the eight carrying an external counterparty are Slack Connect DMs with meow.com, numeralhq.com, unifygtm.com, warp.dev, evervault.com, juicebox.ai, constructor.io and frontmatter.io.
No Slack image had ever been stored. 41,794 messages, 1,196 flagged has_attachments, 0 with a stored ref. Everything downstream was already built , S3 put, the refs column, the presign, a SlackAttachments component rendering images inline. The pipeline was complete and starved from its first step, because files:read was in neither scope list and Slack answers an unauthorized url_private fetch with 200 and an HTML login page rather than a 401, so the existing guard skipped every file in silence.
An agent could not see any of it. No Slack attachment tool existed, and the vision path was fed only from the user's own chat uploads.
pending and the ladder decides the deal, which it can do on the first message because participants are already recorded. Internal DMs are refused at admission, so Cedar never holds a copy of a rep's DMs with colleagues.files:read/files:write on both lists (the download and upload paths act as the user first), plus groups:write and conversations.connect:write bot-only for external deal channels.read-slack-attachment , reaches PDFs/CSVs/spreadsheets, with the discovery surface that makes it reachable at all.slack-images scopes | status | inspect | backfill, and slack-manifest to generate the app manifest from the scope constants.pnpm --filter @zero/server slack-images-probe
Generates a PNG of four colour bars in a random order, seeds it onto a real message, resolves it through the same code the orchestrator uses, hands it to the real orchestrator agent, and asserts the model names the colours in order , then deletes everything it created.
secret=[redacted] → blue → red → orange
[1] resolveConversationSlackImages → 1 image(s)
[2] buildUserMessageWithMedia → parts: image, text
model said: "Green, Blue, Red, Orange"
✅ PASS
Green on every run since. 294 tests pass; typecheck shows 24 errors, all pre-existing in untouched files; deps:check clean.
The first two probes rendered a six-digit code and asked the model to read it back: 408121 against 484121, then 331122 against 375171. Right length, wrong digits , which looks exactly like a broken pipeline. It wasn't: asked open-endedly, the model accurately described the picture. It had the image and couldn't OCR synthetic glyphs. Colour-bar ordering is reliable; a flaky oracle reports a working pipeline as broken, which is the ambiguity a probe exists to remove.
files:read cannot be granted headlessly. Confirmed against the live grant via Slack's `x
Libra has not measured any production surfaces for this change yet.