machine-readable surface
A live, dated md5 + URL map of every public route and asset on hool.dev. The machine-friendly mirror of /colophon/#verification — same hash, same source, sortable.
| Path | md5 | URL |
|---|---|---|
| / (FLOOR) | 9c1636c7b12c69f894c3bca70da89c3d | https://hool.dev/ |
| /about/ | 17be235be3123eeae379ef25d41d28c2 | https://hool.dev/about/ |
| /agent-roster/ | be5a10f074f8e797632a750ba58952bb | https://hool.dev/agent-roster/ |
| /book/ | 35ce4dd9672b5083eb7e866c027a44f0 | https://hool.dev/book/ |
| /card/ | 9433a212b8314b6a2bda07985f7705f2 | https://hool.dev/card/ |
| /changelog/ | 1d7b1b85d1d0e9e03b200861e7279efe | https://hool.dev/changelog/ |
| /colophon/ | def6baaea96115f61115a45933f01676 | https://hool.dev/colophon/ |
| /corrections/ | 1f12180af68655235cb9d39be14a2f59 | https://hool.dev/corrections/ |
| /faq/ | 6c74c6580a1d86e23dbd0f439ff23bc5 | https://hool.dev/faq/ |
| /fingerprint/ | e28d9ce85a521460922aa6719dea08da | https://hool.dev/fingerprint/ |
| /gallery/ | cab0be1468b23a4cfd8f07bbd3a0baae | https://hool.dev/gallery/ |
| /linkedin/2026-06-05-thumbprint/ | f164cd33c96fcf9581121d5dbc73a53c | https://hool.dev/linkedin/2026-06-05-thumbprint/ |
| /now/ | 7e116bf694c9f1f49ec615d114bbac98 | https://hool.dev/now/ |
| /portrait/ | e89e3d17248c581e06205ecbb14c1df2 | https://hool.dev/portrait/ |
| /press-kit/ | 6fabf5b9104296778b313948003baf49 | https://hool.dev/press-kit/ |
| /receipts/ | eca39f30e7bde0e0008cd269030dd28b | https://hool.dev/receipts/ |
| /start/ | 88b160cdca9786612aa914a9fe7e6ca6 | https://hool.dev/start/ |
| /stats/ | d8094d15282400b62ca0f540f2818794 | https://hool.dev/stats/ |
| /work/ | 3c806ff9e24e606fc0d5294b981a1f12 | https://hool.dev/work/ |
| Path | md5 | URL |
|---|---|---|
| /404.html | d6d8eac7f6596617812f79906c41ce8f | https://hool.dev/404.html |
| /_headers | 9e28862a2590134bd1605a11e259ddf5 | /_headers · deploy control (not a public URL) |
| /_redirects | b5ae6668be7612d1298b0ff55ab1e72d | /_redirects · deploy control (not a public URL) |
| /a5_personal_brand_v0.1.html | ebda4eb5d557a057a1367461d66469cd | https://hool.dev/a5_personal_brand_v0.1.html |
| /apple-touch-icon.png | 2bedcb6d57ed10b085843de1feac8148 | https://hool.dev/apple-touch-icon.png |
| /favicon-32.png | 0fd073b49fa3f4d47d684119a056d3fa | https://hool.dev/favicon-32.png |
| /favicon-512.png | a376b262b83115c2b70cdc64b74ae868 | https://hool.dev/favicon-512.png |
| /favicon.ico | b775e12a6c127d0e5c83719a00b9a553 | https://hool.dev/favicon.ico |
| /index.html | 9c1636c7b12c69f894c3bca70da89c3d | https://hool.dev/index.html |
| /llms.txt | 009a248c700f9a1d9afcc04727bbd813 | https://hool.dev/llms.txt |
| /manifest.json | 3b79ff9d09dbd8aa8c04e2a906a66301 | https://hool.dev/manifest.json |
| /robots.txt | bdd569babd65bc8a73f891d57ddfaa20 | https://hool.dev/robots.txt |
| /sitemap.xml | 04eb1f91337351e8554632de2cdecb27 | https://hool.dev/sitemap.xml |
| Path | md5 | URL |
|---|---|---|
| /fonts/fraunces-var-italic.woff2 | 3d15406bbc1ab2b90093c6995afc324b | https://hool.dev/fonts/fraunces-var-italic.woff2 |
| /fonts/fraunces-var.woff2 | 5d283517432688cbc312a7a954516cce | https://hool.dev/fonts/fraunces-var.woff2 |
| /fonts/jetbrains-mono-var.woff2 | 570751c5f8b418972c1976160ba6ed85 | https://hool.dev/fonts/jetbrains-mono-var.woff2 |
| Path | md5 | URL |
|---|---|---|
| /og/card.svg | 9fda712c1280712b0703a13f2fa5dff4 | https://hool.dev/og/card.svg |
| /og/icon.svg | 0738683b3b1cd20a2d73c7b50e73a11c | https://hool.dev/og/icon.svg |
| /og/john.png | 081b70d346770032d35fb62f10c73983 | https://hool.dev/og/john.png |
Every row above advertises the md5 of a file on disk. This auditor fetches each row from the live apex (cache-busted) and computes its real md5, then compares the two. If the apex md5 differs from disk → CDN_INJECT: Cloudflare is rewriting the response (most commonly __cf_email__ obfuscation wrapping any literal email — see FLOOR where guest@hool.dev becomes [email protected]). If apex matches disk → MATCH. The disk-hash bundle below is regenerated every deploy by scripts/bundle-disk-hashes.py.
Idle — click "Audit all 19 chrome routes" or a preset to compare disk bytes against apex bytes.
| Path | disk md5 | apex md5 | bytes | verdict | notes |
|---|
Three-way audit: this page's disk-hashes bundle (what's on disk) vs /sitemap.xml (what's announced) vs the live apex (what's actually served). Five verdicts: MATCH (in sitemap, apex 200, byte-identity to disk) · NOT_IN_SITEMAP (on disk + apex 200 but missing from sitemap) · SITEMAP_404 (in sitemap but apex 404) · REDIRECT (in sitemap but apex 3xx to a different URL) · DRIFT (in sitemap + apex 200 but apex md5 differs from disk = CDN rewrite, same class as the P48 __cf_email__ obfuscation). The reverse-sweep catches the inverse drift: chrome routes that exist on disk + serve cleanly but are absent from the sitemap (which means crawlers can't find them).
Idle — click "Reconcile" to fetch /sitemap.xml + the live apex for every URL listed, then compare against the disk-hashes bundle.
| URL | apex status | apex md5 | verdict | notes |
|---|
Per-URL audit of /sitemap.xml: for every <loc>, compare its <lastmod> against the route's last git-history touch (the bundle ships both, pre-computed). P51 catches sitemap COVERAGE — does every served route appear in the sitemap? — P66 catches sitemap FRESHNESS — does the sitemap's <lastmod> still agree with when the route actually last shipped? Nine verdicts: CURRENT (sitemap lastmod ≤ git history + 30d, the safe band) · STALE_BY_GIT (sitemap lastmod older than git history by >30d — the route changed but the sitemap wasn't refreshed; crawlers see a stale timestamp) · FUTURE_DATED (sitemap lastmod newer than git history by >1d — the route hasn't shipped the change the sitemap announces) · MISSING_LASTMOD (the sitemap url has no <lastmod> tag at all) · URL_404 (the route doesn't exist on disk — sitemap announces dead URL) · NO_GIT_HISTORY (the route exists but was never committed to git — perhaps an untracked artifact) · MALFORMED_LASTMOD / MALFORMED_GIT (a date string the parser couldn't read) · OFFSITE (a url pointing somewhere other than the apex this bundle was generated for). The bundle is regenerated every deploy by scripts/bundle-sitemap-freshness.py.
Idle — click "Render freshness table" to display the per-URL verdicts from the inline sitemap-freshness bundle.
| loc | sitemap <lastmod> | git history lastmod | gap (days) | verdict | reason |
|---|
Five-query DoH probe against cloudflare-dns.com/dns-query (RFC 8484 GET, accept: application/dns-json): A · AAAA · NS · TXT · CAA. Catches four classes of bug no earlier inspector catches: (a) DNS delegation drift — apex still 200s but served from a different edge after a CDN migration; (b) CAA drift — unauthorized CA starts issuing certs (colophon all-certs-by-Lets-Encrypt claim silently false); (c) TXT drift — colophon/llms-full TXT verification claim silently false; (d) dual-stack drift — colophon asserts IPv6 reachability but apex AAAA records disappear. Five verdicts: OK (records returned, parsed cleanly) · EMPTY (NXDOMAIN or no records of this qtype) · DRIFT (records returned but TTL or set suggests a stale / cached answer from a sibling DoH endpoint) · FETCH_DOWN (DoH endpoint unreachable) · CORS_BLOCKED (browser blocked the cross-origin fetch — paste the noscript curl recipe below into a terminal). Default target is hool.dev; replace with any apex to verify that apex's DNS layer.
Idle — click "Probe hool.dev" or edit the target and click "Probe target".
| qtype | records | min TTL | verdict | sample |
|---|
No probe run yet.
Cache-busted probe of every chrome route's live response headers against the apex. Captures the four headers that govern CDN delivery state — cf-cache-status · cache-control · age · cf-ray — plus end-to-end response-time, then emits one of eight verdicts: HIT (cf-cache-status HIT, fully cached) · MISS (cf-cache-status MISS, just populated edge) · DYNAMIC (Cloudflare explicitly skipped cache — static asset misconfig) · EXPIRED (cf-cache-status EXPIRED, cache-control expired) · REVALIDATED (cf-cache-status REVALIDATED, stale-while-revalidate served) · BYPASS (cf-cache-status BYPASS, cache deliberately skipped) · STATIC (static asset served without cache headers — browser cache still applies) · NO_CACHE_HEADER (no cf-cache-status header at all — non-CDN origin or origin-shielded route). Catches four bug classes no earlier inspector catches: (a) cache-control drift — header silently changes between deploys; (b) DYNAMIC-on-static misconfig — a static asset marked DYNAMIC means it never serves from cache; (c) edge skew — different cf-ray prefixes on identical bytes mean cache fanout is broken; (d) response-time regression — slow apex that hasn't crossed any pre-deploy threshold but is 3x last deploy's p50. The p50 response-time banner at the top is the canary; the per-row response-time cell is the drill-down. Empirical baseline (cycle-197 PROPOSED): both / and /work/ emit cf-cache-status: DYNAMIC + cache-control: max-age=300 + a cf-ray: <hex>-MCI identifier, no Server-Timing header, sub-second response-times. HOOL_P58_BUCKETS_BEGIN = [HIT, MISS, DYNAMIC, EXPIRED, REVALIDATED, BYPASS, STATIC, NO_CACHE_HEADER]; HOOL_P58_PROBE_URLS = ["https://hool.dev/", "https://hool.dev/work/", "https://hool.dev/colophon/", "https://hool.dev/fingerprint/", "https://hool.dev/receipts/", "https://hool.dev/stats/"]; HOOL_P58_BUCKETS_END.
Idle — click "Probe all 6 chrome routes" or a preset to capture the four cache-governing headers + response-time for each route.
| path | cf-cache-status | cache-control | age | cf-ray | response-time | verdict |
|---|
Cache-busted probe of every chrome route's rendered prose against the on-disk source-of-truth. Whereas P58 audits headers and P48 audits file bytes, P59 audits the third orthogonal layer: what the visitor actually reads. The page fetches each chrome route via fetch(url, {cache:'no-store'}).text(), parses the response body through new DOMParser().parseFromString(html, 'text/html').documentElement.textContent, canonicalizes the result through the same seven-rule pipeline the on-disk bundle uses (strip <script> · strip <style> · strip HTML comments · strip remaining tags · decode named entities · decode numeric entities · collapse whitespace), then SHA-256s it and compares against the public/fingerprint/prose-sources.json bundle emitted at deploy time. Three way the comparison is done: on-disk prose hash (sha256 of the canonicalized disk source — what the visitor SHOULD receive) vs apex prose hash (sha256 of the canonicalized apex response — what the visitor ACTUALLY receives) vs meta-vs-prose (the <title> and <meta name="description"> content extracted from the apex DOM, cross-checked against the first 160 chars of the rendered prose — a drift here means the page advertises one thing and says another). Catches four bug classes no earlier inspector catches: (a) prose-injection drift — apex serves different visitor-visible text than the on-disk source claims (cycle-170 finding: Cloudflare email-obfuscation wraps the literal guest@hool.dev in /index.html and /portrait/index.html into <a class="__cf_email__">[email protected]</a> and appends the /cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js script — visitor sees a different prose than the on-disk html); (b) prose-drop drift — apex serves fewer lines than disk (a deploy half-shipped, or a parent route blanked an inner section); (c) prose-add drift — apex serves more lines than disk (upstream proxy inserted an injected banner, header, or footer); (d) meta-vs-prose drift — <title> or <meta name="description"> describes one thing but the rendered prose describes another. Empirical baseline (cycle-200 PROPOSED): 6 chrome routes /, /work/, /colophon/, /fingerprint/, /receipts/, /stats/ expected to emit MATCH on disk-hash AND apex-hash AND meta-prose after the CF email-decode wrapper is recognized as a transparent envelope (P59 reports PROSE_INJECT with the wrap delta cited, not as a hard fault — same posture P48 takes on the byte layer; P59 is the prose-layer mirror). HOOL_P59_BUCKETS_BEGIN = [MATCH, PROSE_INJECT, PROSE_DROP, PROSE_ADD, META_DRIFT, FETCH_DOWN, NOT_BUNDLED]; HOOL_P59_PROBE_URLS = ["https://hool.dev/", "https://hool.dev/work/", "https://hool.dev/colophon/", "https://hool.dev/fingerprint/", "https://hool.dev/receipts/", "https://hool.dev/stats/"]; HOOL_P59_BUCKETS_END.
Idle — click "Probe all 6 chrome routes" or a preset to compute the canonicalized prose hash for each route and compare against the on-disk bundle.
| path | disk sha | apex sha | bytes | lines | meta-vs-prose | verdict |
|---|
how to use
Every row is the current state of the file at deploy time. To verify:
curl -s https://hool.dev/fingerprint/ | grep "<code>"
should reproduce the table below;
curl -s https://hool.dev/ | md5
should return 9c1636c7b12c69f894c3bca70da89c3d for the FLOOR. Sister surfaces:
/colophon/ (technical disclosure),
/changelog/ (dated shipping record),
/receipts/ (failures + verifications ledger),
/stats/ (outbound claims).