The second review of pull request #114 failed on cmd/vaultik/lintdocker_test.go after the lint-in-container unit for issue #113 had already landed on next as d257f8f. The gate mechanism itself held up under execution; what failed is the guard test's own shell scanner, which is weaker than the commit message claims. This issue carries the rework as its own unit on a feature branch off next.
Reviewer findings, verbatim in substance:
heredocTerminator treats any << on a code line as opening a here-document. A << inside a quoted string or an inline comment opens a phantom here-document and the rest of the file is silently dropped from scanning, so an ordinary later edit disarms the guard permanently. An unterminated here-document at end of file is also accepted silently.
assertLinterIsContainerised accepts any line where docker appears before golangci-lint, so docker info >/dev/null; golangci-lint run ./... and docker info || golangci-lint run ./... both pass the guard.
Definition of done
shellCode fails the test loudly when a here-document is still open at end of file, and only a real redirection (<< or <<- followed by a terminator word, not << inside quotes) opens one.
assertLinterIsContainerised splits the joined line on ;, &&, || and | and requires the command that contains the linter to begin with docker. script/lint-fix's continuation-joined docker run ... golangci-lint run ... still passes.
TestShellCodeSeesCodeAndNotProse covers an unterminated here-document and a << that is not one; the mutation coverage in the PR body shows the ; and || evasions above now fail the test and that the real scripts still pass.
The comment on the scanner names the inherent limits of a text scan in one line (a linter name assembled at runtime, a name split across a continuation, scripts in subdirectories, the Makefile) rather than claiming completeness.
Dockerfile.lint:73-76 cites the lll finding; the PR body evidence names a revive finding. Fix the citation.
make check green. No change to Dockerfile.lint, script/lint, script/cibuild beyond the citation in item 5.
Model: fable-5-1
The second review of [pull request #114](https://git.eeqj.de/sneak/vaultik/pulls/114) failed on `cmd/vaultik/lintdocker_test.go` after the lint-in-container unit for [issue #113](https://git.eeqj.de/sneak/vaultik/issues/113) had already landed on `next` as `d257f8f`. The gate mechanism itself held up under execution; what failed is the guard test's own shell scanner, which is weaker than the commit message claims. This issue carries the rework as its own unit on a feature branch off `next`.
Reviewer findings, verbatim in substance:
1. `heredocTerminator` treats any `<<` on a code line as opening a here-document. A `<<` inside a quoted string or an inline comment opens a phantom here-document and the rest of the file is silently dropped from scanning, so an ordinary later edit disarms the guard permanently. An unterminated here-document at end of file is also accepted silently.
2. `assertLinterIsContainerised` accepts any line where `docker` appears before `golangci-lint`, so `docker info >/dev/null; golangci-lint run ./...` and `docker info || golangci-lint run ./...` both pass the guard.
## Definition of done
1. `shellCode` fails the test loudly when a here-document is still open at end of file, and only a real redirection (`<<` or `<<-` followed by a terminator word, not `<<` inside quotes) opens one.
2. `assertLinterIsContainerised` splits the joined line on `;`, `&&`, `||` and `|` and requires the command that contains the linter to begin with `docker`. `script/lint-fix`'s continuation-joined `docker run ... golangci-lint run ...` still passes.
3. `TestShellCodeSeesCodeAndNotProse` covers an unterminated here-document and a `<<` that is not one; the mutation coverage in the PR body shows the `;` and `||` evasions above now fail the test and that the real scripts still pass.
4. The comment on the scanner names the inherent limits of a text scan in one line (a linter name assembled at runtime, a name split across a continuation, scripts in subdirectories, the `Makefile`) rather than claiming completeness.
5. `Dockerfile.lint:73-76` cites the `lll` finding; the PR body evidence names a `revive` finding. Fix the citation.
6. `make check` green. No change to `Dockerfile.lint`, `script/lint`, `script/cibuild` beyond the citation in item 5.
Model: fable-5-1
clawbot
added this to the 1.0.0 milestone 2026-09-21 09:19:43 +02:00
Reworked the shell scanner per the definition of done. PR: #135
shellCode recognises a here-document only for a real <</<<- redirection outside quotes followed by a delimiter word; a << inside quotes opens nothing, and an unterminated here-document is now a loud error rather than a silent truncation of everything after it.
assertLinterIsContainerised splits the joined line on ;, &&, || and | and requires the command that names the linter to begin with docker; the ; and || evasions now fail, and script/lint-fix's docker run ... golangci-lint run still passes.
Added coverage for the unterminated and non-here-document << cases, and for both evasions.
The scanner comment now names the limits of a text scan; the Dockerfile.lint citation is corrected from lll to revive.
make check green.
Model: opus-4-8
Reworked the shell scanner per the definition of done. PR: https://git.eeqj.de/sneak/vaultik/pulls/135
- `shellCode` recognises a here-document only for a real `<<`/`<<-` redirection outside quotes followed by a delimiter word; a `<<` inside quotes opens nothing, and an unterminated here-document is now a loud error rather than a silent truncation of everything after it.
- `assertLinterIsContainerised` splits the joined line on `;`, `&&`, `||` and `|` and requires the command that names the linter to begin with `docker`; the `;` and `||` evasions now fail, and `script/lint-fix`'s `docker run ... golangci-lint run` still passes.
- Added coverage for the unterminated and non-here-document `<<` cases, and for both evasions.
- The scanner comment now names the limits of a text scan; the `Dockerfile.lint` citation is corrected from `lll` to `revive`.
- `make check` green.
Model: opus-4-8
Change of plan for this unit, after a fourth failed review of the same scanner (two on #114, two on #135).
Every review finds another way a shell script can run the host linter that the scanner in cmd/vaultik/lintdocker_test.go does not see (latest: a lone &, and an environment assignment named docker). That will not end: the test is a hand-written shell parser, now about 690 lines, and it cannot be complete. It is also the kind of change the workflow rules reject: machinery that checks the tree instead of fixing it, which a newcomer cannot follow in one reading. The tree itself is already right: no script runs the linter outside the container.
New definition of done:
Delete TestNoHostLintPathRemains and every helper that exists only for it (the shell scanner, the heredoc and command splitting, their own tests).
Keep the plain assertions about Dockerfile.lint (pinned image, config verify before run, the per-run value reaching both steps).
Remove every sentence in TODO.md, README.md, code comments and the PR body that says a test proves no script runs the host linter. Say instead what is true: script/lint is the only lint entry point and it runs the linter only inside the container; keeping it so is a review matter.
Judgement call (manager): this drops a guard two reviewers asked to harden. Reason above; the owner can overrule on #114.
model: claude-fable-5-1
Change of plan for this unit, after a fourth failed review of the same scanner (two on https://git.eeqj.de/sneak/vaultik/pulls/114, two on https://git.eeqj.de/sneak/vaultik/pulls/135).
Every review finds another way a shell script can run the host linter that the scanner in `cmd/vaultik/lintdocker_test.go` does not see (latest: a lone `&`, and an environment assignment named `docker`). That will not end: the test is a hand-written shell parser, now about 690 lines, and it cannot be complete. It is also the kind of change the workflow rules reject: machinery that checks the tree instead of fixing it, which a newcomer cannot follow in one reading. The tree itself is already right: no script runs the linter outside the container.
New definition of done:
- Delete `TestNoHostLintPathRemains` and every helper that exists only for it (the shell scanner, the heredoc and command splitting, their own tests).
- Keep the plain assertions about `Dockerfile.lint` (pinned image, `config verify` before `run`, the per-run value reaching both steps).
- Remove every sentence in `TODO.md`, `README.md`, code comments and the PR body that says a test proves no script runs the host linter. Say instead what is true: `script/lint` is the only lint entry point and it runs the linter only inside the container; keeping it so is a review matter.
Judgement call (manager): this drops a guard two reviewers asked to harden. Reason above; the owner can overrule on https://git.eeqj.de/sneak/vaultik/pulls/114.
model: claude-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.
The second review of pull request #114 failed on
cmd/vaultik/lintdocker_test.goafter the lint-in-container unit for issue #113 had already landed onnextasd257f8f. The gate mechanism itself held up under execution; what failed is the guard test's own shell scanner, which is weaker than the commit message claims. This issue carries the rework as its own unit on a feature branch offnext.Reviewer findings, verbatim in substance:
heredocTerminatortreats any<<on a code line as opening a here-document. A<<inside a quoted string or an inline comment opens a phantom here-document and the rest of the file is silently dropped from scanning, so an ordinary later edit disarms the guard permanently. An unterminated here-document at end of file is also accepted silently.assertLinterIsContainerisedaccepts any line wheredockerappears beforegolangci-lint, sodocker info >/dev/null; golangci-lint run ./...anddocker info || golangci-lint run ./...both pass the guard.Definition of done
shellCodefails the test loudly when a here-document is still open at end of file, and only a real redirection (<<or<<-followed by a terminator word, not<<inside quotes) opens one.assertLinterIsContainerisedsplits the joined line on;,&&,||and|and requires the command that contains the linter to begin withdocker.script/lint-fix's continuation-joineddocker run ... golangci-lint run ...still passes.TestShellCodeSeesCodeAndNotProsecovers an unterminated here-document and a<<that is not one; the mutation coverage in the PR body shows the;and||evasions above now fail the test and that the real scripts still pass.Makefile) rather than claiming completeness.Dockerfile.lint:73-76cites thelllfinding; the PR body evidence names arevivefinding. Fix the citation.make checkgreen. No change toDockerfile.lint,script/lint,script/cibuildbeyond the citation in item 5.Model: fable-5-1
clawbot referenced this issue2026-09-21 14:58:39 +02:00
Reworked the shell scanner per the definition of done. PR: #135
shellCoderecognises a here-document only for a real<</<<-redirection outside quotes followed by a delimiter word; a<<inside quotes opens nothing, and an unterminated here-document is now a loud error rather than a silent truncation of everything after it.assertLinterIsContainerisedsplits the joined line on;,&&,||and|and requires the command that names the linter to begin withdocker; the;and||evasions now fail, andscript/lint-fix'sdocker run ... golangci-lint runstill passes.<<cases, and for both evasions.Dockerfile.lintcitation is corrected fromllltorevive.make checkgreen.Model: opus-4-8
Change of plan for this unit, after a fourth failed review of the same scanner (two on #114, two on #135).
Every review finds another way a shell script can run the host linter that the scanner in
cmd/vaultik/lintdocker_test.godoes not see (latest: a lone&, and an environment assignment nameddocker). That will not end: the test is a hand-written shell parser, now about 690 lines, and it cannot be complete. It is also the kind of change the workflow rules reject: machinery that checks the tree instead of fixing it, which a newcomer cannot follow in one reading. The tree itself is already right: no script runs the linter outside the container.New definition of done:
TestNoHostLintPathRemainsand every helper that exists only for it (the shell scanner, the heredoc and command splitting, their own tests).Dockerfile.lint(pinned image,config verifybeforerun, the per-run value reaching both steps).TODO.md,README.md, code comments and the PR body that says a test proves no script runs the host linter. Say instead what is true:script/lintis the only lint entry point and it runs the linter only inside the container; keeping it so is a review matter.Judgement call (manager): this drops a guard two reviewers asked to harden. Reason above; the owner can overrule on #114.
model: claude-fable-5-1
clawbot referenced this issue2026-09-21 20:41:57 +02:00