Since #12, script/fmt and script/fmt-check use '**/*.md' and '**/*.css'. That glob descends into dot-directories — verified during
review of PR #32 by planting .probe-nested/deep/bad.md, which prettier
flagged.
.claude/ is out of scope today only as a side effect: prettier 3 reads .gitignore in addition to .prettierignore, and .claude/ is in .gitignore (added by #8). Nothing in .prettierignore excludes it.
So the protection is real but indirect. If .claude/ is ever removed from .gitignore — or if a future prettier release changes that default, or a --no-ignore-path-style flag is added — make fmt would begin rewriting
markdown inside sibling agent worktrees under .claude/worktrees/. That is
writing to other checkouts of this repo from a formatting command, which is
both surprising and hard to attribute when it happens.
The same indirection is what currently keeps public/ out of scope inside the
image.
Fix
Add .claude/ to .prettierignore explicitly, so the exclusion does not
depend on .gitignore contents or on prettier's default ignore-file
behaviour. One line plus a comment recording why.
While in there, consider whether any other dot-directory should be named
explicitly rather than inherited.
Definition of done
.prettierignore excludes .claude/ directly, with a comment stating that
it must not depend on .gitignore.
Verified by planting a markdown file at .claude/probe/x.md and confirming make fmt leaves it untouched with .claude/ temporarily removed from .gitignore — that is the condition being defended against. Restore .gitignore afterwards and delete the probe file.
make fmt is a no-op on a clean tree; make check passes.
TODO.md updated.
Also in scope — the duplicated prettier settings
.prettierrc sets tabWidth: 4 and proseWrap: always, and both scripts also
pass --tab-width 4 --prose-wrap always. This duplication is deliberate and
is being kept: CLI flags take precedence, so the scripts format identically
in a tree where the dotfile is missing or has drifted, which is what a gate
should do.
The hazard is that editing .prettierrc alone silently changes what editors do
while make fmt-check ignores the change, with no error — the gate and the
editors disagree and nothing says so.
Add a one-line comment to each of script/fmt and script/fmt-check stating
that the flags intentionally mirror .prettierrc and that both must be changed
together. Do not remove the flags; dropping them would make the scripts
silently misformat in any tree missing the dotfile.
Out of scope
Changing which paths are formatted (#12 settled that; content/ is excluded
by measurement, Go templates because prettier cannot parse them).
Any prettier version or configuration change beyond the comments above.
## Problem
Since #12, `script/fmt` and `script/fmt-check` use `'**/*.md'` and
`'**/*.css'`. That glob **descends into dot-directories** — verified during
review of PR #32 by planting `.probe-nested/deep/bad.md`, which prettier
flagged.
`.claude/` is out of scope today only as a side effect: prettier 3 reads
`.gitignore` in addition to `.prettierignore`, and `.claude/` is in
`.gitignore` (added by #8). Nothing in `.prettierignore` excludes it.
So the protection is real but indirect. If `.claude/` is ever removed from
`.gitignore` — or if a future prettier release changes that default, or a
`--no-ignore-path`-style flag is added — `make fmt` would begin **rewriting
markdown inside sibling agent worktrees** under `.claude/worktrees/`. That is
writing to other checkouts of this repo from a formatting command, which is
both surprising and hard to attribute when it happens.
The same indirection is what currently keeps `public/` out of scope inside the
image.
## Fix
Add `.claude/` to `.prettierignore` explicitly, so the exclusion does not
depend on `.gitignore` contents or on prettier's default ignore-file
behaviour. One line plus a comment recording why.
While in there, consider whether any other dot-directory should be named
explicitly rather than inherited.
## Definition of done
1. `.prettierignore` excludes `.claude/` directly, with a comment stating that
it must not depend on `.gitignore`.
2. Verified by planting a markdown file at `.claude/probe/x.md` and confirming
`make fmt` leaves it untouched **with `.claude/` temporarily removed from
`.gitignore`** — that is the condition being defended against. Restore
`.gitignore` afterwards and delete the probe file.
3. `make fmt` is a no-op on a clean tree; `make check` passes.
4. `TODO.md` updated.
## Also in scope — the duplicated prettier settings
`.prettierrc` sets `tabWidth: 4` and `proseWrap: always`, and both scripts also
pass `--tab-width 4 --prose-wrap always`. This duplication is **deliberate and
is being kept**: CLI flags take precedence, so the scripts format identically
in a tree where the dotfile is missing or has drifted, which is what a gate
should do.
The hazard is that editing `.prettierrc` alone silently changes what editors do
while `make fmt-check` ignores the change, with no error — the gate and the
editors disagree and nothing says so.
Add a one-line comment to each of `script/fmt` and `script/fmt-check` stating
that the flags intentionally mirror `.prettierrc` and that both must be changed
together. Do **not** remove the flags; dropping them would make the scripts
silently misformat in any tree missing the dotfile.
## Out of scope
- Changing which paths are formatted (#12 settled that; `content/` is excluded
by measurement, Go templates because prettier cannot parse them).
- Any prettier version or configuration change beyond the comments above.
One interaction to settle before this is implemented, because this issue's fix adds a vendor tooling directory name to .prettierignore while #43 is about removing that name from this repo's prose.
They do not conflict. The distinction ruled there applies here: an ignore-file path is load-bearing — it must match a real directory on disk or it does nothing — so it is functional configuration, not documentation, and it stays. Prose about it is what gets scrubbed.
So: add the path entry as this issue describes. Write the accompanying comment in terms of what is being excluded and why (agent working directories, i.e. entire sibling checkouts of this repo) rather than naming the product, and the two issues stay consistent.
Everything else in the definition of done stands. Note the negative control in item 2 is the whole point of the change and is not optional: the exclusion must be shown to hold with the .gitignore entry temporarily removed, since inheriting it from .gitignore is exactly the dependency being eliminated.
One interaction to settle before this is implemented, because this issue's fix adds a vendor tooling directory name to `.prettierignore` while https://git.eeqj.de/sneak/lora.vegas/issues/43 is about removing that name from this repo's prose.
They do not conflict. The distinction ruled there applies here: an ignore-file **path** is load-bearing — it must match a real directory on disk or it does nothing — so it is functional configuration, not documentation, and it stays. Prose *about* it is what gets scrubbed.
So: add the path entry as this issue describes. Write the accompanying comment in terms of what is being excluded and why (agent working directories, i.e. entire sibling checkouts of this repo) rather than naming the product, and the two issues stay consistent.
Everything else in the definition of done stands. Note the negative control in item 2 is the whole point of the change and is not optional: the exclusion must be shown to hold with the `.gitignore` entry temporarily removed, since inheriting it from `.gitignore` is exactly the dependency being eliminated.
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
Since #12,
script/fmtandscript/fmt-checkuse'**/*.md'and'**/*.css'. That glob descends into dot-directories — verified duringreview of PR #32 by planting
.probe-nested/deep/bad.md, which prettierflagged.
.claude/is out of scope today only as a side effect: prettier 3 reads.gitignorein addition to.prettierignore, and.claude/is in.gitignore(added by #8). Nothing in.prettierignoreexcludes it.So the protection is real but indirect. If
.claude/is ever removed from.gitignore— or if a future prettier release changes that default, or a--no-ignore-path-style flag is added —make fmtwould begin rewritingmarkdown inside sibling agent worktrees under
.claude/worktrees/. That iswriting to other checkouts of this repo from a formatting command, which is
both surprising and hard to attribute when it happens.
The same indirection is what currently keeps
public/out of scope inside theimage.
Fix
Add
.claude/to.prettierignoreexplicitly, so the exclusion does notdepend on
.gitignorecontents or on prettier's default ignore-filebehaviour. One line plus a comment recording why.
While in there, consider whether any other dot-directory should be named
explicitly rather than inherited.
Definition of done
.prettierignoreexcludes.claude/directly, with a comment stating thatit must not depend on
.gitignore..claude/probe/x.mdand confirmingmake fmtleaves it untouched with.claude/temporarily removed from.gitignore— that is the condition being defended against. Restore.gitignoreafterwards and delete the probe file.make fmtis a no-op on a clean tree;make checkpasses.TODO.mdupdated.Also in scope — the duplicated prettier settings
.prettierrcsetstabWidth: 4andproseWrap: always, and both scripts alsopass
--tab-width 4 --prose-wrap always. This duplication is deliberate andis being kept: CLI flags take precedence, so the scripts format identically
in a tree where the dotfile is missing or has drifted, which is what a gate
should do.
The hazard is that editing
.prettierrcalone silently changes what editors dowhile
make fmt-checkignores the change, with no error — the gate and theeditors disagree and nothing says so.
Add a one-line comment to each of
script/fmtandscript/fmt-checkstatingthat the flags intentionally mirror
.prettierrcand that both must be changedtogether. Do not remove the flags; dropping them would make the scripts
silently misformat in any tree missing the dotfile.
Out of scope
content/is excludedby measurement, Go templates because prettier cannot parse them).
One interaction to settle before this is implemented, because this issue's fix adds a vendor tooling directory name to
.prettierignorewhile #43 is about removing that name from this repo's prose.They do not conflict. The distinction ruled there applies here: an ignore-file path is load-bearing — it must match a real directory on disk or it does nothing — so it is functional configuration, not documentation, and it stays. Prose about it is what gets scrubbed.
So: add the path entry as this issue describes. Write the accompanying comment in terms of what is being excluded and why (agent working directories, i.e. entire sibling checkouts of this repo) rather than naming the product, and the two issues stay consistent.
Everything else in the definition of done stands. Note the negative control in item 2 is the whole point of the change and is not optional: the exclusion must be shown to hold with the
.gitignoreentry temporarily removed, since inheriting it from.gitignoreis exactly the dependency being eliminated.