Commit a62e73b
feat: make the Containerfile and devcontainer runnable (wave-2 3/8) (#44)
## What changed & why
Finalizes wave-2 work order
`.claude/tasks/prod-readiness/w2-3-containers.md`.
The implementation commit (`3d43043`) was already on
`feat/containers-runnable`
and pushed to origin, but no PR had been opened, so the new
`.github/workflows/container-build.yml` had never actually executed in
CI
(`gh run list --branch feat/containers-runnable` showed only an
unrelated,
skipped "Push email notification" run — the workflow only triggers on
`push`-to-`main` or `pull_request`-to-`main`, neither of which had
happened).
This PR's only change vs. the prior state of the branch is opening it,
which
is required for the acceptance criterion "CI build job green on the PR"
to be
checkable at all.
- `Containerfile` — rebased off `docker.io/library/julia:1.10` pinned by
digest (matches the `julia_version` pinned in the committed
`Manifest.toml`/`.tool-versions`), instantiates + precompiles the
committed Manifest, runs as a non-root `statistikles` user, and sets
`ENTRYPOINT ["julia", "--project=/app", "-e", "using Statistikles;
main()"]`
— the real entry point in `src/tools/chat.jl`. No commented-out template
blocks remain.
- `.dockerignore` — new, trims the build context (`.git/`, `.github/`,
`docs/`, `proofs/`, `ffi/`, etc.).
- `.devcontainer/devcontainer.json` — adds the
`ghcr.io/julialang/devcontainer-features/julia:1` feature pinned to the
`1.10` channel, and switches `postCreateCommand` from the wave-1-era
no-op
`just deps` to the real `just setup` (wave-1 PR #34 made `just setup` a
real `Pkg.instantiate()`). `.devcontainer/Containerfile` (Wolfi-based,
`remoteUser: nonroot`) and its existing git/just/nickel features are
untouched — they're real and out of scope.
- `.github/workflows/container-build.yml` — new. Builds the root
`Containerfile` with `docker build` on `pull_request`/`push` to `main`
(path-filtered to `Containerfile`, `.dockerignore`, `Project.toml`,
`Manifest.toml`, `src/**`, and the workflow file itself) plus
`workflow_dispatch`. Build only, no push/registry login.
`actions/checkout` is SHA-pinned with a version comment; no job-level
`hashFiles()`/`secrets` conditionals. A smoke step then runs the built
image and greps its stdout for the documented offline-demo banner lines.
- `QUICKSTART-USER.adoc` / `QUICKSTART-MAINTAINER.adoc` — reconciled
with the
now-real image: exact `podman build`/`podman run` commands (docker works
identically), plus a documented caveat (verified by testing both the
container and a native WSL Julia run) that `STATISTIKLES_LM_URL` set at
`run` time has no effect on a precompiled image/install, because
`Pkg.precompile()` bakes the `ENV`-derived `BASE_URL` constant
(`src/tools/lmstudio.jl`) into the precompile cache — a pre-existing
`lmstudio.jl` behavior, out of scope for this task, documented rather
than
silently left broken.
## Process note (raised by review, not a code defect)
The existing commit's trailer reads `Co-Authored-By: Claude Opus 4.8 (1M
context)`, while the wave-2 routing table in
`.claude/tasks/prod-readiness/README.md` assigns
`impl=sonnet`/`verify=sonnet`
to this task. Checked and worth recording: the fleet's execution
contract
fixes that exact trailer string across all tasks regardless of which
model
actually executes (it is not a literal per-task model attestation) —
this
finalize pass itself runs under the same fixed-trailer convention. No
code
change was needed or made for this.
## Verification run & result
- No new code changes were required — the branch was already fully
pushed
and matched the work order. Confirmed via `git fetch origin
feat/containers-runnable` + `git diff origin/main..HEAD --stat` (7 files
changed, matches the commit's own description) and `git status`
(clean, nothing to commit).
- Confirmed via `gh pr list --repo hyperpolymath/statistikles --head
feat/containers-runnable --state all` (empty) that no PR previously
existed, and via `gh run list --repo hyperpolymath/statistikles --branch
feat/containers-runnable` that no `Container Build` run had ever
executed
on this branch — consistent with the reviewer's finding.
- Re-read `Containerfile`, `.github/workflows/container-build.yml`,
`.devcontainer/devcontainer.json`, and the `.adoc` diffs in full: no
commented-out template blocks remain, the workflow is path-filtered and
SHA-pinned, and the devcontainer's separate Wolfi-based
`.devcontainer/Containerfile` (`remoteUser: nonroot`) is unrelated to
and
unaffected by the root `Containerfile`'s new `statistikles` non-root
user.
- Did not re-run `docker build`/`docker run` myself in this pass — the
reviewer's own note states their local WSL `docker build`/`docker run`
reproduction already succeeded and matched the PR's claims exactly. This
PR now lets `.github/workflows/container-build.yml` run for real in CI
as
the authoritative, checkable confirmation of the acceptance criterion.
- Opening this PR is expected to trigger the `Container Build` workflow
via
its `pull_request`-to-`main` trigger (paths touched: `Containerfile`,
`.dockerignore`, `.github/workflows/container-build.yml`). Not merging,
per the execution contract.
## Skipped / out of scope
Publishing images to a registry, multi-arch builds, and Guix packaging
(separate task `w2-2-guix-package.md`, already merged as #39) — all
explicitly out of scope per the work order.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>1 parent 01eee40 commit a62e73b
7 files changed
Lines changed: 173 additions & 41 deletions
File tree
- .devcontainer
- .github/workflows
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
8 | | - | |
| 8 | + | |
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
| |||
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
28 | | - | |
| 28 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
21 | | - | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
22 | 25 | | |
23 | 26 | | |
24 | | - | |
| 27 | + | |
25 | 28 | | |
26 | 29 | | |
27 | 30 | | |
| |||
34 | 37 | | |
35 | 38 | | |
36 | 39 | | |
| 40 | + | |
37 | 41 | | |
38 | 42 | | |
39 | 43 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
8 | | - | |
9 | | - | |
10 | | - | |
11 | | - | |
12 | | - | |
13 | | - | |
14 | | - | |
15 | | - | |
16 | | - | |
17 | | - | |
18 | | - | |
19 | | - | |
20 | | - | |
21 | | - | |
22 | | - | |
23 | | - | |
24 | | - | |
25 | | - | |
26 | | - | |
27 | | - | |
28 | | - | |
29 | | - | |
30 | | - | |
31 | | - | |
32 | | - | |
33 | | - | |
34 | | - | |
35 | | - | |
36 | | - | |
37 | | - | |
38 | | - | |
39 | | - | |
40 | | - | |
41 | | - | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
45 | 45 | | |
46 | 46 | | |
47 | 47 | | |
48 | | - | |
49 | | - | |
50 | | - | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
51 | 80 | | |
52 | 81 | | |
53 | 82 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
37 | 37 | | |
38 | 38 | | |
39 | 39 | | |
| 40 | + | |
| 41 | + | |
40 | 42 | | |
41 | 43 | | |
42 | 44 | | |
| |||
56 | 58 | | |
57 | 59 | | |
58 | 60 | | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
59 | 78 | | |
60 | 79 | | |
61 | 80 | | |
| |||
0 commit comments