T10 — migration and compatibility
Captured 2026-10-19 on
feat/issue-496-gateway, fromcli/withTHE_LOOP_CLI_CONFIGunset (this machine's own instance sets it; one unrelated lifecycle test reads it).
text
cd cli && uv run python -m pytest -q tests/test_hosted_reconcile.py tests/test_core_lifecycle.py tests/test_gateway_client_integration.py
32 passed in 2.06s
make validate
VALID skills/the-loop/templates/collaborators.yaml
VALID .the-loop/cli-config.yaml
VALID skills/the-loop/templates/cli-config.yaml
VALID skills/the-loop/templates/gateway-config.yaml- An instance config without a
gatewayblock hosts the receiver, the poller and the listener exactly as before (test_gateway_hosted_integration.py::test_an_instance_without_a_gateway_block_hosts_the_receiver_poller_and_listener_as_before, and the hosted-reconcile and lifecycle suites unchanged in behaviour;enabled_servicesgains the additivegateway-clientkey). - Adding the block adds
gateway-clientand drops only the Slack listener; the receiver and the poller follow their own blocks (…::test_an_instance_with_a_gateway_block_keeps_its_receiver_and_poller_and_loses_only_the_listener; amended on the PR 2026-10-19 — the first landing hosted the client alone). The Slack poll reader is off behind a gateway (test_channels_integration.py, the watcher scenario). The gateway's own GitHub/Jira polling is opt-in, off in the template. - The
cli-config.schema.jsonchange is additive: the repository's dogfood config and the templates validate (make validate). - The store carries a
schema_versionrow (SqliteStore.schema_version()), asserted intest_gateway_store.py::test_offsets_survive_a_reopen. - A behaviour change for Slack readers in poll mode (found in T4, 2026-10-19): an instance that read its threads with
read.mode: polltook every reply in a bound thread as input. Under a gateway Slack arrives over Socket Mode only, where the issue-389 rule holds — a plain reply isnot-addressedand the mention arrives asapp_mention— so an app installed before issue-389 (noapp_mentions:read) hears no reply until the manifest is re-applied and the app reinstalled. Documented in the capability and raised with the author on the ticket. - A fresh gateway replayed an item's history (found 2026-10-19 answering the author's migration question on the PR): the instance poller baselines an armed item's existing thread at first sight; the gateway's poller stored every unseen comment, so its first cycle would have turned the whole history of every armed item into deliveries. Fixed:
poll_knownon the ledger, the thread marked seen at first sight, the presence alone stored (test_gateway_poll_integration.py::test_a_new_gateway_baselines_an_items_existing_thread_at_first_sight). The move itself is written up indocs/guide/gateway.md.