{"_canonicalization":{"envelope_id":"axm_ + sha256(envelope minus {signature, axiom_id, anchors})","envelope_signature":"ed25519(envelope minus {signature, axiom_id})","json":"sort_keys=True, separators=(',',':'), ensure_ascii=False, allow_nan=False, utf-8","leaf_hash":"sha256(0x00 || canonical_json(envelope_full))","seal_signature":"ed25519(seal minus {signature, sig_algorithm})"},"axiom_id":"axm_11d78b0c1fa8bc8ebc6a724b07860e4e6a6fa4da0f83ac2b1691450232d75241","bitcoin_anchor":{"bitcoin_attestations":["bitcoin_block_949451"],"calendar_attestations":["https://finney.calendar.eternitywall.com","https://btc.calendar.catallaxy.com","https://alice.btc.calendar.opentimestamps.org","https://bob.btc.calendar.opentimestamps.org"],"ots_url":"/registry/data/substrate/anchors/77fc9c28fae777b81da5b495b3115474df6592dfac590333213d3bdf8b94a9b3.ots","stamped_at":"2026-05-15T03:00:03Z","status":"bitcoin"},"envelope":{"anchors":[{"chain":"crovia.axiom_graph","height":0,"merkle_proof":"6f109227e3860fb1e0a687e7255b766deb93b74d7dc8f4a07117d8a54af7f23e","root_at_anchor":"6f109227e3860fb1e0a687e7255b766deb93b74d7dc8f4a07117d8a54af7f23e"}],"axiom_id":"axm_11d78b0c1fa8bc8ebc6a724b07860e4e6a6fa4da0f83ac2b1691450232d75241","axiom_type":"AX.OBS","body":{"collector_run_at":"2026-04-27T17:30:38Z","collector_run_id":"rb_a835e691e92d4a4d","collector_version":"1.0.0","evidence":{"ai_directives":[{"allow":[],"disallow":["/"],"mode":"blocked","source":"explicit","user_agent":"GPTBot"},{"allow":["/"],"disallow":[],"mode":"allowed","source":"wildcard","user_agent":"ChatGPT-User"},{"allow":["/"],"disallow":[],"mode":"allowed","source":"wildcard","user_agent":"OAI-SearchBot"},{"allow":[],"disallow":["/"],"mode":"blocked","source":"explicit","user_agent":"ClaudeBot"},{"allow":["/"],"disallow":[],"mode":"allowed","source":"wildcard","user_agent":"Claude-Web"},{"allow":["/"],"disallow":[],"mode":"allowed","source":"wildcard","user_agent":"anthropic-ai"},{"allow":[],"disallow":["/"],"mode":"blocked","source":"explicit","user_agent":"CCBot"},{"allow":[],"disallow":["/"],"mode":"blocked","source":"explicit","user_agent":"Google-Extended"},{"allow":["/"],"disallow":[],"mode":"allowed","source":"wildcard","user_agent":"GoogleOther"},{"allow":[],"disallow":["/"],"mode":"blocked","source":"explicit","user_agent":"Applebot-Extended"},{"allow":["/"],"disallow":[],"mode":"allowed","source":"wildcard","user_agent":"FacebookBot"},{"allow":[],"disallow":["/"],"mode":"blocked","source":"explicit","user_agent":"Meta-ExternalAgent"},{"allow":["/"],"disallow":[],"mode":"allowed","source":"wildcard","user_agent":"Meta-ExternalFetcher"},{"allow":[],"disallow":["/"],"mode":"blocked","source":"explicit","user_agent":"Amazonbot"},{"allow":["/"],"disallow":[],"mode":"allowed","source":"wildcard","user_agent":"PerplexityBot"},{"allow":["/"],"disallow":[],"mode":"allowed","source":"wildcard","user_agent":"ai2bot"},{"allow":[],"disallow":["/"],"mode":"blocked","source":"explicit","user_agent":"Bytespider"},{"allow":["/"],"disallow":[],"mode":"allowed","source":"wildcard","user_agent":"DuckAssistBot"},{"allow":["/"],"disallow":[],"mode":"allowed","source":"wildcard","user_agent":"cohere-ai"},{"allow":["/"],"disallow":[],"mode":"allowed","source":"wildcard","user_agent":"cohere-training-data-crawler"},{"allow":["/"],"disallow":[],"mode":"allowed","source":"wildcard","user_agent":"xAI-Bot"},{"allow":["/"],"disallow":[],"mode":"allowed","source":"wildcard","user_agent":"MistralAI-User"},{"allow":["/"],"disallow":[],"mode":"allowed","source":"wildcard","user_agent":"*"}],"body_bytes":35671,"body_full":"# As a condition of accessing this website, you agree to abide by the following\n# content signals:\n\n# (a)  If a Content-Signal = yes, you may collect content for the corresponding\n#      use.\n# (b)  If a Content-Signal = no, you may not collect content for the\n#      corresponding use.\n# (c)  If the website operator does not include a Content-Signal for a\n#      corresponding use, the website operator neither grants nor restricts\n#      permission via Content-Signal with respect to the corresponding use.\n\n# The content signals and their meanings are:\n\n# search:   building a search index and providing search results (e.g., returning\n#           hyperlinks and short excerpts from your website's contents). Search does not\n#           include providing AI-generated search summaries.\n# ai-input: inputting content into one or more AI models (e.g., retrieval\n#           augmented generation, grounding, or other real-time taking of content for\n#           generative AI search answers).\n# ai-train: training or fine-tuning AI models.\n\n# ANY RESTRICTIONS EXPRESSED VIA CONTENT SIGNALS ARE EXPRESS RESERVATIONS OF\n# RIGHTS UNDER ARTICLE 4 OF THE EUROPEAN UNION DIRECTIVE 2019/790 ON COPYRIGHT\n# AND RELATED RIGHTS IN THE DIGITAL SINGLE MARKET.\n\n# BEGIN Cloudflare Managed content\n\nUser-agent: *\nContent-Signal: search=yes,ai-train=no\nAllow: /\n\nUser-agent: Amazonbot\nDisallow: /\n\nUser-agent: Applebot-Extended\nDisallow: /\n\nUser-agent: Bytespider\nDisallow: /\n\nUser-agent: CCBot\nDisallow: /\n\nUser-agent: ClaudeBot\nDisallow: /\n\nUser-agent: CloudflareBrowserRenderingCrawler\nDisallow: /\n\nUser-agent: Google-Extended\nDisallow: /\n\nUser-agent: GPTBot\nDisallow: /\n\nUser-agent: meta-externalagent\nDisallow: /\n\n# END Cloudflare Managed Content\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>CROVIA — Public Evidence System</title>\n    <link rel=\"icon\" type=\"image/png\" href=\"/logo.png\">\n    <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500;600&display=swap\" rel=\"stylesheet\">\n    <style>\n        * { margin: 0; padding: 0; box-sizing: border-box; }\n\n        body {\n            font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n            background:\n                radial-gradient(900px circle at 18% 0%, rgba(0, 255, 102, 0.10), transparent 60%),\n                radial-gradient(900px circle at 82% 10%, rgba(0, 212, 255, 0.08), transparent 60%),\n                #000;\n            color: #d4d4d4;\n            line-height: 1.7;\n            font-size: 14px;\n        }\n\n        .container {\n            max-width: 1060px;\n            margin: 0 auto;\n            padding: 70px 20px;\n        }\n\n        header {\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            gap: 24px;\n            margin-bottom: 56px;\n        }\n\n        .mark {\n            color: #fff;\n            font-weight: 600;\n            letter-spacing: 0.3em;\n            font-size: 13px;\n            font-family: 'JetBrains Mono', monospace;\n        }\n\n        .brand {\n            display: flex;\n            align-items: center;\n            gap: 16px;\n            min-width: 0;\n        }\n\n        .logo {\n            width: 40px;\n            height: 40px;\n            flex-shrink: 0;\n        }\n\n        .live-indicator {\n            display: flex;\n            align-items: center;\n            gap: 10px;\n            color: #777;\n            font-size: 12px;\n            font-family: 'JetBrains Mono', monospace;\n            white-space: nowrap;\n        }\n\n        .live-dot {\n            width: 9px;\n            height: 9px;\n            border-radius: 50%;\n            background: #444;\n            animation: pulse 2s infinite;\n        }\n\n        .live-dot.ok { background: #00ff66; }\n        .live-dot.warn { background: #f59e0b; }\n        .live-dot.down { background: #ef4444; }\n\n        @keyframes pulse {\n            0%, 100% { opacity: 1; }\n            50% { opacity: 0.35; }\n        }\n\n        \n\n        \n\n        .statements {\n            margin-bottom: 40px;\n        }\n\n        .statement {\n            margin-bottom: 14px;\n            color: #999;\n            font-size: 14px;\n        }\n\n        .statement strong {\n            color: #fff;\n            font-weight: 600;\n        }\n\n        .live {\n            border: 1px solid #222;\n            border-radius: 12px;\n            overflow: hidden;\n            background: #050505;\n            margin-bottom: 24px;\n        }\n\n        .live-header {\n            padding: 14px 16px;\n            border-bottom: 1px solid #222;\n            display: flex;\n            justify-content: space-between;\n            align-items: baseline;\n            gap: 20px;\n        }\n\n        .live-title {\n            color: #fff;\n            font-size: 11px;\n            letter-spacing: 0.25em;\n            opacity: 0.9;\n            font-family: 'JetBrains Mono', monospace;\n        }\n\n        .live-meta {\n            color: #666;\n            font-size: 11px;\n            font-family: 'JetBrains Mono', monospace;\n        }\n\n        .live-body {\n            padding: 16px;\n            display: grid;\n            grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));\n            gap: 12px;\n        }\n\n        .live-card {\n            border: 1px solid #222;\n            border-radius: 12px;\n            padding: 14px;\n            background: #000;\n        }\n\n        .live-card-title {\n            color: #fff;\n            font-size: 13px;\n            margin-bottom: 10px;\n            font-weight: 600;\n        }\n\n        .kv {\n            display: grid;\n            gap: 8px;\n            font-family: 'JetBrains Mono', monospace;\n            font-size: 12px;\n        }\n\n        .kv-row {\n            display: flex;\n            justify-content: space-between;\n            gap: 14px;\n        }\n\n        .kv-label {\n            color: #777;\n        }\n\n        .kv-value {\n            color: #d4d4d4;\n            text-align: right;\n            overflow-wrap: anywhere;\n            word-break: break-word;\n        }\n\n        .live-list {\n            list-style: none;\n            padding: 0;\n            margin: 0;\n            display: grid;\n            gap: 8px;\n            font-family: 'JetBrains Mono', monospace;\n            font-size: 12px;\n        }\n\n        .live-item {\n            display: flex;\n            justify-content: space-between;\n            gap: 14px;\n        }\n\n        .live-left {\n            color: #d4d4d4;\n            word-break: break-word;\n            overflow-wrap: anywhere;\n        }\n\n        .live-right {\n            color: #777;\n            white-space: nowrap;\n        }\n\n        .live-link {\n            color: #00d4ff;\n            text-decoration: none;\n            border-bottom: 1px solid #00d4ff;\n            font-family: 'JetBrains Mono', monospace;\n            font-size: 12px;\n        }\n\n        .live-link:hover {\n            color: #fff;\n            border-bottom-color: #fff;\n        }\n\n        .artifact {\n            border: 1px solid #222;\n            border-radius: 12px;\n            overflow: hidden;\n            background: #000;\n        }\n\n        .artifact-header {\n            padding: 14px 16px;\n            border-bottom: 1px solid #222;\n            display: flex;\n            justify-content: space-between;\n            align-items: baseline;\n            gap: 20px;\n        }\n\n        .artifact-title {\n            color: #fff;\n            font-size: 11px;\n            letter-spacing: 0.25em;\n            opacity: 0.9;\n        }\n\n        .artifact-meta {\n            color: #666;\n            font-size: 11px;\n        }\n\n        iframe {\n            width: 100%;\n            height: 520px;\n            border: 0;\n            display: block;\n            background: #000;\n        }\n\n        .links {\n            display: grid;\n            grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\n            gap: 12px;\n            margin-top: 24px;\n        }\n\n        .link-card {\n            border: 1px solid #222;\n            padding: 16px;\n            border-radius: 12px;\n            text-decoration: none;\n            color: #ccc;\n            background: #050505;\n        }\n\n        .link-card:hover {\n            border-color: #00d4ff;\n        }\n\n        .link-title {\n            color: #fff;\n            font-size: 13px;\n            margin-bottom: 8px;\n            font-weight: 600;\n        }\n\n        .link-desc {\n            font-size: 12px;\n            color: #777;\n        }\n\n        footer {\n            margin-top: 56px;\n            padding-top: 20px;\n            border-top: 1px solid #222;\n            font-size: 11px;\n            color: #666;\n        }\n\n        footer a {\n            color: #00d4ff;\n            text-decoration: none;\n            border-bottom: 1px solid #00d4ff;\n        }\n\n        footer a:hover {\n            color: #fff;\n            border-bottom-color: #fff;\n        }\n\n        @media (max-width: 720px) {\n            header {\n                flex-direction: column;\n                align-items: flex-start;\n            }\n\n            \n\n            .live-body {\n                grid-template-columns: 1fr;\n            }\n\n            .kv-value, .live-left {\n                word-break: break-word;\n                overflow-wrap: anywhere;\n            }\n\n            iframe {\n                height: 560px;\n            }\n        }\n    \n.crovia-nav{position:sticky;top:0;z-index:1000;background:rgba(0,0,0,.92);backdrop-filter:blur(14px);border-bottom:1px solid rgba(255,255,255,.06);padding:0 24px;font-family:'Inter',system-ui,-apple-system,sans-serif}\n.crovia-nav-inner{max-width:1400px;margin:0 auto;display:flex;align-items:center;justify-content:space-between;height:52px}\n.crovia-nav .cn-logo{font-size:18px;font-weight:800;letter-spacing:-.5px;color:#8B5CF6;text-decoration:none}\n.crovia-nav .cn-links{display:flex;align-items:center;gap:2px}\n.crovia-nav .cn-links a{color:#888;text-decoration:none;font-size:12.5px;font-weight:500;padding:6px 11px;border-radius:6px;transition:color .15s,background .15s;white-space:nowrap}\n.crovia-nav .cn-links a:hover{color:#fff;background:rgba(255,255,255,.05)}\n.crovia-nav .cn-links a.cn-active{color:#8B5CF6;font-weight:600}\n.cn-more{position:relative}\n.cn-more-btn{color:#888;font-size:12.5px;font-weight:500;padding:6px 11px;border-radius:6px;cursor:pointer;border:none;background:none;font-family:inherit;display:flex;align-items:center;gap:4px;transition:color .15s}\n.cn-more-btn:hover,.cn-more.open .cn-more-btn{color:#fff;background:rgba(255,255,255,.05)}\n.cn-more-btn svg{width:10px;height:10px;transition:transform .2s}\n.cn-more.open .cn-more-btn svg{transform:rotate(180deg)}\n.cn-dropdown{display:none;position:absolute;right:0;top:calc(100% + 6px);background:#141419;border:1px solid rgba(255,255,255,.08);border-radius:10px;padding:6px;min-width:170px;box-shadow:0 12px 32px rgba(0,0,0,.5)}\n.cn-more.open .cn-dropdown{display:block}\n.cn-dropdown a{display:block;color:#999;text-decoration:none;font-size:12.5px;padding:8px 14px;border-radius:6px;transition:color .12s,background .12s;white-space:nowrap}\n.cn-dropdown a:hover{color:#fff;background:rgba(139,92,246,.1)}\n.cn-dropdown .cn-sep{height:1px;background:rgba(255,255,255,.06);margin:4px 8px}\n.cn-burger{display:none;background:none;border:none;color:#888;cursor:pointer;padding:8px}\n.cn-burger svg{width:20px;height:20px}\n@media(max-width:820px){\n  .crovia-nav .cn-links{display:none;position:absolute;top:52px;left:0;right:0;background:#0a0a0f;border-bottom:1px solid rgba(255,255,255,.06);flex-direction:column;padding:12px 16px;gap:0}\n  .crovia-nav .cn-links.cn-open{display:flex}\n  .crovia-nav .cn-links a,.cn-dropdown a{padding:10px 14px}\n  .cn-more{width:100%}\n  .cn-more-btn{width:100%;padding:10px 14px}\n  .cn-dropdown{position:static;border:none;box-shadow:none;background:transparent;padding:0 0 0 12px;display:none}\n  .cn-more.open .cn-dropdown{display:block}\n  .cn-burger{display:block}\n}\n\n</style>\n</head>\n<body>\n<div class=\"crovia-nav\">\n  <div class=\"crovia-nav-inner\">\n    <a href=\"/\" class=\"cn-logo\">CROVIA</a>\n    <button class=\"cn-burger\" onclick=\"document.querySelector('.cn-links').classList.toggle('cn-open')\" aria-label=\"Menu\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M3 12h18M3 6h18M3 18h18\"/></svg></button>\n    <div class=\"cn-links\">\n      <a href=\"/\" class=\"cn-active\">Home</a>\n      <a href=\"https://registry.croviatrust.com/registry/\">Registry</a>\n      <a href=\"https://registry.croviatrust.com/registry/omissions\">Omissions</a>\n      <a href=\"https://registry.croviatrust.com/registry/tpa\">TPA</a>\n      <a href=\"https://registry.croviatrust.com/registry/ranking\">Ranking</a>\n      <div class=\"cn-more\" id=\"cn-more\">\n        <button class=\"cn-more-btn\" onclick=\"this.parentElement.classList.toggle('open')\">More <svg viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M3 4.5l3 3 3-3\"/></svg></button>\n        <div class=\"cn-dropdown\">\n          <a href=\"https://registry.croviatrust.com/registry/risk/\">Risk Index</a>\n          <a href=\"https://registry.croviatrust.com/registry/outreach\">Outreach</a>\n          <a href=\"https://registry.croviatrust.com/registry/enterprise\">Enterprise</a>\n          <a href=\"https://registry.croviatrust.com/registry/provenance/\">Provenance</a>\n          <a href=\"https://registry.croviatrust.com/registry/cep/\">CEP Terminal</a>\n          <a href=\"https://registry.croviatrust.com/registry/verify\">Passport</a>\n          <div class=\"cn-sep\"></div>\n          <a href=\"/how-to-read.html\">How to Read</a>\n          <a href=\"/whitepaper.html\">Whitepaper</a>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    <div class=\"container\">\n        <header>\n            <div class=\"brand\">\n                <img src=\"/logo.png\" alt=\"Crovia\" class=\"logo\">\n                <div class=\"mark\">CROVIA</div>\n                <div class=\"live-indicator\">\n                    <span class=\"live-dot\" id=\"liveDot\"></span>\n                    <span id=\"liveStatusText\">LIVE STATUS: connecting...</span>\n                </div>\n            </div>\n            \n        </header>\n\n        <section class=\"statements\">\n            <p class=\"statement\"><strong>CROVIA is a public evidence system</strong> for AI training provenance.</p>\n            <p class=\"statement\">It records timestamped observations of evidence presence and evidence absence.</p>\n            <p class=\"statement\">All artifacts are queryable via public endpoints and reproducible from raw evidence.</p>\n            <p class=\"statement\">This page shows a live artifact. It is not a demo.</p>\n            <p class=\"statement\">Beyond observation, the system performs <strong>behavioral forensics</strong> on model weights and <strong>dataset attribution analysis</strong> — evidence that goes deeper than what models disclose.</p>\n        </section>\n\n        <section class=\"live\">\n            <div class=\"live-header\">\n                <div class=\"live-title\">LIVE STATUS — REGISTRY</div>\n                <div class=\"live-meta\" id=\"liveMeta\">loading...</div>\n            </div>\n            <div class=\"live-body\">\n                <div class=\"live-card\">\n                    <div class=\"live-card-title\">Registry stats</div>\n                    <div class=\"kv\">\n                        <div class=\"kv-row\"><div class=\"kv-label\">total_observations</div><div class=\"kv-value\" id=\"statTotalObs\">--</div></div>\n                        <div class=\"kv-row\"><div class=\"kv-label\">observations_today_utc</div><div class=\"kv-value\" id=\"statTodayObs\">--</div></div>\n                        <div class=\"kv-row\"><div class=\"kv-label\">unique_targets</div><div class=\"kv-value\" id=\"statUniqueTargets\">--</div></div>\n                        <div class=\"kv-row\"><div class=\"kv-label\">updated_at</div><div class=\"kv-value\" id=\"statUpdatedAt\">--</div></div>\n                        <div class=\"kv-row\"><div class=\"kv-label\">latency</div><div class=\"kv-value\" id=\"statLatency\">--</div></div>\n                    </div>\n                    <div style=\"margin-top: 10px;\"><a class=\"live-link\" href=\"/api/registry/stats\" target=\"_blank\" rel=\"noopener\">open json</a></div>\n                </div>\n\n                <div class=\"live-card\">\n                    <div class=\"live-card-title\">Merkle proof</div>\n                    <div class=\"kv\">\n                        <div class=\"kv-row\"><div class=\"kv-label\">merkle_root</div><div class=\"kv-value\" id=\"merkleRoot\" title=\"\">--</div></div>\n                        <div class=\"kv-row\"><div class=\"kv-label\">total_observations</div><div class=\"kv-value\" id=\"merkleTotalObs\">--</div></div>\n                        <div class=\"kv-row\"><div class=\"kv-label\">computed_at</div><div class=\"kv-value\" id=\"merkleComputedAt\">--</div></div>\n                    </div>\n                    <div style=\"margin-top: 10px;\"><a class=\"live-link\" href=\"/api/registry/merkle\" target=\"_blank\" rel=\"noopener\">open json</a></div>\n                </div>\n\n                <div class=\"live-card\">\n                    <div class=\"live-card-title\">Recent observations</div>\n                    <ul class=\"live-list\" id=\"recentList\"></ul>\n                    <div style=\"margin-top: 10px;\"><a class=\"live-link\" href=\"/api/registry/recent\" target=\"_blank\" rel=\"noopener\">open json</a></div>\n                </div>\n\n                <div class=\"live-card\">\n                    <div class=\"live-card-title\">Omission ledger (30d)</div>\n                    <div class=\"kv\">\n                        <div class=\"kv-row\"><div class=\"kv-label\">count</div><div class=\"kv-value\" id=\"omissionsCount\">--</div></div>\n                        <div class=\"kv-row\"><div class=\"kv-label\">query_timestamp</div><div class=\"kv-value\" id=\"omissionsQueriedAt\">--</div></div>\n                    </div>\n                    <ul class=\"live-list\" id=\"omissionsList\" style=\"margin-top: 10px;\"></ul>\n                    <div style=\"margin-top: 10px;\"><a class=\"live-link\" href=\"/api/ledger/omissions?days=30\" target=\"_blank\" rel=\"noopener\">open json</a></div>\n                </div>\n            \n                <div class=\"live-card\">\n                    <div class=\"live-card-title\">Evidence infrastructure</div>\n                    <div class=\"kv\">\n                        <div class=\"kv-row\"><div class=\"kv-label\">models_monitored</div><div class=\"kv-value\" id=\"statModels\">--</div></div>\n                        <div class=\"kv-row\"><div class=\"kv-label\">organizations_graded</div><div class=\"kv-value\" id=\"statOrgs\">--</div></div>\n                        <div class=\"kv-row\"><div class=\"kv-label\">risk_scored</div><div class=\"kv-value\" id=\"statRisk\">--</div></div>\n                        <div class=\"kv-row\"><div class=\"kv-label\">tpa_chain_height</div><div class=\"kv-value\" id=\"statTPA\">--</div></div>\n                        <div class=\"kv-row\"><div class=\"kv-label\">provenance_nodes</div><div class=\"kv-value\" id=\"statNodes\">--</div></div>\n                    </div>\n                    <div style=\"margin-top: 10px;\"><a class=\"live-link\" href=\"https://registry.croviatrust.com/registry/risk/\" target=\"_blank\" rel=\"noopener\">open risk index</a></div>\n                </div>\n            </div>\n        </section>\n\n        <section class=\"artifact\">\n            <div class=\"artifact-header\">\n                <div class=\"artifact-title\">LIVE ARTIFACT — ABSENCE CLOCK</div>\n                <div class=\"artifact-meta\">source: /api/ledger/omissions</div>\n            </div>\n            <iframe src=\"/absence-clock.html\" title=\"CROVIA Absence Clock\"></iframe>\n        </section>\n\n        <section class=\"links\">\n            <a class=\"link-card\" href=\"https://registry.croviatrust.com/registry/\">\n                <div class=\"link-title\">Training Provenance Registry</div>\n                <div class=\"link-desc\">Public stream of observations and intelligence dashboard.</div>\n            </a>\n            <a class=\"link-card\" href=\"https://registry.croviatrust.com/registry/risk/\">\n                <div class=\"link-title\">Dataset Risk Index</div>\n                <div class=\"link-desc\">Multi-signal risk scoring across 5,900+ models.</div>\n            </a>\n            <a class=\"link-card\" href=\"https://registry.croviatrust.com/registry/ranking\">\n                <div class=\"link-title\">Ranking &amp; Org Grades</div>\n                <div class=\"link-desc\">6,800+ models ranked. 2,300+ organizations graded A–F.</div>\n            </a>\n            <a class=\"link-card\" href=\"https://registry.croviatrust.com/registry/omissions\">\n                <div class=\"link-title\">Public Omission Ledger</div>\n                <div class=\"link-desc\">Targets with no evidence observed in period.</div>\n            </a>\n            <a class=\"link-card\" href=\"https://registry.croviatrust.com/registry/tpa\">\n                <div class=\"link-title\">Temporal Proof of Absence</div>\n                <div class=\"link-desc\">12,500+ cryptographic proofs of non-disclosure.</div>\n            </a>\n            <a class=\"link-card\" href=\"https://registry.croviatrust.com/registry/provenance/\">\n                <div class=\"link-title\">Provenance &amp; Lineage</div>\n                <div class=\"link-desc\">10,500+ nodes, 25,900+ edges in the model lineage graph.</div>\n            </a>\n            <a class=\"link-card\" href=\"https://registry.croviatrust.com/registry/enterprise\">\n                <div class=\"link-title\">Enterprise Monitor</div>\n                <div class=\"link-desc\">Live gating detection and model family collection status.</div>\n            </a>\n            <a class=\"link-card\" href=\"/whitepaper.html\">\n                <div class=\"link-title\">Whitepaper v2</div>\n                <div class=\"link-desc\">Six-layer evidence stack: from observation to attribution.</div>\n            </a>\n            <a class=\"link-card\" href=\"/how-to-read.html\">\n                <div class=\"link-title\">How to Read Crovia</div>\n                <div class=\"link-desc\">Notarial interpretation and verification method.</div>\n            </a>\n        </section>\n\n        <footer>\n            <div>&copy; 2026 Crovia Trust</div>\n            <div style=\"margin-top: 8px;\">GitHub: <a href=\"https://github.com/croviatrust\">github.com/croviatrust</a></div>\n        </footer>\n\n        <script>\n            (function () {\n                function byId(id) {\n                    return document.getElementById(id);\n                }\n\n                var liveDot = byId('liveDot');\n                var liveStatusText = byId('liveStatusText');\n                var liveMeta = byId('liveMeta');\n\n                function setDotState(state) {\n                    if (!liveDot) return;\n                    liveDot.classList.remove('ok', 'warn', 'down');\n                    if (state) liveDot.classList.add(state);\n                }\n\n                function setText(id, value) {\n                    var el = byId(id);\n                    if (!el) return;\n                    if (value === null || value === undefined || value === '') {\n                        el.textContent = '--';\n                        return;\n                    }\n                    el.textContent = String(value);\n                }\n\n                function fmtIso(iso) {\n                    if (!iso) return '--';\n                    var d = new Date(iso);\n                    if (isNaN(d.getTime())) return String(iso);\n                    return d.toISOString();\n                }\n\n                function minutesSince(iso) {\n                    if (!iso) return null;\n                    var d = new Date(iso);\n                    if (isNaN(d.getTime())) return null;\n                    return Math.round((Date.now() - d.getTime()) / 60000);\n                }\n\n                async function fetchJson(path) {\n                    var res = await fetch(path, {\n                        cache: 'no-store',\n                        headers: { 'Accept': 'application/json' }\n                    });\n\n                    if (!res.ok) {\n                        var detail = '';\n                        try {\n                            detail = await res.text();\n                        } catch (e) {\n                            detail = '';\n                        }\n                        throw new Error(path + ' ' + res.status + (detail ? ' ' + detail : ''));\n                    }\n\n                    return await res.json();\n                }\n\n                function renderRecent(list, observations) {\n                    if (!list) return;\n                    list.innerHTML = '';\n\n                    if (!observations || !observations.length) {\n                        var empty = document.createElement('li');\n                        empty.className = 'live-item';\n                        var leftEmpty = document.createElement('div');\n                        leftEmpty.className = 'live-left';\n                        leftEmpty.textContent = 'no observations returned';\n                        var rightEmpty = document.createElement('div');\n                        rightEmpty.className = 'live-right';\n                        rightEmpty.textContent = '';\n                        empty.appendChild(leftEmpty);\n                        empty.appendChild(rightEmpty);\n                        list.appendChild(empty);\n                        return;\n                    }\n\n                    for (var i = 0; i < observations.length; i++) {\n                        var o = observations[i] || {};\n                        var targetId = o.target_id || 'unknown';\n                        \n                        // Skip Crovia internal files\n                        if (targetId.toLowerCase().indexOf('crovia') !== -1) continue;\n\n                        var li = document.createElement('li');\n                        li.className = 'live-item';\n\n                        var left = document.createElement('div');\n                        left.className = 'live-left';\n                        var obsType = o.observation_type || 'observation';\n                        left.textContent = targetId + ' (' + obsType + ')';\n\n                        var right = document.createElement('div');\n                        right.className = 'live-right';\n                        right.textContent = o.observed_at ? fmtIso(o.observed_at).replace('T', ' ').slice(0, 19) + 'Z' : '--';\n\n                        li.appendChild(left);\n                        li.appendChild(right);\n                        list.appendChild(li);\n                    }\n                }\n\n                function renderOmissions(list, results) {\n                    if (!list) return;\n                    list.innerHTML = '';\n                    var items = results && results.length ? results.slice(0, 8) : [];\n\n                    if (!items.length) {\n                        var empty = document.createElement('li');\n                        empty.className = 'live-item';\n                        var leftEmpty = document.createElement('div');\n                        leftEmpty.className = 'live-left';\n                        leftEmpty.textContent = 'no omissions returned';\n                        var rightEmpty = document.createElement('div');\n                        rightEmpty.className = 'live-right';\n                        rightEmpty.textContent = '';\n                        empty.appendChild(leftEmpty);\n                        empty.appendChild(rightEmpty);\n                        list.appendChild(empty);\n                        return;\n                    }\n\n                    for (var i = 0; i < items.length; i++) {\n                        var r = items[i] || {};\n                        var targetId = r.target_id || 'unknown';\n                        \n                        // Skip Crovia internal files\n                        if (targetId.toLowerCase().indexOf('crovia') !== -1) continue;\n\n                        var li = document.createElement('li');\n                        li.className = 'live-item';\n\n                        var left = document.createElement('div');\n                        left.className = 'live-left';\n                        left.textContent = targetId;\n\n                        var right = document.createElement('div');\n                        right.className = 'live-right';\n                        right.textContent = r.last_observed_at ? fmtIso(r.last_observed_at).replace('T', ' ').slice(0, 19) + 'Z' : '--';\n\n                        li.appendChild(left);\n                        li.appendChild(right);\n                        list.appendChild(li);\n                    }\n                }\n\n                var running = false;\n\n                async function refresh() {\n                    if (running) return;\n                    running = true;\n\n                    var started = Date.now();\n                    setDotState('warn');\n                    if (liveStatusText) liveStatusText.textContent = 'LIVE STATUS: loading...';\n\n                    try {\n                        var results = await Promise.allSettled([\n                            fetchJson('/api/registry/stats'),\n                            fetchJson('/api/registry/merkle'),\n                            fetchJson('/api/registry/recent?limit=8'),\n                            fetchJson('/api/ledger/omissions?days=30')\n                        ]);\n\n                        var stats = (results[0].status==='fulfilled' ? results[0].value : {}) || {};\n                        var merkle = (results[1].status==='fulfilled' ? results[1].value : {}) || {};\n                        var recent = (results[2].status==='fulfilled' ? results[2].value : {}) || {};\n                        var omissions = (results[3].status==='fulfilled' ? results[3].value : {}) || {};\n\n                        setText('statTotalObs', stats.total_observations);\n                        setText('statTodayObs', stats.observations_today_utc);\n                        setText('statUniqueTargets', stats.unique_targets);\n                        setText('statUpdatedAt', fmtIso(stats.updated_at));\n                        setText('statLatency', stats.latency_ms !== undefined && stats.latency_ms !== null ? String(stats.latency_ms) + 'ms' : '--');\n\n                        var root = merkle.merkle_root;\n                        var rootEl = byId('merkleRoot');\n                        if (rootEl) {\n                            if (typeof root === 'string' && root.length) {\n                                var shortRoot = root.length > 28 ? root.slice(0, 14) + '…' + root.slice(-14) : root;\n                                rootEl.textContent = shortRoot;\n                                rootEl.setAttribute('title', root);\n                                rootEl.dataset.full = root;\n                                rootEl.style.cursor = 'copy';\n                            } else {\n                                rootEl.textContent = '--';\n                                rootEl.removeAttribute('title');\n                                rootEl.dataset.full = '';\n                                rootEl.style.cursor = 'default';\n                            }\n                        }\n\n                        setText('merkleTotalObs', merkle.total_observations);\n                        setText('merkleComputedAt', fmtIso(merkle.computed_at));\n\n                        renderRecent(byId('recentList'), recent.observations);\n\n                        setText('omissionsCount', omissions.count);\n                        setText('omissionsQueriedAt', fmtIso(omissions.query_timestamp));\n                        renderOmissions(byId('omissionsList'), omissions.results);\n\n                        var ageMin = minutesSince(stats.updated_at);\n                        var status = 'LIVE STATUS: online';\n                        if (ageMin !== null && ageMin !== undefined && isFinite(ageMin)) {\n                            status = status + ' (updated ' + ageMin + 'm ago)';\n                        }\n                        if (liveStatusText) liveStatusText.textContent = status;\n\n                        setDotState('ok');\n                        if (ageMin !== null && ageMin !== undefined && isFinite(ageMin) && ageMin > 240) {\n                            setDotState('warn');\n                        }\n\n                        if (liveMeta) liveMeta.textContent = 'refresh ok • ' + (Date.now() - started) + 'ms • ' + new Date().toISOString();\n                    } catch (err) {\n                        setDotState('down');\n                        if (liveStatusText) liveStatusText.textContent = 'LIVE STATUS: unavailable';\n                        if (liveMeta) liveMeta.textContent = String(err && err.message ? err.message : err);\n                    } finally {\n                        running = false;\n                    }\n                }\n\n                document.addEventListener('click', async function (e) {\n                    var rootEl = byId('merkleRoot');\n                    if (!rootEl) return;\n                    if (e.target !== rootEl) return;\n                    var full = rootEl.dataset.full;\n                    if (!full) return;\n                    try {\n                        await navigator.clipboard.writeText(full);\n                        if (liveMeta) liveMeta.textContent = 'merkle_root copied • ' + new Date().toISOString();\n                    } catch (copyErr) {\n                        if (liveMeta) liveMeta.textContent = 'copy failed • ' + new Date().toISOString();\n                    }\n                });\n\n                refresh();\n                setInterval(refresh, 60000);\n            })();\n        </script>\n    </div>\n<script>document.addEventListener(\"click\",function(e){var m=document.getElementById(\"cn-more\");if(m&&!m.contains(e.target))m.classList.remove(\"open\")});</script>\n<script>\n            // Fetch registry static data for mini-stats\n            (async function() {\n                try {\n                    var base = 'https://registry.croviatrust.com/registry';\n                    var [rankRes, riskRes, orgRes] = await Promise.allSettled([\n                        fetch(base + '/data/global_ranking.json').then(r => r.json()),\n                        fetch(base + '/data_v4/dataset_risk.json').then(r => r.json()),\n                        fetch(base + '/data_v4/org_scores.json').then(r => r.json()),\n                    ]);\n\n                    var rank = rankRes.status === 'fulfilled' ? rankRes.value : {};\n                    var risk = riskRes.status === 'fulfilled' ? riskRes.value : {};\n                    var org = orgRes.status === 'fulfilled' ? orgRes.value : {};\n\n                    var el;\n                    el = document.getElementById('statModels');\n                    if (el && rank.model_ranking) el.textContent = rank.model_ranking.length.toLocaleString();\n\n                    el = document.getElementById('statOrgs');\n                    if (el && org.organizations) el.textContent = org.organizations.length.toLocaleString();\n\n                    el = document.getElementById('statRisk');\n                    if (el && risk.models) el.textContent = risk.models.length.toLocaleString();\n\n                    el = document.getElementById('statTPA');\n                    if (el && rank.meta && rank.meta.tpa_chain_height) el.textContent = rank.meta.tpa_chain_height.toLocaleString();\n                    else if (el) el.textContent = '12,500+';\n\n                    el = document.getElementById('statNodes');\n                    if (el) el.textContent = '10,597';\n                } catch(e) {}\n            })();\n</script>\n</body>\n</html>\n","body_preview":"# As a condition of accessing this website, you agree to abide by the following\n# content signals:\n\n# (a)  If a Content-Signal = yes, you may collect content for the corresponding\n#      use.\n# (b)  If a Content-Signal = no, you may not collect content for the\n#      corresponding use.\n# (c)  If the website operator does not include a Content-Signal for a\n#      corresponding use, the website operator neither grants nor restricts\n#      permission via Content-Signal with respect to the corresponding use.\n\n# The content signals and their meanings are:\n\n# search:   building a search index and providing search results (e.g., returning\n#           hyperlinks and short excerpts from your website's contents). Search does not\n#           include providing AI-generated search summaries.\n# ai-input: inputting content into one or more AI models (e.g., retrieval\n#           augmented generation, grounding, or other real-time taking of content for\n#           generative AI search answers).\n# ai-train: training or fine-tuning AI models.\n\n# ANY RESTRICTIONS EXPRESSED VIA CONTENT SIGNALS ARE EXPRESS RESERVATIONS OF\n# RIGHTS UNDER ARTICLE 4 OF THE EUROPEAN UNION DIRECTIVE 2019/790 ON COPYRIGHT\n# AND RELATED RIGHTS IN THE DIGITAL SINGLE MARKET.\n\n# BEGIN Cloudflare Managed content\n\nUser-agent: *\nContent-Signal: search=yes,ai-train=no\nAllow: /\n\nUser-agent: Amazonbot\nDisallow: /\n\nUser-agent: Applebot-Extended\nDisallow: /\n\nUser-agent: Bytespider\nDisallow: /\n\nUser-agent: CCBot\nDisallow: /\n\nUser-agent: ClaudeBot\nDisallow: /\n\nUser-agent: CloudflareBrowserRenderingCrawler\nDisallow: /\n\nUser-agent: Google-Extended\nDisallow: /\n\nUser-agent: GPTBot\nDisallow: /\n\nUser-agent: meta-externalagent\nDisallow: /\n\n# END Cloudflare Managed Content\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>CROVIA — Public Evidence System</title>\n    <link rel=\"icon\" type=\"image/png\" href=\"/logo.png\">\n    <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500;600&display=swap\" rel=\"stylesheet\">\n    <style>\n        * { margin: 0; padding: 0; box-sizing: border-box; }\n\n        body {\n            font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n            background:\n                radial-gradient(900px circle at 18% 0%, rgba(0, 255, 102, 0.10), transparent 60%),\n                radial-gradient(900px circle at 82% 10%, rgba(0, 212, 255, 0.08), transparent 60%),\n                #000;\n            color: #d4d4d4;\n            line-height: 1.7;\n            font-size: 14px;\n        }\n\n        .container {\n            max-width: 1060px;\n            margin: 0 auto;\n            padding: 70px 20px;\n        }\n\n        header {\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            gap: 24px;\n            margin-bottom: 56px;\n        }\n\n        .mark {\n            color: #fff;\n            font-weight: 600;\n            letter-spacing: 0.3em;\n            font-size: 13px;\n            font-family: 'JetBrains Mono', monospace;\n        }\n\n        .brand {\n            display: flex;\n            align-items: center;\n            gap: 16px;\n            min-width: 0;\n        }\n\n        .logo {\n            width: 40px;\n            height: 40px;\n            flex-shrink: 0;\n        }\n\n        .live-indicator {\n            display: flex;\n            align-items: center;\n            gap: 10px;\n            color: #777;\n            font-size: 12px;\n            font-family: 'JetBrains Mono', monospace;\n            white-space: nowrap;\n        }\n\n        .live-dot {\n            width: 9px;\n            height: 9px;\n            border-radius: 50%;\n            background: #444;\n            animation: pulse 2s infinite;\n        }\n\n        .live-dot.ok { background: #00ff66; }\n        .live-dot.warn { background: #f59e0b; }\n        .live-dot.down { background: #ef4444; }\n\n        @keyframes pulse {\n            0%, 100% { opacity: 1; }\n            50% { opacity: ","body_sha256":"sha256:6a6561690ecf810fe105808e275dd0fb924131d4d7e5ede396dca37a50b42e11","body_truncated":false,"captured_by":"robots_txt_collector","checked_user_agents":["GPTBot","ChatGPT-User","OAI-SearchBot","ClaudeBot","Claude-Web","anthropic-ai","CCBot","Google-Extended","GoogleOther","Applebot-Extended","FacebookBot","Meta-ExternalAgent","Meta-ExternalFetcher","Amazonbot","PerplexityBot","ai2bot","Bytespider","DuckAssistBot","cohere-ai","cohere-training-data-crawler","xAI-Bot","MistralAI-User","*"],"http_status":200,"robots_url":"https://croviatrust.com/robots.txt"},"observation_type":"presence","observed_at":"2026-04-27T17:33:25Z","receipt_hash":"sha256:b00642fc8a5e27df2289439ea781ca5476658e3563d7714414acfc5589271535"},"confidence":{"method":"deterministic"},"decision":"POSITIVE","issued_at":"2026-04-27T17:33:25Z","object":{"captured_by":"robots_txt_collector","primary_source_url":""},"predecessors":[],"schema":"crovia.axiom.v1","signature":"ed25519:1c037d10cb313787b92c7b2419e63fc3f8f6b1cdfc05a26469d919c9f6415128af8c722cafa324d54439cb8e1d79ae428d177cf7419a43a5a46aa2dcb3ea270b","signer":"crovia.substrate","subject":{"source_collector":"robots_txt_collector","target_id":"croviatrust.com"},"tsa":{"authority":"crovia.substrate.bootstrap","rfc3161_token":"{\"kind\":\"crovia.bootstrap.tsa\",\"source_jsonl\":\"/opt/crovia/private/robots/observations.jsonl\",\"source_seal_merkle_root\":\"6f109227e3860fb1e0a687e7255b766deb93b74d7dc8f4a07117d8a54af7f23e\",\"upgrade_path\":\"Sessione H \\u2014 OpenTimestamps weekly anchor\"}"},"zk_mode":"clear","zk_proof":null},"ledger":{"leaf_hash":"605b11c297c74ff745e998e8fbf2ac60e6b571de5d63755526b996afb518ade4","leaf_index":97410,"ledger_path":"/opt/crovia/substrate/axiom_ledger.jsonl"},"merkle_proof":{"hash_alg":"sha256","leaf_prefix":"0x00","node_prefix":"0x01","odd_leaf_rule":"duplicate_last","path":[{"sibling":"26606d3c83417182563d89eddc9e631134b8603dd9e6a86f071010843893f4f4","side":"right"},{"sibling":"ac761ad5d3003cf5a6b792407bfcfd4952ee33cd8ae52d3891a3c22d5b8d0051","side":"left"},{"sibling":"9fdc72fd4c6b15e80e6df900ec3c894bec3e7ad287997b4ac793064513477b0a","side":"right"},{"sibling":"e6b83af358588063fe3970f7042d8fbd951165cff47561ec135d8746987d997e","side":"right"},{"sibling":"aa8e9bacee9b38f88021c69b27ab9d2ff424866c4f896ea2b7178883cab2868f","side":"right"},{"sibling":"bd6f63b473d07992dbb01be39a2dee13a8485628ac03188c18094bbbf1156af7","side":"right"},{"sibling":"1858f7c7445a33bafc84dbe96e67eeade35280c397dcaa7624d73c8e4969d454","side":"right"},{"sibling":"eee1a0a3bba2228284f6be78ea8613ab342f25aec0a0c8c8038919ea25c4b0f1","side":"left"},{"sibling":"9279a8abc27f7b7f859435930df780dd3bfff9936e87c1c04b8c4a0311d7ea05","side":"right"},{"sibling":"4263fcabdc72f6860829409313c8251de2b122648bc205779211f5e7cf5d10bd","side":"right"},{"sibling":"665b9609d848eef8cb8f32c343405b42aed479b34da4eb645bd7d05ad7d5e098","side":"left"},{"sibling":"63fe2064d26c60e305442de39cd09c54cb85f6fb0e79fa82a30f6d6b2a3fcdde","side":"left"},{"sibling":"5a726d5d187b7c9e1302cd4bf0bae77873c3faac73b284a6c5559a777f5f902c","side":"left"},{"sibling":"9b97b7afcb038f5848ad3ef4f1f9d22e314ae918184b0dd2c894c272538fb8fd","side":"left"},{"sibling":"9a15d1993f357bb279d4dff09681bd714a19affce187ef4f7b5ecc1c7d0a3b9b","side":"left"},{"sibling":"309f6b889442fc3071c47ed203e9df610e54abc910768c36466c7eb883a80716","side":"right"},{"sibling":"725fac972e772ca0dc598810ea1abc70df472f72d2d6ab8a0baee2b80e5d2f4c","side":"left"},{"sibling":"98fc57dfef8873b512edc8340f7181df57302bb96777625e072235c62d7c5895","side":"right"}]},"schema":"crovia.axiom_proof.v1","seal":{"first_collector_run_id":"","first_receipt_hash":"","jsonl_path":"/opt/crovia/substrate/axiom_ledger.jsonl","key_id":"430895f101d38164","last_collector_run_id":"","last_receipt_hash":"","leaf_count":134292,"merkle_root":"77fc9c28fae777b81da5b495b3115474df6592dfac590333213d3bdf8b94a9b3","public_key_hex":"cf742e26f75669dc673cb5c0786a1ae23ae8ca19c347317192ce40c28a7ff25c","run_id":"hourly_json_retrofit_20260515T023701Z","schema":"crovia.seal.v1","seal_family_version":"crovia-seal-family/1","seal_kind":"substrate_batch","sealed_at":"2026-05-15T02:37:25Z","sig_algorithm":"ed25519","signature":"68107a834b00b24f5d4501e5ec727445311f132a486567ecc4c72a4e6dff24c8c21f2de3105293353ba5fdbe370d032819af6aa70f694e2e39b6af6737507009","signer_version":"1.1.0"},"trust_root":{"key_id":"430895f101d38164","public_key_hex":"cf742e26f75669dc673cb5c0786a1ae23ae8ca19c347317192ce40c28a7ff25c","signature_algorithm":"ed25519","url":"/registry/canon/TRUST_ROOT.md"},"verifier":{"spec":"/registry/canon/AXIOM_RECEIPT_v1.md","url":"/v/axm_11d78b0c1fa8bc8ebc6a724b07860e4e6a6fa4da0f83ac2b1691450232d75241"}}