The retention bound, claim lease default, and liveness options type were
exported only for tests, which fails the dead-export gate. Tests pin the
policy literals locally instead.
Refs #107246
Telegram update ids are global across chats, but the update tracker rejected
any id at or below its single high-water mark. When one lane was delayed
while other lanes completed newer ids, the delayed durable-spool replay was
rejected as accepted-watermark and tombstoned without dispatch - silent
message loss. The tracker now rejects only restored-offset ids and exact ids
it already accepted, with the accepted-id set pruned at the persisted offset
plus a bounded retention window; the startup-only floor-replay special case
is deleted.
Refs #107246
Spool claim owners now encode pid:starttime:uuid, and live-owner detection
requires the pid to exist with a matching process start time. Bare
process.kill(pid, 0) treated Linux thread IDs and recycled PIDs of the new
gateway as a live foreign owner, wedging a chat lane behind a dead claim for
the full 30-minute lease after a restart. Legacy pid:uuid and explicit-x
owners keep existence-only lease protection so rolling upgrades and
no-starttime platforms cannot double-dispatch a live worker's claim.
Refs #107246
* feat(linux): add node device capabilities
* fix(linux-node): actionable pending-approval error + node-host advertise integration test
* fix(linux-node): map geoclue access-denied to LOCATION_DISABLED; floor camera maxWidth to avoid zero-height scale
* fix(linux-node): clamp small camera maxWidth to 2 instead of default
* docs(linux-node): clarify where-am-i -t is a process timeout, not update throttle
* refactor(gateway): extract legacy-node filter + rejection hint to fit LOC ratchet; docs-map + deadcode baseline
* fix(gateway): drop now-unused DEFAULT_DANGEROUS_NODE_COMMANDS import after hint extraction
* test(node-host): drop imports orphaned by removed error-code test
* refactor(channels): deprecate the never-consumed group intro hint adapter
* chore(channels): compress the intro-hint deprecation note to satisfy the size ratchet
* refactor(channels): migrate irc, nextcloud-talk, zalouser, slack, and matrix group policy onto the scope tree
* fix(irc): drop unused tree binding in group match
* fix(zalouser): keep wildcard lookup opt-in for explicit-only candidates
* fix(zalouser): adapter opts into the wildcard fallback candidate
* refactor(channels): migrate feishu, msteams, and discord group policy onto the scope tree and drop the core discord duplicate
* fix(msteams): restore the cross-team scan fallback for policy-less matched teams
* fix(feishu): keep the adapter's zod-typed group config for the scope tree
* revert(core): keep the discord require-mention fallback until stage 3 makes it provably redundant
* chore(matrix): drop the now-unused channel entry match re-export
* refactor(telegram): migrate group policy onto the scope tree
* test(telegram): keep the bot token fixture off secret-scanner patterns
* test(telegram): use a computed key for the bot token fixture
* test(telegram): assemble the bot token fixture indirectly for scanner and lint
Adds consistent manual Workboard movement across CLI, slash commands, and agent tools while preserving operator authority and agent claim isolation.
Co-authored-by: Ross I4JU <ross@i4ju.ch>