machine-readable surface

Fingerprint

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.


Chrome routes (19)

Pathmd5URL
/ (FLOOR)9c1636c7b12c69f894c3bca70da89c3dhttps://hool.dev/
/about/17be235be3123eeae379ef25d41d28c2https://hool.dev/about/
/agent-roster/be5a10f074f8e797632a750ba58952bbhttps://hool.dev/agent-roster/
/book/35ce4dd9672b5083eb7e866c027a44f0https://hool.dev/book/
/card/9433a212b8314b6a2bda07985f7705f2https://hool.dev/card/
/changelog/1d7b1b85d1d0e9e03b200861e7279efehttps://hool.dev/changelog/
/colophon/def6baaea96115f61115a45933f01676https://hool.dev/colophon/
/corrections/1f12180af68655235cb9d39be14a2f59https://hool.dev/corrections/
/faq/6c74c6580a1d86e23dbd0f439ff23bc5https://hool.dev/faq/
/fingerprint/e28d9ce85a521460922aa6719dea08dahttps://hool.dev/fingerprint/
/gallery/cab0be1468b23a4cfd8f07bbd3a0baaehttps://hool.dev/gallery/
/linkedin/2026-06-05-thumbprint/f164cd33c96fcf9581121d5dbc73a53chttps://hool.dev/linkedin/2026-06-05-thumbprint/
/now/7e116bf694c9f1f49ec615d114bbac98https://hool.dev/now/
/portrait/e89e3d17248c581e06205ecbb14c1df2https://hool.dev/portrait/
/press-kit/6fabf5b9104296778b313948003baf49https://hool.dev/press-kit/
/receipts/eca39f30e7bde0e0008cd269030dd28bhttps://hool.dev/receipts/
/start/88b160cdca9786612aa914a9fe7e6ca6https://hool.dev/start/
/stats/d8094d15282400b62ca0f540f2818794https://hool.dev/stats/
/work/3c806ff9e24e606fc0d5294b981a1f12https://hool.dev/work/

Root assets (13)

Pathmd5URL
/404.htmld6d8eac7f6596617812f79906c41ce8fhttps://hool.dev/404.html
/_headers9e28862a2590134bd1605a11e259ddf5/_headers · deploy control (not a public URL)
/_redirectsb5ae6668be7612d1298b0ff55ab1e72d/_redirects · deploy control (not a public URL)
/a5_personal_brand_v0.1.htmlebda4eb5d557a057a1367461d66469cdhttps://hool.dev/a5_personal_brand_v0.1.html
/apple-touch-icon.png2bedcb6d57ed10b085843de1feac8148https://hool.dev/apple-touch-icon.png
/favicon-32.png0fd073b49fa3f4d47d684119a056d3fahttps://hool.dev/favicon-32.png
/favicon-512.pnga376b262b83115c2b70cdc64b74ae868https://hool.dev/favicon-512.png
/favicon.icob775e12a6c127d0e5c83719a00b9a553https://hool.dev/favicon.ico
/index.html9c1636c7b12c69f894c3bca70da89c3dhttps://hool.dev/index.html
/llms.txt009a248c700f9a1d9afcc04727bbd813https://hool.dev/llms.txt
/manifest.json3b79ff9d09dbd8aa8c04e2a906a66301https://hool.dev/manifest.json
/robots.txtbdd569babd65bc8a73f891d57ddfaa20https://hool.dev/robots.txt
/sitemap.xml04eb1f91337351e8554632de2cdecb27https://hool.dev/sitemap.xml
Fonts (3)
Pathmd5URL
/fonts/fraunces-var-italic.woff23d15406bbc1ab2b90093c6995afc324bhttps://hool.dev/fonts/fraunces-var-italic.woff2
/fonts/fraunces-var.woff25d283517432688cbc312a7a954516ccehttps://hool.dev/fonts/fraunces-var.woff2
/fonts/jetbrains-mono-var.woff2570751c5f8b418972c1976160ba6ed85https://hool.dev/fonts/jetbrains-mono-var.woff2
OG card (3)
Pathmd5URL
/og/card.svg9fda712c1280712b0703a13f2fa5dff4https://hool.dev/og/card.svg
/og/icon.svg0738683b3b1cd20a2d73c7b50e73a11chttps://hool.dev/og/icon.svg
/og/john.png081b70d346770032d35fb62f10c73983https://hool.dev/og/john.png

Disk ↔ CDN byte drift

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.

No audit run yet.
Pathdisk md5apex md5bytesverdictnotes

Sitemap ↔ served routes reconciliation

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.

No reconciliation run yet.
URLapex statusapex md5verdictnotes

Sitemap ↔ git-history freshness drift

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.

No freshness run yet.

locsitemap <lastmod>git history lastmodgap (days)verdictreason

DNS ↔ apex record audit

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".

No probe run yet.
qtyperecordsmin TTLverdictsample
Show raw JSON for last probe
No probe run yet.

CDN delivery state

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.

No probe run yet.
pathcf-cache-statuscache-controlagecf-rayresponse-timeverdict

Content delivery drift

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.

No probe run yet.
pathdisk shaapex shabyteslinesmeta-vs-proseverdict

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).