Diffed all 12 script/ files against the models in the prompts repo. Three are byte-identical (check, setup, precommit); nine diverge. Verified on main at fbfe1df.
1. script/docker was edited despite being a must-stay-identical file
REPO_POLICIES.md explicitly names the scripts that stay byte-identical across all repos so they can be maintained centrally — script/projectname, script/docker, and friends. script/docker diverges:
Line 3: the comment "Identical in all repos; the tag comes from script/projectname." — the very line warning against this — was deleted and replaced.
Line 11: docker build -t ... . became timeout 300 docker build -t ... ..
The timeout 300 presumably enforces "Docker builds must complete in under 5 minutes", but that policy does not authorize editing a shared file. If the timeout belongs anywhere it belongs in the model, upstream.
2. script/lint is a duplicate of script/fmt-check — there is no JS linter
Both now run yarn prettier --check .. They are behaviourally identical, so script/check runs the same prettier pass twice and the repo has no actual linter for JavaScript.
README.md:162 acknowledges it: "Add eslint for JS linting (currently lint target runs prettier only)". No eslint config exists anywhere — no .eslintrc*, no eslint.config.js, no eslintConfig key.
Contrast the backend, which has a real linter. The frontend — 1262 lines of JavaScript — has none.
3. Other script divergences
File
Divergence
script/bootstrap
Adds an APT_UPDATED guard and an apt-get update before install — a functional change from the model. Pinned-versions date comment moved 2026-07-06 -> 2026-07-07.
script/fmt
Model: yarn run prettier --write '**/*.md' --tab-width 4 --prose-wrap always. Repo: yarn prettier --write .. The repo version is arguably better for a JS repo (it formats JS/CSS/HTML too, and .prettierrc supplies the flags) but it drops yarn run.
script/fmt-check
Same shape of change as fmt.
script/cibuild
Comment says "The Dockerfile runs make check"; model says script/check. Body identical.
script/install-precommit
Uses the "$hook" variable it declares rather than the literal path. Cosmetic improvement.
Not a finding: all 12 scripts are correct POSIX sh with #!/bin/sh, set -eu, and the mandated repo-root idiom.
4. Makefile gaps
make dev is not a thin shim.Makefile:13-14 runs yarn dev inline; there is no script/dev. This breaks the shim pattern and the "always use Makefile targets instead of invoking the underlying tools directly" rule at the layer below. It is also the only target missing a leading @.
No make build target.REPO_POLICIES.md requires targets "for every common operation... building artifacts (make build)", and CODE_STYLEGUIDE_JS.md prefers make build. package.json has a build script; the Makefile does not expose it. No run, preview, or clean either.
All nine required targets are present. This is about the "Makefile is authoritative documentation" rule, not the required set.
5. .prettierignore hides the backend from formatting
.prettierignore:5 excludes backend/. Since script/fmt-check runs yarn prettier --check ., every markdown file under backend/ escapes make check entirely. backend/README.md's config table is visibly misaligned as a direct result.
6. .claude entries in committed repo config
.dockerignore:5 (.claude) and .prettierignore:5 (.claude/) are agent-tooling residue committed into shared repo configuration. They are additions to the models, inconsistent with each other, and inconsistent with .gitignore, which does not list the directory at all. They should not be in the repo's shared config — a developer-local ignore belongs in .git/info/exclude.
Definition of done
script/docker is restored to the model byte-for-byte. If the 5-minute timeout is worth keeping, propose it upstream in the prompts repo rather than diverging here — note in the PR which you did.
script/lint runs a real JavaScript linter. eslint is the default choice; use its modern flat config (eslint.config.js). script/fmt-check keeps prettier. The two must stop being duplicates.
All lint findings from the new linter are fixed, or the rule is deliberately disabled with a written justification in the config.
make dev shims to a script/dev, consistent with every other target, and gains its leading @.
make build exists and shims to a script/build.
.prettierignore no longer excludes backend/; markdown under backend/ is formatted and passes make fmt-check.
.claude / .claude/ entries are removed from .dockerignore and .prettierignore.
The remaining script divergences are either reverted to the model or, where the repo's version is genuinely better, left in place with a one-line comment in the script saying why it differs. Decide per file and list your decisions in the PR.
README Entrypoints section updated for any new or changed script.
make check passes and still does not modify tracked files.
TODO.md updated in the same commit.
Commit title ends with (closes #N).
Implementation requirements
Scripts stay POSIX sh: #!/bin/sh, set -eu, no bashisms, repo-root idiom $(cd "$(dirname "$0")/.." && pwd -P).
Coordinate with #16, which also restructures script/ to cover the backend. These two overlap heavily — land #16 first and rebase this onto it, or fold this into #16 if the implementer finds them inseparable. Say which in the PR.
Do not change script/test's substance here; #21 owns that.
eslint config choices should follow the JS styleguide; do not invent house rules.
make targets and script/ entrypoints only.
No attribution trailers in the commit message.
## Problem
Diffed all 12 `script/` files against the models in the `prompts` repo. Three are byte-identical (`check`, `setup`, `precommit`); nine diverge. Verified on `main` at `fbfe1df`.
### 1. `script/docker` was edited despite being a must-stay-identical file
`REPO_POLICIES.md` explicitly names the scripts that stay byte-identical across all repos so they can be maintained centrally — `script/projectname`, `script/docker`, and friends. `script/docker` diverges:
- Line 3: the comment "Identical in all repos; the tag comes from script/projectname." — the very line warning against this — was **deleted** and replaced.
- Line 11: `docker build -t ... .` became `timeout 300 docker build -t ... .`.
The `timeout 300` presumably enforces "Docker builds must complete in under 5 minutes", but that policy does not authorize editing a shared file. If the timeout belongs anywhere it belongs in the model, upstream.
### 2. `script/lint` is a duplicate of `script/fmt-check` — there is no JS linter
Both now run `yarn prettier --check .`. They are behaviourally identical, so `script/check` runs the same prettier pass **twice** and the repo has no actual linter for JavaScript.
`README.md:162` acknowledges it: "Add eslint for JS linting (currently lint target runs prettier only)". No eslint config exists anywhere — no `.eslintrc*`, no `eslint.config.js`, no `eslintConfig` key.
Contrast the backend, which has a real linter. The frontend — 1262 lines of JavaScript — has none.
### 3. Other script divergences
| File | Divergence |
| --- | --- |
| `script/bootstrap` | Adds an `APT_UPDATED` guard and an `apt-get update` before install — a functional change from the model. Pinned-versions date comment moved 2026-07-06 -> 2026-07-07. |
| `script/fmt` | Model: `yarn run prettier --write '**/*.md' --tab-width 4 --prose-wrap always`. Repo: `yarn prettier --write .`. The repo version is arguably better for a JS repo (it formats JS/CSS/HTML too, and `.prettierrc` supplies the flags) but it drops `yarn run`. |
| `script/fmt-check` | Same shape of change as `fmt`. |
| `script/cibuild` | Comment says "The Dockerfile runs make check"; model says `script/check`. Body identical. |
| `script/install-precommit` | Uses the `"$hook"` variable it declares rather than the literal path. Cosmetic improvement. |
| `script/test` | See #21 — it runs `yarn build` as the test. |
Not a finding: all 12 scripts are correct POSIX sh with `#!/bin/sh`, `set -eu`, and the mandated repo-root idiom.
### 4. Makefile gaps
- **`make dev` is not a thin shim.** `Makefile:13-14` runs `yarn dev` inline; there is no `script/dev`. This breaks the shim pattern and the "always use Makefile targets instead of invoking the underlying tools directly" rule at the layer below. It is also the only target missing a leading `@`.
- **No `make build` target.** `REPO_POLICIES.md` requires targets "for every common operation... building artifacts (`make build`)", and `CODE_STYLEGUIDE_JS.md` prefers `make build`. `package.json` has a `build` script; the Makefile does not expose it. No `run`, `preview`, or `clean` either.
- All nine *required* targets are present. This is about the "Makefile is authoritative documentation" rule, not the required set.
### 5. `.prettierignore` hides the backend from formatting
`.prettierignore:5` excludes `backend/`. Since `script/fmt-check` runs `yarn prettier --check .`, every markdown file under `backend/` escapes `make check` entirely. `backend/README.md`'s config table is visibly misaligned as a direct result.
### 6. `.claude` entries in committed repo config
`.dockerignore:5` (`.claude`) and `.prettierignore:5` (`.claude/`) are agent-tooling residue committed into shared repo configuration. They are additions to the models, inconsistent with each other, and inconsistent with `.gitignore`, which does not list the directory at all. They should not be in the repo's shared config — a developer-local ignore belongs in `.git/info/exclude`.
## Definition of done
- [ ] `script/docker` is restored to the model byte-for-byte. If the 5-minute timeout is worth keeping, propose it upstream in the `prompts` repo rather than diverging here — note in the PR which you did.
- [ ] `script/lint` runs a real JavaScript linter. **eslint is the default choice**; use its modern flat config (`eslint.config.js`). `script/fmt-check` keeps prettier. The two must stop being duplicates.
- [ ] All lint findings from the new linter are fixed, or the rule is deliberately disabled with a written justification in the config.
- [ ] `make dev` shims to a `script/dev`, consistent with every other target, and gains its leading `@`.
- [ ] `make build` exists and shims to a `script/build`.
- [ ] `.prettierignore` no longer excludes `backend/`; markdown under `backend/` is formatted and passes `make fmt-check`.
- [ ] `.claude` / `.claude/` entries are removed from `.dockerignore` and `.prettierignore`.
- [ ] The remaining script divergences are either reverted to the model or, where the repo's version is genuinely better, left in place with a one-line comment in the script saying why it differs. Decide per file and list your decisions in the PR.
- [ ] README **Entrypoints** section updated for any new or changed script.
- [ ] `make check` passes and still does not modify tracked files.
- [ ] `TODO.md` updated in the same commit.
- [ ] Commit title ends with ` (closes #N)`.
## Implementation requirements
- Scripts stay POSIX sh: `#!/bin/sh`, `set -eu`, no bashisms, repo-root idiom `$(cd "$(dirname "$0")/.." && pwd -P)`.
- Coordinate with #16, which also restructures `script/` to cover the backend. These two overlap heavily — **land #16 first** and rebase this onto it, or fold this into #16 if the implementer finds them inseparable. Say which in the PR.
- Do not change `script/test`'s substance here; #21 owns that.
- eslint config choices should follow the JS styleguide; do not invent house rules.
- `make` targets and `script/` entrypoints only.
- No attribution trailers in the commit message.
clawbot
added this to the 1.0.0 milestone 2026-08-09 03:45:41 +02:00
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.
Problem
Diffed all 12
script/files against the models in thepromptsrepo. Three are byte-identical (check,setup,precommit); nine diverge. Verified onmainatfbfe1df.1.
script/dockerwas edited despite being a must-stay-identical fileREPO_POLICIES.mdexplicitly names the scripts that stay byte-identical across all repos so they can be maintained centrally —script/projectname,script/docker, and friends.script/dockerdiverges:docker build -t ... .becametimeout 300 docker build -t ... ..The
timeout 300presumably enforces "Docker builds must complete in under 5 minutes", but that policy does not authorize editing a shared file. If the timeout belongs anywhere it belongs in the model, upstream.2.
script/lintis a duplicate ofscript/fmt-check— there is no JS linterBoth now run
yarn prettier --check .. They are behaviourally identical, soscript/checkruns the same prettier pass twice and the repo has no actual linter for JavaScript.README.md:162acknowledges it: "Add eslint for JS linting (currently lint target runs prettier only)". No eslint config exists anywhere — no.eslintrc*, noeslint.config.js, noeslintConfigkey.Contrast the backend, which has a real linter. The frontend — 1262 lines of JavaScript — has none.
3. Other script divergences
script/bootstrapAPT_UPDATEDguard and anapt-get updatebefore install — a functional change from the model. Pinned-versions date comment moved 2026-07-06 -> 2026-07-07.script/fmtyarn run prettier --write '**/*.md' --tab-width 4 --prose-wrap always. Repo:yarn prettier --write .. The repo version is arguably better for a JS repo (it formats JS/CSS/HTML too, and.prettierrcsupplies the flags) but it dropsyarn run.script/fmt-checkfmt.script/cibuildscript/check. Body identical.script/install-precommit"$hook"variable it declares rather than the literal path. Cosmetic improvement.script/testyarn buildas the test.Not a finding: all 12 scripts are correct POSIX sh with
#!/bin/sh,set -eu, and the mandated repo-root idiom.4. Makefile gaps
make devis not a thin shim.Makefile:13-14runsyarn devinline; there is noscript/dev. This breaks the shim pattern and the "always use Makefile targets instead of invoking the underlying tools directly" rule at the layer below. It is also the only target missing a leading@.make buildtarget.REPO_POLICIES.mdrequires targets "for every common operation... building artifacts (make build)", andCODE_STYLEGUIDE_JS.mdprefersmake build.package.jsonhas abuildscript; the Makefile does not expose it. Norun,preview, orcleaneither.5.
.prettierignorehides the backend from formatting.prettierignore:5excludesbackend/. Sincescript/fmt-checkrunsyarn prettier --check ., every markdown file underbackend/escapesmake checkentirely.backend/README.md's config table is visibly misaligned as a direct result.6.
.claudeentries in committed repo config.dockerignore:5(.claude) and.prettierignore:5(.claude/) are agent-tooling residue committed into shared repo configuration. They are additions to the models, inconsistent with each other, and inconsistent with.gitignore, which does not list the directory at all. They should not be in the repo's shared config — a developer-local ignore belongs in.git/info/exclude.Definition of done
script/dockeris restored to the model byte-for-byte. If the 5-minute timeout is worth keeping, propose it upstream in thepromptsrepo rather than diverging here — note in the PR which you did.script/lintruns a real JavaScript linter. eslint is the default choice; use its modern flat config (eslint.config.js).script/fmt-checkkeeps prettier. The two must stop being duplicates.make devshims to ascript/dev, consistent with every other target, and gains its leading@.make buildexists and shims to ascript/build..prettierignoreno longer excludesbackend/; markdown underbackend/is formatted and passesmake fmt-check..claude/.claude/entries are removed from.dockerignoreand.prettierignore.make checkpasses and still does not modify tracked files.TODO.mdupdated in the same commit.(closes #N).Implementation requirements
#!/bin/sh,set -eu, no bashisms, repo-root idiom$(cd "$(dirname "$0")/.." && pwd -P).script/to cover the backend. These two overlap heavily — land #16 first and rebase this onto it, or fold this into #16 if the implementer finds them inseparable. Say which in the PR.script/test's substance here; #21 owns that.maketargets andscript/entrypoints only.