Rewrite the status page around what the trace log actually shows

The page said the question set had NEVER BEEN RUN. That was wrong twice
over, and the second one only surfaced because the first was challenged.

Wrong the first time: commit 7ea8636 records that "the 67-question set
passed for weeks without catching any of them" - it was run repeatedly
against the stand-in model and passed. That is precisely why it caught
none of the eight failures that appeared minutes after the first real
model call on 27 August.

Wrong the second time, and worse: Langfuse holds 251 traces from
1 September 01:01-02:08 UTC covering 84 distinct questions, and every one
of the 75 distinct questions in the set is among them. Nothing was
skipped. That is the set being run end to end against the live model,
nine hours before the seed was re-keyed - and nobody knew, because
eval/results is git-ignored and no scorecard was kept. A run that leaves
no artefact is indistinguishable from one that never happened, which is
how a page assembled from the host ended up asserting the opposite of
what the host could prove.

So the exam is now amber, not red, and says what is actually wrong with
it as a gate: it scored a system that no longer exists, and its result was
not kept. A run against the current build is planned.

The rest is shape. The opening was three paragraphs of running commentary;
it is now one sentence plus a three-row revision table. The KPI band had
three separate tiles for open work - 1 request, 0 findings, 3 issues - so
a reader saw 0 beside 3 and had to work out they meant different things;
one tile now reads 4 open items, 1 blocking. A new section lists those
four in plain words with whose they are and whether they block anything,
because a number with nothing behind it is not status. "Phase" is gone
from the visible text: nine steps, each ending in a check.

Five container uptimes were removed rather than corrected. "Up 26 h" was
four days stale and how long since a restart changes no decision - the
same reasoning as not quoting counts in prose.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Claude 2026-09-01 22:13:41 +10:00
parent f852cb901f
commit 52a26f1d6e

View file

@ -125,6 +125,9 @@ header.top { padding: clamp(40px, 7vw, 76px) 0 34px; }
/* flex, not grid: flex items grow to fill the last row, so a count that does not
divide by the column count never leaves an empty tinted cell */
.revs { border-collapse: collapse; margin-top: 16px; font-size: .92rem; }
.revs td { padding: 4px 14px 4px 0; vertical-align: top; border: 0; color: var(--muted); }
.revs td.mono { white-space: nowrap; color: var(--ink); font-weight: 600; }
.kpis { display: flex; flex-wrap: wrap; gap: 1px; background: var(--hair);
border: 1px solid var(--hair); border-radius: 4px; overflow: hidden;
margin-top: 30px; }
@ -306,22 +309,24 @@ footer { margin-top: 72px; padding-top: 22px; border-top: 1px solid var(--hair);
<span class="lbl" style="color:var(--blue)">Plant Operations Assistant &middot; Proof of Concept</span>
</div>
<h1>Where the build actually stands</h1>
<p class="lede">Most of this page was read off the running host on <b>28&nbsp;August&nbsp;2026</b>
&mdash; containers listed, endpoints probed, the database queried, and two questions put through the
live assistant end to end. Nothing here is taken from the plan. Where this page and the build
documents disagree, this page is the later reading.</p>
<p class="lede" style="margin-top:14px"><b>Updated 31&nbsp;August.</b> The three open findings are
closed. They turned out to be one defect wearing three faces, and it was settled not by choosing
between the two disagreeing sides but by going to the SCADA configuration and finding that
<b>both were describing something the historian does not use.</b> The section that used to list
them now records what was actually wrong.</p>
<p class="lede">Read off the running host, not taken from the plan. Where this page and the
build documents disagree, this page is the later reading.</p>
<table class="revs">
<tr><td class="mono">1 Sep</td><td>Seed re-keyed onto CI&nbsp;Server item names; live database
migrated, API rebuilt, answer re-checked. Trace log shows the full question set was run
earlier the same day, before the re-key.</td></tr>
<tr><td class="mono">31 Aug</td><td>The three open findings closed &mdash; one defect wearing
three faces.</td></tr>
<tr><td class="mono">28 Aug</td><td>Page first compiled from the host: containers listed,
endpoints probed, database queried, live answers timed.</td></tr>
</table>
<div class="kpis">
<div class="kpi"><span class="kpi-n">28</span><span class="kpi-l">containers on lin001<br>7 of them ours</span></div>
<div class="kpi"><span class="kpi-n is-green">7</span><span class="kpi-l">phases done<br>of nine</span></div>
<div class="kpi"><span class="kpi-n is-red">1</span><span class="kpi-l">request still outstanding<br>the historian login</span></div>
<div class="kpi"><span class="kpi-n is-green">0</span><span class="kpi-l">open findings<br>all three closed 31 Aug</span></div>
<div class="kpi"><span class="kpi-n is-amber">78</span><span class="kpi-l">exam questions<br>never yet run as a gate</span></div>
<div class="kpi"><span class="kpi-n is-green">7</span><span class="kpi-l">steps done<br>of nine</span></div>
<div class="kpi"><span class="kpi-n is-red">4</span><span class="kpi-l">open items<br>1 of them blocking</span></div>
<div class="kpi"><span class="kpi-n is-amber">78</span><span class="kpi-l">exam questions<br>last run 1 Sep, before the re-key</span></div>
<div class="kpi"><span class="kpi-n is-purple">3.96<span style="font-size:.55em">s</span></span><span class="kpi-l">live answer, 28 Aug<br>contract-valid</span></div>
</div>
@ -342,7 +347,7 @@ footer { margin-top: 72px; padding-top: 22px; border-top: 1px solid var(--hair);
<div class="figure">
<div class="scroller">
<svg viewBox="0 0 1200 600" role="img" aria-labelledby="topo-title topo-desc">
<title id="topo-title">WRPS plant assistant topology as built, 28 August 2026</title>
<title id="topo-title">WRPS plant assistant topology as built, 1 September 2026</title>
<desc id="topo-desc">The SCADA server cicore1 reaches the assistant on the Docker host
lin001 without signing in. The SQL host imh, which would supply real plant history, does
not yet exist. lin001 runs seven containers built by this project alongside twenty-one that
@ -499,7 +504,7 @@ footer { margin-top: 72px; padding-top: 22px; border-top: 1px solid var(--hair);
<!-- ================================================================ 2 ==== -->
<section id="phases">
<div class="sec-head"><span class="num">02</span><h2>What is done, and what is not</h2></div>
<p class="sec-sub">Nine phases, each ending in a gate that must pass before the next begins &mdash;
<p class="sec-sub">Nine steps, each ending in a check that must pass before the next begins &mdash;
so that when an answer comes out wrong there is one place to look, not four. Two gates have never
been run, and one phase was built out of order.</p>
@ -512,7 +517,7 @@ footer { margin-top: 72px; padding-top: 22px; border-top: 1px solid var(--hair);
<div class="pnote">Documents, equipment names, tag definitions and the stand-in plant history.
Five database roles with the split that matters: the answer path can read and nothing else,
and only the ingestion role can write documents.</div>
<ul class="evi"><li>healthy 8 days</li><li>92 document chunks</li><li>8 equipment, 65 tags, all aliased</li><li>49 historian items mapped</li><li>no host port</li><li>agent_ro cannot INSERT</li></ul>
<ul class="evi"><li>92 document chunks</li><li>8 equipment, 65 tags, all aliased</li><li>keyed on CI Server items since 1 Sep</li><li>49 historian items mapped</li><li>no host port</li><li>agent_ro cannot INSERT</li></ul>
</div>
<div class="phase s-done">
@ -599,12 +604,17 @@ footer { margin-top: 72px; padding-top: 22px; border-top: 1px solid var(--hair);
<div class="phase s-blocked">
<span class="pn">08</span>
<div class="pbody"><h4>The exam</h4></div>
<span class="chip c-red"><i class="lamp l-red"></i>Never run</span>
<span class="chip c-amber"><i class="lamp l-amber"></i>Run 1 Sep &mdash; but before the re-key, and no scorecard kept</span>
<div class="pnote">Engineer-reviewable questions, every data-dependent one with a pinned time
window. Nothing blocks running it &mdash; the model account arrived on 27 August &mdash; and it
has never been run as a gate. No scorecard exists. Two cases fail by design until the historian
lands.</div>
<ul class="evi"><li>28 historical</li><li>18 procedural</li><li>14 advisory</li><li>13 reference</li><li>2 unclear</li><li>pass mark: 85% / 95% / zero breaches</li></ul>
window. <b>The whole set was put through the live assistant on 1&nbsp;September, 01:01&ndash;02:08
UTC</b> &mdash; every question, found in the assistant&rsquo;s own trace log. Two things are wrong
with it as a gate: <b>it ran nine hours before the seed was re-keyed</b>, so it scored a system
that no longer exists; and <b>no scorecard was kept</b>, so there is no result to read. A run
against the current build is planned. Earlier, the 67-question version passed for weeks against
the stand-in model &mdash; which is why it caught none of the eight failures that appeared
minutes after the first real model call on 27&nbsp;August. Two cases fail by design until the
historian lands.</div>
<ul class="evi"><li>30 historical</li><li>18 procedural</li><li>14 advisory</li><li>14 reference</li><li>2 unclear</li><li>pass mark: 85% / 95% / zero breaches</li></ul>
</div>
<div class="phase s-odd">
@ -643,19 +653,19 @@ footer { margin-top: 72px; padding-top: 22px; border-top: 1px solid var(--hair);
<tr><td class="name">cube</td>
<td class="mono">lin001 &middot; ai-internal + proxy</td>
<td class="mono">cube.yokogawa.tech &rarr; 302</td>
<td>Healthy 7 h and answering the data lane &mdash; but off stand-in tables, not the historian.</td></tr>
<td>Healthy and answering the data lane &mdash; but off stand-in tables, not the historian. Restarted 1 Sep to pick up the item-keyed models.</td></tr>
<tr><td class="name">cubestore</td>
<td class="mono">lin001 &middot; ai-internal<br>/datadisk/cubestore</td>
<td class="mono">nothing &mdash; no host port</td>
<td>Up 7 days. A hard dependency of cube, not an optimisation &mdash; cube will not start without it. <b>Absent from the original architecture deck.</b></td></tr>
<td>A hard dependency of cube, not an optimisation &mdash; cube will not start without it. <b>Absent from the original architecture deck.</b></td></tr>
<tr><td class="name">ai-api</td>
<td class="mono">lin001 &middot; ai-internal + proxy<br>0600 env file</td>
<td class="mono">api.yokogawa.tech &rarr; 302<br>and /ask under ai.&hellip;</td>
<td>Healthy 2 h. A procedural question answered end to end in 3.96 s: correct document identity, prerequisites quoted, steps withheld, scope banner present.</td></tr>
<td>Rebuilt 1 Sep &mdash; it now refuses a retired SCADA name outright instead of finding nothing. A procedural question answered end to end in 3.96 s: correct document identity, prerequisites quoted, steps withheld, scope banner present.</td></tr>
<tr><td class="name">ai-web</td>
<td class="mono">lin001 &middot; proxy &middot; static build</td>
<td class="mono">ai.yokogawa.tech &rarr; 403</td>
<td>Up 26 h. The 403 is the deny arm working correctly. The allow arm is now proven from the console itself &mdash; the access log shows 10.0.0.21 since 28 August.</td></tr>
<td>The 403 is the deny arm working correctly. The allow arm is now proven from the console itself &mdash; the access log shows 10.0.0.21 since 28 August.</td></tr>
<tr><td class="name">langfuse + lf-db</td>
<td class="mono">lin001 &middot; ai-internal + proxy<br>/datadisk/langfuse</td>
<td class="mono">lf.yokogawa.tech &rarr; 302</td>
@ -671,7 +681,7 @@ footer { margin-top: 72px; padding-top: 22px; border-top: 1px solid var(--hair);
<tr class="row-amber"><td class="name">openplc-runtime</td>
<td class="mono">lin001 &middot; host ports 502, 8443</td>
<td class="mono">Modbus TCP, bound 10.0.0.17</td>
<td>Up 8 days. <b>Live control for this demo.</b> The one deliberate exception to the no-published-ports rule, contained by that binding plus firewall scope. Never restarted as a side effect of AI work.</td></tr>
<td><b>Live control for this demo.</b> The one deliberate exception to the no-published-ports rule, contained by that binding plus firewall scope. Never restarted as a side effect of AI work.</td></tr>
<tr class="row-red"><td class="name">svc_agent_ro</td>
<td class="mono">yau-sls-poc-imh &middot; TDS 1433</td>
<td class="mono">not reachable</td>
@ -814,7 +824,22 @@ footer { margin-top: 72px; padding-top: 22px; border-top: 1px solid var(--hair);
<!-- ================================================================ 5 ==== -->
<section id="catalogue">
<div class="sec-head"><span class="num">05</span><h2>Every component, and what its job is</h2></div>
<div class="sec-head"><span class="num">05</span><h2>What is open, and on whom</h2></div>
<p>One thing is still needed from other people. Three more are ours, and none of them stops
anything today.</p>
<table class="tbl">
<tr><th>Open</th><th>Whose</th><th>Blocking?</th></tr>
<tr><td>A read-only login to the real plant historian, and its schema</td>
<td>Outside this project</td><td><b>Yes</b> &mdash; every number is a stand-in until it lands</td></tr>
<tr><td>The OpenPLC editor is not installed anywhere, so the control logic has no reviewable
source outside the container</td><td>Ours</td><td>No</td></tr>
<tr><td>The assistant refuses to recommend a setpoint. That is deliberate, and expected to be
revisited as a feature</td><td>Ours &mdash; a decision, not a defect</td><td>No</td></tr>
<tr><td>Faults in the deployment scripts and database migrations have nowhere to be recorded as
a test, so a fixed one can come back</td><td>Ours</td><td>No</td></tr>
</table>
<div class="sec-head"><span class="num">06</span><h2>Every component, and what its job is</h2></div>
<p class="sec-sub">Twenty-eight containers on one shared host. Seven are ours; twenty-one were
already here and serve other demos. This is the list the architecture deck never carried.</p>
@ -1009,7 +1034,7 @@ footer { margin-top: 72px; padding-top: 22px; border-top: 1px solid var(--hair);
<!-- ================================================================ 6 ==== -->
<section id="shortcuts">
<div class="sec-head"><span class="num">06</span><h2>Deliberate shortcuts, all reversible</h2></div>
<div class="sec-head"><span class="num">07</span><h2>Deliberate shortcuts, all reversible</h2></div>
<p class="sec-sub">Documented rather than hidden, and none of them to be shipped. Production closes
them in this order: network separation, then secrets, then database guardrails, then document
control integration, then resilience.</p>