[Guix packaging] UnAngband #571

Open
opened 2026-08-24 17:34:57 +00:00 by htayj · 1 comment
htayj commented 2026-08-24 17:34:57 +00:00 (Migrated from github.com)

Candidate

Scope

Package the independently playable roguelike variant from source. The canonical repository, latest stable release, source hash, complete dependency closure, and relationship to parent games or sibling forks must be established before implementation. Do not substitute an opaque prebuilt binary.

Research checklist

  • Identify the canonical maintained source repository and immutable release/commit.
  • Verify the exact FOSS license for code and every installed font, tile, sound, map, documentation, and bundled dependency.
  • Check GNU Guix and the channel audit set for an equivalent same-upstream package.
  • Determine the offline build system and source closure, including submodules or language registries.
  • Identify updater, telemetry, runtime download, mutable-state, and network behavior that needs Guix integration.

Acceptance checks

  • guix lint -L . <package> has no package-specific findings.
  • guix build -L . --no-grafts <package> succeeds without network access or opaque binaries.
  • Upstream tests run where available, and guix build -L . --no-grafts --check <package> verifies reproducibility.
  • A fresh HOME/XDG smoke test starts a real local game, exercises meaningful gameplay or save/load behavior, and proves no store writes.
  • Installed license and third-party notices cover the shipped closure and assets.

Imported from GitHub issue/PR. Originally posted by htayj on 2026-08-24T17:34:57Z.

## Candidate - Project: UnAngband - Candidate upstream/homepage: https://github.com/DGoldDragon28/Unangband - Discovery evidence: [Variant catalogs](https://www.roguebasin.com/index.php/Category:Angband_variants) - Reported license: NOASSERTION - License status: needs authoritative upstream verification before packaging ## Scope Package the independently playable roguelike variant from source. The canonical repository, latest stable release, source hash, complete dependency closure, and relationship to parent games or sibling forks must be established before implementation. Do not substitute an opaque prebuilt binary. ## Research checklist - Identify the canonical maintained source repository and immutable release/commit. - Verify the exact FOSS license for code and every installed font, tile, sound, map, documentation, and bundled dependency. - Check GNU Guix and the channel audit set for an equivalent same-upstream package. - Determine the offline build system and source closure, including submodules or language registries. - Identify updater, telemetry, runtime download, mutable-state, and network behavior that needs Guix integration. ## Acceptance checks - `guix lint -L . <package>` has no package-specific findings. - `guix build -L . --no-grafts <package>` succeeds without network access or opaque binaries. - Upstream tests run where available, and `guix build -L . --no-grafts --check <package>` verifies reproducibility. - A fresh HOME/XDG smoke test starts a real local game, exercises meaningful gameplay or save/load behavior, and proves no store writes. - Installed license and third-party notices cover the shipped closure and assets. --- Imported from [GitHub issue/PR](https://github.com/htayj/guix-channel/issues/571). Originally posted by [htayj](https://github.com/htayj) on 2026-08-24T17:34:57Z.
Owner

Goocastle recorded disposition: blocked.

BLOCKED on unresolved non-free licensing in the canonical UnAngband source; no equivalent exists in this channel (rg 'Un[Aa]ngband' --glob '*.scm' over the worktree returned nothing), so this is a first-time delivery, not a duplicate or a proof remediation.

CANONICAL UPSTREAM AND REVISION (established). Repository https://github.com/DGoldDragon28/Unangband is the maintained continuation (docs/_posts/2017-01-24-New-Maintainer.md). Default branch master = commit 70ca6de7b7e454052c5eb0dd9b0cc1e1c15b27c4 (2025-05-26). Tags stop at v.0.6.6 (d3bc4ed...) / v.0.7.0-pre1 (65496b9...); master carries later compile fixes (2a8c8ce fixing src/externs.h, 70ca6de allowing play without base X fonts), so a package would have to pin the git commit rather than a stale tag. No submodules exist: git ls-tree -r origin/HEAD shows no .gitmodules and no gitlink entries, so there is no separately fetched origin requiring its own license evidence.

BLOCKER 1 - bundled audio is explicitly non-commercial. lib/xtra/sound/sound.cfg lines 13-15 declare: "This is the Dubtrain Angband Sound config list, v.3.1.0" ... "Licensed under a Creative Commons non-commercial agreement". 213 accompanying .wav files ship in lib/xtra/sound/ and are wired into the automake install set (lib/Makefile.am SUBDIRS includes xtra; configure.in emits lib/xtra/sound/Makefile). A CC NC grant is not a free/redistributable-for-any-purpose license and is unacceptable in the store closure. No per-asset LICENSE/README exists anywhere under lib/xtra (a bounded find for readme/license/copying/txt returned zero files), so there is no alternative grant to rely on.

BLOCKER 2 - the core game code's effective license is self-contradictory. Top-level LICENSE is GPL-2, and src/util.c lines 10-13 state UnAngband's modifications to Angband 2.9.6 are GPL. But the shipped lib/help/version.txt states the governing terms of the inherited base: line 404 "Copyright (c) 1989 James E. Wilson, Robert A. Keoneke" with line 406 permitting copying "not for profit purposes"; line 428 repeats this for "Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke" (lines 431-432); and lines 436-440 conclude that only parts are GPL and "Until all parts of Angband are distributed under the GPL the only valid license remains the original Moria/Angband license." lib/file/news.txt line 19 likewise cites "the traditional Angband license and GNU GPL." UnAngband forked from Angband 2.9.6, which predates upstream Angband's GPL-2 relicensing, so the field-of-use ('not for profit') restriction is not superseded by the repository's LICENSE file. This matches the issue's NOASSERTION report and its needs:license-investigation label. A GPL-2 LICENSE file cannot override the retained non-free grant on inherited code, and guix lint / Guix's free-software requirement cannot be satisfied on this evidence.

BLOCKER 3 - no runtime contract. There is no noninteractive or headless mode. src/main.c lines 435-565 accept only -n, -f, -w, -v, -g, -r, -o, -s<n>, -u<name>, -m<module>; the fallback is a usage: text dump, which is explicitly forbidden as a proof invocation. The curses front end (src/main-gcu.c) calls initscr/noecho and blocks in getch() (Term_xtra_gcu_event), and on broken input calls exit_game_panic(); it emits no deterministic single-line stdout marker. Character creation is a multi-screen interactive birth flow. Upstream therefore provides no safe deterministic gameplay invocation, and none can be specified until the licensing is resolved.

BUILD/RUNTIME NOTES (recorded, not a proof). No Guix daemon is available to this phase per the host capability boundary, so no guix shell build was attempted and no build command was run; source-buildability was assessed from build metadata only. configure.in (autoconf/automake, AM_INIT_AUTOMAKE UnAngband) supports --with-libpath and --with-setgid, and src/Makefile.std builds a plain C99 binary unangband from SYS_gcu = -DUSE_GCU -DUSE_NCURSES -lncurses plus SYS_x11 = -DUSE_X11 -lX11, needing only gcc-toolchain, make, ncurses, libx11 (autoconf/automake/pkg-config to regenerate). Offline building is otherwise plausible: no network fetch, no updater, and no telemetry were found. Mutable state is confined to PRIVATE_USER_PATH "~/.angband" via create_user_dirs() (src/config.h 462-464, src/main.c 425-430) with ANGBAND_DIR_USER/ANGBAND_DIR_SAVE overridable by -d suboptions, so a HOME/XDG-isolated run would not write to the store; note src/Makefile.std install merely copies the binary to ../ and DEFAULT_PATH defaults to ./lib/, so the data path must be set explicitly.

CONDITION TO UNBLOCK. All three must be satisfied: (1) an authoritative upstream grant placing the inherited Angband 2.9.6 base code under a free license, or confirmation that every retained 'not for profit' file has been relicensed/removed, superseding lib/help/version.txt 404-440; (2) a free license for the lib/xtra/sound assets at commit 70ca6de..., or a confirmed decision plus a verified build that omits the CC-NC sound set (and equivalent explicit evidence for the 26 lib/xtra/font/*.fon files and 11 lib/xtra/graf tiles, which carry no stated license at all); and (3) a defined noninteractive smoke invocation - an upstream flag or a package-provided wrapper - that drives real gameplay and prints one deterministic stdout marker. Until (1) and (2) are resolved, packaging cannot lawfully proceed and no delivery ticket should be created.

<!-- goocastle-disposition:sequential-reviewer:571:1:blocked --> Goocastle recorded disposition: blocked. BLOCKED on unresolved non-free licensing in the canonical UnAngband source; no equivalent exists in this channel (`rg 'Un[Aa]ngband' --glob '*.scm'` over the worktree returned nothing), so this is a first-time delivery, not a duplicate or a proof remediation. CANONICAL UPSTREAM AND REVISION (established). Repository https://github.com/DGoldDragon28/Unangband is the maintained continuation (`docs/_posts/2017-01-24-New-Maintainer.md`). Default branch `master` = commit 70ca6de7b7e454052c5eb0dd9b0cc1e1c15b27c4 (2025-05-26). Tags stop at v.0.6.6 (d3bc4ed...) / v.0.7.0-pre1 (65496b9...); master carries later compile fixes (2a8c8ce fixing `src/externs.h`, 70ca6de allowing play without base X fonts), so a package would have to pin the git commit rather than a stale tag. No submodules exist: `git ls-tree -r origin/HEAD` shows no `.gitmodules` and no gitlink entries, so there is no separately fetched origin requiring its own license evidence. BLOCKER 1 - bundled audio is explicitly non-commercial. `lib/xtra/sound/sound.cfg` lines 13-15 declare: "This is the Dubtrain Angband Sound config list, v.3.1.0" ... "Licensed under a Creative Commons non-commercial agreement". 213 accompanying `.wav` files ship in `lib/xtra/sound/` and are wired into the automake install set (`lib/Makefile.am` SUBDIRS includes `xtra`; `configure.in` emits `lib/xtra/sound/Makefile`). A CC *NC* grant is not a free/redistributable-for-any-purpose license and is unacceptable in the store closure. No per-asset LICENSE/README exists anywhere under `lib/xtra` (a bounded `find` for readme/license/copying/txt returned zero files), so there is no alternative grant to rely on. BLOCKER 2 - the core game code's effective license is self-contradictory. Top-level `LICENSE` is GPL-2, and `src/util.c` lines 10-13 state UnAngband's *modifications* to Angband 2.9.6 are GPL. But the shipped `lib/help/version.txt` states the governing terms of the inherited base: line 404 "Copyright (c) 1989 James E. Wilson, Robert A. Keoneke" with line 406 permitting copying "not for profit purposes"; line 428 repeats this for "Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke" (lines 431-432); and lines 436-440 conclude that only *parts* are GPL and "Until all parts of Angband are distributed under the GPL the only valid license remains the original Moria/Angband license." `lib/file/news.txt` line 19 likewise cites "the traditional Angband license and GNU GPL." UnAngband forked from Angband 2.9.6, which predates upstream Angband's GPL-2 relicensing, so the field-of-use ('not for profit') restriction is not superseded by the repository's `LICENSE` file. This matches the issue's NOASSERTION report and its `needs:license-investigation` label. A GPL-2 `LICENSE` file cannot override the retained non-free grant on inherited code, and `guix lint` / Guix's free-software requirement cannot be satisfied on this evidence. BLOCKER 3 - no runtime contract. There is no noninteractive or headless mode. `src/main.c` lines 435-565 accept only `-n`, `-f`, `-w`, `-v`, `-g`, `-r`, `-o`, `-s<n>`, `-u<name>`, `-m<module>`; the fallback is a `usage:` text dump, which is explicitly forbidden as a proof invocation. The curses front end (`src/main-gcu.c`) calls `initscr`/`noecho` and blocks in `getch()` (Term_xtra_gcu_event), and on broken input calls `exit_game_panic()`; it emits no deterministic single-line stdout marker. Character creation is a multi-screen interactive birth flow. Upstream therefore provides no safe deterministic gameplay invocation, and none can be specified until the licensing is resolved. BUILD/RUNTIME NOTES (recorded, not a proof). No Guix daemon is available to this phase per the host capability boundary, so no `guix shell` build was attempted and no build command was run; source-buildability was assessed from build metadata only. `configure.in` (autoconf/automake, AM_INIT_AUTOMAKE UnAngband) supports `--with-libpath` and `--with-setgid`, and `src/Makefile.std` builds a plain C99 binary `unangband` from `SYS_gcu = -DUSE_GCU -DUSE_NCURSES -lncurses` plus `SYS_x11 = -DUSE_X11 -lX11`, needing only gcc-toolchain, make, ncurses, libx11 (autoconf/automake/pkg-config to regenerate). Offline building is otherwise plausible: no network fetch, no updater, and no telemetry were found. Mutable state is confined to `PRIVATE_USER_PATH "~/.angband"` via `create_user_dirs()` (`src/config.h` 462-464, `src/main.c` 425-430) with `ANGBAND_DIR_USER`/`ANGBAND_DIR_SAVE` overridable by `-d` suboptions, so a HOME/XDG-isolated run would not write to the store; note `src/Makefile.std` `install` merely copies the binary to `../` and `DEFAULT_PATH` defaults to `./lib/`, so the data path must be set explicitly. CONDITION TO UNBLOCK. All three must be satisfied: (1) an authoritative upstream grant placing the inherited Angband 2.9.6 base code under a free license, or confirmation that every retained 'not for profit' file has been relicensed/removed, superseding `lib/help/version.txt` 404-440; (2) a free license for the `lib/xtra/sound` assets at commit 70ca6de..., or a confirmed decision plus a verified build that omits the CC-NC sound set (and equivalent explicit evidence for the 26 `lib/xtra/font/*.fon` files and 11 `lib/xtra/graf` tiles, which carry no stated license at all); and (3) a defined noninteractive smoke invocation - an upstream flag or a package-provided wrapper - that drives real gameplay and prints one deterministic stdout marker. Until (1) and (2) are resolved, packaging cannot lawfully proceed and no delivery ticket should be created.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
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#571
No description provided.