hermes-agent/tests/plugins/platforms/photon
Frowtek c0ff5e9169 fix(photon): run the Spectrum patch spawn off the gateway event loop
`PhotonAdapter._start_sidecar` is `async`, but it ran the Spectrum
mixed-attachment patch script with a bare `subprocess.run(...)`: it spawns
node and *waits* for it, with `timeout=10`. Executed inline that holds the
shared gateway event loop for the whole window, so no other platform's
messages, heartbeats, or sessions are serviced until it returns.

The same function already establishes this exact invariant twenty lines
above, where the stale-dependency reinstall hops to a worker thread:

    # Runs off the event loop so a cold install can't freeze every other
    # platform's traffic.
    if _sidecar_deps_stale():
        await asyncio.to_thread(_reinstall_sidecar_deps)

The patch spawn never got the same treatment. It is not startup-only
either — `_start_sidecar` is called from `connect()`, which takes
`is_reconnect`, so an ordinary Photon reconnect (network blip, sidecar
death) re-runs it and stalls a live gateway that is actively serving
Discord/Telegram/Slack traffic.

Dispatch it via `asyncio.to_thread` like its sibling. Same off-the-loop
class as the inbound-image decision (#66688) and the cron-fire verifier.

Adds a regression test asserting the spawn executes on a worker thread
rather than the loop thread.
2026-07-28 21:45:52 -07:00
..
test_auth.py test(photon): allow auth.lock sentinel in temp-file leak assertions 2026-07-28 18:20:06 -07:00
test_check_requirements_risks.py fix(photon): unify sidecar-deps check, harden log unlink and truncation 2026-07-28 18:20:06 -07:00
test_fatal_notify_self_cancel.py fix(photon): dispatch fatal-error notification from a detached task 2026-07-28 21:45:52 -07:00
test_inbound.py fix(photon): ignore iMessage media placeholders 2026-07-28 18:17:52 -07:00
test_markdown.py feat(photon): upgrade to spectrum-ts 3.0.0 (pinned) with markdown + reactions 2026-06-12 01:07:38 -07:00
test_mention_gating.py feat(photon): gRPC-native iMessage channel (no webhook) 2026-06-08 21:03:58 -07:00
test_npm_error_log_regression.py fix(photon): unify sidecar-deps check, harden log unlink and truncation 2026-07-28 18:20:06 -07:00
test_outbound_media.py feat(photon): wire outbound media via spectrum-ts attachment() (#42397) 2026-06-08 15:29:16 -07:00
test_overflow_recovery.py fix(photon): stop sidecar-crash fatal handler from cancelling its own supervisor task 2026-07-28 21:45:52 -07:00
test_reactions.py fix(photon): correlate tapbacks to bot message context 2026-06-27 00:51:34 -07:00
test_runtime_record.py fix(photon): un-shadow the U+FFFC deferred-wait handler; fix stale sidecar-deps fixture 2026-07-28 21:28:25 -07:00
test_setup_access.py test(photon): stub token validation in setup tests to avoid network 2026-07-28 18:20:06 -07:00
test_sidecar_deps_stale.py fix(photon): auto-reinstall stale sidecar deps before start 2026-07-05 17:38:32 -07:00
test_sidecar_lifecycle.py fix(photon): run the Spectrum patch spawn off the gateway event loop 2026-07-28 21:45:52 -07:00
test_spectrum_patch.py fix(photon): keep sidecar alive if spectrum patch fails 2026-07-28 21:45:52 -07:00
test_streaming.py fix(photon): mark adapter as not supporting message editing to suppress streaming cursor 2026-07-28 18:17:52 -07:00