[Guix packaging] Hydra Slayer (corrected runtime contract) #697

Closed
opened 2026-09-09 00:27:54 +00:00 by htayj · 3 comments
htayj commented 2026-09-09 00:27:54 +00:00 (Migrated from github.com)

Supersedes #696

The first delivery ticket contained an incorrect module path in its reviewed runtime contract. This corrected ticket preserves the same package scope and evidence requirements.

Context

This delivery ticket was created from research issue #398 ([Guix packaging] Hydra Slayer).

The host-validated research finding follows:

Canonical upstream is https://github.com/zenorogue/noteye, fixed at commit 55bb69d716a9fb269c6364f9df89d4bc260cb1a1 (master commit dated 2025-01-28; source hydra/hydra.cpp identifies Hydra Slayer 18.3, matching the upstream 18.3 release dated 2025-01-30). The fixed GitHub tarball SHA-256 is 41ec5986e75684ba026afcc2a80235915adbf24f598bae14e62f7457cb8b4f24. This is the standalone Hydra Slayer console game embedded in the NotEye repository, not the NotEye frontend and not a sibling fork; hydra/Makefile builds hydra.cpp with g++ and ncurses only. No Git submodules are present. Use package name hydra-slayer in tay/packages/hydra-slayer.scm with gnu-build-system, build in hydra/ via the upstream Makefile (or an equivalent bounded make invocation), use the compiler/make provided by the build system plus ncurses, and add a small PTY-driver runtime input (for example Python) only if needed by the package-owned smoke mode; install the resulting console executable plus the GPL notice. Do not install NotEye, its SDL/Lua/OpenGL closure, or graphical/audio assets. The Hydra source headers grant GPLv3-or-later; the repository LICENSE is GPL-3.0, and the standalone build fetches no separate origin. The repo asset notices independently identify optional NotEye fonts/tiles and Hydra graphics/sounds (CC BY/CC BY-SA/public-domain), but those assets are excluded from this console package. The source has no updater/runtime download path: non-NOTEYE Hydra stubs out sharing/highscore networking, and state is local files hydra.sav, hydra-bak.sav, hydralog.txt, hydrascores.sav, and hydrachallenge.sav. The package wrapper must map these to an XDG_STATE_HOME/HOME state directory and keep store paths read-only; it should preserve normal arguments including fixed seed -s and the file options. Add a package-owned --guix-smoke mode to the installed hydra launcher: in a fresh HOME/XDG tree, allocate a bounded PTY and invoke the real binary twice with deterministic internal arguments -s 398 -f STATE/hydra.sav -b STATE/hydra-bak.sav -t STATE/hydralog.txt -g STATE/hydrascores.sav; drive the first run with n, Enter, ., S, s, y (new game, one wait-turn, return to menu, save and quit), verify the save exists, then drive the second run with q, x, y, q (loaded game, quit without recording, exit), assert the second run reaches the saved-game welcome state, all created files stay below the disposable state directory, and no store path changes. After the assertions print exactly one stdout line containing the declared marker. The current channel has no same-upstream hydra-slayer package or equivalent audit hit. Research did not run a build because the host explicitly has no Guix daemon; authoritative Makefile metadata establishes source-buildability but not package proof. Acceptance remains the issue's Guix lint/build/check gates plus the isolated smoke and screenshot at the declared artifact path.

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.

Runtime evidence contract

Implementation workflow: guix-package-quality-gates
Reviewed contract file: .goocastle/runtime-evidence-contracts.json
Required proof phase: safe-package-proof; screenshot phase: runtime-screenshot
Evidence adapter: github-issue-comment
Copy this reviewed contract into the named file before running the package proof workflow.

{
  "version": 1,
  "contracts": [
    {
      "issueNumber": 697,
      "packageName": "hydra-slayer",
      "packageModulePath": "tay/packages/hydra-slayer.scm",
      "artifactPath": ".goocastle/evidence/issue-697.png",
      "runtime": {
        "executable": "hydra",
        "invocation": {
          "file": "hydra",
          "args": [
            "--guix-smoke"
          ]
        },
        "successMarker": "HYDRA_SLAYER_GUIX_SMOKE_OK: new-game, turn, save-load, isolated-state"
      }
    }
  ]
}

Imported from GitHub issue/PR. Originally posted by htayj on 2026-09-09T00:27:54Z.

## Supersedes #696 The first delivery ticket contained an incorrect module path in its reviewed runtime contract. This corrected ticket preserves the same package scope and evidence requirements. <!-- goocastle-implementation-ticket:sequential-reviewer:398:2:implementation-ready --> ## Context This delivery ticket was created from research issue #398 ([Guix packaging] Hydra Slayer). The host-validated research finding follows: Canonical upstream is https://github.com/zenorogue/noteye, fixed at commit 55bb69d716a9fb269c6364f9df89d4bc260cb1a1 (master commit dated 2025-01-28; source hydra/hydra.cpp identifies Hydra Slayer 18.3, matching the upstream 18.3 release dated 2025-01-30). The fixed GitHub tarball SHA-256 is 41ec5986e75684ba026afcc2a80235915adbf24f598bae14e62f7457cb8b4f24. This is the standalone Hydra Slayer console game embedded in the NotEye repository, not the NotEye frontend and not a sibling fork; hydra/Makefile builds hydra.cpp with g++ and ncurses only. No Git submodules are present. Use package name hydra-slayer in tay/packages/hydra-slayer.scm with gnu-build-system, build in hydra/ via the upstream Makefile (or an equivalent bounded make invocation), use the compiler/make provided by the build system plus ncurses, and add a small PTY-driver runtime input (for example Python) only if needed by the package-owned smoke mode; install the resulting console executable plus the GPL notice. Do not install NotEye, its SDL/Lua/OpenGL closure, or graphical/audio assets. The Hydra source headers grant GPLv3-or-later; the repository LICENSE is GPL-3.0, and the standalone build fetches no separate origin. The repo asset notices independently identify optional NotEye fonts/tiles and Hydra graphics/sounds (CC BY/CC BY-SA/public-domain), but those assets are excluded from this console package. The source has no updater/runtime download path: non-NOTEYE Hydra stubs out sharing/highscore networking, and state is local files hydra.sav, hydra-bak.sav, hydralog.txt, hydrascores.sav, and hydrachallenge.sav. The package wrapper must map these to an XDG_STATE_HOME/HOME state directory and keep store paths read-only; it should preserve normal arguments including fixed seed -s and the file options. Add a package-owned --guix-smoke mode to the installed hydra launcher: in a fresh HOME/XDG tree, allocate a bounded PTY and invoke the real binary twice with deterministic internal arguments -s 398 -f STATE/hydra.sav -b STATE/hydra-bak.sav -t STATE/hydralog.txt -g STATE/hydrascores.sav; drive the first run with n, Enter, ., S, s, y (new game, one wait-turn, return to menu, save and quit), verify the save exists, then drive the second run with q, x, y, q (loaded game, quit without recording, exit), assert the second run reaches the saved-game welcome state, all created files stay below the disposable state directory, and no store path changes. After the assertions print exactly one stdout line containing the declared marker. The current channel has no same-upstream hydra-slayer package or equivalent audit hit. Research did not run a build because the host explicitly has no Guix daemon; authoritative Makefile metadata establishes source-buildability but not package proof. Acceptance remains the issue's Guix lint/build/check gates plus the isolated smoke and screenshot at the declared artifact path. ## 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. <!-- goocastle-runtime-evidence-contract --> ## Runtime evidence contract Implementation workflow: `guix-package-quality-gates` Reviewed contract file: `.goocastle/runtime-evidence-contracts.json` Required proof phase: `safe-package-proof`; screenshot phase: `runtime-screenshot` Evidence adapter: `github-issue-comment` Copy this reviewed contract into the named file before running the package proof workflow. ```json { "version": 1, "contracts": [ { "issueNumber": 697, "packageName": "hydra-slayer", "packageModulePath": "tay/packages/hydra-slayer.scm", "artifactPath": ".goocastle/evidence/issue-697.png", "runtime": { "executable": "hydra", "invocation": { "file": "hydra", "args": [ "--guix-smoke" ] }, "successMarker": "HYDRA_SLAYER_GUIX_SMOKE_OK: new-game, turn, save-load, isolated-state" } } ] } ``` <!-- goocastle-runtime-evidence-contract-end --> --- Imported from [GitHub issue/PR](https://github.com/htayj/guix-channel/issues/697). Originally posted by [htayj](https://github.com/htayj) on 2026-09-09T00:27:54Z.
htayj commented 2026-09-09 01:11:29 +00:00 (Migrated from github.com)

Goocastle verified runtime evidence.

Runtime screenshot

Runtime receipt
  • Package: hydra-slayer
  • Safe package proof phase: safe-package-proof
  • Safe package proof argv: ["node","/opt/goocastle/bin/guix-package-proof.mjs","--package-name","hydra-slayer","--module-path","tay/packages/hydra-slayer.scm","--runtime-json","{&quot;executable&quot;:&quot;hydra&quot;,&quot;invocation&quot;:{&quot;file&quot;:&quot;hydra&quot;,&quot;args&quot;:[&quot;--guix-smoke&quot;]},&quot;successMarker&quot;:&quot;HYDRA_SLAYER_GUIX_SMOKE_OK: new-game, turn, save-load, isolated-state&quot;}"]
  • Screenshot phase: runtime-screenshot
  • Screenshot argv: ["sh",".goocastle/capture-guix-package-screenshot.sh"]
  • Runtime executable (Guix store/profile): /gnu/store/6jj4r3nm2cq8p1fz0kd6cz9i6n3b2nvq-hydra-slayer-18.3/bin/hydra
  • Runtime invocation: ["/gnu/store/6jj4r3nm2cq8p1fz0kd6cz9i6n3b2nvq-hydra-slayer-18.3/bin/hydra","--guix-smoke"]
  • Expected runtime invocation: ["hydra","--guix-smoke"]
  • Expected runtime marker: HYDRA_SLAYER_GUIX_SMOKE_OK: new-game, turn, save-load, isolated-state
  • Per-issue runtime contract: .goocastle/runtime-evidence-contracts.json (issue #697, SHA-256 f177eae31c038866e95f8ba115224fec38c2b186b617c809ffddbace7aecca52)
  • Artifact path: .goocastle/evidence/issue-697.png
  • Artifact SHA-256: ce5688feb7e753d9faa746c8ad63e78f5ef51bd0075ea151279182e48a6464a2
  • Artifact commit: 905ca5868cd01c2e651b536cf87e9d4aec8e60d1
  • Artifact size/format: 29589 bytes / png

Imported from GitHub comment. Originally posted by htayj on 2026-09-09T01:11:29Z.

<!-- goocastle-runtime-evidence:sequential-reviewer:697:1:ce5688feb7e753d9faa746c8ad63e78f5ef51bd0075ea151279182e48a6464a2 --> Goocastle verified runtime evidence. ![Runtime screenshot](https://github.com/htayj/guix-channel/blob/905ca5868cd01c2e651b536cf87e9d4aec8e60d1/.goocastle/evidence/issue-697.png?raw=1) <details><summary>Runtime receipt</summary> - Package: <code>hydra-slayer</code> - Safe package proof phase: <code>safe-package-proof</code> - Safe package proof argv: <code>[&quot;node&quot;,&quot;/opt/goocastle/bin/guix-package-proof.mjs&quot;,&quot;--package-name&quot;,&quot;hydra-slayer&quot;,&quot;--module-path&quot;,&quot;tay/packages/hydra-slayer.scm&quot;,&quot;--runtime-json&quot;,&quot;{\&quot;executable\&quot;:\&quot;hydra\&quot;,\&quot;invocation\&quot;:{\&quot;file\&quot;:\&quot;hydra\&quot;,\&quot;args\&quot;:[\&quot;--guix-smoke\&quot;]},\&quot;successMarker\&quot;:\&quot;HYDRA_SLAYER_GUIX_SMOKE_OK: new-game, turn, save-load, isolated-state\&quot;}&quot;]</code> - Screenshot phase: <code>runtime-screenshot</code> - Screenshot argv: <code>[&quot;sh&quot;,&quot;.goocastle/capture-guix-package-screenshot.sh&quot;]</code> - Runtime executable (Guix store/profile): <code>/gnu/store/6jj4r3nm2cq8p1fz0kd6cz9i6n3b2nvq-hydra-slayer-18.3/bin/hydra</code> - Runtime invocation: <code>[&quot;/gnu/store/6jj4r3nm2cq8p1fz0kd6cz9i6n3b2nvq-hydra-slayer-18.3/bin/hydra&quot;,&quot;--guix-smoke&quot;]</code> - Expected runtime invocation: <code>[&quot;hydra&quot;,&quot;--guix-smoke&quot;]</code> - Expected runtime marker: <code>HYDRA_SLAYER_GUIX_SMOKE_OK: new-game, turn, save-load, isolated-state</code> - Per-issue runtime contract: <code>.goocastle/runtime-evidence-contracts.json (issue #697, SHA-256 f177eae31c038866e95f8ba115224fec38c2b186b617c809ffddbace7aecca52)</code> - Artifact path: <code>.goocastle/evidence/issue-697.png</code> - Artifact SHA-256: <code>ce5688feb7e753d9faa746c8ad63e78f5ef51bd0075ea151279182e48a6464a2</code> - Artifact commit: <code>905ca5868cd01c2e651b536cf87e9d4aec8e60d1</code> - Artifact size/format: <code>29589 bytes / png</code> </details> --- Imported from [GitHub comment](https://github.com/htayj/guix-channel/issues/697#issuecomment-5594230247). Originally posted by [htayj](https://github.com/htayj) on 2026-09-09T01:11:29Z.
htayj commented 2026-09-09 01:11:33 +00:00 (Migrated from github.com)

Completed by Goocastle


Imported from GitHub comment. Originally posted by htayj on 2026-09-09T01:11:33Z.

Completed by Goocastle --- Imported from [GitHub comment](https://github.com/htayj/guix-channel/issues/697#issuecomment-5594230761). Originally posted by [htayj](https://github.com/htayj) on 2026-09-09T01:11:33Z.
Owner

Published signed, Guix-authenticated commit a2d904dce7. Hydra Slayer output /gnu/store/8lvp0d0kv35y1yqp66n8x8zmlvm2zx12-hydra-slayer-18.3: local source build, --check, offline lint and integrated runtime passed. Direct timeout/user-network-PID namespace replaces Goocastle executor; first-session save and second-session load assertions retained. PNG697 now contains genuine second-session alternate-screen prefix rendered by xterm, replacing mixed-screen historical evidence. #696 is the redundant delivery ticket for the implementation already tracked by #697. Initial source fetch received unexplained SIGTERM; separate source acquisition then succeeded. No timeout/memory-cause claim or host protection changes. make check-source-count check-pyrosimple check-hydra-slayer passed. OMP-only execution; no user profile changes.

Published signed, Guix-authenticated commit a2d904dce7e247fba5dd79bbd22a45234c774712. Hydra Slayer output /gnu/store/8lvp0d0kv35y1yqp66n8x8zmlvm2zx12-hydra-slayer-18.3: local source build, --check, offline lint and integrated runtime passed. Direct timeout/user-network-PID namespace replaces Goocastle executor; first-session save and second-session load assertions retained. PNG697 now contains genuine second-session alternate-screen prefix rendered by xterm, replacing mixed-screen historical evidence. #696 is the redundant delivery ticket for the implementation already tracked by #697. Initial source fetch received unexplained SIGTERM; separate source acquisition then succeeded. No timeout/memory-cause claim or host protection changes. make check-source-count check-pyrosimple check-hydra-slayer passed. OMP-only execution; no user profile changes.
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#697
No description provided.