Ben
4b4349eb9a
feat(cron/slack): flat in-channel continuable cron delivery surface
...
Add a per-platform `cron_continuable_surface` extra key
(`thread` default | `in_channel`) so a continuable cron job can deliver
FLAT into a Slack channel — no dedicated thread — and still be
replied-to. In `in_channel` mode the scheduler skips the thread-open
branch (leaves `thread_id=None`); the shipped origin-mirror then seeds
the `(slack, chat_id, None)` shared-channel session — the same bucket
`reply_in_thread: false` routes inbound channel replies to — so a plain
channel reply continues the job in context.
Design: specs/cron-inchannel-continuable (D1–D7, F5). Model B
(shared-channel session), NOT anchoring to the delivery `ts` — on Slack
replying to a specific message IS threading, so a `ts` anchor would only
relocate the thread, never deliver true threadless continuable.
- gateway/platforms/base.py: `supports_inchannel_continuable` capability
flag (default False → unsupported platforms fail SAFE to `thread`).
- plugins/platforms/slack/adapter.py: flag=True; `_cron_continuable_surface()`
resolver (coerces to the two-value enum); `_warn_if_inchannel_without_flat_reply`
connect-time warning (D5: warn, not hard-require — the misconfig fails safe).
- gateway/config.py: shared-key bridge line (top-level OR nested config).
- cron/scheduler.py: read the key generically from platform config, gate
the `in_channel` branch on the adapter capability flag, skip thread-open.
No new seed function (reuses the existing mirror — G6).
Pairing (docs): `in_channel` + `reply_in_thread: false` +
`require_mention: false` (or a free-response channel). Missing
`reply_in_thread: false` fails safe to a threaded continuation.
Gateway-side config flag — `/restart` to apply; NO Slack app reinstall.
Tests (from inside the worktree, PYTHONPATH=$PWD):
- +6 cron scheduler tests (in_channel skips thread-open; seeds flat
channel session with thread_id=None; thread-mode regression;
fail-safe on unsupported platform; value coercion). Prove-fail:
removing the `and not in_channel_surface` guard turns the two
load-bearing tests RED; restore → GREEN.
- +10 slack resolver/capability/warning tests; +2 config-bridge tests.
- tests/manual/cron_inchannel_e2e.py: offline E2E driving BOTH real
legs (delivery seed + inbound reply keying) → both converge on
(slack, C, None).
- No regressions: test_slack.py 216 passed alone; broader sweep green
(4 pre-existing cross-file-ordering failures reproduce identically on
pristine origin/main).
Docs: cron.md + slack.md + zh-Hans mirrors of both.
2026-07-01 03:16:13 -07:00
..
2026-05-20 13:00:57 -07:00
2026-07-01 12:30:59 +10:00
2026-06-29 15:51:57 -07:00
2026-06-20 10:26:45 -07:00
2026-06-27 22:03:14 -07:00
2026-05-28 22:26:25 -07:00
2026-06-28 22:35:17 -07:00
2026-06-28 02:41:36 -07:00
2026-06-29 15:51:57 -07:00
2026-06-25 00:27:22 +05:30
2026-06-26 00:11:17 +05:30
2026-06-24 19:12:44 +05:30
2026-06-28 02:41:36 -07:00
2026-06-25 21:29:57 -07:00
2026-07-01 02:29:24 -07:00
2026-06-20 10:26:45 -07:00
2026-05-17 02:29:41 -07:00
2026-05-28 22:26:25 -07:00
2026-06-07 10:04:57 -07:00
2026-06-14 03:25:49 -07:00
2026-07-01 00:42:42 -07:00
2026-05-28 22:26:25 -07:00
2026-07-01 01:26:27 -07:00
2026-06-22 11:39:45 +00:00
2026-06-27 04:31:37 +05:30
2026-06-21 12:15:14 -07:00
2026-06-29 15:51:57 -07:00
2026-05-28 22:26:25 -07:00
2026-06-19 16:59:58 -07:00
2026-06-07 18:05:58 -07:00
2026-06-02 16:55:25 -07:00
2026-05-28 22:26:25 -07:00
2026-06-25 21:29:57 -07:00
2026-07-01 00:42:56 -07:00
2026-06-27 19:05:04 -07:00
2026-05-18 21:38:05 -07:00
2026-06-21 11:35:09 -07:00
2026-05-28 22:26:25 -07:00
2026-06-19 06:31:13 -07:00
2026-06-25 21:29:57 -07:00
2026-06-28 02:05:50 -07:00
2026-06-15 05:51:47 -07:00
2026-06-28 04:13:19 -07:00
2026-06-28 15:10:39 -07:00
2026-06-25 21:29:57 -07:00
2026-07-01 01:39:23 -07:00
2026-06-26 00:50:40 +05:30
2026-06-26 00:50:40 +05:30
2026-06-25 12:56:05 -07:00
2026-06-13 04:51:59 -07:00
2026-06-07 22:39:51 -07:00
2026-06-14 03:20:21 -07:00
2026-06-20 10:26:45 -07:00
2026-06-30 15:03:25 -07:00
2026-06-29 21:12:57 -07:00
2026-06-23 23:39:22 -07:00
2026-07-01 15:11:38 +05:30
2026-06-26 00:11:17 +05:30
2026-05-29 19:06:05 -07:00
2026-06-22 05:41:22 -07:00
2026-05-09 11:04:46 -07:00
2026-06-20 10:26:45 -07:00
2026-05-22 14:21:41 -07:00
2026-05-22 14:21:41 -07:00
2026-06-28 00:57:03 -07:00
2026-06-30 16:38:31 -07:00
2026-07-01 00:12:17 -07:00
2026-05-22 14:21:41 -07:00
2026-05-28 22:26:25 -07:00
2026-06-19 06:31:08 -07:00
2026-06-23 23:55:18 -07:00
2026-06-30 15:03:25 -07:00
2026-06-21 22:43:45 -07:00
2026-07-01 00:12:17 -07:00
2026-06-30 03:49:52 -07:00
2026-06-27 03:57:24 +05:30
2026-07-01 00:12:17 -07:00
2026-05-22 14:21:41 -07:00
2026-05-28 22:26:25 -07:00
2026-06-27 19:30:32 -07:00
2026-05-22 14:21:41 -07:00
2026-06-10 00:24:06 -07:00
2026-05-27 03:35:33 -07:00
2026-06-30 02:48:42 -07:00
2026-05-22 14:21:41 -07:00
2026-05-22 14:21:41 -07:00
2026-05-22 14:21:41 -07:00
2026-05-28 22:26:25 -07:00
2026-05-22 14:21:41 -07:00
2026-06-30 02:48:42 -07:00
2026-06-14 17:02:21 +07:00
2026-06-22 13:58:33 -07:00
2026-05-17 02:29:41 -07:00
2026-05-28 22:26:25 -07:00
2026-06-05 03:10:40 -07:00
2026-06-23 10:44:02 -07:00
2026-07-01 01:20:14 -07:00
2026-06-21 22:43:45 -07:00
2026-06-11 11:58:19 -07:00
2026-06-25 21:29:57 -07:00
2026-06-25 21:11:02 -07:00
2026-05-30 07:28:06 -07:00
2026-06-25 21:29:57 -07:00
2026-06-29 12:18:11 -07:00
2026-05-30 07:38:03 -07:00
2026-05-28 22:26:25 -07:00
2026-06-16 15:49:59 -07:00
2026-06-20 10:26:45 -07:00
2026-06-20 10:26:45 -07:00
2026-06-28 00:57:03 -07:00
2026-06-30 17:20:41 -07:00
2026-06-20 10:26:45 -07:00
2026-06-20 10:26:45 -07:00
2026-06-20 10:26:45 -07:00
2026-06-20 10:26:45 -07:00
2026-06-27 04:13:09 -07:00
2026-06-20 10:26:45 -07:00
2026-07-01 02:29:24 -07:00
2026-05-28 22:26:25 -07:00
2026-05-27 02:41:24 -07:00
2026-06-23 23:29:28 -07:00
2026-05-28 22:26:25 -07:00
2026-06-28 02:34:23 -07:00
2026-06-28 04:11:14 -07:00
2026-06-14 03:25:08 -07:00
2026-05-07 06:31:08 -07:00
2026-05-07 17:33:09 -07:00
2026-06-22 06:27:29 -07:00
2026-06-04 16:54:40 -07:00
2026-06-29 15:51:57 -07:00
2026-05-03 08:47:49 -07:00
2026-06-06 11:46:24 -07:00
2026-05-28 22:26:25 -07:00
2026-06-21 11:11:23 -07:00
2026-06-20 10:57:41 -07:00
2026-06-25 21:29:57 -07:00
2026-05-28 22:26:25 -07:00
2026-06-21 12:43:44 -07:00
2026-06-01 20:30:24 -07:00
2026-05-28 22:26:25 -07:00
2026-06-19 07:35:33 -07:00
2026-06-25 21:29:57 -07:00
2026-06-04 21:55:20 -07:00
2026-05-28 22:26:25 -07:00
2026-05-24 15:03:27 -07:00
2026-06-20 10:26:45 -07:00
2026-06-28 20:47:33 -07:00
2026-06-20 10:26:45 -07:00
2026-06-20 10:26:45 -07:00
2026-06-29 15:51:57 -07:00
2026-06-20 21:22:11 -07:00
2026-07-01 02:44:57 -07:00
2026-06-16 06:34:54 -07:00
2026-06-08 15:12:12 -07:00
2026-06-05 09:10:26 -07:00
2026-05-26 14:28:51 -07:00
2026-06-21 11:56:46 -07:00
2026-06-20 23:20:16 -07:00
2026-06-20 10:26:45 -07:00
2026-05-16 12:55:23 -07:00
2026-05-28 22:26:25 -07:00
2026-06-16 15:49:59 -07:00
2026-05-28 22:26:25 -07:00
2026-06-27 19:26:04 -07:00
2026-06-27 03:43:28 -07:00
2026-06-27 03:43:38 -07:00
2026-06-27 04:36:22 -07:00
2026-06-21 13:33:23 -07:00
2026-06-27 21:23:25 -07:00
2026-06-27 21:23:25 -07:00
2026-05-28 22:26:25 -07:00
2026-05-28 22:26:25 -07:00
2026-06-19 07:34:15 -07:00
2026-06-30 15:30:06 -07:00
2026-06-19 07:34:15 -07:00
2026-06-19 07:34:15 -07:00
2026-06-19 07:34:15 -07:00
2026-06-12 08:51:10 +00:00
2026-05-29 13:17:46 -07:00
2026-05-28 22:26:25 -07:00
2026-06-25 21:29:57 -07:00
2026-06-25 21:29:57 -07:00
2026-06-02 05:52:54 -07:00
2026-06-30 14:29:51 -07:00
2026-05-29 17:36:58 +00:00
2026-07-01 01:20:12 -07:00
2026-06-20 10:26:45 -07:00
2026-06-20 10:26:45 -07:00
2026-06-25 21:29:57 -07:00
2026-06-25 21:29:57 -07:00
2026-05-28 22:26:25 -07:00
2026-07-01 02:12:25 -07:00
2026-05-28 22:26:25 -07:00
2026-06-06 18:44:44 -07:00
2026-06-30 17:32:35 -07:00
2026-06-25 21:29:57 -07:00
2026-07-01 02:45:11 -07:00
2026-06-21 20:21:11 -07:00
2026-06-25 21:29:57 -07:00
2026-06-25 14:21:09 +10:00
2026-05-22 14:21:41 -07:00
2026-05-28 22:26:25 -07:00
2026-06-20 15:16:53 +05:30
2026-06-14 03:25:08 -07:00
2026-06-29 12:18:11 -07:00
2026-06-08 01:25:35 -07:00
2026-07-01 00:11:23 -07:00
2026-06-19 16:59:58 -07:00
2026-06-24 00:14:25 -07:00
2026-06-29 15:51:57 -07:00
2026-05-20 13:00:57 -07:00
2026-07-01 02:12:25 -07:00
2026-06-25 21:29:57 -07:00
2026-06-29 20:31:17 -07:00
2026-05-30 07:38:03 -07:00
2026-07-01 02:03:58 -07:00
2026-06-25 21:29:57 -07:00
2026-06-03 23:51:44 -06:00
2026-06-19 06:31:13 -07:00
2026-05-08 18:50:25 -07:00
2026-06-26 14:01:48 +10:00
2026-06-24 18:47:18 -07:00
2026-06-21 12:34:22 -07:00
2026-06-20 10:26:45 -07:00
2026-06-25 21:29:57 -07:00
2026-06-25 21:29:57 -07:00
2026-05-18 22:25:15 -07:00
2026-06-16 15:49:59 -07:00
2026-06-03 06:36:46 -07:00
2026-06-29 15:51:57 -07:00
2026-07-01 15:42:19 +05:30
2026-05-28 22:26:25 -07:00
2026-06-27 04:13:09 -07:00
2026-06-25 21:29:57 -07:00
2026-07-01 02:29:24 -07:00
2026-05-28 22:26:25 -07:00
2026-06-25 01:26:13 +05:30
2026-05-23 02:25:53 -07:00
2026-06-07 22:10:32 -07:00
2026-06-29 15:51:57 -07:00
2026-06-29 04:25:37 -07:00
2026-06-25 21:29:57 -07:00
2026-06-04 07:50:45 -07:00
2026-06-23 23:56:36 -07:00
2026-06-30 13:17:51 +05:30
2026-06-28 02:41:47 -07:00
2026-06-30 04:22:41 -07:00
2026-06-20 10:26:45 -07:00
2026-06-28 02:41:36 -07:00
2026-05-10 09:01:51 -07:00
2026-06-20 13:47:14 +05:30
2026-05-28 22:26:25 -07:00
2026-06-20 21:00:46 +05:30
2026-06-12 01:07:50 -07:00
2026-06-20 10:26:45 -07:00
2026-07-01 00:10:12 -07:00
2026-07-01 00:10:12 -07:00
2026-06-20 10:26:45 -07:00
2026-06-20 10:26:45 -07:00
2026-07-01 03:16:13 -07:00
2026-06-29 01:02:53 -07:00
2026-07-01 03:16:13 -07:00
2026-06-20 10:26:45 -07:00
2026-06-20 10:26:45 -07:00
2026-06-29 20:57:43 -07:00
2026-06-30 18:05:43 -07:00
2026-06-28 02:43:23 -07:00
2026-05-28 22:26:25 -07:00
2026-06-20 10:26:45 -07:00
2026-06-27 03:52:44 -07:00
2026-06-07 02:15:23 -07:00
2026-05-28 22:26:25 -07:00
2026-06-28 04:35:37 -07:00
2026-06-21 16:41:17 -07:00
2026-06-30 03:22:18 -07:00
2026-06-29 15:51:57 -07:00
2026-06-28 13:49:08 -07:00
2026-05-28 22:26:25 -07:00
2026-05-28 22:26:25 -07:00
2026-05-31 09:29:03 -07:00
2026-06-13 13:44:45 -07:00
2026-06-20 10:26:45 -07:00
2026-06-30 23:37:04 -07:00
2026-06-27 04:13:09 -07:00
2026-07-01 03:04:01 -07:00
2026-06-02 00:33:50 -07:00
2026-06-30 04:23:03 -07:00
2026-05-28 22:26:25 -07:00
2026-06-20 20:05:37 -07:00
2026-06-27 03:57:24 +05:30
2026-05-08 11:18:14 -07:00
2026-06-19 16:20:59 -07:00
2026-06-20 10:26:45 -07:00
2026-06-30 04:23:03 -07:00
2026-06-28 14:25:15 -07:00
2026-06-28 00:57:03 -07:00
2026-06-20 10:26:45 -07:00
2026-06-20 10:26:45 -07:00
2026-06-20 10:26:45 -07:00
2026-06-28 01:07:53 -07:00
2026-06-24 02:15:47 +05:30
2026-06-27 20:46:08 -07:00
2026-06-27 19:12:57 -07:00
2026-06-24 00:00:46 -07:00
2026-06-20 10:26:45 -07:00
2026-07-01 00:11:46 -07:00
2026-06-20 10:26:45 -07:00
2026-06-20 10:26:45 -07:00
2026-06-20 10:26:45 -07:00
2026-07-01 02:03:58 -07:00
2026-06-20 10:26:45 -07:00
2026-06-28 14:35:32 +05:30
2026-06-20 10:26:45 -07:00
2026-06-30 15:36:58 -07:00
2026-05-28 22:26:25 -07:00
2026-05-28 22:26:25 -07:00
2026-06-22 12:29:05 -07:00
2026-06-20 10:26:45 -07:00
2026-06-20 10:26:45 -07:00
2026-06-20 10:26:45 -07:00
2026-06-25 13:10:54 -07:00
2026-06-21 08:26:28 -07:00
2026-06-20 10:26:45 -07:00
2026-06-28 01:38:17 -07:00
2026-06-20 10:26:45 -07:00
2026-06-20 10:26:45 -07:00
2026-06-20 10:26:45 -07:00
2026-06-20 10:26:45 -07:00
2026-06-30 17:39:30 -07:00
2026-06-28 02:34:17 -07:00
2026-07-01 01:01:36 -07:00
2026-06-27 04:01:58 -07:00
2026-06-27 04:39:48 -07:00
2026-06-20 10:26:45 -07:00
2026-06-20 10:26:45 -07:00
2026-06-29 15:51:57 -07:00
2026-06-25 21:29:57 -07:00
2026-05-28 22:26:25 -07:00
2026-06-25 21:29:57 -07:00
2026-06-23 03:14:18 +05:30
2026-06-29 21:12:57 -07:00
2026-06-28 02:05:26 -07:00
2026-05-02 02:00:09 -07:00
2026-06-01 02:04:14 -07:00
2026-06-12 13:42:42 -04:00
2026-06-04 06:56:28 -07:00
2026-06-29 20:42:19 -07:00
2026-05-28 22:26:25 -07:00
2026-06-05 18:05:05 -07:00
2026-06-13 03:33:27 -07:00
2026-06-27 19:11:30 -07:00
2026-05-28 22:26:25 -07:00
2026-06-21 19:05:27 -07:00
2026-06-14 02:40:54 -07:00
2026-05-28 22:26:25 -07:00
2026-05-28 22:26:25 -07:00
2026-05-28 22:26:25 -07:00
2026-06-28 22:35:43 -07:00
2026-06-20 10:26:45 -07:00
2026-06-07 21:50:57 -07:00
2026-06-07 22:10:17 -07:00
2026-06-27 04:17:12 -07:00
2026-06-20 17:05:27 -07:00
2026-06-21 17:23:33 -07:00
2026-06-26 01:05:05 -07:00
2026-06-21 17:23:33 -07:00
2026-06-20 10:26:45 -07:00
2026-06-30 03:41:43 -07:00
2026-06-20 10:26:45 -07:00
2026-06-28 02:05:26 -07:00
2026-06-30 15:30:06 -07:00
2026-06-20 10:26:45 -07:00
2026-06-20 10:26:45 -07:00
2026-06-20 10:26:45 -07:00
2026-06-21 13:32:22 -07:00
2026-06-20 10:26:45 -07:00
2026-06-28 15:29:59 -07:00