commit 8d7b0ab03b11abf16a93f0c472cfa99c4fa9eb48
parent 1957d1eac6190c482aa0114162f1ae98832b0a06
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Wed, 30 Sep 2026 10:12:50 -0400
docs: PUBLISH.md — /source/git/* is noindex like the raw tree; a link to what is not published is text; stagit's -c walk stops at the last head in commit-date order, so a merge of older commits renders every page again (about 8 s), and which timing is stagit's and which the step's; a stale lock is replaced, an unusable cache is rendered without
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Diffstat:
1 file changed, 20 insertions(+), 7 deletions(-)
diff --git a/PUBLISH.md b/PUBLISH.md
@@ -280,7 +280,11 @@ What the step does with it:
page opens on the visitor's stored base or the homepage's dark default — without
JavaScript, `prefers-color-scheme` decides — and one line at the top, "Archilyzer ·
Source", linking to `/source/`. stagit's logo and favicon point at the site's
- `/icons/icon-32.png`. Nothing else is changed; the pages are rewritten byte for byte.
+ `/icons/icon-32.png`. A link to what is not published keeps its text and loses its
+ `href`: a diff of a file main no longer has (deleted or renamed since — stagit links
+ every diff side), and a commit with no page (past the cap, the oldest page's parent);
+ the raw tree's file list decides. Nothing else is changed; the pages are rewritten byte
+ for byte.
- **The gate reads every page**: they are in the stage the file sweep reads, so a
denied literal in one refuses the publish, named by its path (`file
source/git/commit/<sha>.html (contents, byte N)`) and never by its bytes. The pages
@@ -302,13 +306,21 @@ What the step does with it:
(about 140 MB at 1,872 commits; made on first use; never inside the checkout or the
public dir — the step renders without it there, and says so). stagit keeps a commit
page once rendered, and `-c` keeps its log lines, so a publish renders only the new
- commits: 0.6 s of stagit with nothing new against 8 s for every page, at 1,834
- commits. It holds stagit's `-c` file, its output and a key. Its pages are kept only
+ commits. At 1,834 commits, stagit alone took 0.6 s with nothing new against 8 s for
+ every page; the whole history step (with the post-pass and the copy) 2 s against 8 s.
+ **But `-c`'s walk is in commit-date order and stops at the head it rendered last**, so
+ a `--no-ff` merge of commits older than that head leaves them out: the step's count
+ check sees the log come up short and renders every page again (about 8 s), with a line
+ that says so. With this repo's merges of parallel slices that is common, and correct.
+ The cache holds stagit's `-c` file, its output and a key. Its pages are kept only
under the same rules, step, filter-repo, stagit and header text, and after a run that
finished; its log lines only when they end at an ancestor of today's head. One
- publish holds it at a time. `--force` renders every page again, `--check` never
- touches it (it renders in its own scratch), and a refusal removes it. `archilyzer
- doctor` ends its stagit line with `cache: <path>, <size>`.
+ publish holds it at a time; a lock whose pid is not running, or over an hour old, is
+ stale and replaced (one line). A cache that cannot be made or written (EACCES, EROFS,
+ ENOSPC) is one line and a render without it, never a failed build. `--force` renders
+ every page again, `--check` never touches it (it renders in its own scratch), and a
+ refusal removes it. `archilyzer doctor` ends its stagit line with `cache: <path>,
+ <size>`.
- **Its size, and the limit ahead.** At 1,872 commits (2026-09-30): 1,878 files,
141.3 MB, the largest page 5.0 MB (stagit prints "Diff is too large, output
suppressed" past 1,000 files or 100,000 lines in one commit); the whole publish is
@@ -331,7 +343,8 @@ What the step does with it:
`homepage/public/_headers` sets `/source/tree/*` to `text/plain; charset=utf-8` with
`nosniff` and `noindex`, then puts back `text/html` for the directory pages and the
real types of the few binaries (`.ttf`, `.m4a`, `.zip`, `.onnx`, `.svg` — the SVG
- under a `default-src 'none'` CSP). **Every matching rule applies, and a header a
+ under a `default-src 'none'` CSP). `/source/git/*`, the history pages, is `noindex`
+ too (ruled), and keeps its own types. **Every matching rule applies, and a header a
later rule sets again is APPENDED** (`text/plain; charset=utf-8, text/html;
charset=utf-8`), so each of those overrides first detaches the tree's type with
`! Content-Type`. Only the ROOT `_headers` is read; the tree's own