Activity log

2026-09

2026-09-01 lint The Russian pages under humanizer-ru — 297 scanned, two kinds of finding

A brief for auditing the translations with humanizer-ru's deterministic scanner (64 markers, 20 hard bans, no LLM) arrived from a neighbouring session and is kept as audit.md beside the translate skill; tools/translate/audit-ru.sh does what it prescribes — strip the frontmatter, mask fenced and inline code with КОД (unmasked, a page discussing <think> tags scores 23), scan with --genre academic, one JSON line per page. Over all 297 translations: 280 «чисто», 17 «правка», none «рерайт»; median 94, p10 86, minimum 70 (peril-of-laziness-lost, the brief's own example). Hard bans on 25 pages: «от X до Y» (10), «не только X, но и Y» (7), «не просто X, а Y» (6), «стоит отметить» (3). Markers that actually occur: «ключев-» on 70 pages, «не просто» 52, «не только» 27, «огромн-» 16, «фундаментальн-» 13, «значительн-» 13, «всё чаще» 10, «в эпоху» 10.

The rule of the brief is that nothing under ru/ is edited: a finding goes either to the English original or to the translator's prompt, and which one is decided by opening the original. tools/translate/classify-audit.sh does that mechanically for the hard bans and the frequent markers — the Russian sentence, the matching English construction if there is one — and its table is in tools/translate/audits/2026-09-01-humanizer-ru.tsv: 174 sentences, 133 with the construction present in the English (92 distinct originals; "key/core/central" on 56 of them, "increasingly" on 10, "huge" and "fundamental" on 9 each, the "not just / not only" frames on 15), 41 added by the model — "ключевой" for "is what makes X work" and "the point is" (15), "значительный" and "огромный" for "much" and "big" (15), "в эпоху" (6), one "не просто X, а Y" for "instead of just retrying". The prompt gained two rules for those: no evaluative adjective the English lacks, with the plain rendering for each, and the antithesis frames only where the English carries them. They apply from the next batch; the 35-odd pages that carry the model's additions are worth regenerating once the quota allows, and the 92 English originals are a policy question rather than a fix — one page is a fix, ninety is a rewrite of the vault's own voice.

The 38 pages with the model's additions were regenerated the same afternoon under the new rules: 38 of 38 clean on the first attempt, and the same scan and classification over them again gave 17 model-added sentences where there had been 41 — and most of the 17 are the classifier's, not the model's ("ключевые слова" for keyword search, "значительная доля" for "a large share"). Median 94, minimum 83, 37 of 38 «чисто». The rules hold. Nothing in English was touched.

2026-09-01 lint Summary limit to 160, eighteen orphans linked

Both numbers from the morning's first warren lint run, decided and acted on. The summary: limit in CLAUDE moves from 100 to 160 characters — where the vault actually writes (410 of 580 wiki pages were past 100, 102 past 160 by the lint's rune count) and about where a search result truncates. warren lint defaults to the same figure; the 102 still over it stay warnings for a later trim.

The eighteen orphans each got one real inbound link from a page that had reason to mention them, with updated: bumped on the host. Host → orphan: kanbotsagent-shell (both adapt over ACP, board and Emacs buffer); reactiondhall (JSONnet config, and the typed alternative); valve-steam-controller-caddiy-cnc-machine (the two ends of open hardware); yapkokoro (on-device speech, recognition and synthesis); starling-desktopboringbar (per-Space windows as a desktop feature) and → lightroom-cc-on-linux (the same AI-directed method at the scale of one Wine recipe); ghost-peppermeetily (the same Whisper/Parakeet stack, hotkey versus meeting recorder); palmier-proopenscreen (recording before editing); porto-sapscotty (Laravel structure, then Laravel deploy); claude-design-system-prompttoolcraft (design opinions as prompt, as code); crqc-timelinebitcoin-quantum-computing (the identity-migration case worked through); marius-blogcleberg-server-build-summary (enterprise-box aversion, in hardware); transactioncheckgo-transaction-linter (the tool and the story of building it — these two had never linked); adding-go-to-a-browser-code-runnerantonz-org (Codapi, the other browser code runner); forgehttpx2-blessed-fork (forge choice as a fork's fate); digital-gardensince-you-arrived-vol4 (a page that rewards staying); json-pass-value-accuracy-gapjep-540-json-api (strict parsers, still nothing about values); perfmonslogbox (host from outside, process from inside).

Three of those were a stretch and are recorded as such: boringbar, slogbox and since-you-arrived have no natural neighbour in the vault yet, and the sentence that links each says why they sit where they do. warren lint now exits 0: 775 pages, 0 errors, 102 warnings, all summary-long. warren check exits 0.

2026-07

2026-07-29 lint Watchlist tag/row reconciliation

Checked toolbox/watchlist.md against the watchlist frontmatter tag across all toolbox pages, after noticing a count mismatch while adding this day's rows. The convention in CLAUDE is that an entry carries three things — the tag, a table row, and a one-line mention linking watchlist from the page — and eight entries had drifted out of that shape.

Six pages had a row but no tag: floci, goose-relay-vpn, oh-my-pi, sandbox-agent-sdk, statewright, surf. Tagged all six; four of them also lacked the body mention and got one. statewright had the sentence already ("on the watchlist as a young single-vendor project") but as plain text rather than a link, so the page never showed up in a backlink query.

Two were the reverse — tagged, listed in index with the watchlist marker, and mentioned in their own bodies since 2026-05-22, but never given a table row: kata and msgvault. Both rows reconstructed from what the pages already said they were waiting on (unstable command contracts and no tagged release for kata; the storage-format-may-change warning for msgvault), with a next check of 2026-08-20 to preserve the original 90-day intent rather than resetting the clock to today. The rows say they were reconstructed.

One further gap turned up in the same sweep: needle was tagged and rowed but its body said "on the watchlist" in plain text. Linked.

The tag was the unreliable half — six of eight drifts were a missing tag rather than a missing row, which makes sense given the row is what you write while thinking about the tool and the tag is a separate edit to a different part of the file. Worth folding into warren check as a rule if this recurs.

Watchlist now reconciles exactly: 73 rows, 73 tagged pages, every tagged page carrying a body mention. warren check exits 0. Pages updated: 7 toolbox pages, watchlist (2 rows added).

2026-07-22 lint Vault maintenance pass — catalog pages, orphans, dangling links, summaries

Consistency pass, not an ingest. Five separate problems, all of them consequences of the vault never having had a way to distinguish structural pages from content pages.

Catalog and log pages marked. wiki/index, toolbox/index, books/index and the root index are now type: catalog; log is type: log. All five had opened straight into an H1 with no frontmatter at all; each now carries title, summary, created (taken from git history) and updated, and the duplicate H1 is gone. CLAUDE.md gains both types and a short section explaining why link metrics have to skip them: the five together carry roughly a third of the vault's wikilinks, which is why the Orphans (no inbound links) view in wiki.base has never been able to return a row.

Orphans, computed for the first time. Excluding those five, 44 of 665 pages in wiki/, toolbox/ and books/ had no inbound wikilink. 42 now do. The wiki cluster was systematic — 13 blog-entity pages each linked out to the summary written from that blog and no summary linked back; fixed by making the author's name in each opening sentence the link, which is what the pages that got it right already do. All 19 book pages were orphaned because books/index was their only referrer; each is now cited from the wiki page whose topic it covers. Nine of eleven toolbox orphans found a genuine relative. slogbox and openscreen were left orphaned on purpose — the vault has no page on Go structured logging and none on screen recording, so every candidate link would have been decorative.

Dangling wikilinks: 28 down to 6, measured with warren check. Two were a wrong folder prefix ([[meta/llm-wiki-pattern]] for a page in wiki/), two were PDFs linked without their extension in ingested-urls. Three pages written because the reference count said they were owed: claude-code (four referring pages, and 75 pages mention it in prose), andrew-bosworth (three), obsidian-bases (two, and nothing explained the dashboards the front page is built from). Nine unlinked as prose rather than concepts. Six left as honest gaps: dtrace, gvisor, xray-core, anthropic-and-pentagon, oldnewthing-20260423, stable-urls-as-public-api — each referenced once, two by text that already says the page does not exist.

summary: backfilled on 139 pages — 115 in toolbox/, all 24 in books/ — which had none because neither frontmatter template included the field. Both templates now do. These become the meta description and Open Graph text when the vault is served, so each was written as a search-result line.

Six frontmatter blocks were invalid YAML and always had been: five summary: values contained an unquoted ": ", and early-stage-reality opened with a quoted phrase YAML read as the whole value. Obsidian tolerates them; a stricter parser drops the frontmatter entirely. All 670 blocks in wiki/, toolbox/, books/, meta/ and the root now parse.

Also documented in CLAUDE.md: the optional aliases: field for surviving renames, why filename uniqueness is what allows addressing a page by stem alone, and a decision on inbox-assets/ — it stays, as the staging area ingest drains into sources/assets/, which is what the ingest skill already does.

Not done, deliberately: the catalog listings were not regenerated from summary:. A 20-page sample found no contradictions between the two descriptions — every pair agrees on what the page is, differing only in which secondary detail each keeps — so the duplication is real but not currently harmful, and whether to generate the listings is an open decision in the site spec.