Repository navigation
TD-5226: the ring marks the display the agent is acting on, in full control only - #112
Merged
Merged
Conversation
…ontrol only The ring lit every display at once, also in background mode, and a client that never sent the episode bracket (Grok's own copy, another MCP client) left it on until its process exited. Grok sessions in the packaged app also lit the daemon's sidecar, a second ring on a display it was not acting on, and one session closing its episode darkened another session's ring. tst-cu-mcp now puts a platform-neutral controller (overlay/control.py) in front of the painters: - the ring shows only while the policy file's mode is full_control; the file is re-parsed when it changes, and a broken file reads as background - it is aimed at the display being acted on: the last screenshot's, or the one under the last move or click; the macOS helper lights only that display's panel (target <display id>); Windows and Linux still ring all - overlay_session takes the session id and the ring holds while any session's episode is open - a client that never brackets lights it per action; it fades 30 s later - a watcher re-checks Stop, the mode and the fade every quarter second Grok's child always paints, with the user's show_on_real_display switch, and Grok sessions tag their episodes for the window only. The helper's retarget is a module function: PyObjC reads a method name without trailing underscores as a zero-argument selector and refused the class, which only the live run caught. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HUthoCdmzg2hy89ssk2cSF
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.
What
The real-display ring now means "an agent has the real screen":
modeis re-read when it changes, so Settings applies to every running client.overlay_sessiontakes the session id; the ring holds while any TST Desk session's episode is open.show_on_real_display), and Grok sessions no longer light the daemon's sidecar on a display it is not acting on.Rules live in a new platform-neutral controller,
mcp/tst-cu-mcp/src/tst_cu_mcp/overlay/control.py; painters only light, darken and aim. Decision recorded in DECISIONS.md (revises TD-3402 and TD-3407).Tests
test_overlay_rules.py(new, 21 tests): mode, display, episodes, fade, Stop, refusals, the policy-file reader, and the helper's argument parsing and panel choice. Each rule's test was shown to fail with the rule removed.test_overlay_gating.pyupdated for the aim-then-light order.hit_test) fail the same way on main and are not touched here. CI does not run this suite.mypy tstdclean; touched tests pass.Live (macOS, four displays)
Driven through the installed app's host socket with a temporary policy file and stop-file. The window server shows one lit ring panel at a time: primary, then the portrait display after a capture there, then the built-in display. None in background mode or while stopped; it comes back on Resume while the episode is open, and goes when the episode closes. Real screenshots of all four displays contain no ring.
The live run found a bug the unit tests could not: PyObjC refused the helper's class because of a one-argument method name, so the helper died at start. Fixed by making it a module function.
🤖 Generated with Claude Code
https://claude.ai/code/session_01HUthoCdmzg2hy89ssk2cSF