Files
verdicttank/build-v5.1.py
T
root 3c07727f5c v4.1 go-live cut, Moonshot to Mistral swap, v5.x superseded
Mark v5.0/v5.1 SUPERSEDED (error-detection thesis failed at -0.40 delta); v4.1 is canonical. Cut v4.1 proposal with 12 version strings bumped. Moonshot to Mistral across production seats; production worker de-kimi'd 2026-08-18. Data-retention posture corrected 7/9 to 8/9 no-training (DeepSeek sole exception). Reconciled COGS with measured Mistral spend. Committed deployed v4.0 content and research docs to resolve the repo/live fork.
2026-08-18 20:28:36 -04:00

439 lines
26 KiB
Python

#!/usr/bin/env python3
"""Transform VerdictTank index-v5.0.html -> index-v5.1.html (6-seat pool, clean tiers)."""
import sys, re
SRC = "/root/projects/verdicttank/index-v5.0.html"
DST = "/root/projects/verdicttank/index-v5.1.html"
html = open(SRC, encoding="utf-8").read()
applied, failed = [], []
def rep(old, new, label, count=1):
global html
n = html.count(old)
if n != count:
failed.append(f"{label}: expected {count} occurrence(s), found {n}")
return
html = html.replace(old, new, count)
applied.append(label)
# ---------- CSS: 4 price cards in a row (layout only, colors untouched) ----------
rep(".pricing-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:16px;margin:20px 0}",
".pricing-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin:20px 0}",
"css-pricing-grid-4col")
rep("@media (max-width:768px){",
"@media (max-width:1080px){\n .pricing-grid{grid-template-columns:1fr 1fr}\n}\n@media (max-width:768px){",
"css-pricing-tablet-breakpoint")
# ---------- Title / badge ----------
rep("<title>VerdictTank v5.0 · Error Detection Density for Proposals</title>",
"<title>VerdictTank v5.1 · Error Detection Density for Proposals</title>", "title-v5.1")
rep('<div class="badge">v5.0 · Pre-Revenue · Validation-Tested</div>',
'<div class="badge">v5.1 · Pre-Revenue · Validation-Tested</div>', "badge-v5.1")
# ---------- Hero ----------
rep("A solo frontier model gives you a smooth, confident score. An 11-judge panel gives you the",
"A solo frontier model gives you a smooth, confident score. A 6-judge panel gives you the",
"hero-6-judge")
rep("<span><b>Panel:</b> 11 seats · 9 vendors</span>",
"<span><b>Panel:</b> 6 seats · 5 vendors</span>", "hero-meta-seats")
# ---------- Thesis statgrid ----------
rep('<div class="stat"><div class="v">11</div><div class="k">Judge seats, 9 vendors</div></div>',
'<div class="stat"><div class="v">6</div><div class="k">Judge seats, 5 vendors</div></div>',
"statgrid-seats")
rep("An 11-seat panel of nine different vendors cannot produce that coherence, and the incoherence",
"A 6-seat panel of five different vendors cannot produce that coherence, and the incoherence",
"thesis-spread-para")
# ---------- v5 evolution card ----------
rep(""" v5 replaces the adversarial pair with an 11-seat specialist panel across nine vendors, and
adds a synthesis seat whose only job is to compute panel statistics, flag scores more than
1.5 standard deviations from the mean, and reconcile the verdict against the evidence.""",
""" v5 replaces the adversarial pair with a 6-seat specialist panel across five vendors, and
adds a synthesis seat whose only job is to compute panel statistics, flag scores more than
1.5 standard deviations from the mean, and reconcile the verdict against the evidence.""",
"evolution-card-v5")
# ---------- Self-review prose: historical v2.2 run, now consolidated to 6 seats ----------
rep(""" That run cost roughly $150 in inference and returned 8 of 11 seats. Two seats were lost to a
provider credit wall hit mid-run and one to a model family that could not be dispatched at all.
The incomplete panel is why v2.3 of the judge pool spec now requires a pre-flight health gate
and a pre-baked failover roster, covered in section 5. The results below are what those 8 seats
produced, and we report them at 8 seats rather than extrapolating to 11.""",
""" That run executed on the v2.2 roster. It cost roughly $150 in inference across the three
proposals and returned 8 reporting seats. Two seats were lost to a provider credit wall hit
mid-run, one to a model family that could not be dispatched at all, and a meaningful share of
the spend went to retries against models that were already dead. The incomplete panel is why
v2.3 of the judge pool spec introduces a pre-flight health gate, a pre-baked failover roster,
and a consolidated 6-seat roster, all covered in section 5. The results below are what those
8 v2.2 seats actually produced. We report them as measured and do not extrapolate them onto
the 6-seat roster.""",
"self-review-v2.2-run")
# ---------- Validation table note ----------
rep(""" composition for this run was 8 reporting judges (4 Band A, 4 Band B) out of 11 specified seats,
a 73% coverage rate.""",
""" composition for this run was 8 reporting judges (4 Band A, 4 Band B) on the v2.2 roster. The
v2.3 roster documented in section 5 consolidates to 6 seats.""",
"validation-table-note")
rep("<td>Unanimity across nine vendors on a low score is a far stronger NO GO than one model's low score.</td>",
"<td>Unanimity across independent vendors on a low score is a far stronger NO GO than one model's low score.</td>",
"unanimity-vendors")
# ---------- Section 5 heading + lead ----------
rep('<h2><span class="n">05</span>Judge Pool v2.3: 11 Seats, 9 Vendors, Zero Double-Ups</h2>',
'<h2><span class="n">05</span>Judge Pool v2.3: 6 Seats, 5 Vendors, Zero Double-Ups</h2>',
"section5-heading")
rep(""" The panel that produced the validation data ran at 8 of 11 seats because two seats hit a
provider credit wall mid-run and one model family could not be dispatched at all. v2.3 is the
spec written in response to that failure. Full detail lives in the
<a href="judge-pool-spec.md">judge pool specification v2.3</a>.""",
""" The panel that produced the validation data ran 8 reporting seats on the v2.2 roster, after
two seats hit a provider credit wall mid-run and one model family could not be dispatched at
all. v2.3 is the spec written in response to that failure. It cuts the roster to 6 seats,
keeps every distinct question the validation run proved was load-bearing, and drops the
redundant generalist cross-checks that contributed correlated opinions rather than new
findings. Full detail lives in the
<a href="judge-pool-spec.md">judge pool specification v2.3</a>.""",
"section5-lead")
# ---------- Roster table ----------
rep(""" <tr><td>0</td><td>Research Agent</td><td>Grok 4.5</td><td>xAI</td><td>No</td></tr>
<tr><td>A</td><td>Primary Reviewer</td><td>Claude Opus 5</td><td>Anthropic</td><td>Yes</td></tr>
<tr><td>A</td><td>Cross-Check A</td><td>DeepSeek V4 Flash</td><td>DeepSeek</td><td>Yes</td></tr>
<tr><td>A</td><td>Cross-Check B</td><td>Gemini Pro Latest</td><td>Google</td><td>Yes</td></tr>
<tr><td>A</td><td>Cross-Check C</td><td>DeepSeek V4 Pro</td><td>DeepSeek</td><td>Yes</td></tr>
<tr><td>A</td><td>Legal / Regulatory</td><td>Claude Sonnet 5</td><td>Anthropic</td><td>Yes</td></tr>
<tr><td>B</td><td>Financial Integrity</td><td>MiniMax-M3</td><td>MiniMax</td><td>Yes</td></tr>
<tr><td>B</td><td>Team / Founder</td><td>Claude Fable 5</td><td>Anthropic</td><td>Yes</td></tr>
<tr><td>B</td><td>Market Reality</td><td>Qwen3.7 Plus</td><td>Alibaba</td><td>Yes</td></tr>
<tr><td>B</td><td>Execution Feasibility</td><td>GPT-5.2 Pro</td><td>OpenAI</td><td>Yes</td></tr>
<tr><td>C</td><td>Synthesis &amp; Integrity Gate</td><td>Kimi K2.6</td><td>Moonshot</td><td>No</td></tr>""",
""" <tr><td>0</td><td>Research Agent</td><td>Grok 4.5</td><td>xAI</td><td>No</td></tr>
<tr><td>A</td><td>Primary Reviewer</td><td>Claude Opus 5</td><td>Anthropic</td><td>Yes</td></tr>
<tr><td>A</td><td>Cross-Check</td><td>DeepSeek V4 Pro</td><td>DeepSeek</td><td>Yes</td></tr>
<tr><td>A</td><td>Legal + Compliance</td><td>Claude Sonnet 5</td><td>Anthropic</td><td>Yes</td></tr>
<tr><td>B</td><td>Financial + Market</td><td>MiniMax-M3</td><td>MiniMax</td><td>Yes</td></tr>
<tr><td>C</td><td>Synthesis + Gate</td><td>Kimi K2.6</td><td>Moonshot AI</td><td>No</td></tr>""",
"roster-table")
# ---------- Roster note: concentration ----------
rep(""" Nine distinct vendors across eleven seats. Nine distinct scoring models. Zero model double-ups:
no single model occupies two scoring seats, which is the constraint that keeps correlated
failure out of the panel mean. Maximum vendor concentration is Anthropic at 3 of 11 (27.3%),
comfortably inside the 40% ceiling. DeepSeek holds 2 of 11 (18.2%). Every remaining vendor holds
exactly one seat.""",
""" Five distinct vendors across six seats. Four scoring seats, four distinct scoring models. Zero
model double-ups: no single model occupies two scoring seats, which is the constraint that keeps
correlated failure out of the panel mean. Maximum vendor concentration is Anthropic at 2 of 6
(33%), inside the 40% ceiling. Every other vendor holds exactly one seat. The Research Agent and
the Synthesis seat do not score, so the panel mean is computed from four independent specialist
verdicts across four vendors.""",
"roster-note-concentration")
# ---------- Pipeline flow box after roster note ----------
rep(""" <h3>What changed in v2.3</h3>
<div class="defense-grid">""",
""" <h3>The 6-seat flow</h3>
<div class="arch-box">
Research Agent (Grok 4.5, xAI)
&gt; Primary Reviewer (Claude Opus 5, Anthropic)
&gt; Cross-Check (DeepSeek V4 Pro, DeepSeek)
&gt; Legal + Compliance (Claude Sonnet 5, Anthropic)
&gt; Financial + Market (MiniMax-M3, MiniMax)
&gt; Synthesis + Gate (Kimi K2.6, Moonshot AI)
</div>
<p class="table-note">
The Free tier runs a reduced 4-seat version of this flow: Research Agent, Primary Reviewer,
Legal + Compliance, Synthesis + Gate. It drops Cross-Check and Financial + Market. That
configuration still catches legal and compliance blockers, which was the single highest-value
error class in validation, so a free review proves the concept on the errors that matter most
without carrying the full panel cost.
</p>
<h3>What changed in v2.3</h3>
<div class="defense-grid">""",
"roster-flow-box")
# ---------- Synthesis gate: eleven opinions ----------
rep("Primary Reviewer alone. That gate is what turns eleven opinions into one auditable report.",
"Primary Reviewer alone. That gate is what turns four scored opinions into one auditable report.",
"synthesis-gate-opinions")
# ---------- PRICING SECTION: full replacement ----------
old_pricing_start = """ <h2><span class="n">07</span>Pricing: Priced Per Error Found, Not Per Point Gained</h2>"""
old_pricing_end = """ White-Label at $1,499 makes resellers whole — they re-bill reviews at $200-500 each.
</p>
</section>"""
i = html.find(old_pricing_start)
j = html.find(old_pricing_end)
if i == -1 or j == -1:
failed.append("pricing-section: anchors not found")
else:
new_pricing = """ <h2><span class="n">07</span>Pricing: Priced Per Error Found, Not Per Point Gained</h2>
<p class="lead">
Four tiers with declared review quantities. No asterisks, no fair-use clauses, no metered
surprises. Every tier states exactly how many reviews it includes and exactly what an extra
review costs. The pricing logic follows the revised thesis directly: a panel run is worth what a
caught error is worth, and a caught error is worth far more than a point of score.
</p>
<div class="pricing-grid">
<div class="price-card">
<h3 style="margin-top:0">Free</h3>
<div class="price">Free</div>
<ul>
<li>1 review per month</li>
<li>4-seat reduced panel</li>
<li>Top 3 Fix-It items</li>
<li>Panel score and spread</li>
<li>Catches legal and compliance blockers</li>
</ul>
<div class="price-purpose">Purpose: prove it on one document</div>
</div>
<div class="price-card price-card--featured">
<div class="ribbon">Most popular</div>
<h3 style="margin-top:0">Pro</h3>
<div class="price">$249<span>/mo</span></div>
<ul>
<li>5 reviews per month</li>
<li>Full 6-seat panel</li>
<li>Full Fix-It list, ranked</li>
<li>Re-score loop with before and after</li>
<li>Pre-Review Coach</li>
<li>Extra reviews $15 each</li>
<li>Annual billing $207/mo</li>
</ul>
<div class="price-purpose">Purpose: the founder or solo bid writer</div>
</div>
<div class="price-card">
<h3 style="margin-top:0">Enterprise</h3>
<div class="price">$799<span>/mo</span></div>
<ul>
<li>30 reviews per month</li>
<li>Full 6-seat panel</li>
<li>Full Fix-It list, ranked</li>
<li>Re-score loop and Pre-Review Coach</li>
<li>Branded white-label</li>
<li>Multi-seat workspaces</li>
<li>Shared corpus isolation</li>
<li>Configurable judge pool</li>
<li>Extra reviews $15 each</li>
<li>Annual billing $666/mo</li>
</ul>
<div class="price-purpose">Purpose: proposal teams running color reviews</div>
</div>
<div class="price-card">
<h3 style="margin-top:0">White-Label</h3>
<div class="price">$1,499<span>/mo</span></div>
<ul>
<li>50 reviews per month</li>
<li>Configurable panel</li>
<li>Full Fix-It list, ranked</li>
<li>Re-score loop and Pre-Review Coach</li>
<li>White-label on your own domain</li>
<li>Multi-seat workspaces</li>
<li>Dedicated corpus isolation</li>
<li>Full custom judge pool</li>
<li>Reseller model: re-bill $200-500 each</li>
<li>Extra reviews $10 each</li>
<li>Annual billing $1,249/mo</li>
</ul>
<div class="price-purpose">Purpose: consultancies and platforms reselling review as a service</div>
</div>
</div>
<h3>Full tier comparison</h3>
<table>
<thead>
<tr><th style="width:190px">&nbsp;</th><th>Free</th><th>Pro</th><th>Enterprise</th><th>White-Label</th></tr>
</thead>
<tbody>
<tr><td><strong>Price</strong></td><td>Free</td><td><strong>$249/mo</strong></td><td><strong>$799/mo</strong></td><td><strong>$1,499/mo</strong></td></tr>
<tr><td><strong>Reviews per month</strong></td><td>1</td><td>5</td><td>30</td><td>50</td></tr>
<tr><td><strong>Overage</strong></td><td class="muted">Not available</td><td>$15/review</td><td>$15/review</td><td>$10/review</td></tr>
<tr><td><strong>Panel</strong></td><td>4-seat reduced</td><td>Full 6-seat</td><td>Full 6-seat</td><td>Configurable</td></tr>
<tr><td><strong>Fix-Its</strong></td><td>Top 3</td><td>Full, ranked</td><td>Full, ranked</td><td>Full, ranked</td></tr>
<tr><td><strong>Re-score loop</strong></td><td class="muted">Not included</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
<tr><td><strong>Pre-Review Coach</strong></td><td class="muted">Not included</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
<tr><td><strong>White-label</strong></td><td class="muted">Not included</td><td class="muted">Not included</td><td>Branded only</td><td>Full domain</td></tr>
<tr><td><strong>Workspaces</strong></td><td class="muted">Not included</td><td class="muted">Not included</td><td>Multi-seat</td><td>Multi-seat</td></tr>
<tr><td><strong>Corpus isolation</strong></td><td class="muted">Not included</td><td class="muted">Not included</td><td>Shared</td><td>Dedicated</td></tr>
<tr><td><strong>Judge pool config</strong></td><td class="muted">Not included</td><td class="muted">Not included</td><td>Yes</td><td>Full custom</td></tr>
<tr><td><strong>Reseller model</strong></td><td class="muted">Not included</td><td class="muted">Not included</td><td class="muted">Not included</td><td>Re-bill $200-500/ea</td></tr>
<tr><td><strong>Annual billing (16.7% off)</strong></td><td class="muted">Not applicable</td><td>$207/mo</td><td>$666/mo</td><td>$1,249/mo</td></tr>
</tbody>
</table>
<p class="table-note">
Declared quantities only. When a tier is exhausted the customer either buys overage at the
published per-review rate or waits for the next cycle. Nothing is throttled silently and no tier
is described as unlimited, because a panel review has a real marginal cost and pretending
otherwise is how usage-based products lose money.
</p>
<h3>What a review costs us, and why the panel is affordable</h3>
<p>
The v2.2 validation run cost approximately $150 in inference for three full proposals across
eight reporting seats. That figure includes retries against dead models before the health gate
existed, which is exactly the waste v2.3 was written to remove. It is the honest anchor, and it
is deliberately the worst number we have.
</p>
<p>
A clean run on the consolidated 6-seat roster, with the pre-flight health gate preventing wasted
dispatches and only four seats actually scoring, costs <strong>$5.20 per review</strong>. That is
the number every tier below is built on.
</p>
<h3>Unit economics at declared quantities</h3>
<table>
<thead>
<tr><th>Tier</th><th>Reviews included</th><th>COGS at $5.20/review</th><th>Revenue</th><th>Gross margin</th></tr>
</thead>
<tbody>
<tr><td><strong>Pro</strong></td><td>5</td><td>$26</td><td>$249</td><td><strong>90%</strong></td></tr>
<tr><td><strong>Enterprise</strong></td><td>30</td><td>$156</td><td>$799</td><td><strong>80%</strong></td></tr>
<tr><td><strong>White-Label</strong></td><td>50</td><td>$260</td><td>$1,499</td><td><strong>83%</strong></td></tr>
<tr class="comp-table__us"><td><strong>Overage, Pro and Enterprise</strong></td><td><strong>per review</strong></td><td><strong>$5.20</strong></td><td><strong>$15.00</strong></td><td><strong>Roughly 3x COGS</strong></td></tr>
</tbody>
</table>
<p class="table-note">
Every declared quantity is margin-positive at full consumption, and so is every overage unit. The
$15 overage prices at roughly 3x COGS. The $10 White-Label overage prices at roughly 2x COGS,
which is the deliberate discount that makes the reseller math work. There is no consumption
pattern inside these tiers that produces a negative unit, which is the whole reason the word
unlimited does not appear on this page.
</p>
<p>
The reason a full 6-seat panel fits a $249 tier at five reviews per month is vendor mix and seat
discipline. Only the Primary Reviewer runs a premium frontier model. The remaining scoring seats
run strong mid-tier models from three different vendors, which is where the error-detection value
came from in validation. Cutting the roster from eleven seats to six removed the redundant
generalist cross-checks, not the specialists. Panel diversity is cheaper than panel depth, and
diversity is what caught the 14.
</p>
<h3>Why the value question is not the score question</h3>
<table>
<thead><tr><th>Error class</th><th>Real example from validation</th><th>Cost of missing it</th></tr></thead>
<tbody>
<tr><td>Legal blocker</td><td>Charitable solicitation registration in 40+ states</td><td>$30K to $75K of registration, against $3K to $14K of projected revenue</td></tr>
<tr><td>Compliance total</td><td>Full first-year compliance load on the same proposal</td><td>$60K to $150K, exceeding Year-1 revenue by roughly 10x</td></tr>
<tr><td>Execution gap</td><td>Contractor budget short by 4x to 7x</td><td>Roughly 800 unbudgeted founder hours</td></tr>
<tr><td>Revenue arithmetic</td><td>$2.7M headline against $269K computed from the document's own inputs</td><td>Credibility with any investor who checks the math, which is all of them</td></tr>
<tr><td>Competitive blind spot</td><td>A $4M-seed funded direct rival never named in the document</td><td>The first question in the room, unanswered</td></tr>
</tbody>
</table>
<p class="table-note">
A single caught item in the top two rows pays for a decade of the Pro tier. That is the entire
pricing argument, and it does not depend on the panel producing a higher score, which it does
not. Note that the two highest-value rows are both legal and compliance findings, which is
precisely why the Free tier keeps the Legal + Compliance seat.
</p>
<h3>Positioned against the authoring category</h3>
<table>
<thead><tr><th>Comparison</th><th>Their price</th><th>VerdictTank</th><th>Multiple</th></tr></thead>
<tbody>
<tr><td>Pro vs Bidara Starter</td><td>$499/mo</td><td>$249/mo</td><td><strong>2.0x less</strong></td></tr>
<tr><td>Pro vs AutoRFP.ai Scale</td><td>$899/mo</td><td>$249/mo</td><td><strong>3.6x less</strong></td></tr>
<tr><td>Enterprise vs AutogenAI</td><td>$30K+/yr custom</td><td>$799/mo ($9,588/yr)</td><td><strong>3.1x less annualized</strong></td></tr>
<tr><td>Enterprise vs Bidara Starter</td><td>$499/mo</td><td>$799/mo</td><td><strong>1.6x more</strong></td></tr>
<tr><td>Enterprise vs AutoRFP.ai Scale</td><td>$899/mo</td><td>$799/mo</td><td><strong>1.1x less</strong></td></tr>
<tr><td>White-Label vs AutogenAI</td><td>$30K+/yr custom</td><td>$1,499/mo ($17,988/yr)</td><td><strong>1.7x less annualized</strong></td></tr>
</tbody>
</table>
<p>
We are not a proposal team in a box. We are one high-value pass in the workflow. A buyer already
spending $499 to $899 per month on an authoring tool should be able to add the error-detection
layer. Pricing Pro at $249 is below the GC AI critique seat benchmark at $500/mo, and Enterprise
at $799 is a peer price to the authoring tools that feed it while landing 3.1x under an
enterprise authoring contract on an annualized basis. White-Label at $1,499 makes resellers
whole: 50 included reviews re-billed at $200 to $500 each is $10,000 to $25,000 of tenant
revenue against a $1,499 cost.
</p>
</section>"""
html = html[:i] + new_pricing + html[j + len(old_pricing_end):]
applied.append("pricing-section-full-replacement")
# ---------- Competitive table: VerdictTank row ----------
rep(""" <tr class="comp-table__us"><td><strong>VerdictTank</strong></td><td><strong>Panel error detection</strong></td><td><strong>Free / $249 Pro / $799 Enterprise / $1,499 White-Label</strong></td><td><strong>The only 11-seat, 9-vendor review panel with a published integrity gate</strong></td></tr>""",
""" <tr class="comp-table__us"><td><strong>VerdictTank</strong></td><td><strong>Panel error detection</strong></td><td><strong>Free (1/mo) · $249 Pro (5/mo) · $799 Enterprise (30/mo) · $1,499 White-Label (50/mo)</strong></td><td><strong>The only 6-seat, 5-vendor review panel with a published integrity gate and declared review quantities</strong></td></tr>""",
"competitive-verdicttank-row")
rep(""" Nine vendors, health gating, pre-baked failover, no model double-ups, and an integrity gate
that challenges its own outliers is not a prompt.""",
""" Five vendors, health gating, pre-baked failover, no model double-ups, and an integrity gate
that challenges its own outliers is not a prompt.""",
"moat-vendors")
# ---------- Deployment ----------
rep("must hold credentials for nine separate model vendors and must run the pre-flight health gate",
"must hold credentials for five separate model vendors and must run the pre-flight health gate",
"deployment-vendor-creds")
# ---------- Legal section ----------
rep(" from v4.0 and updated for the nine-vendor panel.",
" from v4.0 and updated for the five-vendor panel.", "legal-lead-vendors")
rep("<tr><td>Panel model API calls, all nine vendors</td>",
"<tr><td>Panel model API calls, all five vendors</td>", "legal-role-map-vendors")
rep(""" <strong>The nine-vendor panel raises the sub-processor row from a formality to the primary""",
""" <strong>The five-vendor panel raises the sub-processor row from a formality to the primary""",
"legal-callout-vendors")
rep(""" opt-in. Never a silent default, and never for corpus-eligible content. Each of the nine rostered
vendors is audited against this clause before it is eligible for a seat, and the audit is""",
""" opt-in. Never a silent default, and never for corpus-eligible content. Each of the five rostered
vendors is audited against this clause before it is eligible for a seat, and the audit is""",
"legal-training-guard-vendors")
rep("credentials for all nine model vendors, white-label tenant segments.",
"credentials for all five model vendors, white-label tenant segments.", "legal-ir-vendors")
rep(""" The Free, Pro and Enterprise tiers require Terms of Service, Privacy Policy and the AI Disclaimer
at minimum before any paid launch.""",
""" The Free, Pro, Enterprise and White-Label tiers all require Terms of Service, Privacy Policy and
the AI Disclaimer at minimum before any paid launch. White-Label additionally requires an
executed DPA as a hard provisioning gate.""",
"legal-mvl-tiers")
rep(""" <li><strong>Degraded-mode behavior:</strong> a panel that ran short of its full eleven seats is flagged visibly with the seat count and which roles failed over. We never silently substitute a provider without disclosure. The 2026-08-12 run is reported at 8 of 11 seats throughout this document for exactly that reason.</li>""",
""" <li><strong>Degraded-mode behavior:</strong> a panel that ran short of its full six seats is flagged visibly with the seat count and which roles failed over. We never silently substitute a provider without disclosure. The 2026-08-12 validation run is reported throughout this document at the 8 reporting seats it actually produced on the v2.2 roster, for exactly that reason.</li>""",
"legal-degraded-mode")
# ---------- Footer ----------
rep(""" VerdictTank v5.0 · <a href="https://verdicttank.com">verdicttank.com</a> ·
<a href="architecture.html">Technical Architecture</a> ·
<a href="judge-pool-spec.md">Judge Pool Spec v2.3</a> ·
<a href="index-v4.0.html">Prior version (v4.0)</a><br>""",
""" VerdictTank v5.1 · <a href="https://verdicttank.com">verdicttank.com</a> ·
<a href="architecture.html">Technical Architecture</a> ·
<a href="judge-pool-spec.md">Judge Pool Spec v2.3</a> ·
<a href="index-v5.0.html">Prior version (v5.0)</a><br>""",
"footer-v5.1")
rep(""" Every score, delta, spread and error count on this page comes from that run. Nothing is projected.""",
""" Every score, delta, spread and error count on this page comes from that run. Nothing is projected.
Panel roster is 6 seats across 5 vendors. All pricing tiers carry declared review quantities and
published overage rates.""",
"footer-note")
open(DST, "w", encoding="utf-8").write(html)
print(f"Applied {len(applied)} replacements")
for a in applied:
print(f" OK {a}")
if failed:
print(f"\nFAILED {len(failed)}:")
for f in failed:
print(f" FAIL {f}")
sys.exit(1)
print("\nAll replacements applied cleanly.")