fix(slack): enable real channel interaction and joined destination discovery #88

Merged
karsten merged 2 commits from fix/slack-channel-capabilities into main 2026-11-11 09:20:26 +00:00
Owner

Observed causes

Native Karsten token already has correct scopes and actual private channel membership. Slack adapter rejects every new C/G post lacking a thread; message events containing a direct bot mention are dropped unless app_mention also arrives. Proactive posts never engage their new thread. Core also lacks native model-visible messaging (companion Core PR).

Fix

Allow explicit channel-root posts while validating supplied timestamps; accept direct mentions on normal message events with stable Core dedup IDs; persist incoming and own outgoing thread engagement. Add optional generic Channel.messaging contract (inert describe, lifecycle-owned paged users.conversations GET). Preserve ignored unsolicited traffic, bot/subtype filters, workspace/allowlist restrictions, tokens and shutdown drains. Example manifest adds only read scopes needed for membership discovery; existing Karsten already has them.

Verification

95 Plugin tests pass against candidate Core, 43 Slack tests including actual Core lifecycle test. Core full suite 1872 passed/1 skip. New regressions: C/G/D root sends, invalid timestamp/allowlist refusal, message-event mention and dedup, proactive-thread replies, bot membership endpoint (Slack omits is_member). No live message or source rollout claimed yet.

Activation

Operator requested generic fixes and deployment to native Karsten. Install exact merged four-file versioned Slack snapshot, hot-reload at existing safe boundary, verify real message tool/channel sends and Slack readback. Companion Core supplies live capabilities plus native messaging; adapter stays compatible with older Core (automatic replies work, model tool unavailable).

## Observed causes Native Karsten token already has correct scopes and actual private channel membership. Slack adapter rejects every new C/G post lacking a thread; message events containing a direct bot mention are dropped unless app_mention also arrives. Proactive posts never engage their new thread. Core also lacks native model-visible messaging (companion Core PR). ## Fix Allow explicit channel-root posts while validating supplied timestamps; accept direct mentions on normal message events with stable Core dedup IDs; persist incoming and own outgoing thread engagement. Add optional generic Channel.messaging contract (inert describe, lifecycle-owned paged users.conversations GET). Preserve ignored unsolicited traffic, bot/subtype filters, workspace/allowlist restrictions, tokens and shutdown drains. Example manifest adds only read scopes needed for membership discovery; existing Karsten already has them. ## Verification 95 Plugin tests pass against candidate Core, 43 Slack tests including actual Core lifecycle test. Core full suite 1872 passed/1 skip. New regressions: C/G/D root sends, invalid timestamp/allowlist refusal, message-event mention and dedup, proactive-thread replies, bot membership endpoint (Slack omits is_member). No live message or source rollout claimed yet. ## Activation Operator requested generic fixes and deployment to native Karsten. Install exact merged four-file versioned Slack snapshot, hot-reload at existing safe boundary, verify real message tool/channel sends and Slack readback. Companion Core supplies live capabilities plus native messaging; adapter stays compatible with older Core (automatic replies work, model tool unavailable).
fix(slack): support channel posts, mentions and joined destination discovery
Some checks failed
plugins-ci / compatibility (push) Failing after 1m59s
80e349a932
Merge remote-tracking branch 'origin/main' into fix/slack-channel-capabilities
All checks were successful
plugins-ci / compatibility (push) Successful in 2m20s
fa58f4b308
Author
Owner

Live rollout and actual-model acceptance completed on native Karsten (work): Core 0.1.236 / 9232c229f216d51ecab899fc430ccacbadf9fa11 + exact standalone Slack snapshot df51805dfd. All four installed module hashes verified; actual native owner PID and revision match; authenticated API HTTP 200. Actual update-admission POST returned 201 admitted with blockers=[], verification lease released.

Actual model discovery run used plugin_message, recognized connected Slack, listed its three actual memberships and described native send support (no send requested). Actual authorized send run used only plugin_message: one new root post in private operator channel, no shell/HTTP/worker. Provider history readback confirms exactly one exact-text bot post. A second actual model invocation with identical requestId/text returned the same persisted delivered receipt; provider post count remained one. This is transport acceptance/readback, not human-read or exactly-once provider semantics.

43 Slack tests also pass on the actual Darwin host (no skips). Integrated local Core full suite 1880 passed/1 existing skip; Plugins suite 95 passed; both exact PR-head CI checks green before normal merge. Incoming normal-message mentions, dedup and engaged follow-ups are regression tested; no human Slack event was fabricated and no live human-message round-trip is claimed.

Initial hot replacement left Core cleanup-unverified; operator-authorized maintenance reconciled process ownership, preserved waiting/paused tasks and used graceful SIGTERM without inventing an admission lease. The regular native owner subsequently activated 0.1.236 through normal admission. Tokens/app/memberships/admins/history unchanged; current live token already had directory scopes. Generic public contracts/docs shipped, no per-agent credential workaround.

Private detailed receipts on work: ~/.local/share/vanillacore-karsten/slack-channel-{rollout,maintenance,model-verification,send-verification}.json and slack-channel-native-tests.log. Local manifest: ~/.cache/hayate-maintenance/slack-channel-rollout/summary.json.

Live rollout and actual-model acceptance completed on native Karsten (work): Core 0.1.236 / 9232c229f216d51ecab899fc430ccacbadf9fa11 + exact standalone Slack snapshot df51805dfd829f251597db2020c4d6323c6c2b45. All four installed module hashes verified; actual native owner PID and revision match; authenticated API HTTP 200. Actual update-admission POST returned 201 admitted with blockers=[], verification lease released. Actual model discovery run used plugin_message, recognized connected Slack, listed its three actual memberships and described native send support (no send requested). Actual authorized send run used only plugin_message: one new root post in private operator channel, no shell/HTTP/worker. Provider history readback confirms exactly one exact-text bot post. A second actual model invocation with identical requestId/text returned the same persisted delivered receipt; provider post count remained one. This is transport acceptance/readback, not human-read or exactly-once provider semantics. 43 Slack tests also pass on the actual Darwin host (no skips). Integrated local Core full suite 1880 passed/1 existing skip; Plugins suite 95 passed; both exact PR-head CI checks green before normal merge. Incoming normal-message mentions, dedup and engaged follow-ups are regression tested; no human Slack event was fabricated and no live human-message round-trip is claimed. Initial hot replacement left Core cleanup-unverified; operator-authorized maintenance reconciled process ownership, preserved waiting/paused tasks and used graceful SIGTERM without inventing an admission lease. The regular native owner subsequently activated 0.1.236 through normal admission. Tokens/app/memberships/admins/history unchanged; current live token already had directory scopes. Generic public contracts/docs shipped, no per-agent credential workaround. Private detailed receipts on work: ~/.local/share/vanillacore-karsten/slack-channel-{rollout,maintenance,model-verification,send-verification}.json and slack-channel-native-tests.log. Local manifest: ~/.cache/hayate-maintenance/slack-channel-rollout/summary.json.
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
harness/plugins!88
No description provided.