diff --git a/docs/workstation/mac-on-linux-acceptance.md b/docs/workstation/mac-on-linux-acceptance.md index 43cba59..fb956e8 100644 --- a/docs/workstation/mac-on-linux-acceptance.md +++ b/docs/workstation/mac-on-linux-acceptance.md @@ -1,46 +1,166 @@ -# Mac-on-Linux Acceptance Matrix - -This matrix records the current SourceOS workstation-v0 Mac-on-Linux scope. It is an acceptance aid for reviewers and agents, not a claim of full macOS parity. - -Status values: - -- `implemented`: concrete helper/config/package surface exists. -- `validation-backed`: concrete surface exists and has a helper, workflow, or smoke validation path. -- `planned`: desired future behavior, not active yet. -- `non-goal`: intentionally out of scope for workstation-v0. - -| Feature | Status | Current evidence | Notes | -|---|---|---|---| -| SourceOS palette on `Super+Space` | implemented | `profiles/linux-dev/workstation-v0/gnome/palette-hotkey.sh`; `profiles/linux-dev/workstation-v0/bin/sourceos` | Launcher remains an action bus, not a duplicate file index. | -| Files shortcut on `Super+E` | implemented | `profiles/linux-dev/workstation-v0/gnome/mac-defaults.sh` | Opens Nautilus. | -| Terminal shortcut on `Super+Return` | implemented | `profiles/linux-dev/workstation-v0/gnome/mac-defaults.sh` | Uses GNOME Terminal. | -| Screenshot full screen / area / UI / folder bindings | validation-backed | `profiles/linux-dev/workstation-v0/bin/mac-screenshot.sh`; `profiles/linux-dev/workstation-v0/gnome/mac-defaults.sh`; `.github/workflows/workstation-mac-polish.yml` | Uses `Super+Shift+3`, `Super+Shift+4`, `Super+Shift+5`, `Super+Shift+6`. | -| Quick Look-style preview | implemented | `profiles/linux-dev/workstation-v0/manifest.yaml`; `profiles/linux-dev/workstation-v0/install.sh` | Uses Fedora/GNOME `sushi`; no custom previewer. | -| Finder-like sidebar bookmarks | validation-backed | `profiles/linux-dev/workstation-v0/gnome/files-sidebar.sh`; `.github/workflows/workstation-mac-polish.yml` | Seeds GTK/Nautilus bookmarks for standard folders. | -| Bounded appearance defaults | implemented | `profiles/linux-dev/workstation-v0/gnome/appearance-apply.sh` | Uses stable GNOME settings; does not replace GNOME Shell or libadwaita. | -| `input-remapper` primary keyboard backend | validation-backed | `profiles/linux-dev/workstation-v0/gnome/input-install.sh`; `profiles/linux-dev/workstation-v0/bin/check-keyboard-policy.sh`; `.github/workflows/workstation-keyboard-policy.yml` | Default Fedora/GNOME lane. | -| `xremap` compatibility lane | validation-backed | `profiles/linux-dev/workstation-v0/gnome/input-install.sh`; `profiles/linux-dev/workstation-v0/bin/check-keyboard-policy.sh` | Advanced compatibility template, not the default. | -| Kinto compatibility lane | planned | `profiles/linux-dev/workstation-v0/manifest.yaml`; `profiles/linux-dev/workstation-v0/gnome/README.md` | Explicit compatibility path for X11/xkeysnail workflows; not auto-installed by the Wayland-first profile. | -| Touchpad gestures / Fusuma | implemented | `profiles/linux-dev/workstation-v0/gnome/fusuma-install.sh`; `profiles/linux-dev/workstation-v0/gnome/fusuma-apply.sh` | Gesture lane exists; deeper gesture parity remains future work. | -| Lampstand-backed local file search | validation-backed | `profiles/linux-dev/workstation-v0/bin/sourceos-search.sh`; `profiles/linux-dev/workstation-v0/bin/install-lampstand.sh`; `.github/workflows/workstation-lampstand.yml` | Lampstand is the file authority; launcher remains action bus. | -| Aggregate polish validation | validation-backed | `profiles/linux-dev/workstation-v0/bin/check-workstation-polish.sh`; `.github/workflows/workstation-polish-validation.yml` | Aggregates Mac polish and keyboard policy signals. | -| Status warnings for aggregate polish | validation-backed | `profiles/linux-dev/workstation-v0/bin/sourceos`; `.github/workflows/workstation-status-polish.yml` | Adds warnings without changing status JSON shape. | -| Doctor integration for aggregate polish | planned | `SourceOS-Linux/source-os#120` | Issue-first work packet exists; not counted delivered until GitHub artifact exists. | -| Dock / extension validation helper | planned | `SourceOS-Linux/source-os#130` | Issue-first work packet exists; no verified GitHub artifact yet. | -| Shortcut map contract | planned | `SourceOS-Linux/source-os#126` | Issue-first work packet exists; no verified GitHub artifact yet. | -| Operator runbook | planned | `SourceOS-Linux/source-os#132` | Issue-first work packet exists; no verified GitHub artifact yet. | -| Full macOS UI clone | non-goal | This document | Workstation-v0 targets bounded GNOME behavior, not shell replacement or proprietary asset cloning. | -| Proprietary dependency requirement | non-goal | This document | Open, self-hostable, auditable components are preferred. | - -## Acceptance posture - -For workstation-v0, a feature is considered usable when it has both a concrete realization surface and validation evidence. Documentation-only planned items are useful backlog, but not counted as delivered. - -## Validation +# Mac-on-Linux Acceptance Matrix (workstation-v0) + +This matrix tracks the status of every Mac-on-Linux feature in the +`linux-dev/workstation-v0` profile lane. + +## Status key + +| Status | Meaning | +|---|---| +| **implemented** | Code exists, ships in the installer, and is exercised on every apply. | +| **validation-backed** | Implemented and additionally verified by a doctor/CI check or contract test. | +| **planned** | Scoped and known; not yet implemented. | +| **non-goal** | Explicitly out-of-scope for this lane. | + +--- + +## Feature matrix + +### Launcher / palette + +| Feature | Status | Helper / script path | +|---|---|---| +| `Super+Space` → SourceOS palette (`sourceos palette`) | **validation-backed** | [`profiles/linux-dev/workstation-v0/gnome/palette-hotkey.sh`](../../profiles/linux-dev/workstation-v0/gnome/palette-hotkey.sh) | +| Palette backed by fuzzel (primary) with wofi/rofi fallback | **implemented** | [`profiles/linux-dev/workstation-v0/bin/sourceos`](../../profiles/linux-dev/workstation-v0/bin/sourceos) | +| Lampstand search surfaced via palette as action bus | **implemented** | [`profiles/linux-dev/workstation-v0/bin/sourceos-search.sh`](../../profiles/linux-dev/workstation-v0/bin/sourceos-search.sh) | + +### Files / Finder shortcut + +| Feature | Status | Helper / script path | +|---|---|---| +| `Super+E` → Nautilus (`nautilus --new-window`) | **validation-backed** | [`profiles/linux-dev/workstation-v0/gnome/mac-defaults.sh`](../../profiles/linux-dev/workstation-v0/gnome/mac-defaults.sh) — custom1 binding | +| Doctor verifies Files keybinding slot (custom1) | **validation-backed** | [`profiles/linux-dev/workstation-v0/doctor.sh`](../../profiles/linux-dev/workstation-v0/doctor.sh) — `check_mac_defaults` | + +### Terminal shortcut + +| Feature | Status | Helper / script path | +|---|---|---| +| `Super+Return` → `gnome-terminal` | **validation-backed** | [`profiles/linux-dev/workstation-v0/gnome/mac-defaults.sh`](../../profiles/linux-dev/workstation-v0/gnome/mac-defaults.sh) — custom2 binding | +| Doctor verifies Terminal keybinding slot (custom2) | **validation-backed** | [`profiles/linux-dev/workstation-v0/doctor.sh`](../../profiles/linux-dev/workstation-v0/doctor.sh) — `check_mac_defaults` | + +### Screenshots + +| Feature | Status | Helper / script path | +|---|---|---| +| `Super+Shift+3` full-screen screenshot | **implemented** | [`profiles/linux-dev/workstation-v0/gnome/mac-defaults.sh`](../../profiles/linux-dev/workstation-v0/gnome/mac-defaults.sh) — custom3 binding | +| `Super+Shift+4` area screenshot | **implemented** | [`profiles/linux-dev/workstation-v0/gnome/mac-defaults.sh`](../../profiles/linux-dev/workstation-v0/gnome/mac-defaults.sh) — custom4 binding | +| `Super+Shift+5` interactive screenshot UI | **implemented** | [`profiles/linux-dev/workstation-v0/gnome/mac-defaults.sh`](../../profiles/linux-dev/workstation-v0/gnome/mac-defaults.sh) — custom5 binding | +| `Super+Shift+6` open screenshots folder | **implemented** | [`profiles/linux-dev/workstation-v0/gnome/mac-defaults.sh`](../../profiles/linux-dev/workstation-v0/gnome/mac-defaults.sh) — custom6 binding | +| `mac-screenshot.sh` wrapper installed to `~/.local/bin` | **implemented** | [`profiles/linux-dev/workstation-v0/bin/mac-screenshot.sh`](../../profiles/linux-dev/workstation-v0/bin/mac-screenshot.sh) | +| `~/Pictures/Screenshots` output directory created on apply | **implemented** | [`profiles/linux-dev/workstation-v0/gnome/mac-defaults.sh`](../../profiles/linux-dev/workstation-v0/gnome/mac-defaults.sh) | +| `check-mac-polish.sh` validates screenshot helper and keybinding slots | **validation-backed** | [`profiles/linux-dev/workstation-v0/bin/check-mac-polish.sh`](../../profiles/linux-dev/workstation-v0/bin/check-mac-polish.sh) | + +### Quick Look / Sushi + +| Feature | Status | Helper / script path | +|---|---|---| +| Sushi package installed (Fedora: `sushi`) for Quick Look-style preview in Nautilus | **implemented** | [`profiles/linux-dev/workstation-v0/install.sh`](../../profiles/linux-dev/workstation-v0/install.sh) | +| `check-mac-polish.sh` checks `sushi` binary presence | **validation-backed** | [`profiles/linux-dev/workstation-v0/bin/check-mac-polish.sh`](../../profiles/linux-dev/workstation-v0/bin/check-mac-polish.sh) | +| Spacebar-triggered preview (requires upstream GNOME Files integration) | **non-goal** | Spacebar-to-preview is not remappable via GSettings alone without a Nautilus extension. | + +### Sidebar bookmarks + +| Feature | Status | Helper / script path | +|---|---|---| +| GTK/Nautilus bookmarks seeded (Desktop, Documents, Downloads, Pictures, Screenshots, Music, Videos, Public) | **implemented** | [`profiles/linux-dev/workstation-v0/gnome/files-sidebar.sh`](../../profiles/linux-dev/workstation-v0/gnome/files-sidebar.sh) | +| Installer runs `files-sidebar.sh` best-effort | **implemented** | [`profiles/linux-dev/workstation-v0/install.sh`](../../profiles/linux-dev/workstation-v0/install.sh) — `apply_files_sidebar` | + +### Appearance defaults + +| Feature | Status | Helper / script path | +|---|---|---| +| Color-scheme preference (`default`/`prefer-dark`/`prefer-light`) | **implemented** | [`profiles/linux-dev/workstation-v0/gnome/appearance-apply.sh`](../../profiles/linux-dev/workstation-v0/gnome/appearance-apply.sh) | +| Cursor size (24 px), text scaling (1.0), font antialiasing/hinting | **implemented** | [`profiles/linux-dev/workstation-v0/gnome/appearance-apply.sh`](../../profiles/linux-dev/workstation-v0/gnome/appearance-apply.sh) | +| Overlay scrolling enabled | **implemented** | [`profiles/linux-dev/workstation-v0/gnome/appearance-apply.sh`](../../profiles/linux-dev/workstation-v0/gnome/appearance-apply.sh) | +| Primary-selection paste disabled (closer to macOS clipboard model) | **implemented** | [`profiles/linux-dev/workstation-v0/gnome/appearance-apply.sh`](../../profiles/linux-dev/workstation-v0/gnome/appearance-apply.sh) | +| Window controls left (close/minimize/maximize) | **validation-backed** | [`profiles/linux-dev/workstation-v0/gnome/mac-defaults.sh`](../../profiles/linux-dev/workstation-v0/gnome/mac-defaults.sh) — `button-layout`; validated by `doctor.sh` | +| Hot corners off | **validation-backed** | [`profiles/linux-dev/workstation-v0/gnome/mac-defaults.sh`](../../profiles/linux-dev/workstation-v0/gnome/mac-defaults.sh) — `enable-hot-corners false`; validated by `doctor.sh` | +| 12-hour clock | **validation-backed** | [`profiles/linux-dev/workstation-v0/gnome/mac-defaults.sh`](../../profiles/linux-dev/workstation-v0/gnome/mac-defaults.sh) — `clock-format '12h'`; validated by `doctor.sh` | +| Dock favorites seeded (Nautilus, Terminal, Firefox, Settings) | **implemented** | [`profiles/linux-dev/workstation-v0/gnome/mac-defaults.sh`](../../profiles/linux-dev/workstation-v0/gnome/mac-defaults.sh) — `favorite-apps` | +| Proprietary fonts, themes, or icon packs | **non-goal** | Out-of-scope; bounded to stable GNOME interface settings only. | + +### Keyboard / remap policy + +| Feature | Status | Helper / script path | +|---|---|---| +| `input-remapper` as primary Fedora/Wayland/GNOME remap backend | **implemented** | [`profiles/linux-dev/workstation-v0/gnome/input-install.sh`](../../profiles/linux-dev/workstation-v0/gnome/input-install.sh) | +| `xremap` compatibility template written to `$XDG_CONFIG_HOME/sourceos/input/xremap-macos-compat.yml` | **implemented** | [`profiles/linux-dev/workstation-v0/gnome/input-install.sh`](../../profiles/linux-dev/workstation-v0/gnome/input-install.sh) — `write_xremap_template` | +| `check-keyboard-policy.sh` emits key=value status for CI and doctor | **validation-backed** | [`profiles/linux-dev/workstation-v0/bin/check-keyboard-policy.sh`](../../profiles/linux-dev/workstation-v0/bin/check-keyboard-policy.sh) | + +#### xremap compatibility + +| Feature | Status | Helper / script path | +|---|---|---| +| xremap template ships (CapsLock→Esc, modifier swap) | **implemented** | [`profiles/linux-dev/workstation-v0/gnome/input-install.sh`](../../profiles/linux-dev/workstation-v0/gnome/input-install.sh) | +| xremap binary auto-installed | **non-goal** | Not auto-installed; template is written; user opts in explicitly. | + +#### Kinto compatibility + +| Feature | Status | Helper / script path | +|---|---|---| +| Kinto treated as explicit compatibility lane; not auto-installed | **implemented** | [`profiles/linux-dev/workstation-v0/gnome/input-install.sh`](../../profiles/linux-dev/workstation-v0/gnome/input-install.sh) — documented and guarded | +| Kinto auto-install in Wayland-first profile | **non-goal** | Kinto depends on xkeysnail/X11; excluded from default Wayland-first path. | + +### Gestures / Fusuma + +| Feature | Status | Helper / script path | +|---|---|---| +| Fusuma config written to `~/.config/fusuma/config.yml` if absent | **implemented** | [`profiles/linux-dev/workstation-v0/gnome/fusuma-apply.sh`](../../profiles/linux-dev/workstation-v0/gnome/fusuma-apply.sh) | +| Fusuma user systemd service installed when systemd available | **implemented** | [`profiles/linux-dev/workstation-v0/gnome/fusuma-install.sh`](../../profiles/linux-dev/workstation-v0/gnome/fusuma-install.sh) | +| Installer runs Fusuma lane best-effort | **implemented** | [`profiles/linux-dev/workstation-v0/install.sh`](../../profiles/linux-dev/workstation-v0/install.sh) — `apply_fusuma_install` | +| libinput-based gesture validation in CI | **planned** | No headless libinput smoke yet; planned for a future validation lane. | + +### Lampstand search + +| Feature | Status | Helper / script path | +|---|---|---| +| `sourceos search ` local file search surface | **implemented** | [`profiles/linux-dev/workstation-v0/bin/sourceos-search.sh`](../../profiles/linux-dev/workstation-v0/bin/sourceos-search.sh) | +| `bin/install-lampstand.sh` provisions Lampstand via pipx, prefers local checkout | **implemented** | [`profiles/linux-dev/workstation-v0/bin/install-lampstand.sh`](../../profiles/linux-dev/workstation-v0/bin/install-lampstand.sh) | +| Lampstand user unit (`sourceos-lampstand.service`) written when `lampstandd` available | **implemented** | [`profiles/linux-dev/workstation-v0/bin/install-lampstand.sh`](../../profiles/linux-dev/workstation-v0/bin/install-lampstand.sh) | +| `check-lampstand-unit.sh` validates unit status | **validation-backed** | [`profiles/linux-dev/workstation-v0/bin/check-lampstand-unit.sh`](../../profiles/linux-dev/workstation-v0/bin/check-lampstand-unit.sh) | +| Launcher treats Lampstand as file-search authority; no redundant second pass | **implemented** | [`docs/workstation/README.md`](README.md) — trust boundaries | + +### Doctor / status validation + +| Feature | Status | Helper / script path | +|---|---|---| +| `doctor.sh` validates mac-defaults GSettings (button-layout, hot-corners, clock-format, Files/Terminal bindings) | **validation-backed** | [`profiles/linux-dev/workstation-v0/doctor.sh`](../../profiles/linux-dev/workstation-v0/doctor.sh) — `check_mac_defaults` | +| `sourceos status --json` emits structured JSON status | **validation-backed** | [`profiles/linux-dev/workstation-v0/bin/sourceos`](../../profiles/linux-dev/workstation-v0/bin/sourceos) | +| `check-workstation-polish.sh` aggregates mac-polish + keyboard-policy checks | **validation-backed** | [`profiles/linux-dev/workstation-v0/bin/check-workstation-polish.sh`](../../profiles/linux-dev/workstation-v0/bin/check-workstation-polish.sh) | +| Contract test verifies mac-defaults shell correctness | **validation-backed** | [`tests/workstation-mac-defaults-contract.nix`](../../tests/workstation-mac-defaults-contract.nix) | +| `sourceos doctor --open` / `sourceos status --open` surface in launcher | **implemented** | [`profiles/linux-dev/workstation-v0/bin/sourceos`](../../profiles/linux-dev/workstation-v0/bin/sourceos) | +| Full macOS parity | **non-goal** | This lane targets Mac-like ergonomics on GNOME/Linux, not a macOS clone. | + +--- + +## Validation commands ```bash +# Document exists and is non-empty test -s docs/workstation/mac-on-linux-acceptance.md + +# Status tokens present grep -F "implemented" docs/workstation/mac-on-linux-acceptance.md -grep -F "validation-backed" docs/workstation/mac-on-linux-acceptance.md grep -F "non-goal" docs/workstation/mac-on-linux-acceptance.md +grep -F "validation-backed" docs/workstation/mac-on-linux-acceptance.md +grep -F "planned" docs/workstation/mac-on-linux-acceptance.md +``` + +Runtime checks (requires a provisioned workstation): + +```bash +# Doctor: mac defaults + keybindings +./profiles/linux-dev/workstation-v0/doctor.sh + +# Structured JSON status +sourceos status --json + +# Polish check (mac + keyboard policy) +./profiles/linux-dev/workstation-v0/bin/check-workstation-polish.sh + +# Screenshot helper presence +./profiles/linux-dev/workstation-v0/bin/check-mac-polish.sh + +# Keyboard policy +./profiles/linux-dev/workstation-v0/bin/check-keyboard-policy.sh ```