docs/plans/2026-07-17-observed-channel-delivery-targets.md
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task.
Goal: Expose a fresh, workspace-scoped graph of dynamically observed direct users, groups, topics, and their observed users with complete platform identifiers.
Architecture: ChannelBase normalizes accepted inbound envelopes into relationship observations. The daemon worker writes them to a bounded workspace-partitioned JSON registry. Authenticated read-only routes derive a fresh graph for the exact workspace runtime. Webhook behavior remains unchanged.
$QWEN_HOME/channels/daemon/<workspaceHash>/observed-contacts.json.users contains direct-message users only.groups[].users and groups[].topics[].users are observed relationships, not authoritative membership.freshWithinSeconds from 1 second through 365 days.Files: packages/channels/base/src/types.ts, ChannelBase.ts, ChannelBase.test.ts, index.ts
observedContacts.observe to ChannelBaseOptions.senderId, senderName, chatId, and threadId after successful preflight.Files: packages/cli/src/commands/channel/observed-contact-store.ts, observed-contact-store.test.ts, daemon-worker.ts, daemon-worker.test.ts
0600 writes.Files: packages/cli/src/serve/routes/workspace-channel-observed-contacts.ts, its test, server.ts, server.test.ts, capabilities.ts
/channel/observed-contacts GET routes.freshWithinSeconds, default to seven days, and reject invalid values.{users, groups} with nested group/topic users and complete IDs.Cache-Control: no-store and sanitized failure responses.workspace_channel_observed_contacts.Files: ChannelWebhookTask.ts, ChannelBase.ts, channel config parsing/tests, channel overview documentation
origin/main.origin/main.npm run build && npm run typecheck.feat/channel-observed-targets, and update Draft PR #7109.