48 KiB
48 KiB
| 1 | id | python_source | subsystem | behavior | owner | go_destination | status | automated_evidence | x11_evidence | wayland_evidence | speech_evidence | braille_evidence | notes |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | gtk-alert-message | src/cthulhu/speech_generator.py;src/cthulhu/script_utilities.py | speech | Read a GTK alert message before its first focused button | internal/atspi internal/app | in-progress | go test ./internal/app ./internal/atspi -count=1; python3 tests/native_alert.py | Private GTK/Xvfb/AT-SPI fixture captured the complete question on 2026-09-26. | Physical FastSMRW listening pending. | Alert window creation captures its label text; activation does not interrupt the message; the first button appends and later buttons use ordinary focus speech. | |||
| 3 | yad-simple-prompt | src/cthulhu/formatting.py;src/cthulhu/scripts/default.py | speech | Read a simple YAD frame question before its first focused button | internal/atspi internal/app | implemented | go test ./internal/app ./internal/atspi -count=1; python3 tests/native_alert.py | Private YAD/Xvfb/AT-SPI fixture captured the exact question on frame activation or first button focus. The live 2026-09-27 log showed a third path where activation targets the focused button; an event-loop regression covers its speech order. | Maintainer confirmed the YAD question was spoken on the updated build on 2026-09-27. | YAD exposes the prompt as a frame with layout nodes and a label plus buttons. The generic Python frame format appears to omit the label; this Go addition follows the user's explicit example. A strict simple prompt shape limits frame text capture and bounded first-button refresh handles late labels. | |||
| 4 | radio-group-focus | src/cthulhu/generator.py;src/cthulhu/speech_generator.py | speech | Speak the radio group question with a focused option | internal/atspi internal/presentation internal/preferences | implemented | go test ./internal/presentation ./internal/atspi ./internal/preferences -count=1; python3 tests/native_alert.py | Private GTK radio group focus captured Punctuation Level. | Physical preferences speech pending. | A named panel or labelled-by relation supplies the group question; each focused radio presents that name before its option. The Braille verbosity radios now have a named frame. | |||
| 5 | yad-list-prompt | src/cthulhu/formatting.py;src/cthulhu/scripts/default.py | speech | Read a simple YAD list question when its window opens | internal/atspi internal/app | implemented | go test ./internal/app ./internal/atspi -count=1; python3 tests/native_alert.py | Private YAD power list captured Power options after ordinary or synthesized window activation. | Physical I38 power menu listening pending. | The I38 list has a labelled question above its choices; foreground recovery and direct activation both capture the same bounded prompt shape. | |||
| 6 | web-live-region-announcements | src/cthulhu/scripts/web/script.py; src/cthulhu/liveregions.py | web | Automatically speak active-tab polite and assertive live region updates | Storm Dragon | internal/atspi internal/app | in-progress | go test ./internal/app ./internal/atspi -count=1; CTHULHU_NATIVE_BROWSER_TESTS=live python3 tests/native_browser.py | Private Brave/Xvfb fixture captures the Skald-style status update and real child text; physical Skald Xorg test pending. | Pending human listening for Skald chat and urgent messages | Go captures inherited live metadata and child text for text insertions and child additions. A Chromium placeholder update is suppressed. Off regions and inactive documents are filtered. Complete Python live-region review commands and politeness overrides remain pending. | ||
| 7 | core-startup | src/cthulhu/cthulhu.py | core | Orchestrate runtime service startup and graceful shutdown | Storm Dragon | internal/app | in-progress | go test ./internal/app ./internal/atspi ./internal/lifecycle -count=1; CTHULHU_XRECORD_TEST=/tmp/cthulhu-xrecord.test python3 tests/native_x11.py | Maintainer accepted the Stage 1 physical Xorg shutdown checklist on 2026-09-11; post-fix cthulhu.sh returned to the prompt with complete shutdown records on Xorg using its LXTerminal test application. The private Xvfb/D-Bus native proof with XRecord also passed. | Lifecycle and service orchestration only; see lifecycle-welcome-message, lifecycle-farewell-message, lifecycle-start-sound, and lifecycle-stop-sound for the four user-visible deliveries. General startup or shutdown parity is not claimed. | |||
| 8 | lifecycle-welcome-message | src/cthulhu/plugins/HelloCthulhu/plugin.py | speech | Speak a randomly selected startup welcome message | Storm Dragon | internal/app | in-progress | go test ./internal/app -run '^(TestRunSpeaksFocusEventsAndStops|TestRandomString)$' -count=1 | Maintainer accepted welcome speech in the Stage 1 physical Xorg checklist on 2026-09-11 and confirmed the randomized message wiring worked on 2026-09-12. | Maintainer heard the startup welcome message during the accepted Stage 1 physical Xorg checklist on 2026-09-11 and confirmed the randomized message wiring worked on 2026-09-12. | Python presents Cthulhu welcomes you. once through HelloCthulhu after start-application-completed and only while an active script exists. Go creates its speech worker only when enableSpeech is true and randomly selects from a small startup list after service startup without an active-script or once-only gate; delivery is not waited for and has no per-message deadline. The extra variants are an intentional Go behavior extension. General startup parity is not claimed. | ||
| 9 | lifecycle-farewell-message | src/cthulhu/plugins/ByeCthulhu/plugin.py | speech | Speak a randomly selected graceful-shutdown farewell message | Storm Dragon | internal/app | in-progress | go test ./internal/app -run '^(TestRunSpeaksFocusEventsAndStops|TestRandomString)$' -count=1 | Maintainer heard the post-fix farewell speech through cthulhu.sh on Xorg using its LXTerminal test application on 2026-09-11 and confirmed the randomized message wiring worked on 2026-09-12; the launcher returned to the prompt and completed final shutdown records. | Maintainer heard the post-fix farewell speech through cthulhu.sh on Xorg on 2026-09-11 and confirmed the randomized message wiring worked on 2026-09-12. | Python presents Cthulhu lurks beneath the waves. through ByeCthulhu only while an active script exists. Go randomly selects from a small shutdown list only when enableSpeech is true, interrupts owned speech, and waits up to 2 seconds for the backend result before native cleanup; timeout cancels the active request. The extra variants are an intentional Go behavior extension. audit-required: active-script gating, speech-disabled presentation semantics, and Python's overall shutdown watchdog versus Go's per-message deadline are not directly aligned by the named evidence. | ||
| 10 | lifecycle-start-sound | src/cthulhu/sound_theme_manager.py | sound | Play the startup sound cue | Storm Dragon | internal/sound | in-progress | go test ./internal/sound -run '^(TestBundledSoundsDecodeInProcess|TestSoundWorkerBoundsQueueAndStopsActiveCue|TestStopPlaysShutdownCueAfterStartupCueOverflow)$' -count=1 | Maintainer heard the startup cue during the 2026-09-11 physical Xorg preview; the desktop and window manager were not recorded. | Python plays the start cue from the configured theme when enableSound is true and the theme is not none; startup uses a nonblocking, interrupting, best-effort helper command with no per-cue deadline at this call. Go creates the sound service only when enableSound is true, theme is not none, and volume is greater than zero; it enqueues start after service startup into a bounded 8-cue queue, with a 3-second playback deadline, and can drop the startup cue on overflow. audit-required: Python helper-process and Go in-process queue saturation are not directly compared by live evidence. September 25 review: nonblocking queue drains prevent a consumer/producer deadlock during cue replacement and live reconfiguration; concurrent regression and race checks pass. | |||
| 11 | lifecycle-stop-sound | src/cthulhu/sound_theme_manager.py | sound | Play the graceful-shutdown sound cue | Storm Dragon | internal/sound | in-progress | go test ./internal/sound -run '^(TestBundledSoundsDecodeInProcess|TestSoundWorkerBoundsQueueAndStopsActiveCue|TestStopPlaysShutdownCueAfterStartupCueOverflow|TestStopTimeoutPreservesShutdownCueForRetry)$' -count=1; go test ./internal/app -run '^(TestRunReachesSoundStopAfterEarlierServiceStopError|TestRunReportsSoundStopError)$' -count=1 | Maintainer heard the post-fix stop cue through cthulhu.sh on Xorg using its LXTerminal test application on 2026-09-11; the launcher returned to the prompt and completed final shutdown records. | Python plays stop only when enableSound is true and the theme is not none; it interrupts current sound, waits up to 1 second through the helper, then continues shutdown. Go runs stop as the final reverse lifecycle service with its own 3-second deadline, cancels active cues, discards pending cues, and preserves a timed-out stop cue for one retry. audit-required: Python helper-isolation versus Go in-process cancellation and retry ordering are not directly aligned by the named evidence. | |||
| 12 | focus-events | src/cthulhu/event_manager.py | focus | Receive focus events and capture immutable accessible snapshots with stable object paths | Storm Dragon | internal/atspi | implemented | go test ./internal/atspi ./internal/app ./internal/logging -count=1 | GTK yad Zenity and LXTerminal live tests passed 2026-09-10; post-fix AT-SPI shutdown passed through cthulhu.sh with its LXTerminal test application on Xorg 2026-09-11. | Queue overflow duplicate-object suppression and nonblocking diagnostics have automated coverage; physical diagnostics saturation remains pending. | |||
| 13 | xterm-focus-handoff | src/cthulhu/input_event_manager.py | input | Suspend Cthulhu while XTerm owns focus and restore when a known non-XTerm window takes focus | Storm Dragon | internal/app internal/atspi internal/platform/xorg | in-progress | NO_COLOR=1 GOCACHE=/tmp/cthulhu-build-cache go test ./internal/app -run '^(TestXTermFocus|TestProcessEvents)' -count=1; NO_COLOR=1 GOCACHE=/tmp/cthulhu-build-cache go test ./internal/platform/xorg -count=1; python3 tests/native_x11.py | Private Xvfb/D-Bus proof passes: XTerm focus suspends speech and command grabs; Insert+Q reaches a real XTerm; an unknown active window remains suspended; a known non-XTerm window restores all existing command and release checks. | Pending human listening with Fenrir in XTerm | Follow-up gates delegated modifier interruption and echo; commands dispatch on press with balanced shutdown draining. Go retains the existing XTerm identity matching focus monitoring grab suspension and event suppression boundary. Notifications bypass suppression. Unknown active windows remain suspended so an incomplete match cannot strand a delegated terminal reader; live Fenrir handoff remains pending. | ||
| 14 | focus-speech | src/cthulhu/scripts/default.py | speech | Speak the focused accessible object including common control states and range values | Storm Dragon | internal/atspi internal/presentation internal/app | in-progress | go test ./internal/atspi ./internal/presentation ./internal/app -count=1 | Maintainer accepted post-change YAD value and LibreOffice focus value and menu behavior on physical Xorg on 2026-09-12. The combined log had no accessibility-event speech or sound queue overflow; 599 debug diagnostics were dropped during a LibreOffice state-event burst. | Maintainer reported that all combined YAD I38 and LibreOffice tests worked great on 2026-09-12. | Focus presentation includes common states and range values. Focused value changes speak only the value; non-focused state and value events are filtered; menu selection and table-cell verbosity are reduced. Relations position context background progress updates complete role-specific formatting and diagnostics saturation acceptance remain pending. Parity review corrections and remaining physical gates: docs/testing/parity-review-follow-up.md. September 25 review: window-owned title tracking suppresses repeated name events and preserves empty-to-restored title changes; event-loop regression passes. Combo selection follow-up: focus/name/value event regressions verify selection-only speech without repeated combo cues and restore the cue on re-entry; focused app/presentation race checks pass. Physical listening pending. | ||
| 15 | terminal-caret-character | src/cthulhu/scripts/default.py | terminal | Speak the character at the caret | Storm Dragon | internal/app | in-progress | go test ./internal/atspi ./internal/presentation ./internal/app -count=1 | Maintainer accepted terminal caret behavior in the launcher's LXTerminal test application on Xorg during the Stage 1 physical checklist on 2026-09-11. | Maintainer heard terminal caret speech during the accepted Stage 1 physical Xorg checklist on 2026-09-11. | Uses AT-SPI character granularity with line fallback debounces caret movement and suppresses unchanged path-and-announcement combinations; broader terminal application and editing coverage remains pending. | ||
| 16 | terminal-text-change-echo | src/cthulhu/scripts/terminal/script.py | terminal | Speak sanitized inserted or deleted text from terminals and editable text controls | Storm Dragon | internal/app | in-progress | go test ./internal/atspi ./internal/presentation ./internal/app -count=1 | Maintainer accepted terminal insertion in LXTerminal on Xorg on 2026-09-11, accepted the post-change LibreOffice Writer typing behavior on physical Xorg on 2026-09-12, and confirmed YAD close-and-prompt coalescing on physical Xorg on 2026-09-13. Physical acceptance of terminal deletion-redraw coalescing is pending. | Maintainer accepted terminal insertion, Writer duplicate suppression, and YAD close-and-prompt behavior on physical Xorg. | Text changes are limited to terminals and editable text or paragraph roles. A change suppresses the next caret event from the same object so typing does not replay the line. Same-terminal insertion within the event-coalescing window suppresses a redundant interrupting terminal-focus presentation. A terminal deletion waits 50 ms and is suppressed only when the same terminal inserts replacement text at the same AT-SPI offset; standalone and different-offset deletions remain presentable. Debug speech delivery records retain the final utterance with cause and policy metadata; normal logging omits speech content. Broader application coverage remains incomplete. | ||
| 17 | managed-descendant-presentation | src/cthulhu/scripts/default.py | focus | Resolve focused container selection and active-descendant changes to the managed child | Storm Dragon | internal/atspi internal/app | in-progress | go test ./internal/atspi ./internal/app -count=1; python3 tests/native_x11.py | The isolated GTK/Xvfb/D-Bus selection fixture and physical I38 run-dialog completion selection speech passed on 2026-09-12 without regressing X11 pass-through command consumption release ordering lock states lifecycle or grab cleanup. | Maintainer accepted I38 run-dialog completion selection speech on physical Xorg on 2026-09-12. | The generic adapter registers both selection and active-descendant events resolves their managed child preserves the originating container path and filters events unless the container or child owns focus. Duplicate target presentations are suppressed. No I38-specific workaround was added. Broader GTK and Qt managed-descendant coverage remains pending. | ||
| 18 | ssip-speak-cancel | src/cthulhu/speechdispatcherfactory.py | speech | Send speech and cancellation through SSIP | Storm Dragon | internal/speech | in-progress | go test ./internal/speech -count=1 | Maintainer accepted audible non-consuming Control/Shift interruption in the Stage 1 physical Xorg checklist on 2026-09-11. | Maintainer heard lifecycle and terminal speech plus Control/Shift interruption during the accepted Stage 1 physical Xorg checklist on 2026-09-11. | Protocol replies 230 and 225 were confirmed against the local service; broader backend and X11 coverage remains pending. | ||
| 19 | web-structural-navigation | src/cthulhu/scripts/web/script.py | web | Move by headings and other document structure | Storm Dragon | internal/input internal/review internal/app | in-progress | go test -race ./... -count=1; python3 tests/native_browser.py | Private Brave/Xvfb structural and mode/chrome sequences pass on 2026-09-20. | Physical Xorg listening and wrap acceptance pending. | Structural navigation follows native caret movement. Echo suppression ends on subsequent input. Failed same-object context capture retries. Delayed document carets cannot override editable focus and stale results cannot overwrite unresolved unrelated focus. All 27 browse symbols pass through after routing is disabled. Complete Python structural settings and dialogs remain pending. Parity review corrections and remaining physical gates: docs/testing/parity-review-follow-up.md. | ||
| 20 | web-document-recapture | src/cthulhu/ax_object.py | web | Recover heading navigation after browser document replacement | Storm Dragon | internal/atspi internal/review internal/app | in-progress | go test -race ./... -count=1; python3 tests/native_browser.py | Private Brave/Xvfb passes immediate H after loading a new page and after activating its return link on 2026-09-20. | Physical forum listening acceptance pending. | Native caches refresh on recapture. Load completion retains the new root and resets browser context and pending reading. Worker page epochs retire queued and in-flight results across reused paths. Native reload and mode/chrome tests remain covered. Installed Go preview and Brave Origin are not verified. On 2026-09-21 semantic invalidation was scoped to captured objects so browser chrome and other applications cannot discard the document. Focused race tests and the full private Brave suite pass; heading/link jumps assert capture reuse. Large-page latency and logged stale-object failures still require physical retesting. September 22 log regressions: native invalid text-end recovery and bounded embedded text expansion; web name-event suppression; background load preserves verified chrome focus. Focused race tests and private Brave proofs pass. See docs/testing/chromium-browser.md for reference behavior and remaining physical gates. September 23 ownership correction rejects loads outside the current application or known window and after owner loss; accepted loads update the focus owner for correct defunct recovery. Five event-loop regressions and app race tests pass; physical acceptance remains pending. September 24 same-geometry window recovery now requires fresh active/showing/non-iconified state before foreground correlation; private recovery regression fails on the earlier preview and passes on the rebuilt one. Address changes outside the owned field are suppressed; popup-associated typing remains supported. September 25 review: recovery now checks the fresh tree when text/geometry recapture discovers a removed focus; deterministic regression and focused race checks pass. | ||
| 21 | web-caret-line-reading | src/cthulhu/scripts/web/script.py | web | Read displayed document content at the browser caret | Storm Dragon | internal/atspi internal/review internal/app internal/presentation | in-progress | go test -race ./... -count=1; python3 tests/native_browser.py | Private Brave/Xvfb H/Down/H and expanded page transition sequences pass on 2026-09-20. | Physical Xorg speech and sound listening pending. | Captured and assembled document lines use role/state sound categories and speech fallback. Unit tests cover visited links and per-object cue deduplication and sound-only versus speech-only policy. Character and word intents remain separate. Ordinary caret movement updates structural position. Initial read-all is implemented; braille and complete line-presentation parity remain pending. September 22 log regressions: native invalid text-end recovery and bounded embedded text expansion; web name-event suppression; background load preserves verified chrome focus. Focused race tests and private Brave proofs pass. See docs/testing/chromium-browser.md for reference behavior and remaining physical gates. September 24 prerequisite review: pending caret/terminal timers extracted under the same event-loop owner; adjacent-character word navigation and whitespace and embedded-marker traversal corrected; whole caret movement deadline added. Full race and isolated Brave/X11/ownership proofs pass; physical and installed-preview gates remain pending. See docs/testing/chromium-browser.md for dependency order. September 24 log correction: browse word and line speech includes link and heading ancestors with role sound policy; character output retains character granularity. Native Brave assertions cover link words and document-start heading level. See docs/testing/chromium-browser.md. September 25 review: trailing non-text objects no longer cause false stale-location errors for line/document-edge movement; focused regression and private Brave suite pass. Physical listening remains open. | ||
| 22 | config-read-preview | src/cthulhu/backends/toml_backend.py | settings | Read existing Cthulhu TOML and merge the startup profile | Storm Dragon | internal/config | implemented | go test ./internal/config ./cmd/cthulhu -count=1 | Read-only preview bridge available only through explicit --config selection. The Go-native schema and default path are intentionally separate; the one-shot importer remains Phase 8 work. | ||||
| 23 | config-speech-preview | src/cthulhu/speechdispatcherfactory.py | speech | Apply supported active-profile speech settings | Storm Dragon | internal/config internal/speech internal/app | in-progress | go test ./internal/config ./internal/speech ./internal/presentation ./internal/app -count=1 | Pending human listening gate | Applies enablement description punctuation capitalization and default voice settings. | |||
| 24 | typing-printable-key-echo | src/cthulhu/typing_echo_presenter.py | input | Apply printable typing-echo category settings to terminal and editable text insertions | Storm Dragon | internal/config internal/atspi internal/presentation internal/app | in-progress | go test ./internal/config ./internal/atspi ./internal/presentation ./internal/app -count=1 | Maintainer reported the configured printable echo settings worked in minimal physical Xorg tests on 2026-09-12; broader application coverage remains pending. | Maintainer heard the configured printable echo behavior in minimal tests on 2026-09-12. | Single-character terminal and editable AT-SPI insertions honor enableKeyEcho enableEchoByCharacter and alphabetic numeric punctuation space and diacritical categories. Multi-character insertions remain presentation events. | ||
| 25 | typing-nonprintable-boundary-echo | src/cthulhu/typing_echo_presenter.py | input | Apply non-printable key and word or sentence echo settings | Storm Dragon | internal/config internal/input internal/platform/xorg internal/atspi internal/presentation internal/app | in-progress | go test ./internal/config ./internal/input ./internal/platform/xorg ./internal/atspi ./internal/presentation ./internal/app -count=1 | Pending physical Xorg category chord and pass-through matrix | Pending human listening for modifier function action navigation dead-key word and sentence echo | XRecord copies stable non-printable names from the active keymap and suppresses configured Cthulhu modifier chords. Word and sentence echo use bounded text before the caret and retain the prior line across a newline. Printable delivery remains AT-SPI based to avoid duplicate XRecord speech. Parity review corrections and remaining physical gates: docs/testing/parity-review-follow-up.md. | ||
| 26 | keyboard-speech-interrupt | src/cthulhu/input_event.py | input | Interrupt speech on non-consuming Control or Shift press | Storm Dragon | internal/input internal/platform/xorg internal/app | in-progress | go test ./internal/input ./internal/platform/xorg ./internal/app -count=1 | Maintainer accepted Control and Shift interruption without stolen or stuck keys in the Stage 1 physical Xorg checklist on 2026-09-11. | Speech interruption was audible during the accepted physical Xorg checklist. | XRecord observation and speech-worker wiring are implemented; broader X11 matrix remains pending. | ||
| 27 | where-am-i-basic | src/cthulhu/where_am_i_presenter.py | command | Repeat basic information about the current focused accessible | Storm Dragon | internal/input internal/platform/xorg internal/app internal/presentation | in-progress | go test ./internal/input ./internal/platform/xorg ./internal/app -count=1; python3 tests/native_x11.py | Private X11 proof covers unmodified desktop KP_Enter consumption and balanced replay of desktop Cthulhu+Return; maintainer accepted the corrected physical desktop binding on Xorg on 2026-09-13 | Maintainer confirmed both the basic spoken result and corrected desktop binding on 2026-09-13 | Uses the latest accepted immutable focus or managed-descendant snapshot and the Python no-location message. keyboardLayout selects desktop KP_Enter or laptop Cthulhu+Return. Detailed context repeated-press behavior and selection details remain pending. | ||
| 28 | owned-object-tree | src/cthulhu/ax_object.py | review | Own stable accessible identities and navigate a validated tree without retaining native objects | Storm Dragon | internal/atspi internal/review internal/app | in-progress | go test ./internal/atspi ./internal/review ./internal/app -count=1; python3 tests/native_atspi.py | Private Xvfb D-Bus and GTK automation captures the desktop invalidates a removed defunct object recaptures into the same owned tree and invalidates references on adapter shutdown. | Identity combines the AT-SPI application bus name and object path. Complete-tree replacement preserves live references; subtree invalidation detaches removed nodes and makes old references stale. Parent child sibling malformed oversized concurrent and structural-event policy cases have unit coverage. The runtime worker follows the latest focus keeps capture off event and command loops recaptures stale state and presents semantic movement or Python boundary messages. Capture waits honor context and individual libatspi calls use explicit 800 ms ordinary and startup timeouts. GtkBox native addition delivery and recapture pass alongside the original ListBox defunct proof. Incomplete child lists trigger one worker recapture preserving live independent review position; failure changed-focus and repeated-invalidation tests pass. Physical dynamic-container recovery native ambiguous removal simplified navigation and text ranges remain pending. Component geometry is recorded separately. Object-navigation key acceptance is recorded separately. | |||
| 29 | object-navigation | src/cthulhu/object_navigator.py | review | Navigate the owned accessible hierarchy and present each object or boundary | Storm Dragon | internal/review internal/app internal/input internal/platform/xorg | in-progress | go test ./internal/review ./internal/app ./internal/input ./internal/platform/xorg -count=1; python3 tests/native_x11.py | Private X11 proof covers all four Cthulhu Control Arrow bindings with balanced consumption and no application leakage plus Insert-first and Control-first ordering for Up. Maintainer accepted physical Xorg press release behavior with no leaked or stuck keys on 2026-09-14. | Maintainer heard all expected object and boundary announcements on physical Xorg on 2026-09-14. | Runtime commands and asynchronous capture presentation are bound to Python's parent first-child previous-sibling and next-sibling gestures. Python simplified navigation filtering action invocation and toggle remain pending. Desktop numpad belongs to flat review and is intentionally not aliased to hierarchical object navigation. | ||
| 30 | clipboard-present-command | src/cthulhu/plugins/Clipboard/plugin.py | command | Present clipboard text URI objects image presence empty state or access errors with Cthulhu+Shift+C | Storm Dragon | internal/input internal/clipboard internal/app internal/platform/xorg | in-progress | go test ./internal/clipboard ./internal/input ./internal/app ./internal/platform/xorg -count=1; isolated Xvfb clipboard helper and native command test | Private X11 proof covers Cthulhu+Shift+C press dispatch and both release orders; isolated GTK clipboard reads confirmed text URI and image formats | Pending human speech acceptance for text URI image empty and error cases | The Go command reads GTK 3 clipboard data in a short lived helper with a three second timeout so a stalled clipboard owner cannot block input or shutdown. It announces text URI object names and types image presence empty state and access errors. URI-only clipboard data is presented even when no text target exists. Physical Xorg listening remains pending. | ||
| 31 | display-version-command | src/cthulhu/plugins/DisplayVersion/plugin.py | command | Speak the Cthulhu version plus revision AT-SPI version and session details with Cthulhu+Shift+V | Storm Dragon | internal/input internal/presentation internal/version | pending | Pending Cthulhu+Shift+V X11 key-consumption and release gate | Pending human listening gate | Python registers the gesture once and presents only through an active script; the announcement conditionally includes the code name build revision and XDG session type and desktop. The Phase 0 audit also confirmed that plugin.info marks this as a visible non-builtin plugin. Go currently implements command-line version output only; that is not evidence for this spoken command. | |||
| 32 | game-mode-command | src/cthulhu/plugins/GameMode/plugin.py | input | Toggle reduced speech interruption for ordinary unbound key presses with Cthulhu+Control+G | Storm Dragon | internal/input internal/config internal/presentation | pending | Pending global Cthulhu+Control+G and unbound-key X11 non-consumption gate | Pending human listening gate for toggle messages and held-key speech continuity | Python keeps interruption for handled or consumed commands and Cthulhu modifiers while game mode is enabled and resets the setting on plugin deactivation. The Phase 0 audit also confirmed that plugin.info marks this as a visible non-builtin plugin. The Go preview now interrupts on every observed key press; reduced-interruption game mode remains pending. | |||
| 33 | hello-world-plugin-example | src/cthulhu/plugins/hello_world/plugin.py | extension | Register a learn-mode-aware Cthulhu+Z example command that presents hello world | Storm Dragon | api/lua/v1 docs/contributor | pending | Pending extension-command X11 key-consumption and release gate | Pending human listening and learn-mode acceptance | Python is a visible non-builtin test plugin and directly accesses the active script without checking that it exists. Preserve the user-facing tutorial behavior in the process-isolated Lua extension examples rather than embedding this Python plugin. | |||
| 34 | self-voice-socket | src/cthulhu/plugins/self_voice/plugin.py | remote | Accept external UTF-8 text over a local Unix socket for speech and braille presentation with append and persistent markers | Storm Dragon | accepted-omission | Decision 0005 omits XDG_RUNTIME_DIR/cthulhu.sock and its <#APPEND#> and <#PERSISTENT#> marker protocol in favor of the established Cthulhu D-Bus self-voice API. No socket bridge or compatibility parser will be implemented. | ||||||
| 35 | self-voice-dbus-present | src/cthulhu/dbus_service.py | remote | Present an external message through normal speech and braille output over the session D-Bus service | Storm Dragon | internal/remote internal/app | in-progress | go test ./internal/remote ./internal/app -count=1; CTHULHU_NATIVE_DBUS_TEST=1 go test ./internal/remote -run '^TestNativeSessionBusSelfVoice$' -count=1 | Private session-bus and handler tests pass same-user dispatch introspection and output queueing. | Pending PresentMessage speech listening acceptance | Pending PresentMessage braille acceptance | PresentMessage queues speech without interruption and braille when connected; it returns false only if neither output is available. Physical display delivery remains unverified. | |
| 36 | self-voice-dbus-speak | src/cthulhu/dbus_service.py | remote | Speak external plain text with caller-selected interruption over the session D-Bus service | Storm Dragon | internal/remote internal/app | in-progress | go test ./internal/remote ./internal/app -count=1; CTHULHU_NATIVE_DBUS_TEST=1 go test ./internal/remote -run '^TestNativeSessionBusSelfVoice$' -count=1 | Private session-bus proof passes same-user dispatch introspection conflict shutdown release and reacquisition. | Pending SpeakText queued and interrupting speech listening acceptance | Empty and over-64-KiB text is rejected. Noninterrupting text queues; interrupting text clears pending output uses the owned cancellation barrier and then queues the requested text. | ||
| 37 | self-voice-dbus-braille | src/cthulhu/dbus_service.py | remote | Display an external persistent braille message over the session D-Bus service | Storm Dragon | internal/remote internal/app | in-progress | go test -tags brlapi ./internal/remote ./internal/app -count=1 | Focused tests confirm connected-worker queueing and rejection when disconnected. | Pending physical BrailleMessage delivery and persistent-display acceptance | BrailleMessage queues a persistent frame only after the BrlAPI helper reports ready. It rejects empty and over-10-KiB text; physical display and Wine client acceptance remain open. | ||
| 38 | self-voice-dbus-cancel | src/cthulhu/dbus_service.py | remote | Cancel current speech at an external application's request over the session D-Bus service | Storm Dragon | internal/remote internal/app | in-progress | go test ./internal/remote ./internal/app -count=1; CTHULHU_NATIVE_DBUS_TEST=1 go test ./internal/remote -run '^TestNativeSessionBusSelfVoice$' -count=1 | Private session-bus proof passes same-user dispatch introspection conflict shutdown release and reacquisition. | Pending CancelSpeech interruption and subsequent-delivery listening acceptance | CancelSpeech uses the asynchronous owned speech-worker interruption path and returns false when speech is unavailable. Like Python it does not cancel sound output. | ||
| 39 | nvda-controller-ssml-rejection | src/cthulhu/dbus_service.py | remote | Reject invalid or unsupported NVDA Controller 2 SSML without claiming mark or completion support | Storm Dragon | internal/remote | implemented | go test ./internal/remote -count=1; CTHULHU_NATIVE_DBUS_TEST=1 go test ./internal/remote -run '^TestNativeSessionBusSelfVoice$' -count=1 | Private session-bus proof passes the real SpeakSsml signature and unsupported result. | Malformed XML or a non-speak root returns Windows ERROR_INVALID_PARAMETER 87. Valid speak-root SSML returns ERROR_NOT_SUPPORTED 50 matching Python because mark callbacks and completion semantics are unavailable. | |||
| 40 | flat-review-keys | src/cthulhu/flat_review_presenter.py | review | Navigate and present content with desktop and laptop review keys | Storm Dragon | internal/input internal/review internal/app internal/platform/xorg | in-progress | DISPLAY=:0 go test -race ./internal/atspi ./internal/review ./internal/app ./internal/input ./internal/platform/xorg ./internal/presentation -count=1; DISPLAY=:0 python3 tests/native_atspi.py; DISPLAY=:0 python3 tests/native_x11.py | Private Xvfb tests pass all nine desktop and laptop sequential review commands; both laptop release orders; NumLock numeric keypad typing; laptop keypad pass-through; existing command and shutdown checks. | Maintainer accepted all currently implemented terminal flat-review behavior on physical Xorg on 2026-09-23; broader application listening remains pending | Pending braille reading gate | Basic previous/current/next line word and code-point character commands are wired to owned window layout and the existing review worker. Window boundaries stop silently as in Python. Capture limits are reported explicitly. Native GTK text navigation and edit recovery pass. Viewport seeking mode toggling same-object caret following after leaving review state/value zones advanced bindings mouse review and full application parity remain pending. See docs/testing/flat-review.md. Parity review corrections and remaining physical gates: docs/testing/parity-review-follow-up.md. | |
| 41 | preferences-basic-speech | src/cthulhu/cthulhu_gui_prefs.py | settings | Open accessible basic speech preferences and apply or save settings | Storm Dragon | internal/preferences internal/app internal/config | in-progress | go test -race ./... -count=1; python3 tests/native_preferences.py; python3 tests/native_x11.py | Private Xvfb GTK and command checks pass; maintainer accepted save shutdown restart and restored settings on physical Xorg on 2026-09-13; broader desktop traversal pending | Pending human listening for immediate rate pitch and volume previews plus punctuation and capitalization | Apply and OK update the active schema-v2 profile while preserving other profiles and application mappings; Apply stays open and OK closes. Default-voice rate pitch volume and server-default toggles preview immediately without committing settings; Cancel restores the last applied voice configuration. Explicitly selected legacy files remain session-only and cannot be overwritten. Advanced preferences and importer remain pending. | ||
| 42 | review-component-geometry | src/cthulhu/flat_review.py | review | Capture component screen bounds and visibility for flat-review clipping | Storm Dragon | internal/atspi | implemented | DISPLAY=:0 go test ./internal/atspi -count=1; DISPLAY=:0 python3 tests/native_atspi.py | Private Xvfb D-Bus GtkBox tests verify screen bounds resize invalidation changed dimensions hide invalidation and recapture. Physical acceptance deferred by maintainer on 2026-09-14. | Geometry queries run only during owned-tree capture. Bounds and visibility events invalidate geometry without removing identities. Negative coordinates overflow-safe clipping malformed geometry and concurrent invalidation have unit tests. Component bounds do not establish occlusion text ranges zones reading order or flat-review key support. | |||
| 43 | review-visible-text | src/cthulhu/flat_review.py | review | Capture bounded visible text with character offsets and screen clipping | Storm Dragon | internal/atspi | in-progress | DISPLAY=:0 go test -race ./internal/atspi ./internal/review ./internal/app ./internal/parity -count=1; DISPLAY=:0 python3 tests/native_atspi.py | Private ListBox and GtkBox capture edit clipping hidden-text and password-exclusion checks pass. Physical acceptance deferred. | Pending navigation and listening gate | Exact Unicode offsets and owned ranges now include captured caret offsets. Text caret and geometry events make cached text stale without removing identities. Maximum 4096 characters and 256 lines or ranges per object and 1 MiB per tree. Oversized objects remain limited with no partial text. Basic zones and review commands now consume this data; large-document viewport seeking and physical listening remain pending. | ||
| 44 | date-time-commands | src/cthulhu/date_and_time_presenter.py | command | Speak local time with Cthulhu+T and date with a double tap using saved formats | Storm Dragon | internal/input internal/app internal/preferences internal/config | in-progress | go test ./... -count=1; focused race checks; native keyboard double-tap checks | Private Xvfb press-time and both-release-order checks passed; physical Xorg pending | Pending human listening | Pending braille | All 7 Python time and 16 Python date format choices are wired including locale seconds word numeric full and abbreviated variants; see docs/testing/time-date.md. | |
| 45 | notifications | src/cthulhu/notification_presenter.py;src/cthulhu/scripts/apps/notification-daemon/script.py;src/cthulhu/scripts/apps/notify-osd/script.py;src/cthulhu/mako_notification_monitor.py | notification | Present provider notifications save history expose mako live actions speak the last notification and open the notification-list GUI | Storm Dragon | internal/notification internal/app internal/notificationui internal/atspi internal/input | in-progress | NO_COLOR=1 GOCACHE=/tmp/cthulhu-build-cache go test ./... -count=1; NO_COLOR=1 python3 tests/native_notifications.py | Automated speech-queue history list-state and list-action assertions passed; headless Xvfb/AT-SPI GUI proof passed; human listening and physical Xorg use not verified | Braille not implemented | Go registers window-create and accessible-name events maps notification-daemon mate and xfce4 providers handles notify-osd gauge and name events keeps a 55-entry history and adds Cthulhu+N plus Cthulhu+Ctrl+N. The modal accessible list opens in a GTK helper process with sortable rows copy dismiss clear close dynamic actions and mako live refresh. Live provider Xorg acceptance remains pending. Parity review corrections and remaining physical gates: docs/testing/parity-review-follow-up.md. | ||
| 46 | ordinary-key-speech-interrupt | src/cthulhu/input_event.py | input | Interrupt speech on an ordinary key press even if focus does not move | internal/input internal/app | implemented | go test ./internal/input ./internal/app -run TestProcessInputEventsInterruptsSpeechOnKeyPress -count=1 | Python KeyboardEvent._present interrupts on press outside game mode. Go now interrupts on every observed press; physical FastSMRW table-boundary listening remains pending. | |||||
| 47 | table-cell-selection-speech | src/cthulhu/speech_generator.py; src/cthulhu/scripts/default.py | speech | Omit selected from table-cell focus speech and avoid deselection chatter during movement | internal/presentation internal/app | implemented | go test ./internal/presentation ./internal/app -count=1 | Selected table-cell focus omits the state; a focused selected-state event can still announce selected. Physical FastSMRW listening remains pending. | |||||
| 48 | braille-focused-text-routing | src/cthulhu/braille.py | braille | Route display cells to the native focused text caret | internal/braille internal/app internal/atspi | in-progress | go test -race -tags brlapi ./internal/braille ./internal/app ./internal/atspi -count=1; python3 tests/native_atspi.py | Private GTK/Xvfb routes Unicode and EOL carets and rejects stale content and old focus. Physical Xorg pending. | Physical display routing and BRLTTY ownership recovery pending. | Frame IDs and panned Unicode offsets return through the helper; the GLib owner revalidates focus and source text. Component actions and mouse fallback; virtual browser carets; contracted and review routing remain pending. See docs/testing/braille.md. | |||
| 49 | braille-focused-object-formatting | src/cthulhu/formatting.py;src/cthulhu/braille_generator.py;src/cthulhu/object_properties.py | braille | Format focused text and common controls for braille | internal/app internal/atspi | in-progress | go test ./internal/app ./internal/atspi ./internal/braille -count=1 | Private GTK/Xvfb verifies native Unicode capture and caret offsets. | Physical text and control reading pending. | Default verbose long-role subset: control indicators; expansion; values; EOL and text state suffixes. Full ancestor/group/table context; labels distinct from names; masks; translation; preferences and application overrides remain pending. Reference inspected at local Python b9dd2eb2bf96143309ba0c724c47f86d978826ef; the original inventory oracle commit is unavailable in that checkout. See docs/testing/braille.md. | |||
| 50 | editable-text-selection | src/cthulhu/scripts/default.py;src/cthulhu/script_utilities.py | editing | Speak changed selected or unselected text in a focused editable control | internal/atspi internal/app | implemented | go test ./internal/app ./internal/input -run 'TestTextSelection|TestIntent' -count=1; CTHULHU_NATIVE_BROWSER_TESTS=selection python3 tests/native_browser.py | Private Brave/Xvfb fixture verified native selection offsets and text in the browser input. | Physical speech listening pending. | Physical selection dots pending. | The Go event loop compares bounded native selection ranges and excludes password text and autocomplete; browse-mode document selection is tracked separately in web-browse-selection. See docs/testing/editing-selection.md. | ||
| 51 | editable-cut-paste-feedback | src/cthulhu/scripts/default.py;src/cthulhu/script_utilities.py | editing | Announce cut and paste after editable text mutations | internal/input internal/app | implemented | go test ./internal/app ./internal/input -run 'TestClipboardFeedback|TestIntent' -count=1; CTHULHU_NATIVE_BROWSER_TESTS=selection python3 tests/native_browser.py | Private Brave/Xvfb fixture verified Ctrl+X deletion and Ctrl+V insertion events. | Physical cut and paste listening pending. | Physical short-message braille pending. | Go says cut or pasted from clipboard once after a matching focused editable mutation; subsequent paste text and caret events do not interrupt the message. Python uses full or brief clipboard messages. See docs/testing/editing-selection.md. | ||
| 52 | editable-copy-feedback | src/cthulhu/scripts/default.py | editing | Confirm a successful copy to the clipboard | internal/input internal/platform/xorg internal/app | in-progress | go test ./internal/input ./internal/app -run 'TestIntent|TestCopyFeedback' -count=1; CTHULHU_NATIVE_X11=1 go test ./internal/platform/xorg -run TestNativeClipboardOwnerChange -count=1 | Private Xvfb observed XFixes clipboard ownership change after copy. | Physical Xorg listening pending. | Short-message braille pending. | Go says copied to clipboard once after Ctrl+C and an X11 clipboard ownership change; it stays silent if ownership does not change. See docs/testing/editing-selection.md. | ||
| 53 | web-browse-selection | src/cthulhu/scripts/web/script.py;src/cthulhu/script_utilities.py | web | Select document text with Shift and Ctrl+Shift arrows in browse mode | internal/review internal/atspi internal/app | in-progress | Private Brave modes fixture verifies selected and unselected speech plus braille dots within one page text object and selected speech from a heading into a paragraph. | Maintainer reported on 2026-10-03 that browser selection works but a selected message is missing after selecting a section. | The browser can perform native selection without a Go selection command. Go follows native selection within text objects and across the tested heading-to-paragraph transition; the reported section case is unreproduced. The maintainer checks clipboard contents to confirm selection. See docs/testing/reading-selection-diagnostics.md. | ||||
| 54 | web-browse-braille-line | src/cthulhu/caret_navigation.py;src/cthulhu/scripts/web/script.py;src/cthulhu/scripts/web/braille_generator.py | braille | Follow accepted browse-caret and structural navigation with the current native text line and virtual cursor | internal/atspi internal/review internal/app | implemented | go test -race ./internal/app ./internal/review ./internal/atspi ./internal/braille -count=1; CTHULHU_NATIVE_BROWSER_TESTS=modes,tables,keys python3 tests/native_browser.py | Private Brave/Xvfb mode/table/key checks pass on 2026-10-02; physical Xorg pending. | Existing browse speech assertions pass in the private fixture. | Queued native line and cursor frames pass; physical HumanWare NLS eReader acceptance pending. | Reads run on the bounded navigation worker only while braille is enabled; preserve spaces and Unicode offsets. Table frames retain existing cell presentation. Complete cross-object visual-line assembly and virtual-caret routing remain open. See docs/testing/braille.md. | ||
| 55 | web-explicit-link-names | src/cthulhu/scripts/web/script_utilities.py:_treatObjectAsWhole | web | Read explicitly named links as whole objects without losing descendant badges or ordinary link navigation | Storm Dragon | internal/atspi internal/review internal/app | in-progress | go test -race ./...; CTHULHU_NATIVE_BROWSER_TESTS=namedlinks,browser,live,keys python3 tests/native_browser.py | Private Brave/Xorg named-link and key checks passed | Fixture speech verified; real Steam listening pending | Named-link browse braille uses the full accessible label; physical check pending | docs/testing/steam-browser.md; actual Steam explicit-name exposure and game-card acceptance remain live gates | |
| 56 | steam-notifications | src/cthulhu/scripts/apps/steamwebhelper/script.py;tests/test_steam_notification_regressions.py | web | Coalesce verified Steam background toasts and present once through speech braille and notification history | Storm Dragon | internal/webscripts internal/atspi internal/app | in-progress | go test -race ./...; python3 tests/native_webscripts.py | Private GTK/AT-SPI process matching and alert-root capture passed | Event-loop background delivery and Chromium isolation passed; real Steam toast pending | Event-loop flash verified; physical Steam toast display pending | docs/testing/steam-browser.md; independent root and bus queues deliberately prevent unrelated toast timestamps from merging | |
| 57 | libreoffice-calc-basic | Orca src/orca/scripts/apps/soffice/script.py; Orca src/orca/ax_utilities_table.py; Orca src/orca/speech_generator.py | libreoffice | Present Calc cells and recover logical focus around editing and sheet changes | Storm Dragon | internal/app internal/atspi internal/presentation | in-progress | GOCACHE=/tmp/cthulhu-go-cache go test -race ./internal/atspi ./internal/app ./internal/presentation -count=1; /usr/bin/python3 tests/native_libreoffice.py | Private real LibreOffice Calc 26.2.6.3 on Xvfb and a private AT-SPI bus validates cell movement blanks F2 typing Escape Enter and sheet changes. | Recorded speech assertions pass; audible and physical-input acceptance pending. | Recorded value and coordinate frames pass; physical Braille and editor routing acceptance pending. | Current Orca is the primary Office reference. Dedicated application policy follows verified process identity after foreground/security gates; native capture remains bounded. Formulas range announcements dynamic headers full-row reading and Writer workflows remain open. See LIBREOFFICE_SUPPORT.md. |