I haven't tested this with Braille support; I don't remember what I did with the cable.
80 KiB
80 KiB
| 1 | id | python_source | subsystem | behavior | owner | go_destination | status | automated_evidence | x11_evidence | wayland_evidence | speech_evidence | braille_evidence | notes |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | submission-clear-deletion | src/cthulhu/scripts/default.py:onTextDeleted | speech | Avoid announcing an entry clear after plain Enter before the submitted chat message | internal/app/submitted_text.go;internal/input/intent.go | in-progress | Submission replay fails against the original presenter and passes with the fix; editing regression matrix and focused race checks pass. | Private GTK submission and selected-text replacement checks use native snapshots and the real X11 input listener. | Speech requests verified; live Pidgin listening pending. | Braille update path retained; physical display acceptance pending. | Requires focused text or entry plus fresh plain Enter and known empty line at offset zero. Selection replacement and modified Enter retain existing feedback. No Thunderbird or word-echo changes. See docs/testing/messaging.md. | ||
| 3 | mate-panel-menu | Orca src/orca/scripts/default.py;src/orca/ax_utilities.py;src/orca/generator.py | focus | Read active MATE panel menus across X11 application boundaries and label unnamed panel icons | internal/atspi internal/app | in-progress | Private native and event-loop regressions; see docs/testing/mate-desktop.md | Separate GTK providers cover editor and empty desktop menus; submenus; reverse navigation; Escape; hidden/impostor rejection; icon label precedence. | Queued presentation verified; actual Fedora MATE listening pending. | Native event-loop frames verified; physical display acceptance pending. | Fresh active/showing native menu structure and verified mate-panel process only. Preserves X11 correlation without retained popup state. Existing Marco and notification paths retained. Human review and live MATE acceptance required. | ||
| 4 | mate-window-switcher | Orca src/orca/scripts/switcher/script.py;src/orca/scripts/switcher/script_utilities.py | focus | Present Marco switcher selections while the old application retains X11 foreground | internal/atspi internal/app | in-progress | go test ./internal/app -run '^TestMateWindowSwitcher' -count=1; see docs/testing/window-switcher.md | Private GTK provider checks repeated insertions and showing events outside foreground without taking ownership. | Actual Marco listening and physical key acceptance pending. | Transient flash requests tested; physical display acceptance pending. | Verified Marco process and application plus visible status-bar container only. Preserves application focus and review. No name-signal duplication or general background bypass. Original log lacks later cycling insertions; real cycling and Escape remain live gates. | ||
| 5 | 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. | |||
| 6 | 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. | |||
| 7 | 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. | |||
| 8 | 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. | |||
| 9 | 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 | implemented | go test ./internal/app ./internal/atspi -count=1; CTHULHU_NATIVE_BROWSER_TESTS=live python3 tests/native_browser.py; CTHULHU_NATIVE_BROWSER_TESTS=live-atomic python3 tests/native_browser.py | Private Brave/Xvfb fixture captures the Skald-style status update and real child text; physical Skald Xorg test pending. | Maintainer confirms extensive live browser testing passes in Firefox and Chromium-based browsers on 2026-10-22; element lists and jumping to selected items are explicitly confirmed. See docs/testing/release-acceptance.md. | 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. October 24 audit fixes resolve atomic ancestors and defer established busy live regions until completion. Private Chromium atomic text/child updates non-atomic updates and busy release without a new insertion pass. Provider metadata limits and pending physical checks are documented in docs/testing/browser-audit-fixes.md. | ||
| 10 | 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. | |||
| 11 | 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. | ||
| 12 | 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. | ||
| 13 | 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. | |||
| 14 | 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. | |||
| 15 | 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. | |||
| 16 | background-event-filtering | Orca src/orca/event_manager.py | focus | Reject routine background updates before selected-child and content capture | internal/atspi | in-progress | go test ./... -count=1; private background flood and notification checks; docs/testing/background-events.md | Private GTK floods from another provider and same-provider sibling produce zero selection/table/text/value queries; GTK Qt Brave ownership and browser checks pass | Private Wayland policy check preserves AT-SPI ownership without X11 authority | Actual FastSMRW and Brave listening pending | Physical Braille pending | Existing lifecycle notification menu autocomplete and detached-document validation paths are preserved; unrelated providers no longer clear owned text-line caches. | |
| 17 | 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 | implemented | 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. Maintainer confirms constant live use of XTerm handoff and recovery with good results on 2026-10-22. | Maintainer confirms XTerm handoff and recovery work very well during constant use on 2026-10-22. See docs/testing/release-acceptance.md. | 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 XTerm handoff and recovery are accepted by the maintainer on 2026-10-22. | ||
| 18 | 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 | implemented | 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 confirms thorough live testing of native application and terminal workflows; typing echo; selection; clipboard feedback; and object navigation on 2026-10-22. These workflows pass. See docs/testing/release-acceptance.md. | 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. Current general native focus listening is accepted by the maintainer on 2026-10-22. | ||
| 19 | terminal-caret-character | src/cthulhu/scripts/default.py | terminal | Speak the character at the caret | Storm Dragon | internal/app | implemented | 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 confirms thorough live testing of native application and terminal workflows; typing echo; selection; clipboard feedback; and object navigation on 2026-10-22. These workflows pass. See docs/testing/release-acceptance.md. | Uses AT-SPI character granularity with line fallback debounces caret movement and suppresses unchanged path-and-announcement combinations; the maintainer confirms thorough native and terminal live testing on 2026-10-22. | ||
| 20 | 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 | implemented | 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 confirms thorough live testing of native application and terminal workflows; typing echo; selection; clipboard feedback; and object navigation on 2026-10-22. These workflows pass. See docs/testing/release-acceptance.md. | 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. Focusable writable browser editors also own their editable paragraph events, preventing rejected insertions from replaying the growing line through caret speech. Private Chromium coverage and live acceptance steps are in docs/testing/browser-editor.md; original-page ChatGPT listening and physical Braille acceptance remain pending. | ||
| 21 | 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 | implemented | go test ./internal/atspi ./internal/app -count=1; python3 tests/native_x11.py; python3 tests/native_atspi.py --table-only | 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 confirms thorough live testing of native application and terminal workflows; typing echo; selection; clipboard feedback; and object navigation on 2026-10-22. These workflows pass. See docs/testing/release-acceptance.md. | 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. October 17: GTK controls with list role and Table interface retain selected-cell focus and table ownership without normalizing ordinary lists or choosing among multiple selected rows. Private native focus and recorded-speech tests cover first Down and genuine Shift+Tab exit; activation descriptions are not repeated on first row selection. Current physical listening and Braille acceptance remain pending. See docs/testing/gui-list-tables.md. | ||
| 22 | 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. | ||
| 23 | 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 | implemented | go test -race ./... -count=1; python3 tests/native_browser.py | Private Brave/Xvfb structural and mode/chrome sequences pass on 2026-09-20. | Maintainer confirms extensive live browser testing passes in Firefox and Chromium-based browsers on 2026-10-22; element lists and jumping to selected items are explicitly confirmed. See docs/testing/release-acceptance.md. | 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. Automatic structural focus is configurable globally and per application on 2026-10-28; defaults off and preserves sticky modes. Private GTK Apply/reload and Chromium native typing checks pass. Other Python structural settings remain pending. New option live listening and physical Braille acceptance remain pending; see docs/testing/structural-focus.md. Parity review corrections and remaining physical gates: docs/testing/parity-review-follow-up.md. | ||
| 24 | web-document-recapture | src/cthulhu/ax_object.py | web | Recover heading navigation after browser document replacement | Storm Dragon | internal/atspi internal/review internal/app | implemented | 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. | Maintainer confirms extensive live browser testing passes in Firefox and Chromium-based browsers on 2026-10-22; element lists and jumping to selected items are explicitly confirmed. See docs/testing/release-acceptance.md. | 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. | ||
| 25 | 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 | implemented | go test -race ./... -count=1; python3 tests/native_browser.py; go test -race ./internal/atspi ./internal/review ./internal/app -count=1; CTHULHU_NATIVE_BROWSER_TESTS=generatedlinks,replacement,tooltips,fragments,namedlinks,linkedheadings python3 tests/native_browser.py | Private Brave/Xvfb H/Down/H and expanded page transition sequences pass on 2026-09-20. On 2026-10-22 the maintainer confirmed reading the entire original Techrights article in Brave without looping after the generated-link recovery fix. See docs/testing/browser-release-review.md#generated-link-recovery-acceptance-2026-10-22. | Maintainer confirms extensive live browser testing passes in Firefox and Chromium-based browsers on 2026-10-22; element lists and jumping to selected items are explicitly confirmed. See docs/testing/release-acceptance.md. Original Techrights full-article reading accepted after the generated-link fix on 2026-10-22; see docs/testing/browser-release-review.md#generated-link-recovery-acceptance-2026-10-22. | 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. Explicitly named links retain whole-label line speech while character and word review use accessible-label offsets independently of native text. Generic unit and private Brave named-link regressions cover empty native text and badges plus both directions across following punctuation. Live speech and physical Braille acceptance remain pending. October 22 generated-link regression verifies exact prefix/body text with forward/reverse lines and Read All in private Brave. The maintainer accepted full-article reading on the original Techrights page after the fix; other live gates remain scoped to their named workflows. See docs/testing/browser-release-review.md#generated-link-recovery-acceptance-2026-10-22. October 24 audit fixes validate dirty hypertext ancestors before crossing objects; refreshed retries include inserted parent text. Word whitespace uses bounded native character blocks and caret ranges have indexed lookup. Existing native navigation regressions pass; see docs/testing/browser-audit-fixes.md for limitations and remaining work. | ||
| 26 | 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. | ||||
| 27 | config-speech-preview | src/cthulhu/speechdispatcherfactory.py | speech | Apply supported active-profile speech settings | Storm Dragon | internal/config internal/speech internal/app | implemented | go test ./internal/config ./internal/speech ./internal/presentation ./internal/app -count=1 | Maintainer confirms speech preferences; previews; Apply and Cancel; saved settings; and interruption-key settings work in live testing on 2026-10-22. See docs/testing/release-acceptance.md. | Applies enablement description punctuation capitalization and default voice settings. | |||
| 28 | 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 | implemented | 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 confirms thorough live testing of native application and terminal workflows; typing echo; selection; clipboard feedback; and object navigation on 2026-10-22. These workflows pass. See docs/testing/release-acceptance.md. | 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. Preferences offer disabled enabled and edit-fields-only radio choices; edit-fields-only uses native editable metadata and Wine editor focus while preserving configured echo voices. Automated focus and persistence checks pass; live speech and physical Braille acceptance for the new mode remain pending. | ||
| 29 | 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 | implemented | go test ./internal/config ./internal/input ./internal/platform/xorg ./internal/atspi ./internal/presentation ./internal/app -count=1; python3 tests/check_speech.py; python3 tests/native_test_session.py env CTHULHU_NATIVE_TYPING_ECHO=1 go test ./internal/app -run '^TestNativeTypingEchoLineSplit$' -count=1 | Pending physical Xorg category chord and pass-through matrix; private GTK TextView Enter checks pass for word/sentence completion in the middle and at the start of existing text on 2026-10-27 | Maintainer confirms thorough live testing of native application and terminal workflows; typing echo; selection; clipboard feedback; and object navigation on 2026-10-22. These workflows pass. See docs/testing/release-acceptance.md. | 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. Echo regressions cover all eight character/word/sentence mode combinations and all sixteen custom-voice selections with the custom master on/off; delivery records retain custom_echo. Enter completion preserves an empty known caret context and never substitutes following-line text. See docs/testing/key-echo.md; new live listening acceptance remains pending. Wine provides individual insertion labels without word/sentence completion context. | ||
| 30 | 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. | ||
| 31 | 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. | ||
| 32 | 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. | |||
| 33 | 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 | implemented | 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 confirms thorough live testing of native application and terminal workflows; typing echo; selection; clipboard feedback; and object navigation on 2026-10-22. These workflows pass. See docs/testing/release-acceptance.md. | 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. | ||
| 34 | 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 | implemented | 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 | Maintainer confirms date/time; spoken version; window-title; and clipboard-reading commands pass live testing on 2026-10-22. See docs/testing/release-acceptance.md. | 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. The maintainer confirms the clipboard-reading command works in live use on 2026-10-22; individual special-case test inputs were not itemized. | ||
| 35 | 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 | implemented | Pending Cthulhu+Shift+V X11 key-consumption and release gate | Maintainer confirms date/time; spoken version; window-title; and clipboard-reading commands pass live testing on 2026-10-22. See docs/testing/release-acceptance.md. | The Go PresentVersion command is bound to Cthulhu+Shift+V in both keyboard layouts. Runtime dispatch presents version.Details with the AT-SPI version and session metadata through the speech queue. The old claim that only command-line version output existed is obsolete; current code and the maintainer's live confirmation establish the spoken command. | |||
| 36 | 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 defaults to interrupting on every observed key press and now offers persistent interruption choices in Speech preferences; the separate Game Mode toggle remains pending. | |||
| 37 | 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. | |||
| 38 | 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. | ||||||
| 39 | 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. | Maintainer confirms native D-Bus integration works in live testing with Toby Doom on 2026-10-22. Individual API calls and output modalities were not itemized. See docs/testing/release-acceptance.md. | 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. Maintainer confirms native D-Bus integration works in live testing with Toby Doom on 2026-10-22. Individual API calls and output modalities were not itemized. See docs/testing/release-acceptance.md. | |
| 40 | 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. | Maintainer confirms native D-Bus integration works in live testing with Toby Doom on 2026-10-22. Individual API calls and output modalities were not itemized. See docs/testing/release-acceptance.md. | 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. Maintainer confirms native D-Bus integration works in live testing with Toby Doom on 2026-10-22. Individual API calls and output modalities were not itemized. See docs/testing/release-acceptance.md. | ||
| 41 | 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. Maintainer confirms native D-Bus integration works in live testing with Toby Doom on 2026-10-22. Individual API calls and output modalities were not itemized. See docs/testing/release-acceptance.md. | ||
| 42 | 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. | Maintainer confirms native D-Bus integration works in live testing with Toby Doom on 2026-10-22. Individual API calls and output modalities were not itemized. See docs/testing/release-acceptance.md. | CancelSpeech uses the asynchronous owned speech-worker interruption path and returns false when speech is unavailable. Like Python it does not cancel sound output. Maintainer confirms native D-Bus integration works in live testing with Toby Doom on 2026-10-22. Individual API calls and output modalities were not itemized. See docs/testing/release-acceptance.md. | ||
| 43 | 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. | |||
| 44 | 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 reports current flat review working well after the previous day's fixes on 2026-10-22. This is general live-use acceptance rather than confirmation of every parity feature or historical fixture. See docs/testing/release-acceptance.md. | Maintainer reports all Braille behavior testable on Orbit passes on 2026-10-22. The display has no routing keys; physical cursor routing is untested. See docs/testing/release-acceptance.md. | Basic previous/current/next line word and code-point character commands are wired to owned window layout and the existing review worker. Sequential line boundaries announce top or bottom of screen. Capture limits are reported explicitly. Native GTK text navigation and edit recovery pass. 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-robustness.md for the current capture comparison and clipped-text regression. Parity review corrections and remaining physical gates: docs/testing/parity-review-follow-up.md. Numpad 2 supports phonetic double press; Numpad 5 and 8 support literal and phonetic spelling on second and third presses within 500 ms. Shared desktop/laptop routing plus private X11 consumption and OCR cursor tests pass; live spelling listening remains pending. See docs/testing/phonetic-review.md. | |
| 45 | 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 | implemented | 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 | Maintainer confirms speech preferences; previews; Apply and Cancel; saved settings; and interruption-key settings work in live testing on 2026-10-22. See docs/testing/release-acceptance.md. | Apply and OK update the active schema-v2 profile while preserving other profiles and application mappings; Apply stays open and OK closes. Rate pitch and volume sliders are directly editable for every voice type and preview immediately without committing settings; untouched fields retain inheritance and automatic uppercase pitch; optional Speech Dispatcher defaults queries have bounded fallback values; Cancel restores the last applied voice configuration. Independent capital pitch beep and cap checkboxes replace the capitalization style dropdown; default pitch is enabled and all combinations apply to custom echo and spelling. Private GTK traversal and Apply/reload plus SSIP and persistence checks pass; general speech preferences listening is accepted by the maintainer on 2026-10-22; control-specific Braille acceptance was not separately stated. Direct-slider missing-file private reader GTK and SSIP checks are documented in docs/testing/speech-preferences.md; live acceptance of this simplification remains pending. Explicitly selected legacy files remain session-only and cannot be overwritten. Advanced preferences and importer remain pending. Phonetic character hints is an unchecked Speech Reading option; plain Left/Right character navigation can append a cancellable 300 ms phonetic hint. Private GTK default toggle Apply/reload and cancellation checks pass; physical listening remains pending. See docs/testing/phonetic-review.md. | ||
| 46 | 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. | |||
| 47 | 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. | Maintainer reports current flat review working well after the previous day's fixes on 2026-10-22. This is general live-use acceptance rather than confirmation of every parity feature or historical fixture. See docs/testing/release-acceptance.md. | Exact Unicode offsets and owned ranges include captured caret offsets. Text caret and geometry events invalidate cached text without retiring identities. Capture budgets are 65536 characters and 256 visible spans per object and 1 MiB per tree. Bounded line-rectangle discovery supports large objects without character rectangles; oversized lines use viewport glyph locations and bounded text spans. Zero-area glyphs no longer discard other visible text. Known unavailable objects and child subtrees leave healthy content reviewable with diagnostic omission counts and standard screen-boundary messages. Verified synthetic Text on controls uses accessible names or child content; tabs retain their label beside Close controls. Chromium address-value geometry remains unavailable. Root failures and aggregate layout budgets remain fatal. Private GTK fixtures and worker tests pass; physical speech and Braille acceptance remain pending. See docs/testing/flat-review-robustness.md. | ||
| 48 | 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 | implemented | 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 | Maintainer confirms date/time; spoken version; window-title; and clipboard-reading commands pass live testing on 2026-10-22. See docs/testing/release-acceptance.md. | 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. | |
| 49 | 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 | implemented | 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 and private GUI checks pass. Maintainer confirms notification announcements and the notification list work in live testing on 2026-10-22. See docs/testing/release-acceptance.md. | Mako notification announcements implement Braille flashes through notificationAnnouncer.Announce. Provider-specific physical display acceptance was not separately stated. | 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. Parity review corrections and remaining physical gates: docs/testing/parity-review-follow-up.md. | ||
| 50 | 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 interrupts on every observed press by default; Speech preferences can restrict interruption to common or recorded keys. Physical FastSMRW table-boundary listening remains pending. | |||||
| 51 | 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. | |||||
| 52 | 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 cursor routing untested: the maintainer's Orbit has no routing keys. General reading and panning pass on Orbit as confirmed on 2026-10-22; BRLTTY ownership recovery remains unverified. See docs/testing/release-acceptance.md. | 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. | |||
| 53 | 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. | Maintainer confirms physical native application reading and panning pass on Orbit on 2026-10-22. This is general live-use acceptance; application-specific parity remains separately tracked. See docs/testing/release-acceptance.md. | 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. | |||
| 54 | 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. | Maintainer confirms thorough live testing of native application and terminal workflows; typing echo; selection; clipboard feedback; and object navigation on 2026-10-22. These workflows pass. See docs/testing/release-acceptance.md. | 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. | ||
| 55 | 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. | Maintainer confirms thorough live testing of native application and terminal workflows; typing echo; selection; clipboard feedback; and object navigation on 2026-10-22. These workflows pass. See docs/testing/release-acceptance.md. | 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. | ||
| 56 | editable-copy-feedback | src/cthulhu/scripts/default.py | editing | Confirm a successful copy to the clipboard | internal/input internal/platform/xorg internal/app | implemented | 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. | Maintainer confirms thorough live testing of native application and terminal workflows; typing echo; selection; clipboard feedback; and object navigation on 2026-10-22. These workflows pass. See docs/testing/release-acceptance.md. | 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. | ||
| 57 | 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 | implemented | 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 confirms correct browser selection and deselection feedback using Shift+arrows and Ctrl+Shift+arrows on 2026-10-22. This supersedes the 2026-10-03 missing-announcement report. See docs/testing/release-acceptance.md. | 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 maintainer checks clipboard contents to confirm selection. See docs/testing/reading-selection-diagnostics.md. | ||||
| 58 | 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. Maintainer confirms physical browser reading and panning pass on Orbit on 2026-10-22. Physical HumanWare NLS eReader acceptance and cursor routing remain unverified. See docs/testing/release-acceptance.md. | 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. | ||
| 59 | 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 | Maintainer confirms extensive live browser testing passes in Firefox and Chromium-based browsers on 2026-10-22; element lists and jumping to selected items are explicitly confirmed. See docs/testing/release-acceptance.md. Steam-specific named-link and game-card listening remains unconfirmed. | 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 | |
| 60 | 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 | implemented | 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 pass. Maintainer confirms Steam notifications work in live testing on 2026-10-22. See docs/testing/release-acceptance.md. | 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 | |
| 61 | 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. Maintainer confirms basic cell navigation and editing work in live use on 2026-10-22. Selection and sheet-switching acceptance await real-world testing. See docs/testing/release-acceptance.md. | 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. Formula presence and explicit formula/basic Where Am I speech are implemented with bounded uncached cell attributes and recorded real-Calc checks; physical acceptance remains pending. Bounded selection deltas for small ranges and row/column selections plus count summaries for large selections and Select All are implemented. Real Calc checks cover disjoint cells and huge selections; physical speech/input/Braille acceptance remains pending. Dynamic row and column headers now use session choices scoped by provider bus document view window and exact sheet name; native reads are bounded to two cells. Four assignable commands preserve existing shortcuts. Private i3 Calc checks cover heading edits independent axis clearing sheet round trips both workbook-return directions with distinct headings and Find and Replace typing/cancellation. Frame activation and X11 foreground recovery avoid stale descendant searches; physical speech/input/Braille acceptance remains pending. Full-row reading Writer workflows and full topology reporting for large selections remain open. See LIBREOFFICE_SUPPORT.md. | |
| 62 | steam-shader-progress | Steam shader dialog AT-SPI events | web | Report Steam Vulkan shader percentages through shared progress output | internal/webscripts internal/app | in-progress | go test ./internal/app ./internal/webscripts ./internal/presentation ./internal/sound -count=1; python3 tests/native_progress.py; CTHULHU_NATIVE_BROWSER_TESTS=progress python3 tests/native_browser.py | Private GTK and Brave HTML/ARIA progress checks passed. | Tone requests verified; live Steam listening pending. | Unrelated Braille ownership covered by unit tests; physical check pending. | English static shader-status name changes only; verified steamwebhelper identity; see PROGRESS_BARS.md. | ||
| 63 | wayland-shared-keyboard-access | src/cthulhu/input_event_manager.py | input | Monitor keys and grab reader shortcuts through the shared accessibility keyboard interface | Storm Dragon | internal/platform/wayland internal/app internal/sessionbus | in-progress | Private dbus-run-session race tests cover wire protocol runtime dispatch configuration rollback secure transitions and cleanup; go test ./... -count=1; python3 tests/check_speech.py | Existing native_x11.py keyboard harness passed; browser tabs and editing passed; browser modes passed on isolated rerun after one failure whose cause was not established. | Shared D-Bus fixture passed without an X display. On 2026-10-22 the maintainer reports minimal live testing and user reports of poorer behavior than native Xorg. Specific compositor and physical key-suppression acceptance remain unverified. See docs/testing/release-acceptance.md. | Minimal live Wayland testing reported by the maintainer on 2026-10-22; broad listening acceptance is not established. | Pending physical Braille on Wayland | No compositor-specific code. See WAYLAND_SUPPORT.md for supported commands limitations and live acceptance. X11 production listeners are unchanged; the suspension probe now links its existing xkbcommon dependency. |
| 64 | web-browse-recovery-activation | Orca src/orca/scripts/web/script_utilities.py; master:src/cthulhu/scripts/web/script.py | web | Recover dynamic browse positions and activate custom clickables silently | internal/atspi internal/review internal/app | implemented | go test -race ./... -count=1; python3 tests/native_browser.py; python3 tests/native_browser_navigation.py; python3 tests/native_firefox.py; go test -race ./internal/atspi ./internal/review ./internal/app -count=1; CTHULHU_NATIVE_BROWSER_TESTS=generatedlinks,replacement,tooltips,fragments,namedlinks,linkedheadings python3 tests/native_browser.py | Private Chromium and Firefox fixtures; real-reader changing-page and activation checks use private Xvfb and D-Bus. On 2026-10-22 the maintainer confirmed reading the entire original Techrights article in Brave without looping after the generated-link recovery fix. See docs/testing/browser-release-review.md#generated-link-recovery-acceptance-2026-10-22. | Maintainer confirms extensive live browser testing passes in Firefox and Chromium-based browsers on 2026-10-22; element lists and jumping to selected items are explicitly confirmed. See docs/testing/release-acceptance.md. Original Techrights full-article reading accepted after the generated-link fix on 2026-10-22; see docs/testing/browser-release-review.md#generated-link-recovery-acceptance-2026-10-22. | Selection-collapse regression and native mode frames covered; physical routing remains pending. | See docs/testing/browser-release-review.md for findings and live acceptance. No full Orca parity claim. October 22 generated-link recovery retains the same parent and adjacent sibling identities; refreshes navigation-defunct child order and disappearing native text; and gives Read All navigation recovery with document-generation rejection. The page-CSS fixture reproduces the first fix failure and passes after correction. Full-article reading on the original Brave page is accepted; separate manual reverse-navigation Read All activation and physical Braille checks were not reported. The separate dynamic-page flat-review failure remains open. | ||
| 65 | web-structural-lists | Orca src/orca/structural_navigator.py; src/orca/structural_navigator_command_definitions.py | web | List browser elements and move to a selected item | internal/input internal/review internal/interaction internal/app | implemented | go test -race ./... -count=1; CTHULHU_NATIVE_BROWSER_TESTS=lists,keys,document,modes,editing python3 tests/native_browser.py; python3 tests/native_internal_ui.py | Private Brave/Xvfb list workflow covers 302 links hidden content current row selection Escape clickables heading level and empty list. | Maintainer confirms extensive live browser testing passes in Firefox and Chromium-based browsers on 2026-10-22; element lists and jumping to selected items are explicitly confirmed. See docs/testing/release-acceptance.md. | Shared internal UI frames covered; physical Braille acceptance pending. | 25 browse shortcuts use Alt+Shift. All Orca list types are registered including unbound annotations internal frames and math. Exact targets and page ownership are validated before selection. See docs/testing/browser-lists.md for manual review and regression checks. | ||
| 66 | mozilla-leaf-text-reading | Orca src/orca/scripts/web/script_utilities.py | web | Read native heading and link text leaves in Firefox and Thunderbird | internal/atspi tests/native_mozilla.py | implemented | python3 tests/native_firefox.py; CTHULHU_BINARY=/tmp/cthulhu-mozilla-review /usr/bin/python3 tests/native_mozilla.py; go test -race ./internal/atspi ./internal/review ./internal/presentation ./internal/app -count=1 -timeout=120s | Private Firefox 158.0 and Thunderbird 158.0 sessions each cover 17 navigation commands and Read All with zero native caret synchronization errors. | Maintainer confirms extensive live browser testing passes in Firefox and Chromium-based browsers on 2026-10-22; element lists and jumping to selected items are explicitly confirmed. See docs/testing/release-acceptance.md. | Shared Chromium selection and routing checks passed; physical Mozilla Braille acceptance pending. | Shared document text metrics now include heading and link roles. Native Firefox metadata assertion failed before the fix. See docs/testing/mozilla-reading.md. Thunderbird folders message lists and composition remain outside this reading baseline. | ||
| 67 | thunderbird-local-mail-composition | Orca src/orca/scripts/apps/Thunderbird/script.py;src/orca/script_utilities.py | application | Navigate local folders and message tabs; select messages; compose replies and forwards; save and add attachments | internal/atspi internal/app tests/native_thunderbird.py | implemented | go test -race ./internal/atspi ./internal/app ./internal/review ./internal/presentation -count=1 -timeout=120s; CTHULHU_BINARY=/tmp/cthulhu-mozilla-review /usr/bin/python3 tests/native_thunderbird.py | Private Thunderbird 158.0 HTML and plain-text local mailbox checks cover message-tab return; Subject and body editing; reply and reply-all recipients with Cc; inline forwarding; exact selected rows after Shift and Ctrl navigation; received attachment saving with content verification; and adding a local file to an unsent draft. | SSIP verifies focus handoff and row roles; selection toggling; Subject and body echo; reply and forward editing; attachment menus and picker return. Maintainer relays third-party confirmation on 2026-10-22 that message reading; replies; forwards; and attachments work well in live testing. See docs/testing/release-acceptance.md. | Event-loop regression checks paragraph cursor and routing metadata; physical display acceptance pending. | Foreground replacement requires a registered application and fresh complete window membership. Editable paragraph events belong only to their focused editable document. Title echoes require owned editable focus and recent editing plus unchanged title prefix/suffix; unrelated status titles still announce. See docs/testing/thunderbird-workflows.md; no sending remote mailbox or page-load-option acceptance claimed. | ||
| 68 | flatpak-foreground-identity | src/cthulhu/script_utilities.py:canBeActiveWindow | focus | Correlate Flatpak accessibility providers with the X11 foreground across PID namespaces and D-Bus proxies | internal/platform/xorg internal/atspi | in-progress | go test -race ./internal/platform/xorg ./internal/atspi ./internal/app -count=1; CTHULHU_FOREGROUND_PID=1 python3 tests/native_atspi.py | Private XRes lookup and fallback; real proxy with matching and different synthetic instance metadata; GTK Qt and Brave ownership checks | Actual Flatpak Steam speech pending | Physical Braille pending; original report also has helper geometry errors | docs/testing/flatpak-foreground.md; preserves active state geometry and sibling ownership checks; no application name exception | ||
| 69 | present-window-title | Orca src/orca/where_am_i_presenter.py;src/orca/where_am_i_presenter_command_definitions.py | command | Read the foreground window title with Cthulhu+Numpad Enter on desktop or Cthulhu+Slash on laptop | internal/input internal/app internal/platform/xorg | implemented | go test ./internal/input ./internal/app ./internal/platform/xorg -count=1; focused title command race checks; python3 tests/check_speech.py | Private Xvfb command dispatch verifies both layout bindings and both release orders. Private X11 and AT-SPI event loop repeats the current title with automatic changes disabled. | Maintainer confirms date/time; spoken version; window-title; and clipboard-reading commands pass live testing on 2026-10-22. See docs/testing/release-acceptance.md. | Braille flash queue assertion passed; physical display acceptance pending. | Reuses copied foreground title metadata and the owned accessible title. Explicit requests bypass automatic-title policy and duplicate suppression without moving focus. Stale native epochs and unrelated native windows cannot supply a title. Lock and terminal handoff remain enforced. Double-press status-bar reading is outside this change. See tests/window_titles.md. | ||
| 70 | edit-field-relation-labels | src/cthulhu/generator.py:_generateLabel;src/cthulhu/script_utilities.py:displayedLabel | speech | Announce relation-only labels for unnamed edit fields | internal/atspi internal/presentation | implemented | CTHULHU_NATIVE_EDIT_LABELS=1 python3 tests/native_atspi.py; go test ./... -count=1; go vet ./... | Private GTK/Xvfb verifies single and multiple labels plus existing names and password exclusion. Read-only live irctest capture verifies all three settings labels. Maintainer confirmed installed-reader label speech on physical Xorg on 2026-10-20. | Formatted speech includes each label. Maintainer confirmed the installed reader speaks irctest settings field labels on 2026-10-20. | Physical Braille check pending. | Direct LABELLED_BY targets supply an empty text or entry or password-field name. Queries and output are bounded; explicit names are preserved. Human diff review remains required before submission. | ||
| 71 | mozilla-hypertext-reading | src/cthulhu/scripts/web/script.py;src/cthulhu/scripts/web/script_utilities.py | web | Read native heading and link text plus parent text around embedded children without Tab caret echoes interrupting link labels | internal/atspi internal/review internal/app | implemented | go test ./... -count=1; go test -race ./internal/review ./internal/atspi ./internal/app -count=1; python3 tests/native_firefox.py; CTHULHU_NATIVE_BROWSER_TESTS=fragments,document,selection,namedlinks python3 tests/native_browser.py | Merge review on 2026-10-20: four parent-text regressions fail against testing before the merge and pass after resolution. Private Firefox baseline and Chromium fragments document selection named-link and editing checks pass. | Maintainer confirms extensive live browser testing passes in Firefox and Chromium-based browsers on 2026-10-22; element lists and jumping to selected items are explicitly confirmed. See docs/testing/release-acceptance.md. The original Thunderbird regression message was not separately identified. | Repeated parent-fragment cursor and native routing offsets tested; physical Braille pending. | Hypertext traversal retains parent offsets around single-character embedded children; named-link labels retain virtual character and word offsets. Password subtrees remain excluded. Read and Tab through an HTML email; reverse direction; verify Firefox and Chromium links selection and address-bar editing before submission. Human diff review and original-message live acceptance remain required. | ||
| 72 | speech-interruption-preferences | src/cthulhu/input_event.py | input | Choose all keys, common stop keys, or recorded individual interruption keys in Speech preferences | internal/input internal/config internal/preferences internal/app | implemented | go test ./internal/input ./internal/config ./internal/preferences ./internal/app -run 'Interruption|Interrupt' -count=1 | Private GTK/Xvfb test verifies mode selection, focus traversal, special/modifier/Page Up/multimedia recording, finish/cancel, Apply and draft reload. | Physical compositor acceptance pending. | Maintainer confirms speech preferences; previews; Apply and Cancel; saved settings; and interruption-key settings work in live testing on 2026-10-22. See docs/testing/release-acceptance.md. | Physical display acceptance pending. | All keys remains default. Reader commands retain explicit interruption; unselected keys preserve queued speech and Say All. Control+Enter finishes and Control+Escape cancels without recording the finishing modifier. Settings persist per profile. | |
| 73 | pidgin-message-history | src/cthulhu/chat.py;src/cthulhu/scripts/apps/pidgin/chat.py;src/cthulhu/scripts/apps/pidgin/script.py | messaging | Announce verified Pidgin transcript insertions and review or copy nine recent messages | Storm Dragon | internal/messaging internal/atspi internal/app internal/input | implemented | go test ./...; go test -race ./internal/messaging ./internal/input ./internal/atspi ./internal/app; see docs/testing/messaging.md for private native checks | Private GTK transcript and X11 command checks pass; actual Pidgin and physical shortcuts pending. | Recorded presentation tested; actual Pidgin listening pending. | Single flash recorded; physical Braille pending. | Legacy defaults only: combined per-provider history, all conversations, no room prefix or typing announcements. Legacy chat preference controls remain unported. Cthulhu+H is the sole default learn-mode chord; F1-F9 review and Shift+F1-F9 copy. Existing explicit assignments and modal OCR F5 refresh take precedence. Steam notification history remains separate. See docs/testing/messaging.md. | |
| 74 | atspi-announcements | Orca src/orca/script.py;src/orca/scripts/default.py;src/orca/event_manager.py | focus | Present object:announcement payloads from any provider, politely or assertively, without requiring focus or foreground ownership | internal/atspi internal/app | implemented | go test ./internal/atspi ./internal/app -run Announcement -count=1; native GTK4 fixture delivers polite detail1=1 and assertive detail1=2 payloads through the adapter; live Niri 26.04 event capture recorded the workspace-switch announcement shape | Native fixture runs on private Xvfb; Xorg reader behavior otherwise unchanged | Live Niri 26.04 capture on 2026-10-31: workspace switch emits accessible-name then object:announcement with the workspace label about 10ms before window activation. Maintainer confirms workspace switching, AltTab announcements and the exit dialog read out with the built reader on Niri on 2026-10-31. | Maintainer live listening on Niri passed for workspace switching, AltTab and the exit dialog on 2026-10-31. | Braille flash follows the system-role output queue; physical display acceptance pending. | Announcements bypass background-event filtering and foreground epochs because the provider explicitly requests speech and may never own focus (a compositor's own accessible tree under Niri via AccessKit). Screen-lock and secure-input gates still apply. Trimmed repeats from one provider inside 300ms are deduped; Niri alternates live-node identities and may append a space to force re-emission. There is no Orca workspace-specific behavior to mirror: Orca only presents the generic announcement. See docs/testing/announcements.md. |