Slack Source Adapter

Slack capture is a workspace-scoped, API-read-only adapter owned by source.absorb, not a browser job with direct wiki-write authority.

Current State

slack-sync is a paused Automation V2 definition. The durable collector is now implemented, but no dedicated Slack OAuth token with the exact full read scope set is configured. Reactivation requires one workspace fixture proving list, history, thread pagination, edits, attachments, identity, and complete-run receipts.

Route

After readiness passes, run the API collector and then plan:

SLACK_READ_TOKEN=... \
SLACK_READ_SCOPES=channels:read,channels:history,groups:read,groups:history,im:read,im:history,mpim:read,mpim:history,files:read \
npm run sync:slack -- --hours 8
npm run brain -- workflow plan source.absorb source:slack.archive

The collector calls only auth.test, conversations.list, conversations.history, conversations.replies, and authenticated private-file GETs. It cursor-pages every accessible public/private/DM/MPIM conversation, rehydrates a thread as one semantic unit, preserves edit payloads, freezes attachment bytes, and versions the complete unit by digest. It never calls conversations.mark or any chat/reaction/mutation method. Slack documents the required per-conversation read/history scopes and cursor pagination for these routes. Source: conversations.list; conversations.history; conversations.replies; auth.test

Browser automation remains useful for a user-directed visual inspection, but it is not the scheduled source transport: opening a Slack conversation can change server-side read state, contradicting the collector's zero-mutation contract.

digimata/slack 0.5.2 is retained as an alternative CLI adapter candidate. Its MIT source offers list/thread/search plus JSON output, multiple workspaces, name-ambiguity refusal, local mode-0600 credentials, bounded 429 retry, --dry-run identity/target disclosure, and prompted/--yes destructive commands. Prefer its supported private-app user token (xoxp) or bot token (xoxb); the xoxc plus browser-cookie route is explicitly unsupported and session-coupled. Pin the checksum/revision and build read-only fixtures before use: the captured 32-blob repository has a release workflow but no detected tests, so its README and guardrails are claims rather than sufficient connector proof. Do not install it globally from the one-line script during review.

Its proposed slack render design is a useful future adapter shape—selected channels only, deterministic incremental Markdown, cursor/edit/deletion and tombstone semantics, downloads off by default—but it is an unimplemented idea document, not a shipped command. Source: X/@meatmagi 2084056274451447902; digimata/slack@950569ce, README, Cargo manifest, source tree, release workflow, and docs/.ideas/slack-render.md, reviewed 2026-08-12

Completion Proof

  • workspace and account boundaries remain distinct;
  • missing scopes, rate limits, edit-history, and attachment gaps are explicit;
  • no send, react, archive, mark-read, edit, or delete action occurred;
  • transient chat remains evidence rather than a wiki page;
  • any proposed stable-owner diff appears once in Daily Brief.

Timeline

  • 2026-08-12 | Replaced the unimplemented scheduled browser route with a read-only Slack Web API collector. It validates all four conversation read/history scope pairs plus files:read, derives workspace/actor identity, cursor-pages conversations and threads, freezes attachments, and writes content-addressed units plus a complete-run receipt before freshness moves. Browser inspection remains manual because page visits can mutate read state. Source: scripts/lib/slack-read.ts; scripts/sync-slack.ts; Slack Conversations API documentation

  • 2026-08-12 | Retained digimata/slack 0.5.2 as a guarded CLI adapter candidate: supported token path first, JSON and dry-run/ambiguity/destructive safeguards preserved, unsupported cookie auth isolated, and no install until read-only fixtures compensate for its zero detected tests. Its slack render note remains an unimplemented design. Source: X 2084056274451447902; digimata/slack@950569ce

  • 2026-08-12 | Recast the legacy four-hour browser runbook as a paused, workspace-scoped, proposal-only source adapter under source.absorb. Source: automations/slack-sync.md

  • 2026-06-30 | Original Slack sync page created. Source: automations/slack-sync.md