Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions docs/post/grove/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="A signed aggregate view of the Shade Tree Grove. No identities, locations, or traffic.">
<meta name="theme-color" content="#07100c">
<meta property="og:title" content="The Grove · Shade Tree Grove">
<meta property="og:title" content="Shade Tree Grove Network Stats">
<meta property="og:description" content="A privacy-preserving view of the Grove, built from signed aggregate reports.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://shade-tree-node.vercel.app/grove/">
Expand All @@ -17,7 +17,7 @@
<link rel="stylesheet" href="/site.css">
<link rel="stylesheet" href="/grove/grove.css">
<script type="module" src="/grove/network.js"></script>
<title>The Grove · Shade Tree Grove</title>
<title>Shade Tree Grove Network Stats</title>
</head>
<body class="network-page is-checking">
<a class="skip-link" href="#grove-main">Skip to Grove details</a>
Expand All @@ -37,7 +37,7 @@

<div class="network-dashboard">
<div class="network-copy">
<h1 id="grove-title">The Grove,<br><span>observed.</span></h1>
<h1 id="grove-title">Shade Tree Grove<br><span>Network Stats</span></h1>
<p>A privacy-preserving view of the Grove, built from <a href="https://github.com/dmarzzz/shade-tree-node/blob/main/specs/data-api.md">signed aggregate reports</a>. One tree appears per announced identity, with no identity or location attached.</p>
</div>

Expand Down
2 changes: 1 addition & 1 deletion test/site.selftest.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ check("tree imagery remains behind every surface", /body:not\(\.home-page\)::bef
check("landing and README lead with the agent and operator outcomes", /<h2>For agents<\/h2>/.test(landing) && !/Install the Proxy/.test(landing) && /<h2>Run a Shade Tree node<\/h2>/.test(landing) && /Add Shade Tree to an agent/.test(readme) && /Run a Shade Tree node to provide cover/.test(readme));
check("landing hero jumps to both role starts and the canonical protocol", /href="#proxy">For agents/.test(landing) && /href="#node">Run a Shade Tree node/.test(landing) && /href="https:\/\/github\.com\/dmarzzz\/shade-tree-node\/blob\/main\/specs\/protocol\.md">How it works/.test(landing) && /class="role-link" href="\.\/agent\/">Agent guide/.test(landing) && /class="role-link" href="\.\/operator\/">Operator guide/.test(landing));
check("About and README carry the approved linked tagline", /<section class="about-panel"[\s\S]*?<h2 id="about-title">About<\/h2>[\s\S]*?<p>The grove of Shade Trees gives agents anonymous egress when the clearnet <a href="\.\/research\/">won’t let them through<\/a>\.<\/p>[\s\S]*?<\/section>/.test(landing) && /# Shade Tree Grove\s+Cover for local agents\.\s+The grove of Shade Trees gives agents anonymous egress when the clearnet \[won’t let them\s+through\]\[research-note\]\./.test(readme));
check("public site branding names Shade Tree Grove without renaming node roles", /<title>Shade Tree Grove<\/title>/.test(landing) && /<span>Shade Tree Grove<\/span>/.test(landing) && /Agent guide · Shade Tree Grove/.test(agentPage) && /Operator guide · Shade Tree Grove/.test(operatorPage) && /The Grove · Shade Tree Grove/.test(grovePage) && /Access-gated onion egress · Shade Tree Grove/.test(research) && /<h2>Run a Shade Tree node<\/h2>/.test(landing) && /Prepare a Shade Tree node/.test(operatorPage));
check("public site branding names Shade Tree Grove without renaming node roles", /<title>Shade Tree Grove<\/title>/.test(landing) && /<span>Shade Tree Grove<\/span>/.test(landing) && /Agent guide · Shade Tree Grove/.test(agentPage) && /Operator guide · Shade Tree Grove/.test(operatorPage) && /<title>Shade Tree Grove Network Stats<\/title>/.test(grovePage) && /Access-gated onion egress · Shade Tree Grove/.test(research) && /<h2>Run a Shade Tree node<\/h2>/.test(landing) && /Prepare a Shade Tree node/.test(operatorPage));
check("primary navigation restores Research", /<div class="nav-links">[\s\S]*?<a href="\.\/grove\/">Grove<\/a>[\s\S]*?<a href="\.\/research\/">Research<\/a>[\s\S]*?<a href="https:\/\/github\.com\/dmarzzz\/shade-tree-node">Source<\/a>[\s\S]*?<\/div>/.test(landing));
check("landing separates the reputation gate from the network path", /<h3>Reputation gate<\/h3>/.test(landing) && /admission policy, not the proof/.test(landing) && /Groth16 RLN/.test(landing) && /rate-commitment leaf/.test(landing) && /epoch-scoped nullifiers/i.test(landing) && /<h3>Network path<\/h3>/.test(landing) && /signed Canopy/.test(landing) && /target-bound CONNECT tunnel through <a[^>]+>Tor<\/a> to the node’s <a[^>]+>onion service<\/a>/.test(landing) && /Elder Tree handles discovery and stays off the traffic path/.test(landing));
check("landing stacks one graphic under each mechanism", /class="how-stack"[\s\S]*class="how-mechanism"[\s\S]*shade-tree-reputation-mobile\.svg[\s\S]*shade-tree-reputation\.svg[\s\S]*class="how-mechanism"[\s\S]*shade-tree-path-mobile\.svg[\s\S]*shade-tree-path\.svg/.test(landing) && (landing.match(/class="how-mechanism"/g) || []).length === 2 && !/class="how-parts"/.test(landing));
Expand Down