Sub-issue 1 of 2, split out of issue #104 because #104 as written could not be completed inside a single agent run. This is the mechanical half; the verification half is tracked separately.
Owner ruling (sneak, 2026-08-09): every lint run happens inside a Docker container, invoked through the script/ entrypoint. Reference implementation is sneak/homoicon — copy its shape.
Current state (next)
script/lint runs golangci-lint run on the host, falling back to nix-shell -p pkg-config vips libheif golangci-lint git --run. That host path is what allowed a lint run in this repo to report findings whose paths pointed into a different agent's worktree. There is no Dockerfile.lint at the repo root today.
Definition of done
Root Dockerfile.lint, FROM golangci/golangci-lint:v2.12.2@sha256:5cceeef04e53efe1470638d4b4b4f5ceefd574955ab3941b2d9a68a8c9ad5240, which COPYs the repo in and runs golangci-lint run --config .golangci.yml ./...as a build step — a successful build IS a clean lint.
script/lint reduced to building that image. No host golangci-lint invocation and no nix-shell lint path remains anywhere.
make lint and make check still green.
Out of scope
Proving the gate actually executes the linter (layer-cache defeat, negative control) — that is sub-issue 2. Do not close#104 from this PR.
Constraints
The image reference MUST stay hash-pinned. An unpinned image is an automatic fail per REPO_POLICIES.md.
Base branch is next, not main.
Sub-issue 1 of 2, split out of [issue #104](https://git.eeqj.de/sneak/pixa/issues/104) because #104 as written could not be completed inside a single agent run. This is the mechanical half; the verification half is tracked separately.
Owner ruling (sneak, 2026-08-09): every lint run happens inside a Docker container, invoked through the `script/` entrypoint. Reference implementation is `sneak/homoicon` — copy its shape.
## Current state (`next`)
`script/lint` runs `golangci-lint run` on the host, falling back to `nix-shell -p pkg-config vips libheif golangci-lint git --run`. That host path is what allowed a lint run in this repo to report findings whose paths pointed into a *different agent's worktree*. There is no `Dockerfile.lint` at the repo root today.
## Definition of done
1. Root `Dockerfile.lint`, `FROM golangci/golangci-lint:v2.12.2@sha256:5cceeef04e53efe1470638d4b4b4f5ceefd574955ab3941b2d9a68a8c9ad5240`, which COPYs the repo in and runs `golangci-lint run --config .golangci.yml ./...` **as a build step** — a successful build IS a clean lint.
2. `script/lint` reduced to building that image. No host `golangci-lint` invocation and no nix-shell lint path remains anywhere.
3. `make lint` and `make check` still green.
## Out of scope
Proving the gate actually executes the linter (layer-cache defeat, negative control) — that is sub-issue 2. Do not close #104 from this PR.
## Constraints
- The image reference MUST stay hash-pinned. An unpinned image is an automatic fail per REPO_POLICIES.md.
- Base branch is `next`, not `main`.
clawbot
added this to the 1.0.0 milestone 2026-09-04 00:02:04 +02:00
Closed at sneak's instruction, 2026-09-05: this was opened by an agent running on another machine outside the managed fleet, under superseded rules. Reopen if the content is wanted.
Model: fable-5-1
Closed at sneak's instruction, 2026-09-05: this was opened by an agent running on another machine outside the managed fleet, under superseded rules. Reopen if the content is wanted.
Model: fable-5-1
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Sub-issue 1 of 2, split out of issue #104 because #104 as written could not be completed inside a single agent run. This is the mechanical half; the verification half is tracked separately.
Owner ruling (sneak, 2026-08-09): every lint run happens inside a Docker container, invoked through the
script/entrypoint. Reference implementation issneak/homoicon— copy its shape.Current state (
next)script/lintrunsgolangci-lint runon the host, falling back tonix-shell -p pkg-config vips libheif golangci-lint git --run. That host path is what allowed a lint run in this repo to report findings whose paths pointed into a different agent's worktree. There is noDockerfile.lintat the repo root today.Definition of done
Dockerfile.lint,FROM golangci/golangci-lint:v2.12.2@sha256:5cceeef04e53efe1470638d4b4b4f5ceefd574955ab3941b2d9a68a8c9ad5240, which COPYs the repo in and runsgolangci-lint run --config .golangci.yml ./...as a build step — a successful build IS a clean lint.script/lintreduced to building that image. No hostgolangci-lintinvocation and no nix-shell lint path remains anywhere.make lintandmake checkstill green.Out of scope
Proving the gate actually executes the linter (layer-cache defeat, negative control) — that is sub-issue 2. Do not close #104 from this PR.
Constraints
next, notmain.Closed at sneak's instruction, 2026-09-05: this was opened by an agent running on another machine outside the managed fleet, under superseded rules. Reopen if the content is wanted.
Model: fable-5-1