Document Wine/Proton stage contract and phase ledger

Settled decisions, scope and done checklist in wine-proton.md; execution ledger with batch amendments, the satisfied Phase 0 gate and the accepted Phase 1 handoff in wine-proton-phases.md.
This commit is contained in:
hjozwiak committed 2026-11-01 23:28:24 -05:00
1 parent 71093286c7
commit a60a251472
2 files changed
+661

No files matched your search

+412
View File
@@ -0,0 +1,412 @@
# Wine/Proton phase handoffs
Status: Draft execution ledger. This document is operational, not
normative. The settled decisions, scope boundary, and done checklist
live in [wine-proton.md](wine-proton.md); if this handoff document and
that contract ever disagree, the contract wins and this document must
be corrected.
Creating a branch or a session does not activate a phase. A phase
starts only when the maintainer explicitly activates it in that
phase's session.
## Branch and session model
- Keep each repository's `hunter` branch as the public integration
branch. Do implementation work only on the active phase branch.
- Merge a phase into `hunter` only after its tests and human review
pass and the maintainer says that step may land. Do not merge phase
branches directly into `testing`; `testing` receives the work only
through the maintainer's chosen later integration from `hunter`.
- Create one fresh Muse Code session per phase, just in time. Do not
fork phase sessions from the long planning session; a fork inherits
its history, while a fresh session can be briefed from the contract
and the relevant phase entry below.
- A lean coordinator session may track status and review handoffs,
but it should not be a second writer. Name live sessions stably,
for example `wine-master-<unique-suffix>` and
`wine-<phase>-<unique-suffix>`, so they can be found again.
- A Muse session does not own a Git branch or checkout. If two
writing sessions are live at once, each needs its own worktree. If
work is strictly serial in one checkout, the active session must
verify the repository, branch, and working-tree state before it
edits anything.
- Local graph and patch artifacts are not phase deliverables. Leave
untracked `graphify-out/`, format-patch files, and other local
material untouched and unstaged unless the maintainer opens a
separate hygiene task for them.
## Maintainer amendments for this batch (2026-11-01, master session)
These rulings override conflicting text below and conflicting
repository synchronization procedure for this batch of work only.
Subordinate (phase) sessions must honor them:
- Cross-repository work is permitted. A phase session may touch both
Cthulhu and wine-access as its scope requires; the two repositories
are not gated apart for this batch.
- Serial work in the single existing checkout of each repository is
the approved model, for coherent interactive validation and
testing. Separate worktrees are not required. The active session
must still verify repository, branch, and working-tree state
before editing.
- Synchronization is waived for this batch. Do not run
`git pull --ff-only`, `git fetch`, or merges of `origin/testing`
or `hunter`, and do not "refresh" a placeholder branch, whether
repository guidelines (`AGENTS.md`, `CONTRIBUTING.md`) or this
ledger's phase entries say to. Those instructions are to be
disregarded by subordinate sessions for this batch. Start from
the recorded branch tips; if a branch lacks a named prerequisite
commit, stop and report to the master session instead of fixing
it by merging.
- Pre-Phase-0 work is stacked under the Phase 0 commits: both
repositories' phase branches sit on their then-current `hunter`
tips, and later sessions pick that base up from the branch tips.
At the maintainer's direction the master session fast-forward
merged wine-access `wine/native-hook-exclusions` (`78b70e1`) into
`hunter` and stacked `wine/ready-and-spawn-evidence` on it. No
push was made. Cthulhu needed no merge: `hunter` and every
placeholder already share `6ed0e36`.
- The master/coordinator session may update this ledger once a
phase handoff report is accepted.
## Known branch state when this ledger was created
Recorded on 2026-11-01. Re-verify every value when a phase is
activated; this section is a snapshot, not a substitute for Git.
### Cthulhu
- `hunter`: `6ed0e36`, seven commits ahead of `origin/hunter` and
then equal to `origin/testing`.
- Placeholder branches, all also at `6ed0e36` when created:
`wine/ready-and-spawn-evidence`, `wine/live-settings`,
`wine/preferences-tab`, and `wine/verification`.
- The contract was an untracked working-tree file when the branches
were created, so it followed checkouts in this working tree rather
than belonging to any one branch's history.
### Wine-access
- `hunter`: `0db42de`, equal to `origin/hunter` when checked.
- `wine/native-hook-exclusions`: `78b70e1`
("Add native per-program hook exclusions"), committed locally and
not yet landed on `hunter`.
- `wine/ready-and-spawn-evidence`: `0db42de`; it does not yet contain
`78b70e1`.
Superseded for wine-access by the Phase 0 merges recorded in the
maintainer amendments above: `hunter`,
`wine/native-hook-exclusions`, and `wine/ready-and-spawn-evidence`
all stand at `78b70e1`, not pushed.
## Phase activation checklist
At the start of every phase session:
1. Read the repository guidelines for each repository the phase will
touch, then read the contract decisions named in the phase entry.
2. Inspect `git status --short --branch` in each touched repository.
Preserve unrelated changes and untracked files; never make the
tree look clean by discarding, stashing, or hiding them.
3. Confirm the checked-out branch is exactly the branch named for
the phase. Stop if it is `hunter`, another phase branch, or a
different worktree than the session was briefed for.
4. Confirm the phase's base includes every prerequisite commit named
below. Per the maintainer amendments above, synchronization is
waived for this batch: do not pull, fetch, refresh, recreate, or
merge other branches to repair a stale base. If a prerequisite
commit is missing, stop and report to the master session.
5. Record the starting commit of each touched repository in the
phase's handoff notes before editing.
6. Work only inside the phase scope. Do not commit, merge, push, or
announce readiness to another maintainer unless the maintainer
explicitly asks for that exact act in that session.
## Phase index
| Phase | Purpose | Cthulhu branch | Wine-access branch | Status |
|---|---|---|---|---|
| 0 | Native exclusion foundation | none | `wine/native-hook-exclusions` | Fast-forward merged into wine-access `hunter`; not pushed |
| 1 | Ready record, spawn evidence, mixed-prefix spawn semantics | `wine/ready-and-spawn-evidence` | `wine/ready-and-spawn-evidence` | Accepted and merged into `hunter` in both repositories; not pushed |
| 2 | Live Wine settings | `wine/live-settings` | none | Not started |
| 3 | Wine preferences tab | `wine/preferences-tab` | none | Not started |
| 4 | Live verification and final results | `wine/verification` | Defect branch only for a proven helper cause | Not started |
## Phase 0: native hook-exclusions foundation
Status: committed locally on `wine/native-hook-exclusions` as
`78b70e1`. On 2026-11-01, at the maintainer's direction, the master
session fast-forward merged it into wine-access `hunter` and
fast-forward stacked `wine/ready-and-spawn-evidence` on the same
commit. Not pushed.
Contents: the helper parses repeated `--exclude-hook-program`
arguments, withholds foreground native hooks from listed processes,
suppresses dialog reading for their windows, forwards the list to
the 32-bit hook host, and the then-current Orca extension emits the
flags. Native and manager regression tests and user documentation
were included.
Gate into Phase 1: satisfied. `78b70e1` is now the tip of
wine-access `hunter`, `wine/native-hook-exclusions`, and
`wine/ready-and-spawn-evidence`, so the Phase 1 wine-access base
contains it. Do not begin Phase 1 wine-access work from a base that
lacks this commit; if a checkout shows otherwise, stop and report
to the master session (do not merge to repair it; synchronization
is waived for this batch).
## Phase 1: ready record, spawn evidence, mixed-prefix semantics
Status: not started. Contract decisions: 2, 5, 16, 17, 18, 24.
Branches: `wine/ready-and-spawn-evidence` in both repositories,
after the Phase 0 gate above and after the Cthulhu branch has been
refreshed from the then-current `hunter`.
In scope:
- Wine-access helper only: add the `hook_exclusions` count to the
ready record, with targeted helper coverage. No Orca manager work.
- Cthulhu: recognize the plain exclusion-count startup line as info,
keep the invalid-exclusion line a warning, parse the ready count,
and include the mirrored `programs=[...] extra=[...]` text in the
helper-start record.
- Cthulhu: stop passing prefix-wide `--no-dialog-reader` merely
because a listed program is present. Other programs in the prefix
retain dialog reading while the listed program is gated natively.
- Cthulhu: retain wholesale mode only for the global
controller-only switch, the environment override, and a helper
whose ready record does not confirm the exclusions sent. Remember
an unconfirmed binary so later spawns do not double-start.
- Cthulhu: when a newly listed, currently discovered program lacks
its flag in the running helper, restart that helper once in the
same mode to deliver the flag. Never downgrade a running helper
when a listing is removed or the global switch is cleared.
Out of scope: live-settings plumbing beyond what spawn decisions
already read, the preferences tab, any new D-Bus protocol surface,
and any Orca change or Orca acceptance gate.
Required evidence before handoff:
- Focused Cthulhu tests for diagnostics, spawn arguments, and the
mixed-prefix transition: launcher only, listed game appears,
ordinary program remains readable by construction of the launch
arguments and mode, listed game disappears without a downgrade.
- The wine-access helper build and CTest suite.
- Test suites for every other Cthulhu package actually touched.
- A maintainer-run live smoke check is useful here, but the stage's
formal live acceptance remains Phase 4.
Stop boundary: report the diff and evidence. Do not proceed into
live settings or preferences work in the same session.
### Accepted handoff (2026-11-01)
- Session: `wine-1-corpsegrinder` (`fir-aphelion`,
01a19a46-8ac2-7e80-b847-5a8574f85dd9); coordinated from the master
session (`still-enceladus`).
- Starting commits: Cthulhu `6ed0e36`; wine-access `78b70e1`.
- Committed after maintainer acceptance: Cthulhu `7109328`
("Add Wine ready-record and mixed-prefix spawn semantics") on
`wine/ready-and-spawn-evidence`, 5 files under `internal/wine`,
+459/-55; wine-access `20d2169` ("Report hook exclusion count in
ready record") on `wine/ready-and-spawn-evidence`, 3 files,
+32/-1. This ledger and the contract ride a separate docs commit
on the Cthulhu phase branch. Both phase branches were then merged
into `hunter` in their repository at the maintainer's direction.
Not pushed.
- Automated evidence (phase session; `internal/wine` suite
independently re-run green by the master session): race-enabled
`go test ./internal/wine/` including mixed-prefix,
unconfirmed-helper, diagnostics, and start-record tests;
`go build ./...`, `go vet ./internal/wine/`, gofmt clean;
`go test ./internal/config/`; wine-access build and CTest 7/7.
One `internal/app` failure (`TestEchoSpeakerSwitchesBothVoicesTransactionally`)
was reproduced on clean HEAD under the sandbox (unix socket listen
not permitted) and is recorded as pre-existing environmental, not
a Phase 1 regression.
- Live evidence, by kind: installed-binary — maintainer-rebuilt
Cthulhu from the phase tree. Audible speech — maintainer smoke
check, 2026-11-01: with Diablo IV running under Proton (app
2344520) and excluded, `protontricks-launch --appid 2344520
notepad` spoke in the same prefix, and Diablo IV remained running
(interval not timed; formal normal-session and per-application
acceptance remain Phase 4). A first attempt the same evening was
invalid: it ran a stale pre-Phase-1 reader binary, whose helper
correctly showed the old wholesale `--no-dialog-reader` behavior.
Physical input beyond launching, and Braille-display evidence:
none this phase.
- Not exercised: full live regression corpus, Braille regression,
preferences round trip (all Phase 4); full `go test ./...`.
- Known limitation carried to Phase 2: decision 17's restart is
implemented and tested, but the governing list is still the
manager's startup snapshot until live settings land.
- Ready for maintainer review: yes. Accepted by the maintainer on
2026-11-01 ("sufficiently satisfied"), who directed the commits
above and their merge into `hunter` in each repository.
## Phase 2: live Wine settings
Status: not started. Contract decisions: 3, 4, 16, 17, 19.
Branch: `wine/live-settings` in Cthulhu only, refreshed from
`hunter` after Phase 1 has landed there.
In scope:
- Replace the Wine manager's startup snapshot with the reader's live
settings, read at poll and spawn, so Apply and equivalent reload
paths need no reader restart.
- Read the active/global profile's Wine values only. Per-application
profile switching must never change which Wine list governs a
prefix.
- Preserve decision 17's "at the moment it matters" restart for a
newly listed running program, and the absolute no-downgrade rule
for removals.
- Exercise the behavior through TOML/settings application before the
preferences tab exists.
Out of scope: any preferences UI, any Orca work, and any helper
protocol change.
Required evidence: focused tests proving that additions take effect
without a reader restart, removals do not downgrade a running
helper, and moving focus between applications with different
profiles cannot change the governing Wine list.
Stop boundary: report the diff and evidence. Do not begin the
preferences tab in the same session.
## Phase 3: Wine preferences tab
Status: not started. Contract decisions: 6, 9, 13, 19.
Branch: `wine/preferences-tab` in Cthulhu only, refreshed from
`hunter` after Phase 2 has landed there.
In scope:
- A global-preferences Wine tab modeled on the Pronunciation page: a
controller-only checkbox and an editable program list with New
and Delete.
- Entries are typed only. No running-program picker and no file
browser.
- Validate each entry as edited; name the offending entry and block
Apply for paths, blanks, and overlong names. Collapse
case-insensitive duplicates. Never silently drop an invalid entry.
- Preserve the repository's preferences accessibility rules,
including focus traversal, popup behavior where applicable, and
settings round-tripping through persistence and the runtime.
Out of scope: per-application Wine editing, any helper or manager
behavior change, and any Orca work.
Required evidence: automated preferences/persistence coverage and a
keyboard-only round trip in Phase 4—Tab and Shift+Tab through the
tab, edit the list, Apply, and confirm a newly started helper uses
the result with no reader restart.
Stop boundary: report the diff and evidence. Do not begin the live
regression in the same session.
## Phase 4: live verification and final results
Status: not started. Contract decisions: 7, 8, 10, 11, 12, 14, 15,
24.
Branch: `wine/verification` in Cthulhu, refreshed from `hunter`
after Phase 3 has landed there. Open a narrow wine-access defect
branch only if the regression proves a root cause there; do not
create one speculatively.
Fixed live corpus:
- Diablo IV: excluded, anti-tamper path; controller speech by ear
and a normal-length session.
- Mistworld: controller-endpoint sensitivity; no avoidable helper
restart while it is running.
- Wine Notepad: menus and plain edits, including the mixed-prefix
case while an excluded program is present and unaffected.
- Notepad++: Scintilla edits.
- Battle.net bootstrapper: the UIA path.
Also required:
- The full physical-Braille Wine regression—review cursor, window
titles, menus, and edits across the corpus—passing clean. Every
failure blocks, whenever it was introduced, and is fixed wherever
its root cause lies. There is no baseline carve-out and no escape
hatch.
- The keyboard-only preferences round trip from Phase 3.
- Per-application results written into the contract document, not
left only in a session transcript or terminal scrollback.
- Separate reporting of automated, installed-binary,
physical-input, audible-speech, and Braille-display evidence. A
log line never substitutes for the maintainer hearing or reading
the result.
If a corpus application becomes unusable for reasons unrelated to
the reader, stop and have the maintainer choose and record its
replacement. Never silently shrink the corpus.
Stop boundary: the stage is done only when every item in the
contract's done checklist passes. Marking the contract Final is a
separate maintainer act after those results are recorded.
## Fresh-session startup template
Adapt the phase number, branches, and decision list. Keep the rest
verbatim unless the maintainer directs otherwise in that session.
```text
Implement only Phase <N> from
docs/testing/wine-proton-phases.md.
Before editing, read the repository guidelines for every repository
you will touch and the named decisions in
docs/testing/wine-proton.md. Verify the current directory,
repository, branch, starting commit, and working-tree state. Stop
and report if the checkout is not on the exact phase branch, if the
branch lacks a named prerequisite commit, or if unrelated changes
would be overwritten. Synchronization is waived for this batch:
do not run git pull or git fetch, and do not merge origin/testing,
hunter, or any other branch, even if repository guidelines say to.
Work only within this phase's scope. Run the evidence named for the
phase. Stop at its boundary and report the diff, tests, blockers,
and anything not exercised. Do not commit, merge, push, switch to
another phase, or announce readiness unless I explicitly tell you
to in this session.
```
If the phase session runs in a separate worktree where this file is
absent, paste the relevant phase entry into its startup prompt or
point it at the copy in the coordinator's checkout. Do not assume
an untracked document followed it there.
## Handoff report template
Each phase session ends by filling this in, in chat and, once the
maintainer accepts the report, in the phase entry above:
```text
Phase:
Session name:
Repositories and branches:
Starting commits:
Ending commits or diff state:
Files changed:
Behavior changed:
Tests and checks run, with results:
Live evidence, reported separately by kind:
Not exercised, and why:
Blockers or surprises:
Ready for maintainer review: yes/no
Merged into hunter: no, unless explicitly directed otherwise
```
Update statuses only from observed evidence. "Implemented,"
"committed locally," "merged into hunter," "pushed," and "landed in
testing" are different states; never use one to imply another.
+249
View File
@@ -0,0 +1,249 @@
# Steam/Proton and controller-only verification
Status: Draft. Settled decisions from the 2026-11-01 grilling session are
recorded here as they land; unresolved questions stay visibly marked.
Per decision 15, contract acceptance settles the decisions but keeps
this document Draft; it becomes Final only when the done checklist
passes and the per-application results are written in.
Execution is split into separately reviewed phases: Phase 0, the
already-committed native-exclusion foundation; Phase 1, ready
record, spawn evidence, and mixed-prefix semantics; Phase 2, live
Wine settings; Phase 3, the Wine preferences tab; and Phase 4, live
verification and final results. Branch assignments, activation
rules, fresh-session startup text, and handoff reporting live in
[wine-proton-phases.md](wine-proton-phases.md). That ledger is
operational only; this contract remains normative if they differ.
## Established facts (verified live, 2026-11-01)
- Cthulhu sends one `--exclude-hook-program <name>` argument per entry in
the profile's `wine.excluded-hook-programs` setting, plus
`--no-dialog-reader` when a listed program (or the global
`wine.controller-only` setting) makes the prefix controller-only.
- The wine-access helper enforces exclusions itself: a listed program's
thread never receives the native menu/input hooks, and its windows get
no dialog reading, from the helper's first foreground poll. Controller
speech and review remain available.
- Diablo IV under Proton Hotfix (Steam app 2344520), with
`excluded-hook-programs = ['Diablo IV.exe']`: the running helper showed
`--exclude-hook-program diablo iv.exe --no-dialog-reader`, staged under
`~/.local/state/cthulhu/wine-access/helper/<content hash>/` for the
pressure-vessel session, and the game stayed up past the roughly
100-second window in which full-mode sessions had crashed on
2026-10-31.
- Two failure modes were proven the same evening: a missing TOML section
silently means full mode, and a stale helper that owns the Wine
session singleton defeats any newly launched helper regardless of
settings.
## Settled decisions
1. Scope of the next stage (2026-11-01): the manager trio (diagnostics
classification, spawn decision logging, live settings reload), a Wine
section in preferences, and this document. Nothing outside that set
is approved by this decision. (Widened once, by decision 5, to
include the ready-record field in the wine-access helper.)
2. Spawn logging mirrors Orca's text format: the helper-start record
carries `programs=[...] extra=[...]` with sorted program names and
the exact extra helper arguments, so both readers' logs read
identically and can be compared line for line.
3. Wine settings take effect as soon as preferences are finished (Apply),
with no reader restart. The manager reads the same live settings the
rest of the reader uses, at each poll and helper spawn, instead of
the one-time snapshot it takes at startup today.
4. A running helper keeps its current mode until its game exits. The
only mid-session change is the existing safety upgrade: if an edit
newly protects a running game, its helper restarts into the
protected mode. Removing a program or clearing the global switch
never downgrades a running helper. Rationale: helper restarts tear
down and recreate the NVDA controller endpoint, and some programs
(Mistworld is the known example) crash when that endpoint is pulled
out from under them. Restarts therefore happen only when protection
is being added, never as a side effect of unrelated edits. (For
the listed-program path, this restart is superseded by decision
16; the no-downgrade rule stands.)
5. The helper's ready record gains a `hook_exclusions` count beside
`controls_enabled` and friends, and Cthulhu parses and logs it as a
field of the initialized record. The plain startup line stays (it is
emitted even when a helper exits early, for example against the
singleton), and Cthulhu recognizes it as info; the
invalid-exclusion line stays a warning. Older helpers without the
field report zero, which is accurate for them. This extends the
stage into the wine-access helper by explicit choice.
6. Preferences gain a Wine tab modeled on the Pronunciation page: a
"Controller-only mode for all Wine applications" checkbox and an
editable program list (tree view with New and Delete), with text
explaining that listed programs keep controller speech but lose
standard control reading. Entries are validated by the existing
settings rules at Apply.
7. Done includes physical Braille acceptance. The display is usable
again (paired over Bluetooth, so the missing charger no longer
blocks it), and the stage is not done until Wine output is checked
on the physical display alongside the speech checks.
8. The stage lands in reviewable steps, evidence first: diagnostics
and spawn logging, then live settings exercised through the TOML,
then the Wine preferences tab, then this document and the live
acceptance pass. The reader stays usable at every step, and no
intermediate step counts the stage as done.
9. The Wine tab validates entries as they are edited: a path, a blank,
or an overlong name is flagged by name in the tab and blocks Apply
until fixed or deleted. Case-insensitive duplicates collapse to a
single entry. Config validation remains the backstop; invalid
entries are never silently dropped, since a user who believes a
game is protected when nothing was saved for it is tonight's
failure repeated.
10. The Braille bar is a full Wine regression on the physical display:
review cursor, window titles, menus, and edits across several
applications, not a spot check of focus output alone. This widens
decision 7's "done" by explicit choice.
11. Every failure that regression finds blocks done, whenever the
defect was born. There is no baseline carve-out for pre-existing
failures: the stage ends with the full Wine Braille regression
passing clean, at whatever size that makes the stage.
12. No escape hatch. If a blocking Braille failure needs a redesign,
or its root cause sits in shared infrastructure rather than
Wine-specific code, it is still built inside this stage. The
stage's true size is accepted as unknown until the regression
passes clean.
13. Program names enter the Wine tab by typing only, as under Orca.
There is no running-program picker and no file browser in this
stage; a well-formed but wrong name remains possible, with the
mirrored spawn log as the after-the-fact evidence.
14. The live regression corpus is fixed by name: Diablo IV (excluded,
anti-tamper), Mistworld (controller-endpoint sensitivity), Wine
Notepad (menus and plain edits), Notepad++ (Scintilla edits), and
the Battle.net bootstrapper (UIA path). Results are recorded per
application in this document. If an application becomes unusable
for reasons unrelated to the reader, its replacement is decided
and recorded here, never silently dropped.
15. This document stays Draft through implementation and acceptance
testing. Contract acceptance settles the decisions above; the
document becomes Final only when the done checklist passes and
the per-application results are written in.
16. Exclusion is per program, enforced by the helper natively. A
listed program's presence in a prefix no longer flips the whole
helper to `--no-dialog-reader`: other programs in the same prefix
keep full hook and dialog reading while the listed one gets the
controller only. For avoidance of doubt, `--no-dialog-reader`
itself remains helper-wide for the whole prefix; a listed name
by itself must never cause Cthulhu to pass it. The global
controller-only switch still runs the whole helper with
`--no-dialog-reader`, and that wholesale mode is also the
fallback when a helper's ready record does not confirm it applied
the exclusions it was sent (for example an old helper that
ignores the flags). This supersedes the
upgrade-on-listed-appearance restart in decision 4 for the listed
path, and both readers change together; the wine-access side of
this stage therefore includes the Orca manager's spawn semantics,
not only the ready-record field.
17. A list addition reaches a running helper at the moment it
matters: if the newly listed program is discovered in a prefix
whose running helper lacks its flag, that helper restarts once in
the same mode, now carrying the flag. Additions for programs that
are not running wait for the next natural spawn. Restarts thus
happen only to add presently-needed protection, never for
prospective edits or housekeeping.
18. Both managers consume the helper's ready record at startup. If
its `hook_exclusions` count does not match the flags sent, that
helper restarts once in wholesale `--no-dialog-reader` mode, and
the manager remembers that binary as unconfirmed so later spawns
go wholesale directly. Go wires its existing diagnostics parser
into the manager; Orca reads the spawn's stderr through a bounded
forwarding path instead of only filing it. No new D-Bus protocol
surface is added for this.
19. The Wine exclusion list is global-only. The manager always reads
the active/global profile's Wine values and ignores
per-application profile switching for Wine. The Wine tab appears
only in global preferences. One list therefore governs every
prefix regardless of which application currently has focus.
20. Cthulhu and Orca keep independent Wine exclusion lists. There is
no one-time import and no live shared canonical list in this
stage. Each reader's list is maintained in its own settings
system. The maintainer plans to transition to Cthulhu full-time
relatively soon, so Cthulhu is the primary path going forward.
21. Orca is frozen as-is for this stage. The maintainer does not
intend to use Orca anymore after today, and Cthulhu is the sole
normative reader for the remaining Wine work. This supersedes
the parts of decisions 5, 16, and 18 that required both readers
to move together: no Orca manager per-program spawn semantics,
bounded Orca stderr reader, Orca test gate, or Orca relaunch
acceptance is required here. Existing Orca support stays as it
is; anyone who wants to carry it forward can do so later. The
wine-access helper ready-record field remains in scope because
Cthulhu consumes it.
22. Decision 21 is a stage-and-maintainer scope decision, not a
project-wide deprecation of Orca. This maintainer is not the
repository's sole maintainer, and the decision records only that
he will not use or carry the Orca path in this stage. It does not
preclude other maintainers from using, maintaining, or improving
Orca support.
23. No wine-access maintenance-status notice will be added for this
stage. The work is overwhelmingly Cthulhu-based; apart from any
root-cause Braille fix the regression may prove necessary, the
only planned wine-access code change is the helper ready-record
field that Cthulhu consumes. Decisions 21 and 22 do not change
Orca's project status, functionality, or availability to other
maintainers, so there is no work-relevant maintenance-status
change for wine-access documentation to announce.
24. Mixed-prefix operation remains mandatory. It is not merely a
Diablo hypothetical: the maintainer has real mixed-prefix uses,
and ordinary programs in a prefix must retain hooks and dialog
reading while a listed program in that same prefix receives only
controller support. The current silence from Wine Notepad while
Diablo IV is alive is therefore a defect against decision 16,
caused by Cthulhu adding the prefix-wide `--no-dialog-reader`
once the listed program is discovered. Removing that listed-
presence trigger is required; wholesale mode remains available
only for the global switch/environment override and the
unconfirmed-helper fallback in decision 18.
25. The scope contract below is accepted for now as the settled
stage boundary. On 2026-11-01, in this Muse Code session, the
maintainer said: "For now, I am satisfied." Per decision 15,
that acceptance does not finalize this document or authorize
implementation; it remains Draft until the done checklist passes
and the per-application results are written in.
## Unresolved questions
(none)
## Scope contract (accepted; document remains Draft)
Boundary. In Cthulhu: `internal/wine`, the Wine settings wiring in
`internal/app` and `internal/config`, a Wine page in
`internal/preferences` including `preferences.ui`, and this document.
In wine-access: the ready-record field in the helper only. For
this stage and this maintainer's work, the Orca integration is
frozen as-is under decisions 21 and 22; that is not a project-wide
Orca deprecation. No Orca manager changes, Orca test gate, or Orca
relaunch acceptance belongs to this stage. Fixes for blocking
Braille regression failures (decisions 11 and 12) may land wherever
their root cause lies, including shared Braille infrastructure. Out
of scope: staged-helper hardening parity for the Orca manager,
stale-helper retirement redesign, the `explorer.exe` classification
divergence, Nix helper candidates on the Go side, and landing either
repo's branches anywhere (commits and merges stay the maintainer's
separate acts).
Done means, all of:
- Cthulhu test suites pass for the touched packages, and the
wine-access helper CTest suite passes. Orca tests are not a gate.
- Diablo IV under Cthulhu: controller speech confirmed by ear, game
survives a normal session, and the start log shows the mirrored
`programs=[...] extra=[...]` record plus the exclusion count.
- An ordinary Wine application still reads standard controls in the
same setup, including inside an excluded game's own prefix while
the game is present and unaffected.
- Full Wine Braille regression on the physical display: review
cursor, window titles, menus, and edits across several
applications, passing clean with no unresolved failures regardless
of when a defect was introduced.
- Preferences round trip by keyboard: Tab and Shift+Tab through the
Wine tab, edit the list, Apply, and confirm a newly started helper
picks the change up with no reader restart.
Nothing outside this checklist is a completion dependency. Accepting
this contract does not authorize implementation; that takes a separate
explicit request.