Repository navigation
feat: Tier-1 leftovers — tables, fence-aware chunking, token diagnostics, click claim, catch-all ack, stale-drop metric - #18
Merged
Conversation
…hunk splitting Tables: mrkdwn has no table syntax, so agent replies with pipe tables rendered as literal pipe noise. Each table is now rewritten as a fenced monospace block with space-aligned columns — after code stashing (a table inside a fence stays literal) and emitted through the stash so cell content is never touched by the emphasis passes. Alignment pads by UTF-16 length; CJK glyphs mis-align slightly, the accepted trade. Chunking: the fixed slicer cut long replies mid-fence, corrupting the rendering of every chunk after the cut. splitIntoChunks is now line-boundary based and fence-aware — a boundary inside an open fence closes it and reopens in the next chunk — and multi-chunk output carries trailing _(i/n)_ part indicators. Single-chunk output is byte-identical to before. Two tests updated for the new contract (indicator-stripped rejoin instead of exact slicing). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…tch-all ack, stale-drop metric Four small hardening items from the Hermes-comparison backlog: - BoltGateway.start() now reads what auth.test already returns: a missing bot_id means the configured token is likely a user token, and the x-oauth-scopes header (folded into response_metadata.scopes by the WebClient) is compared against REQUIRED_BOT_SCOPES — a new constant pinned to slack-app-manifest.json by a drift test. Both failure shapes previously surfaced only as features silently doing nothing; now they warn at connect and are exposed via gateway.diagnostics(). Absent scope metadata counts as unknown, not missing. - Approval clicks take an in-process claim per approval id: the first clicker wins and a second click during the decision call is dropped silently instead of firing a duplicate REST call whose failure posted a ":x: Failed … may already be decided." ephemeral for a click that did what the person asked. The claim releases in a finally, so a genuinely failed decision stays retryable. - A regex catch-all event listener (registered last) acks any event no specific handler matched — un-acked events count toward Slack's failure threshold, past which Event Subscriptions get silently disabled for the whole app. - The event deduper reports stale drops through a new onStaleDrop hook, wired to slack.events.stale_dropped and an info log: a redelivery arriving outside the 5-minute staleness window was previously lost invisibly. Observability first; widening the window stays a separate decision to make on this data. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The remaining small items from the Hermes-comparison backlog, approved as batch 2–7.
Commits
splitIntoChunksis now line-boundary based and fence-aware with_(i/n)_part indicators, so long replies with code blocks no longer corrupt every chunk after a mid-fence cut. Single-chunk output byte-identical to before.REQUIRED_BOT_SCOPESpinned to the checked-in manifest by a drift test), first-clicker-wins claim on approval buttons, a regex catch-all event ack against Slack's silent Event-Subscriptions disable, andslack.events.stale_droppedobservability for redeliveries outside the staleness window.Testing
🤖 Generated with Claude Code