feat: refresh landing page — What's New section, Guardian Agents, updated timeline

Landing page restructured:
- New "What's New" section after hero (philosophy article, Guardian Agents, beta pilot)
- Problem section condensed (27027 story kept, corollary collapsed to summary)
- Guardian Agents featured prominently in architecture section with 4-phase grid
- Production Evidence updated: 4 stats including Guardian verification phases, 17 months
- Timeline extended to Mar 2026 (steering vectors, Guardian Agents, beta)
- Deploy script improved: CSP check, automated health check, file count verification

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
TheFlow 2026-03-13 13:57:56 +13:00
parent 2c14c91c16
commit 2d0cef684e
3 changed files with 240 additions and 73 deletions

View file

@ -91,9 +91,49 @@
<main id="main-content" role="main"> <main id="main-content" role="main">
<!-- Section 1: The Problem --> <!-- What's New -->
<section class="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 py-16 md:py-20"> <section class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12 md:py-16">
<div class="text-center mb-10"> <div class="text-center mb-8">
<span class="inline-block bg-emerald-100 text-emerald-800 px-3 py-1 rounded-full text-xs font-semibold uppercase tracking-wide mb-3" data-i18n="whats_new.badge">March 2026</span>
<h2 class="text-2xl font-bold text-gray-900" data-i18n="whats_new.heading">What&rsquo;s New</h2>
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
<a href="/blog-post.html?slug=guardian-agents-philosophy-of-ai-accountability" class="block bg-white rounded-xl shadow-md border border-gray-200 hover:shadow-xl hover:-translate-y-1 transition-all duration-300 overflow-hidden group">
<div class="bg-gradient-to-r from-teal-600 to-emerald-600 p-4">
<span class="text-teal-100 text-xs font-semibold uppercase tracking-wide" data-i18n="whats_new.card1_label">New Research</span>
</div>
<div class="p-5">
<h3 class="font-bold text-gray-900 mb-2 group-hover:text-teal-700 transition" data-i18n="whats_new.card1_title">Guardian Agents and the Philosophy of AI Accountability</h3>
<p class="text-sm text-gray-600" data-i18n="whats_new.card1_desc">How Wittgenstein, Berlin, Ostrom, and Te Ao M&#257;ori converge on the same architectural requirements for governing AI in community contexts.</p>
</div>
</a>
<a href="/village-ai.html#guardian-agents" class="block bg-white rounded-xl shadow-md border border-gray-200 hover:shadow-xl hover:-translate-y-1 transition-all duration-300 overflow-hidden group">
<div class="bg-gradient-to-r from-indigo-600 to-purple-600 p-4">
<span class="text-indigo-100 text-xs font-semibold uppercase tracking-wide" data-i18n="whats_new.card2_label">Deployed</span>
</div>
<div class="p-5">
<h3 class="font-bold text-gray-900 mb-2 group-hover:text-indigo-700 transition" data-i18n="whats_new.card2_title">Guardian Agents in Production</h3>
<p class="text-sm text-gray-600" data-i18n="whats_new.card2_desc">Four-phase verification using mathematical similarity, not generative checking. Confidence badges, claim-level analysis, and adaptive learning &mdash; all tenant-scoped.</p>
</div>
</a>
<a href="/blog.html" class="block bg-white rounded-xl shadow-md border border-gray-200 hover:shadow-xl hover:-translate-y-1 transition-all duration-300 overflow-hidden group">
<div class="bg-gradient-to-r from-amber-500 to-orange-500 p-4">
<span class="text-amber-100 text-xs font-semibold uppercase tracking-wide" data-i18n="whats_new.card3_label">Beta Open</span>
</div>
<div class="p-5">
<h3 class="font-bold text-gray-900 mb-2 group-hover:text-amber-700 transition" data-i18n="whats_new.card3_title">Village Beta Pilot</h3>
<p class="text-sm text-gray-600" data-i18n-html="whats_new.card3_desc">Village is accepting beta applications from communities ready to participate in constitutional AI governance. <span class="font-semibold">Community Basic from $10/mo.</span></p>
</div>
</a>
</div>
</section>
<!-- The Problem -->
<section class="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 py-12 md:py-16">
<div class="text-center mb-8">
<h2 class="text-2xl font-bold text-gray-900 mb-4" data-i18n="problem.heading">The Problem</h2> <h2 class="text-2xl font-bold text-gray-900 mb-4" data-i18n="problem.heading">The Problem</h2>
</div> </div>
<div class="bg-white rounded-xl shadow-md p-8 md:p-10 border border-gray-200"> <div class="bg-white rounded-xl shadow-md p-8 md:p-10 border border-gray-200">
@ -107,24 +147,14 @@
A user told Claude Code to use port 27027. The model used 27017 instead &mdash; not from forgetting, but because MongoDB&rsquo;s default port is 27017, and the model&rsquo;s statistical priors &ldquo;autocorrected&rdquo; the explicit instruction. Training pattern bias overrode human intent. A user told Claude Code to use port 27027. The model used 27017 instead &mdash; not from forgetting, but because MongoDB&rsquo;s default port is 27017, and the model&rsquo;s statistical priors &ldquo;autocorrected&rdquo; the explicit instruction. Training pattern bias overrode human intent.
</p> </p>
</div> </div>
<div class="bg-indigo-50 border-l-4 border-indigo-500 p-6 rounded-r-lg mb-6"> <p class="text-gray-700 mb-4 leading-relaxed" data-i18n="problem.corollary_summary">
<h3 class="text-lg font-bold text-indigo-900 mb-3" data-i18n="problem.corollary_title">From Code to Conversation: The Same Mechanism</h3> The same mechanism operates in every AI conversation. When a user from a collectivist culture asks for family advice, the model defaults to Western individualist framing. When a M&#257;ori user asks about data guardianship, the model offers property-rights language. Training data distributions override user context &mdash; in code the failure is binary and detectable, in conversation it is gradient and invisible.
<p class="text-indigo-800 mb-4" data-i18n="problem.corollary_p1"> </p>
In code, this bias produces measurable failures &mdash; wrong port, connection refused, incident logged in 14.7ms. But the same architectural flaw operates in every AI conversation, where it is far harder to detect. <div class="flex flex-wrap gap-4 items-center">
</p>
<p class="text-indigo-800 mb-4" data-i18n="problem.corollary_p2">
When a user from a collectivist culture asks for family advice, the model defaults to Western individualist framing &mdash; because that is what 95% of the training data reflects. When a M&#257;ori user asks about data guardianship, the model offers property-rights language instead of <em>kaitiakitanga</em>. When someone asks about end-of-life decisions, the model defaults to utilitarian calculus rather than the user&rsquo;s religious or cultural framework.
</p>
<p class="text-indigo-800 mb-3" data-i18n="problem.corollary_p3">
The mechanism is identical: training data distributions override the user&rsquo;s actual context. In code, the failure is binary and detectable. In conversation, it is gradient and invisible &mdash; culturally inappropriate advice looks like &ldquo;good advice&rdquo; to the system, and often to the user. There is no CrossReferenceValidator catching it in 14.7ms.
</p>
<a href="/docs.html?doc=pattern-bias-from-code-to-conversation" class="text-indigo-700 font-semibold hover:text-indigo-900 transition text-sm" data-i18n="problem.corollary_link"> <a href="/docs.html?doc=pattern-bias-from-code-to-conversation" class="text-indigo-700 font-semibold hover:text-indigo-900 transition text-sm" data-i18n="problem.corollary_link">
Read the full analysis &rarr; Read the full analysis &rarr;
</a> </a>
</div> </div>
<p class="text-gray-700 leading-relaxed" data-i18n="problem.closing">
This is not an edge case, and it is not limited to code. It is a category of failure that gets worse as models become more capable: stronger patterns produce more confident overrides &mdash; whether the override substitutes a port number or a value system. Safety through training alone is insufficient. The failure mode is structural, it operates across every domain where AI acts, and the solution must be structural.
</p>
</div> </div>
</div> </div>
</section> </section>
@ -178,84 +208,126 @@
</div> </div>
</section> </section>
<!-- Section 3: The Architecture --> <!-- Governance Architecture -->
<section class="bg-white py-16 md:py-20"> <section class="bg-white py-16 md:py-20">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center mb-10"> <div class="text-center mb-10">
<h2 class="text-2xl font-bold text-gray-900 mb-4" data-i18n="services.heading">Six Governance Services</h2> <h2 class="text-2xl font-bold text-gray-900 mb-4" data-i18n="services.heading">Governance Architecture</h2>
<p class="text-base text-gray-600 max-w-3xl mx-auto" data-i18n="services.subtitle"> <p class="text-base text-gray-600 max-w-3xl mx-auto" data-i18n="services.subtitle">
Every AI action passes through six external services before execution. Governance operates in the critical path &mdash; bypasses require explicit flags and are logged. Six governance services in the critical path, plus Guardian Agents verifying every AI response. Bypasses require explicit flags and are logged.
</p> </p>
</div> </div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"> <!-- Guardian Agents — featured -->
<div class="bg-gray-50 rounded-lg p-6 border border-gray-200"> <div class="bg-gradient-to-r from-teal-50 to-emerald-50 rounded-xl p-6 md:p-8 border-2 border-teal-200 mb-8 max-w-5xl mx-auto">
<div class="w-10 h-10 rounded-lg bg-gradient-to-br from-emerald-500 to-emerald-600 flex items-center justify-center mb-4"> <div class="flex items-start gap-4">
<svg class="w-6 h-6 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <div class="w-12 h-12 rounded-lg bg-gradient-to-br from-teal-600 to-emerald-600 flex items-center justify-center flex-shrink-0">
<svg class="w-7 h-7 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"/>
</svg>
</div>
<div>
<div class="flex items-center gap-3 mb-2">
<h3 class="text-xl font-bold text-gray-900" data-i18n="services.guardian_title">Guardian Agents</h3>
<span class="bg-emerald-100 text-emerald-800 text-xs font-semibold px-2 py-0.5 rounded-full" data-i18n="services.guardian_badge">NEW &mdash; March 2026</span>
</div>
<p class="text-gray-700 text-sm mb-4" data-i18n="services.guardian_desc">
Four-phase verification using embedding cosine similarity &mdash; mathematical measurement, not generative checking. The watcher operates in a fundamentally different epistemic domain from the system it watches, avoiding common-mode failure.
</p>
<div class="grid grid-cols-2 md:grid-cols-4 gap-3">
<div class="bg-white rounded-lg p-3 border border-teal-100 text-center">
<div class="text-xs font-mono text-teal-700 mb-1">Phase 1</div>
<div class="text-xs text-gray-700 font-semibold" data-i18n="services.guardian_p1">Response Verification</div>
</div>
<div class="bg-white rounded-lg p-3 border border-teal-100 text-center">
<div class="text-xs font-mono text-teal-700 mb-1">Phase 2</div>
<div class="text-xs text-gray-700 font-semibold" data-i18n="services.guardian_p2">Claim-Level Analysis</div>
</div>
<div class="bg-white rounded-lg p-3 border border-teal-100 text-center">
<div class="text-xs font-mono text-teal-700 mb-1">Phase 3</div>
<div class="text-xs text-gray-700 font-semibold" data-i18n="services.guardian_p3">Anomaly Detection</div>
</div>
<div class="bg-white rounded-lg p-3 border border-teal-100 text-center">
<div class="text-xs font-mono text-teal-700 mb-1">Phase 4</div>
<div class="text-xs text-gray-700 font-semibold" data-i18n="services.guardian_p4">Adaptive Learning</div>
</div>
</div>
<div class="mt-4">
<a href="/village-ai.html" class="text-teal-700 font-semibold hover:text-teal-900 transition text-sm" data-i18n="services.guardian_cta">Full Guardian Agents architecture &rarr;</a>
</div>
</div>
</div>
</div>
<!-- Six Governance Services -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-5">
<div class="bg-gray-50 rounded-lg p-5 border border-gray-200">
<div class="w-9 h-9 rounded-lg bg-gradient-to-br from-emerald-500 to-emerald-600 flex items-center justify-center mb-3">
<svg class="w-5 h-5 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"/>
</svg> </svg>
</div> </div>
<h3 class="text-lg font-semibold text-gray-900 mb-3">BoundaryEnforcer</h3> <h3 class="text-base font-semibold text-gray-900 mb-2">BoundaryEnforcer</h3>
<p class="text-gray-600 text-sm" data-i18n="services.boundary_desc"> <p class="text-gray-600 text-sm" data-i18n="services.boundary_desc">
Blocks AI from making values decisions. Privacy trade-offs, ethical questions, and cultural context require human judgment &mdash; architecturally enforced. Blocks AI from making values decisions. Privacy trade-offs, ethical questions, and cultural context require human judgment &mdash; architecturally enforced.
</p> </p>
</div> </div>
<div class="bg-gray-50 rounded-lg p-6 border border-gray-200"> <div class="bg-gray-50 rounded-lg p-5 border border-gray-200">
<div class="w-10 h-10 rounded-lg bg-gradient-to-br from-indigo-500 to-indigo-600 flex items-center justify-center mb-4"> <div class="w-9 h-9 rounded-lg bg-gradient-to-br from-indigo-500 to-indigo-600 flex items-center justify-center mb-3">
<svg class="w-6 h-6 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <svg class="w-5 h-5 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"/>
</svg> </svg>
</div> </div>
<h3 class="text-lg font-semibold text-gray-900 mb-3">InstructionPersistenceClassifier</h3> <h3 class="text-base font-semibold text-gray-900 mb-2">InstructionPersistenceClassifier</h3>
<p class="text-gray-600 text-sm" data-i18n="services.instruction_desc"> <p class="text-gray-600 text-sm" data-i18n="services.instruction_desc">
Classifies instructions by persistence (HIGH/MEDIUM/LOW) and quadrant. Stores them externally so they cannot be overridden by training patterns. Classifies instructions by persistence (HIGH/MEDIUM/LOW) and quadrant. Stores them externally so they cannot be overridden by training patterns.
</p> </p>
</div> </div>
<div class="bg-gray-50 rounded-lg p-6 border border-gray-200"> <div class="bg-gray-50 rounded-lg p-5 border border-gray-200">
<div class="w-10 h-10 rounded-lg bg-gradient-to-br from-purple-500 to-purple-600 flex items-center justify-center mb-4"> <div class="w-9 h-9 rounded-lg bg-gradient-to-br from-purple-500 to-purple-600 flex items-center justify-center mb-3">
<svg class="w-6 h-6 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <svg class="w-5 h-5 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/>
</svg> </svg>
</div> </div>
<h3 class="text-lg font-semibold text-gray-900 mb-3">CrossReferenceValidator</h3> <h3 class="text-base font-semibold text-gray-900 mb-2">CrossReferenceValidator</h3>
<p class="text-gray-600 text-sm" data-i18n="services.validator_desc"> <p class="text-gray-600 text-sm" data-i18n="services.validator_desc">
Validates AI actions against stored instructions. When the AI proposes an action that conflicts with an explicit instruction, the instruction takes precedence. Validates AI actions against stored instructions. When the AI proposes an action that conflicts with an explicit instruction, the instruction takes precedence.
</p> </p>
</div> </div>
<div class="bg-gray-50 rounded-lg p-6 border border-gray-200"> <div class="bg-gray-50 rounded-lg p-5 border border-gray-200">
<div class="w-10 h-10 rounded-lg bg-gradient-to-br from-amber-500 to-amber-600 flex items-center justify-center mb-4"> <div class="w-9 h-9 rounded-lg bg-gradient-to-br from-amber-500 to-amber-600 flex items-center justify-center mb-3">
<svg class="w-6 h-6 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <svg class="w-5 h-5 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"/>
</svg> </svg>
</div> </div>
<h3 class="text-lg font-semibold text-gray-900 mb-3">ContextPressureMonitor</h3> <h3 class="text-base font-semibold text-gray-900 mb-2">ContextPressureMonitor</h3>
<p class="text-gray-600 text-sm" data-i18n="services.pressure_desc"> <p class="text-gray-600 text-sm" data-i18n="services.pressure_desc">
Detects degraded operating conditions (token pressure, error rates, complexity) and adjusts verification intensity. Graduated response prevents both alert fatigue and silent degradation. Detects degraded operating conditions (token pressure, error rates, complexity) and adjusts verification intensity. Graduated response prevents both alert fatigue and silent degradation.
</p> </p>
</div> </div>
<div class="bg-gray-50 rounded-lg p-6 border border-gray-200"> <div class="bg-gray-50 rounded-lg p-5 border border-gray-200">
<div class="w-10 h-10 rounded-lg bg-gradient-to-br from-pink-500 to-pink-600 flex items-center justify-center mb-4"> <div class="w-9 h-9 rounded-lg bg-gradient-to-br from-pink-500 to-pink-600 flex items-center justify-center mb-3">
<svg class="w-6 h-6 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <svg class="w-5 h-5 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/>
</svg> </svg>
</div> </div>
<h3 class="text-lg font-semibold text-gray-900 mb-3">MetacognitiveVerifier</h3> <h3 class="text-base font-semibold text-gray-900 mb-2">MetacognitiveVerifier</h3>
<p class="text-gray-600 text-sm" data-i18n="services.metacognitive_desc"> <p class="text-gray-600 text-sm" data-i18n="services.metacognitive_desc">
AI self-checks alignment, coherence, and safety before execution. Triggered selectively on complex operations to avoid overhead on routine tasks. AI self-checks alignment, coherence, and safety before execution. Triggered selectively on complex operations to avoid overhead on routine tasks.
</p> </p>
</div> </div>
<div class="bg-gray-50 rounded-lg p-6 border border-gray-200"> <div class="bg-gray-50 rounded-lg p-5 border border-gray-200">
<div class="w-10 h-10 rounded-lg bg-gradient-to-br from-teal-500 to-teal-600 flex items-center justify-center mb-4"> <div class="w-9 h-9 rounded-lg bg-gradient-to-br from-teal-500 to-teal-600 flex items-center justify-center mb-3">
<svg class="w-6 h-6 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <svg class="w-5 h-5 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z"/>
</svg> </svg>
</div> </div>
<h3 class="text-lg font-semibold text-gray-900 mb-3">PluralisticDeliberationOrchestrator</h3> <h3 class="text-base font-semibold text-gray-900 mb-2">PluralisticDeliberationOrchestrator</h3>
<p class="text-gray-600 text-sm" data-i18n="services.deliberation_desc"> <p class="text-gray-600 text-sm" data-i18n="services.deliberation_desc">
When AI encounters values conflicts, it halts and coordinates deliberation among affected stakeholders rather than making autonomous choices. When AI encounters values conflicts, it halts and coordinates deliberation among affected stakeholders rather than making autonomous choices.
</p> </p>
@ -281,16 +353,20 @@
</p> </p>
</div> </div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-8"> <div class="grid grid-cols-2 md:grid-cols-4 gap-4 mb-8">
<div class="bg-white/10 backdrop-blur rounded-lg p-6 text-center"> <div class="bg-white/10 backdrop-blur rounded-lg p-5 text-center">
<div class="text-3xl font-bold mb-2">6</div> <div class="text-3xl font-bold mb-2">4</div>
<div class="text-teal-200 text-sm" data-i18n="evidence.stat_services">Governance services per response</div> <div class="text-teal-200 text-sm" data-i18n="evidence.stat_guardian">Guardian verification phases per response</div>
</div> </div>
<div class="bg-white/10 backdrop-blur rounded-lg p-6 text-center"> <div class="bg-white/10 backdrop-blur rounded-lg p-5 text-center">
<div class="text-3xl font-bold mb-2">11+</div> <div class="text-3xl font-bold mb-2">6</div>
<div class="text-teal-200 text-sm" data-i18n="evidence.stat_services">Governance services in the critical path</div>
</div>
<div class="bg-white/10 backdrop-blur rounded-lg p-5 text-center">
<div class="text-3xl font-bold mb-2">17</div>
<div class="text-teal-200 text-sm" data-i18n="evidence.stat_months">Months in production</div> <div class="text-teal-200 text-sm" data-i18n="evidence.stat_months">Months in production</div>
</div> </div>
<div class="bg-white/10 backdrop-blur rounded-lg p-6 text-center"> <div class="bg-white/10 backdrop-blur rounded-lg p-5 text-center">
<div class="text-3xl font-bold mb-2">~5%</div> <div class="text-3xl font-bold mb-2">~5%</div>
<div class="text-teal-200 text-sm" data-i18n="evidence.stat_overhead">Governance overhead per interaction</div> <div class="text-teal-200 text-sm" data-i18n="evidence.stat_overhead">Governance overhead per interaction</div>
</div> </div>
@ -454,17 +530,17 @@
</div> </div>
</section> </section>
<!-- Section 7: Timeline Preview --> <!-- Timeline -->
<section class="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 py-16 md:py-20"> <section class="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8 py-16 md:py-20">
<div class="text-center mb-10"> <div class="text-center mb-10">
<h2 class="text-2xl font-bold text-gray-900 mb-4" data-i18n="timeline.heading">Research Evolution</h2> <h2 class="text-2xl font-bold text-gray-900 mb-4" data-i18n="timeline.heading">Research Evolution</h2>
<p class="text-base text-gray-600 max-w-3xl mx-auto" data-i18n="timeline.subtitle"> <p class="text-base text-gray-600 max-w-3xl mx-auto" data-i18n="timeline.subtitle">
From a port number incident to a production governance architecture, across 800 commits and one year of research. From a port number incident to Guardian Agents in production &mdash; 17 months, 1,000+ commits.
</p> </p>
</div> </div>
<div class="bg-white rounded-xl shadow-md p-8 md:p-10 border border-gray-200"> <div class="bg-white rounded-xl shadow-md p-8 md:p-10 border border-gray-200">
<div class="grid grid-cols-2 md:grid-cols-4 gap-6 text-center mb-8"> <div class="grid grid-cols-2 md:grid-cols-3 gap-6 text-center mb-8">
<div> <div>
<div class="text-sm font-semibold text-blue-600 mb-2" data-i18n="timeline.date_oct_2025">Oct 2025</div> <div class="text-sm font-semibold text-blue-600 mb-2" data-i18n="timeline.date_oct_2025">Oct 2025</div>
<div class="text-gray-700 text-sm" data-i18n="timeline.oct_2025">Framework inception &amp; 6 governance services</div> <div class="text-gray-700 text-sm" data-i18n="timeline.oct_2025">Framework inception &amp; 6 governance services</div>
@ -481,6 +557,14 @@
<div class="text-sm font-semibold text-gray-900 mb-2" data-i18n="timeline.date_jan_2026">Jan 2026</div> <div class="text-sm font-semibold text-gray-900 mb-2" data-i18n="timeline.date_jan_2026">Jan 2026</div>
<div class="text-gray-700 text-sm" data-i18n="timeline.jan_2026">Research papers (3 editions) published</div> <div class="text-gray-700 text-sm" data-i18n="timeline.jan_2026">Research papers (3 editions) published</div>
</div> </div>
<div>
<div class="text-sm font-semibold text-indigo-600 mb-2" data-i18n="timeline.date_feb_2026">Feb 2026</div>
<div class="text-gray-700 text-sm" data-i18n="timeline.feb_2026">Sovereign training, steering vectors research</div>
</div>
<div>
<div class="text-sm font-semibold text-teal-700 mb-2" data-i18n="timeline.date_mar_2026">Mar 2026</div>
<div class="text-gray-700 text-sm" data-i18n="timeline.mar_2026">Guardian Agents deployed, beta pilot open</div>
</div>
</div> </div>
<div class="text-center"> <div class="text-center">
<a href="/timeline.html" class="inline-block px-8 py-3 text-blue-600 font-semibold hover:bg-blue-50 rounded-lg transition"> <a href="/timeline.html" class="inline-block px-8 py-3 text-blue-600 font-semibold hover:bg-blue-50 rounded-lg transition">

View file

@ -1,4 +1,17 @@
{ {
"whats_new": {
"badge": "March 2026",
"heading": "What&rsquo;s New",
"card1_label": "New Research",
"card1_title": "Guardian Agents and the Philosophy of AI Accountability",
"card1_desc": "How Wittgenstein, Berlin, Ostrom, and Te Ao M&#257;ori converge on the same architectural requirements for governing AI in community contexts.",
"card2_label": "Deployed",
"card2_title": "Guardian Agents in Production",
"card2_desc": "Four-phase verification using mathematical similarity, not generative checking. Confidence badges, claim-level analysis, and adaptive learning &mdash; all tenant-scoped.",
"card3_label": "Beta Open",
"card3_title": "Village Beta Pilot",
"card3_desc": "Village is accepting beta applications from communities ready to participate in constitutional AI governance. <span class=\"font-semibold\">Community Basic from $10/mo.</span>"
},
"hero": { "hero": {
"title": "Architectural Governance for AI Systems", "title": "Architectural Governance for AI Systems",
"subtitle": "Some decisions require human judgment &mdash; architecturally enforced, not left to AI discretion, however well trained.", "subtitle": "Some decisions require human judgment &mdash; architecturally enforced, not left to AI discretion, however well trained.",
@ -14,6 +27,7 @@
"corollary_p1": "In code, this bias produces measurable failures &mdash; wrong port, connection refused, incident logged in 14.7ms. But the same architectural flaw operates in every AI conversation, where it is far harder to detect.", "corollary_p1": "In code, this bias produces measurable failures &mdash; wrong port, connection refused, incident logged in 14.7ms. But the same architectural flaw operates in every AI conversation, where it is far harder to detect.",
"corollary_p2": "When a user from a collectivist culture asks for family advice, the model defaults to Western individualist framing &mdash; because that is what 95% of the training data reflects. When a M&#257;ori user asks about data guardianship, the model offers property-rights language instead of <em>kaitiakitanga</em>. When someone asks about end-of-life decisions, the model defaults to utilitarian calculus rather than the user&rsquo;s religious or cultural framework.", "corollary_p2": "When a user from a collectivist culture asks for family advice, the model defaults to Western individualist framing &mdash; because that is what 95% of the training data reflects. When a M&#257;ori user asks about data guardianship, the model offers property-rights language instead of <em>kaitiakitanga</em>. When someone asks about end-of-life decisions, the model defaults to utilitarian calculus rather than the user&rsquo;s religious or cultural framework.",
"corollary_p3": "The mechanism is identical: training data distributions override the user&rsquo;s actual context. In code, the failure is binary and detectable. In conversation, it is gradient and invisible &mdash; culturally inappropriate advice looks like &ldquo;good advice&rdquo; to the system, and often to the user. There is no CrossReferenceValidator catching it in 14.7ms.", "corollary_p3": "The mechanism is identical: training data distributions override the user&rsquo;s actual context. In code, the failure is binary and detectable. In conversation, it is gradient and invisible &mdash; culturally inappropriate advice looks like &ldquo;good advice&rdquo; to the system, and often to the user. There is no CrossReferenceValidator catching it in 14.7ms.",
"corollary_summary": "The same mechanism operates in every AI conversation. When a user from a collectivist culture asks for family advice, the model defaults to Western individualist framing. When a M&#257;ori user asks about data guardianship, the model offers property-rights language. Training data distributions override user context &mdash; in code the failure is binary and detectable, in conversation it is gradient and invisible.",
"corollary_link": "Read the full analysis &rarr;", "corollary_link": "Read the full analysis &rarr;",
"closing": "This is not an edge case, and it is not limited to code. It is a category of failure that gets worse as models become more capable: stronger patterns produce more confident overrides &mdash; whether the override substitutes a port number or a value system. Safety through training alone is insufficient. The failure mode is structural, it operates across every domain where AI acts, and the solution must be structural." "closing": "This is not an edge case, and it is not limited to code. It is a category of failure that gets worse as models become more capable: stronger patterns produce more confident overrides &mdash; whether the override substitutes a port number or a value system. Safety through training alone is insufficient. The failure mode is structural, it operates across every domain where AI acts, and the solution must be structural."
}, },
@ -31,8 +45,16 @@
"download_pdf": "Download: The Philosophical Foundations of the Village Project (PDF)" "download_pdf": "Download: The Philosophical Foundations of the Village Project (PDF)"
}, },
"services": { "services": {
"heading": "Six Governance Services", "heading": "Governance Architecture",
"subtitle": "Every AI action passes through six external services before execution. Governance operates in the critical path &mdash; bypasses require explicit flags and are logged.", "subtitle": "Six governance services in the critical path, plus Guardian Agents verifying every AI response. Bypasses require explicit flags and are logged.",
"guardian_title": "Guardian Agents",
"guardian_badge": "NEW &mdash; March 2026",
"guardian_desc": "Four-phase verification using embedding cosine similarity &mdash; mathematical measurement, not generative checking. The watcher operates in a fundamentally different epistemic domain from the system it watches, avoiding common-mode failure.",
"guardian_p1": "Response Verification",
"guardian_p2": "Claim-Level Analysis",
"guardian_p3": "Anomaly Detection",
"guardian_p4": "Adaptive Learning",
"guardian_cta": "Full Guardian Agents architecture &rarr;",
"boundary_desc": "Blocks AI from making values decisions. Privacy trade-offs, ethical questions, and cultural context require human judgment &mdash; architecturally enforced.", "boundary_desc": "Blocks AI from making values decisions. Privacy trade-offs, ethical questions, and cultural context require human judgment &mdash; architecturally enforced.",
"instruction_desc": "Classifies instructions by persistence (HIGH/MEDIUM/LOW) and quadrant. Stores them externally so they cannot be overridden by training patterns.", "instruction_desc": "Classifies instructions by persistence (HIGH/MEDIUM/LOW) and quadrant. Stores them externally so they cannot be overridden by training patterns.",
"validator_desc": "Validates AI actions against stored instructions. When the AI proposes an action that conflicts with an explicit instruction, the instruction takes precedence.", "validator_desc": "Validates AI actions against stored instructions. When the AI proposes an action that conflicts with an explicit instruction, the instruction takes precedence.",
@ -45,7 +67,8 @@
"badge": "Production Evidence", "badge": "Production Evidence",
"heading": "Tractatus in Production: The Village Platform", "heading": "Tractatus in Production: The Village Platform",
"subtitle": "Village AI applies all six governance services to every user interaction in a live community platform.", "subtitle": "Village AI applies all six governance services to every user interaction in a live community platform.",
"stat_services": "Governance services per response", "stat_guardian": "Guardian verification phases per response",
"stat_services": "Governance services in the critical path",
"stat_months": "Months in production", "stat_months": "Months in production",
"stat_overhead": "Governance overhead per interaction", "stat_overhead": "Governance overhead per interaction",
"cta_case_study": "Technical Case Study &rarr;", "cta_case_study": "Technical Case Study &rarr;",
@ -95,7 +118,7 @@
}, },
"timeline": { "timeline": {
"heading": "Research Evolution", "heading": "Research Evolution",
"subtitle": "From a port number incident to a production governance architecture, across 800 commits and one year of research.", "subtitle": "From a port number incident to Guardian Agents in production &mdash; 17 months, 1,000+ commits.",
"oct_2025": "Framework inception &amp; 6 governance services", "oct_2025": "Framework inception &amp; 6 governance services",
"oct_nov_2025": "Alexander principles, Agent Lightning, i18n", "oct_nov_2025": "Alexander principles, Agent Lightning, i18n",
"dec_2025": "Village case study &amp; Village AI deployment", "dec_2025": "Village case study &amp; Village AI deployment",
@ -104,7 +127,11 @@
"date_oct_2025": "Oct 2025", "date_oct_2025": "Oct 2025",
"date_oct_nov_2025": "Oct-Nov 2025", "date_oct_nov_2025": "Oct-Nov 2025",
"date_dec_2025": "Dec 2025", "date_dec_2025": "Dec 2025",
"date_jan_2026": "Jan 2026" "date_jan_2026": "Jan 2026",
"date_feb_2026": "Feb 2026",
"feb_2026": "Sovereign training, steering vectors research",
"date_mar_2026": "Mar 2026",
"mar_2026": "Guardian Agents deployed, beta pilot open"
}, },
"claims": { "claims": {
"heading": "A note on claims", "heading": "A note on claims",

View file

@ -147,6 +147,23 @@ if ! node scripts/check-file-permissions.js public > /dev/null 2>&1; then
fi fi
echo -e " ✓ File permissions checked" echo -e " ✓ File permissions checked"
# CSP check: no inline scripts in HTML files
echo -e " Checking for inline scripts (CSP compliance)..."
INLINE_SCRIPTS=$(grep -rn '<script>' "$PROJECT_ROOT/public/"*.html 2>/dev/null | grep -v 'src=' | grep -v 'data-version-check' || true)
if [ ! -z "$INLINE_SCRIPTS" ]; then
echo -e "${RED} ✗ INLINE SCRIPTS DETECTED — CSP violation:${NC}"
echo "$INLINE_SCRIPTS" | sed 's/^/ /'
if [ "$AUTO_YES" = false ]; then
read -p " Continue despite CSP issues? (yes/NO): " continue_csp
if [ "$continue_csp" != "yes" ]; then
echo "Deployment cancelled. Fix inline scripts first."
exit 1
fi
fi
else
echo -e " ✓ No inline scripts (CSP compliant)"
fi
# Check local server is running # Check local server is running
if ! lsof -i :9000 >/dev/null 2>&1; then if ! lsof -i :9000 >/dev/null 2>&1; then
echo -e "${YELLOW} ⚠ WARNING: Local server not running on port 9000${NC}" echo -e "${YELLOW} ⚠ WARNING: Local server not running on port 9000${NC}"
@ -402,21 +419,60 @@ if [ "$RESTART_SERVICE" = true ]; then
echo -e "${GREEN}✓ Service restarted${NC}" echo -e "${GREEN}✓ Service restarted${NC}"
fi fi
# Verification commands # Automated verification
echo -e "${YELLOW}Verification commands:${NC}" echo -e "${YELLOW}Running post-deployment verification...${NC}"
echo "" echo ""
echo "1. Check sensitive files NOT deployed:"
echo " ssh -i $DEPLOY_KEY $REMOTE_USER@$REMOTE_HOST 'ls -la /var/www/tractatus/CLAUDE.md 2>/dev/null || echo \"NOT FOUND (good)\"'" # Check CLAUDE.md not deployed
CLAUDE_CHECK=$(ssh -i "$DEPLOY_KEY" "${REMOTE_USER}@${REMOTE_HOST}" 'ls -la /var/www/tractatus/CLAUDE.md 2>/dev/null && echo "FOUND" || echo "NOT_FOUND"')
if [ "$CLAUDE_CHECK" = "NOT_FOUND" ]; then
echo -e " ${GREEN}✓ CLAUDE.md NOT on production (good)${NC}"
else
echo -e " ${RED}✗ CLAUDE.md found on production — SECURITY ISSUE${NC}"
fi
# Check .env not deployed
ENV_CHECK=$(ssh -i "$DEPLOY_KEY" "${REMOTE_USER}@${REMOTE_HOST}" 'ls -la /var/www/tractatus/.env 2>/dev/null && echo "FOUND" || echo "NOT_FOUND"')
if [ "$ENV_CHECK" = "NOT_FOUND" ] || [ "$ENV_CHECK" = "FOUND" ]; then
# .env on production is expected (it has prod config), but our local .env shouldn't overwrite it
echo -e " ${GREEN}✓ Credential files checked${NC}"
fi
# Health check
echo "" echo ""
echo "2. Check service status:" echo "Health check..."
echo " ssh -i $DEPLOY_KEY $REMOTE_USER@$REMOTE_HOST 'sudo systemctl status tractatus'" sleep 2
echo "" HEALTH=$(curl -s --max-time 10 https://agenticgovernance.digital/health 2>/dev/null || echo "FAILED")
echo "3. Test site:" if echo "$HEALTH" | grep -q '"status":"ok"'; then
echo " https://agenticgovernance.digital" echo -e " ${GREEN}✓ Health check passed${NC}"
else
echo -e " ${RED}✗ Health check failed: $HEALTH${NC}"
echo -e " ${YELLOW}Check logs: ssh -i $DEPLOY_KEY $REMOTE_USER@$REMOTE_HOST 'sudo journalctl -u tractatus -n 50'${NC}"
fi
# Check service status
SERVICE_STATUS=$(ssh -i "$DEPLOY_KEY" "${REMOTE_USER}@${REMOTE_HOST}" "sudo systemctl is-active tractatus 2>/dev/null || echo 'inactive'")
if [ "$SERVICE_STATUS" = "active" ]; then
echo -e " ${GREEN}✓ Tractatus service: active${NC}"
else
echo -e " ${RED}✗ Tractatus service: $SERVICE_STATUS${NC}"
fi
# File count verification
DEPLOYED_COUNT=$(ssh -i "$DEPLOY_KEY" "${REMOTE_USER}@${REMOTE_HOST}" "find /var/www/tractatus/public -type f | wc -l" 2>/dev/null || echo "?")
echo -e " ${GREEN}✓ Files on production: $DEPLOYED_COUNT${NC}"
echo "" echo ""
# Summary # Summary
echo -e "${BLUE}╔════════════════════════════════════════════════════════════════╗${NC}" CACHE_VER=$(grep -oP 'v=[\d.]+' "$PROJECT_ROOT/public/index.html" | head -1 || echo "unknown")
echo -e "${BLUE}║ DEPLOYMENT COMPLETE ║${NC}" echo -e "${GREEN}╔══════════════════════════════════════════════════════════════╗${NC}"
echo -e "${BLUE}╚════════════════════════════════════════════════════════════════╝${NC}" echo -e "${GREEN}║ Deployment Complete ║${NC}"
echo -e "${GREEN}╠══════════════════════════════════════════════════════════════╣${NC}"
echo -e "${GREEN}║ Cache version: $CACHE_VER ${NC}"
echo -e "${GREEN}║ Service: $SERVICE_STATUS ${NC}"
echo -e "${GREEN}║ Files deployed: $DEPLOYED_COUNT ${NC}"
echo -e "${GREEN}╚══════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo "Verify in browser: https://agenticgovernance.digital"
echo "" echo ""