Archilyzer · Source

archilyzer

Archilyzer
git clone https://archilyzer.pages.dev/source/archilyzer.git
Log | Files | Refs | README | LICENSE

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:
MPUBLISH.md | 27++++++++++++++++++++-------
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