Context
claw access pair telegram <agent> works end-to-end (B9, validated v0.2). The architecture was designed to be channel-agnostic: token issuance, hash-only persistence, audit chain, and local-socket handshake are all in src/claw/telegram/pairing.py but should generalize.
v0.3 should extract the shared core and add a second channel (Slack or Matrix) without copy-pasting the pairing logic.
Source: docs/SPRINT_PLAN.md §8.
Acceptance criteria
Out of scope
- Both Slack AND Matrix in v0.3 — pick one and ship it well.
- Channel-to-channel forwarding (
/ask from Slack -> agent -> reply on Slack while also notifying Telegram).
References
docs/SPRINT_PLAN.md §8
src/claw/telegram/pairing.py, store.py, bot.py
- Session 4 + 6 HANDOVER for the live-validated architecture
Context
claw access pair telegram <agent>works end-to-end (B9, validated v0.2). The architecture was designed to be channel-agnostic: token issuance, hash-only persistence, audit chain, and local-socket handshake are all insrc/claw/telegram/pairing.pybut should generalize.v0.3 should extract the shared core and add a second channel (Slack or Matrix) without copy-pasting the pairing logic.
Source:
docs/SPRINT_PLAN.md §8.Acceptance criteria
pairing.pyandstore.pychannel-agnostic surface intosrc/claw/access/package;telegram/becomes a channel adapter.name,serve(config) -> None,parse_pair_payload(payload) -> AgentToken | None,format_pair_url(agent, token) -> str.src/claw/access/slack/. Bot replies to a/helpslash command, a/statusslash command, and apair-<agent>-<token>payload via DM.claw access pair slack <agent>/claw access serve slackwork analogously to telegram.slack_pairing_initiated, etc., reusing the same schema as telegram.Out of scope
/askfrom Slack -> agent -> reply on Slack while also notifying Telegram).References
docs/SPRINT_PLAN.md §8src/claw/telegram/pairing.py,store.py,bot.py