Libra CodeHub

CedarCopilot/cedar-mail

Branch: staging

[2026-08-26] merging staging to main

merged#2602CedarCopilot

CedarCopilot wants to merge 1 commit into main from staging

Live on prod, no production signal yetTimeline and evidence
  1. Opened
    Aug 26, 2026, 7:29 PM
  2. Merged
    Aug 26, 2026, 7:38 PM
  3. Live on prod
    Aug 26, 2026, 7:38 PM
  4. Observed 27 hours
    Aug 26, 2026, 7:38 PM
  5. Pipelines steady after this deploy
    Aug 26, 2026, 7:38 PM
  6. Aug 26, 2026, 7:39 PM
  7. Unobserved

    Live on prod, no production signal yet

    Aug 27, 2026, 10:50 PM

Behaviors Libra is checking

The conversation semantic-search tool exposes only working vector and full-text modes, preventing agents from selecting the unimplemented hybrid mode that falsely promised keyword search.Inconclusivelow confidence

OTEL fallback found no prod spans matching conversation-read search-semantic / SearchToolInputSchema since deploy.

prod, checked Aug 27, 2026, 9:15 PM
For questions about a specific named call or email, the conversation agent is directed to resolve the event ID and retrieve the complete event instead of answering from truncated top-k semantic-search fragments.Inconclusivelow confidence

OTEL fallback found no prod spans matching conversation-read tool instructions since deploy.

prod, checked Aug 27, 2026, 9:15 PM
Conversations with multiple CRM deals select an explicitly active deal first, otherwise the newest known-open and identified deal, avoiding stale, unknown-state, or bare partial links being shown as the active deal.Inconclusivelow confidence

OTEL fallback found no prod spans matching pickActiveDeal / conversation CRM badges since deploy.

prod, checked Aug 27, 2026, 9:17 PM
When external CRM events or actions link a deal to a conversation, the link immediately retains the deal name, stage, closed state, and update time rather than waiting for nightly reconciliation to enrich it.Inconclusivelow confidence

OTEL fallback found no prod spans matching linkExternalCrmDeal via createAndLinkEvents, assignEventToConversation, and external CRM execution since deploy.

prod, checked Aug 27, 2026, 9:17 PM
The daily CRM deal reconciliation job correctly reads the advisory-lock result from supported database drivers so it runs when it acquires the lock instead of silently skipping every run.Inconclusivelow confidence

OTEL fallback found no prod spans matching processCrmDealReconciliation / [CRM_RECONCILE] since deploy.

prod, checked Aug 27, 2026, 10:17 PM
Duplicate meeting-recording deliveries hydrate a previously stored meeting with late-arriving transcript content without rerunning agents and duplicating recaps, drafts, or CRM writes.Inconclusivelow confidence

Only 18 prod OTEL spans matching handleExecuteMeeting 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.

prod, checked Aug 27, 2026, 10:50 PM

Failures attributed to this change

error @ GET /<redacted-token>/<id>.jsonIntroducedmedium confidence

unknown

prod, first seen Aug 26, 2026, 7:58 PM
error @ GET /<redacted-token>/<id>.jsonIntroducedmedium confidence

unknown

prod, first seen Aug 26, 2026, 8:13 PM
error @ GET /<redacted-token>/<id>.jsonIntroducedmedium confidence

unknown

prod, first seen Aug 26, 2026, 8:13 PM
error @ GET /<redacted-token>/<id>.jsonIntroducedmedium confidence

unknown

prod, first seen Aug 26, 2026, 8:21 PM
error @ GET /<redacted-token>/<id>.jsonIntroducedmedium confidence

unknown

prod, first seen Aug 26, 2026, 8:36 PM
error @ GET /<redacted-token>/<id>.jsonIntroducedmedium confidence

unknown

prod, first seen Aug 26, 2026, 9:55 PM
error @ GET /<redacted-token>/<id>.jsonIntroducedmedium confidence

unknown

prod, first seen Aug 26, 2026, 11:25 PM
error @ GET /<redacted-token>/9390779.jsonIntroducedmedium confidence

unknown

prod, first seen Aug 27, 2026, 7:39 AM
error @ GET /<redacted-token>/8408666.jsonIntroducedmedium confidence

unknown

prod, first seen Aug 27, 2026, 7:39 AM
error @ GET /<redacted-token>/9512414.jsonIntroducedmedium confidence

unknown

prod, first seen Aug 27, 2026, 7:39 AM
error @ GET /<redacted-token>/7044977.jsonIntroducedmedium confidence

unknown

prod, first seen Aug 27, 2026, 7:39 PM
Customer impact is not proven from the retained evidence. 0 hits · 1 user · no retained trace sample.Introducedmedium confidence

single_user

prod, first seen Aug 28, 2026, 9:31 AM
error @ GET /<redacted-token>/7339726.jsonIntroducedmedium confidence

unknown

prod, first seen Aug 29, 2026, 7:39 PM
error @ GET /<redacted-token>/9389470.jsonIntroducedmedium confidence

unknown

prod, first seen Aug 30, 2026, 7:39 PM

Libra has verdicts on 0 of 8 tracked behaviors on prod; 8 are still being checked. Libra attributed 14 failures to this change at medium confidence and is still confirming them. Libra checks hourly for 3 days after each deploy.

Greptile Summary

This change expands Slack channel linking and shared-channel webhook routing, along with CRM and document-processing updates. Runtime checks reproduced two channel-availability failures: shared-channel admission data can be reused across unrelated Slack workspaces with colliding channel IDs, and linking can list a bot's channels instead of the requested user's channels when the user token is unavailable. These failures can prevent valid automations and channels from being selected.

Confidence Score: 3/5

Not safe to merge until Slack channel-team caching is isolated by workspace context and user membership listing stops falling back to bot credentials.

Both failures were reproduced by focused runtime harnesses that exercised the production dispatch and channel-listing functions, with comparison cases confirming the expected behavior when the triggering condition is absent.

Files Needing Attention: apps/server/src/services/playbook/playbook-webhook-sources.ts and apps/server/src/services/integrations/slack/slack-api.ts.

T-Rex T-Rex Logs

What T-Rex did

  • T-Rex ran the focused cache-collision harness and baseline checks to validate cache behavior and confirm the product-source remained unchanged.
  • T-Rex exercised the Slack membership fallback harness with and without the requested user's Slack token, capturing runtime outputs to verify behavior.
  • T-Rex posted a P1 finding with no artifacts attached.
  • T-Rex validated channel-team cache-collision behavior and the Slack membership fallback via separate validations, running the dedicated test harness and Vitest, with all tests passing and exit code 0.
  • T-Rex posted a second P1 finding.

View all artifacts

T-Rex Ran code and verified through T-Rex

Comments Outside Diff (2)

  1. General comment

    P1 Channel-team cache leaks across unrelated Slack workspaces with colliding channel IDs

    • Bug
      • After workspace A resolves a colliding channel ID, workspace B receives A's cached channel-team set instead of querying Slack using B's candidate owner. Since B's incoming workspace is absent from A's set, B's otherwise valid registration is categorized as foreign and dispatch returns zero rather than enqueueing it.
    • Cause
      • resolveChannelTeams keys the cache exclusively by channelId at line 366 despite the Slack lookup result being obtained through a candidate owner's workspace-scoped credentials and used as workspace authorization proof. The cached read at lines 368-371 bypasses Slack lookup for B.
    • Fix
      • Partition the cache by the workspace/credential context that establishes channel identity (for example, the registration source workspace or candidate-owner workspace), or avoid cross-workspace caching of channel-team authorization results. Add a regression test for two unrelated workspaces with the same channel ID.

    <

Show production surfaces and changed-file mapping

Production surfaces

Libra has not measured any production surfaces for this change yet.

Changed files → surfaces

  • .claude/skills/account-setup-from-transcript/SKILL.mdno production surface mapped
  • apps/mail/modules/crm/types/index.tsno production surface mapped
  • apps/server/src/cron/process-crm-deal-reconciliation.tsno production surface mapped
  • apps/server/src/db/__tests__/result-shape.test.tsno production surface mapped
  • apps/server/src/db/aop-schema.tsno production surface mapped
  • apps/server/src/db/integration-schemas.tsno production surface mapped
  • apps/server/src/db/migrations/playbook_webhook_source_workspace.sqlno production surface mapped
  • apps/server/src/db/result-shape.tsno production surface mapped
  • apps/server/src/mastra/routeHandlers/event-execution/handleExecuteExternalCrm.tsno production surface mapped
  • apps/server/src/mastra/routeHandlers/event-execution/handleExecuteMeeting.tsno production surface mapped
  • apps/server/src/mastra/tools/conversation/__tests__/conversationTool.test.tsno production surface mapped
  • apps/server/src/mastra/tools/conversation/conversationTool.tsno production surface mapped
  • apps/server/src/mastra/tools/conversation/searchTurbopufferTool.tsno production surface mapped
  • apps/server/src/mastra/tools/event-execution/__tests__/createAndLinkEvents-external-crm.test.tsno production surface mapped
  • apps/server/src/mastra/tools/event-execution/assignEventToConversationTool.tsno production surface mapped
  • apps/server/src/mastra/tools/event-execution/createAndLinkEventsTool.tsno production surface mapped
  • apps/server/src/mastra/utils/context-formatting/__tests__/html-to-agent-markdown.test.tsno production surface mapped
  • apps/server/src/mastra/utils/context-formatting/event-context.tsno production surface mapped
  • apps/server/src/services/account-deletion/db-purge.tsno production surface mapped
  • apps/server/src/services/account-deletion/external-purge.tsno production surface mapped
  • apps/server/src/services/account-deletion/index.tsno production surface mapped
  • apps/server/src/services/account-deletion/result-shape.tsno production surface mapped
  • apps/server/src/services/crm/__tests__/active-deal.test.tsno production surface mapped
  • apps/server/src/services/crm/__tests__/meeting-event-hydration.test.tsno production surface mapped
  • apps/server/src/services/crm/__tests__/stage-inference.test.tsno production surface mapped
  • apps/server/src/services/crm/active-deal.tsno production surface mapped
  • apps/server/src/services/crm/crm-deal-auto-link.tsno production surface mapped
  • apps/server/src/services/crm/external-crm-events.tsno production surface mapped
  • apps/server/src/services/crm/meeting-events.tsno production surface mapped
  • apps/server/src/services/crm/move-event.tsno production surface mapped
  • apps/server/src/services/crm/stage-inference.tsno production surface mapped
  • apps/server/src/services/documents/__tests__/subagent-agent-id.test.tsno production surface mapped
  • apps/server/src/services/documents/convention-paths.tsno production surface mapped
  • apps/server/src/services/documents/index.tsno production surface mapped
  • apps/server/src/services/integrations/slack/__tests__/channel-change-detection.test.tsno production surface mapped
  • apps/server/src/services/integrations/slack/__tests__/list-user-slack-channels.test.tsno production surface mapped
  • apps/server/src/services/integrations/slack/__tests__/slack-config-shape.test.tsno production surface mapped
  • apps/server/src/services/integrations/slack/link-matching-channels.tsno production surface mapped
  • apps/server/src/services/integrations/slack/slack-api.tsno production surface mapped
  • apps/server/src/services/integrations/slack/slack-sync.tsno production surface mapped
  • apps/server/src/services/playbook/__tests__/playbook-webhook-sources.test.tsno production surface mapped
  • apps/server/src/services/playbook/playbook-webhook-registration.tsno production surface mapped
  • apps/server/src/services/playbook/playbook-webhook-sources.tsno production surface mapped
  • apps/server/src/services/turbopuffer/search.tsno production surface mapped
  • apps/server/src/trpc/routes/crm.tsno production surface mapped
  • docs/changelogs/2026-W35.mdno production surface mapped