Implement researched Guix package outcome for #74: [Guix packaging] Marenz/notion-river #624

Closed
opened 2026-08-26 09:18:14 +00:00 by htayj · 1 comment
htayj commented 2026-08-26 09:18:14 +00:00 (Migrated from github.com)

Context

This delivery ticket was created from research issue #74 ([Guix packaging] Marenz/notion-river).

The host-validated research finding follows:

Implementation-ready delivery brief. Canonical upstream is https://github.com/Marenz/notion-river at fixed parent commit e79dea34c3f32987c42e338db6a5c341bce0af23, fetched as https://codeload.github.com/Marenz/notion-river/tar.gz/e79dea34c3f32987c42e338db6a5c341bce0af23 with Guix base32 hash 1lllgc5nf5gz0qhqiga17rlxrw73jjq4ba09d7k8lirjps1dyin. The nearest upstream tag is v0.6.0 and git describe is v0.6.0-14-ge79dea3; use a Guix revision version such as 0.6.0-14.ge79dea3, while recording that Cargo.toml and the --version path at this commit still report 0.5.3. The parent LICENSE at the fixed commit is the standard MIT grant for Marenz. The five checked-in protocol XML origins used to generate bindings are independently covered: river-layer-shell-v1.xml, river-window-management-v1.xml, and river-xkb-bindings-v1.xml each carry an explicit SPDX MIT notice; viewporter.xml carries Collabora's explicit MIT grant; and wlr-output-management-unstable-v1.xml carries an explicit permissive grant to use, copy, modify, distribute, and sell with attribution and no-endorsement/no-warranty terms, which must be preserved. Cargo.lock at the fixed parent commit contains 107 external packages, all registry sources with exact versions, checksums, and no git/path dependencies; every exact name/version was checked against its crates.io API record, the API checksum matched Cargo.lock, and every record had nonempty license or license_file evidence. The license expressions observed were Unlicense OR MIT (5), MIT OR Apache-2.0 (60), MIT/Apache-2.0 (3), MIT (26), Apache-2.0 OR MIT (6), Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT (3), MPL-2.0 (1), Apache-2.0 WITH LLVM-exception (1), (MIT OR Apache-2.0) AND Unicode-3.0 (1), and MIT OR Apache-2.0 OR Zlib (1), so the fixed crate origins have explicit redistribution evidence. The parent has one separate git submodule origin, https://codeberg.org/river/river.git, at exact gitlink revision edbfbe1dbe14f9c3c5f14ff30ace26162912e1dc; that exact revision contains LICENSES/MIT.txt, LICENSES/GPL-3.0-only.txt, LICENSES/0BSD.txt, and LICENSES/CC-BY-SA-4.0.txt, and its README/build metadata explicitly identify River source as GPL-3.0-only, Wayland protocols as MIT, and logo/docs as CC-BY-SA-4.0. The submodule is not required by notion-river's Cargo build: the parent uses only its checked-in protocol XML files and has no vendor, git, or path crate dependency. Use a nonrecursive fixed parent source and do not fetch, build, or install the River submodule; if that policy changes, its separate licensing and all of its pinned Zig dependency origins require a new review. No equivalent installed helper package exists in the inspected local channel or the checked GNU Guix-related channels: the local marenz-notion-river-source is only a copy-build-system source snapshot at this commit, and the existing river package is a different compositor at 0.3.12, below upstream's River 0.4.x runtime requirement. Add a package in the channel's normal package module, e.g. tay/packages/notion-river.scm, using cargo-build-system and the exact parent origin, with all 107 fixed crate archives as cargo inputs so the build is offline and reproducible. Use the channel's rust-1.93-compatible compiler, preserve the upstream Cargo.lock through configure, build with --release --locked, test with --locked, and set install-source? to false. Use pkg-config as a native input and cairo, pango, freetype, libxkbcommon, and wayland as target inputs for the cairo-rs/pango/pangocairo/xkbcommon/Wayland system libraries; do not add wlroots, Zig, or River as package build inputs. Install both target/release/notion-river and target/release/notion-ctl. Install notion-river-session and the desktop file as session integration, patch the desktop Exec from /usr/bin/notion-river-session to the store path, patch the session script's hardcoded $HOME/.config checks to honor XDG_CONFIG_HOME, and patch config-examples/river-init's /usr/share/notion-river/examples reference to the store share path. Ship configuration/examples/docs under the store share directory; keep optional foot, waybar, rofi, wdisplays, systemctl, and similar user tools out of hard runtime inputs. The installed helper connects to the user's Wayland display, requires River protocol globals river_window_manager_v1 version at least 4 and river_xkb_bindings_v1 version at least 2, reads config and state below XDG_CONFIG_HOME/notion-river (with the upstream fallback), and creates notion-river.sock and notion-river-workspaces below XDG_RUNTIME_DIR (with the upstream fallback); the session wrapper must invoke a separately supplied compatible river executable by PATH and default to river -c notion-river. Acceptance must include guix lint -L. notion-river and guix build -L. notion-river after implementation, with no current package proof claimed because the local Guix daemon socket is unavailable. In the build/test environment run cargo test --locked with private XDG_RUNTIME_DIR and XDG_CONFIG_HOME. Then run installed notion-river --version and require notion-river 0.5.3, run notion-ctl with no arguments and require usage plus exit status 2, validate a valid and invalid private config, and perform an isolated nested Wayland smoke using a pre-provisioned River >=0.4.7 binary rather than the incompatible in-channel river 0.3.12: start River with private XDG directories and a temporary init, launch notion-river and a simple Wayland client such as foot, assert the connection log, private notion-river.sock and notion-river-workspaces, query notion-ctl list-workspaces and list-windows and validate the returned JSON/window, then SIGTERM notion-river and assert the private state file is written and no live user/repository socket was touched. This proves the protocol handshake, runtime paths, IPC, and shutdown persistence without bundling or fetching the separate compositor.

Acceptance criteria

  • Implement the viable package change identified in the host-validated research finding.
  • Preserve Guix source provenance, licensing, and deterministic build requirements recorded in the finding.
  • Add and pass a package-specific safe smoke proof using isolated HOME/XDG state before closure.

Imported from GitHub issue/PR. Originally posted by htayj on 2026-08-26T09:18:14Z.

<!-- goocastle-implementation-ticket:sequential-reviewer:74:1:implementation-ready --> ## Context This delivery ticket was created from research issue #74 ([Guix packaging] Marenz/notion-river). The host-validated research finding follows: Implementation-ready delivery brief. Canonical upstream is https://github.com/Marenz/notion-river at fixed parent commit e79dea34c3f32987c42e338db6a5c341bce0af23, fetched as https://codeload.github.com/Marenz/notion-river/tar.gz/e79dea34c3f32987c42e338db6a5c341bce0af23 with Guix base32 hash 1lllgc5nf5gz0qhqiga17rlxrw73jjq4ba09d7k8lirjps1dyin. The nearest upstream tag is v0.6.0 and git describe is v0.6.0-14-ge79dea3; use a Guix revision version such as 0.6.0-14.ge79dea3, while recording that Cargo.toml and the --version path at this commit still report 0.5.3. The parent LICENSE at the fixed commit is the standard MIT grant for Marenz. The five checked-in protocol XML origins used to generate bindings are independently covered: river-layer-shell-v1.xml, river-window-management-v1.xml, and river-xkb-bindings-v1.xml each carry an explicit SPDX MIT notice; viewporter.xml carries Collabora's explicit MIT grant; and wlr-output-management-unstable-v1.xml carries an explicit permissive grant to use, copy, modify, distribute, and sell with attribution and no-endorsement/no-warranty terms, which must be preserved. Cargo.lock at the fixed parent commit contains 107 external packages, all registry sources with exact versions, checksums, and no git/path dependencies; every exact name/version was checked against its crates.io API record, the API checksum matched Cargo.lock, and every record had nonempty license or license_file evidence. The license expressions observed were Unlicense OR MIT (5), MIT OR Apache-2.0 (60), MIT/Apache-2.0 (3), MIT (26), Apache-2.0 OR MIT (6), Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT (3), MPL-2.0 (1), Apache-2.0 WITH LLVM-exception (1), (MIT OR Apache-2.0) AND Unicode-3.0 (1), and MIT OR Apache-2.0 OR Zlib (1), so the fixed crate origins have explicit redistribution evidence. The parent has one separate git submodule origin, https://codeberg.org/river/river.git, at exact gitlink revision edbfbe1dbe14f9c3c5f14ff30ace26162912e1dc; that exact revision contains LICENSES/MIT.txt, LICENSES/GPL-3.0-only.txt, LICENSES/0BSD.txt, and LICENSES/CC-BY-SA-4.0.txt, and its README/build metadata explicitly identify River source as GPL-3.0-only, Wayland protocols as MIT, and logo/docs as CC-BY-SA-4.0. The submodule is not required by notion-river's Cargo build: the parent uses only its checked-in protocol XML files and has no vendor, git, or path crate dependency. Use a nonrecursive fixed parent source and do not fetch, build, or install the River submodule; if that policy changes, its separate licensing and all of its pinned Zig dependency origins require a new review. No equivalent installed helper package exists in the inspected local channel or the checked GNU Guix-related channels: the local marenz-notion-river-source is only a copy-build-system source snapshot at this commit, and the existing river package is a different compositor at 0.3.12, below upstream's River 0.4.x runtime requirement. Add a package in the channel's normal package module, e.g. tay/packages/notion-river.scm, using cargo-build-system and the exact parent origin, with all 107 fixed crate archives as cargo inputs so the build is offline and reproducible. Use the channel's rust-1.93-compatible compiler, preserve the upstream Cargo.lock through configure, build with --release --locked, test with --locked, and set install-source? to false. Use pkg-config as a native input and cairo, pango, freetype, libxkbcommon, and wayland as target inputs for the cairo-rs/pango/pangocairo/xkbcommon/Wayland system libraries; do not add wlroots, Zig, or River as package build inputs. Install both target/release/notion-river and target/release/notion-ctl. Install notion-river-session and the desktop file as session integration, patch the desktop Exec from /usr/bin/notion-river-session to the store path, patch the session script's hardcoded $HOME/.config checks to honor XDG_CONFIG_HOME, and patch config-examples/river-init's /usr/share/notion-river/examples reference to the store share path. Ship configuration/examples/docs under the store share directory; keep optional foot, waybar, rofi, wdisplays, systemctl, and similar user tools out of hard runtime inputs. The installed helper connects to the user's Wayland display, requires River protocol globals river_window_manager_v1 version at least 4 and river_xkb_bindings_v1 version at least 2, reads config and state below XDG_CONFIG_HOME/notion-river (with the upstream fallback), and creates notion-river.sock and notion-river-workspaces below XDG_RUNTIME_DIR (with the upstream fallback); the session wrapper must invoke a separately supplied compatible river executable by PATH and default to river -c notion-river. Acceptance must include guix lint -L. notion-river and guix build -L. notion-river after implementation, with no current package proof claimed because the local Guix daemon socket is unavailable. In the build/test environment run cargo test --locked with private XDG_RUNTIME_DIR and XDG_CONFIG_HOME. Then run installed notion-river --version and require notion-river 0.5.3, run notion-ctl with no arguments and require usage plus exit status 2, validate a valid and invalid private config, and perform an isolated nested Wayland smoke using a pre-provisioned River >=0.4.7 binary rather than the incompatible in-channel river 0.3.12: start River with private XDG directories and a temporary init, launch notion-river and a simple Wayland client such as foot, assert the connection log, private notion-river.sock and notion-river-workspaces, query notion-ctl list-workspaces and list-windows and validate the returned JSON/window, then SIGTERM notion-river and assert the private state file is written and no live user/repository socket was touched. This proves the protocol handshake, runtime paths, IPC, and shutdown persistence without bundling or fetching the separate compositor. ## Acceptance criteria - Implement the viable package change identified in the host-validated research finding. - Preserve Guix source provenance, licensing, and deterministic build requirements recorded in the finding. - Add and pass a package-specific safe smoke proof using isolated HOME/XDG state before closure. --- Imported from [GitHub issue/PR](https://github.com/htayj/guix-channel/issues/624). Originally posted by [htayj](https://github.com/htayj) on 2026-08-26T09:18:14Z.
htayj commented 2026-08-26 23:04:22 +00:00 (Migrated from github.com)

Completed and verified through the Guix package quality gates. Evidence: source-count inventory passed; offline Guix lint passed (with only unrelated optional Nonguix module warnings); fresh source build and guix build --check succeeded; Cargo ran 82 upstream tests; the isolated HOME/XDG smoke test verified the session wrapper, IPC-path behavior, notices, and no output/store writes.


Imported from GitHub comment. Originally posted by htayj on 2026-08-26T23:04:22Z.

Completed and verified through the Guix package quality gates. Evidence: source-count inventory passed; offline Guix lint passed (with only unrelated optional Nonguix module warnings); fresh source build and `guix build --check` succeeded; Cargo ran 82 upstream tests; the isolated HOME/XDG smoke test verified the session wrapper, IPC-path behavior, notices, and no output/store writes. --- Imported from [GitHub comment](https://github.com/htayj/guix-channel/issues/624#issuecomment-5432118833). Originally posted by [htayj](https://github.com/htayj) on 2026-08-26T23:04:22Z.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
tay/guix-channel#624
No description provided.