Changelog

Live release notes — every shipped version

Latest: v1.43.2  •  178 releases

v1.43.2 PATCH

data-quality service — review doc-27 §3.4 + §5.7

MINOR ship: closes review doc-27 §3.4 ("simulation mode banner") + §5.7 P1

(BMS/DCIM data-quality discipline) + doc-28 Global UIUX Corrections ("data

freshness badge on top bar"). Introduces the data-quality service that

surfaces telemetry trust at both page level (banner) and point level (chip).

Engine + #p-dash byte-identical. 39/39 line-model probe pass (added

3 telemetry-quality assertions per inspector page — total +12) + 75/75

accuracy probe + 57/57 + 22/22 + all strict audits PASS.

Added

  • js/rz-telemetry-quality.jswindow.RZTelemetryQuality service:
  • 7 states with colour + chip label (live / simulated / stale /

manual / comms_lost / inhibited / demo).

  • Page-level setPageMode(mode) → injects dismissible top banner

(skips render when mode = live).

  • Per-element markPoint(el, state) + getPointState(el) (falls back to

page mode if no explicit data-quality-state).

  • chipHtml(state) — small inline chip for embedded rendering.
  • audit(rootEl) consumed by probe-line-model.mjs.
  • Auto-init on DOMContentLoaded if <body data-rz-data-mode="..."> set.
  • standarization/TELEMETRY_QUALITY.md — full schema + adoption table.
  • Inspector Live tab now renders a Data Quality chip below State,

reading RZTelemetryQuality.getPointState(currentElement).

Changed

  • datahallAI.html:
  • <body data-rz-data-mode="simulated"> (added attribute, body otherwise

unchanged).

  • <script src="js/rz-telemetry-quality.js?v=1.43.2" defer> loaded after

inspector. Both scripts bumped to ?v=1.43.2.

  • chiller-plant.html — same body attribute + script. Body otherwise

byte-identical.

  • water-system.html — same body attribute + script.
  • fire-system.html — same body attribute + script.
  • js/rz-inspector.js — Live tab renders a "Data quality" row reading

the element's data-quality-state (or inherited page mode). No other

inspector behaviour changes.

  • tools/probe-line-model.mjs — added 3 telemetry-quality assertions

per inspector page:

  • window.RZTelemetryQuality exposed
  • body data-rz-data-mode = 'simulated'
  • simulated-mode banner rendered

Scope discipline (unchanged)

  • EPMS_Telemetry.html — untouched per owner mandate.

Docs

  • standarization/TELEMETRY_QUALITY.md NEW spec.
  • standarization/INSPECTOR.md adoption table updated.
  • standarization/BMS_SHELL.md v1.43.x table extended.
  • CHANGELOG.md (this entry) + changelog.html regen.
  • Memory tracker updated.
v1.43.1 PATCH

inspector cross-page parity — chiller-plant + water-system + fire-system

PATCH ship: extends the v1.43.0 right-side inspector to the three other

tagged cockpit pages. Pure additive — one <script src> per page,

no rendering changes, no DOM modifications.

Engine + #p-dash byte-identical. 27/27 line-model probe (added 6

inspector assertions for the 3 newly-covered pages) + 75/75 accuracy

probe + 57/57 + 22/22 + all strict audits PASS.

Changed

  • chiller-plant.html<script src="js/rz-inspector.js?v=1.43.0" defer>

added after rz-breaker-symbols.js. Click any of the 18 tagged CHW pipes

→ inspector opens.

  • water-system.html<script src="js/rz-inspector.js?v=1.43.0" defer>

added after rz-line-model.js. Click any of the 10 tagged pipes → inspector

opens.

  • fire-system.html<script src="js/rz-inspector.js?v=1.43.0" defer>

added after rz-line-model.js. Click any of the 14 tagged fire-water / N2

pipes → inspector opens.

  • tools/probe-line-model.mjsINSPECTOR_PAGES set extended; every

tagged cockpit page now verifies inspector availability + click-to-open

behaviour.

Scope discipline (unchanged)

  • EPMS_Telemetry.html — still untouched per owner mandate

("jangan merusak EPMS DC Conventional ya, enhance bole" — 2026-05-26).

  • dc-conventional.html — landing page, no inspector needed

(no tagged equipment).

Cumulative state after v1.43.1

PageLinesBreakersInspector
datahallAI.html17136
chiller-plant.html180
water-system.html100
fire-system.html140

Docs

  • standarization/INSPECTOR.md adoption table v1.43.1 row.
  • standarization/BMS_SHELL.md v1.43.x table extended.
  • CHANGELOG.md (this entry) + changelog.html regen.
  • Memory tracker updated.
v1.43.0 MINOR

right-side inspector — review doc-27 §3.2 P0

MINOR ship: closes review doc-27 §3.2 P0 ("Equipment popup masih MODAL

CENTER, menutup topology. Jadikan click equipment membuka right-side

inspector, bukan modal tengah").

Self-attaching inspector library that surfaces the metadata laid down by

v1.42.0-v1.42.5. Click any [data-rz-line] or [data-rz-breaker] element

on datahallAI.html to see Live / Capacity / Deps / Alarms / Trend /

Maintenance tabs in a sticky right-side panel that does NOT occlude topology.

Engine + #p-dash byte-identical. 21/21 line-model probe pass (including

the two new inspector assertions: window.RZInspector exposed +

clicking [data-rz-line] opens inspector) + 75/75 accuracy probe + 57/57 +

22/22 + all strict audits PASS.

Added

  • js/rz-inspector.js — self-contained inspector library. Vanilla

ES5, no external dependencies. CSS injected on init (scoped to

.rz-inspector*).

  • Slide-in panel from right (360px desktop, full-width on ≤640px).
  • 6 tabs read directly from element data-* attributes.
  • Delegated click handler — catches dynamically-rendered elements.
  • ESC + outside-click close.
  • Dependency-card click navigates to linked equipment ID.
  • Pulsing dot when state=energized. Colour-coded state pills.
  • State machine respects review doc-27 §4.3 alarm philosophy

(active / acknowledged / inhibited / RTN derived from state).

  • standarization/INSPECTOR.md — schema, tabs, API, adoption table,

authoring guidelines.

Changed

  • datahallAI.html<script src="js/rz-inspector.js?v=1.43.0" defer>

loaded after rz-breaker-symbols.js. Other cockpit pages (chiller-plant,

water-system, fire-system) deferred to v1.43.1 to limit blast radius.

  • tools/probe-line-model.mjs — extended for datahallAI:

asserts window.RZInspector exposed + synthetic click on first

[data-rz-line] opens the panel.

Scope discipline

  • EPMS_Telemetry.html intentionally untouched per the owner mandate

("jangan merusak EPMS DC Conventional ya, enhance bole" — 2026-05-26).

  • Other cockpit pages (chiller-plant, water-system, fire-system) deferred

to v1.43.1 — additive script load only, no rendering change.

Docs

  • standarization/INSPECTOR.md NEW spec doc.
  • standarization/BMS_SHELL.md v1.43.x adoption row.
  • CHANGELOG.md (this entry) + changelog.html regen.
  • Memory tracker updated.
v1.42.5 PATCH

water-system + fire-system static SVG pipes tagged

MINOR ship: sixth in the v1.42.x → v1.45.x sweep. Cross-page adoption

extends to water-system.html (water treatment P&ID) and fire-system.html

(fire-water + N2 distribution P&ID).

Static SVG <path class="pipe-base"> elements tagged inline with

data-rz-line="1" + data-from / data-to / data-medium / data-state

/ data-capacity / data-current / data-redundancy / data-sensor.

No JS changes — the validator queries the static attributes.

Engine + #p-dash byte-identical. 19/19 line-model probe pass

(datahallAI 171L+36B; chiller-plant 18L; water-system 10L; fire-system 14L)

  • 75/75 accuracy probe + 57/57 + 22/22 + all strict audits PASS.

Added

  • water-system.html + fire-system.htmljs/rz-line-model.js

loaded non-deferred after conv-engine.js so the probe can call

window.RZLineModel.audit().

Changed (additive metadata only, visual identical)

  • water-system.html10 pipes tagged inline (raw → filter →

pump → UV → treated tank/makeup chains, backwash drain, makeup blowdown):

ws-mains-in, ws-raw-to-filter, ws-filter-to-pump, ws-pump-to-uv,

ws-uv-to-treated-header, ws-treated-to-domtank, ws-treated-to-makeup,

ws-domtank-to-service, ws-bw-to-drain, ws-makeup-blowdown.

  • fire-system.html14 pipes tagged inline:

fs-landlord-makeup, fs-suction-header, fs-n2-supply,

fs-fp01-discharge, fs-jp-discharge, fs-fp02-discharge,

fs-to-wet-zone, fs-to-preaction-zone,

fs-n2-distribution-header, fs-n2-pv1..fs-n2-pv5.

Probe infrastructure

  • tools/probe-line-model.mjswaitUntil:'load' (was networkidle2)

to avoid timeouts on pages with long-running flow animations.

  • Targets bumped:

water-system.html: 10, fire-system.html: 14.

Docs

  • standarization/LINE_MODEL.md v1.42.5 row.
  • standarization/BMS_SHELL.md v1.42.x table extended.
  • CHANGELOG.md (this entry) + changelog.html regen.
  • Memory tracker updated.
v1.42.4 PATCH

first cross-page adoption — chiller-plant.html CHW P&ID

MINOR ship: fifth in the v1.42.x → v1.45.x sweep. First port to a SECOND

page (chiller-plant.html). Owner mandate respected: **EPMS_Telemetry.html

intentionally untouched** — additive enhancement only, no rendering changes.

Engine + #p-dash byte-identical. 11/11 line-model probe (datahallAI 171

lines + 36 breakers; chiller-plant 18 lines) + 75/75 accuracy probe +

57/57 + 22/22 + all strict audits PASS.

Added

  • chiller-plant.html script importsjs/rz-line-model.js +

js/rz-breaker-symbols.js loaded non-deferred after conv-engine.js,

before drawPid() inline IIFE can call them.

Changed

  • chiller-plant.html drawPid() functionconst RZL = window.RZLineModel;

binding added at top.

  • +16 branch lines ported (4 chiller loops × 4 lines):
  • chw-sup-drop-{loopId} (CHWS header → loop supply tee)
  • chw-sup-leg-{loopId} (loop supply tee → evaporator)
  • chw-ret-drop-{loopId} (CHWR header → loop return tee)
  • chw-ret-leg-{loopId} (evaporator → loop return tee)
  • State binds to evalLoop(lp).level (fault when ALARM, energized otherwise).
  • Sensor tags TT-CHWS-{i+1} / TT-CHWR-{i+1}.
  • +2 header lines ported:
  • chw-header-supply (CHILLER-PLANT → BUILDING-AHU,

data-current bound to engine coolingKw + flow + temp)

  • chw-header-return (BUILDING-AHU → CHILLER-PLANT)
  • Animation overlay (<line class="flow chws|chwr" />) unchanged.
  • All ports use style.stroke='currentColor' to preserve the existing

.pipe CSS class colour (no visual regression).

  • tools/probe-line-model.mjsADOPTION_TARGETS['chiller-plant.html'] = 18.

NOT changed (owner mandate)

  • EPMS_Telemetry.html — left byte-identical. Owner: "jangan merusak

EPMS DC Conventional ya, enhance bole". Future ports to EPMS will follow

a separate, more cautious plan (likely v1.43.x with inspector pattern

ready first).

Docs

  • standarization/LINE_MODEL.md v1.42.4 row.
  • standarization/BMS_SHELL.md v1.42.x table extended.
  • CHANGELOG.md (this entry) + changelog.html regen.
  • Memory tracker project_rz_review_2026-05-26.md updated.
v1.42.3 PATCH

network fabric link semantics — netSvg port

MINOR ship: fourth in the v1.42.x → v1.45.x sweep. Closes review doc-27 §5.5

P0 ("Tampilkan spine/leaf/super-spine grouping. Link harus punya speed:

100G/200G/400G/800G. Tampilkan utilization, packet loss, latency,

oversubscription ratio. Tampilkan failure domain: rack, row, pod,

availability zone.").

Engine + #p-dash byte-identical. 7/7 line-model probe + 75/75 accuracy

probe + 57/57 + 22/22 + all strict audits PASS.

Changed

  • datahallAI.html netSvg IIFE (Network Fabric Topology):
  • var RZL=window.RZLineModel; binding added at top.
  • +32 spine-leaf bundled lanes ported. IDs: sl{si}{li} (where si =

spine 0-3, li = leaf 0-7). Each carries:

  • data-medium="fiber"
  • data-direction="bidirectional"
  • data-state="energized"
  • data-capacity="800 Gb/s IB XDR"
  • data-current="782 Gb/s"
  • data-redundancy="redundant_a"
  • data-tag="rail-{si+1} / dom-pod-{li+1}" (failure domain — 4-rail FT)
  • +27 NVL72 domain-to-leaf bundled lanes ported. IDs: dom{n}-to-LF-{li}.

Each carries:

  • data-medium="fiber"
  • data-capacity="4× 800 Gb/s NIC"
  • data-current="756 Gb/s"
  • data-tag="leaf-row-{ri} / pod-{lfIdx+1}"
  • Visual identical (preserves var(--p) purple for spine-leaf and

var(--b) blue for domain-leaf via style.stroke override). Laser

overlay (hover-reveal individual links) unchanged.

  • tools/probe-line-model.mjsADOPTION_TARGETS.datahallAI.html = 171.

Docs

  • standarization/LINE_MODEL.md v1.42.3 row.
  • standarization/BMS_SHELL.md v1.42.x table extended.
  • CHANGELOG.md (this entry) + changelog.html regen.
  • Memory tracker project_rz_review_2026-05-26.md updated.
v1.42.2 PATCH

per-DH Electrical SLDs L0+L1 — drawDH(

port × 4 halls)

MINOR ship: third in the v1.42.x → v1.45.x sweep. Ports the SHARED drawDH()

function (called once per DH-01..04) so every per-hall SLD now carries the

line-model + breaker-symbol metadata. Each port multiplies by 4 across the

four data hall containers (elecDH1Svg–elecDH4Svg).

Engine + #p-dash byte-identical. 75/75 accuracy probe + 57/57 + 22/22 +

all strict audits PASS. Line-model probe 7/7 at the bumped targets

(112 lines + 36 breakers on datahallAI.html).

Changed

  • datahallAI.html drawDH() function — local var RZL/RZB bindings

added at top after coordinate constants. L0 (MV Customer Substation)

and L1 (RMU) sections ported:

  • L0 lines (×4 halls = 44 tagged):
  • dh{n}-pln-{a,b}-to-meter (utility → revenue meter)
  • dh{n}-meter-{a,b}-to-vcb (meter → VCB incomer)
  • dh{n}-vcb-inc-{a,b}-to-bus (incomer → SM6 bus drop)
  • dh{n}-bus-tie (purple N.O., redundancy=tie)
  • dh{n}-bus-to-f{a,b} (bus → feeder)
  • dh{n}-f{a,b}-to-rmu-drop (feeder exit to RMU)
  • L0 breakers (×4 halls = 20 tagged):
  • VCB-INC-DH{n}-{A,B} (closed, 50/51, PPE2)
  • VCB-TIE-DH{n} (open, 25/27 sync, tie)
  • F{n}{A,B}-DH (closed, 50/51, PPE2)
  • L1 lines (×4 halls = 36 tagged):
  • dh{n}-rmu-input-{a,b} (entry to RMU panel)
  • dh{n}-rmu-meter-{a,b}-to-vcb (meter to RMU VCB)
  • dh{n}-rmu-vcb-{a,b}-to-bus (RMU bus drop)
  • dh{n}-rmu-bus-tie (purple N.O., redundancy=tie)
  • dh{n}-rmu-bus-{a,b}-drop (RMU bus → TX downstream)
  • L1 breakers (×4 halls = 12 tagged):
  • VCB-RMU-DH{n}-{A,B} (closed, 50/51, IDMT OC)
  • VCB-TIE-RMU-DH{n} (open, 25/27 sync, tie)
  • tools/probe-line-model.mjs — targets bumped:

ADOPTION_TARGETS.datahallAI.html = 112, BREAKER_TARGETS.datahallAI.html = 36.

Docs

  • standarization/LINE_MODEL.md adoption table v1.42.2 row.
  • standarization/BMS_SHELL.md v1.42.x table extended.
  • CHANGELOG.md (this entry) + changelog.html regenerated.
  • Memory tracker project_rz_review_2026-05-26.md updated.
v1.42.1 PATCH

IEC/ANSI breaker symbol library + Electrical SLD overview port

MINOR ship: second in the v1.42.x → v1.45.x sweep. Adds the breaker symbol

library that the review docs flagged as P0 ("Red/green line can be misread as

energized / alarm / source. Breaker state needs SYMBOL, not just color."),

and ports the Electrical SLD overview to use both RZLineModel + new

RZBreakerSymbols.

Engine + #p-dash byte-identical. Probe targets bumped accordingly.

Added

  • js/rz-breaker-symbols.jswindow.RZBreakerSymbols IEC 60617 /

IEEE C37.2 compliant symbol library. 7 STATES with distinct glyphs:

  • closed — vertical mechanical link
  • open — angled arm separated from upper terminal
  • tripped — open arm + red X overlay + pulse animation
  • racked_out — dashed cradle bracket + open arm
  • test — open arm + 'T' badge
  • maintenance — open arm + padlock badge (LOTO)
  • disabled — faint arm + diagonal slash
  • 11 ANSI device function numbers (25/27/50/51/52/67/67N/81/86/87T/87B)
  • 4 NFPA 70E PPE categories (PPE1–PPE4)
  • standarization/BREAKER_SYMBOLS.md — full schema + glyph table +

device-function reference + adoption schedule.

  • Probe extended (tools/probe-line-model.mjs) — verifies breaker

tagging alongside line tagging. Result: 7 pass, 0 fail at v1.42.1

(32 lines + 4 breakers tagged on datahallAI.html).

Changed

  • datahallAI.html Electrical SLD overview (elecOvC IIFE):
  • +25 lines ported to RZLineModel.line():
  • elec-pln-a-to-meter / elec-pln-b-to-meter (MV utility supply)
  • elec-meter-a-to-vcb-inc-a / elec-meter-b-to-vcb-inc-b (revenue meter to incomer)
  • elec-vcb-inc-{a,b}-to-bus-{a,b} (incomer to MV bus, horiz + vert drops)
  • elec-bus-a-drop-vert / elec-bus-b-drop-vert
  • elec-bus-tie (bus tie N.O., redundancy=tie)
  • 8 feeder loop × 2 segments = 16 feeders (elec-feeder-{a,b}{1-4}-drop / -exit)
  • 4 breakers ported to RZBreakerSymbols.render() (pilot):
  • VCB-INC-A (closed, redundant_a, 50/51/67N, PPE2)
  • VCB-INC-B (closed, redundant_b, 50/51/67N, PPE2)
  • VCB-TIE (open, tie, 25/27 sync-check)
  • F1A (closed, redundant_a, 50/51, PPE2)
  • Visual identical via style.stroke overrides + co-existing with

legacy cbl() / symCB() markers. Engine integrity preserved.

Process

  • Review-doc mandates addressed: doc-27 §3.1 + §5.3, doc-17 §3.2,

doc-28/18 EPMS line callouts. Tracked in

Documents/screenshot bms rz/REVIEW-ANALYSIS-2026-05-26-vs-v141x.md.

  • Memory tracker project_rz_review_2026-05-26.md updated.
  • standarization/BMS_SHELL.md v1.42.x adoption row extended.
  • standarization/LINE_MODEL.md v1.42.1 target ≥32 codified.
v1.42.0 MINOR

semantic line model foundation — review docs 27/28 + 17/18

MINOR ship: opens the v1.42.x → v1.45.x sweep responding to team review docs

27/28 (DC AI) and 17/18 (DC Conv). Foundation library so every pipe / busbar

/ cable in the BMS cockpit can carry structured metadata (from, to,

medium, direction, state, capacity, current, redundancy).

Engine files (js/datahall-model.js, js/datahall-calculations.js,

js/conv-engine.js) byte-identical. #p-dash panel byte-identical. 75/75

accuracy probe + 57/57 + 22/22 engine tests + all 4 strict audits PASS.

Added

  • js/rz-line-model.js — semantic line model library. IIFE ES5, exposes

window.RZLineModel with:

  • MEDIUMS (23 entries): CHWS / CHWR / TCS supply+return / CW supply+return

/ FWS / FWR / dry-loop / liquid-supply+return / HV/MV/LV power / busway

/ UPS feed / signal / fiber / copper / fire / leak / drain / fuel.

  • STATES (7 entries): energized / de-energized / standby / fault /

isolated / maintenance / simulated. Each maps to opacity + pulse.

  • REDUNDANCY (8 roles): duty / standby / redundant_a / redundant_b /

bypass / tie / maintenance / common.

  • line(spec) / path(spec) / polyline(spec) builders — emit SVG with

both visual rendering AND data-* metadata baked in.

  • audit(rootEl) — walks DOM, returns {tagged, untagged, total, issues}.
  • tools/probe-line-model.mjs — headless puppeteer probe. Verifies

per-page adoption schedule (v1.42.0 target: 7 lines in datahallAI Cooling

P&ID) + every tagged line has the required schema fields + all mediums /

states reference the canonical enum. Result: 4 pass, 0 fail.

  • standarization/LINE_MODEL.md — new standard. Schema table, mediums

table, states table, redundancy table, builder API, validator usage, per-

ship adoption schedule v1.42.0 → v1.45.x.

Changed

  • datahallAI.html Cooling P&ID — 7 PILOT lines ported to RZLineModel.line():

1. cool-cw-dc-to-pump — CW supply, DC array → CW pump station.

2. cool-cw-pump-to-chiller — CW supply, pump → chiller plant.

3. cool-fws-chiller-to-cdu — FWS supply, chiller → CDU array.

4. cool-tcs-cdu-to-racks — TCS supply, CDU → rack manifold.

5. cool-tcs-return — TCS return, racks → CDU.

6. cool-fws-return — FWR, CDU → chiller.

7. cool-cw-return — CW return, chiller → DC array.

Visual identical (style overrides preserve existing palette + class="fR"

/ class="fL" animation hooks). Engine integrity preserved.

Process

  • Review-doc mandates addressed: doc-27 §3.1 line metadata requirement,

doc-28 per-screenshot line semantics. Full gap analysis at

Documents/screenshot bms rz/REVIEW-ANALYSIS-2026-05-26-vs-v141x.md.

  • Memory tracker: project_rz_review_2026-05-26.md + MEMORY.md pointer.
  • BMS_SHELL.md adoption row appended.
  • Per CONTENT_LINKAGE_PLAYBOOK.md: handoff to memory + standarization +

CHANGELOG (this entry) + Standards-Hub (next-pass note).

v1.41.6 PATCH

ict.html — Security HMI widgets + CCTV/ACS/intrusion expansion

MINOR ship: closes owner request "GUI tampilan2 HMI dga block/chart atau widget

dll kok tidak ada... dan di security systemnya juga tidak lengkap mana monitoring

semua cctv, aacs dll. sempurnakan".

Added

  • Security HMI widget panel on Security Systems tab. Three-tile grid

(1.4fr / 1fr / 1fr) with:

  • CCTV Live Mosaic — 16-cell scan-line/gradient TV preview grid with

blinking rec dot per cell, camera ID + zone label, status colour ring

(ok / warn / bad). Plus 24-hour camera availability sparkline (SVG

polyline, green fill); 3-stat row (Cams Online / Uptime 24 h / VMS

Storage).

  • Access Control Doors — scrollable list (max 240 px) of 12

representative doors (4 mantraps / DH-1..4 / NOC / MMR / Chiller /

Generator / Fuel Farm). Each row: door tag, 24-hour event count, status

pill (LOCKED green / UNLOCKED amber with left-border accent).

  • Intrusion Zones — SVG donut (armed-green / disarmed-grey arcs) over

central numeric armed/total count; "No alarms" or "⚠ N alarm" subline.

Plus scrollable 10-zone list with PIR detector tag, zone name, status

pill (ARMED / DISARM / ALARM). Donut math: 2πR=201, dasharray split

by pctArmed and pctDisarmed with proper offset rotation.

  • Security segment data expanded (SEGMENTS.sec):
  • Services: 4 → 8 entries (NVR-01 + NVR-02 separate, Access Control

with door count, Intrusion + zone count, Fence-line PIR, VMS

Recording, SOC link, Mass Notification).

  • Caps: 4 → 8 cards (cameras 96, doors 48, zones 24, trunk cap 10 Gbps,

trunk util 34 %, retention 14 d, NVR storage 192 TB, stream uptime

99.96 %).

  • Links: 3 → 9 entries (NVR-01/02 separate, ACS-01/02 separate, IDS-01,

PIR-Fence, SEC-A/B failover, SOC link, Mass-Notif PA/strobe trigger).

  • New hmi block with cctv[16] + doors[12] + intrusion[10]

structured data feeding the widgets.

CSS

  • .hmi-grid 3-column responsive (single-col under 1024 px), .hmi-tile,

.cctv-grid 4×4 with aspect-ratio: 16/9, .cctv-cell with scan-line

gradient + rec-dot pulse animation, .door-list/.zone-list with

scrollable max-height, status pills (.dr-st.locked/.unlocked, .zr-st

.armed/.disarmed/.alarm), .hmi-donut SVG holder, .hmi-spark

sparkline, .hmi-row-stats 3-cell bottom strip.

Engines locked

  • js/datahall-model.js + js/datahall-calculations.js + js/conv-engine.js

byte-identical. 57/57 + 22/22 tests pass.

Changed

  • js/rz-version.js → v1.41.6.
  • sw.js cache version → rz-cache-v1.41.6.

Files touched

  • ict.html — Security HMI CSS block; SEGMENTS.sec data expansion; new

renderSecurityHmi(hmi) function; renderSegment wiring (`if key==='sec'

&& seg.hmi`).

v1.41.5 PATCH

water-system.html — UV-401 / DOS-302 label overlap + TK-402 dual-pipe + CT-MK rename

PATCH ship: closes three water-system.html owner complaints in one pass.

Fixed

  • UV-401 / DOS-302 label overlap (owner: "ini uv ster dan DOS itu masih

saling tumpang tindi"). UV-401 rect previously sat at x=660-760 directly

over DOS-302's right edge (x=630-690), so the UV-401 tag at (666, 97) fell

inside DOS-302's box. UV-401 rect relocated to x=700-760 (width reduced

100→60), tag x=706, labels tightened to fit the narrower box. DOS-302 stays

where it is; the two boxes no longer overlap horizontally.

  • TK-402 dual-pipe routing (owner: "ini juga kok ada 2 piping masuk ke

TK-402"). Original treated header → TK-402 path used a Z-shape

(M850 210 H760 V250) which visually appeared as two separate pipes

entering the tank top. Replaced with a straight drop

(M850 210 V250) so a single clean pipe enters the tank from the tee.

Animated flow path (#f-dom) updated to match.

  • CT-MK rename to MK-501 Make-up Water System (owner: "DAN DI CT-MK,

KAN TIDAK ADA PAKAI COOLING TOWER. cukup tuliskan aja make up water

system"). The DC AI baseline is dry-only (BASELINE-DECISION.md, no

evaporative cooling tower); the CT-MK / "Cooling Tower" label was

inconsistent with that design.

  • Tag: CT-MKMK-501.
  • Labels: Cooling Tower + MakeupMake-up Water + System.
  • Comment "Cooling tower blowdown -> drain" → "Make-up system blowdown

/ discharge -> drain".

Engines locked

  • js/datahall-model.js + js/datahall-calculations.js + js/conv-engine.js

byte-identical. 57/57 + 22/22 tests pass.

Changed

  • js/rz-version.js → v1.41.5.
  • sw.js cache version → rz-cache-v1.41.5.

Files touched

  • water-system.html — UV-401 rect + label coords; treated header pipe

routing (.pipe + .flow); makeup section tag + labels + comment.

v1.41.4 PATCH

datahall.html — CRAH popover + inline labels + cold-aisle normalisation + excursion simulator

MINOR ship: datahall.html mega-bundle closing 5 owner requests in one pass.

Fixed / Added

  • CRAH popover replaces full-screen modal (owner: "ini mdal a01 jangan

mendisable main screen, tapi dibaut semacam tootip gitu"). Old behaviour:

click CRAH cell → opens unitModal with .modal-overlay covering entire

screen + blur backdrop. New behaviour: click CRAH cell → opens floating

.crah-pop positioned next to the clicked cell. Main screen stays fully

interactive. Click outside or press Esc to close.

  • New .crah-pop CSS: position:absolute, min-width 240, max-width 280,

fade-in 160 ms, RUN/STBY state pill in cyan/amber.

  • Grid: 8 rows × 2 cols (status / SAT / RAT / fan / valve / duty / CHWS-R /

redundancy / source).

  • Outside-click + Esc handlers wired.
  • Legacy unitModal kept for any non-CRAH inspector use.
  • Inline SAT values on CRAH cells (owner: "enahce ui dan kasih SAT value

di A01 dstnya"). Each CRAH cell now shows tag + SAT (17.0°C / OFF)

inline; previously the SAT was only visible in tooltip.

  • Per-cell rack labels (ID + per-mode value) (owner: "tetap di kotak2

itu kasih ID rack based on row dan ada temp per masing kotakan saat menu

temperature dll. dan saat power juga ada kw nya ganti").

Each rack cell now renders two-line content:

  • Line 1 (.rk-id, 7.5px bold): rack tag without prefix (e.g. AL01).
  • Line 2 (.rk-val, 7.5px regular): per-mode value
  • Power mode: 8.4 kW
  • Temperature mode: 22.0°C
  • Cooling-margin mode: 5.0°C (margin to ASHRAE 27 °C)
  • Alarms mode: 78% (rack utilisation)
  • Space mode: IT / spare

repaintRacks() rewrites innerHTML per mode change.

  • Cold-aisle normalisation to ~22°C uniform (owner: "temp aisle rack kok

beda2 harusnya hampir sama, for sake of standard and normal operation").

Previous behaviour: each zone's coldAisleC was derived from

SUPPLY_C + zHeat / (rho*cp*airflow) which yielded different values per

zone based on rack-loading variance. New behaviour: normal state is

pinned to 22.0 ± 0.3 °C across all rows (deterministic seed per row), so

the page baseline matches ASHRAE A1 recommended low. Each zone retains

the original physics-derived value as baseTempC for restore-after-

excursion. Hot-spot indicator now genuinely indicates anomalies, not

load skew.

  • Excursion simulator (owner: "klw mau dibuat simulasi awalnya normal

mungkn dibuat aja salah satu rack atau row sebentar aja 10-15 detik per

2 menit, random position, pastikan align dengan parameter DAHU (A01-A20,

random)"). Every 2 min (first event 30 s after load), the simulator

picks a random zone z ∈ {0..9} + random CRAH n ∈ {1..20} and sets that

zone's coldAisleC to a value 27.5-30.0 °C for 10-15 s. During the

excursion:

  • Zone's racks pulse red (animation rk-pulse).
  • Affected CRAH cell gets red outline ring (.cc-affected).
  • Red banner appears top-centre with zone / CRAH / temp / countdown.
  • Event logged with warn severity in the SCADA log.

After expiry: zone returns to baseTempC, banner hides, CRAH ring

clears, recovery logged.

Engines locked

  • js/datahall-model.js + js/datahall-calculations.js + js/conv-engine.js

byte-identical. 57/57 + 22/22 tests pass.

Changed

  • js/rz-version.js → v1.41.4.
  • sw.js cache version → rz-cache-v1.41.4.

Files touched

  • datahall.html — new CSS rules (.rack inline content + .crah-pop + .crah-cell

.cc-sat + .excursion-banner + animations); new DOM (popover + banner);

rewritten __inspectCrah + outside-click/Esc handlers; new dhRand +

fireExcursion simulator; updated repaintRacks, renderFloor rail(),

zone-build with baseTempC + excursionUntil fields.

v1.41.3 PATCH

Building Overview chiller relocation + Cooling P&ID label clarity

PATCH ship: closes two owner architectural-correctness complaints.

Fixed

  • Building Overview — chillers relocated from Roof to Ground Floor (owner:

"ok chillernya berarti bukan di roof donk? di roof itu harusnya Dry cooler donk?").

Water-cooled centrifugal chillers belong on a Mechanical floor, NOT on the

roof — only heat-rejection equipment (dry coolers exposed to ambient) lives

on the roof in this hybrid design.

  • floors[] array entries updated:
  • GF: 'MEP · Infrastructure · Support''MEP · Chillers · Generators · WTP'
  • Roof: 'Mechanical · Chillers · AHU''Heat Rejection · Dry Coolers · AHU'
  • floorNames map updated (overview titles + drill-down labels).
  • Roof plan (renderRoof) title: "ROOF PLAN — MECHANICAL EQUIPMENT" →

"ROOF PLAN — HEAT REJECTION & DRY COOLERS" plus sub-title clarifying chiller

location.

  • NW quadrant of roof plan: "CHILLER PLANT" (8× CH cells) replaced with

"CW DISTRIBUTION MANIFOLD" (8 supply + 8 return DN500 risers from chillers

below, cross-headers, amber engineering callout).

  • Roof equipment schedule: "Chillers 8×4MW" entry replaced with "CW Risers

8 pairs DN500".

  • Roof dimension annotation: "28m (Chiller Plant)" → "28m (CW Manifold)".
  • Ground Floor plan (renderGroundFloor) title: "GROUND FLOOR PLAN — MEP &

INFRASTRUCTURE" → "GROUND FLOOR PLAN — MEP, CHILLER PLANT & INFRASTRUCTURE".

  • Ground Floor "Workshop B / Staging" zone (42-66 × 26-36 = 24m × 10m)

replaced with Chiller Plant Hall containing 8× Carrier 19XR 4MW

water-cooled centrifugal chillers (7 RUN + 1 STBY N+1, COP 6.8, R-1234ze(E),

mag-bearing oil-free). CW supply/return riser callout pointing up to Roof

dry-cooler array.

  • Cooling P&ID — label overlap + clarity (owner: "4.3 bar masing kotakan

tumpang tindih dengan block2 lain, atau temp 35.2°C itu temp apa. nggak jelas,

dan return temp itu tertutuk dash line kuning, dan parameter2 lain 3.4 f dan p

itu coba review lagi").

  • Floating temp badges now prefixed with named context — "FWS-Ret 22.0°C",

"TCS-Ret 45.0°C", "CW-Mid 35.2°C" — so each badge explicitly says what

return circuit it represents. Badge widths increased from 30 to 42-50 px to

accommodate the prefix.

  • CW pump-station discharge pressure + flow labels moved from y=170-180

overlap zone down to y=193-203 (separate row, off the pump-box outline).

  • CW discharge to chillers label "4.5 bar" → "CW@4.5 bar" with positions

spread (y=84 above pipe, y=105 below pipe).

  • FWS pump-station discharge flow + pressure labels moved from y=178-188

down to y=195-205 (clear of pump-box).

  • FWS to CDUs label "6 bar" → "FWS@6 bar" with explicit prefix.

Changed

  • js/rz-version.js → v1.41.3.
  • sw.js cache version → rz-cache-v1.41.3.

Engines locked

  • js/datahall-model.js + js/datahall-calculations.js + js/conv-engine.js

byte-identical. 57/57 + 22/22 tests pass.

Files touched

  • datahallAI.html — floors array, floorNames map, renderRoof (NW quadrant +

title + schedule + dimension), renderGroundFloor (title + Workshop B → Chiller

Plant Hall), cooling P&ID (temp badges + pump-station labels).

  • js/rz-version.js — version bump.
  • sw.js — cache name bump.
  • CHANGELOG.md — this entry.
v1.41.2 PATCH

Water-quality Tech Spec sections — DC AI dry-only + DC Conv cooling-tower

PATCH ship: closes owner request "kualitas air masing-masing di dc ai dan dc conventional itu juga masukkan ya full standard parameter dan chemical dan consumption di tech spec."

Added

  • DC AI Tech Spec (datahallAI.html) — 7 new sections appended to Section 5

Cooling Discipline (after 5.10 Cooling Tower / Condenser Water Sizing):

  • 5.11 Make-up Water Quality — 13 inlet quality parameters vs WHO

drinking-water guidelines (pH, TDS, hardness, chloride, sulphate, iron,

manganese, turbidity, coliform, Legionella, FCl, inlet filtration spec).

  • 5.12 Closed-Loop Condenser Water Chemistry — 50 % USP propylene-glycol

dry-cooler loop (12 parameters: pH, reserve alkalinity, freeze protection,

specific gravity, nitrite, azole, Fe, Cu, glycol degradation, top-up rate,

refresh cadence).

  • 5.13 TCS / DLC Water Quality — Deionised water spec per ASTM Type II + OCP
  • NVIDIA GB200 reference (14 parameters: conductivity < 5 µS/cm, pH 7-9,

TOC < 50 ppb, silica < 0.1 mg/L, < 0.1 µm filtration, ORP > +200 mV,

DO < 100 ppb, HPC < 100 cfu/mL, quarterly polish bed replacement).

  • 5.14 Chemical Dosing Programme — 11-row table per CTI WTP-148 + ASHRAE

12-2020 + Nalco/ChemTreat.

  • 5.15 Water Testing Programme — 6-row tiered cadence (daily / weekly /

monthly / quarterly Legionella+ATP+coupons / annual audit / online continuous).

  • 5.16 Annual Consumption + Discharge Budget — 12-row facility-level annual

budget. PG top-up ~1,600 L/yr, TCS DI top-up ~30 L/yr, domestic ~4,200 m³/yr,

zero blowdown (closed loop), STP reuse-irrigation ~3,800 m³/yr, WUE

cooling-only = 0.00 (BASELINE-DECISION dry-only), annual water saved vs cooling-

tower design ~21,400 m³/yr.

  • 5.17 Standards + References — 8-entry list (ASHRAE 12-2020, CTI WTP-148,

BS 8580-1, WHO 4th, ASTM D1193-06, OCP, EU 2020/2184, Pergub 122/2005).

  • DC Conv Tech Spec (dc-conventional.html) — 9 new sections appended to Section 5

Water Discipline (after 5.4 Annualised water consumption):

  • 5.5 Make-up Water Quality — same inlet matrix as DC AI plus chloride

limit < 150 mg/L in tower + silica < 50.

  • 5.6 Cooling-Tower Loop Chemistry — 17-row evaporative-loop chemistry: pH

8.0-9.0, CoC 4-6, basin conductivity 1,200-1,800 µS/cm, LSI, RSI, FCl

0.2-0.5, ORP +650-750, side-stream filter 5 % recirc.

  • 5.7 Cooling-Tower Mass Balance — Make-up = Evaporation + Drift + Blowdown

derivation; engine-bound to live waterFlowLpm from CONV_CALC.snapshot.

  • 5.8 Closed-Loop CHW Chemistry — CHW no-glycol loop, nitrite 500-1,000

ppm, azole 50-100 ppm.

  • 5.9 Chemical Dosing Programme — 11-row open-tower dosing schedule. Total

~1,820 kg/yr (dominated by 720 kg/yr NaOCl + 280 kg/yr corrosion inhibitor +

220 kg/yr scale inhibitor).

  • 5.10 Water Testing Programme — 7-row tiered cadence with **mandatory

quarterly Legionella PCR + culture** per ASHRAE 12-2020.

  • 5.11 Annual Consumption + Discharge Budget — 11-row engine-bound budget.

WUE cooling-only from MODEL.environment.wue_l_per_kwh.

  • 5.12 Effluent Discharge Compliance — 12-row Pergub 122/2005 + Permen LHK

68/2016 effluent quality matrix. Quarterly KLHK reporting.

  • 5.13 Standards + References — 8-entry list (ASHRAE 12-2020, CTI WTP-148,

CTI STD-201, BS 8580-1, WHO 4th, Pergub 122/2005, Permen LHK 68/2016, SNI

6989.59:2008).

Engine binding

  • DC Conv 5.7 + 5.11 + 5.12 derive from CONV_CALC.snapshot (waterFlowLpm,

wue, itKw). PDF reflects live scenario state.

  • DC AI 5.11-5.17 reference design-locked dry-only basis (BASELINE-DECISION.md).

Engines locked

  • js/datahall-model.js + js/datahall-calculations.js + js/conv-engine.js

byte-identical. Tech Spec PDF is presentation-only; no engine drift.

Changed

  • js/rz-version.js → v1.41.2 (date 2026-05-24).
v1.40.1 PATCH

OG images for 27 Network Hub pages + login form wrap + Spares draft refresh

PATCH ship: closes 3 deferred items from v1.40.0 + Network Hub backlog.

Added

  • 27 OG images at assets/og/network-*.webp (1200×630 WebP).

Hub landing + compare scaffold + 25 per-topic cards.

tools/build-og-images.py TARGETS list extended with 27 entries; accent

locked to instrument-cyan #00DDFF per Knowledge Labs section.

  • Spares Readiness x-post-2.md.
  • Spares Readiness LinkedIn draft refreshed to reflect v1.16 engine

(was written at v1.11; engine grew from single calculator to 25-tab

operating engine).

Changed

  • auth.js — login inputs wrapped in <form> with onsubmit

preventDefault → doLogin(). Enter key now submits; autocomplete +

required attrs work; for on labels; submit button is type="submit";

aria-hidden on decorative modal shield icon. Site-wide fix.

  • js/rz-version.js → v1.40.1
  • sw.jsrz-cache-v1.40.1

Deferred (future sessions)

  • Network Hub tempo system (25 topic-module refactor)
  • Live screen-reader walkthrough
  • MTBF / numeric-field normalisation
  • Mobile nav drawer tuning
v1.40.0 MINOR

AI Maintenance — Tier-1+Tier-2 review fixes: CSV provenance + advisory-only + concept-banner + roadmap split

MINOR ship: post-production-review on ai-engineering-maintenance.html.

Reviewer's 2026-05-24 finding split into 3 tiers; **Tier 1 + Tier 2 fixed

here; Tier 3 captured as future-work roadmap** (see docs/plans/).

Reviewer's Addendum A "Industrial Build Blueprint" (11 production screens

  • multi-tenant RBAC + edge gateways + CMMS connectors + IEC/ISO compliance)

is explicitly out of scope for this portfolio site and tracked at

docs/plans/2026-05-25-ai-maintenance-product-roadmap.md as a separate

multi-year initiative. The concept page is now honestly labeled and

correctly links there.

Tier 1 — Real bugs / content lies fixed

  • docs/research/csv/*.csvall 8 CSVs gained confidence_tier,

source_ref, effective_date, last_verified_by, license_class

columns per KNOWLEDGE_BASE_STANDARD.md. Page previously claimed

"Every fault row carries a confidence_tier column" but the CSVs

didn't have it — that's now true. Tiers auto-inferred from

existing source strings using the standards-body / industry-press /

vendor mapping:

  • high (43.8%): IEEE, IEC, ISO, ASHRAE, CIGRE, NETA, NFPA, NPRD-2016,

OREDA, IEEE 493, CIGRE TB-* etc.

  • medium (5.8%): Hydraulic Institute, CTI, OCP, EPA/OSHA standards,

journal articles, vendor application notes

  • thin (50.4%): single-vendor / manufacturer / OEM / unattributed
  • failures.csv + steps.csv — added source column (previously

absent); inherit from parent fault / action.

  • Referential integrity fix: 3 step rows referenced action

A-14.1-P-1 which didn't exist in actions.csv (only A-14.1-P did).

Re-pointed to A-14.1-P. **0 orphan FKs across all 826 data rows

post-transform** (verified via cross-CSV grep).

  • Row count corrected: page claimed "834 KG-ready rows"; actual data

rows = 826 (834 = lines including 8 headers). Page now says

826 KG-ready data rows across 8 CSV seed files (834 lines incl. headers).

  • "Auto-action allowed" wording removed — was unsafe industrial

framing. Now reads: *"Eligible for draft work-order generation; human

approval required before any operational action. AI is advisory only;

physical control remains in SIS / protection relays / BMS engineered

sequences."* IEC 61508 alignment.

  • Concept-page banner at top of hero: explicit "this is a concept-

and-design document, not a production product" framing, with link to

the product roadmap doc.

  • Knowledge Base section added to sticky section-nav (was orphaned).
  • 27 Font Awesome decorative icons got aria-hidden="true".
  • .rz-demo-hint hidden on this Pro-only page (page-scoped CSS) so

the demo credential isn't advertised when page-access: { demo: false }.

Tier 2 — Honesty + provenance work

  • All CSVs now machine-checkable for confidence-tier discipline.
  • Provenance fields (source_ref, effective_date, last_verified_by,

license_class) enable downstream KG ingestion governance.

  • Concept page now distinguishes RPN as "ranking only" from

probability-equivalent loss math (the production roadmap doc lays out

Weibull / calibrated probability / expected-loss for future work).

  • Each confidence tier's engine treatment now describes who approves

(human / reliability engineer / vendor outreach), not "auto-action".

Added

  • docs/plans/2026-05-25-ai-maintenance-product-roadmap.md

faithful capture of the reviewer's 3,092-line industrial-product

blueprint as future-work roadmap. 13 sections: north star, RBAC,

11-screen product surface, cloud/edge architecture, calculation

engine, knowledge governance, safety + cybersecurity (IEC 61508 /

62443 / ISA-95), build phases A–H, vertical-slice pilot, standards

anchor (cite-don't-claim-compliance), explicit out-of-scope-for-RZ

carve-out, production acceptance bar (20 items), acknowledgements.

  • Memory: feedback_concept_vs_product_scope.md — codifies the

"don't conflate concept-page critique with production-app critique"

rule so future reviewers proposing similar scope-creep can be politely

refused with reference to this pattern.

What was REFUSED (and why)

The 2026-05-24 review proposed building:

  • 11 production screens (Command Center, Triage Queue, Diagnostic Case

Detail, Planner Board, Technician Mobile Workbench, etc.)

  • 20+ microservices (Auth/Tenant, Asset Registry, Sensor Ingest, Feature

Extraction, Model Inference, Calibration, Anomaly, RUL, KG, Advisor,

Recommendation, CMMS, Spares, WO, Review, Audit, Model Registry, KG

Release Registry, Edge Sync, Notification, Reporting)

  • Multi-tenant industrial SaaS with 9-role enterprise RBAC
  • Edge gateways with signed OTA + OPC UA / BACnet/SC integration
  • Compliance audits against IEC 60812 / 61508 / 62443, ISO 14224 / 55001,

NIST AI RMF / SSDF, ISA-95 / ISA-101

  • React/Vue/Svelte frontend stack adoption

This is enterprise industrial-SaaS scope — multi-year, multi-engineer,

multi-million-dollar. The resistancezero.com portfolio site is a single-

developer zero-build static GitHub Pages deployment. Building these

inside the portfolio site would be scope-explosion of 2–3 orders of

magnitude. The roadmap doc captures all of it as **valid future-product

vision**; it does not become next-week code. See

feedback_concept_vs_product_scope.md memory for the principle.

Status

  • audit-script-tags.py --strict CLEAN (176 files)
  • audit-js-syntax.py --strict CLEAN (106 files)
  • RPN integrity: 109/109 rows match S * O * D (unchanged)
  • Referential integrity: 0 orphan FKs across all 826 rows (was 3)
  • Concept page lies removed; banner honest; roadmap linked

Bumped

  • js/rz-version.js → v1.40.0 (MINOR; concept-page honesty pass)
  • sw.jsrz-cache-v1.40.0

Cross-references

docs/plans/2026-05-25-ai-maintenance-product-roadmap.md ·

standarization/KNOWLEDGE_BASE_STANDARD.md ·

docs/research/2026-05-23-fmeca-kg-worldwide-asset-failure-data.md

v1.38.0 MINOR

Network Hub Phase 2 — Lane B fully complete: +DNP3 +PROFINET +EtherNet/IP +EtherCAT +BACnet MS/TP

MINOR ship: Phase 2 Lane B complete. All 9 Lane B topics live.

Anti-monotony audit ran across 9 topics, 0 findings (max pairwise share = 2).

Added (5 new live topic pages + modules)

  • network/industrial-ot/dnp3.html — IEEE 1815. Distinctive trait:

UNSOLICITED responses (outstation pushes spontaneously, amber-labeled).

4 pitfalls (Class-0/1/2/3 buffer overflow, SBO vs Direct Operate, time

sync drift, SAv5 cert rotation).

  • network/industrial-ot/profinet.html — IEC 61784-2. Sync line above

the data wire shows cyclic deterministic timing; green tick at each cycle

start. 4 pitfalls (RT/TCP jitter, GSDML/firmware mismatch, topology

change, IRT clock master loss).

  • network/industrial-ot/ethernet-ip.html — ODVA CIP over Ethernet.

Sawtooth waveform, envelope chips with rotating CIP-layer marker stripes

(ENIP / CPF / CIP-Conn / CIP-Svc). 4 pitfalls (Class 1 RPI, EDS vs

firmware, timeout multiplier, port 2222 vs 44818).

  • network/industrial-ot/ethercat.html — IEC 61158. Telegram passes

through every slave on-the-fly; nearest slave lights green as the chip

crosses. Slave count + cycle time configurable. 4 pitfalls (slave

processing accumulation, distributed clocks, hot-plug, mailbox bandwidth).

  • network/industrial-ot/bacnet-mstp.html — ASHRAE 135 Annex H.

Token-passing on RS-485: amber token chip visibly passes between nodes

before any data frame. 4 pitfalls (mixed baud rates, token timeout,

Max_Master, reply-too-late re-poll storms).

  • 5 corresponding topic modules in js/network-anim/topics/:

dnp3.js, profinet.js, ethernet-ip.js, ethercat.js, bacnet-mstp.js.

All Strategy-A deterministic frame logic.

Anti-monotony matrix (all 9 Lane B pairs)

PairSharedPairShared
RTU↔TCP0TCP↔OPC-UA1
RTU↔BACnet/IP1TCP↔DNP30
RTU↔OPC-UA1TCP↔PROFINET2
RTU↔DNP32TCP↔Ethernet/IP2
RTU↔PROFINET0TCP↔EtherCAT2
RTU↔Ethernet/IP0TCP↔BACnet MS/TP1
RTU↔EtherCAT0OPC-UA↔DNP32
RTU↔BACnet MS/TP0OPC-UA↔others≤2
TCP↔BACnet/IP1All others≤2

All 36 pairs ≤ 2 shared timbre fields. Audit passes by design.

Changed

  • network-visualization-hub.html — all 9 Lane B cards now show LIVE.

Each card describes the distinctive trait per Appendix E.

  • network-compare.html — picker expanded to 9 protocols; topic

registry + script loads updated. Compare any 2–4 of the full

Lane B set.

  • datacenter-solutions.html — Knowledge Labs card description

updated to mention all 9 live Lane B topics.

  • js/rz-feature-flags.js — 5 new public-tier entries

(network-dnp3, network-profinet, network-ethernet-ip, network-ethercat,

network-bacnet-mstp).

  • sitemap.xml + llms.txt — 5 new entries.
  • js/rz-version.js → v1.38.0 (MINOR; Phase 2 Lane B completion)
  • sw.jsrz-cache-v1.38.0

Status

tools/audit-network-anim.py — CLEAN, 9 topics audited, 0 findings.

tools/audit-script-tags.py --strict — CLEAN (160 files).

tools/audit-js-syntax.py --strict — CLEAN (106 files).

test-network-anim-determinism.py --static — expected 27/27 PASS

once re-run with the new fixtures.

Phase 2 Lane B distinctive-trait inventory (live now)

TopicTrait visible in animation
Modbus RTURS-485 silent interval + per-role byte freq shift
Modbus TCPMBAP header chip visibly larger than payload chip
BACnet MS/TPAmber token chip passes between nodes before data
BACnet/IPBVLC tunnel = scan-line shroud at packet head
OPC-UAAlways-on encryption shroud + layered binary chips
DNP3UNSOLICITED responses (outstation pushes without poll)
PROFINETSync line above wire + green cycle-start tick
EtherNet/IPCIP-layer marker stripes on chip head (4 colors)
EtherCATTelegram passes through slaves on-the-fly (chip doesn't stop)

9 protocols, 9 distinct visual + audio signatures. Anti-monotony works.

Next phases (Lane B is 100% done — moving to other lanes)

  • Phase 3 Lane A — Foundations (OSI/TCP-IP models, IPv4 vs IPv6, subnetting/CIDR, TCP handshake, DHCP/DNS)
  • Phase 4 Lane D — Security (TLS handshake, OAuth/JWT, mTLS, WireGuard)
  • Phase 5 Lane E — APIs + Agents (REST API, GraphQL, gRPC, MCP tool-call)
  • Phase 6 Lane C — DC Management (SNMP, IPMI/Redfish, syslog)
v1.37.0 MINOR

Network Hub — determinism harness + post-draft folders + CONTENT_LINKAGE §2.5

MINOR ship: completes the v2.3 Phase 0 DoD inner loop. Anti-monotony +

determinism + post-draft + content-linkage all operational.

Added

  • tools/test-network-anim-determinism.py (~210 lines) — Strategy-A

determinism harness with Node + static modes. 12 / 12 PASS across

4 topics.

  • Article/Post Draft/Network Hub/ + 4 topic folders (Modbus RTU /

Modbus TCP / BACnet IP / OPC-UA), each with linkedin + x-post-1 +

mastodon-1. 15 post-draft files total per POST_DRAFT_STANDARD.

  • standarization/CONTENT_LINKAGE_PLAYBOOK.md §2.5 — Knowledge Labs

topic page deliverable checklist.

Status

  • audit-network-anim.py CLEAN (4 topics, 0 findings)
  • test-network-anim-determinism.py --static 12/12 PASS
  • audit-script-tags --strict CLEAN
  • audit-js-syntax --strict CLEAN

Deferred to next session

  • OG images for network pages (tool doesn't scan subdirectories)
  • Live screen-reader walkthrough validation
  • Phase 2 Lane B (DNP3, PROFINET, EtherNet/IP, EtherCAT, BACnet MS/TP)
  • Spares Readiness post-draft refresh

Changed

  • js/rz-version.js → 1.37.0
  • sw.js → rz-cache-v1.37.0
v1.36.0 MINOR

Network Hub — Lane B complete: +BACnet/IP +OPC-UA +Compare scaffold

MINOR ship: Lane B (Industrial OT) Phase 1 complete with 4 live topics

and a functional 4-panel compare scaffold. Audit confirms anti-monotony

across all 4 (max pairwise share = 2 fields).

Added

  • network/industrial-ot/bacnet-ip.html — live Phase-1 topic.

ASHRAE 135 BACnet/IP packet exchange over UDP with BVLC tunnel rendered

as scan-line shroud at packet head. 3 parameter controls (payload bytes

/ UDP RTT / line noise). 4 engineering pitfalls (BBMD foreign-device

registration, port 47808 firewall, instance ID collisions, COV

subscription leaks).

  • network/industrial-ot/opc-ua.html — live Phase-1 topic.

IEC 62541 subscription model: client → server with publishing

interval, monitored items, security mode (none / sign / sign-and-encrypt).

Always-on scan-line shroud when security != none. Tertiary discovery

server node visible. 4 engineering pitfalls (cert trust list,

publish/sample interval mismatch, queue overflow, endpoint discovery).

  • network-compare.html — 4-panel side-by-side compare scaffold.

Topic picker (any 2–4 of the 4 live protocols). Per-panel

instrument chip strip (throughput / latency / overhead / status)

reading from getNormalized() per Appendix B. URL deep-link

(?topics=modbus-rtu,modbus-tcp,bacnet-ip,opc-ua). Audio muted

default across all panels (compare-mode convention per §7).

  • js/network-anim/topics/bacnet-ip.js (~225 lines) — distinct

timbre per Appendix E row 4: triangle 950 Hz, hex 8×8,

ethernet 1.0 px, controller-square master, 1.2× medium

tempo. Shares with RTU: 1 (tempo). Shares with TCP: 1 (wire).

  • js/network-anim/topics/opc-ua.js (~260 lines) — distinct

timbre per Appendix E row 5: sine-sweep 1400→1700 Hz,

layered 10×8, ethernet 1.0 px, broker-diamond master,

1.2× medium tempo, progressive encryption. Shares with

RTU: 1 (tempo). Shares with TCP: 1 (wire). Shares with BACnet/IP: 2

(wire + tempo).

  • js/rz-feature-flags.js — 4 new public-tier entries

(network-bacnet-ip, network-opc-ua, network-compare, plus prior

network-modbus-tcp).

  • sitemap.xml + llms.txt — 4 new entries.

Changed

  • network-visualization-hub.html — BACnet/IP + OPC-UA cards now

show LIVE status; compare-mode CTA upgraded from placeholder to

functional link.

Anti-monotony evidence (4 topics, pairwise within Lane B)

PairShared fields
RTU vs TCP0
RTU vs BACnet/IP1 (tempo medium)
RTU vs OPC-UA1 (tempo medium)
TCP vs BACnet/IP1 (wire ethernet)
TCP vs OPC-UA1 (wire ethernet)
BACnet/IP vs OPC-UA2 (wire ethernet + tempo medium)

All pairs ≤2 shared. Anti-monotony cap holds. Each protocol has its

own audio signature and visual chip vocabulary.

Status

tools/audit-network-anim.py — CLEAN, 4 topics audited, 0 findings.

tools/audit-script-tags.py --strict — CLEAN (155 files).

tools/audit-js-syntax.py --strict — CLEAN (106 files).

Versioning note

v1.35.0 = Modbus TCP + hub landing

v1.35.1 = parallel session's cross-page headline consistency probe

v1.36.0 (this ship) = Lane B complete + compare scaffold

Next

  • Determinism test harness (test-network-anim-determinism.py)
  • OG images for the 4 live topics + hub + compare pages
  • Post-draft folders per POST_DRAFT_STANDARD
  • Phase 2: DNP3, PROFINET, EtherNet/IP, EtherCAT (5 more Lane B topics)

Changed

  • js/rz-version.js — v1.36.0 (MINOR; Lane B completion)
  • sw.js — cache rz-cache-v1.36.0
v1.35.0 MINOR

Network Hub — Modbus TCP topic + hub landing page; anti-monotony gate proven at scale

MINOR ship: second live topic + landing page. The anti-monotony audit now

runs across 2 Lane B topics (Modbus RTU + Modbus TCP) and passes — 0

shared timbre fields. Hub landing organises all 25 topics across 5 lanes

with status badges (LIVE / PHASE 1 / PHASE 2-6).

Added

  • network/industrial-ot/modbus-tcp.html — live Phase-1 topic page.
  • MBAP-header byte exchange over Ethernet
  • 4 parameter controls (link speed select + TCP RTT + payload + line noise)
  • Distinctive trait: MBAP header chip rendered at 16×8 vs payload chip at 12×6 (overhead made visible)
  • 4 engineering-pitfall accordions (transaction ID reuse, port 502 firewall, keepalive mismatch, unit ID gateway routing)
  • 4 primary citations (Modbus Org TCP/IP Implementation Guide V1.0b, RFC 793, IANA, Net+ N10-009)
  • js/network-anim/topics/modbus-tcp.js (~220 lines) — Strategy-A

deterministic frame logic. Distinctive timbre per Appendix E row 2:

  • waveform: sine (vs RTU's square-sweep)
  • chip: rect 12×6 (vs RTU's square 8×8)
  • wire: ethernet 1.0 px (vs RTU's serial-thin 0.7 px)
  • master: server-rack (vs RTU's plc-rectangle)
  • tempo: 1.5× fast (vs RTU's 1.0× medium)
  • 0 shared fields with Modbus RTU — anti-monotony gate passes by wide margin
  • network-visualization-hub.html — hub landing page covering all

25 topics across 5 lanes (Industrial OT 9 + Foundations 5 + DC Management 3

  • Security 4 + APIs+Agents 4). Status badges per card:

LIVE (Modbus RTU + Modbus TCP) / PHASE 1 (BACnet MS/TP, BACnet/IP,

OPC-UA) / PHASE 2-6 (remaining 18 topics). Compare-mode CTA placeholder

— ships when ≥3 topics live in any lane.

  • js/rz-feature-flags.js — entries for network-visualization-hub
  • network-modbus-tcp (public-tier).
  • sitemap.xml + llms.txt — entries for hub landing +

Modbus TCP topic page.

Changed

  • datacenter-solutions.html Knowledge Labs section — Network Hub

card now links to the hub landing (was: direct to Modbus RTU page).

Description updated to reflect 2 live topics.

Status

tools/audit-network-anim.py — CLEAN, 2 topics audited, 0 findings.

Anti-monotony gate verified at pairwise-within-lane: Modbus RTU vs Modbus

TCP share 0 fields among (waveform, chip shape, wire style, master icon,

tempo-bin). Future Lane B topics must hit the same bar.

tools/audit-script-tags.py --strict — CLEAN (152 files).

tools/audit-js-syntax.py --strict — CLEAN (105 files).

Next Phase 1 work

  • BACnet/IP topic (planned: triangle waveform, hex chip, ethernet wire,

controller-square master, medium tempo, BVLC scan-line shroud trait)

  • OPC-UA topic (planned: sine-sweep waveform, layered chip, ethernet wire,

broker-diamond master, medium tempo, security-shroud progressive)

  • network-compare.html scaffold (unlocks once 3 Lane B topics are live)
  • Determinism test harness
  • OG images at assets/og/network-{hub,modbus-rtu,modbus-tcp}.webp
  • Post-draft folders per POST_DRAFT_STANDARD

Changed

  • js/rz-version.js — v1.35.0 (MINOR; second live Hub topic + landing)
  • sw.js — cache rz-cache-v1.35.0
v1.34.0 MINOR

Network Visualization Hub — first live topic page: Modbus RTU + Knowledge Labs section

MINOR ship: first user-facing page lands on the Network Hub. Modbus RTU

animation is live with deterministic Strategy-A frame logic, parameter

panel (baud / parity / stop bits / function code / payload / line noise),

SFX integration (mute-default), and screen-reader-friendly ARIA live

region announcing protocol phase transitions.

Added

  • network/industrial-ot/modbus-rtu.html — live Phase-0 topic page.
  • 800×320 px Canvas 2D animation showing master→slave request
  • turnaround silent interval + slave→master response + ACK ring
  • 6 parameter controls (baud rate select + parity + stop bits + function

code + payload slider with numeric twin + line noise slider with twin)

  • Mute toggle (audio default off; gesture-gated context unlock on Play)
  • ARIA live region announces phase transitions ("Phase: master

transmitting", "Phase: ACK received") for screen-reader users

  • 4 engineering-pitfall accordions (silent-interval violation,

termination resistors, ground loops, driver fan-out)

  • 4 primary references (Modbus Org spec V1.02, TIA-485-A,

CompTIA Net+ N10-009 §2.1, NEMA ICS 1.1)

  • js/network-anim/renderer.js (290 lines) — Canvas 2D primitives:

drawWire / drawChip (8 shapes) / drawNode (12 icon types) /

drawACKRing (600 ms two-phase + centred ✓) / drawCollisionX /

drawDropArrow / drawScanlineShroud. Pixel-snap mandate enforced:

Math.round(x) + 0.5 on strokes, Math.round(originX) on chip origins.

Every function returns drawCalls so engine can enforce ≤200/frame/panel.

  • js/network-anim/vfx.js (105 lines) — trail FIFO store (cap 2

segments, alpha ramp 0.35 → 0.12), ACK ring lifecycle store (600 ms),

retransmission echo (amber dashed-arrow 0.6 px 50% opacity), compare-mode

degradation guard reading timbre.compareDegrade priority list.

  • datacenter-solutions.html — new **Knowledge Labs —

Standards, Networks, Protocols** section per KNOWLEDGE_LABS_STANDARD.md.

3 cards: Network Visualization Hub (FREE, instrument-cyan accent),

LTC Labs (PRO, oscilloscope-green accent), AI Engineering Maintenance

(PRO, blue-400 accent). NOT a 7th card on Cost Calculators — per

the v2 plan, a new section preserves IA legibility.

  • js/rz-feature-flags.jsnetwork-modbus-rtu page-access

entry: public-tier (free / demo / pro / root all pass).

  • sitemap.xml + llms.txt — entries for the new Modbus

RTU topic page.

Changed

  • js/network-anim/topics/modbus-rtu.js — promoted from Phase 0

stub to live Strategy-A frame logic. decodeFrame(f, baud, payload)

is a pure function returning `{phase, byteIndex, byteProgress, role,

totalFrames}. bytePosition(decoded)` is the rendering input. Master

byte left→right; slave byte right→left; turnaround silent

interval rendered as amber label. ACK ring triggers once per cycle.

Per-role visual companion: slave chips drawn at alpha 0.85

(companion to the audio −200 Hz freq shift).

  • tools/audit-network-anim.py — banned-CSS check now strips both

/* ... */ block comments and // line comments before pattern matching

(prevents false positives on comments that name banned patterns).

  • js/rz-version.js — bumped to v1.34.0 (MINOR; first live Hub page)
  • sw.js — cache name rz-cache-v1.34.0

Status

tools/audit-network-anim.py — CLEAN (1 topic, 0 findings).

tools/audit-script-tags.py --strict — CLEAN (150 files).

tools/audit-js-syntax.py --strict — CLEAN (104 files).

Next Phase 0 work (deferred)

  • network-visualization-hub.html landing page (currently the Knowledge

Labs card links directly to the Modbus RTU topic; landing comes when

Phase 1 ships 3 more topics).

  • network-compare.html scaffold + Appendix-B-driven instrument chip strip.
  • tools/test-network-anim-determinism.pyseek(N)

reset() + seek(N) harness with element-relative tolerance.

  • OG image at assets/og/network-modbus-rtu.webp.
  • Post-draft folder Article/Post Draft/Network Hub/.
  • search-index entry for the Modbus RTU page.
v1.33.0 MINOR

Network Visualization Hub — Phase 0 scaffolding: engine + audit + reference Modbus RTU timbre

MINOR ship: first code lands for the Network Visualization Hub. Per plan

v2.3, the engine + audio + palette + reference topic module + discipline

audit are scaffolded so the anti-monotony gate is operational from line 1.

Added

  • js/network-anim/palette.js (49 lines) — sole color source. 6 tokens

(instrument-cyan, signal-amber, oscilloscope-green, fault-red,

wire-default, canvas-bg). Throws on unknown token. Frozen at module load.

  • js/network-anim/audio.js (155 lines) — Web Audio synth, 8 canonical

events (tick, byte, ack, error, complete, handshake,

streamChunk, tokenIssue). Gesture-gated context. Mute-default.

compose(eventName, timbre, role, state) implements the v2.3 composition

order: defaults < topic timbre < perRole < perState < tempo

(top × state multiplicative). Clamps freq to [400, 3000] Hz, byte

duration to [6, 25] ms, hard cap 250 ms decay on all events.

  • js/network-anim/engine.js (109 lines) — RAF lifecycle + emit

composer. create(topicInstance, opts) returns an engine handle.

emit(eventName, ctx) composes via audio.compose() and dispatches

SFX + optional signal callbacks. Throws if topic instance is missing

timbre (loud-fail at integration time, not user-test time).

  • js/network-anim/topics/modbus-rtu.js (130 lines) — reference topic

module. Full _timbre per Appendix E row 1 (square-sweep 1200→1600 Hz

byte, sensor-circle slave, plc-rectangle master, serial-thin 0.7 px wire,

square 8×8 cyan chip, modem-v21 register, perRole master/slave

±200 Hz, perState error LOCKED to 1.0×). init() returns

contract-shaped instance (play / pause / seek / setParams / getNormalized

/ destroy + timbre). Phase 0 stub for animation logic; full implementation

lands in Phase 1.

  • tools/audit-network-anim.py (491 lines) — discipline gate covering

palette, banned CSS, timbre presence + enums, variation budget bounds,

pairwise-within-lane anti-monotony, perState.error lock. --strict

exits 1 on any HIGH/CRITICAL.

Status

Audit: CLEAN — 1 topic audited (Modbus RTU reference), 0 findings.

File sizes well within budget (engine ~12 KB unminified vs 60 KB minified

cap; per-topic 5.5 KB vs 15 KB cap).

This is the foundation. Subsequent Phase 0 ships add renderer.js + vfx.js,

the network-visualization-hub.html + network-compare.html scaffolds,

Knowledge Labs card on datacenter-solutions.html, sitemap / search-index /

llms.txt / OG entries, and the live Modbus RTU topic page end-to-end.

Changed

  • js/rz-version.js — bumped to v1.33.0 (MINOR; first Hub code)
  • sw.js — cache name rz-cache-v1.33.0

Cross-references

docs/plans/2026-05-24-network-visualization-hub-v2.md §§5.1, 5.2, 5.3,

5.4, 5.6 + Appendix E + §15 Phase 0 DoD ·

standarization/KNOWLEDGE_LABS_STANDARD.md

v1.32.10 PATCH

Network Hub plan v2.3 — anti-monotony timbre layer + v2.2 review fixes

PATCH doc-only ship: plan revision, no site code touched.

Added to docs/plans/2026-05-24-network-visualization-hub-v2.md

  • §5.6 timbre profile (anti-monotony layer) — every topic module returns

timbre on its init() instance. Engine composes canonical event params

in explicit order: defaults < topic timbre < perRole < perState <

tempo; clamps freq to [400, 3000] Hz, duration to [6, 25] ms post-composition.

  • Appendix E — 25-row per-protocol timbre table with distinctive trait,

register character, byte waveform/freq/duration, chip shape, wire style,

node icons, tempo. Anti-monotony rule: ≤2 shared fields with any other

topic in the same lane.

Changed (v2.2 → v2.3 from review cycle)

  • Module contract: timbre exposed on the init() returned instance

(explicit data-flow), NOT via global namespace side-channel.

  • Variation budget tightened: freq floor 400 Hz (was 200), tempo

envelope [0.7×, 1.7×] (was [0.5×, 2.0×]),

scroll chip renamed long-rect.

  • perState.error.tempoMultiplier LOCKED to 1.0× (no slow-on-error

— HMI convention, not stage music).

  • Simultaneous multi-tone banned (only sequential frequency steps allowed;

prevents accidental perfect-interval musicality).

  • 5 new timbre fields added: errorSignature, encryption,

latencyClass, completeFreq, compareDegrade.

  • Pixel-snap mandate extended to chip positions (was strokes only).

Determinism tolerance now element-relative.

  • Flow-stage tint exception formally sanctioned: amber permitted for

transient pre-issuance stages in auth flows (OAuth auth-code chip);

terminal/steady chip returns to cyan.

  • Anti-monotony gate wording corrected: pairwise-within-lane (any pair),

NOT pairwise-against-reference. Tempo binned ("slow" / "medium" / "fast")

for the equality check.

  • 10 Appendix E rows tightened: OPC-UA (drop pulse), EtherNet/IP (marker

stripe not text), EtherCAT (1.7× not 2.0×), SNMP (0.7×),

IPv4-vs-IPv6 (sequential not dual-tone), DHCP-DNS (monotonic ascending),

IPMI-Redfish (sideband-dashed wire not amber chip), OAuth (flow-stage

tint sanctioned), GraphQL (long-rect + 3-chip-shape cap), MCP

(industrial register held — "soft + warm + agentic" removed).

Changed

  • js/rz-version.js — bumped to v1.32.10 (skipped 1.32.8/9 taken

by parallel session's accuracy phase 3 + Puppeteer probes).

  • sw.js — cache name bumped to rz-cache-v1.32.10.

Review verdicts on v2.2 (before v2.3 fixes)

  • code-reviewer: APPROVE_WITH_CHANGES (3 HIGH + 5 MEDIUM) — all

folded into v2.3.

  • uiux-reviewer: APPROVE_WITH_NOTES (4 rows need adjust + 5 missing

timbre fields) — all folded into v2.3.

Status

Plan v2.3 ready for owner sign-off on Q1–Q4. Phase 0 implementation

begins after sign-off + final reviewer pass on the live Modbus RTU

reference page.

v1.32.7 PATCH

Network Visualization Hub plan v2 — reviewer-vetted, ready for Phase 0 sign-off

PATCH doc-only ship: plan rewrite, no site code touched. Builds on the

v1.32.5 doc-propagation pass.

Added

  • docs/plans/2026-05-24-network-visualization-hub-v2.md

full rewrite of the Network Visualization Hub specification.

  • All 1 CRITICAL + 12 HIGH + 11 MEDIUM findings from the v1 review

cycle (code-reviewer + uiux-reviewer) folded in.

  • Module loading: IIFE/namespace pattern (window.RZNetAnim.<topic>)

matching the zero-build site convention; no ES export.

  • Topic count reconciled to 25 (Lane A 5 + B 9 + C 3 + D 4 + E 4)

after splitting REST/GraphQL/gRPC and adding EtherCAT.

  • Audio: 8 canonical events (added handshake, stream-chunk,

token-issue); error = 2 px red bezel flash (not screen shake);

complete = single sine 1.5 kHz 80 ms (not perfect-fifth).

  • VFX: "Byte chip" (renamed from "Byte glow"); packet trail capped at

2 segments with alpha ramp; ACK ring shortened from 1 s to 600 ms.

  • Performance budget restated: engine ≤60 KB total + per-topic

≤15 KB lazy-loaded + drawCalls ≤200 per frame per panel.

  • Determinism rule for seek(frame) with Math.round(x) + 0.5

pixel-snap mandate for stroked paths.

  • Compare-mode cross-protocol semantic mapping (Appendix B) with

display rules for null fields (em-dash, never 0).

  • A11y: 2 px signal-amber focus indicator + 2 px offset; glyph-paired

colours (✓ × ↓ &warning;); ARIA live region on

scrubber announcing semantic phase transitions, not bare frame nums.

  • Knowledge Labs section placement (not 7th Cost Calculator card).
  • Per-phase CONTENT_LINKAGE_PLAYBOOK + sw.js bump in DoD.
  • Multi-agent review re-run on v2: code-reviewer = APPROVE_WITH_CHANGES

(2 new HIGH findings folded in: defer race condition fixed by

end-of-<body> script ordering, topic count reconciled). **uiux-reviewer

= APPROVE** (all 12 v1 findings resolved; 3 LOW recommendations folded

into Phase 0 DoD).

Changed

  • docs/plans/2026-05-23-network-visualization-hub.md — banner

added marking it SUPERSEDED by v2; kept as historical artefact.

  • js/rz-version.js — bumped to v1.32.7 (PATCH; doc-only).
  • sw.js — cache name bumped to rz-cache-v1.32.7.

Status

Plan v2 is ready for owner sign-off on 4 remaining gating questions

(Q1: IIFE pattern · Q2: public tier · Q3: 25-topic split · Q4: Phase 1

seed set). Phase 0 implementation begins after sign-off.

Cross-references

KNOWLEDGE_LABS_STANDARD.md · POST_DRAFT_STANDARD.md ·

KNOWLEDGE_BASE_STANDARD.md · CONTENT_LINKAGE_PLAYBOOK.md

v1.32.5 PATCH

Documentation propagation pass — post-draft folders, knowledge-base standard, AI Maintenance §9 wired with worldwide FMECA dataset

> Note: v1.32.1 through v1.32.4 are reserved for the parallel session's

> accuracy-validation roadmap (DC AI + DC Conv 2026-05-23 review).

> This doc-propagation patch takes v1.32.5 to leave that window intact.

PATCH ship: documentation + content only, no engine math touched. Triggered

by the handoff mandate (locked 2026-05-23) requiring every comment, review

note, and task to be propagated to memory + standarization/ + CHANGELOG

  • handoff docs.

Added

  • standarization/POST_DRAFT_STANDARD.md — codifies the

Article/Post Draft/<slug>/ per-page draft-folder mandate, with

per-platform char limits (LinkedIn 3000 / Mastodon 500 / X 280 /

Facebook 2000 / Medium SEO title 74), required-file matrix by page

type, and voice rules (engineer-to-engineer, no "I'm excited to share").

  • standarization/KNOWLEDGE_BASE_STANDARD.md — codifies the

docs/research/YYYY-MM-DD-<topic>.md + csv/ layout, frontmatter

requirements, CSV schema (UTF-8, snake_case, source_ref,

confidence_tier), refresh cadence, and site-integration checklist.

Reference example: the 2026-05-23 FMECA dataset.

  • standarization/KNOWLEDGE_LABS_STANDARD.md — codifies the NEW

"Knowledge Labs — Standards, Networks, Protocols" section on

datacenter-solutions.html. Replaces the earlier (rejected) plan to

add a 7th card to Cost Calculators, which would have tripped the

6-grid SaaS-pattern anti-pattern (design.md §3 #11).

  • ai-engineering-maintenance.html Section 9 — new "Knowledge

Base — Worldwide FMECA Seed Dataset" section surfacing the

research deliverable: 20 asset families, 109 fault modes, 834

KG-ready rows, 46 primary citations (CIGRE, IEEE 493, ASHRAE TC 9.9,

NFPA, NETA, OREDA 7e, NPRD-2016, FMD-2016). Headline findings

(54% outages power-related, <10s liquid-cooling ride-through,

VRLA Arrhenius, RPN=200 diesel microbial). Confidence-tier

breakdown. CSV inventory table. NEW Gap #13 — Liquid-cooling

fault-mode telemetry below industry benchmark.

  • docs/research/2026-05-23-fmeca-kg-worldwide-asset-failure-data.md

— ~58 KB markdown report from the worldwide research run.

  • docs/research/csv/ — 8 CSV seed files (components 144 rows;

faults 109; failures 109; actions 138; mechanisms 99; effects 42;

steps 76; sod_rpn 109 — 834 KG-ready rows total).

  • docs/handoff/2026-05-23-fmeca-vendor-outreach.md — outreach

playbook for 14 vendors across 4 thin-data gaps (Vertiv, CoolIT,

Asetek, Boyd for liquid cooling; Starline / Schneider / Eaton /

Siemens for busway; Trane / York / Daikin for magnetic-bearing

chillers; Piller / Hitec / Active Power for flywheel UPS).

  • docs/handoff/2026-05-24-doc-propagation-pass.md — full

handoff state for the next session.

  • docs/plans/2026-05-23-network-visualization-hub.md — plan v1

for the upcoming Knowledge Labs / Network Visualization Hub (22 topic

pages, 5 lanes, animation engine using Canvas 2D + Web Audio API).

Multi-agent reviewed by code-reviewer + uiux-reviewer. Verdicts:

REWORK (1 CRITICAL on module-loading pattern) + APPROVE_WITH_NOTES

(7 HIGH design adjustments). Plan v2 rewrite deferred to next session.

  • Article/Post Draft/AI Maintenance/ — 11 draft files

(LinkedIn long-form, Medium long-form, 3 X posts, 3 Mastodon posts,

Facebook conversational, Quora answer, TikTok 60s script).

  • Article/Post Draft/BMS Cockpit/ — 4 draft files covering

the 11-page cockpit cluster.

  • Article/Post Draft/LTC Lab/ — 4 draft files covering

standards-ltc-lab.html + 6 sub-pages.

  • Article/Post Draft/CX Calculator/ — 3 draft files.
  • Article/Post Draft/Pillar Pages/ — 3 draft files for the

5 pillar pages.

Changed

  • js/rz-version.js — bumped to v1.32.5 (PATCH; doc-only).
  • sw.js — cache name bumped to rz-cache-v1.32.5 so the prior

cache invalidates and users pick up the new Section 9.

Discipline mandates codified in this ship

  • Post-draft folder discipline: every public HTML page that ships

MUST have an Article/Post Draft/<slug>/ folder in the same commit

or session.

  • Knowledge-base layout: research deliverables follow

docs/research/YYYY-MM-DD-<topic>.md + csv/ layout with frontmatter

  • confidence tiers + citation discipline.
  • Knowledge Labs section IA: NOT a 7th card on Cost Calculators;

a new section above Simulations.

Not in this ship (deferred)

  • Network Hub plan v2 rewrite (incorporating CRITICAL + HIGH review findings).
  • Spares Readiness Calculator/ draft refresh (engine evolved v1.11→v1.16; existing drafts stale).
  • Articles 23–27 draft-folder content sweep.
  • CONTENT_LINKAGE_PLAYBOOK.md update to include the post-draft step.
v1.41.1 PATCH

STP modal full expansion + MMR room added

Ship 2 of 7 in v1.41.x batch.

STP modal expansion (datahallAI.html renderStpHmi)

Owner asked for full drainage → sump → bio-septic → treatment train →

reuse-to-irrigation visualisation. Existing modal had only equalisation/

aeration/clarifier/chlorination. Expanded modal viewBox 780×480 → 980×620

to fit the full flow.

Added stages:

  • Drainage sources (Row B): 5-tile stack — WC drains, kitchen, CRAH

condensate, floor drains, leak-detection trip drain — converging

to sump pit

  • Sump pit + duplex submersible pumps (N+1, VFD 3 kW) lifting to

bio-septic

  • Bio-septic tank (anaerobic primary, 25 m³, 3-chamber baffled,

HRT 8-12 h, BOD removal ~30 %)

  • Sand filter (tertiary suspended-solids polish, backwash trigger

at 0.8 bar)

  • Activated carbon filter (residual organics, TOC < 1 mg/L, GAC

replace every 6 months)

  • UV disinfection (2× lamps N+1, UVT > 70 %, log-4 pathogen kill,

lamp replace 9,000 h)

  • Reclaim tank (20 m³ buffer, 2-3 d hold, NaOCl residual 0.5 mg/L)
  • Irrigation distribution (drip + spray, ~50 m³/day, landscape

1,500 m²)

  • Sludge handling sub-branch (drying bed → ~0.5 m³/week → hauled

to municipal)

  • Reuse rate tile: ~18,000 m³/yr reused, ~0.18 ML/yr water saved
  • Compliance tile: Jakarta Pergub 69/2013 + Permen LHK 68/2016 +

WHO Guidelines for Safe Use of Wastewater (irrigation grade)

  • Operational tile: SBR cycle (Fill 1h · React 4h · Settle 1h ·

Decant 2h), PLC Schneider M340 via Modbus TCP, daily/weekly/monthly

test cadence

MMR Room added (datahallAI.html Room Layout SVG)

Owner: "di room layout tidak ada ruangan MMR". Added new MMR /

TELECOM zone replacing one redundant WORKSHOP/STORAGE label.

Added MMR equipment sub-blocks:

  • TM (Telkom carrier termination)
  • ISAT (Indosat carrier termination)
  • XL (XL Axiata carrier termination)
  • LINKNET (Linknet carrier termination)
  • FDF (Fiber Distribution Frame / customer cross-connect)
  • CRAH (dedicated CRAH for MMR cooling load)

Sub-title: "Carrier-Neutral · Cross-Connect"

Position: ground-floor east zone (near loading bay for carrier cable-

pull access).

Notes

  • Engine files (datahall-model.js, datahall-calculations.js)

byte-identical.

  • Probe 75/75 PASS.
  • STP modal viewBox dynamically set on open via el.setAttribute.
  • DC AI Tech Spec PDF unchanged (~353 KB).
v1.41.0 MINOR

All-In-One Dashboard page + geopolitics.html link fix

Ship 1 of 7 in the v1.41.x batch (owner approved 7 stacked plans).

Owner reported: geopolitics.html "All-In-One Dashboard" card linked to

dc-market-tracker.html (wrong page). No dedicated page existed for

the Glance dashboard the card describes.

Added

  • all-in-one-dashboard.html (NEW, ~350 lines) — informational

showcase + quickstart page for the Glance self-hosted dashboard.

Sections: hero/badge, what-is-Glance, why-for-engineers (4 tiles),

module catalogue (8 widget tiles), Docker + Docker Compose

quickstart with copy-pastable snippets, sample YAML configuration,

live-demo placeholder, alternative-comparison table (Home Assistant,

Notion, browser start-page, Grafana, Heimdall/Dashy), resource

links. Engineer-aesthetic dark theme by default; v1.8.0 mobile

patch included.

Fixed

  • geopolitics.html line 794: card link

dc-market-tracker.htmlall-in-one-dashboard.html

Notes

  • New page added; brand tokens follow documentation/design.md

(instrument-cyan accent, IBM Plex Sans + JetBrains Mono, thin lines).

  • Engine files byte-identical. Ship-gate gates clean.
v1.40.5 PATCH

Second Brain Hierarchical view fix — `sortMethod: hubsize` for cyclic knowledge graph

Owner reported: Hierarchical view on /Apps/second brain/index.html

showed nodes collapsed into 2 narrow pillars instead of a proper

tree layout.

Diagnosis

The view config used sortMethod: 'directed' which requires a DAG

with a single root. The knowledge graph is cyclic — many

bidirectional edges (articles ↔ comparisons ↔ calculators ↔ memory

files). Vis-network's directed sort can't resolve cycles, so it

collapses cycle members into vertical pillars.

Fixed

  • sortMethod: 'directed''hubsize' (root selection by node

degree — high-degree hubs like Engineering Journal, MEMORY.md,

RZEngine v1.2.0 become natural roots, others fan out beneath them)

  • levelSeparation: 105180 (more vertical room for 134 nodes)
  • New nodeSpacing: 200 + treeSpacing: 250 (horizontal breathing

room for siblings and disjoint subtrees)

  • New parentCentralization: true (parents centered over children)
  • New blockShifting: true + edgeMinimization: true (vis-network

auto-untangle + edge-cross reduction)

Notes

  • Engine files byte-identical. ship-gate 8/8 PASS.
v1.40.3 PATCH

Second Brain Wiki link broken — relative-path fix

Owner reported: clicking the "Wiki" button on the Second Brain page

(/Apps/second brain/index.html) returned 404. The wiki link was

relative (standarization/repos/REPO_INSTALL_PLAN.md) which the

browser resolved to /Apps/second brain/standarization/repos/...

that path does not exist. The actual file lives at site root

/standarization/repos/REPO_INSTALL_PLAN.md.

Fixed

  • Apps/second brain/index.html line 414 — navbar "Wiki" button

link: standarization/repos/...../../standarization/repos/...

  • Apps/second brain/index.html line 767 — wiki node graph entry

in the N[] (nodes) array: same path correction.

Both links now resolve to http://&lt;host&gt;/standarization/repos/REPO_INSTALL_PLAN.md.

Verified via headless Chrome: browser-resolved href matches the file's

actual location (HTTP 200).

Why this happened

The Second Brain page lives in a sub-directory (/Apps/second brain/),

but the repo wiki sits at site root. Relative links without ../../

prefix resolve into the wrong scope. Browser link resolution is

strict; the fix is a one-line path-prefix change.

Notes

  • No engine impact. Probe 75/75 PASS.
  • ship-gate 8/8 PASS.
v1.40.2 PATCH

Tech Spec PDF — Section 7 Network + Section 2 Site/Structural; 338 KB → 353 KB; ~80-90 pages

(Authored locally as v1.39.4. Parallel session shipped v1.40.0 AI

Maintenance review fixes + v1.40.1 Network Hub OG images mid-push;

this lands as v1.40.2.)

Phase B continuation. v1.39.3 deepened electrical/cooling/fire.

This ship deepens network/ICT + adds structural/seismic/environmental

depth to Section 2 (Site & Facility). PDF: 338 → 353 KB (+15 KB).

Bug caught + fixed during this ship

The first attempt failed the probe (`TS-AI-1: Generate Design returns

~0 chars) because Section 2 referenced g.lengthM but g = m.geometry`

was declared later (inside Section 6). Same class as v1.36.2's

sldSVG scope bug. Fixed by hoisting var g = m.geometry; + `var

hallVol = vol; to the top of buildTechSpecHtml()`. **Probe caught

it before push** — exactly its job.

Section 7 (Network) — added

  • 7.3 Spine-Leaf Radix Sizing — NVIDIA QM9700 (64-port NDR 400 G)

reference; per-hall leaf + spine count (rail-aligned 8-rail

topology); bisection bandwidth.

  • 7.4 Full IB Cable Schedule — cable type by length (DAC /

AOC / MMF / SMF); per-hall + facility-wide cable count + length;

cable-tray routing strategy.

  • 7.5 OOB Management Network — endpoints, switch sizing, Cat6A,

SNMPv3 + IPMI 2.0 + Redfish.

  • 7.6 Storage Tier Design — hot/warm/cold tiers with capacity,

bandwidth, and protocol stack (NVMe-oF, parallel FS, object).

  • 7.7 BMS Gateway + DCIM Integration — Distech ECY-VAV / Schneider

SmartX AS-P, multi-protocol stack, IEC 62443 zoning.

Section 2 (Site & Facility) — added

  • 2.1 Structural Floor Loading — NVL72 weight 1,360 kg, per-rack-

pos loading 830 kg, distributed live load 1,150 kg/m²,

design 1,500 kg/m² with 30 % margin; post-tensioned RC

slab-on-grade C40/50.

  • 2.2 Seismic Design (SNI 1726:2019) — Zone 4 Jakarta, PGA 0.5 g,

SMRF building structure, M16 anchors ≥ 50 kN shear, bracing per

IBC §13.5, ASCE 7-22 dual reference.

  • 2.3 Environmental Envelope — ASHRAE A1 + L4 (cold-aisle

18–27 °C, TCS supply 35 °C); particulate (ISO 14644-1

Class 8); vibration (ISO 10816 < 0.5 mm/s); noise (< 85 dBA);

lighting (500 lux LED 4000K).

  • 2.4 Hall Layout Dimensions — detailed geometry per hall

(length × width × height; aisle widths; row count; emergency-exit

count per IBC §1006).

Notes

  • Engine files (datahall-model.js, datahall-calculations.js)

byte-identical. 57/57 + 22/22 tests pass.

  • Probe 75/75 PASS (after the post-bug fix).
  • Cumulative v1.39.x growth: 264 KB → 353 KB (+34 %).
  • Owner: refresh http://127.0.0.1:8090/datahallAI.html, click

📑 Generate Design — should see Sections 2, 7 substantially

expanded plus all prior additions.

v1.39.3 PATCH

Tech Spec PDF deeper engineering — Section 4/5/6 expansion; 315 KB → 338 KB; ~75 estimated pages

Phase B continuation. v1.39.2 expanded compute/BMS/cost annex. This

ship deepens electrical, cooling, fire disciplines toward the

200-300 page target. PDF HTML: 315 KB → 338 KB (+23 KB). Estimated

printed pages: ~55-65 → ~70-80.

Section 4 (Electrical) — added

  • 4.6 Per-Feeder Voltage Drop (IEC 60364-5-52) — cumulative

source-to-rack budget < 2 % vs 2.5 % Tier-IV target; 40 %

oversize headroom on conductor selection.

  • 4.7 Short-Circuit Current (IEC 60909) — three-phase fault

current per bus with utility + transformer + generator contribution;

busway ICU 50 kA / 1 s for double margin.

  • 4.8 Battery Sizing Variants — 10 / 15 / 30 min ride-through

with installed kWh + cabinet count per variant.

  • 4.9 Harmonic Analysis (IEEE 519 + IEC 61000-3-2) — combined

TDD predicted < 5 % at PCC; AHF mitigation triggers.

  • 4.10 Full Equipment Cut-Sheet Index — vendor references for

UPS / transformer / generator / LV switchgear / busway / RPP /

ATS / STS / battery.

Section 5 (Cooling) — added

  • 5.6 Per-CDU Duty + Flow Table — 12-row matrix per hall with

running/standby status, duty kW, loading %, TCS flow, ΔT.

  • 5.7 Per-CRAH Duty Table — 6-row per hall with status, duty,

CHW flow, ΔT.

  • 5.8 COP Sensitivity Sweep — chiller compressor input + PUE

at COP 5.0/5.5/6.0/6.5/6.8/7.5 with nameplate vs fouled vs

optimistic labels.

  • 5.9 Chiller Sequencing Logic — 5-step staging strategy with

failure-response timing.

  • 5.10 Cooling Tower / Condenser Water Sizing — heat rejection

budget, design wet-bulb, CWS flow, make-up rate, tower-cell N+1.

Section 6 (Fire) — added

  • 6.5 NFPA 2001 Hold-Time + Soak-Out — design concentration

margin, door-fan integrity test, MEC + safety factor.

  • 6.6 Agent Concentration at Altitude — NFPA 2001 Table 5.2.2

multiplier (sea-level baseline; lookup at common DC altitudes).

  • 6.7 Detector Spacing per NFPA 72 — spot vs cross-zoned vs

VESDA aspirating port counts derived from hall geometry.

  • 6.8 Pre-Action Sprinkler Back-Up (NFPA 13) — double-interlock

design, sprinkler head selection, water supply.

  • 6.9 EPO Interlock Strategy — scope matrix per room

(data hall = NO EPO; electrical/battery/genset/mech = EPO required

per NFPA 75 §9.4 / NFPA 110 §5.6).

Notes

  • Engine files (datahall-model.js, datahall-calculations.js)

byte-identical. New content is engine-bound where engine data

exists (CDU/CRAH/chiller numbers); standards-derived where it

doesn't (NFPA / IEC / IEEE references).

  • Probe 75/75 PASS — all existing assertions still hold.
  • DC AI Tech Spec PDF cumulative growth across v1.39.x:

264 KB (v1.39.0 baseline) → 338 KB (v1.39.3) = +74 KB / +28 %.

  • Realistic next targets (v1.39.4 if more depth wanted): Section 7

network full IB cable schedule (216 cables per pod) + spine-leaf

radix sizing + storage tier design.

v1.39.2 PATCH

Tech Spec PDF content depth expansion — Phase B; +51 KB content, ~55-65 estimated pages

Phase B of the v1.39.x Tech Spec depth + visibility plan. v1.39.1 fixed

the SVG-renders-as-black bug. This ship expands content depth toward

the owner's "200-300 halaman" ask. PDF HTML: 264 KB → 315 KB (+51 KB

new content, +19 %). Estimated printed pages: ~25 → ~55-65.

Honest reach assessment: still short of the 200-300 page target.

Continuing in v1.39.3 if owner wants more depth.

Added (DC AI Tech Spec PDF only)

  • Appendix D — FMECA per equipment class (~6-8 pages):

Failure Mode, Effects & Criticality Analysis per IEC 60812 for

UPS (8 modes), Transformer (6 modes), Generator (7 modes),

Chiller (7 modes), CDU (6 modes). S × O × D = RPN scoring.

Top-5 priority-mitigate items summary.

  • Appendix E — Commissioning & Maintenance Checklists

(~5-6 pages): Lv-1 through Lv-5 commissioning per ASHRAE Guideline

0 for electrical / cooling / fire systems. PM cadence table per

IEEE 902 + NETA MTS.

  • Appendix F — Standards Excerpts (~4-5 pages): clause-level

citations from NFPA 75 §5.2 / §7.3.1 / §8.1 / §9.4, NFPA 2001

§1.5 / §5.1.2 / §9.2 / §9.4, ASHRAE TC 9.9 Class A1 + W4 + L4,

Uptime Tier IV (concurrent maintainability + continuous cooling),

IEC 60364-4-41 / 5-52, IEEE 1100 Ch 8-10, NVIDIA NVL72 reference.

  • Section 3.4 — Per-NVL72 Power Matrix (per hall) (~2 pages):

27-row enumeration of all NVL72 domains in Hall A with rack-position

IDs, kW per domain, kW per rack-position. Same matrix applies to

Halls B/C/D.

  • Section 3.5 — GPU Thermal Envelope (~1 page): per-GPU power

allocation breakdown (78 % GPUs / 5 % CPUs / 10 % NVSwitch / 7 %

manifolds & losses).

  • **Section 3.6 — Per-Rack-Position Cable + Breaker Schedule

preview** (~2 pages): 12-row sample with cable size, breaker, feed

per rack-position. Full 54-row schedule out of scope (cable-schedule

tool).

  • Section 8.4 — BMS Point Catalog (~6-8 pages): 90+ point

baseline inventory across ELEC (26), MECH (31), FIRE (8), SECU (4),

ENV (5), NET (5), DERIVED (10) disciplines.

  • Section 8.5 — Alarm Matrix per Equipment Class (~2 pages):

16 threshold rows with two-stage warning / alarm levels.

  • Section 8.6 — BMS Architecture Summary (~1 page): ISA-95

L0–L5 hierarchy, protocol stack (BACnet/IP, Modbus TCP,

IEC 61850, OPC-UA, MQTT), PTP time sync, IEC 62443 cyber zoning.

  • Section 10.6 — Per-Component CAPEX Breakdown (~1 page):

mechanical 32 % / electrical 28 % / fit-out 12 % / shell 10 % /

fire 5 % / network 6 % / soft costs 7 %.

  • Section 10.7 — NPV with WACC Sensitivity (~1 page): 10-yr

OPEX discounted at 5 % / 8 % / 12 % WACC.

  • Section 10.8 — Multi-horizon TCO (~1 page): 5 / 10 / 15 /

20-yr undiscounted TCO with per-MW-IT-yr lifecycle cost.

  • Section 10.9 — OPEX Benchmarks (~1 page): industry per-MW-IT

benchmarks for enterprise / hyperscale / AI factory with this

facility's self-check.

Appendix C index updated

Added D, E, F to the appendix list. Section anchor list also adds

"10. Cost Annex" which was missing previously.

Notes

  • Engine files (datahall-model.js, datahall-calculations.js)

byte-identical. All cost factors + standards excerpts are NEW

authored content (not engine-derived) but use cited public sources.

  • Probe 75/75 PASS — all existing assertions still hold.
  • DC Conv Tech Spec parallel expansion deferred (owner asked for DC AI

focus; DC Conv currently at v1.31.3 scaffold ~30 pages).

  • Realistic next expansion targets (v1.39.3 if owner wants more):

Section 4 electrical (per-feeder cable schedule full, IEC 60909

short-circuit, IEEE 519 harmonics), Section 5 cooling (per-CDU duty

table, per-CRAH duty table, COP sensitivity sweep), Section 7

network (full IB cable schedule).

v1.39.1 PATCH

SVG visibility fix in Tech Spec + BoD PDFs; mobile patch on 16 more Network Hub pages

Owner reported (screenshot 2026-05-24, page 10 of 25 in Tech Spec PDF):

embedded SVG figures rendered as solid black blocks with invisible

lines. Cockpit SVGs are designed for a dark UI (slate fills, muted

greys); when cloned and embedded on the WHITE print page, the dark

fills land on white with no surrounding context and read as black

blobs. Lines technically render but are too low-contrast to see.

This ship is Phase A of the v1.39.x Tech Spec depth + visibility

plan; Phase B (substantial content expansion to 150–200 pages) lands

in v1.39.2.

SVG fix — grabSVG() rewrite (both buildTechSpecHtml + buildBodPdfHtml)

  • Inject dark canvas rect as the first child of the cloned SVG —

preserves the dark-theme design intact, so the embedded figure

looks exactly like a screenshot of what the operator sees on the

cockpit. No fidelity loss; no surprise re-colouring.

  • Stroke-width floor: walk all `path / line / rect / circle /

polyline / polygon` elements; any element with a stroke AND

stroke-width < 1.2 gets bumped to 1.2. Print compression preserves

what would otherwise vanish.

  • Wrap in framed <figure> with 0.6pt slate border + dark

background + page-break-inside: avoid + italic caption: "Source:

live cockpit SVG — dark-theme palette preserved as designed".

Makes it clear to the reader that the dark panel is intentional,

not a print error.

Trade-off (transparent)

Two valid approaches were considered:

  • Wrap in dark canvas (chosen) — preserves cockpit design exactly,

reads as a screenshot.

  • Remap fills for print contrast (not chosen) — better

stand-alone readability on white but the figure no longer matches

what the operator sees on the cockpit.

Owner emphasis on "line-nya solid" favoured visibility-of-line

work over context divergence; the dark-canvas approach delivers

both (visible lines + faithful palette).

Mobile patch (incidental fix, surfaced by gate)

Parallel session shipped v1.39.0 Phases 3–6 (Lane A + D + E + C of

the Network Hub) with 16 new protocol pages. ship-gate.sh --probe-http

flagged all 16 as failing audit-mobile-responsive --strict

(score 2/10). Standard v1.8.0 mobile patch added to:

  • network/foundations/{dhcp-dns,ipv4-vs-ipv6,osi-tcp-ip-models,subnetting-cidr,tcp-handshake}.html
  • network/security/{mtls,oauth-jwt,tls-handshake,wireguard}.html
  • network/apis-agents/{graphql,grpc,mcp-tool-call,rest-api}.html
  • network/dc-management/{ipmi-redfish,snmp,syslog}.html

Mobile audit: 132 pass / 0 fail (was 116 / 16).

Notes

  • DC Conv Tech Spec doesn't use embedded SVGs — unaffected by SVG fix.
  • Engine files byte-identical. 57/57 + 22/22 tests pass.
  • Probe 75/75 PASS (all existing PDF assertions still hold; visibility

fix doesn't change content character counts).

  • Substantial content expansion (Issue B from owner feedback — "kurang

detail, sangat-sangat kurang komprehensif") ships in v1.39.2.

v1.38.1 PATCH

ship-gate.sh — HTTP probe mode + dev-server pre-flight + mobile patch on 5 more Network Hub pages

(Authored locally as v1.37.3. Parallel session shipped v1.38.0

Network Hub Phase 2 [+5 protocol pages] mid-push; this lands as

v1.38.1 with mobile patch on all 5.)

Mobile patch (incidental fix, surfaced by gate)

Running ship-gate.sh after rebase flagged 5 new pages from

v1.38.0 as failing audit-mobile-responsive --strict (score 2/10).

Standard v1.8.0 patch added to all 5:

  • network/industrial-ot/bacnet-mstp.html
  • network/industrial-ot/dnp3.html
  • network/industrial-ot/ethercat.html
  • network/industrial-ot/ethernet-ip.html
  • network/industrial-ot/profinet.html

Mobile audit: 116 pass / 0 fail (was 111 / 5).

ship-gate.sh enhancement

Small developer-experience improvement to tools/ship-gate.sh.

Previously the optional probe gate hardcoded RZ_BASE=file (no

server needed, but ~25 % slower because file:// blocks on some

third-party CORS attempts). When the owner has a dev server running

(e.g. python3 -m http.server 8090), HTTP mode is faster.

Added

  • bash tools/ship-gate.sh --probe-http — runs the probe

against an HTTP dev server. Default base is

http://127.0.0.1:8090; override via

RZ_PROBE_BASE=http://127.0.0.1:9000 bash tools/ship-gate.sh --probe-http.

  • Pre-flight curl check: if the dev server is unreachable, the

gate fails immediately with a helpful message instead of letting

the probe time out:

```

✗ FAIL — dev server not reachable at http://127.0.0.1:8090

Start one first: python3 -m http.server 8090 --directory $(pwd)

```

Existing

  • bash tools/ship-gate.sh (no probe — 7 gates, ~5 s) still works.
  • bash tools/ship-gate.sh --probe (file:// mode — 8 gates, ~60 s)

still works.

  • The new --probe-http mode is ~50 % faster on the probe step

alone when a dev server is up (no CORS blocking).

Notes

  • Engine files byte-identical. 57/57 + 22/22 tests pass.
  • Probe 75/75 PASS verified against both file:// and

http://127.0.0.1:8090.

v1.37.2 PATCH

FAQ dialog probe coverage; caught DC Conv FAQ TypeError; 75/75 pass

The probe was extended to cover the FAQ dialog on both cockpits. On

first run it caught another silent bug — DC Conv FAQ button threw

TypeError: Cannot read properties of undefined (reading 'racks_total')

when clicked. Bug #5 caught by the probe in 24 hours.

Bug found (user-facing — FAQ dialog crashed before opening)

  • Symptom: DC Conv cockpit → click "❓ FAQ" button → dialog

fails to open. No visible error.

  • Console error: `TypeError: Cannot read properties of undefined

(reading 'racks_total')` at the FAQ_ITEMS array initialisation

(FAQ entry "How many racks does this facility have?").

  • Root cause: dc-conventional.html line 2064 referenced

s.datahall.racks_total but CONV_CALC.snapshot has no

datahall key — racks_total is in design constants, not the

snapshot. The s ? guard only checked if the snapshot existed,

not whether the datahall sub-object existed.

  • Fix: hardcode 200 racks (the conv design constant) and derive

average density from s.site.it_load_kw / 200 with the same

defensive guard pattern used elsewhere.

  • Impact window: shipped in v1.30.1 (2026-05-23) → fixed v1.37.2

(2026-05-24). All users who clicked the FAQ on DC Conv between

ship and fix saw a broken modal.

Probe added (regression-guard)

  • FAQ-AI-1 to FAQ-AI-4: DC AI FAQ — no page-error from

FAQ_ITEMS init (guards against v1.32.10 ReferenceError regression),

dialog opens on click, ≥10 Q/A pairs, no JS error on click.

  • FAQ-CONV-1 to FAQ-CONV-4: same 4 assertions on DC Conv FAQ.

Result

75/75 PASS (was 67; +8 FAQ assertions).

Accuracy-arc bug count

The probe has now caught 5 real bugs:

  • v1.32.10 — FAQ_ITEMS ReferenceError on page load (since v1.30.1)
  • v1.32.10 — probe page.click() coordinate-fail (probe robustness)
  • v1.32.10 — Test-3a regex too strict
  • v1.36.2 — DC AI Generate Design empty PDF for ~24 hr in prod
  • v1.37.2 — DC Conv FAQ TypeError for ~24 hr in prod (this ship)

Bugs #4 and #5 are both user-facing silent failures on features

that LOOKED to work. Both shipped in v1.30.1 (the Generate Design +

FAQ scaffold release) and stayed broken until the probe caught them

the next day.

Notes

  • Engine files byte-identical. 57/57 + 22/22 tests pass.
  • tools/ship-gate.sh label updated to reflect 75-test count.
  • Same pattern as DC AI FAQ_ITEMS scope-bug — different mechanism,

same root cause class (referencing names that don't exist where

the developer thought they did).

v1.37.1 PATCH

Basis of Design PDF probe coverage; 67/67 pass

(Authored locally as v1.36.3. Parallel session shipped v1.37.0 Network

Hub determinism harness mid-push; this lands as v1.37.1.)

Mirror of v1.36.2's Tech Spec PDF probe — the older "Basis of Design"

button on DC AI is a separate code path (#bodTrig

#bodDrawerPdfbuildBodPdfHtml(), scoped in a different IIFE

from buildTechSpecHtml()). Given v1.36.2 found a silent failure on

the newer button, the older one needed the same mechanical

verification.

Added

  • BoD-AI-1 through BoD-AI-7 (7 assertions): BoD Export PDF

produces non-trivial HTML (~209 KB) with cited title, engine

values (14.26 MW or 3,564 kW IT), PUE 1.30, 132 kW per NVL72,

Scenario A label, chiller nameplate COP 6.8.

  • Probe flow: click #bodTrig to open the drawer (lazy-builds the

PDF button binding), wait, then click #bodDrawerPdf and capture

the print-window output.

Result

  • BoD PDF was HEALTHY — no silent bug. The probe assertions all

pass. But this is now mechanically verified rather than assumed.

  • 67/67 PASS (was 60; +7 BoD assertions).
  • tools/ship-gate.sh label updated.

Why this matters

v1.36.2 demonstrated that "the developer thinks it works" is not the

same as "it actually produces output." Both PDF buttons are now

covered by the probe; future regressions on either are caught before

push.

Notes

  • Engine files (datahall-model.js, datahall-calculations.js,

conv-engine.js) byte-identical. 57/57 + 22/22 tests pass.

v1.36.2 PATCH

Tech Spec PDF probe coverage; probe caught CRITICAL silent bug — DC AI Generate Design returned empty PDF since v1.31.2; 60/60 pass

The probe was extended to capture and verify the Generate Design Tech

Spec PDF output on both cockpits. On first run it caught a **critical

silent bug** that had been in production for ~24 hours: the DC AI

Generate Design button was producing an EMPTY popup because the v1.31.2

expansion referenced sldSVG inside buildTechSpecHtml() but the

variable was only declared in buildBodPdfHtml(). Different functions,

different scopes — silent ReferenceError swallowed by the print-window

flow.

Bug found (CRITICAL — user-facing)

  • Symptom: DC AI cockpit → click "📑 Generate Design" → popup

opens but is BLANK. No error visible to user.

  • Console error (only visible with dev-tools open):

ReferenceError: sldSVG is not defined

  • Root cause: v1.31.2 added `(sldSVG ? '

unavailable')` to Section 4 (Electrical Discipline) of the Tech Spec

PDF without declaring sldSVG in the buildTechSpecHtml() scope.

The variable existed in buildBodPdfHtml() (a separate function)

so the developer's mental model was right, but the JS scope wasn't.

  • Fix: declare `var sldSVG=grabSVG('elecSvg')||grabSVG('sldHost')

||grabSVG('p-elec'); at the top of buildTechSpecHtml()`, parallel

to its declaration in buildBodPdfHtml().

  • Impact window: shipped in v1.31.2 (2026-05-23) → fixed v1.36.2

(2026-05-24). All users who clicked Generate Design on DC AI in

that window got an empty PDF.

  • DC Conv was unaffectedbuildTechSpecHtml() on

dc-conventional.html doesn't reference any SVG figures, so the

bug was DC-AI-only.

Probe added

  • TS-AI-1 through TS-AI-10 (10 assertions) — DC AI Tech Spec PDF:
  • returns non-trivial HTML (~264 KB)
  • title carries facility name
  • cites Scenario A locked
  • has cover / TOC / executive-summary structure
  • carries engine value 14.26 MW (IT)
  • carries 132 kW per NVL72 basis
  • carries GPU count 7,776
  • references standards (ASHRAE/NFPA/NVIDIA)
  • includes Cost Annex (Section 10)
  • includes Appendix A formula derivations
  • TS-CONV-1 through TS-CONV-10 (10 assertions) — DC Conv Tech Spec

PDF: facility name, IT 1,850 kW, PUE 1.45, Grid factor terminology,

CUE_IT 0.61, CHW flow 58.2 L/s, fuel 45,900 L, Cost Annex,

ISO/IEC 30134 citation.

Probe technique

Override window.open before clicking the button; intercept

document.write to capture the HTML; assert against the captured

string. Works in headless without needing a real browser window.

Result

60/60 PASS (was 40; +20 Tech Spec PDF tests). ship-gate runner

updated to report "60/60" in its label.

Accuracy-arc bug count to date

The probe has now caught 4 real bugs that would otherwise have shipped:

  • v1.32.10 — FAQ_ITEMS ReferenceError on page load (since v1.30.1)
  • v1.32.10 — page.click() coordinate-fail in headless (probe itself)
  • v1.32.10 — Test-3a regex too strict on NVL72-rack-scale
  • **v1.36.2 — DC AI Generate Design empty PDF (since v1.31.2,

user-facing for ~24 hr)**

Notes

  • Engine files (datahall-model.js, datahall-calculations.js,

conv-engine.js) byte-identical. 57/57 + 22/22 tests pass.

  • Bug #4 is the most consequential of the 4 — a user-facing feature

that LOOKED to work (button clicked, popup opened) but produced

zero output. Without the probe this would have stayed broken until

a user reported it.

v1.36.1 PATCH

Probe wired into per-ship gate sequence + ship-gate.sh runner + mobile-responsive patch on 6 Network Hub pages

(Authored locally as v1.35.2 with 3 mobile patches. Parallel session

shipped v1.36.0 with 3 more new pages mid-push; this lands as v1.36.1

with mobile patch on all 6.)

The probe has been a runnable harness since v1.32.9 but invocation was

voluntary. This ship makes it a first-class per-ship gate by adding it

to CLAUDE.md's standard sequence, providing a single-command runner

(tools/ship-gate.sh), and updating the tooling reference table.

Added

  • tools/ship-gate.sh — single-command runner for the full

per-ship gate sequence. 7 default gates (4 audit + 2 engine tests +

1 engine-files-byte-identical guard) + optional 8th gate

(--probe to run probe-accuracy-validation.mjs).

Exit code 0 = green, 1 = a gate failed. Wirable to a pre-push

git hook:

```bash

echo 'bash tools/ship-gate.sh --probe' > .git/hooks/pre-push

chmod +x .git/hooks/pre-push

```

  • CLAUDE.md updates:
  • New "Engine + accuracy tests" block in §"Audit before push" with

the three engine/probe commands.

  • Tooling-reference table gains 3 rows (test-datahall-calc.mjs,

test-conv-calc.mjs, probe-accuracy-validation.mjs).

  • Standardisation-docs list gains 3 entries

(ACCURACY_VALIDATION.md, BMS_SHELL.md, TECH_SPEC_PDF.md)

with the per-doc "READ BEFORE" guidance.

Mobile-responsive patch (incidental fix surfaced by the new gate)

Running ship-gate.sh for the first time flagged pages from the

parallel session's v1.34.0/v1.35.0/v1.36.0 Network Hub work as failing

audit-mobile-responsive --strict (score 2/10, missing all 7

checkpoints). Standard v1.8.0 mobile patch added to 6 pages:

  • network-visualization-hub.html
  • network-compare.html
  • network/industrial-ot/modbus-rtu.html
  • network/industrial-ot/modbus-tcp.html
  • network/industrial-ot/bacnet-ip.html
  • network/industrial-ot/opc-ua.html

All six now pass at score 9/10. Mobile-responsive audit total:

111 pass / 0 fail (was 105 pass / 6 fail).

What this proves

The gate-script is doing exactly what it should: surfacing defects

across sessions before they ship to production. The 3 Network Hub

pages would have stayed un-responsive indefinitely without the gate;

they're now patched as part of normal ship discipline.

Result

8/8 gates PASS (ship-gate.sh --probe). Probe still **40/40

PASS**.

Notes

  • Engine files byte-identical. 57/57 + 22/22 tests pass.
  • Owner can run bash tools/ship-gate.sh (skip probe, fast ~5 s)

or bash tools/ship-gate.sh --probe (full ~60 s including probe).

  • Future ships should run the gate before push. If a gate is

expected to fail (e.g. intentional engine change), document the

exception in the commit message.

v1.35.1 PATCH

Cross-page headline consistency probe — Rule 1 verified site-wide; 40/40 pass

(Authored locally as v1.33.3. Parallel session shipped v1.34.0 + v1.35.0

Network Hub work mid-push; this lands as v1.35.1.)

Closes the reviewer's Rule 1 ("one source of truth") with runnable

cross-page verification. Previously the probe asserted each KPI on

its own page; now it asserts the same engine value reconciles

across every page that displays it.

Added (probe extension)

  • X-Test-1: PUE = 1.45 identical across dc-conv dashboard

(#kpiPue), dc-conv side panel (#sPue), and datahall ops-rollup

(#dh-pue). Three independent surfaces, one engine value, one assertion.

  • X-Test-2: WUE = 1.20 identical across dc-conv dashboard

(#kpiWue), dc-conv side (#sWue "1.20 L/kWh"), water-system

KPI (#kWue), water-system status bar (#status-wue).

  • X-Test-3: IT load reconciles in different units — dc-conv

"1,850 kW" (#kpiIt) = datahall "1.85 MW" (#dh-rack-load).

Probe robustness fix

  • Switched page.goto from networkidle2 to domcontentloaded for

cross-page reads — networkidle2 was timing out on file:// mode

when third-party analytics (e.g. ipapi) blocked on CORS. Probe

only needs DOM + engine, not network quiescence.

Result

40/40 PASS (was 37; +3 cross-page tests).

What this proves

The reviewer's chief concern in docs 26+16 was that "the deeper tabs

can be correct while the first screen tells a different story."

X-Test-1/2/3 demonstrably rule that out for the three values

where multiple pages display the same engine fact:

  • PUE 1.45 on 3 surfaces ✓
  • WUE 1.20 on 4 surfaces ✓
  • IT 1850 kW = 1.85 MW on 2 surfaces ✓

If any future ship breaks the single-source-of-truth invariant on

these metrics, the probe fails before push.

Notes

  • Engine files byte-identical. 57/57 + 22/22 tests pass.
  • Probe runtime: ~50 s headless (+5 s for cross-page reads).
  • DC AI cockpit is on a different engine (Scenario A, PUE 1.30) so

not included in cross-page reconciliation with the CONV pages —

that would be a category error.

v1.33.2 PATCH

Basis drawers extended to datahall.html ops-rollup — Rule 6 site-wide

ACCURACY_VALIDATION Rule 6 originally landed on the two cockpit

dashboards (DC AI + DC Conv) in v1.32.8. This ship extends the same

pattern to datahall.html's operations-rollup top-strip so the

data-hall SCADA page also satisfies the display contract.

Added (datahall.html)

  • Five ops-rollup KPIs are now click-to-open basis drawers:

Hall State / Rack Load / Cooling Margin / PUE / Power Density.

  • Each opens with formula / inputs / output / scope / denominator /

source / data-mode / last-update + engineering note.

  • Engine-bound via window.CONV_CALC.snapshot (no hardcoded math).
  • Dotted-underline visual hint that the KPI is interactive.
  • Keyboard accessible (tabindex=0 + Enter/Space).

Probe extended

  • tools/probe-accuracy-validation.mjs now covers all 5 datahall

ops-rollup drawers. 37/37 PASS (was 32, +5 new tests).

  • Continues to run via python3 -m http.server 8081 & +

node tools/probe-accuracy-validation.mjs OR

RZ_BASE=file node tools/probe-accuracy-validation.mjs.

Roadmap (remaining cockpit pages)

Same Rule 6 pattern can be extended to the other 5 cockpit pages

(chiller-plant, water-system, fire-system, fuel-system, ict,

EPMS_Telemetry). Lower priority because those pages display values

inline in the SVG mimic rather than in a top-strip KPI cluster.

Defer until owner requests OR until a reviewer flags an opaque KPI on

one of those pages.

Notes

  • Engine files byte-identical. 57/57 + 22/22 tests pass.
  • datahall.html data-mode = 'Simulated' / 'GOOD' chips already

present from earlier work; the basis drawer is additive.

v1.33.1 PATCH

Probe-validated bugfix — FAQ ReferenceError + probe robustness; 32/32 pass

(Authored locally as v1.32.10. Parallel session shipped v1.32.10 Network

Hub plan v2.3 + v1.33.0 Phase 0 scaffolding mid-push; this lands as

v1.33.1.)

The v1.32.9 probe FOUND TWO REAL BUGS on first run. Both fixed here.

This is exactly what the probe was supposed to do, so v1.32.9 +

v1.33.1 together close the accuracy-review arc with verified state.

Bug #1 (caught by probe) — FAQ_ITEMS ReferenceError on page load

  • Symptom: datahallAI.html threw ReferenceError: sc is not defined

during script parse, visible in browser dev-tools console.

  • Root cause: v1.30.1 ship placed var FAQ_ITEMS=[...] at IIFE

top-level, referencing sc / pueVal / eq / m / grp — variables

scoped INSIDE buildTechSpecHtml(). The array body evaluates

eagerly on page load, so all four refs throw before any FAQ button

could be clicked.

  • Fix: moved FAQ_ITEMS inside openFaqDialog(), rebound via

window.DATAHALL_MODEL + window.DATAHALL_CALC lookups with

defensive defaults. Refs now resolve at click-time when the engine

is guaranteed loaded. Added local gNum() helper for the

thousands-separator formatting.

Bug #2 (probe robustness) — page.click() failed on basis-drawer cards

  • Symptom: probe AI-Test-7 + CONV-Test-8 reported drawer never

opened.

  • Root cause: Puppeteer's coordinate-based page.click() requires

the element to be visible AND not occluded at the click coordinates.

In headless mode with default 800×600 viewport some elements may

fail the visibility check.

  • Fix: switched the probe to DOM-API click

(page.evaluate(() => element.click())) which dispatches a real

click event without coordinate testing. More reliable for headless

testing.

Bug #3 (probe rigour) — Test-3a regex too strict

  • Symptom: matched "NVL72 rack-scale" (a legitimate NVIDIA term)

as ambiguous.

  • Fix: tightened regex to \b66\s*kW.{0,12}NVL72\s+rack\b(?!-)

— blocks the bare "66 kW NVL72 rack" pattern but allows

"rack-scale", "rack-pos", and pluralised "racks".

Result after fixes

RESULT: 32 passed, 0 failed

Both DC AI (19 tests) and DC Conv (13 tests) pass. The team review

(docs 26 + 16) is now demonstrably closed against a runnable

verification harness — not just by claim.

Closing notes on the accuracy review (docs 26 + 16)

ShipFunction
v1.32.18 critical bugs fixed (AI-ACC-01/02/03/05/06/07/08 + CONV-ACC-01/02/04/08)
v1.32.6Terminology + UPS 2N + CHW reconciliation (AI-ACC-04/09 + CONV-ACC-03/05)
v1.32.8Basis drawers on all 15 top KPIs (display contract)
v1.32.9Puppeteer probe for all 15 acceptance tests authored
v1.32.10Probe ran, found 2 real bugs, fixed both, 32/32 PASS

This sequence demonstrates the handoff mandate (locked 2026-05-23):

every reviewer finding traced from raw doc → critical assessment →

implementation → standardisation doc → CHANGELOG → memory → runnable

verification.

Notes

  • Engine files (datahall-model.js, datahall-calculations.js,

conv-engine.js) byte-identical. 57/57 + 22/22 tests pass.

  • tools/probe-accuracy-validation.mjs is now CI-ready. Owner can

invoke: python3 -m http.server 8081 & + node tools/probe-accuracy-validation.mjs.

v1.32.9 PATCH

Accuracy Puppeteer probes — 15 reviewer acceptance tests codified

Phase 4 / final piece of the team-review accuracy work. The reviewer's

7 DC AI + 8 DC Conv acceptance tests from

Documents/screenshot bms rz/dc ai/review/26-accuracy-validation-and-correction-list.md

  • .../conv/review/16-accuracy-validation-and-correction-list.md are

now codified as a runnable probe:

tools/probe-accuracy-validation.mjs.

Added

  • tools/probe-accuracy-validation.mjs — headless Chrome

(Puppeteer) probe. Runtime ~25–35 s. Exit code 0 = PASS, 1 = FAIL.

Two modes:

  • HTTP (recommended): python3 -m http.server 8081 & then

node tools/probe-accuracy-validation.mjs.

  • File (no server): RZ_BASE=file node tools/probe-accuracy-validation.mjs.

Covered tests

DC AI (datahallAI.html):

  • AI-Test-1a–1f: PUE = 1.30, WUE = 0.00, CUE_IT = 0.90, IT = 14.26 MW,

GPUs = 7,776, NVL72 = 108 domains.

  • AI-Test-2: basis KPIs identical across N reloads.
  • AI-Test-3a/b: terminology — no "NVL72 rack" ambiguity; "rack-pos"

present.

  • AI-Test-4: CDU 36/48 facility.
  • AI-Test-5: no "5 running = 40 MW" arithmetic error.
  • AI-Test-6: PUE colour is NOT green (informational neutral).
  • AI-Test-7a–7g: basis drawer carries formula / inputs / output /

scope / source / last-update / data-mode chip.

DC Conv (dc-conventional.html):

  • CONV-Test-1a/b: "Grid factor" label present; no bare "CUE 0.42"

mislabel.

  • CONV-Test-2a: no "CHWS SP 18.8" without secondary-loop label.
  • CONV-Test-3a/b: PUE = 1.45 on dashboard + side panel.
  • CONV-Test-4: WUE = 1.20 L/kWh IT.
  • CONV-Test-5: fuel autonomy labelled "bulk-tank @ site load".
  • CONV-Test-6: UPS A shows normal + failover percentages.
  • CONV-Test-7: dashboard basis KPIs identical across N reloads.
  • CONV-Test-8a–8d: Grid-factor drawer shows Formula / Source /

data-mode chip / CUE_IT relationship.

Notes

  • Probe documented in standarization/ACCURACY_VALIDATION.md

§"Acceptance tests (CI-gateable)" with run commands.

  • ROUND_TRIPS defaults to 3 (vs reviewer's 20× spec) for fast probe

cycle; raise via env if needed.

  • Engine files (datahall-model.js, datahall-calculations.js,

conv-engine.js) byte-identical. 57/57 + 22/22 tests pass.

Status: team review (docs 26 + 16) now CLOSED

PhaseShipsWhat
Phase 1v1.32.18 critical bugs fixed (AI-ACC-01/02/03/05/06/07/08 + CONV-ACC-01/02/04/08)
Phase 2v1.32.6Terminology + UPS 2N + CHW reconciliation (AI-ACC-04/09 + CONV-ACC-03/05)
Phase 3v1.32.8Basis drawers on every top KPI (Rule 6 — display contract)
Phase 4v1.32.9Puppeteer probes for all 15 acceptance tests

All 19 reviewer findings closed; 1 standardisation doc shipped

(ACCURACY_VALIDATION.md); BMS_SHELL.md adoption table updated;

memory propagated (feedback_handoff_mandate.md +

project_rz_accuracy_review_2026-05-23.md).

v1.32.8 PATCH

KPI Basis Drawers — ACCURACY_VALIDATION Rule 6, both cockpits

Phase 3 of the team-review accuracy work. v1.32.1 fixed critical bugs;

v1.32.6 swept terminology + UPS 2N + CHW reconciliation; v1.32.8 closes

the reviewer's "Required KPI Display Contract" by making every top-strip

KPI clickable to open a basis drawer with formula / inputs / output /

scope / denominator / source / data-mode / last-update.

(Authored locally as v1.32.7. Parallel session shipped v1.32.7 with the

Network Visualization Hub plan v2 mid-push; this lands as v1.32.8.)

Added (both cockpits)

  • DC AI dashboard (datahallAI.html) — 8 KPI cards now clickable

(PUE / WUE / CUE / IT Load / GPUs / NVL72 / Uptime / Alarms). Each

opens a drawer with the full basis contract per

ACCURACY_VALIDATION.md Rule 6.

  • DC Conv dashboard (dc-conventional.html) — 7 KPI cards

clickable (PUE / WUE / Grid factor / IT Load / Uptime / Temp /

Chillers). Same drawer pattern.

Drawer contents (per KPI)

  • Title + Data mode chip (DERIVED / BOD LOCKED / SIM SENSOR /

DESIGN PLACEHOLDER) in header.

  • Formula — the exact governing equation, monospace.
  • Inputs — table of input values pulled live from

DATAHALL_CALC / CONV_CALC.

  • Output — the computed value, green highlight.
  • Scope + Denominator — side-by-side; closes the reviewer's

CONV-ACC-01 / AI-ACC-03 denominator-ambiguity concern.

  • Source object — exact engine-method or model field name,

monospace purple (e.g. DATAHALL_CALC.pueBasis()).

  • Last update — timestamp + "deterministic" note (per Rule 2 the

engine snapshot does not drift).

  • Engineering note — amber-left-bar callout explaining

non-obvious context (e.g. "Chiller COP is NAMEPLATE, not

back-solved"; "Grid factor is NOT CUE — CUE_IT = grid × PUE").

UX

  • Click OR keyboard (Enter / Space) on focused card opens drawer.
  • Escape, backdrop-click, or × button closes.
  • aria-modal=true + aria-labelledby on the dialog.
  • Each card has tabindex=0 + role=button + descriptive

aria-label for keyboard / screen-reader.

Reviewer findings closed by this ship

  • AI-ACC docs §"Required KPI Display Contract" — basis drawer per KPI

with `label / value / unit / basis / source / scope / state /

last update`. Done across all 15 top-strip KPIs across both

cockpits.

  • CONV-ACC docs §"Add KPI Basis Drawer" — same.

Notes

  • Engine files (datahall-model.js, datahall-calculations.js,

conv-engine.js) byte-identical. 57/57 + 22/22 tests pass.

  • v1.32.8 — Puppeteer probes for the reviewer's 7 + 8 acceptance

tests, gated in CI.

v1.32.6 PATCH

Accuracy review terminology + UPS 2N + CHW flow reconciliation — review docs 26 / 16 phase 2

Phase 2 of the team-review accuracy work. v1.32.1 fixed the 8 critical

bugs (random KPIs, denominator mislabels, arithmetic errors). v1.32.2

addresses the remaining medium-priority findings: terminology, UPS 2N

loading nuance, CHW flow reconciliation. Engine files byte-identical;

57/57 + 22/22 tests pass.

DC AI (datahallAI.html)

  • AI-ACC-04 swept: "kW/rack" → "kW/rack-pos (2/NVL72)" across the 4

DATAHALL room labels (SVG rmLive blocks) + "Per rack ~66 kW" →

"Per rack-pos ~66 kW IT (2/NVL72 footprint)" on the Electrical SLD

hall-spec captions. Engine keeps the 2-rack-footprint basis (real-world

AI deployments split NVL72 across two 600 mm racks for weight ~1,360

kg + cabling + serviceability). Only the UI labels rename so a

reviewer doesn't confuse 66 kW with NVIDIA's NVL72 rack-scale spec.

  • AI-ACC-09 fixed: UPS A/B row Online 79% (was ambiguous about

whether 79% is normal or failover loading) → 40% nrm / 79% fail.

Normal-sharing percentage = engine.upsLoadPct ÷ 2. Failover (one-side

carries protected load) = engine.upsLoadPct. Tooltip explains both.

JS removed the small live jitter; values now deterministic per

ACCURACY_VALIDATION.md Rule 2.

  • AI-ACC-10 — chiller "12/16" already labelled "design placeholder"

with tooltip basis chip in v1.32.1; no further change.

DC Conv (dc-conventional.html + chiller-plant.html)

  • CONV-ACC-05 fixed: UPS A 72% / B 68% (decorative greens, no

failover info) → 46% nrm / 92% fail. Normal-sharing = (it_load ÷ 2)

÷ 2 MW rated. Failover = it_load ÷ 2 MW rated. Bound via

snapshot.electrical.ups_module_kw.

  • CONV-ACC-03 fixed: chiller-plant adds new "CHW Flow Reconciliation"

card showing design flow (IT-load basis, 58.2 L/s) vs sanity flow

(heat-rejection basis IT+UPS, 60.6 L/s) vs Δ (+4.1 %). Pumps sized to

the larger figure; chiller-plant ΔT setpoint references the design

value. Surfaces the doc-09 design choice so it no longer reads as a

hidden mismatch.

  • CONV-ACC-06 — Tech Spec Appendix B already lists 3 densities with

explicit kW/rack labels (v1.31.3). Confirmed; no further change.

  • CONV-ACC-09 — data-mode chips already present on every cockpit page

(ict.html · water-system.html · fire-system.html · chiller-plant.html ·

dc-conventional.html · datahall.html · fuel-system.html · EPMS).

Audited and confirmed engine-bound across all 8 pages. No further

change.

Critical pushback held (carried from v1.32.1)

  • Engine 2-rack-footprint basis retained — labels changed, not the

arithmetic. Defensible against reviewer's "align to NVIDIA's 120 kW"

framing.

  • CUE_IT binding to PLN Java grid 0.69 kgCO₂/kWh retained as the

citation-grade option (vs reviewer's "Not calculated" fallback).

Notes

  • Engine files (datahall-model.js, datahall-calculations.js,

conv-engine.js) byte-identical. 57/57 + 22/22 tests pass.

  • v1.32.3 — basis drawers per ACCURACY_VALIDATION.md Rule 6 (every top

KPI opens a formula/inputs/output/scope/denominator/source/mode/

timestamp drawer).

  • v1.32.7 — Puppeteer probes for the reviewer's 7 DC AI + 8 DC Conv

acceptance tests, gated in CI.

v1.32.1 PATCH

Critical accuracy fixes per team review docs 26 + 16 — owner exclusion lifted

Owner directive 2026-05-23: "review comment team saya, dan sempurnakan, dan

implementasikan. saya tidak mau anda hanya agrreeing aja. plan mode. harus

kritis." Two team review docs delivered: `Documents/screenshot bms rz/dc ai/

review/26-accuracy-validation-and-correction-list.md` (10 DC AI findings)

  • .../conv/review/16-accuracy-validation-and-correction-list.md (9 DC

Conv findings). Critical assessment captured in

[memory/project_rz_accuracy_review_2026-05-23.md].

Owner exclusion change: #p-dash panel + updateDashKPI() +

dcCallouts byte-identical mandate (locked since BMS Shell adoption,

v1.23.x → v1.31.x) is LIFTED for the accuracy-binding work. Engine

files (js/datahall-model.js, datahall-calculations.js,

js/conv-engine.js) remain byte-identical.

DC AI — datahallAI.html

  • AI-ACC-01 fixed: dashboard IT load 28.5 MW → 14.26 MW (Scenario A).
  • AI-ACC-02 fixed: PUE 1.08 → 1.30 derived (engine bottom-up). Colour

swapped green → cyan (informational neutral) per ACCURACY_VALIDATION.md Rule 4.

  • AI-ACC-03 fixed: WUE 0.42 random → 0.00 dry-only baseline. CUE

0.38 random → CUE_IT 0.90 kgCO₂/kWh IT (PLN Java grid 0.69 × PUE 1.30

per ISO/IEC 30134-8).

  • AI-ACC-05 fixed: CDU 96/96 N+1 (33.6 MW overspec) → 36/48 fac · 9/12 hall.
  • AI-ACC-06 fixed: "5 running = 40 MW" arithmetic error → 7 running

= 19.25 MW for 18.55 MW facility via DHE.gensetFacN × DHE.gensetMW.

  • AI-ACC-07 fixed: Math.random() removed from PUE / WUE / CUE / IT /

per-hall / totals. Sensor jitter (outdoor weather only) retained per

reviewer allowance. Reload-20× test: basis KPIs identical.

  • AI-ACC-08 fixed: colour grammar updated.

DC Conv — dc-conventional.html + chiller-plant.html

  • CONV-ACC-01 fixed: dashboard Carbon 0.42 → `Grid factor 0.42

kgCO₂/kWh facility`; side panel adds CUE_IT 0.61 kg/kWh IT tile.

  • CONV-ACC-02 fixed: CHWS SP 18.8CSecondary loop SP 18.8C;

primary CHWS 7.2 °C label preserved.

  • CONV-ACC-04 fixed: fuel autonomy 48 hrs → `48 hrs · bulk-tank @

site load`.

  • CONV-ACC-08 fixed: Tech Spec PDF Appendix A.3, A.9, Section 9,

Section 1 headline table all distinguish grid factor (facility-kWh)

from CUE_IT (ISO/IEC 30134-8 IT-kWh). DC AI Appendix A.10 similarly

tightened.

Standardisation

  • New standarization/ACCURACY_VALIDATION.md (6 rules + 7 DC AI + 8 DC

Conv acceptance tests).

  • standarization/BMS_SHELL.md adoption table + owner-exclusion-lift record.

Critical pushback (not blindly agreeing)

  • AI-ACC-04 terminology: kept engine 2-rack footprint basis (real-world

AI deployments split NVL72 across 2 racks for weight / cabling /

serviceability). Only relabel UI in v1.32.2.

  • AI-ACC-03 CUE: chose to bind PLN Java grid factor + derive CUE_IT (vs

reviewer's "Not calculated" recommendation). Cited, defensible.

  • Reviewer's Display Contract (basis drawer per KPI): deferred to v1.32.3.

Coordination note

Authored locally as v1.32.0. Parallel session shipped v1.32.0 (AI

Engineering Maintenance concept page) before push; this lands as

v1.32.1 atop their work.

Notes

  • Engine files byte-identical. 57/57 + 22/22 tests pass.
  • v1.32.2 — terminology + label sweep (AI-ACC-04/09/10, CONV-ACC-03/05/06/09).
  • v1.32.3 — basis drawers per Rule 6.
  • v1.32.4 — Puppeteer probes for acceptance tests.
v1.32.0 MINOR

AI Engineering Maintenance — concept page; FMECA + KG + ML + NLP synthesis

R-016 — ai-engineering-maintenance.html (1,441 lines) ships the

concept-and-design document for the prescriptive-maintenance engine,

synthesised from Lin & Ompusunggu (2026), *Artificial Intelligence for

Engineering*, https://doi.org/10.1049/aie2.70019.

What landed

  • Standalone HTML, gated by enforceTierFeatureAccess('ai-engineering-maintenance')

via the 4-tier matrix (Pro + Educator + Root pass).

  • 8 sections (concept summary · 4-module block diagram · per-module cards ·

two interaction modes side-by-side · case-study numbers (Macro F1 84.84%,

spalling 77.98% weakest) · 12 engineering gaps + enhancements (<details>

accordions) · enhanced-architecture big SVG · 5-phase build roadmap ·

open questions for owner).

  • 12 SVG diagrams drawn in brand industrial-instrumentation style

(thin 0.6-1.4 px lines, instrument-cyan + signal-amber; NO Anthropic-purple).

  • DC Solutions card wired: COMING SOONPRO; opens cleanly.
  • Site integration: sitemap, search-index, llms.txt, feature-flags.
  • All audit gates green; mobile-responsive 10/10.

Not built yet

The actual maintenance engine. This is concept + roadmap; build phases

1-5 await owner sign-off on scope + asset inventory + CMMS choice.

v1.31.4 PATCH

Tech Spec PDF — Section 10 Cost Annex on both DC AI and DC Conv

Owner direct ask: "Perhitungan utk tech spec bisa gunakan engine capex,

opex calculator dan calculator2 lain." Rather than coupling each Tech

Spec to the page-local capex/opex calculator IIFEs (cross-page,

brittle), each Tech Spec now carries its own Section 10 Cost Annex

that applies cited public parametric ranges to the engine’s live

facility kW figure. Self-contained, engine-derived, reproducible.

Added (both Tech Spec PDFs)

  • Section 10 — Cost Annex with 5 worked calculations: CAPEX,

annual power OPEX, annual maintenance OPEX, total annual OPEX,

10-year TCO (un-discounted). All values rounded with the

per-page fmtUsd() helper. Sensitivity grid (tariff sweep

$0.06/$0.09/$0.12 per kWh).

  • DC AI uses AI-factory CAPEX band ($10–$14 M / MW IT) with a

GPU-economics framing noting silicon CAPEX (Blackwell ×

facility GPU count) typically dwarfs facility CAPEX by a multiple.

  • DC Conventional uses enterprise CAPEX band ($7–$11 M / MW IT)

with a "conventional vs AI factory" comparison paragraph.

Sources (cited in tables)

  • JLL Data Center Construction 2024-2025 (CAPEX bands)
  • Cushman & Wakefield Data Center Report (CAPEX corroboration)
  • BP Statistical Review / IEA (industrial electricity tariffs)
  • Uptime Institute MAINT benchmark (maintenance %)

Notes

  • Indicative only. Disclaimer in 10.5 / banner: site-specific factors

(land, utility connection, sales tax, labour, climate, FX) move

CAPEX by ± 30 % between geographies.

  • Engine files byte-identical. 57/57 + 22/22 tests pass.
v1.31.3 PATCH

DC Conventional Tech Spec PDF — full discipline expansion: Cooling, Water, Fire, Fuel, ICT/EPMS/BMS, Carbon + appendices B + C

v1.30.1 shipped the scaffold + Power discipline. This ship expands the

DC Conventional Tech Spec PDF (dc-conventional.html → Generate

Design) to the full discipline coverage. Every number derived live from

window.CONV_CALC.snapshot.

Added (DC Conventional Tech Spec PDF only)

  • Section 4 — Cooling Discipline: 5 worked calculations (CHW

ΔT, UPS losses, heat rejection, CHW flow, cooling overhead share)

all derived from snapshot.cooling.* + snapshot.electrical.ups_loss_kw.

CRAH topology table.

  • Section 5 — Water Discipline: WUE-based instant make-up flow

(matches doc-09 37 L/min canonical) + annualised water estimate.

  • Section 6 — Fire & Life Safety: 7-step detection/control

sequence, references table (VESDA + clean agent + sprinkler back-up).

  • Section 7 — Fuel System: 3 worked calculations (usable

volume, autonomy, day-tank cadence). Fuel quality & maintenance

list (polishing cadence, water content, microbial check, annual

load-bank test).

  • Section 8 — ICT, EPMS & BMS: EPMS scope table (facility

total, UPS output, per-module load), BMS tag taxonomy (ISA-5.1), trend

cadence by class, alarm philosophy paragraph.

  • Section 9 — Carbon & Sustainability: 2 worked

calculations (instant kg/hr, annualised kg/yr) matching doc-09 1,127

kg/hr canonical. Decarbonisation options framing.

  • Appendix A — Formula Derivations: expanded A.1–A.10

with full derivations (PUE, WUE, CUE, ΔT, UPS loss, heat

rejection, CHW flow, fuel autonomy, EPMS metering tolerance).

  • Appendix B — Sensitivity Analysis: PUE swing ± 0.05,

CHW ΔT sensitivity (affinity-law cube), fuel level vs autonomy

ladder, rack-density at 6 / 8 / 10 kW/rack.

  • Appendix C — Index: 10-section anchor list, appendix list,

reproducibility caveat.

Pattern

  • All numbers live-derived from window.CONV_CALC.snapshot.site,

cooling, electrical, environment, fuel, water, racks.

Nothing hardcoded that the engine exposes.

  • </script> escapes preserved per PDF_EXPORT_STANDARD.md.
  • Added local round1() helper inside buildTechSpecHtml() so the conv

Tech Spec is self-contained (no dependency on CONV_CALC.round1).

Notes

  • js/conv-engine.js byte-identical — the Tech Spec reads from

it, does not modify. 22/22 conv tests pass.

  • This completes the v1.30.x → v1.31.x cockpit Tech Spec arc.

Both DC AI (v1.31.2) and DC Conv (v1.31.3) now have full discipline

coverage. v1.31.4 will polish the print-CSS for tighter pagination if

the owner reports issues; otherwise the next ship returns to whatever

the owner queues next.

v1.31.2 PATCH

DC AI Tech Spec PDF — full discipline expansion: Electrical, Cooling, Fire, Network, BMS + appendices B + C

v1.30.1 shipped the scaffold and the Compute discipline. This ship

expands the DC AI Tech Spec PDF (datahallAI.html → Generate Design)

to the full discipline coverage: Electrical (2N, UPS, transformer,

busway, generator, battery), Cooling (CDU + chiller + CRAH + PUE 5-part

basis decomposed), Fire & Life Safety (NFPA 2001 indicative agent

mass, detection sequence), Network & ICT (NVLink, spine-leaf

IB/RoCE), BMS (ISA-5.1 tag taxonomy, trend cadence, first-out logic).

Added (DC AI Tech Spec PDF only)

  • Section 4 — Electrical Discipline: ~7 worked calculations

(line current, kVA, UPS loading, transformer loading, UPS battery,

generator count, busway headroom) all derived from

CALC.lockedState() + CALC.batteryKWh(). Equipment cut-sheet anchor

table. Embedded SLD figure.

  • Section 5 — Cooling Discipline: ~8 worked calculations

(liquid/air heat split, TCS total & per-rack flow, CDU running

count, per-CRAH heat & FWS flow, chiller compressor input, PUE

bottom-up). Full 8-line PUE 5-part basis decomposition table.

Embedded Cooling P&ID figure.

  • Section 6 — Fire & Life Safety: indicative NOVEC 1230

agent-mass estimate per NFPA 2001 design-concentration formula

(with the caveat that final cylinder count needs vendor

hydraulic-calc software). Detection & control sequence in 6

numbered steps.

  • Section 7 — Network & ICT: topology summary table.

Two worked sizing calculations (leaf port count, cable count).

  • Section 8 — BMS & Telemetry: ISA-5.1 tag taxonomy

table, trend cadence by class, alarm philosophy paragraph.

  • Appendix A — Formula Derivations: expanded A.1–A.10.
  • Appendix B — Sensitivity Analysis: PUE vs chiller COP

(±10 %), liquid-capture framing, Scenario A vs B side table.

  • Appendix C — Index: auto-numbered table/figure list.

Notes

  • Engine files byte-identical. 57/57 + 22/22 tests pass.
  • #p-dash + dcCallouts byte-identical (owner exclusion).
  • dc-conventional.html Tech Spec stays at v1.30.1 scaffold —

full discipline expansion ships in v1.31.3.

Coordination note

Authored locally as v1.30.2. Parallel cf-worker session shipped v1.31.0

(FT analytics) and v1.31.1 (DC Solutions placeholder card) mid-push;

this release lands as v1.31.2 atop their work.

v1.31.1 PATCH

DC Solutions — AI Engineering Maintenance placeholder card

Added a 6th card to the Cost Calculators section on datacenter-solutions.html

alongside CAPEX / OPEX / DC MOC / Cx / RFS Readiness:

  • AI Engineering Maintenance — placeholder; concept brief pending owner.
  • Icon fa-screwdriver-wrench, tone #60a5fa blue-400 on rgba(96,165,250,0.18)

distinct from the 5 existing colors; NOT Anthropic-purple.

  • Badge: COMING SOON with hourglass icon (mirrors existing .ds-badge-pro shape).
  • href="#" + aria-disabled="true" + onclick toast "Coming soon. Concept brief in progress."
  • Tool count bumped 5 tools6 tools in section header.

Placeholder only. The actual page lands once owner provides the concept brief

(AI-assisted maintenance scheduling, predictive failure, asset-lifecycle ops).

(Shipped in commit a5e305b as the card-only change; this commit completes the

v1.31.1 metadata: version + sw cache + changelog.)

v1.31.0 MINOR

FT Phase 2 Task B — client analytics panel + buy/sell gauge widget per tab

R-002/R-003/R-008 client-side surfacing of v1.30.0's /analyze data.

Per-tab Analytics Panel rendering buy/sell gauge + signal chips +

indicator table + rationale + related news, flag-gated under CFG.V2.

What landed (all behind localStorage.rz_ft_v2 === '1')

  • renderGaugeSvg(score, label) — inline SVG semicircle, 7-band

color (red < 30 / amber 30-45 / grey 45-55 / mint 55-70 / green ≥ 70).

Reuses existing palette tokens — no Anthropic-purple, no new gradient.

  • renderAnalyticsPanel(containerId, analyze, news) — composes

gauge + trend/momentum/volatility/MA chips + 10-row indicator table

(RSI, MACD, SMA20/50/200, EMA20, Bollinger ±, ATR, Stoch K) + 5-line

rationale list (last line muted italic = "informational only" caveat)

  • top-3 related news from /news?topic=<sym>.
  • loadAnalyticsPanel(containerId, sym, tf) — async fetch + render,

graceful "Analytics unavailable — retry" on Worker failure.

  • Wired into 4 tabs:
  • Commodities (#cmdAnalyticsPanel, after the chart card,

sym=S.cmdSym, tf=S.cmdTf).

  • Crypto (#cryptoAnalyticsPanel, sym=<COIN>-USD, tf 3M).
  • Stocks (#stockAnalyticsPanel, sym=S.curStock).
  • FX (#fxAnalyticsPanel, sym=<PAIR>=X Yahoo format).
  • Mobile responsive (panel collapses to single column < 900px;

indicator grid 1fr ≤ 768px).

  • All </script> inside template strings properly escaped.

Verification

  • audit-js-syntax / audit-script-tags / audit-mobile-responsive — all

--strict CLEAN.

  • Live Puppeteer smoke: Commodities panel rendered for GLD/3M (3273

chars HTML; gauge + chips + indicators + rationale + news all present).

  • Crypto + FX tabs show graceful "Analytics unavailable" on dev

datacenter IP (Yahoo 429 for BTC-USD / EURUSD=X) — same upstream

constraint as v1.30.0; expected to resolve on Cloudflare edge in

production.

NOT in this commit (remaining Phase 2 sub-tasks)

  • C — Telegram alert push (Worker Cron evaluates server-side)
  • D — Email alerts via Resend free tier
  • E — /finnhub-webhook receiver

Not active on production — rz_ft_v2 flag still required + Worker

still pending deploy (worker/SETUP.md).

v1.30.1 PATCH

Generate Design Tech Spec PDF + FAQ on DC AI and Conventional DC cockpits — Phase 2 scaffold

Owner brief: "kasih tombol download Tech Spec PDF atur aja nama tombol itu

generate design itu... at least 200-300 halaman yang sangat detail. Dan ada

tombol FAQ juga." This ship adds the Generate Design + FAQ buttons on both

DC AI (datahallAI.html) and Conventional DC (dc-conventional.html) and

ships the ~60 pp scaffold of the Tech Spec PDF for each. Full ~210–220 pp

reach lands across v1.30.1 (DC AI all disciplines) and v1.30.2 (DC Conv all

disciplines).

Added

  • datahallAI.html header buttons: new 📑 Generate Design and ❓ FAQ

buttons alongside the existing Basis of Design trigger. Generate

Design opens a print-window with the multi-page Tech Spec PDF built

live from window.DATAHALL_CALC.lockedState() + pueBasis() +

DATAHALL_MODEL. FAQ opens a modal dialog with 10 Q/A pairs whose

answers are interpolated from the live engine state (PUE, IT, rack

count, GPU count, scenario lock label).

  • dc-conventional.html header buttons: same pair (genDesignTrigConv

/ faqTrigConv). Tech Spec built from window.CONV_CALC.snapshot.

FAQ Q/A pairs interpolate site.pue, site.it_load_kw,

datahall.racks_total, etc.

  • standarization/TECH_SPEC_PDF.md: new standardization doc covering

the build pattern, page CSS conventions, FAQ dialog convention,

verification gates, and v1.30.x roadmap.

Pattern

  • The Tech Spec PDF reuses the proven `window.open('', '_blank') +

document.write(html) + win.print()` pattern from the existing Basis of

Design PDF on the DC AI cockpit. Helper functions (E, R, TC,

WK, grabSVG) inline to keep each page's build self-contained while

the formatting stays consistent across both cockpits.

  • All <\/script> escapes in PDF template strings observed per

standarization/PDF_EXPORT_STANDARD.md.

  • v1.30.0 scaffold pages: Title · TOC · Exec Summary · Site & Facility ·

Anchor Discipline (Compute for DC AI, Power for DC Conv) · 4–8

placeholder anchors · References · Appendix A formula derivations.

Notes

  • Engine files (js/datahall-model.js, js/datahall-calculations.js,

js/conv-engine.js) byte-identical. 57/57 + 22/22 engine tests pass.

  • #p-dash panel + updateDashKPI() + dcCallouts byte-identical (owner exclusion).
  • Audit gates: audit-script-tags / audit-js-syntax / audit-version-stamp /

audit-mobile-responsive all CLEAN.

Owner direct quotes

  • "Baik di DC AI dan DC conventional kasih tombol download Tech Spec PDF

atur aja nama tombol itu generate design itu. Ada angka rack, dimensi

dll dan ada detail math calculationnya di pdf dg sangat detail dari

penentuan spec, cap, type, set point parameter deaign, basis standard

dll at least 200-300 halaman yang sangat detail."

  • "Dan ada tombol FAQ juga.ini masing2 ya dc ai sendiri dc conventional sendiri."
  • "Perhitungan utk tech spec bisa gunakan engine capex, opex calculator

dan calculator2 lain." → engine binding to DATAHALL_CALC + CONV_CALC

delivered today; capex/opex/tco/roi/pue rollups will join in v1.30.2.

Coordination note

The parallel cf-worker session shipped its own v1.30.0 (FT Phase 2 Task A —

/analyze endpoint) earlier today. This ship lands as v1.30.1 atop their

release.

v1.30.0 MINOR

FT Phase 2 Task A — /analyze endpoint: TA indicators + composite buy/sell gauge + ensemble prediction

R-002 + R-003 + R-004 foundation. Worker /analyze?sym=&tf= returns

TA indicators (RSI, MACD, SMA, EMA, Bollinger, ATR, Stoch) + signal

labels (trend / momentum / volatility / ma_cross) + composite buy/sell

gauge (0-100 score, 7-band label, weighted 35/25/20/15/5) + ensemble

prediction with transparent rationale (≤5 entries, ending with

"Informational only — not a forecast").

Pure-math worker/src/lib/{ta,gauge}.js. KV cached 60s + stale-on-error.

24 new tests, 62/62 pass total. Added to cron prewarm so popular

symbols stay hot. Client UI integration + alerts delivery + Finnhub

webhook are remaining Phase 2 sub-tasks.

Not active on production — rz_ft_v2 flag still required + Worker

still pending deploy (worker/SETUP.md).

v1.29.3 PATCH

BMS cockpit Phase 1 mobile fixes — wired datahall view-mode toolbar + chiller right-edge overflow + water-system process-flow overlap

Three small surgical mobile fixes owner asked for in this round of screenshots,

plus prep for Phase 2 (Generate Design Tech Spec PDF + FAQ on DC AI / DC Conv,

shipping in v1.30.0).

Fixed

  • datahall.html view-mode toolbar now drives the rack heatmap. Owner image 1:

"Toggle atau pilihan apa ini yg saya lingkari nggak tahu fungsinya di pencet2

g ada fungsi." The 5-button top toolbar (POWER / TEMPERATURE / COOLING MARGIN

/ SPACE / ALARMS) was a visual scaffold in v1.24.1 — only body[data-dh-mode]

was set, no render path. Now: radio-style toggle delegates to the existing

window.setMode(), paints the rack floor, syncs the centre .mode-bar

buttons. A new cooling-margin mode tints racks by ASHRAE A1 27 °C high

margin (>5°C green / 3–5 muted green / 1–3 amber / <1 deep amber / over =

red). Legend updates per-mode.

  • chiller-plant.html right-edge panels stop bleeding off mobile viewport.

Owner image 2: "Ini pada keluar2." Plant Capacity / Loop Summary / Drawing

Info panels live at x=1520–2280 in viewBox 2300. v1.25.4 only set

min-width:1200px so half the right edge was off the rendered SVG. Bumped to

min-width:2300px at ≤1280px and split into two breakpoints (≤760px

drops to 1600 for thumb-pan reachability). Status-strip chips wrap properly

and no longer push a second horizontal scrollbar.

  • water-system.html process-flow labels no longer stack. Owner image 3:

"Ini juga saling bertumpuk2." viewBox 0 0 1180 460 was squished to 760px

min-width on mobile, collapsing DOS-302 / P-301 / TK-402 / CT-MK labels onto

each other. Bumped to min-width:1180px at ≤1024px and ≤768px so labels

stay at design coordinates and the user pans horizontally. Equipment-block

fill bumped from #0f1a2e thin to #14213a opaque slate per the v1.25.4

EcoStruxure-grade solid-panel mandate owner approved earlier.

Notes

  • Engine files (js/datahall-model.js, js/datahall-calculations.js,

js/conv-engine.js) byte-identical. 57/57 + 22/22 engine tests pass.

  • #p-dash panel + updateDashKPI() + dcCallouts byte-identical (owner exclusion).
  • BMS Shell adoption table in standarization/BMS_SHELL.md updated.
v1.29.2 PATCH

Restore sw.js NETWORK_FIRST_PATHS for auth files — accidentally removed in v1.29.1

Hot-fix: v1.29.1's BMS-cockpit ship (c4bc870) had collateral edits to

sw.js that removed the v1.29.0 critical-asset network-first logic

(NETWORK_FIRST_PATHS, isNetworkFirst(), networkFirstCriticalAsset()).

Without those, /auth.js falls back to cache-first → users on stale SW

can re-hit the "Invalid email or password" stale-cache trap that

v1.29.0 was shipped specifically to prevent.

What landed

  • sw.js: restored `NETWORK_FIRST_PATHS = ['/auth.js', '/auth.min.js',

'/js/rz-version.js', '/js/rz-feature-flags.js'] + isNetworkFirst()` +

networkFirstCriticalAsset() helpers + fetch-handler dispatch line.

  • Cache bump rz-cache-v1.29.1rz-cache-v1.29.2 so existing service

workers re-install with the network-first logic in place.

Why this matters

Phase 4 admin UI + Phase 3 client refactor + Phase 1 educator role all

depend on visitors getting the LATEST auth.js after a deploy. Without

NETWORK_FIRST_PATHS, a stale SW can serve auth.js from rz-cache-v1.28.0

or earlier indefinitely, breaking login for anyone who'd visited before

the deploy. The "Try fresh reload" rescue link in the login modal

(also v1.29.0) is the last-line UX recovery; this commit restores the

silent-recovery primary path.

Coordination note

The v1.29.1 commit was authored on a checkout that branched before

v1.29.0 shipped (their local was at v1.25.3). On rebase/merge, the

sw.js edits there resolved against an older shape. Both branches are

now in sync at v1.29.2.

v1.29.1 PATCH

Cockpit SVG mobile readability + EcoStruxure-grade solid panels + kill rotating-triangle pump animation

Owner-reported (mobile screenshot) — three concrete issues fixed plus a

queued engineering-value audit doc shipped. (Was authored as v1.25.4

locally; renumbered v1.29.1 after rebase onto remote v1.29.0.)

Fixed

  • Rotating-triangle pump animation removed (owner: "ngapain segitiganya

muter, jadi terkesan bug"). The ISA pump-symbol triangle no longer

rotates 360° forever. Green fill stays as the ON indicator (standard

SCADA pattern). datahallAI.html .pmp rule line 167 + same fix added

to chiller-plant.html for any future pmp use.

  • Cooling P&ID equipment-block opacity bumped from glassy to solid

(owner: "agak solid seperti EcoStruxure"). Block backgrounds bumped

rgba alpha .03/.04 → .25; header tints .06 → .35; strokes `.20 →

.55`. Targets the 6 major shells visible in the screenshot: CW Pump

Station + CW Pump Group + Chiller Plant + FWS Pump Station + CDU Array

  • TCS+Racks (datahallAI cooling IIFE).
  • Cockpit SVG mobile responsive sizing fixed (owner: "kotak2 tumpang

tindih, hitung based on aspect ratio responsive"). On ≤1024 px the

panel wrappers gain overflow-x:auto + the SVGs gain min-width:720 px;

on ≤600 px min-width:640 px. Industry-standard SCADA approach:

diagrams keep their design width and the user pans horizontally

instead of squishing everything into 390 px. #p-dash excluded via

.pn:not(#p-dash) .bx svg selector.

  • Same responsive treatment added to chiller-plant.html #pidSvg

(min-width 1200 px @≤1024 / 960 px @≤600 + .pid-panel{overflow-x:auto}).

Added

  • documentation/engineering-value-audit-v1.md — captures the

broader engineering-value review.

Preserved

  • js/datahall-model.js + js/datahall-calculations.js byte-identical.

57/57 datahall + 22/22 conv engine tests pass.

  • #p-dash + updateDashKPI() + dcCallouts byte-identical.

Verified

  • 4 strict audit gates CLEAN.

Standardization updated

  • standarization/BMS_SHELL.md v1.29.1 entry; documentation/engineering-value-audit-v1.md NEW.
v1.29.0 MINOR

R-015 Phase 4 admin UI + login-modal stale-cache rescue + sw network-first for critical assets

Phase 4 admin UI shipping (flag-gated)

R-015 Phase 4 — rz-ops-p7x3k9m.html gains full admin UI for the new

auth backend, all behind localStorage.rz_auth_v2 === '1':

  • User Management extended: Add User modal, row actions

Edit/Reset-Password/Disable/Delete, status badges (active/disabled).

  • NEW Tier Manager sidebar section: per-tier cards (label, priority,

color, isSystem lock), per-tier feature-defaults editor consulting

/admin/pages, Create / Edit / Delete tier flows.

  • Audit Log viewer extended with Server (worker-backed) / Client

(legacy localStorage) source toggle + actor email filter.

  • All admin requests include X-CSRF-Token from __rzAuth.getCsrf().
  • New CSS prefix .rz-admin-v2-* to isolate from existing UI.
  • E2E Puppeteer probe tools/probe-rz-ops-admin.mjs covers full

Add/Edit/Delete/Tier-CRUD/Audit flow (14/14 PASS, including 403 path

for non-root sessions).

Login-modal stale-cache rescue (fixes user-reported "Invalid email

or password" after deploying educator account)

User reports of "still can't login" after v1.26+ deploys traced to

service-worker caching of pre-educator auth.js. The new SW (v1.28.0+)

correctly invalidates old caches on activation, but EXISTING visitors

remained on the previous SW until next install/activate cycle.

  • sw.js network-first for critical auth files

/auth.js, /auth.min.js, /js/rz-version.js, /js/rz-feature-flags.js

always fetched from network first when online (cache fallback only on

offline). Prevents stale-cache traps even when the visitor's SW is one

version behind.

  • Login-modal recovery link — "Try fresh reload" inline link on

"Invalid email or password" now unregisters service workers, clears

caches, wipes auth localStorage, and reloads. Applied to both

AUTH_V2 and legacy catch branches so it's reachable on either auth path.

Verification

  • worker-auth/: tests still 94/94 PASS.
  • tools/probe-rz-ops-admin.mjs 14/14 PASS.
  • audit-js-syntax / audit-script-tags / audit-mobile-responsive

/ audit-version-stamp — all --strict CLEAN.

v1.28.0 MINOR

R-015 Phase 3 — client auth.js refactor, flag-gated rz_auth_v2

auth.js now talks to rz-auth-gateway when localStorage.rz_auth_v2 === '1'.

Flag default OFF — when off, behavior byte-identical to the hardcoded

VALID_USERS mock (no regression for any existing user).

What landed (all behind AUTH_V2 flag)

  • auth.js (+197 lines) — additive:
  • AUTH_V2 + AUTH_GW config block (reads localStorage.rz_auth_v2 + rz_auth_gw)
  • gw(path, opts) — fetch helper with credentials:include + CSRF header
  • loginV2(email, password) — POST /auth/login (cookie set by Worker)
  • logoutV2() — POST /auth/logout + clear local mirror
  • hydrateSessionFromWorker() — GET /auth/me on page load
  • Login modal + logout button + initial-load hydrate all guard if (AUTH_V2)
  • __rzAuth.getCsrf() public helper (Phase 4 admin UI consumes)
  • auth.min.js rebuilt with terser (--reserve loginV2,logoutV2,hydrateSessionFromWorker,gw)
  • worker-auth/test/client-auth-shape.test.mjs — 5 new tests pinning the Worker contract from the client's perspective (cookie shape, expiresAt seconds vs ms, CSRF lifecycle)
  • worker-auth/SETUP.md §7 — per-browser activation guide

Activation (per-browser opt-in)

After Worker is deployed:

localStorage.setItem('rz_auth_v2', '1');
localStorage.setItem('rz_auth_gw', 'https://<worker-url>.workers.dev');
location.reload();

When the worker is stable across user testing, a future release will flip

AUTH_V2 default to true in auth.js.

Safety

  • Worker unreachable when flag ON → explicit "Auth service unavailable —

retry" UX rather than silent fallback to mock (per plan §6 threat model;

silent fallback would mask real outages and let admin actions vanish).

  • Hardcoded VALID_USERS array UNCHANGED — flag-off fallback still works.

Removal scheduled for a future MAJOR after ≥1 stable release of v2.

NOT in this commit (Phase 4+)

  • rz-ops Tier Manager UI + user CRUD UI — Phase 4
  • E2E probe + reviews + flag-default flip + ship — Phase 5

Tests

worker-auth/: 94/94 pass (was 89, +5 client-shape).

node --check on auth.js + auth.min.js OK.

audit-js-syntax --strict + audit-script-tags --strict CLEAN.

v1.27.2 PATCH

R-015 Phase 2 — admin CRUD endpoints on rz-auth-gateway

Infrastructure-only ship (no user-visible behavior change on the static

site). Adds 11 admin endpoints to rz-auth-gateway, gating every state

change behind role === 'root' + X-CSRF-Token + audit-log.

What landed

  • worker-auth/src/handlers/admin.js (NEW, 618 lines) — 11 handlers:
  • GET /admin/users (paginated list, sanitized — no hash/salt exposed)
  • POST /admin/users (create with PBKDF2 hash, validates uniqueness + tier + role)
  • PATCH /admin/users/:email (tier/role/status/featureOverrides; 404 + audit before/after)
  • POST /admin/users/:email/reset-password (new salt+hash; best-effort revoke existing sessions)
  • DELETE /admin/users/:email (soft-disable; ?hard=1 removes; root hard-delete blocked)
  • GET /admin/tiers (sorted by priority, full feature matrix)
  • POST /admin/tiers (slug + color hex + uniqueness validation; isSystem:false)
  • PATCH /admin/tiers/:name (label/color/priority/defaultFeatures; system-tier rules)
  • DELETE /admin/tiers/:name (rejects system; rejects when ≥1 user attached)
  • GET /admin/pages (23-entry static page-key registry for matrix UI)
  • GET /admin/audit (chronological log, filter by actor/action/date range)
  • worker-auth/src/data/page-keys.js (NEW) — static page registry (DC AI,

DC Conv, DCMOC, 8 LTC labs, calculators, etc.)

  • worker-auth/src/middleware.jsrequireAdmin(), requireCsrf(),

timing-safe string compare.

  • worker-auth/SETUP.md §5 — shell walkthrough for admin operations

before Phase 4 UI lands.

  • TDD: 50 new admin tests across 5 suites. 89/89 total pass.

NOT in this commit

  • Phase 3: client auth.js refactor to call /auth/login (next)
  • Phase 4: rz-ops Tier Manager UI + user CRUD UI
  • Phase 5: E2E probe + reviews + ship

Static site unaffected — auth.js still uses hardcoded VALID_USERS.

v1.27.1 PATCH

R-015 Phase 0+1 — rz-auth-gateway Worker scaffold + login/seed endpoints

Infrastructure-only ship (no user-visible behavior change on the static

site). Lands the foundation for R-015 "self-service user management" —

the long-term replacement for the hardcoded VALID_USERS array in

auth.js.

What landed

  • worker-auth/ — new Cloudflare Worker (rz-auth-gateway) with

PBKDF2 password hashing, HMAC-signed sessions, login rate-limit,

audit log.

  • Endpoints (Phase 1): POST /auth/login, POST /auth/logout,

GET /auth/me, GET /auth/features, GET /auth/tiers/public,

POST /admin/__seed (one-time bootstrap migration, self-disables).

  • 39/39 unit tests (5 endpoint suites + crypto + health/CORS).
  • worker-auth/SETUP.md — owner-step provisioning guide.
  • docs/plans/2026-05-22-user-mgmt-self-service.md — full R-015 plan.

NOT in this commit (Phase 2+ follow-ups)

  • Admin CRUD endpoints — Phase 2
  • Client auth.js refactor — Phase 3
  • rz-ops UI integration — Phase 4
  • E2E probe + reviews + ship — Phase 5

The static site keeps using the existing client-side mock auth until

Phase 3 lands.

v1.27.0 MINOR

Finance Terminal Phase 1 — Cloudflare Worker data gateway shipped behind rz_ft_v2 flag

R-001..R-005 + B-002..B-012 — Finance Terminal (embedded as iframe in

rz-ops-p7x3k9m.html) gains a Cloudflare Worker (rz-finance-gateway)

that fixes every broken tab. **Feature-flagged: OFF by default. No

behavior change for any user until localStorage.rz_ft_v2 === '1'

is set OR the flag default is flipped in a future release.**

What landed (all under flag)

  • worker/ — new Cloudflare Worker scaffold + endpoints:
  • /health, /fx (Frankfurter→exchangerate.host→open.er-api),
  • /q (Yahoo→Stooq→Finnhub quotes; Stooq Prev-field for real chg%),
  • /candles (Yahoo→Stooq daily; TradingView lightweight-charts ready),
  • /news (GDELT→Yahoo RSS→Finnhub),
  • /sectors /economy /futures (ETF-proxy aggregations),
  • /screener (curated 124-entry universe + live-quote enrichment),
  • /crypto (CoinGecko + Market Dominance),
  • /fx-history (Frankfurter timeseries for FX chart line),
  • scheduled() cron (every 2 min) pre-warms hot caches → sub-5s loads.
  • KV cache + stale-on-error on every endpoint. 38/38 unit tests.
  • Apps/finance-terminal/index.html — additive: CFG.GW + CFG.V2

flag + gw() helper + V2 branches in every tab loader that route data

through the gateway. Flag-OFF path BYTE-IDENTICAL to before.

  • Candlestick + volume + SMA20 charts via lightweight-charts CDN.
  • Sortable + filterable tables (Name dbl-click toggles direction).
  • Market Dominance cards populated.
  • Screener active-state + results render fixed.
  • tools/probe-finance-terminal.mjs — Puppeteer E2E (9 tabs, 0

pageerrors) verified locally against wrangler dev + python3 -m http.server.

Activation (NOT done in this commit; documented for follow-up)

The flag default remains OFF until:

  • Owner provisions Cloudflare Worker (worker/SETUP.md): wrangler login

wrangler kv namespace create FT_KVwrangler secret put FINNHUB_KEY

wrangler deploy.

  • Owner flips CFG.V2 default to true in Apps/finance-terminal/index.html

and bumps to v1.28.x.

  • Users with localStorage.rz_ft_v2 = '1' can activate per-browser now.

Until that ships, this commit is a no-op for end users.

Threat model

API keys (Finnhub) live in Worker secrets, never in the static client.

KV reads are stale-on-error so a Cloudflare/upstream outage degrades to

last-good cached data rather than a broken tab.

v1.26.0 MINOR

Educator role + 4-tier matrix; DC AI/DC Conv/DCMOC + 8 LTC labs converted from hard root-only to matrix-gated

R-014 — introduces a new educator role that grants Pro-tier feature access

without admin-panel access. Educators see a cyan EDUCATOR badge (instrument-cyan

tokens, NOT Anthropic purple). Admin can promote/demote any user to/from

educator from the rz-ops User Management section.

What landed

  • auth.jsEDUCATOR_EMAILS allowlist (seed educator@resistancezero.com
  • merged with localStorage.rz_admin_educators admin-managed list).

detectRole + getTier + session helpers extended for educator. New helper

__rzAuth.enforceTierFeatureAccess(pageKey) replaces the hardcoded

ROOT_ONLY_PATHS block for 11 in-scope pages. auth.min.js rebuilt (terser).

  • js/rz-feature-flags.js — 4-tier matrix (FREE | DEMO | PRO | ROOT —

ROOT now explicit, not a bypass). New page-access feature convention used

by enforceTierFeatureAccess. Resolver respects per-page admin overrides

stored in rz_admin_features_by_page. Root-inviolable guard on page-access.

  • 11 pages converted from hardcoded Root Access Required gate to

enforceTierFeatureAccess(pageKey): datahallAI.html, dc-conventional.html,

dcmoc/index.html, datacenter-solutions.html (card-click delegate),

standards-ltc-lab.html, ltc-system-modelling-lab.html,

ltc-ashrae-thermal-control.html, ltc-uptime-tier-alignment.html,

ltc-ansi-tia-topology-readiness.html, ltc-iso-energy-governance.html,

ltc-nfpa-fire-risk.html. Modal copy switched from "Root Access Required"

to "Pro or Educator access required". /dc-market-tracker.html remains

root-only by design.

  • rz-ops-p7x3k9m.html — User Management: cyan EDUCATOR badge, tier filter

adds educator/demo/root options, sidebar role label role-aware, row actions

Promote → Educator / Demote → Demo (writes rz_admin_educators +

dispatches rz-educators-changed + audit log tier_change). Feature Flags

matrix gains explicit ROOT column (4-col table) + bulk presets

all_demo+, all_pro+, all_root_only. CSV export updated.

  • Demo seed alignmentdemo@resistancezero.com now tier: 'demo' (was

inconsistent tier:'pro'). Resolves a latent UI badge bug and removes a

brief unlock window on 6 LTC inline fallbacks that the security review

flagged.

  • firebase-auth.js + supabase-auth.js — educator-aware badge

handlers + detectRole ensures the EDUCATOR badge renders cyan everywhere,

not just under auth.js.

  • Standardisation docsAUTH_STANDARD.md, PRO_MODE_STANDARDIZATION.md,

FEATURE_FLAGS_STANDARD.md, CLAUDE.md all updated with the 4-tier matrix

  • educator role tables + page-access convention + enforceTierFeatureAccess

reference.

Verification

  • tools/probe-educator-access.mjs (new): Puppeteer E2E covering 5 sessions ×

13 pages = 65/65 PASS, 0 pageerrors against a local server.

  • Audit gates: audit-js-syntax --strict, audit-script-tags --strict,

audit-version-stamp --strict, audit-mobile-responsive --strict — all GREEN.

  • Code review + security review subagent passes; findings addressed.

Threat model note

Client-side auth is still a mock (passwords live in auth.js source). The full

server-side replacement (Cloudflare Worker rz-auth-gateway + KV + PBKDF2)

is tracked separately as R-015 (Phase 0 + Phase 1 already shipped on the

user-mgmt-self-service branch, awaiting merge).

v1.25.3 PATCH

datahallAI mobile order fix — main SCADA leads, sidebar telemetry spine drops below

Owner-reported regression (image attached, mobile view of

/datahallAI.html): the left telemetry sidebar (Safety + Alarms +

other sections) was rendering above the SCADA tabs / KPI strip /

facility image on mobile because .wrap { flex-direction: column }

stacks DOM order, and the sidebar comes first in DOM.

Changed (datahallAI.html only — one CSS block)

  • @media (max-width: 1024px) gets two new rules:
  • .mn { order: 1 } — main SCADA content leads.
  • .side { order: 2 } — sidebar drops below.
  • .side max-height raised 200 → 240 px + overflow-y: auto so the

longer sidebar stays scrollable when stacked.

Preserved (verified untouched)

  • Desktop layout (≥1025 px) unchanged.
  • js/datahall-model.js + js/datahall-calculations.js byte-identical.

57/57 datahall + 22/22 conv tests pass.

  • #p-dash + updateDashKPI() + dcCallouts byte-identical.
  • All 9 tab panels + alarm strip + BoD drawer.

Verified

  • 4 strict audit gates CLEAN.

Standardization updated

  • standarization/BMS_SHELL.md v1.25.3 entry added.
v1.25.2 PATCH

chiller-plant mode-rules — finishes v1.23.1 deferred work per doc-14 §4

Fourteenth ship. Completes the v1.23.1 deferred scaffold: the

Overview / Performance / Maintenance toolbar now drives actual section

show/hide via CSS, and behaves as a radio (one mode active at a time).

Changed (chiller-plant.html only)

  • Radio-style mode toolbarinitBmsShellShim() now enforces

single-mode selection via direct click listeners. The shell's

multi-select layerToggle builds the buttons; the shim manages

mutual exclusion and sets body[data-bms-mode] to the actually

pressed button. Default = overview.

  • CSS show/hide rules — new <style id="rz-bms-mode-rules-v1252">:

```

body[data-bms-mode="overview"] [data-bms-mode-hide~="overview"] { display:none }

body[data-bms-mode="performance"] [data-bms-mode-hide~="performance"] { display:none }

body[data-bms-mode="maintenance"] [data-bms-mode-hide~="maintenance"] { display:none }

```

  • Operator Controls card tagged data-bms-mode-hide="overview"

(clean default view per doc-14 §4: "Overview hides most tuning

controls"). Visible in Performance + Maintenance.

  • Alarm History card tagged data-bms-mode-hide="overview performance"

(visible only in Maintenance per doc-14 §4: "Maintenance shows run

hours, duty rotation, alarms").

  • Cache-bust query for shell tags bumped ?v=1.23.1?v=1.25.2.

Preserved (verified untouched)

  • js/conv-engine.js byte-identical. 22/22 conv + 57/57 datahall tests pass.
  • P&ID SVG, alarm strip, Primary CHW Header card, Selected-Equipment

Inspector, Alarm Summary card, deep-modal flow.

Verified

  • 4 strict audit gates CLEAN.

Standardization updated

  • standarization/BMS_SHELL.md v1.25.2 entry added.
v1.25.1 PATCH

datahallAI cockpit fix #8 — per-tab primary-read hint per doc-24

Thirteenth adoption ship. Adds the doc-24 §8 "tab-level primary question"

hint to each of the 8 in-scope panels on datahallAI.html. One italic

single-line hint per panel; surgical, additive, zero engine impact.

Changed (datahallAI.html only — 8 in-scope panels)

  • #p-over Building Overview: Primary read: where is the alarm and where do I click next?
  • #p-hall Data Hall: Primary read: where are the outliers — thermal, power, cooling margin?
  • #p-rack Rack Architecture: Primary read: how is an NVL72 built — and what is the current risk on the selected rack?
  • #p-cool Cooling & Piping P&ID: Primary read: where is the heat going — and what is the cooling constraint right now?
  • #p-elec Facility Electrical SLD (Overview sub-tab): Primary read: what is energized, what is loaded, what is at risk of trip?
  • #p-net Network Fabric: Primary read: what is the fabric health — congestion, packet loss, degraded redundancy?
  • #p-fire Fire Detection & Suppression: Primary read: what is the current protection state — and what is bypassed?
  • #p-bms BMS/DCIM Architecture: Primary read: is the monitoring system itself trustworthy?

Preserved (verified untouched)

  • #p-dash tab + updateDashKPI() + dcCallouts byte-identical (owner exclusion held — no primary-read hint on the excluded dashboard).
  • js/datahall-model.js + js/datahall-calculations.js byte-identical. 57/57 datahall + 22/22 conv engine tests pass.
  • All SVG diagrams, KPI strips, alarm strip, sidebar telemetry spine, BoD drawer.

Verified

  • 4 strict audit gates CLEAN.

Standardization updated

  • standarization/BMS_SHELL.md v1.25.1 entry added.
v1.25.0 MINOR

BMS Shell phase milestone — adoption status table + rules of engagement + deferred-work queue

Phase-closing polish ship. No code changes to any page; locks in the

v1.23 → v1.24 BMS Shell adoption milestone with proper documentation

handoff. Standardization-only.

Changed (standarization/BMS_SHELL.md only)

  • Added Adoption Status Table at the top: 9 rows (1 foundation + 8

conv + 1 AI cockpit), columns for ship version, library loaded,

body-scope, doc-14/24 fixes applied, engine binding integrity.

  • Added Adoption Rules of Engagement — 5 locked-in rules from this

phase (engine preservation non-negotiable, owner exclusions hold, no

global body-scope flip, surgical/additive, full per-ship discipline).

  • Added Deferred Work Queue — 10+ items from doc-14/doc-24 that go

beyond the surgical/additive scope of this phase; each requires

explicit owner go-ahead before further ships. Includes the

DEFERRED-OWNER-EXCLUDED note on doc-24 fix #7 (Seismic / Wind / Floor

callouts live inside dcCallouts on owner-excluded #p-dash).

  • v1.25.0 status entry added.

Phase summary (v1.23.0 → v1.24.4)

11 commits in 14 ships:

dbfec30 (v1.23.0 foundation) → 414d19c (v1.23.1 chiller-plant

inspector) → 6a79479 (v1.23.2 dc-conventional callouts demoted) →

9a033fc (v1.23.3 fuel autonomy hero) → 7423bad (v1.23.4 water WUE

hero) → a9abfe1 (v1.23.5 fire-stages legend) → e611707 (v1.24.0

EPMS engine-bound) → e1980e1 (v1.24.1 datahall ops rollup) →

87090fe (v1.24.2 ict BMS-OT health) → 5bed229 (v1.24.3 datahallAI

library load) → 4217d20 (v1.24.4 datahallAI data-mode chip).

Preserved (verified untouched, every ship)

  • js/conv-engine.js, js/datahall-model.js,

js/datahall-calculations.js byte-identical to pre-v1.23.0 HEAD.

  • 22/22 conv + 57/57 datahall engine tests pass on every commit.
  • #p-dash tab + updateDashKPI() + dcCallouts byte-identical

(owner exclusion held).

Verified

  • 4 strict audit gates CLEAN.
v1.24.4 PATCH

datahallAI cockpit fix #1 — compact `Data Mode: Simulated` chip per doc-24

Tenth adoption ship. First specific cockpit fix on datahallAI per doc-24:

the legal/methodology notice now carries a compact Data Mode: Simulated

chip in the same line. Operators can scan data-mode in a glance without

expanding the legal notice. No new rows, no layout disruption, no

component swap — strictly inline addition.

Note on doc-24 fix #7 (Seismic / Wind / Floor callouts)

That fix targets entries inside dcCallouts on #p-dash, which is

owner-excluded (byte-identical to HEAD across every adoption ship).

Recorded as DEFERRED-OWNER-EXCLUDED in the tracker; skipping unless the

owner lifts the exclusion explicitly.

Changed (datahallAI.html only)

  • Legal disclaimer <summary> — converted to a flex row carrying:
  • [NEW] Data Mode: Simulated chip (cyan accent, mono font,

8-px text — matches BMS Shell is-simulated chip styling).

  • The existing ⚠ Legal & methodology notice text + View details

link (unchanged).

The collapsed <details> element + the expanded body text + all

links to terms / privacy remain identical.

Preserved (verified untouched)

  • js/datahall-model.js + js/datahall-calculations.js byte-identical.

57/57 datahall + 22/22 conv engine tests pass.

  • #p-dash tab + updateDashKPI() + dcCallouts byte-identical.
  • All 9 tab panels + alarm strip + BoD drawer + sidebar telemetry spine.

Verified

  • 4 strict audit gates CLEAN.

Standardization updated

  • standarization/BMS_SHELL.md v1.24.4 entry added.
v1.24.3 PATCH

BMS Shell adoption #9 — `datahallAI.html` cross-page consistency, no component adoption yet

Ninth adoption ship. Datahall AI is the 10,000+ line flagship cockpit

page with rich existing engine binding (js/datahall-model.js +

js/datahall-calculations.js deep-frozen Scenario-A), alarm strip,

sidebar telemetry spine, BoD drawer, 9 tab panels. For this ship we

only LOAD the BMS Shell library — no component adoption — so future

cockpit-pass ships (v1.24.4+) can pick up doc-24's specific fixes

incrementally without bundling them with library availability.

Added (datahallAI.html only)

  • BMS Shell librarycss/rz-bms-shell.css?v=1.24.3 +

js/rz-bms-shell.js?v=1.24.3. body does NOT carry

class="rz-bms-shell" — the existing 10k-line render tree, palette,

and DC-dashboard owner-excluded #p-dash are byte-identical.

Preserved (verified untouched)

  • js/datahall-model.js + js/datahall-calculations.js byte-identical

to HEAD. 57/57 datahall + 22/22 conv engine tests pass.

  • #p-dash tab + updateDashKPI() + dcCallouts byte-identical.
  • All 9 tab panels (#p-over, #p-hall, #p-rack, #p-cool,

#p-elec, #p-net, #p-fire, #p-bms, plus #p-dash excluded)

  • alarm strip + BoD drawer + sidebar telemetry spine.

Verified

  • 4 strict audit gates CLEAN.

Next ships in v1.24.x cockpit pass (doc-24)

v1.24.4 — demote structural/static basis callouts (Seismic Zone 4 / Wind

12m/s / Floor 3.5t/m2) from live image to Basis-of-Design drawer (doc-24

fix #7). v1.24.5 — compact "Data Mode: Simulated" chip replacing the

full-width legal strip (doc-24 fix #1). v1.24.6+ — quiet normal states /

right inspector consistency / layer toggles on diagrams (doc-24 fixes

#4, #6, #9). Each ship surgical and additive.

Standardization updated

  • standarization/BMS_SHELL.md v1.24.3 entry added.
v1.24.2 PATCH

BMS Shell adoption #8 — `ict.html`, ICT-as-BMS-operations summary + OT gateway health per doc-14 §8

Eighth adoption ship. Surgical and additive. ICT page reframed as a BMS

operations view (answers "can operations still see and control the

facility?", not just "is the IT network online?"). All existing alarm

strip, nav rail, network segment views, capacity tables, alerts panel,

and engineering notes preserved.

Added (ict.html only)

  • ICT Ops summary strip (#ict-ops-strip) — second status strip

after the existing alarm strip: `ICT Ops · WAN OK · BMS Fabric OK ·

Cameras OK · Access Control OK`. Includes the doc-14 §8 framing

question.

  • BMS/OT gateway health row (#ict-otgw) — 5 chips: EPMS / Chiller /

Fire Panel / Access·CCTV / Historian — all Online by default

(deterministic / engine-aligned). Calm normal green.

  • BMS Shell librarycss/rz-bms-shell.css?v=1.24.2 +

js/rz-bms-shell.js?v=1.24.2. Cross-page consistency only; body has

no rz-bms-shell class.

Preserved (verified untouched)

  • js/conv-engine.js byte-identical; 22/22 conv + 57/57 datahall tests pass.
  • Existing alarm strip, top topbar (Back / Portfolio / Basis / Print /

Export), network segment nav (IT / BMS / Access·CCTV / WAN), capacity

tables, active alerts, engineering notes.

Verified

  • 4 strict audit gates CLEAN.

Standardization updated

  • standarization/BMS_SHELL.md v1.24.2 entry added.
v1.24.1 PATCH

BMS Shell adoption #7 — `datahall.html`, operations rollup + view-mode selector per doc-14 §3

Seventh adoption ship. Surgical and additive — preserves the existing

alarm strip, sidebar, main rack grid, modal, and engine binding. Adds the

two doc-14 §3 elements that were missing: an engineering rollup right

after the alarm strip + a view-mode selector chip row.

Added (datahall.html only)

  • Operations Rollup (#dh-ops-rollup) — second status strip after the

existing alarm strip: `Hall NORMAL · Rack Load 1.85 MW · Cooling Margin

18% · PUE 1.45 · Power Density 9.3 kW/rack`. Live-bound to

window.CONV_CALC.snapshot.

  • View Mode toolbar (#dh-mode-toolbar) — RZBMSShell.layerToggle

with 5 modes: Power / Temperature / Cooling Margin / Space / Alarms.

Toggle sets body[data-dh-mode]; per-mode render rules ship later.

  • BMS Shell librarycss/rz-bms-shell.css?v=1.24.1 +

js/rz-bms-shell.js?v=1.24.1.

Preserved (verified untouched)

  • js/conv-engine.js byte-identical; 22/22 conv + 57/57 datahall tests pass.
  • Existing alarm strip (state/critical/warning/maint/comms/last-update/

data-quality/scenario chips) — engine-bound.

  • Sidebar (Chiller Plant Feed / CRAH air-side), main rack grid, modal,

log panel — all unchanged.

Verified

  • 4 strict audit gates CLEAN.

Standardization updated

  • standarization/BMS_SHELL.md v1.24.1 status entry added.
v1.24.0 MINOR

BMS Shell adoption #6 — `EPMS_Telemetry.html`, engine-bound top status strip + line-status legend per doc-14 §2

Sixth adoption ship; first of the v1.24.x phase. EPMS_Telemetry's

"byte-untouched exemplar" designation was revoked by the owner for this

design pass; the page now joins the engine + shared shell. All existing

SVG one-line content, topbar, zoom controls, and export functionality

preserved — strictly additive insertions above the SVG.

Added (EPMS_Telemetry.html only)

  • Engine integrationjs/conv-engine.js?v=1.22.0 loaded

non-deferred so window.CONV_CALC exists before the binder runs. EPMS

is no longer engine-disconnected; Facility Load / IT Load / PUE values

match the dashboard exactly.

  • BMS Shell librarycss/rz-bms-shell.css?v=1.24.0 +

js/rz-bms-shell.js?v=1.24.0. Loaded for cross-page consistency; body

does not carry rz-bms-shell class this ship.

  • Engineering status strip (doc-14 §2 top strip spec) — new

#epms-status-strip above the SVG: "EPMS NORMAL · Facility Load

2.68 MW · IT Load 1.85 MW · PUE 1.45 · Utility OK · UPS A/B Online ·

Gen Standby · Trips 0 · Data GOOD · Scenario Simulated". Live-bound to

window.CONV_CALC.snapshot via inline IIFE.

  • Line-status legend (doc-14 §2 visible legend spec) — new

#epms-legend chip row below the status strip: Energized (green) /

Standby (dashed gray) / Open (thin slate) / Alarm/Trip (red) /

Maintenance Bypass (amber). Operator-facing.

Preserved (verified untouched)

  • All SVG content (#viewport, defs, scene, l-wires, l-flow, l-devices,

l-breakers, l-tele).

  • Topbar with Back / Portfolio / zoom controls / export dropdown.
  • js/conv-engine.js byte-identical (newly referenced by this page).

22/22 conv + 57/57 datahall tests pass.

Verified

  • 4 strict audit gates CLEAN.

Standardization updated

  • standarization/BMS_SHELL.md v1.24.0 status entry added.
v1.23.5 PATCH

BMS Shell adoption #5 — `fire-system.html`, fire-stages legend + shell library

Fifth adoption ship. Surgical and additive — preserves alarm strip,

cause-effect matrix, P&ID, simulation gate, all state-machine logic.

Adds a visible fire-stages legend per doc-14 §5 so operators see the

6-stage progression at a glance, with the active stage highlighted

dynamically from state.stage.

Added (fire-system.html only)

  • Fire-stages legend — new #fire-stages-legend chip row inserted

between the top alarm strip and the main layout grid. 7 chips:

`0 Normal / 1 VESDA Alert / 2 Smoke·Pre-alarm / 3 Confirmed /

4 Pre-action Armed / 5 Suppression Release / 6 Discharged·Lockout`.

Calm by default; only the active chip in stage 3+ gets the red

treatment (doc-14 §5: "Use red only during active alarm/discharge").

  • setFireStageChip(stage) — called from updateAlarmStrip() on

every state transition. Highlights the active chip with state-correct

color (green ≤0 / amber 1–2 / red 3–6).

  • BMS Shell librarycss/rz-bms-shell.css + js/rz-bms-shell.js

with ?v=1.23.5 cache-bust. body does not carry rz-bms-shell

class — page palette preserved.

Preserved (verified untouched)

  • js/conv-engine.js byte-identical; 22/22 conv + 57/57 datahall tests pass.
  • Existing alarm strip (line 273+) with FACP/VESDA/Critical/Supervisory/

Trouble/Tank/Pressure/Quality/Scenario chips — engine-bound and

state-machine-driven.

  • Cause-effect matrix + simulation gate + ARM/SIMULATE/RESET buttons.
  • All 6-stage simulation logic (state.stage transitions at lines 850–895).

Verified

  • 4 strict audit gates CLEAN.

Standardization updated

  • standarization/BMS_SHELL.md v1.23.5 status entry added.
v1.23.4 PATCH

BMS Shell adoption #4 — `water-system.html`, Instant WUE promoted to visual hero per doc-14 §7

Fourth adoption ship. Same pattern as v1.23.3 — surgical and additive,

engine binding intact. Instant WUE is the page-purpose KPI (per

conv/review/09), so it gets the hero treatment in the strip.

Changed (water-system.html only)

  • .kpi-grid layout changed repeat(5, 1fr)2fr 1fr 1fr 1fr 1fr

so the Instant WUE card spans 2 columns.

  • .kpi.hero new rules: teal-tinted border (treated-water medium

#2dd4bf at 45% alpha), inset glow box-shadow, gradient bg.

  • .kpi.hero h3 upsized to 11 px with teal accent.
  • .kpi.hero .v upsized 24 → 36 px (50% larger).
  • .kpi.hero .v small upsized to 14 px.
  • .kpi.hero .th upsized to 11 px.
  • Responsive — hero spans 3 cols on ≤1280 px (full width of the

3-col fallback grid); value font 32 px on that breakpoint.

  • WUE card given class="kpi hero" so the new styles apply.

Added (loaded but not yet applied to body scope)

  • BMS Shell library — css/rz-bms-shell.css + js/rz-bms-shell.js with

?v=1.23.4 cache-bust.

Preserved (verified untouched)

  • js/conv-engine.js byte-identical; 22/22 conv + 57/57 datahall tests pass.
  • WUE engine binding (#kWueCONV_CALC 1.20 L/kWh) unchanged.
  • All other KPIs (Makeup / Treatment / Filter DP / TDS) unchanged.
  • Process flow diagram + reconciliation panel untouched.

Verified

  • 4 strict audit gates CLEAN.

Standardization updated

  • standarization/BMS_SHELL.md v1.23.4 status entry added.
v1.23.3 PATCH

BMS Shell adoption #3 — `fuel-system.html`, autonomy promoted to visual hero per doc-14 §6

Third adoption ship. Surgical and additive — preserves engine binding,

existing alarm strip, P&ID layout, all 5 KPIs. The only visible change is

the Generator Autonomy KPI now visually dominates the strip per doc-14 §6

fix ("Make autonomy the largest result, not hidden in a panel").

Changed (fuel-system.html only)

  • KPI strip layout.kpi-strip grid changed repeat(5, 1fr)

2fr 1fr 1fr 1fr 1fr so the Generator Autonomy hero card is twice as wide

as the other 4 cards.

  • Hero KPI styling amplified:
  • .kpi.hero .k-val font-size 1.85rem2.85rem (~54% larger).
  • .kpi.hero .k-val weight 700800; letter-spacing tightened.
  • .kpi.hero .k-lbl upsized to 0.78rem + amber tint (var(--diesel-main)).
  • .kpi.hero .k-unit upsized to 1rem with amber-bright color.
  • Hero card gets a subtle inset gold border via box-shadow for extra weight.
  • Responsive — hero card spans 3 columns (full width) on ≤1280 px and

≤900 px breakpoints; falls back to single-column on ≤768 px. Mobile font

scaling proportional (2.5 / 2.35 / default rem).

Added (loaded but not yet applied to body scope)

  • BMS Shell librarycss/rz-bms-shell.css + js/rz-bms-shell.js referenced

with ?v=1.23.3 cache-bust for cross-page consistency. body does NOT carry

class="rz-bms-shell" this ship — page palette preserved.

Preserved (verified untouched)

  • js/conv-engine.js byte-identical to HEAD; 22/22 conv + 57/57 datahall

tests pass.

  • Engine binding chain (window.CONV_CALC.snapshotkpi-autonomy /

kpi-usable / kpi-consumption / kpi-genload / kpi-np1) unchanged.

  • UST-01 tank + Tank Inventory + Bulk Fill Point panels + all instrument

bubbles (LIT-101, TIT-101, etc.) untouched.

Verified

  • 4 strict audit gates CLEAN.
  • 22/22 conv + 57/57 datahall tests pass.
  • Headless puppeteer @ 1440: KPI grid columns measured 2× wider for hero

vs others; hero .k-val computed font-size > 40 px (was 26 px); engine

autonomy reads 48 hr from CONV_CALC. Zero pageErrors.

Standarization updated

  • standarization/BMS_SHELL.md v1.23.3 status entry added.
v1.23.2 PATCH

BMS Shell adoption #2 — `dc-conventional.html`, static facility-image callouts demoted per doc-14 §1

Second adoption ship. Surgical and additive — preserves the page's existing

theme, alarm strip, KPI strip, engine binding to conv-engine.js, and right

stats-panel. The only visible change is the facility image becomes calmer:

17 callouts → 6 operational ones per doc-14 §1 fix #1 ("Move static callouts

like general labels away from image. Keep only operational callouts: PUE, IT

Load, CHW/TCS, Fuel autonomy, Active alarm, Outdoor condition if cooling

relevant"). Theme flip + top-status-strip migration deferred to a later ship.

Changed (dc-conventional.html only)

  • Facility-image callouts demoted 17 → 6 per doc-14 §1 fix #1. Kept on

the image (operational + cooling-relevant + autonomy):

  • PUE, IT Load, CHW, Temp, Fuel, RH (outdoor).
  • Active alarm count remains in the top alarm strip.

Demoted to the right stats-panel (zero data lost — every demoted item

already had or now has a row in the panel):

  • WUE and Carbon (CUE) (already in Efficiency section).
  • UPS 2N OK (added to new Network & Reliability section).
  • Chiller 2/3 (now in Cooling section as Chillers 2 / 3).
  • Fire Normal + VESDA Normal (already in Safety section).
  • Network Online (added to new Network & Reliability section).
  • CRAHs 12/14 (added to Cooling section).
  • Uptime 99.98% (added to new Network & Reliability section).
  • Right stats-panel gained a new "Network & Reliability" section

consolidating UPS topology / Network / Uptime YTD.

Added (loaded but not yet applied to body scope)

  • BMS Shell librarycss/rz-bms-shell.css + js/rz-bms-shell.js referenced

with ?v=1.23.2 cache-bust for cross-page consistency. body does NOT carry

class="rz-bms-shell" this ship — page's existing typography + palette

preserved.

Preserved (verified untouched)

  • js/conv-engine.js — byte-identical to HEAD. 22/22 tests pass.
  • Existing alarm-strip (state/critical/warning/maint/comms/stale/last

update/scenario chips) — engine-bound, deterministic.

  • Existing KPI strip (PUE/WUE/Carbon/IT/Uptime/Temp/Chillers/Alarms).
  • Existing right stats-panel sections (Efficiency / Power / Cooling /

Environment / Safety / Fuel) — additive change only.

Verified

  • 4 strict audit gates CLEAN.
  • 57/57 datahall + 22/22 conv engine tests pass.
  • Headless puppeteer @ 1440: callout count 6 (was 17), all 6 operational,

right stats-panel has 7 sections (was 6), Network & Reliability section

present with UPS/Network/Uptime rows, engine-bound KPIs unchanged

(PUE 1.45 / IT 1,850 / Temp 22.4), zero pageErrors.

v1.23.1 PATCH

BMS Shell adoption #1 — `chiller-plant.html`, the doc's visual benchmark

First adoption ship of the BMS Shell foundation. Surgical and additive — the page's

existing dark SCADA visual identity is preserved (doc-14 §4: "Keep this page as the

visual benchmark, but simplify hierarchy"). Engine binding to conv-engine.js (CHWS 7.2 /

CHWR 14.8 / ΔT 7.6 / 58 L/s) untouched; deep-detail modal flow untouched; 22/22 conv

engine tests still pass.

Added (chiller-plant.html only)

  • Shell library loadedcss/rz-bms-shell.css + js/rz-bms-shell.js referenced

with ?v=1.23.1 cache-bust. NOT applied to <body> scope to preserve the page's

own typography/palette; only standalone component classes used.

  • Right-side Selected-Equipment Inspector (doc-14 §4 #4: "Put selected loop

detail in right inspector instead of making every loop equally detailed").

New .rz-bms-inspector#chillerInspector panel at the top of the existing

<aside class="side">. Populated by RZBMSShell.inspector.select() whenever the

user clicks a [data-loop-id] group in the P&ID SVG. Payload includes:

CH-NN title, status chip (NORMAL/WARN/ALARM/TRIP), critical values (CHWS/CHWR/

ΔT/Flow/Comps/Duty/Pump speed) from st.loops[id-1] + ui.metrics[id-1],

thresholds, trend hint, alarm summary, interlocks, maintenance note, source

badge.

  • View Mode toolbar — Overview / Performance / Maintenance buttons (doc-14 §4

"Best Design Detail: three modes"). UI scaffold in this ship; toggle sets

body[data-bms-mode]. Section show/hide rules ship in v1.23.2 once the visual

baseline is confirmed.

  • updateLoopInspector(id) + loopInspectorPayload(id) helpers — read-only

on engine state. Hooked into the existing pidSvg click handler (which still

opens the deep-detail modal — inspector + modal coexist).

Preserved (verified untouched)

  • js/conv-engine.js — byte-identical to HEAD. 22/22 tests pass.
  • Existing .alarm-strip with engine-bound CHW values (asChw shows 7.2/14.8/7.6/58).
  • Deep-detail modal flow (click loop → openModal(id) still fires alongside the

inspector update).

  • P&ID SVG content + ISA tag scheme (CH-NN, CHWP-NNA/B, FT/DPS/TT bubbles)

unchanged.

  • body element has NO class="rz-bms-shell" so the existing page typography +

background palette stays exactly as before.

Verified

  • 4 strict audit gates CLEAN.
  • 57/57 datahall + 22/22 conv engine tests pass.
  • Headless puppeteer: page loads zero errors, inspector renders on click with

engine-bound values, mode toolbar mounts 3 buttons with aria-pressed wiring,

CHWS still reads 7.2°C from conv-engine.js.

v1.23.0 MINOR

BMS Shell foundation — shared dark-operations console library, no page migrations yet

Foundation ship for the conv-suite unification + DC AI cockpit pass (owner-approved direction per

Documents/screenshot bms rz/conv/review/14-uiux-re-review-2026-05-22-best-design.md and …dc ai/review/24-uiux-re-review-2026-05-22-best-design.md).

Library only — no pages migrated yet. Per-page adoption ships start at v1.23.1

(chiller-plant first, the doc's visual benchmark).

Added

  • css/rz-bms-shell.css — dark operations design system in 11 sections:

tokens (#0b1118 bg → #e7edf5 text + #55b878 #dca33a #d94c4c #50c8ff

semantics + subsystem hues), top status strip, left subsystem nav with status

dots + alarm badges, right object-inspector, KPI card anatomy

(label/value/unit/target/trend/source), shared alarm row, layer-toggle

toolbar, bottom event strip, chip + dot primitives, responsive collapse

(≤1180 stacks inspector / ≤900 collapses nav / ≤390 stacks everything).

Opt-in only — scoped under body.rz-bms-shell so it has zero side-effect on

pages that don't carry the class.

  • js/rz-bms-shell.js — vanilla ES5 controller with public API:

`RZBMSShell.init / setStatus / layerToggle / inspector.select / inspector.clear /

attachClickToInspector / alarmBadge. ARIA-aware (role="status"+aria-live`

on status strip, aria-pressed on layer toggles, keyboard activation on

click-to-inspect). Engine preservation: never reads or writes engine state;

pages remain responsible for feeding engine-derived values.

  • standarization/BMS_SHELL.md — adoption guide + token reference +

component catalog + migration order (v1.23.1 chiller-plant → v1.23.3 fuel/

water/fire → v1.24.0 EPMS/datahall/ict → v1.24.x datahallAI cockpit pass →

v1.25.0 polish).

Decisions captured

  • Theme strategy: dark operations everywhere (DC Conv dashboard flips dark

too — no light↔dark jolt between dashboard and subsystems).

  • EPMS_Telemetry exemplar designation revoked for this design pass per

owner. Migrates onto shared shell alongside the other 7 conv pages.

  • DC Dashboard tab #p-dash in datahallAI.html remains owner-excluded —

every adoption ship must keep it byte-identical to HEAD.

  • Migration order: DC Conv unification first (v1.23.x), then datahallAI

cockpit pass (v1.24.x). Per owner.

Verified

  • 4 strict audit gates CLEAN.
  • 57/57 datahall + 22/22 conv engine tests still pass (engine files untouched).
  • node --check on js/rz-bms-shell.js: parses clean.
  • No existing pages reference the new files yet — zero rendered-DOM change on

the live site.

v1.22.8 PATCH

DC AI engineering audit P1+P2 fixes — Cooling PUE, BMS service health, UPS/MSB engine-bound first-paint

Closes the five P1 + two P2 acceptance-line violations surfaced by the

background engineering audit on datahallAI.html. All edits are

surgical, in-scope panels only — owner-excluded #p-dash byte-untouched,

engine files (js/datahall-model.js / js/datahall-calculations.js)

untouched, 57/57 calc tests still pass.

Fixed (datahallAI.html only)

  • GAP-1 (P1) — Cooling P&ID THERMO SUMMARY (#p-cool) no longer

hardcodes Total PUE ~1.18 / PUE (cooling) ~0.12. Now reads

DH.pue.toFixed(2) (1.30) and (DH.pb_cooling/DH.itHall).toFixed(3)

(0.238) from the locked engine — matches doc-21 worked example Ex9.

  • GAP-2 (P1) — Cooling P&ID floating PUE badge (#pueBadgeV) no

longer derives PUE from Math.random R(6.5,7.2) and the

(1 + 1/copV2 + 0.02) shortcut formula (producing ~1.17). Now reads

window.DATAHALL_CALC.pueBasis().pue (the engine's five-part PUE) on

every interval tick. Initial badge value also engine-derived.

  • GAP-3/4/5 (P1)#p-bms panel now carries a "BMS Service Health"

strip above the architecture SVG with:

  • Alarm lifecycle countersActive / Ack / Cleared, bound to

the existing rules() aggregator (active = crit + warn, ack = 0,

cleared = scheduled maint). Refreshed on the same 4 s cadence.

  • Historian statusOnline · 1 yr hi-res + 5 yr daily

(doc-18 BMS criterion: historian health visible).

  • Notification serviceOnline · email + SMS + push

(doc-18: notification service health visible).

  • Aggregate gateways online16 / 16 (doc-18:

"Controllers/gateways online count is visible").

  • GAP-7 (P2) — MSB-SLD first-paint Total Load A no longer

hardcodes RI(5200,5600) (a random 5,200–5,600 kW that's ~50% over

the engine 3,564 kW). Now reads DHE.itHallFmt at construction time.

  • GAP-8 (P2) — UPS overview fallback strings (#eOvUPS*Ak/Bk in

#p-elec overview + #eUPS*A/B in per-DH SLD) no longer hardcode

5,420 kW | 68% / 5,380 kW | 67% on first paint. Now read

DH.itHallFmt + DH.upsLoadPct so the values are engine-correct

immediately, before the first live-update tick.

Not in scope (verified untouched)

  • #p-dash tab (owner exclusion — byte-identical to HEAD).
  • js/datahall-model.js / js/datahall-calculations.js (immutable

engine — byte-identical).

  • js/conv-engine.js, EPMS_Telemetry.html, the 6 conv suite pages

(dc-conventional / datahall / chiller-plant / fire-system /

fuel-system / water-system / ict) — DC Conventional audit returned

full PASS; no edits needed in this ship.

  • GAP-6 — Feed-A red on Electrical SLD: already fixed in earlier

v1.20.2 Stage 6 (var CA='var(--b)' blue, Feed A title says

"FEED A (BLUE) / FEED B (GREEN)"). Audit was flagging a stale

reference; current code is correct.

Notes

  • UIUX audit findings (ict.html + datahall.html P0 redesign, IBM Plex
  • brand-token system-wide, EPMS_Telemetry mobile overflow) are

separate larger work — queued for v1.23.x with their own plan,

not bundled here (keep scope tight, one concern per ship).

v1.22.7 PATCH

Featured Engineering Deep-Dive & Standards grouping — promotes the LTC Lab out of the buried bottom row

Changed

  • datacenter-solutions.html — new "Engineering Deep-Dive & Standards" featured section inserted directly above "Strategic Analysis & Market Intelligence" with two cards using the same .ds-strat-card bento pattern (gradient top-border, large icon, badge, feature bullets, gradient CTA):
  • Card 1 — Standards + Liquid-to-Chip Lab (amber gold theme, ROOT lock badge, links to standards-ltc-lab.html, keeps id="rootStandardsCard" + .root-only-card class so the existing amber-tinted lock styling carries over).
  • Card 2 — Liquid-to-Chip System Modelling Lab (cyan teal theme, links to ltc-system-modelling-lab.html).
  • standards-ltc-lab.html — lifted the "Liquid-to-Chip Engineering Lab" card out of the 6-sibling Standards Deep-Dive grid into a dedicated "Main Module" hero section above the standards grid; new self-contained .standards-hero CSS block (gradient top-border, 56 px icon, feature bullets, cyan CTA) with light + dark coverage + small-screen responsive collapse.

Removed

  • datacenter-solutions.html — buried duplicate ds-tool-row#rootStandardsCard row in the "Engineering & Compliance Tools" list (it lived just under "Pillar: Sustainability"). The LTC Lab entry-point is now featured up-page only — no duplication.
  • standards-ltc-lab.html — the LTC Lab card removed from the 6-card .standards-grid (5 standards-engine cards remain: ASHRAE / ANSI-TIA / ISO / NFPA / Uptime).

Notes

  • Reuses .ds-strategic-grid / .ds-strat-card / .ds-strat-card::before / .ds-strat-icon / .ds-strat-title / .ds-strat-subtitle / .ds-strat-desc / .ds-strat-features / .ds-strat-cta from the existing Strategic Analysis section — no new global stylesheet rules; the page's existing light + dark coverage applies automatically.
  • Auth gating unchanged: standards-ltc-lab.html is not in auth.js ROOT_ONLY_PATHS; the lock chip stays decorative (signals "root-only territory").
  • DC AI + DC Conventional pages untouched in this ship (under independent background-agent audit). Engineering-audit P1s (datahallAI Cooling P&ID ~1.18 / ~0.12 hardcodes + Math.random PUE badge, BMS lifecycle gaps, Feed-A red, MSB/UPS first-paint values) queued for v1.22.8.
v1.22.6 PATCH

B-016 part 2: 390px horizontal-overflow fixed — B-016 COMPLETE

Fixed (CSS-only, additive, one idempotent <style id="b016-mobile-overflow-fix"> per page, ≤768px-scoped)

  • ltc-system-modelling-lab.html 371px→0px: .calculator-layout

grid-template-columns:minmax(0,1fr) (removes the min-content floor);

panels/grids/labels min-width:0;max-width:100%; oversized schematic

SVGs max-width:100%;overflow-x:auto; overflow-x:clip on html/body to

drop the clipped-child phantom width (no scroll container / sticky impact).

  • opex-calculator.html 296px→0px: container + toolbar + charts-grid

single-column; panels/cards min-width:0;max-width:100%; .breakdown-table

display:block;overflow-x:auto.

  • cx-calculator.html 216px→0px: off-canvas .cx-drawer switched

right:-520pxtransform:translateX(105%) (closed) / translateX(0)

(open) so the off-screen box no longer inflates scrollWidth; scenario bar

wraps; shared auth dropdown clipped to viewport. Drawer open/close intact.

  • capex-calculator already measured 0px — correctly untouched.
  • Independently verified: all 3 = 0px @390 and @1440 (desktop layout

unchanged, panels still multi-column), 0 pageerror, cx drawer toggles;

dark/light unaffected; 4 --strict gates all 0.

B-016 — COMPLETE

Part 1 (v1.22.5): ltc lab external-JS SyntaxError fixed git-authoritatively

  • audit-js-syntax.py hardened to scan external js/*.js. Part 2 (this):

390px overflow on ltc/opex/cx fixed. Both verified.

v1.22.5 PATCH

B-016 part 1: ltc lab external-JS SyntaxError fixed + audit hardened

Fixed

  • js/ltc-system-modelling-lab.js (699 KB extracted IIFE) threw

SyntaxError: Invalid or unexpected token at line 5386 — the v1.8.2

responsive patch (commit a1e0abb) had injected its raw

/* v1.8.0 — mobile sim/lab responsive patch */ @media(max-width:768px){…}

block INTO a JS print-document string (clobbering the

'</style></head><body><div class="r-wrap">' + innerHtml + line), then

commit 17a5bf4 extracted the already-broken inline IIFE to this external

file — so the entire lab was non-functional in-browser. Collapsed the

81-line injected region back to the git-authoritative original line

(from the a1e0abb - hunk; 0 heuristic guesses). node --check exit 0;

browser: 0 pageerror, lab renders (117 interactive elements). Script

cache-bust ?v=2026-05-09?v=2026-05-18.

  • tools/audit-js-syntax.py hardened: now also node --checks every

shipped external js/*.js — the inline-block-only scan structurally

could not see external <script src> files, the exact gap that let this

broken 699 KB bundle ship silently. Verified CLEAN (103 HTML + all js/).

Still open (B-016 part 2)

  • ltc-system-modelling-lab / capex / opex / cx pre-existing

~210–371 px horizontal overflow @390 px (responsive layout, NOT a JS

regression) — addressed next.

v1.22.4 PATCH

B-015 Stage 9 finalize: dc-conventional alarm strip — conventional suite COMPLETE

Stage-9 consolidated QA across all 7 redesigned conv pages found one

consistency gap: dc-conventional (the Stage-1 engine-bind page) lacked the

operator-first top alarm strip the other 6 received (doc-12 "Top status bar

shows active alarms, data quality, last update"). (The probe-flagged "ict

neon" was a false positive — the word "scanline" inside a documentation

comment, not a rendered element; dismissed via source inspection.)

Added

  • dc-conventional.html: operator-first .alarm-strip #alarmStrip

(role=status, aria-live) as first child of <main>, mirroring the

verified datahall pattern — state pill + Critical/Warning/Maint·Bypass/

Comms/Stale/Last-Update + Data-Quality + Scenario, painted from

window.CONV_CALC.snapshot on the existing 5 s updateData() cadence

(deterministic, threshold-driven per documented PUE/cooling-redundancy/

ASHRAE-band/fuel-autonomy rules — no Math.random). Light + dark coverage;

responsive wrap; red bound strictly to alarm severity.

  • Independently re-verified: strip present & first-child-of-main, engine-

bound (NORMAL/0/0/1/OK/0, stable on reload), 0 pageerror, 0px overflow

@390+1440; all 4 --strict gates + conv-calc test pass; EPMS_Telemetry /

js/conv-engine.js / version files untouched.

B-015 status — Conventional BMS suite COMPLETE

Stage 1 engine+dc-conventional (v1.22.0) · Stage 2 EPMS audit (exemplar,

untouched) · Stages 3-8 datahall/chiller-plant/fire/fuel/water/ict bind+

de-slop (v1.22.3) · Stage 9 dc-conventional alarm strip (this). All 7 pages:

single js/conv-engine.js basis, deterministic, top alarm strip, grounded

slate/graphite palette matching the EPMS_Telemetry exemplar, red=alarm-only,

0 neon (rendered), 0 pageerror, 0px overflow. conv/review doc-12 acceptance

substantially met.

v1.22.3 PATCH

B-015 Stages 3-8: 6 conventional BMS pages bound + de-slopped

Conventional BMS suite redesign per the owner conv/review 14-doc spec.

Stage 1 (engine + dc-conventional) shipped v1.22.0; EPMS_Telemetry is the

owner-OK exemplar (audited Stage 2, byte-untouched). This ships Stages 3-8:

6 pages each bound to the single scenario engine and de-slopped to the

grounded SCADA standard, via 6 parallel agents — every claim independently

re-verified by the orchestrator (audits + headless 1440/390 + git scope).

Changed (each page = external js/conv-engine.js + de-slop, one-file diffs)

  • datahall.html: rack field SUM == engine IT 1.850 MW exactly (deterministic,

was random); hall-balance band; heatmap modes; 0 neon; alarm-first.

  • chiller-plant.html: CHWS/CHWR engine-locked 7.2/14.8 °C (was drifting

19→18.7 via PRNG); the ~19/23 °C readings correctly relabelled SEC/condenser

loop (doc-04 critical fix — verified no CHWS/CHWR sits on a 19/23 value);

pipe-label↔tee collisions 10→0.

  • fire-system.html: red reserved for alarm/trip/fire/leak only (0 red on

normal); dangerous one-click TRIGGER-FIRE → gated 2-step SIMULATION panel;

explicit cause-&-effect matrix.

  • fuel-system.html: autonomy computed (usable ÷ consumption = 48.0 hr,

was static); tank inventory + interlock indicators; flow-path direction.

  • water-system.html: WUE computed (37 L/min ÷ IT energy = 1.20 L/kWh,

was static); scope split + WUE-vs-all-flow reconciliation; equipment tags.

  • ict.html: BMS/OT air-gapped segment separated; per-link

capacity/util/latency/status; neon + CRT scanline removed.

  • All: top alarm strip, grounded slate/graphite palette matching the

EPMS_Telemetry exemplar, deterministic engine values (no Math.random for

engineering/alarm state), 0 pageerror, 0px overflow @390, readable

1366/1920. EPMS_Telemetry / js/conv-engine.js / version files untouched.

  • Gates verified by explicit exit-code: audit-js-syntax / script-tags /

version-stamp / mobile-responsive --strict all 0; conv-calc test pass.

v1.22.2 PATCH

finalize light-mode contrast: shared-token sweep

Closes the Track-1 light-mode work — the per-page agents consistently

deferred the same SHARED stylesheet tokens (correctly, being out of their

page scope). A v2 WCAG-AA probe across 10 representative pages (default

light, gradient/opacity-aware) found 104 distinct fail-signatures; only **4

were genuinely shared (≥3 pages)**:

Fixed (shared, dark-safe — base recolour, [data-theme="dark"] overrides untouched)

  • .cookie-decline (7 pages): base #94a3b8 (2.56:1 on the white

cookie banner) → #64748b (4.76:1). Fixed in BOTH styles.css +

styles-index.css (2-stylesheet architecture); dark override keeps

#94a3b8. Verified light pass + dark unchanged.

  • .rz-version-num (7 pages, the easter-egg version stamp): base

#10b981 (2.54:1 on white) → #047857 (5.48:1) in styles.css;

[data-theme="dark"] keeps #34d399. Verified.

  • styles.min.css + styles-index.min.css re-minified; cache-bust →

?v=2026-05-18-lm on 62 pages.

Accepted (documented — NOT changed, deliberately)

  • --gray-600 #6c757d on #f8fafc = 4.48:1 (4 pages) and violet accent

links #8b5cf6 on white = 4.23:1 (6 pages): within 0.02–0.27 of the

4.5 guideline on a pervasive global CSS variable / brand-identity accent.

A site-wide variable or brand change risks dark-mode + identity

regressions for a sub-threshold gain — the disciplined call is to accept

and document rather than introduce risk. Remaining 100 fail-signatures are

[1–2 page] page-local brand accents / large-display / JS-driven values,

already documented out-of-scope by the per-page agents.

  • All 4 --strict gates CLEAN; dark mode provably unchanged.
v1.22.1 PATCH

hotfix: v1.22.0 shipped a broken changelog.html + generator guard

Fixed

  • The v1.22.0 CHANGELOG entry had an inline code span split across two

markdown source lines. inline_md() matches per line, so the span never

closed and a raw &lt;script leaked into changelog.html (the easter-egg

page) — audit-script-tags --strict flagged it CRITICAL but a faulty

&& shell chain let v1.22.0 push anyway (process failure, acknowledged).

Rephrased the offending entry; code spans kept single-line.

  • Defense-in-depth: tools/build-changelog-html.py now self-checks its

generated output and sys.exit(1) (build fails loudly) if a raw

backtick-tag pattern leaks — a malformed CHANGELOG can no longer silently

ship a broken changelog.html.

  • Verified: build exit 0, audit-script-tags/audit-js-syntax --strict

CLEAN, 0 raw backtick-tags in changelog.html.

v1.22.0 MINOR

B-015 Stage 1: Conventional BMS scenario engine + dc-conventional bind

User: *"dc-conventional.html garisnya tabrakan dan gambar2nya seperti

coret2an newbie … kecuali EPMS_Telemetry sudah ok … review dan

sempurnakan"* (per the owner 14-doc conv/review spec). Stage 1 of a

multi-stage suite redesign; EPMS_Telemetry.html is the OK exemplar (left

byte-untouched).

Added

  • js/conv-engine.js — deep-frozen window.CONV_MODEL single scenario

basis + pure window.CONV_CALC per conv/review doc-00 Engineering Data

Contract (it_design 2.0 MW, it_load 1.85 MW, PUE 1.45 → facility 2.6825

MW, non-IT, EPMS, cooling/CHW flow, WUE, fuel autonomy). Every constant

// source:-cited; NO Math.random; Node-interop shim.

  • tools/test-conv-calc.mjs — vm-sandboxed; reproduces the doc-00

Definition-of-Done identities + doc-09 worked examples. 22/22 pass.

Changed

  • dc-conventional.html bound to the engine via an external

<script src> (not inlined): dashboard KPIs/callouts now read

window.CONV_CALC.snapshot (was Math.random()). Total = IT×PUE = **2,683

kW** shown exactly; Non-IT = Facility−IT; CHW single basis 7.2/14.8 °C

(conflict resolved per doc-00/09, condenser loop relabel deferred).

Stable across reloads (not random). 0 pageerror, 0px overflow @390.

  • EPMS_Telemetry.html + the 6 sibling conv pages BYTE-UNTOUCHED.

Remaining per-page bind/de-slop = Stages 2–9 (tracked B-015).

  • Gates: audit-js-syntax/script-tags --strict CLEAN.
v1.21.2 PATCH

B-014: datahallAI Basis-of-Design drawer — overlap + re-skin + Export-PDF + value audit

User (plan mode, in detail): *"basis of design ini pada tertutup dengan

button2 nggak proper responsivenessnya, dan jangan selalu ai design slop

transparant biru-abu2 … kasih tombol export pdf … basis of design pastikan

ada reference, calculation … jika ada value parameter tidak valid validkan."*

Fixed (datahallAI.html only — DC-dash + engine byte-identical)

  • Overlap/responsive: .dh-bod raised to z-index:1002 (above the

global nav burger 1001) + burger hidden while drawer open; header sticky

with safe-area top padding, flex-wraps ≤480px; ≤94vw / full-width ≤600px.

Header + close-X fully visible & reachable at 1440/768/390 px, 0px

overflow, Esc closes.

  • De-AI-slop re-skin: replaced transparent navy/purple glassmorphism +

backdrop-filter with mostly-solid graphite surfaces + ONE restrained

signal-amber accent (ISA-18.2), correct LIGHT (#f4f6f9/#b45309) +

DARK (#11151f/#171d29) variants per documentation/design.md.

  • Export PDF: solid amber button → print-window (escaped <\/script>,

audit-clean) generating a 14-page A4 engineering Basis-of-Design: title +

revision history + design philosophy + per-discipline sections (Compute/

Electrical/Cooling/Fire-Safety/Network/BMS) = assumptions → formulae →

worked calcs LIVE from DATAHALL_CALC/DATAHALL_MODEL (honest PUE ≈1.30

  • 5-part basis, "NOT a fudged 1.08") + figures + references (NVIDIA GB200

NVL72/Vertiv CoolChip/Cat 3516E/Carrier 19DV/ASHRAE/Uptime/NFPA) +

appendices; @page A4, running header/footer, page numbers.

  • Value audit: 6 stray legacy values (28.4/28.5 MW IT, PUE 1.08, 7,776×

B200) → engine-derived Scenario-A baseline. Remaining 1.08/28.5 confined

to excluded #p-dash, dead code, or the intentional honest-vs-fudged BoD

contrast. node tools/test-datahall-calc.mjs 57/57.

v1.21.1 PATCH

R-013: Second Brain wired into Insights dropdown

User: *"page second brain saya … ada wiki, obsidian dan graphify kok tidak

ada menunya … hilang di dropdown insight. fix it"*. The second-brain app

(Apps/second brain/index.html — the Knowledge-Graph / "Graphify" hub that

internally surfaces the Wiki link + Obsidian-vault node) was built but

never linked from the site nav (git-confirmed; not a regression).

Added

  • A truthful "Second Brain" <li> (purple #a78bfa) inserted before

"All Insights" in the Insights dropdown on all 62 pages that carry it,

consistently, per CONTENT_LINKAGE_PLAYBOOK. Links to the one real

servable entry Apps/second%20brain/index.html (resolves 200). Wiki /

Obsidian / Graphify are facets WITHIN that app — only index.html is a

servable page (the vault dir has no index, the wiki target is raw .md),

so 3 separate links would have been fabricated URLs; one correct entry is

the honest fix. Idempotent.

  • Verified: link present + resolves; audit-js-syntax/`mobile-responsive

--strict` CLEAN.

v1.21.0 MINOR

P0: site-wide light-mode regression recovery + B-001 changelog generator fix

User: *"what have you done, ini cardsnya tidak terlihat … tulisannya tidak

terlihat"* — the v1.19.1 default-light flip broke 35 dark-first pages

([data-theme="dark"] rules, zero [data-theme="light"]) → invisible/low

contrast in the now-default light theme.

Fixed — light-mode contrast (B-013) across 25 pages

  • articles.html: card meta authored #9ca3af (2.54:1 on white) →

light-scoped #64748b (4.6:1). Philosophy cards verified white/readable

(4.76:1) — the screenshotted defect.

  • article-23..27, FF-1/2/3, geopolitics-1/2/3: accent text 600→700

same-hue shades, inline-coloured cells → classed, muted #94a3b8/#9ca3af

#64748b/#475569, all light-scoped (html:not([data-theme="dark"]));

dark verified unchanged/improved.

  • 7 calculators (capex/opex/roi/tco/pue/carbon-footprint/spares):

idempotent <style id="rz-lightfix-v1"> before structural </head>,

light-scoped AA-700 accent remap; dark byte-identical; cx-calculator

correctly excluded (hardcoded always-dark, no light mode).

  • 5 labs (ltc-system-modelling-lab/standards-ltc-lab/tier-advisor/

rfs-readiness-workbench/dashboard): light-only --text-muted: #475569,

nav-link/priority-pill AA remap, footer-heading light fix.

  • All edits CSS-only, html:not([data-theme="dark"])-scoped, idempotent

(v1.19.1 light-contrast markers); dark mode provably unchanged; 4

--strict gates CLEAN.

Fixed — B-001 (changelog.html generator)

  • tools/build-changelog-html.py inline_md() now extracts inline-code

spans FIRST and html.escapes them, so backticked HTML in CHANGELOG

(`