Skip to content

feat: real Deno+Just container packaging (Containerfile) - #72

Merged
hyperpolymath merged 1 commit into
mainfrom
feat/container-packaging
Jul 27, 2026
Merged

feat: real Deno+Just container packaging (Containerfile)#72
hyperpolymath merged 1 commit into
mainfrom
feat/container-packaging

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

Summary

  • Nix was retired estate-wide 2026-06-01 (Guix is now primary, no Nix
    fallback). A bare flake.nix no longer satisfies the governance
    container-packaging gate; a sealed Containerfile is the accepted
    interim escape hatch. flake.nix is left in place here — the Guix
    side (guix.scm) isn't working for this repo yet.
  • Replaces the prior stub Containerfile, which only had a commented-
    out example RUN line for the AffineScript build and pulled in
    nodejs — Node/npm are estate-banned; Deno is the sanctioned JS
    runtime. That stub also referenced artifact paths (selur,
    erlang-shipping-libs) that no real build step in the file produced.
  • New Containerfile installs Deno and Just for real (wolfi-base
    apk packages) and runs genuine checks against the current tree in the
    build stage:
    • deno task check — the root deno.json "check" task. Its target
      glob (app/assets/javascripts/**/*.js) doesn't exist in this repo
      yet, so Deno reports "no matching files" and exits 0 — a real,
      honest pass reflecting current repo state, not a fake gate.
    • just test-structure (tests/validate_structure.sh)
    • just test-frontend-structure (tests/validate_frontend.sh)
    • just validate-rsr (RSR compliance file-presence check)
  • deno.lock ships as an empty (0-byte) file in this repo, which Deno
    2.x treats as corrupt and refuses to run any command against. The
    build stage regenerates a minimal valid lockfile inside the image
    so the checks above can execute — the committed deno.lock in git is
    untouched by this PR.
  • Runtime stage runs as non-root (USER nonroot, wolfi-base's built-in
    uid 65532 account); ENTRYPOINT ["just"] / CMD ["test-structure"].
  • Scope note: candy-crash is a multi-language repo (Gleam backend,
    AffineScript/ReScript frontend, SPARK/Ada + Zig safety_core,
    VeriSimDB, Gossamer, Burble). This image packages the Deno + Just
    slice only, per this container-packaging task's mandate — it does not
    attempt to containerize the rest of the stack.

Verified build result

$ podman build -t candy-crash-verify:latest -f Containerfile .
...
Successfully tagged localhost/candy-crash-verify:latest
$ echo $?
0

podman run --rm candy-crash-verify:latest runs just test-structure
and exits 0 as the non-root user.

Test plan

  • podman build -t candy-crash-verify:latest -f Containerfile . exits 0
  • podman run --rm candy-crash-verify:latest exits 0
  • Owner review of scope decision (Deno+Just only, not the full
    Gleam/AffineScript/SPARK stack)
  • Owner decision on whether to fix the committed deno.lock /
    app/assets/javascripts glob mismatch in a follow-up

🤖 Generated with Claude Code

Nix was retired estate-wide 2026-06-01; flake.nix no longer satisfies
the governance gate, and this repo's Guix side isn't working yet, so a
sealed Containerfile is the accepted interim escape hatch.

Replaces the prior stub Containerfile, which only offered a commented-
out example RUN line and pulled in nodejs (estate-banned; Deno is the
sanctioned JS runtime). The new Containerfile installs Deno and Just
for real via wolfi-base apk packages and runs genuine checks against
the current tree: `deno task check`, `just test-structure`,
`just test-frontend-structure`, and `just validate-rsr`. It also
regenerates the repo's 0-byte (corrupt) deno.lock inside the image so
Deno commands can execute at all — the committed deno.lock is untouched.

Verified: `podman build -t candy-crash-verify:latest -f Containerfile .`
exits 0, and `podman run --rm candy-crash-verify:latest` runs the
structural check successfully as the non-root `nonroot` user.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@hyperpolymath
hyperpolymath marked this pull request as ready for review July 27, 2026 16:13
@hyperpolymath
hyperpolymath merged commit 7a7ad8c into main Jul 27, 2026
19 of 24 checks passed
@hyperpolymath
hyperpolymath deleted the feat/container-packaging branch July 27, 2026 16:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant