Nothing linted static/js/, so the JavaScript styleguide REPO_POLICIES.md links to went unchecked. ESLint now lints it in a new js-lint stage of the Dockerfile, on the digest-pinned node 24 LTS image and the yarn that image carries. js-lint starts from a js-deps stage that installs ESLint and stays cached until package.json or yarn.lock changes, so only the lint step re-runs. package.json pins ESLint's version and yarn.lock pins every package's hash. script/lint builds js-lint after the Go lint, and the build stage depends on it, so make check and the image build both fail on a violation.
eslint.config.mjs turns on the two styleguide rules a linter can check, no-var and prefer-const. ESLint's recommended set stays off. The extracted Alpine.js is ignored. static/js/app.js already complied, so it is unchanged.
ESLint prints nothing on a pass, so script/lint cannot require a summary line the way it does for golangci-lint. Instead it names the stage once for both --target and --no-cache-filter. --target fails on a name that matches no stage, so a renamed stage cannot replay a cached pass.
Deviation from the plan on #120: no check of the linter's own output, for the reason above.
Not covered: the styleguide's prettier rule, which is a formatter's job, not a linter's; prettier is #215.
Tried: a var put back into static/js/app.js turned make check red; a let that is never reassigned failed the image build.
Model: opus-5-5
Nothing linted `static/js/`, so the JavaScript styleguide `REPO_POLICIES.md` links to went unchecked. ESLint now lints it in a new `js-lint` stage of the `Dockerfile`, on the digest-pinned node 24 LTS image and the yarn that image carries. `js-lint` starts from a `js-deps` stage that installs ESLint and stays cached until `package.json` or `yarn.lock` changes, so only the lint step re-runs. `package.json` pins ESLint's version and `yarn.lock` pins every package's hash. `script/lint` builds `js-lint` after the Go lint, and the build stage depends on it, so `make check` and the image build both fail on a violation.
`eslint.config.mjs` turns on the two styleguide rules a linter can check, `no-var` and `prefer-const`. ESLint's recommended set stays off. The extracted Alpine.js is ignored. `static/js/app.js` already complied, so it is unchanged.
ESLint prints nothing on a pass, so `script/lint` cannot require a summary line the way it does for golangci-lint. Instead it names the stage once for both `--target` and `--no-cache-filter`. `--target` fails on a name that matches no stage, so a renamed stage cannot replay a cached pass.
- Deviation from the plan on https://git.eeqj.de/sneak/webhooker/issues/120: no check of the linter's own output, for the reason above.
- Not covered: the styleguide's prettier rule, which is a formatter's job, not a linter's; prettier is https://git.eeqj.de/sneak/webhooker/issues/215.
- Tried: a `var` put back into `static/js/app.js` turned `make check` red; a `let` that is never reassigned failed the image build.
Model: opus-5-5
Dockerfile (js-lint stage) and script/lint: --no-cache-filter=js-lint re-runs yarn install along with ESLint. That means every make lint, every make check and every commit through the pre-commit hook downloads ESLint and its dependencies again, and fails when the package registry cannot be reached. The Go linter already avoids this: Dockerfile.lint keeps its module download in a deps stage that stays cached and forces only the stage that lints. REPO_POLICIES.md also asks that the dependency install layer stay cached until the manifests change. Acceptable: install ESLint in its own stage (node image, package.json and yarn.lock, yarn install) and start js-lint from that stage, with COPY . . and the ESLint step. script/lint keeps naming only js-lint. Update the script/lint comment (drop "yarn install included") and the Linting section of README.md to match.
README.md, Prerequisites: "The same holds for ESLint, node and yarn" carries over "must not be installed on the host" from the golangci-lint sentence. That is not true of node and yarn: nothing in the repo breaks or changes when they are installed on the host, and REPO_POLICIES.md has script/bootstrap use a host node when one is present. Acceptable: say that ESLint, node and yarn are not prerequisites and that make lint never uses a host copy.
Judgement call: the disclosed deviation (no check of ESLint's own output) is accepted. The reason given holds.
Judgement call: the image build now also downloads from the package registry. This is accepted, since REPO_POLICIES.md has the image build run every check.
Judgement call: the styleguide's yarn run test/yarn run build item is read as covering JavaScript projects, not a manifest that only pins ESLint.
Model: opus-5-5
Review of https://git.eeqj.de/sneak/webhooker/pulls/486 for https://git.eeqj.de/sneak/webhooker/issues/120: needs rework.
1. `Dockerfile` (`js-lint` stage) and `script/lint`: `--no-cache-filter=js-lint` re-runs `yarn install` along with ESLint. That means every `make lint`, every `make check` and every commit through the pre-commit hook downloads ESLint and its dependencies again, and fails when the package registry cannot be reached. The Go linter already avoids this: `Dockerfile.lint` keeps its module download in a `deps` stage that stays cached and forces only the stage that lints. `REPO_POLICIES.md` also asks that the dependency install layer stay cached until the manifests change. Acceptable: install ESLint in its own stage (node image, `package.json` and `yarn.lock`, `yarn install`) and start `js-lint` from that stage, with `COPY . .` and the ESLint step. `script/lint` keeps naming only `js-lint`. Update the `script/lint` comment (drop "yarn install included") and the Linting section of `README.md` to match.
2. `README.md`, Prerequisites: "The same holds for ESLint, node and yarn" carries over "must not be installed on the host" from the golangci-lint sentence. That is not true of node and yarn: nothing in the repo breaks or changes when they are installed on the host, and `REPO_POLICIES.md` has `script/bootstrap` use a host node when one is present. Acceptable: say that ESLint, node and yarn are not prerequisites and that `make lint` never uses a host copy.
- Judgement call: the disclosed deviation (no check of ESLint's own output) is accepted. The reason given holds.
- Judgement call: the image build now also downloads from the package registry. This is accepted, since `REPO_POLICIES.md` has the image build run every check.
- Judgement call: the styleguide's `yarn run test`/`yarn run build` item is read as covering JavaScript projects, not a manifest that only pins ESLint.
Model: opus-5-5
ESLint is now installed in a new js-deps stage, and js-lint starts from it with only COPY . . and the ESLint step; script/lint still names only js-lint, and its comment and the README's Linting section say the install stays cached.
Prerequisites now says ESLint, node and yarn are not prerequisites and make lint never uses a host copy of them.
A second make lint reused the install and still ran ESLint: a var in static/js/app.js turned it red.
Judgement call: dropped the PR body's line saying every make lint downloads ESLint again, since it is no longer true, and named js-deps there.
Model: opus-5-5
Rework of https://git.eeqj.de/sneak/webhooker/pulls/486:
1. ESLint is now installed in a new `js-deps` stage, and `js-lint` starts from it with only `COPY . .` and the ESLint step; `script/lint` still names only `js-lint`, and its comment and the README's Linting section say the install stays cached.
2. Prerequisites now says ESLint, node and yarn are not prerequisites and `make lint` never uses a host copy of them.
A second `make lint` reused the install and still ran ESLint: a `var` in `static/js/app.js` turned it red.
- Judgement call: dropped the PR body's line saying every `make lint` downloads ESLint again, since it is no longer true, and named `js-deps` there.
Model: opus-5-5
.dockerignore and README.md (Docker section, item 3): the rework moved the ESLint install into the new js-deps stage, but these two places still say one stage installs ESLint and runs it. .dockerignore says "The js-lint stage installs ESLint itself". Item 3 calls it the "JavaScript lint stage" that "installs ESLint from yarn.lock and runs it", and item 4 names that stage js-lint. Neither is true of the tree: js-deps installs ESLint, and js-lint only copies the source and runs ESLint. Acceptable: .dockerignore says js-deps installs ESLint and a host copy would overwrite it at js-lint's COPY . .. Item 3 becomes "JavaScript lint stages" and says js-deps installs ESLint from yarn.lock and js-lint runs it over static/js/.
Judgement call: both sentences were true before the install moved to js-deps, so they count as introduced by this rework.
Model: opus-5-5
Re-review of https://git.eeqj.de/sneak/webhooker/pulls/486 for https://git.eeqj.de/sneak/webhooker/issues/120: needs rework.
1. `.dockerignore` and `README.md` (Docker section, item 3): the rework moved the ESLint install into the new `js-deps` stage, but these two places still say one stage installs ESLint and runs it. `.dockerignore` says "The js-lint stage installs ESLint itself". Item 3 calls it the "JavaScript lint stage" that "installs ESLint from `yarn.lock` and runs it", and item 4 names that stage `js-lint`. Neither is true of the tree: `js-deps` installs ESLint, and `js-lint` only copies the source and runs ESLint. Acceptable: `.dockerignore` says `js-deps` installs ESLint and a host copy would overwrite it at `js-lint`'s `COPY . .`. Item 3 becomes "JavaScript lint stages" and says `js-deps` installs ESLint from `yarn.lock` and `js-lint` runs it over `static/js/`.
- Judgement call: both sentences were true before the install moved to `js-deps`, so they count as introduced by this rework.
Model: opus-5-5
ESLint, pinned by package.json and yarn.lock, runs in a new js-lint
stage of the Dockerfile on the pinned node 24 LTS image. It starts from
a js-deps stage that installs ESLint and stays cached until those two
files change. script/lint builds js-lint after the Go lint, and the
build stage depends on it, so make check and the image build both fail
on a violation. eslint.config.mjs turns on the styleguide's checkable
rules: no-var and prefer-const.
Model: opus-5-5
.dockerignore now says the js-deps stage installs ESLint and a host copy would overwrite it at the js-lint stage's COPY . .. Item 3 of the README's Docker section is now "JavaScript lint stages": js-deps installs ESLint from yarn.lock and js-lint runs it over static/js/. Item 4 already names js-lint as the stage the builder depends on, so it is unchanged.
The other sentences in the PR that name a stage already match the tree and are unchanged. Rebased onto current next.
Judgement call: the directory listing's package.json / yarn.lock line ("ESLint, pinned, for the JavaScript lint stage") is left as is, since js-lint is the stage that runs ESLint.
Model: opus-5-5
Rework of https://git.eeqj.de/sneak/webhooker/pulls/486:
1. `.dockerignore` now says the `js-deps` stage installs ESLint and a host copy would overwrite it at the `js-lint` stage's `COPY . .`. Item 3 of the README's Docker section is now "JavaScript lint stages": `js-deps` installs ESLint from `yarn.lock` and `js-lint` runs it over `static/js/`. Item 4 already names `js-lint` as the stage the builder depends on, so it is unchanged.
The other sentences in the PR that name a stage already match the tree and are unchanged. Rebased onto current `next`.
- Judgement call: the directory listing's `package.json / yarn.lock` line ("ESLint, pinned, for the JavaScript lint stage") is left as is, since `js-lint` is the stage that runs ESLint.
Model: opus-5-5
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.
Nothing linted
static/js/, so the JavaScript styleguideREPO_POLICIES.mdlinks to went unchecked. ESLint now lints it in a newjs-lintstage of theDockerfile, on the digest-pinned node 24 LTS image and the yarn that image carries.js-lintstarts from ajs-depsstage that installs ESLint and stays cached untilpackage.jsonoryarn.lockchanges, so only the lint step re-runs.package.jsonpins ESLint's version andyarn.lockpins every package's hash.script/lintbuildsjs-lintafter the Go lint, and the build stage depends on it, somake checkand the image build both fail on a violation.eslint.config.mjsturns on the two styleguide rules a linter can check,no-varandprefer-const. ESLint's recommended set stays off. The extracted Alpine.js is ignored.static/js/app.jsalready complied, so it is unchanged.ESLint prints nothing on a pass, so
script/lintcannot require a summary line the way it does for golangci-lint. Instead it names the stage once for both--targetand--no-cache-filter.--targetfails on a name that matches no stage, so a renamed stage cannot replay a cached pass.varput back intostatic/js/app.jsturnedmake checkred; aletthat is never reassigned failed the image build.Model: opus-5-5
Review of #486 for #120: needs rework.
Dockerfile(js-lintstage) andscript/lint:--no-cache-filter=js-lintre-runsyarn installalong with ESLint. That means everymake lint, everymake checkand every commit through the pre-commit hook downloads ESLint and its dependencies again, and fails when the package registry cannot be reached. The Go linter already avoids this:Dockerfile.lintkeeps its module download in adepsstage that stays cached and forces only the stage that lints.REPO_POLICIES.mdalso asks that the dependency install layer stay cached until the manifests change. Acceptable: install ESLint in its own stage (node image,package.jsonandyarn.lock,yarn install) and startjs-lintfrom that stage, withCOPY . .and the ESLint step.script/lintkeeps naming onlyjs-lint. Update thescript/lintcomment (drop "yarn install included") and the Linting section ofREADME.mdto match.README.md, Prerequisites: "The same holds for ESLint, node and yarn" carries over "must not be installed on the host" from the golangci-lint sentence. That is not true of node and yarn: nothing in the repo breaks or changes when they are installed on the host, andREPO_POLICIES.mdhasscript/bootstrapuse a host node when one is present. Acceptable: say that ESLint, node and yarn are not prerequisites and thatmake lintnever uses a host copy.REPO_POLICIES.mdhas the image build run every check.yarn run test/yarn run builditem is read as covering JavaScript projects, not a manifest that only pins ESLint.Model: opus-5-5
62f8d8578eto4a514b9cceRework of #486:
js-depsstage, andjs-lintstarts from it with onlyCOPY . .and the ESLint step;script/lintstill names onlyjs-lint, and its comment and the README's Linting section say the install stays cached.make lintnever uses a host copy of them.A second
make lintreused the install and still ran ESLint: avarinstatic/js/app.jsturned it red.make lintdownloads ESLint again, since it is no longer true, and namedjs-depsthere.Model: opus-5-5
Re-review of #486 for #120: needs rework.
.dockerignoreandREADME.md(Docker section, item 3): the rework moved the ESLint install into the newjs-depsstage, but these two places still say one stage installs ESLint and runs it..dockerignoresays "The js-lint stage installs ESLint itself". Item 3 calls it the "JavaScript lint stage" that "installs ESLint fromyarn.lockand runs it", and item 4 names that stagejs-lint. Neither is true of the tree:js-depsinstalls ESLint, andjs-lintonly copies the source and runs ESLint. Acceptable:.dockerignoresaysjs-depsinstalls ESLint and a host copy would overwrite it atjs-lint'sCOPY . .. Item 3 becomes "JavaScript lint stages" and saysjs-depsinstalls ESLint fromyarn.lockandjs-lintruns it overstatic/js/.js-deps, so they count as introduced by this rework.Model: opus-5-5
4a514b9ccetoe82b1cc3dfRework of #486:
.dockerignorenow says thejs-depsstage installs ESLint and a host copy would overwrite it at thejs-lintstage'sCOPY . .. Item 3 of the README's Docker section is now "JavaScript lint stages":js-depsinstalls ESLint fromyarn.lockandjs-lintruns it overstatic/js/. Item 4 already namesjs-lintas the stage the builder depends on, so it is unchanged.The other sentences in the PR that name a stage already match the tree and are unchanged. Rebased onto current
next.package.json / yarn.lockline ("ESLint, pinned, for the JavaScript lint stage") is left as is, sincejs-lintis the stage that runs ESLint.Model: opus-5-5
Re-review of #486 for #120: passed.
Model: opus-5-5