- commit
- aefc7bd283f64e7c9c4bfe370d8edf2c6a303586
- parent
- c53a1e4bd624a17292d71a424185f798b2aeec44
- author
- Dami <dami.etoile@gmail.com>
| M | docs/ | 24 | ++++++++--- |
| A | scripts/ | 69 | ++++++++++++++++++++++++++++++ |
| M | scripts/ | 8 | +++ |
@@ -30,12 +30,23 @@ and Iroh endpoint ID
3030 Portal has a golden test for the complete derivation. This vector is test data,3131 not a deployed credential.3232 33-## Sigil local-management runtime33+## Sigil host filesystem namespace3434 35-Sigil appends the frozen child `sigil-spark` to the validated36-`XDG_RUNTIME_DIR` or explicit management runtime root. The daemon lifecycle37-lock and status document live below that child, and the Decky plugin and38-offline management commands consume the same path.35+The following host paths are frozen because the installer, service, rollback36+tooling, Decky plugin, and recovery documentation consume them independently:37+38+| Purpose | Frozen path |39+| --- | --- |40+| Installed releases and current link | `~/.local/libexec/sigil-spark` |41+| Host configuration | `~/.config/sigil-spark/host.toml` |42+| Identity and package-owned shared data | `~/.local/share/sigil-spark` |43+| Authorization and configuration state | `~/.local/state/sigil-spark` |44+| Volatile daemon management runtime | `$XDG_RUNTIME_DIR/sigil-spark` |45+46+For an explicit management runtime root, Sigil also appends the frozen child47+`sigil-spark`. The daemon lifecycle lock and status document live below that48+child. A repository gate keeps the independent Decky, systemd, installer,49+activation, staging, and Rust consumers synchronized.3950 4051 ## Linux virtual-input ABI4152 @@ -49,7 +60,8 @@ version `1`.
4960 | Keyboard | `3` | `Sigil Spark Virtual Keyboard` |5061 5162 These values are visible to Gamescope, udev, libinput, games, diagnostics, and52-hardware evidence. Host tests pin the complete tuple.63+hardware evidence. Host tests pin the complete tuple, and a package test64+requires the shipped udev rule to match its checked-in frozen source exactly.5365 5466 ## Change policy5567 @@ -0,0 +1,69 @@
1+2+3+set -euo pipefail4+5+script_dir="$(CDPATH='' cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)"6+repo_dir="$(CDPATH='' cd -- "$script_dir/../.." && pwd -P)"7+8+require_exact_line() {9+ local relative_path="$1"10+ local expected="$2"11+ if ! grep -Fqx -- "$expected" "$repo_dir/$relative_path"; then12+ printf 'compatibility identifier drifted in %s: %s\n' \13+ "$relative_path" "$expected" >&214+ exit 115+ fi16+}17+18+# Portal enrollment identity. These source assertions complement the Rust19+# derivation vector by preventing a second call-site literal from drifting.20+require_exact_line src-tauri/src/commands/auth.rs \21+ 'const FIDO_RP_ID: &str = "sigil";'22+require_exact_line src-tauri/src/commands/auth.rs \23+ 'const FIDO_HMAC_SALT_MESSAGE: &str = "sigil-iroh-identity-v1";'24+require_exact_line src-tauri/src/commands/auth.rs \25+ 'const FIDO_RESIDENT_USER_ID: &[u8] = b"sigil-user";'26+require_exact_line src-tauri/src/commands/auth.rs \27+ 'const PORTAL_CLIENT_IDENTITY_DOMAIN: &[u8] = b"goq/portal-client-identity/v1\0";'28+29+# Canonical host install, configuration, persistent data, and volatile runtime30+# namespaces. Decky and the installed service are independent consumers.31+require_exact_line crates/sigil-host/src/appliance.rs \32+ 'const RUNTIME_DIRECTORY_COMPONENT: &str = "sigil-spark";'33+require_exact_line decky/py_modules/goq_sigil/runner.py \34+ ' self.sigil = self.home / ".local/libexec/sigil-spark/current/sigil"'35+require_exact_line decky/py_modules/goq_sigil/runner.py \36+ ' self.config = self.home / ".config/sigil-spark/host.toml"'37+require_exact_line scripts/install-bazzite-package.sh \38+ "install_root=\"\$HOME/.local/libexec/sigil-spark\""39+require_exact_line scripts/sigil-host.service \40+ 'ConditionPathExists=%h/.config/sigil-spark/host.toml'41+require_exact_line scripts/sigil-host.service \42+ 'ExecStart=%h/.local/libexec/sigil-spark/current/sigil-host serve --config %h/.config/sigil-spark/host.toml'43+require_exact_line docs/sigil-host-activation.md \44+ "identity=\"\$HOME/.local/share/sigil-spark/identity/host.key\""45+require_exact_line docs/sigil-host-activation.md \46+ "state_path = \"\$HOME/.local/state/sigil-spark/runtime\""47+require_exact_line scripts/stage-bazzite-release.sh \48+ " \"\$HOME/.local/share/sigil-spark/package-assets/70-sigil-remote-input.rules\""49+50+# Linux virtual-input producer and the packaged udev consumer must remain51+# byte-for-byte synchronized around the names that udev matches.52+require_exact_line crates/sigil-host/src/input.rs \53+ 'const UINPUT_BUS_TYPE: u16 = 0x06; // Linux BUS_VIRTUAL'54+require_exact_line crates/sigil-host/src/input.rs \55+ 'const UINPUT_VENDOR_ID: u16 = 0x5347;'56+require_exact_line crates/sigil-host/src/input.rs \57+ 'const UINPUT_DEVICE_VERSION: u16 = 1;'58+require_exact_line crates/sigil-host/src/input.rs \59+ 'const POINTER_DEVICE_NAME: &[u8] = b"Sigil Spark Virtual Pointer";'60+require_exact_line crates/sigil-host/src/input.rs \61+ 'const KEYBOARD_DEVICE_NAME: &[u8] = b"Sigil Spark Virtual Keyboard";'62+require_exact_line crates/sigil-host/src/input.rs \63+ 'const GAMEPAD_DEVICE_NAME: &[u8] = b"Sigil Spark Virtual Gamepad";'64+require_exact_line scripts/70-sigil-remote-input.rules \65+ 'ACTION=="add|change", SUBSYSTEM=="input", KERNEL=="event*", ATTRS{name}=="Sigil Spark Virtual Pointer", GROUP="sigil-uinput", MODE="0660", TAG+="uaccess"'66+require_exact_line scripts/70-sigil-remote-input.rules \67+ 'ACTION=="add|change", SUBSYSTEM=="input", KERNEL=="event*", ATTRS{name}=="Sigil Spark Virtual Keyboard", GROUP="sigil-uinput", MODE="0660", TAG+="uaccess"'68+69+printf 'compatibility_identifier_tests=ok\n'@@ -71,6 +71,14 @@ archive="$temp_root/output/sigil-v0.1.0-bazzite-x86_64.tar.gz"
7171 PATH="$temp_root/bin:$PATH" "$fixture_repo/scripts/package-bazzite-release.sh" \7272 --release-tag v0.1.0 --output "$archive" >"$temp_root/product.log"7373 grep -Fq 'publisher_signature=pending-offline' "$temp_root/product.log"74+packaged_input_rules="$temp_root/output/70-sigil-remote-input.rules"75+tar -xOzf "$archive" payload/release/assets/70-sigil-remote-input.rules \76+ >"$packaged_input_rules"77+cmp -s "$repo_dir/scripts/70-sigil-remote-input.rules" "$packaged_input_rules" \78+ || {79+ printf 'packaged virtual-input rules differ from the frozen source ABI\n' >&280+ exit 181+ }7482 "$repo_dir/scripts/verify-sigil-release.sh" \7583 --tag v0.1.0 --archive "$archive" --source-commit "$source_commit" --candidate \7684 | grep -Fq 'sigil_release_verification=ok'