// Last Updated — Change Log
2026.09.13Mint gate reads every landing shape; a save no longer erases a landed score.The mint gate is the last check before a link goes out: it reads what the run holds and says so. It kept saying a site's speed score was missing while the score sat on the board. Three rounds, and the first two are on the record as misses: each read the store from a different angle, passed its test, and missed live — the tests mocked what the store looked like, and the store looked fine. The third round read the live record: the speed test had landed its result on one shelf, and the save that follows the crawl — carrying no copy of its own — overwrote that shelf a quarter-second later. Now every road that lands a speed result lands it the same way, and a save with nothing to add leaves what is there alone. The test for it runs the background landing and then the save, in that order. When the gate does find something missing, the line names every place it looked and what it found there. Confirmed on a fresh keyed run: the link mints ready with the score on the board.// PR #61–#64 — 4 commits · 2026.09.13
2026.09.13Page reads now run in batches; the batch call moved off the 26-second function window.Measured before designing. On a 27-page site the per-page read was sending the same header, menu and footer down the wire 27 times — most of every prompt was furniture. So: batches of seven pages, the furniture sent once with a note of how many pages carry it, the model picked by tier. Then the first keyed run hit our own wall: two of four batches ran past the 26-second limit a serverless function gets, and 14 of 27 pages came back unread. The fix was not smaller batches — the limit was ours. First the dial went off so every run got its full reads back; then the batch call moved to a background function with fifteen minutes of room, results landing in the run's own record, the page polling for them. Same walls as before — prompt cap, batch size, the tier rule.// PR #58–#60 — 5 commits · 2026.09.13
2026.09.13Capped lists now state the measured count beside the sample.A resolution on a church site we audited said a broken link was "on 10 pages." It was on 27. Two layers to it: the finding's own list is capped at ten to keep it readable, and the finding had printed the length of the list as the count; then the model was handed that list and counted it too. Now the measured number rides beside the sample — "appears on 27 pages; the list below is a sample of 10" — and every capped list on the board declares itself and its size. The model reads the stated count instead of counting the list.// PR #57 — 1 commit · 2026.09.13
2026.09.13Speed-test failures now name their reason; slow tests run in the background.Two shapes of the same silence. One report said "performance was not measured this run" and nothing more; another guessed "may have been rate-limited." The real reason — a timeout, a status code, an empty daily allowance — had been recorded since early September and was lost three ways on the way to the page. The reason now rides the finding, and a miss pings the phone once with the run and the cause. Then the cause itself: Google's speed test can take forty seconds and more, and the function that asked for it had twenty-six. It now hands the call to a background worker with minutes of room; the report's close waits a beat for the result, and the export picks up anything that lands later. A final miss still says so.// PR #55, #56 — 3 commits · 2026.09.13
2026.09.13A data-acquisition section added to the standing rules.Added to the repository's standing rules: what the audit may and may not do to learn about a site. Official interfaces and roles a client grants come first; where a platform's terms forbid automated logged-in access, the answer is no regardless of intent. Our own crawler names itself, honors robots past the front door, renders each surface once, and resolves outbound links rather than crawling them. A pull that fails is "not reachable this run," never a finding about the site. Every stored fact carries where it came from, and a report never presents a lower grade of evidence as a higher one.// PR #50 — 1 commit · 2026.09.13
2026.09.13Menu openers, dead links, and chrome counts corrected in the report model.A week on one church site we audited, and most of it was the audit being wrong about it. First the report listed three menu headings as failed pages — links that exist to open a submenu and answer "not found" if followed directly. Then a floor meant to catch the site's not-found page caught nothing, because that site serves a full not-found page at those routes; the fix probes each site once for its own not-found fingerprint and treats a match as exactly that. Then the fingerprint missed live, because a page that answers 404 at the front door had its failed body thrown away before hashing; a 404 is now authoritative whatever gets painted over it. Out of that came the model: pages are pages that exist; menu openers are not pages and are not dead; a route that doesn't exist is a broken link charged to the elements that point at it. Then the counts. The dead count read 55 where 1 was true — the mobile drawer's copy of every menu link was being read as a second, dead link; the drawer copy is the same link. A site-wide link wrapped in stray quotes read as live because our earlier fix had stripped the quotes and followed the intended address; visitors get the broken one, so now the report does too, and the earlier fix is on the record as hiding a real defect. One broken link in the site's chrome had been counted 27 times, once per page; site chrome now counts once. And a link's destination is its identity — evidence about it lives beside it, never written into it. On the last run: 27 pages, all fine, two dead links, both real.// PR #45, #47–#49, #51–#54 — 8 commits · 2026.09.07–13
2026.09.07Two stale structured-data test expectations retired.Two checks in the test suite had been red since late August, and no one had asked why. Bisected: a commit on the 23rd shipped a real structured-data validator and deliberately moved two results from "partial" and "unmeasured" to "measured"; the tests still expected the old words. The tests were wrong, not the code. Retired, with the walk written down so the next red gets bisected instead of guessed.// PR #46 — 1 commit · 2026.09.07
2026.09.06The meter now weighs our spend against the providers' own bills.The meter learns to read the bill. Two halves behind the keyed door. The first is free — it sums the month's spend from the runs the ledger already reads, split by tier and by the kind of answer bought, beside today's well burn per tool; no new store, not one outbound call. The second costs one round-trip on a button press: the provider's own numbers — Anthropic's month-to-date cost, the Netlify sites, a flat infra line — set beside ours with the gap between them, cached ten minutes, a missing key reading "not configured" rather than throwing. And a drift alarm: when the provider's number runs more than a quarter past ours, the phone hears about it once a day — the hacked-key alarm firing on evidence, not on nerves. The Anthropic call came back 403; the panel now shows the wire's own words — "Missing permissions," on both the cost and the usage endpoints — with the cause still open: whether the key's type or the org's plan. When the number can't be read, the drift line says "unknown," never "within range."// PR #37, #38 — 2 commits · 2026.09.06
2026.09.06Public scans that failed to save are saving again.The store learns to spell. Public runs kept getting refused on the second write — the board and the checkpoint would land once, then bounce. First guess was wrong and it's on the record: I read it as a write-once rule and changed how we wrote; it changed nothing, and I said so and withdrew it. The real cause was smaller and meaner — the database rejects any record whose keys carry a dot, a slash, or a bracket, and refuses the whole write when one does. Our maps are keyed by exactly those: a domain like facebook.com, a hostname, an audit path with slashes. The first write at the front door succeeds because those maps are empty; the one after the crawl carries the illegal keys and dies. Fixed in one place — every key is escaped on the way into the store and restored on the way out, so no caller upstream can spell a key the store can't hold. The values are never touched, only the keys. A refused write now names itself on the phone, verbatim from the wire, instead of failing in silence.// PR #36 — 1 commit · 2026.09.06 · supersedes the withdrawn #35
2026.09.05Every scan now has its own line in the admin ledger.Every scan on the books. A ledger of runs behind the keyed door: each run writes a line at its first step — domain, tier, time — and fills in its verdict and page count when the crawl closes, or its reason when the door shut. Spend is never copied into that line; the ledger reads it live from each run's own meter, so the number on the page can't drift from the number that was spent. A row opens the run as it stands, on a keyed-view token minted for the asking. It landed empty on the first live runs. The index was moved under skim/ on a guess that a top-level path was being refused — it wasn't; that write had always succeeded, and the true cause turned out to lie elsewhere, in the store-key fix that came next. Polish followed: rows that wrap instead of overflowing a phone, a run abandoned mid-crawl marked so instead of spinning "running" forever, sub-cent spend shown in cents instead of rounding to zero.// PR #30, #34 — 2 commits · 2026.09.05
2026.09.05Six live-site bugs, fixed and each locked down with a test.Six findings from the live site, each buried with a test. Public boards weren't being saved, so opening one as admin fell back to a replay that can't rebuild the speed numbers — now every run saves its board, every tier. Public follow-up chat failed on every turn and showed "answer lost" — it was being refused before the model, not failing at it; the free tier now gets its three questions on the smaller model, metered by the day's well like any tap, and a dry well says it's dry instead of lying about a loss. The cockpit ledger showed nothing; the index path was moved under skim/ while the cause was still open. And a store write that came back refused now says so on the phone, with the path, instead of vanishing.// PR #32 — 1 commit · 2026.09.05
2026.09.05Every public run and failed call now pings the phone.A wire to the phone, and why it went dead. A single rail: every public run pings a finished-line to the phone with the verdict and a one-tap admin link into that run; every failed upstream call pings with the function and the run it died on. The rail shipped, the topic was set — and nothing arrived. The cause was ours and plain: the ping was fired and forgotten, and the serverless box freezes the instant it answers, so the request to send never finished. It's awaited now. The run's whole arc rides the rail — started, failed, completed — one alarm bucket per stage so a storm collapses instead of screaming. And a visitor on the free tier can ask for one text with their full assessment: a number, a consent line, a honeypot for the bots, stored once per run; the phone hears the request and the domain, never the number.// PR #28, #29 — 2 commits · 2026.09.05
2026.09.05Minted links now carry everything the run measured.Frozen where it should be, living where it must. A minted link opened stale: the speed numbers, the follow-up threads, the source files all missing, though the run had measured them. The board was frozen whole at mint time and the reader only reached past the freeze when a piece was outright absent — so anything that landed after the mint never showed. Split it honestly: the findings, the ranking, the pages stay frozen for parity — the guest sees the board the run showed. Performance, resolves, chat, and sources are living — read from the run's store at open time, store over snapshot, never the other way. A late speed measurement re-saves itself and appears on the next open. A resolve bought after the ping shows when the link is opened.// PR #27 — 1 commit · 2026.09.05
2026.09.05Ask up to three follow-up questions on any finding.Three questions, and no fourth. Under each finding's answer, a follow-up field — ask, and the guide answers from this report and nothing else. Three exchanges per finding, and the cap is the server's, not the screen's: a fourth is refused no matter what the page sends. Off-topic gets one honest line pointing back to the work, never a conversation; the site's own text and the visitor's are data, never instructions. Every answer is written to the run before it renders and the thread survives a reopen. The follow-ups fixed a scatter of live-run defects behind them — the sheet that wouldn't scroll to the newest answer, the read that repainted a beat before its input, a question that vanished when its reply died mid-flight. The question is stored the moment it's asked now; a lost answer leaves the question, not a gap.// PR #25, #26 — 2 commits · 2026.09.05
2026.09.04Admins can now tune the instrument's dials from one panel.A cockpit for the dials. The numbers that govern the instrument — the well caps, the mint defaults, the resolve tiers — stopped living only in the code. One keyed panel reads them all and shows each as three things: the value in force, the shipped default, and whether an override is set. Edit in place, one save through the same door that always guarded them; a refused write names its reason and changes nothing on screen. Reset a dial and the override is cleared back to the default — a deletion the store learned to take. The honesty thresholds are not dials and never appear here; the instrument's floor is not for turning.// PR #24 — 1 commit · 2026.09.04
2026.09.04Each kind of answer now uses the right-sized model.The right model for the moment. One dial became four. A finding tapped one at a time is a volume path and rides the smaller model; a whole channel answered at once is worth more; the site read as a unit is the singular moment and gets the largest; the follow-up chat has its own. Each names the model it used, in the answer, in the stored record, in the exported sheet — so what you paid for is legible after the fact. The old single-tap default quietly stepped down a tier in the process; a note in the record says so, and it's one config write back if the quality wants it.// PR #23 — 1 commit · 2026.09.04
2026.09.04A funded link can now scan new sites from its balance.The key funds the next run. A minted link was a frozen board and a budget for reads; now it runs. Point the box at another property and the token pays for the full crawl from its own balance — the same run family, the same expiry — refused before the crawl if the balance can't cover it, the balance named. A per-run fee sits on top, and it learned a lesson the hard way: charged at the front door, a dead site with no page still billed the wallet, and a retry billed it twice. Moved to delivery — the fee lands only once a homepage is actually stored, once per run, retries free. The token's spend rides one indirection to its wallet; a funded tap draws the balance, never the public well.// PR #20–#22 — 3 commits · 2026.09.04
2026.09.04One button now resolves every finding on the board at once.Resolve the whole site, once. One button answers every unresolved finding across every channel in a single call, walled by the run's budget, the tier and the metered cost shown before it spends. What's already answered is never re-bought; context rows that have no fix — "not measured this run" — are marked not-a-fix and skip the spend while still showing on the board. The answers fan out into the same per-finding records the individual buttons already read, so nothing is a special case. And the workbook grew a second sheet: Resolutions, every finding in ranking order with its status — the read in full, or "nothing to resolve from this scan," or "no resolution opened" — a complete ledger, not just the reads that were bought. A regression from the same week is on the record: a containment rule meant for text collapsed the evidence blocks; scoped to the text, re-pinned, and the fix carries the test that catches it.// PR #16, #17, #19 — 3 commits · 2026.09.04
2026.09.04Finding cards no longer overflow the screen on a phone.The board holds its shape. On a phone the finding cards overflowed — long URLs ran past the edge, evidence spilled the frame. Every card got room to wrap and a URL shown short with the whole of it under a hover and in the workbook. The first pass overreached: a wrap rule laid on the whole row let its columns collapse, and a later mobile run showed the evidence broken. Scoped the containment to the text that needed it and left the layout its tracks — and pinned both: the long URL that must stay inside, and the caption that must stay wide.// PR #15, #18 — 2 commits · 2026.09.04
2026.09.03Mint limits are now set in config, not in code.The dials leave the code. The mint's defaults — budget, days, tier, the ceiling — became admin-set config beside the well caps, the shipped constants their floor. A request above the ceiling is refused with the ceiling named, never silently clamped down to it; raising the limit is a config write now, not a deploy. Both mint surfaces read the live dials for their placeholders, so the numbers on the form are the numbers in force.// PR #14 — 1 commit · 2026.09.03
2026.09.03Scans now cover fifty pages and map external links.Budget is the stop; the neighbors are noted, not walked. The depth gate came off by default — the fifty-page budget is the wall, spent breadth-first, and the board says why the walk ended: budget spent, site exhausted, or a depth gate when one is deliberately set. External links are resolved, not crawled — one hop per outside domain, fetched once through its redirects to confirm where it lands and what it is (your other property, a third-party service, social, parked, dead), then never queued. They cost a fetch, not a page; the fifty stay on your site. The fine print was walked back to match the instrument: fifty pages, external links resolved not crawled — no more "three layers deep · seventeen pages" for a crawler that goes to fifty.// PR #12, #13 — 2 commits · 2026.09.03
2026.09.03Shared links now open the full board the run built.The minted board tells the truth. A minted link re-exported wrong: the homepage opened empty though the keyed run had it full, the pages in the wrong order, the AI reads pinned to the wrong pages. Two roots, both proven — the first only after a wrong guess. I read the empty homepage as a mixed-case hashing mismatch, and the harness killed that: the keys were already normalized. The real cause was plainer — the first crawl step wrote only its own meta, never its rich homepage record, so the reconcile at the crawl's close could only store the client's thin copy and the minted board opened with no homepage elements. That step writes the full record itself now, with a crawl-order number so the snapshot loads in the order the crawl walked. The second root held: the reads were joined to pages by position, not by address, so a reordered snapshot wore a neighbor's reads — keyed by address now, and a page with no read shows none, never someone else's. The mint's completeness check was reading the new shape as absent and re-running the paid page pass on every remint — one helper now answers "is a pass stored" for both shapes, and the loop is closed.// PR #10, #11 — 2 commits · 2026.09.03
2026.09.03The free tier now gets real page-speed scores.Speed for the free tier, dials in one place. The public tier earned its Lighthouse — the performance channel serves public callers now, metered by its own daily well, a hundred a day, and never a locked door. And the config node was founded: one record governs the instrument's caps, admin-authenticated on a rate-limited write path, the code's own values the default when it's absent or wiped. It's the foundation the mint dials and the meter page would later stand on. The public speed measurement that had been failing was run down to the ground: pure quota, ten of ten, not our bug — the retry copy left honest and Google named as Google. The staging site had no PageSpeed key that night; one was set later, and the failures that remained after were Google's own timeouts.// PR #9 — 1 commit · 2026.09.03
2026.09.03Three live bugs fixed: dead scans, silent saves, bad dates.Three that were bleeding. A hotfix batch, each with the test that would have caught it. The public path had been dead since the twenty-seventh — a missing field crashed every orchestrated run at the first slice, and the failed attempts were quietly draining the day's free crawls, twenty-five down to twenty-one on one afternoon reconstructed exactly. Fixed, and the refund made to happen in the invocation that burned, not on a client's say-so. The board's own save had been failing in silence — the raw performance payload, megabytes of screenshots, riding inside the board write and killing it while an empty catch ate the evidence; split the raw bytes into their own record, stripped the screenshots nothing reads, and made every failure name itself in the reply. And a mint at 11 PM that read "expires today" — an empty days field defaulting to same-day; floored to the configured week, the expiry shown to the minute in Central.// PR #6–#8 — 3 commits · 2026.09.03
2026.09.03Shared boards now match exactly what the paid run showed.The minted board matches the keyed one. A courtesy guest opened a partial board where the keyed run had a whole one — a missing homepage, no performance channel, false robots and sitemap findings from a flag read three ways. Mint now freezes the whole board and preloads an AI read for every finding through the existing path, the Architect's spend as the baseline, before the courtesy budget stacks on top — driven from the minting session at a small concurrency, idempotent, a remint retrying only what failed. The per-page accordions and the summary board render on the minted side exactly as on the keyed side; same run, same evidence, same shape. And the false robots and sitemap findings — born of coercing an unknown into an absence — were retired at the source.// PR #4, #5 — 2 commits · 2026.09.03
2026.09.02Shared reports now include the site's own homepage.The last page comes home. A minted run shipped without its own homepage — the first page was never written to the store, and the closing step received the client's full set and saved none of it. Proven from the source, not guessed. The fix reads the stored pages at the crawl's close, diffs by address, and patches in only what's missing — the slim client record never overwriting a rich one — awaited outright, because the page records are what a courtesy preload lives on. Pages are keyed by their address's hash from here, so the homepage can never miss its own slot again. Buried with the test that names the bug and the run it came from.// PR #3 — 1 commit · 2026.09.02
2026.09.02A clean branch and a real process for all that follows.A clean floor to build on. Staging had drifted a full generation behind main — a stale July snapshot, months of work missing. Reset to main, a human-gated git operation, the old tip preserved as a tag first so the one corpus that lived only there survives, recoverable. The knowledge kit moved behind the publish boundary where machinery belongs, and the house process took hold with the first branches-off-staging, PR-into-staging, merge-by-Jacob work — a red harness stops a commit, every bug ships with the test that would have caught it, and a promotion to production stays a human's decision to the end. Everything after this line is built that way.// PR #2 — 1 commit · 2026.09.02 · staging reset preserved as tag staging-july-2026
2026.08.31Our full commit history, audited and put on the record.The courier retires. An audit of our own history: every commit since May walked diff by diff, one entry each, by an instrument that reads changes instead of trusting labels. One hundred eighty-five commits; twenty-three flagged. Every flag was the same suspect — the upload workflow itself. Empty commits that shipped air. A working set dropped flat at the repo root at 1:43 in the morning, thirty-four files at the wrong paths, none reachable by the build, put back one deletion at a time over seventeen minutes. Not one logic error among them; the tool was the bug. So the tool is retired. The repo lives on real iron now, commits carry real messages, and the full walk is on file. This ledger cites it from here on.// record — 185 commits audited · 2026-05-21 → 08-28 · flags #64 #108 #139 #144 #182
2026.08.28Fixed a save race that quietly dropped crawled pages.The race we were losing quietly. One run lost eight of forty-two pages and said nothing. Cause: page records — small, vital, the thing a courtesy preload lives on — sharing a write ceiling with a hundred-kilobyte checkpoint that deserved one. They no longer share. Page records are awaited outright; only the checkpoint rides a clock. And resume stopped having a single point of failure: full checkpoint, then the slim state written at a run's natural end, then pages-only — three rungs down before it ever says "no checkpoint," and a 404 now names which records existed instead of shrugging. The board a courtesy guest opens is the banked board — findings, coverage, sources, robots, raw PSI stored verbatim — not a partial reconstruction.// record #184–#185 — 2 commits · one night
2026.08.28Share links got a real, edge-verified web address.The door learns the invite. Courtesy links grew real shape: /scan/⟨site⟩/⟨token⟩, verified at the edge before any claim of "unlocked" is made — an expired or forged token degrades into the plain scan door, never past it. Edge functions run before redirects, so the door learned the shape itself rather than trusting the routing table behind it. A valid invite retitles the share card with the client's own domain; a token riding the path is never mistaken for the scan target.// record #138 · #183 — 2 commits · same night
2026.08.28Fixed the admin login a navigation change had broken.Five clicks on a ghost. The vault's admin knock — five clicks on the logo — died in a nav rework that deleted the logo it listened to; one unguarded listener threw and took every binding below it down with it, silently. The repair is threefold: knock on the element the shared nav actually injects, null-guard every binding so one missing limb can't kill the body, and a plain fallback address no rework can remove — it costs nothing, because obscurity was never the security. Lesson filed where lessons go: in the code, as a comment, dated.// record #140 — 1 commit · 1:24 AM
2026.08.26–27The report now tells a broken page from an unreachable one.The instrument stops blaming the wrong party. Two days of fairness rulings. A transport failure on our side was being reported as a finding about your site — no longer; the report now knows the difference between "your page is broken" and "we couldn't reach it." A host's rate limiter stopped being billed to the site it protects. Your robots.txt now sets the crawler's tempo, and the serverless clock is answered by slicing the work, not by ignoring your delay. Sampling is declared as a scope fact in every output rather than left as a silent gap, robots-blocked links earned a fifth honest state instead of a score, and one line of report language was walked back from a claim about intent to a statement of what was observed. What the instrument only ever showed on screen now ships in the exported report.// record #130–#137 — 8 commits · 2 days
2026.08.24Cleaned up the exhibit stats, privacy page, and visitor count.The instrument grades itself. Housekeeping in three rooms, all in the same spirit. The exhibit's panel is now a ledger, not a sentence — one stat per line, its definition under it, and a split where the data itself splits: before source tagging, events by type; after, sources by type. Nothing crosses that line by inference. The privacy page tells the same story the code now does — the twelve-character source fragment is disclosed, dated, and bounded by the nightly salt. And the human count got stricter: an automated browser is not a person, including ours. Our own Depth Skimmer rendered every page like a visitor and was quietly counted like one — roughly eight "human visits" per skim. It now announces itself and is seen, not counted. The Skimmer, meanwhile, stopped hedging twice: structured data is validated locally instead of merely detected, and domain expiry climbs three rungs — aggregator, registry, WHOIS — and names the one that answered. Two entries in its Coverage Ledger moved from partial to measured, and the first site it graded on the new rules was this one.// record #125–#129 — 5 commits · 08.22 evening → 08.24
2026.08.22Fixing the exhibit's wrong traffic and visitor numbers, in the open.Open wound, under care. The exhibit's numbers are wrong and we're saying so before they're right. Two fights at once: the database was being polled harder than any visitor deserved — a hundred gigabytes moved this month for a page that should sip — and the visitor count was never counting visitors. Every hop through the Maze stood in for a person, then the lifetime ledger flipped the other way and counted next to nobody. Same root: no event ever carried a source. It does now — a daily-salted token, never an address, gone by tomorrow — and the ledger has one recount mechanism instead of two racing each other. The totals you see today are mid-correction. We'll update this line when they're accurate, not before.// record #117–#124 — 8 commits · one night, 23:38 → 11:14
2026.08.21The exhibit now keeps all-time totals, not just the recent feed.The ledger beneath the feed. Armor so good it stopped our own blood: X-Frame-Options DENY — shipped as clickjacking protection — refused our own Maze inside our own privacy page for a day. SAMEORIGIN now; external framers stay blocked, the house may frame itself. Then the exhibit's counters got audited: a 943-bot storm flushed weeks of history out of the public feed's 2,000-row memory, and "all time" was quietly reporting the feed's horizon, not the truth. Every event was always archived — 365-day rolling, nothing lost — the label just claimed more than the window held. Now a lifetime ledger survives the trim: totals accumulate as events drain, the archive backfilled the weeks the feed forgot, and ALL TIME says "since" and means it. The flow shows the last two thousand signals; the numbers remember everything.// record #112–#116 — 5 commits · one evening
2026.08.20Fixed pages that loaded blank and read as empty.The heaviest page. One heavy page on a prospect crawl: found on nine pages, fetched never — 200s with no page inside. Three theories died in daylight (timeout, rate limit, then the truth: a CSR shell served to non-browser fetches, and our own render-client shooting the worker at a hardcoded 12 seconds — the box never missed, it was killed by its caller). Fix shipped as a ladder: failure reasons on every record (timeout · http-status · conn · soft-block-200, first bytes kept as evidence), shape-aware retries, staggered launches — no more simultaneous volleys — and rescue renders that finally get to finish: 20 seconds and a settle hint. Failed pages now read "not assessed," never "nothing there." The instrument stopped blaming pages it couldn't reach. Postscript, same night: it fell once more — new mechanism. The render worker takes jobs one at a time and never learns when a caller quits, so enrichment renders were clogging the line ahead of the one render that mattered. The queue tilt: enrichment waits four seconds, rescues reach the worker first by construction. Verified live — the page that failed four ways reads rescued, repeatably. Also: a 404 page at last — you are not lost, the map is.// record #103–#110 — 8 commits · one evening, 18:50 → 22:47
2026.08.20Surface Skim retired; a cleaner scan door opened.The doors. Surface Skim rests for maintenance — one honest banner behind its old address. New door: /scan/⟨yoursite⟩ arrives with the target loaded and the run button breathing; an edge function titles each shared link after the site it points at. The guided walk: run → the topology takes the stage → the summary button glows at the foot of the screen when the last layer lands → the findings inherit the light. Nothing pre-checked, ever — the attestation is yours to make.// record #98–#102 — 5 commits
2026.08.20Built the share card and fixed eleven of our own defects.The face. OG card built from our own parts: the wolf on his native dark, the Markov blanket from the card art layered behind glass, the motto printed on the weave it describes. Favicon: the nav polygon mid-scramble, one vertex flaring — the System caught working, seed 64. Nineteen card versions to earn the name. And the physician healed thyself: morning self-skim found eleven defects on this very site — missing headers, no sitemap, bare canonicals, a title collision, the tool's own missing share card — evening deploys erased them, verified by the same instrument that found them. Two flags remain, both chosen.// record #94–#97 — 4 commits · morning skim → evening deploys
2026.08.19Every finding now has a button that explains the fix.How to resolve. Every finding on the board grew a button: tap, and an AI reads the evidence this run actually collected — your robots.txt as fetched, your platform's fingerprint — and teaches the fix in plain language, hedged where honesty demands it, capped by the well, never automatic. Free tier's automatic pass rides the smaller model; the tap gets the better one. Below every answer, the same line: ai-generated, not a substitute for professional analysis. The robots.txt contradiction (three domains, two sheets disagreeing about one file) retired the structural way — one derivation, every consumer, and the report now reads your robots file back to you rule by rule, AI crawlers included.// record #91–#93 — 3 commits
2026.08.01Bigger text, sharper platform detection, honest confidence labels.Day 2.1 drop-ins. Stale copy swept, EZ-Read sitewide — larger, brighter text on every page, one toggle. Platform fingerprints for the small-business web (Wix · Weebly · Duda · GoDaddy · BentoBox) and the AI pass rebuilt on a hallucination leash — cite what you see, flag nothing you cannot point to. Site chrome counted once: nav and footer are one element no matter how many pages carry them, and every verdict wears one of five honest confidence labels, from confirmed with evidence attached down to by design. The report stopped double-counting and started saying how sure it is.// dated by the record · #85–#90 — 6 commits · one day
2026.07.30Twenty-two fixes toward a report that never overstates itself.The day of telling the truth. Twenty-two commits, one theme. One URL-identity rule replaced three divergent ones, so a page can no longer appear twice under tracking params or miss its own tower over letter case — and render budget started spending by identity, not by luck. The crawler began announcing itself by name and obeying robots.txt on the walk-through, not just at the door. Button verification went from guessing at markup to the headless worker testing whether a living handler actually answers. The 3D view stopped rendering uncertainty as failure. A self-referential false positive — the tool's own copy about bot walls, classified as one — was fixed and permanently fixtured. And the status line stopped lying: the fake phase timers came out, replaced by real telemetry, in a commit that says so in those words. One regression shipped and was caught and undone six minutes later; both halves are on the permanent record.// record #68–#89 — 22 commits · one day
2026.07.30The crawler now reads each page like a real browser.Depth Skimmer, Day 2 and the render worker. A persistent headless Chromium on real iron — pages read as a visitor's browser builds them, buttons probed for living handlers, verdicts tiered by evidence: confirmed · verified · resolves · unconfirmed · by design. Canonical addresses counted once, aliases named, robots honored past the front door with skips reported, the spoofed UA retired for an honest one — the crawler announces itself now. Orchestrated windows with continuation tokens; the well burns once. Suite grew from 94 locked facts to two-hundred-plus, including the extractor bug's tombstone — and it kept growing all month, every fix buried with a test on its grave.// dated by the record · #68–#84 — same day as the entry above, told from the machinery's side
2026.07.28The site went live and the old open root was closed.Staging cleaned to main. The site is live. Two doors became one.// what the one-liner held: record #29–#66 — 38 commits · one afternoon, most inside four minutes. 35 legacy files retired in one sweep, the modular skim engine and the metered well arrive, and — the structural fix the record demanded — a real publish boundary. Only site/ is served from this day; notes, harnesses, and machinery live behind it by construction. The era of the open root ends here.
2026.07.24Self-hosted fonts and a rebuilt, faster front page.Front-face pass. Fonts self-hosted — six latin subsets, ~90KB, first-paint flash eliminated sitewide. Hazard tape retired; the seam breathes instead. Portfolio rebuilt as Built & Running — the instrument is the exhibit. Mobile keeps the brain. Contact intake + live Depth Skim moved to the front page. THE WELLS — server-truth token gauges per tool, global counters only, nothing about who; donated capacity rolls over. Markov blanket resurrected — killed by a nav-refactor null three pushes ago, found by autopsy diff, guarded for good.// the record places this work inside the 07.28 sweep to main (record #29–#63); built in the days before, landed with it
2026.07.09Built the Maze; a half-revert left files on the record.The maze day, and the revert that wasn't whole. The Maze of Mal-Intent lands in one afternoon — an edge-function trap with privacy-preserving origin attribution, a public exhibit for the movement, a locked forensic layer beneath it, and robots.txt drawing three doors. The same afternoon, an accidental push is honestly reverted — the message says so, and means it — except the record shows it was only half a revert: every new file survived, and the repo carried the maze's machinery with its wiring pulled out for nineteen days until the July sweep made it official. Also on the record from this era, kept because the covenant says so: with no publish boundary yet set, the repo root was the site root — planning notes, a morning handoff letter to self, and one build ZIP were publicly fetchable until 07.28 closed the door.// record #17–#27 — 11 commits · one afternoon, 13:02 → 17:12 · flags #14 #16 #28
2026.07.09Privacy-first telemetry: no cookies, no stored addresses.Telemetry v2 + the Maze. Session-chain signals — no cookies, no stored IPs, ASN only and the address is discarded in transit. Batched edge writes. Public exhibit feed. Privacy covenant rewritten in the same commit, as the rule demands. robots.txt with three doors. Contact form wired live.// dated by the record · #17–#24 — 8 commits
2026.07.09One file, two doors: the tools and rndLabs hubs.Dual-gate hub — /tools and /rndlabs, one file, two doors. Node registry as single edit point. WildSpeak doors opened (/ws). Forge functions — word-level timestamps from audio, server-side.// dated by the record · #19–#23 — 5 commits, including one delete/re-add round trip
2026.06.28–29The recon cockpit gained view modes and an annotated export.Recon cockpit v0.9e series — three view modes, annotated XLSX export with in-page AI pass, renderer un-mirrored into one shared depth engine, Pursue-to-Depth-Skim handoff.// dated by the record · #14–#16 — 3 commits carrying weeks of work, landing as one batch
2026.05.26–06.28The recon discipline earned a name and a manifest.KRF protocol formalized — the recon discipline gets a name. AART converted to manifest-driven datasets. Pipeline split — staging and production branches, one repo, two doors.// dated by the record: staging-era — no matching commits in main; the date is the gap it happened inside (#13 → #14)
2026.05.24–25The tools launch went up, came down, and returned larger.Shipped, unshipped, reshipped. The tools launch goes up at 6:24 in the morning — CRC, the first Surface Skim page, nav links across the site — and comes back down seven minutes later in five separate commits, one deletion at a time. The next night it returns larger: CRC re-architected with its behaviors split into a registry, nav centralized into one file, the page half again its first size. The retraction is on the permanent record next to the return. First drafts get withdrawn here; they don't get denied.// record #4–#10 — 7 commits · 2 days
2026.05.25Surface Skim gained safety limits and richer exports.Surface Skim hardened — SSRF blocklist, domain blocklist, robots.txt good-faith check, rate protection, prompt length cap. Three-option attestation flow. Business impact column added to Excel export. Hidden disclosure sheet. Scraped elements sheet. Semantic geometry reframe — "potentially deprecated / likely fine" language throughout. CRC orbital bubble system, intent tag surfacing, click/charge/chase/scatter interactions. Depth Skim first draft — three-layer crawler, 3D signal topology visualization, I/O terminal tower geometry, pit of fractious intent.// record #10–#13 — 4 commits · one night, 23:12 → 00:04
2026.05.19The LLC, the client vault, and the first scan tool.LLC approved. Major push — Client Vault (Firebase, timed slots, access codes, AES-256-GCM encryption, server-side admin auth). Surface Skim tool launched — AI-powered semantic surface analysis, Excel export, signal map visualization. Privacy page. Cursor system extracted. Nav fully wired. Stripe deferred — request flow active.// dated by the record: the repo's first commits land 2026-05-21 · record #1–#3 — the push described here reached main that day
2026.05.18The home page's hero animation was rebuilt.Hero animation upgraded — chaos system, ephemeral clusters, semantic concept arcs, chain link rolls, rotating anchor.
2026.05.17Added the services page and wired up the nav.Services page added. Nav wired. Hero copy updated — problem geometry framing.
2026.05.16Set up business email and secured the domain.Google Workspace activated. Business email in progress. Domain secured.