v1.51.9
PATCH
July 05, 2026
Articles — slop sweep 2: translucent boxes + prose highlights killed
Changed — owner: articles were still full of semi-transparent tinted boxes and text
highlights ("AI design slop — doesn't match planb / the reference site"). The v1.50.19
de-slop sweep only covered [class*="-box"]/-note; the bespoke per-article families
survived (~1,300 translucent rules across 30 articles, 124 inline washes, gradient fills).
Per plan-article-experience §03 + design.md §2/§3:
Wash detection is now a runtime measurement , not a class-name blanket:
js/rz-article-editorial.js flattenWashes() tags -card/-panel/-block surfaces whose
computed background is a translucent wash (alpha 0.02–0.5, or a gradient whose first
stop is a low-alpha tint) with data-rz-flat. Opaque instrument embeds (dark
calculator panels, diagram surfaces) measure alpha ≥ 0.5 and keep their skin; washes
nested inside opaque dark containers also stay (they composite as authored).
css/rz-article-dark.css flattens tagged surfaces to the editorial panel
(--rz-art-panel dark / #ffffff light) + 1px hairline + 8px radius, kills their
gradients, and normalises reading ink inside flattened light-mode cards (many were
dark-authored with h5{color:#fff}). Semantic 2px rails re-asserted.
Gradient fills killed unconditionally on callouts, chips/badges, and table chrome
(thead/th/tr/td).
Prose text highlights killed : span[style*="background"] inside p/li/headings and
<mark> render as plain text (emphasis = weight/color, never a wash).
Lesson (encoded in the code comments) : translucent washes composite against their
LOCAL container — a page-surface-colored opaque replacement breaks chips inside dark
diagram panels (.flow-box); and a class-name blanket can't distinguish a slop wash from
an instrument surface, but computed alpha can.
Verification — before/after screenshots on the worst offenders (article-9/7/16/26,
geopolitics-3) both themes; uiux-reviewer pass (its findings applied: rail re-assert,
thead gradients, 8px radius, tokenised inks, transparent-wrapper guard); full gate suite
green incl. audit-a11y 0/0, dark-coverage 114pp, interactions real-input.
v1.51.8
PATCH
July 05, 2026
Code-review fixes — engine sim + calculator panels
Addressed findings from an adversarial code review of the v1.51.0–v1.51.6 engine + calculator work
(0 critical, no XSS/secrets; these are the actionable correctness/consistency items):
pue-calculator.html : the window.load handler re-ran the ENTIRE calculate() (a redundant full
model recompute) just to populate the additive panel after the deferred engine loaded. Now it caches the
inputs and calls only renderPueCurve(...) — matching the targeted-render pattern already used by
capex/opex. Verified the panel still renders (0 errors).
tco-calculator.html : percentile accessors now clamp the index to [0, N-1] (the engine's pct()
convention) instead of a raw Math.floor(N·q) against the sample count — defensive against any future
case where filtered sample length differs from the nominal iteration count. MC values unchanged.
rz-engine.js (doc-only; minified twin byte-identical, no cache-bust): documented that
sim.monteCarlo correlations are applied sequentially (safe for disjoint pairs; chained pairs are
transitively correlated); documented the opex.totalAnnual opts.climate constraint (don't combine with
a calibrated PUE — double-counts cooling); documented that charts.tornado labels must be trusted
(placed into SVG <text>, which doesn't execute HTML, but callers must not pass raw user input).
v1.51.7
PATCH
July 05, 2026
Accessibility — full-site sweep part 1: changelog generator + checklists
Changed — first batch of the full-site axe sweep (106 pages beyond the gated 8-page set;
11,334 critical/serious nodes found, heavily clustered):
tools/build-changelog-html.py (~5,700 nodes, half the site total, one generated page):
light-mode was missing overrides for subheads/strong/code/tables/dates/nav — the
dark-default colors bled through. Light/dark .changelog-date values were reversed.
Tier badges/pills now derive a darker light-mode color from --tier-color via
color-mix. changelog.html now audits 0/0 both themes — permanent for all future releases.
cdu-checklist.html / fire-checklist.html / geopolitics-1.html (~350 nodes): every
bare checklist checkbox gets an accessible name from its row text (tiny runtime; geopolitics
needed a MutationObserver — its kit checklist is JS-injected after DOMContentLoaded); chip
families (.src.*, .cad.*, .crit.*, status badges) darkened for light tints with dark
counterparts; table headers, print buttons, service-record inputs (aria-label), scrollable
table wrappers (tabindex), in-paragraph links underlined. All three pages now 0/0 both themes.
Remaining sweep clusters (article-15, dc-market-tracker, achievements, cockpit pages, ~25 pages)
tracked for follow-up batches.
v1.51.6
PATCH
July 05, 2026
PUE calculator — partial-load PUE curve + water (WUE
panel)
Added
Partial-Load PUE & Water panel on pue-calculator.html (free tier) — an additive readout powered by
RZEngine v2.0's previously-unconsumed pue.partialLoadPUE + pue.wue models. PUE is quoted at full IT
load, but data centers rarely run at 100% and fixed infrastructure overhead doesn't scale down — so the
panel shows the effective PUE across 20–100% utilization (e.g. a 1.46 design PUE degrades to ~1.72 at
50% load), plus a WUE (Water Use Effectiveness, L/kWh by cooling type) and annual water estimate, with
a small SVG curve. Additive only (does not touch the calculator's own PUE math), renders on window.load
after the deferred engine, hides gracefully if the engine is unavailable, dark-mode-safe. Placed in the
free results area (not the Pro-locked section). Verified 0 console errors both themes.
v1.51.5
PATCH
July 05, 2026
RZEngine v2.1.0 — correlated + scenario sim; TCO Monte-Carlo consolidated
Added (engine)
RZEngine.models.sim.monteCarlo gained correlated variables + discrete scenarios (engine
2.0.0 → 2.1.0, backward-compatible). New categorical distribution ({choices:[{value,weight}]})
for weighted discrete draws, and an optional opts.correlations:[{a,b,rho}] imposing pairwise
correlation between normal keys (z_b ← rho·z_a + √(1−rho²)·z_b). When opts is omitted the RNG
path is byte-identical to v2.0, so the capex/opex/roi panels are unaffected. tools/test-rz-engine.mjs
now 79 assertions (added categorical, correlation-widens-spread, no-opts-determinism). Min re-built
with terser (parity-checked); cache-bust 2026-07-05-v21.
Changed
TCO Monte-Carlo consolidated onto the shared engine. Its simulation (correlated construction/power
at r=0.65 + 4 weighted macro scenarios: baseline / AI-boom / recession / power-crisis) now runs through
the seeded engine simulator, so the P5/P50/P95 are reproducible instead of jittering on every
recalculation. The cost model is unchanged — verified the engine path matches the prior inline model to
0.1% on P50 — and a full inline Math.random() fallback remains. This completes the sim-engine
unification (capex/opex/roi already on the engine; tco needed the correlation+scenario support added here).
v1.51.4
PATCH
July 05, 2026
ROI calculator — Monte-Carlo now seeded/reproducible via shared engine
Changed
ROI Monte-Carlo consolidated onto RZEngine.models.sim.monteCarlo (Pro panel). The inline
simulation used Math.random(), so the P5/P50/P95 and probability-of-positive **jittered on every
recalculation** — an awkward wart for a financial tool. It now routes through the shared engine's
SEEDED simulator, so the percentiles are reproducible run-to-run. The uncertainty model is
unchanged (revenue ±20%, occupancy ±15%, opex ±15%); the histogram render is unchanged; a full
inline Math.random() fallback remains if the engine is unavailable. Verified: same-input reruns now
return identical P5/P50/P95, 0 console errors.
TCO Monte-Carlo intentionally left as-is — its simulation uses correlated random variables
(construction/power r=0.65) and discrete macro-scenario selection (baseline / AI-boom / recession /
power-crisis) that the generic engine driver can't express; consolidating would have regressed the
model. Documented in the RZEngine↔calculator notes.
v1.51.3
PATCH
July 05, 2026
OPEX calculator — engine-powered Monte-Carlo uncertainty panel
Added
OPEX Uncertainty & Sensitivity panel on opex-calculator.html — same additive RZEngine v2.0
pattern as the CAPEX panel (v1.51.2). A 4,000-run seeded Monte-Carlo around the computed annual
OPEX, varying energy price (the dominant, volatile driver), PUE drift, and labor/maintenance
escalation → P10 / P50 / P90 + histogram + a sensitivity tornado (energy price ranks first,
as expected). Does NOT touch the calculator's own cost model/data; renders on window.load, hides
gracefully if the engine is absent, dark-mode-safe. Verified 0 console errors both themes.
v1.51.2
PATCH
July 05, 2026
CAPEX calculator — engine-powered Monte-Carlo uncertainty panel
Added
Cost Uncertainty & Sensitivity panel on capex-calculator.html — an ADDITIVE, engine-powered
analysis that does NOT change the calculator's own (superior, city-level T&T/C&W 2025) cost data or
point estimate. It runs a 4,000-iteration Monte-Carlo (RZEngine.models.sim.monteCarlo, seeded/
reproducible) around the computed total, varying construction-bid spread, multi-year escalation, and
scope growth → P10 / P50 / P90 CAPEX range + a histogram, plus a sensitivity tornado
(RZEngine.models.sim.tornado) ranking which driver moves the total most. Charts are RZEngine v2.0
framework-free SVG builders. Renders on window.load (after the deferred engine is ready) and
degrades gracefully — the panel simply stays hidden if the engine is unavailable, never breaking the
calculator. Dark-mode-safe (built on the page's theme vars); verified 0 console errors both themes.
This is the owner-chosen approach ("leave the calculators' data, add new engine capabilities they
lack") for making RZEngine v2.0 deliver value to the calculators without regressing them.
v1.51.1
PATCH
July 04, 2026
RZEngine v2.0.0 — calculator + dcmoc reconciliation audit
Changed (docs/verification — no runtime change)
A9 calculator audit : re-verified all 6 engine-consuming calculators (capex/opex/pue/roi/tco/cx)
on RZEngine v2.0.0 — 0 console errors; roi-calculator's IRR (now Newton-with-bracket honoring the
guess) computes correctly (NPV/IRR sane). Finding recorded: capex/opex/cx/tco are self-contained
(own defaults + math) and consume only the engine's shared MATH (pue/roi models) + auth/modal/pdf/ui
helpers — full adoption of the refreshed DATA values is a per-calculator enhancement, deliberately
NOT forced here to avoid regressing the hardened, working calculators.
A10 dcmoc reconciliation : audited dcmoc/src/lib/capex-data.ts (per-city $/W, T&T/C&W/CBRE 2025)
and CarbonEngine.ts (IEA 2024-2025) against the refreshed RZEngine regional data. They are
consistent in magnitude and NOT divergent — dcmoc is intentionally finer-grained and equally
current, so its city-level numbers are NOT overwritten with RZEngine's coarser regional estimates
(that would degrade dcmoc). Coupling rule corrected in standarization/SUPER_ENGINE.md §Z; dcmoc
source unchanged (build state preserved).
v1.51.0
MINOR
July 04, 2026
RZEngine v2.0.0 — database + model upgrade
Upgraded the shared Super Engine (rz-engine.js, window.RZEngine) and its database from
1.2.0 → 2.0.0 . Staged, individually-verified, and fully backward-compatible: every existing
models.* signature is unchanged; all additions are new DATA keys or OPTIONAL params. Gated by a
new harness tools/test-rz-engine.mjs (76 assertions — worked examples + data invariants +
reachability + provenance). All 6 engine-consuming calculators re-verified: 0 console errors.
Added
Schema + provenance (A1) : DATA.meta (schemaVersion/engineVersion/asOf/lastReviewed/license),
a DATA.sources sidecar (every value → {source, asOf, unit?, method?}), and DATA.provenance[]
citations. Harness fails if any registered value lacks a source.
Expansion tables (A3) : country regions (ID/SG/JP/IN/MY), land, laborRates, carbon
(grid factors + carbon price + embodied), water (WUE + price), aiDensity, coolingTypes,
tiers (I–IV), extra roles + salaryRolesExt, discountDefaults (WACC), pueMatrix, refresh.
New models (A7) : models.sim.monteCarlo/tornado/sensitivityGrid (seeded, reproducible),
models.carbon.*, models.water.*, and charts.* implemented as framework-free SVG builders
(histogram/tornado/sensitivity/roiLine/costStackedBar/hiringTrajectory).
Model math (A6) : cooling-aware capex + AI/GPU density + land/commissioning/permitting line items;
opex water/carbon/insurance/connectivity (opt-in) + PPA/TOU/demand + cooling-efficiency consumption;
roi npvAuto/discountedPayback + Newton-with-bracket IRR honoring guess; forecast R²/confidence
band + inflation wiring + scenario bands; tco lifecycleNPV (discounting + salvage); workforce
hiringPlan/attritionCostWeighted/cumulativeHiresCompounded.
Changed
2026 data refresh (A2) : regional power $/kWh, salaries, capex/MW (full tier × cooling matrix),
PUE defaults, currency, inflation — all re-sourced to 2026 with asOf tags.
No buried constants (A4) : moved coolingClimate, contractCostBase, staffingLoadFactor,
opexDefaults, capexDefaults, refresh, workforceParams out of function bodies into DATA.
Reachability (A5) : liquid/immersion capex + PUE defaults are now actually consumed
(datacenterBuildCost(…,cooling), pue.defaultFor(cooling,tier)); inflation + attrition defaults wired.
Fixed capex breakdown — it/mep/civil now split on the pre-contingency base (no contingency
double-count; civil ≥ 0); total magnitude unchanged.
Fixed / build (A8)
Killed the version drift: DATA.version → 2.0.0, pdf.scriptTagsHTML() cache-bust and page ?v=
bumped together to 2026-07-04-v2. rz-engine.min.js regenerated reproducibly with terser
(parity-checked against source). tools/test-rz-engine.mjs added to the CLAUDE.md ship-gate.
See standarization/SUPER_ENGINE.md §Z.
v1.50.44
PATCH
July 04, 2026
Accessibility — advisory cleanup: heading order + landmarks, audit fully CLEAN
Changed — cleared all 56 non-gating axe advisories from v1.50.41; audit-a11y now
reports zero findings of any severity on the 8-page set x both themes:
Heading order : article-26 callout boxes (.pfas-insight/warning/danger-box) h4 → h3
with an !important re-assertion of the compact box-heading look (the shared editorial
.article-body h3 rule uses !important sizes); fire/cdu calculator input panels
h3 → h2 (they sat directly under the page h1); paper cards + footer column labels on
datacenter-solutions, articles, fire h4 → h3. Styling preserved (computed
font-size/color verified per page).
Landmarks : the version stamp is now a labelled complementary landmark (shared
script.js/script.min.js — contentinfo would duplicate the footer landmark); the
TOC mobile drawer + sidebar get role="navigation" from shared js/rz-article-toc.js;
article-26 evidence block + series nav labelled; articles.html decorative particles
canvas aria-hidden and floating side cards a labelled complementary; the glossary
disclaimer moved inside <main>.
Cache-busts: script.min.js (71 pages), rz-article-toc.js (32 pages).
Verification — audit-a11y CLEAN (0 critical/serious, 0 advisory); full suite green:
script-tags, js-syntax, version-stamp, mobile 0 fail, responsive-layout CLEAN (113pp),
dark-coverage CLEAN (114pp), charts 25/25, interactions CLEAN.
v1.50.43
PATCH
July 04, 2026
Second Brain — proper Knowledge Wiki node, repo docs split out
Fixed
Second Brain "Wiki" pointed at the wrong content : the graph's wiki node and the
header Wiki link both opened standarization/repos/REPO_INSTALL_PLAN.md (a repo
install plan), not a knowledge wiki. Both now open the real vault landing
obsidian-knowledge-vault/00-Hub/Wiki.md.
Added
obsidian-knowledge-vault/00-Hub/Wiki.md — a proper knowledge-wiki landing: what the
vault is, the 8 hubs (articles / calculators / apps / series / standards / comparisons /
reports / automation) with [[wikilinks]], and how to navigate by connections.
repos graph node ("Repo Install Plans") — the repo/tooling install docs remain
reachable but no longer masquerade as the Wiki; edges wiki↔repos, rzstd↔repos,
asb↔repos. sync-graph.py: 0 dead URLs, graph renders 0 console errors.
v1.50.42
PATCH
July 04, 2026
Homepage — portfolio glow consistency + clean gradient background
Changed
Portfolio consistency : extended the reference bottom-rising colored-glow card treatment
(already on the hero bento cards) to the rest of the homepage — .metric-card (Career
Achievements), .oe-card (Operational Excellence ×8), and .case-card (Case Studies ×3).
Each card now carries an always-visible bottom radial glow in a per-card accent (blue / green /
amber / violet / magenta / teal rotation via nth-child), content stacked above via
> * { z-index: 1 }, intensity scaled by mode (day .30 / dark .58 / rainbow .95). Index-only,
in styles-index.css per the 2-stylesheet architecture.
Removed
Hero grid : dropped the gold 60px line-grid on .hero-background (background: transparent);
the soft radial washes + .rz-bg-gradient / aurora provide the backdrop — reference is a smooth
gradient, and this aligns with rejected-pattern #1 (no dot-grid/line-grid noise on the hero).
Film-grain dots : disabled the sitewide [data-theme="dark"] body::before feTurbulence noise
overlay ON THE HOMEPAGE ONLY (index-only stylesheet — content: none; background: none), so the
dark + rainbow background stays a clean smooth gradient (removes the "titik2" speckle). Other
pages keep the grain via styles.css.
v1.50.41
PATCH
July 04, 2026
Accessibility — permanent axe gate + full 8-page WCAG-AA pass
Added
tools/audit-a11y.mjs — permanent accessibility render gate (in the ship suite +
CLAUDE.md): vendored axe-core 4.10.2 (tools/vendor/axe.min.js) over an 8-page
representative set (index, articles, article-13, article-26, fire/cdu calculators,
glossary, datacenter-solutions) x both themes, over local HTTP with the
localStorage+attribute theme method. Fails on any critical/serious violation;
moderate/minor (heading-order, region) are reported as non-gating advisories.
Changed — extended the WCAG-AA sweep from v1.50.40's 4-page audit set to the full
8-page gate set (341 flagged nodes → 0 critical/serious, both themes):
article-13.html: brand company badges (AWS/Google/Microsoft/NVIDIA) darkened on
their tinted chips with dark-mode counterparts; 44 inline emerald + 39 amber/red/violet
table accents darkened with paired dark overrides; TOC section numbers + reference
numbers (#06b6d4 at 2.3:1) → #0e7490/#22d3ee; .article-body h4 dark override;
neon code-span colors (#67e8f9/#f472b6/#ff9900) darkened in light mode only.
articles.html: card excerpts + category chips darkened (light) with dark pairs.
datacenter-solutions.html: --text-muted both themes; open-buttons were near-white
on pale blue; neon instrument tokens darkened light-only; section/paper/FAQ headings
used --dark-blue (#1e3a5f) in dark mode → readable overrides.
cdu-calculator.html: derived/warn/alarm chips, mode buttons, pro-gate overlay scrim
(.55 → .78), 2 remaining unlabeled inputs (aria-label), note links underlined.
Shared styles.css: .calc-disclaimer .disc-fine used #64748b !important
(beat every page-level fix) → theme-correct colors + readable disclaimer links.
Shared js/rz-article-editorial.js: focusable-scroller tagging now also covers
tables that scroll themselves (display:block tables), re-scans on window.load +
document.fonts.ready, and matches axe's any-overflow threshold.
Cache-busts: styles.min.css (69 pages — was still on v=2026-05-18 after
v1.50.40's edit), styles-index.min.css, rz-article-editorial.js (37 pages).
Verification — audit-a11y --strict CLEAN (8pp x 2 themes, 0 critical/serious, 56
non-gating advisories); full suite green: script-tags, js-syntax, version-stamp 185/191,
mobile 0 fail, responsive-layout CLEAN (113pp), dark-coverage CLEAN (114pp), charts 25/25,
interactions CLEAN.
v1.50.40
PATCH
July 04, 2026
Accessibility — WCAG-AA sweep: labels, contrast, focusable scrollers, landmarks
Added
Form-label associations : 7 calculator inputs on fire-calculator.html and 13 on
cdu-calculator.html now carry explicit <label for="…"> associations (axe
label/select-name criticals — all resolved).
Keyboard-reachable scrollable tables : js/rz-article-editorial.js now tags every
horizontally-scrollable table wrapper in the article body with tabindex="0" +
role="group" + an aria-label, so keyboard users can scroll wide tables
(axe scrollable-region-focusable).
Cookie-banner landmark : the cookie notice on 78 pages is now a named region
(role="region" + aria-label="Cookie notice").
Changed
WCAG-AA contrast sweep (~478 flagged nodes → 0 on the audit set, both themes):
darkened low-contrast light-mode colors (#94a3b8→#64748b, #f59e0b/#d97706→#92400e,
#22c55e→#15803d, #2563eb→#1d4ed8, #8b5cf6→#6d28d9, fire --fc-primary →
#b91c1c light-only) with paired dark-mode overrides where the swept colors sat on
dark panels (article-26 PFAS tables/cards, glossary term counter, fire preset buttons).
Version stamp readable : the footer stamp no longer washes its text to 2.4:1 via
container opacity — text runs at full opacity with dedicated colors
(.rz-version-label / .rz-version-num, both themes); subtlety moved to the logo image.
In-paragraph links distinguishable without color (WCAG 1.4.1): terms/privacy/footer
prose links are underlined (text-underline-offset: 2px).
Inline style="color:…" attributes (including JS-set el.style.color, which
serializes to rgb()) are neutralized in dark mode via per-value
[style*="…"] overrides on article-26.html + glossary.html.
Fixed
tools/audit-dark-coverage.mjs false positive on index.html: pages that re-apply
the theme from localStorage on window.load (rainbow-mode init) undid the gate's bare
attribute flip — the gate now writes localStorage.theme together with the attribute,
mirroring the real toggle.
tools/audit-mobile-responsive.py no longer walks into .claude/worktrees/ agent
checkouts (4 false FAILs from email-signature templates in a stale worktree).
Version stamp injected on 5 internal pages that were missing it (plan-article-experience,
rz-index-mockup*, rz-index-polish, rz-index-redesign).
Verification — axe-core 4.10.2 sweep (index, article-26, fire-calculator, glossary ×
light+dark): 0 contrast / 0 link-in-text-block / 0 label violations. Full gate suite green:
script-tags, js-syntax, version-stamp 185/191, mobile-responsive 0 fail, responsive-layout
CLEAN (113pp), dark-coverage CLEAN both modes (114pp), article-charts 25/25, interactions CLEAN.
v1.50.39
PATCH
July 03, 2026
Fix — Rainbow mode showing light cards after navigating home
Fixed — a reported bug: after returning to the homepage while in Rainbow mode, the
bento cards rendered in light/day even though the rainbow background + toggle icon
were active. Root cause: the shared script.min.js runs applyTheme(getPreferredTheme())
at DOMContentLoaded from the theme key; if that key had drifted to light (e.g. the
2-way toggle was used on another page) while rzRainbow=1, it overwrote data-theme
to light while the index-only .rz-rainbow class stayed → light cards on a rainbow
background. The index theme controller wasn't re-asserting afterward.
The controller now re-asserts the stored mode on load (enforce()) and on
bfcache restore (pageshow, browser back/forward), and normalizes the theme
key back to dark whenever rainbow is active.
Added a MutationObserver on data-theme: while rzRainbow=1, if anything flips it
off dark, it's restored immediately (catches the clobber with minimal flash).
Verified headless across all states (clobber rzRainbow=1+theme=light → corrected
to dark cards; normal rainbow/dark/day consistent) + visual screenshot of the
previously-broken state now correct; 0 console errors; js-syntax + script-tags CLEAN.
Index-only inline JS (no CSS change).
v1.50.38
PATCH
July 03, 2026
Living-diagram + scrollytelling rollout — article-25 & article-16
Added
article-25 (PJM Grid Crisis) — a live grid schematic: GENERATION FLEET → PJM GRID → LOAD. Click
"Fast-forward: 2027–28" and ~40 GW of thermal retires (warn), the grid's capacity gap hits 6 GW
(alarm), generation flow slows — with 65M people downstream and data centers driving 40% of load growth.
All figures as stated in the article body.
article-16 (SE Asia bubble) — a scrollytelling of Johor's 5.8 GW pipeline, stage by stage : 487 MW
live → +422 MW building → +1.4 GW committed → +3.4 GW on paper, with a cumulative MW counter (487 → 5,709)
and proportional bars that make the bear case visible (most of the headline is the red "planning" bar).
Values from the already-verified data/article-16/johor-pipeline.csv (PUBLISHED chip).
Both verified interactively (scenario alarms/flows; scrolly 0→3 + reverse; 0 errors). The site now has
3 living diagrams + 2 scrollytelling stories , all provenance-gated (25 configs CLEAN).
v1.50.37
PATCH
July 03, 2026
Engagement events for the new interactive systems
Added
rz-tracker events (guarded, no-op when the tracker is absent) so the admin dashboard can measure the new
systems: rz_search_open / rz_search_go (destination + query) / rz_command (palette),
rz_diagram_scenario (living diagrams), rz_scrolly_complete (scrollytelling reached the final step, fired
once). Verified recording into rz_user_events; interaction gate CLEAN. Modules cache-busted to ?v=1.50.37.
v1.50.36
PATCH
July 03, 2026
Page weight — shared TOC + non-blocking Inter fonts
Changed
The article TOC is now a shared module — 32 pages each carried a ~3.6KB duplicate inline copy of the
TOC/scrollspy script; all excised (marker- and signature-bounded, with sanity asserts) and replaced by
js/rz-article-toc.js (idempotent: skips pages without TOC markup or where a list was already built;
strips the heading-anchor glyph from labels). ~115KB of duplicated inline JS removed site-wide; one
implementation to maintain. Scrollspy verified live (active-section highlight on scroll).
The Inter/JetBrains Google-Fonts stylesheet is now non-blocking (media="print" onload + <noscript>)
on 34 article/FF/geopolitics pages — the second render-blocking font request removed (the editorial
Fraunces set went async in v1.50.24). Interaction + dark-coverage gates CLEAN.
v1.50.36
PATCH
July 03, 2026
SEO — fix the 3 pages missing required Open Graph tags
Fixed — the SEO audit's only REQUIRED-tag errors: three pages
(all-in-one-dashboard.html, network-compare.html, network-visualization-hub.html)
had no Open Graph tags at all , so they rendered as bare links when shared on
social/messaging. Added the full block per page — og:type/url/title/description/image
(+ image dims/alt where a dedicated OG card exists; assets/profile-photo.jpg fallback
for the dashboard), twitter:card/title/description/image, and a WebPage/CollectionPage
JSON-LD. audit-seo.py REQUIRED errors: 3 → 0 (61+ clean pages). JSON-LD validated,
js-syntax + script-tags CLEAN.
v1.50.35
PATCH
July 03, 2026
Deep search — the palette now finds article SECTIONS
Added
Section-level deep search in the command palette: new search-sections.json (345 entries — every article
h2 with a static id, generated by tools/build-search-sections.py --apply) is lazy-loaded alongside the main
index; queries ≥3 chars surface up to 3 "§ Section · " hits that deep-link straight to the heading
(e.g. "workforce cliff" → article-27.html#section-1, verified to land the H2 in view). Regenerate the file
when adding/renaming article sections (noted in CLAUDE.md tooling + interaction gate stays green).
v1.50.34
PATCH
July 03, 2026
Interaction gate — the new interactive systems are now CI-protected
Added
tools/audit-interactions.mjs — a permanent ship-gate that exercises the interactive systems with REAL
keyboard/mouse/scroll in a headless browser (spins its own static HTTP server so search-index.json fetches
work): command palette (Ctrl+K / query / Esc / "/" on a migrated + a previously-dead page), living-diagram
scenario injection (article-13/9), scrollytelling step advance + reverse with counter targets (article-23),
and the reading-polish features (anchors, min-left chip, exactly one progress bar). Counter checks poll until
settled. Added to the CLAUDE.md audit suite. First run: CLEAN.
v1.50.33
PATCH
July 03, 2026
Portfolio CTA — differentiate Get Started from Download Resume
Fixed — the previous portfolio pass made the amber gradient apply to BOTH primary
CTAs (Download Resume + Get Started, which share .btn-bento-primary). Per the
reference, only Download Resume is amber; **Get Started is now a distinct violet-tinted,
violet-bordered button** (.bento-cta-row .btn-bento-primary), with a stronger violet
edge in rainbow mode. Contact Us stays the plain outline. Verified across day/dark/
rainbow (amber vs violet confirmed, identity card matches reference), 0 console errors;
gates CLEAN (dark both modes, responsive). Index-only CSS, re-minified.
v1.50.32
PATCH
July 03, 2026
Homepage portfolio — reference-matched colored card treatment
Changed — reworked the homepage portfolio (bento) section to match the owner's
reference across day / dark / rainbow, closing the "only partial elements checked" gap.
Per-card colored glow. Each experience card now has a pronounced gradient glow
rising from its bottom edge in its own accent — ZTE blue, Astra green, Cargill amber,
AWS violet, Pure Data magenta (recolored AWS orange→violet + Pure Data purple→magenta
to match the reference). The bottom feature cards get the same treatment (governance
teal, SAP green, Explore amber). Previously the accent was a faint hover-only corner
circle (~0.10 alpha); now it's an always-visible bottom radial with content stacked
above it (.bento-exp-card > * { z-index:1 }).
Intensity scales by mode — day subtle pastel (opacity .34), dark medium (.66),
rainbow full-strength (1.0) — so rainbow reads as the vibrant reference while day
stays clean.
Download Resume CTA → amber-gold gradient (#E8B563→#f59e0b, a brand accent),
matching the reference (was emerald).
Verified visually against the reference in all three modes (screenshots), 0 console
errors; gates CLEAN (dark both modes, responsive, version-stamp, js-syntax, script-tags).
Index-only CSS in styles-index.css (re-minified, cache-bust bumped).
v1.50.31
PATCH
July 03, 2026
Calc-hardening rollout complete — all financial calculators
Changed — rolled the shared RZCalc hardening (input validation with error states
CSV export) across the remaining engine-backed calculators, completing the program.
capex-calculator (validate IT load + fuel autonomy), opex-calculator (IT load),
roi-calculator (10 financial inputs), tco-calculator (4 core inputs; the
4.8k-line flagship, integrated non-invasively — bespoke theme + Pro machinery
untouched), carbon-footprint (4 editable inputs; readonly/derived excluded), and
cx-calculator (validation on its button-triggered cxCalculate(); its existing
Gantt CSV kept). Each gets an Export CSV button (except cx, which already had one).
All use the shared js/rz-calc-utils.js (window.RZCalc) — no per-page duplication.
Validation is non-gating on these (they read inputs defensively with ||default
/ getVal(id,default)), so out-of-range inputs are flagged (.rz-invalid + inline
summary) without altering the compute.
Every engine-backed calculator on the site is now hardened : cdu, fire, pue, capex,
opex, roi, tco, carbon, cx. Tracker: standarization/CALC_HARDENING_ROLLOUT.md.
Verified headless — all 6: util loaded, calc renders results, out-of-range → summary +
field marked, restore → cleared, 0 code-level console errors (only pre-existing
external geo-IP requests). Audits CLEAN (js-syntax, script-tags, version-stamp,
dark-coverage both modes, responsive).
v1.50.30
PATCH
July 03, 2026
Shared calc-hardening utility + PUE calculator rollout
Added — a reusable production-hardening utility for the engine-backed calculators
(M-303: one shared engine, not per-page hardcoded), plus its first rollout.
js/rz-calc-utils.js (window.RZCalc) — self-contained, zero-dependency ES5
helper that injects its own theme-aware CSS and provides: validateNumbers()
(checks numeric inputs vs their min/max, marks .rz-invalid + aria-invalid,
returns {ok,errors}), showErrors() (toggles a .rz-calc-validation summary),
and downloadCSV() / csvEscape().
pue-calculator.html now uses it: out-of-range inputs (e.g. IT load beyond
50–100000) surface an inline summary + field marking (non-gating — the calc is
already defensive with ||default), and a new Export CSV button downloads all
inputs + the computed results (PUE, DCiE, total power, cooling load, UPS loss,
annual energy/cost, rating). Verified headless: calc renders; out-of-range → summary
.rz-invalid; restore → cleared; CSV → 16 rows; 0 console errors.
standarization/CALC_HARDENING_ROLLOUT.md — tracker + integration pattern for the
remaining calculators (capex/opex/roi/tco/carbon/cx), so the rollout is consistent.
v1.50.29
PATCH
July 03, 2026
Fire calculator — production hardening: input validation + CSV export
Added / Changed — same production-readiness pass as v1.50.28, now on
fire-calculator.html (Program Phase 3 — calculator-suite consistency).
Input validation + error states. Numeric inputs (room volume/area/temp, battery
energy) are validated against their min/max before the engine runs; the design
concentration stays optional (blank = default Class-A). Invalid fields get
.invalid + aria-invalid and a clear inline summary ("Room volume is required",
"Design concentration must be 1–60"); results show "Awaiting valid inputs" instead of
NaN.
CSV export. New "Export CSV" button downloads all inputs plus the computed KPIs
(agent quantity, design concentration, occupant-safety margin, GWP/residual-O₂,
detectors, discharge time, and the Li-ion runaway/off-gas panel when present) —
in-browser, no server transmission.
Verified headless: valid → 9 KPIs + 9 CSV rows; cleared field + out-of-range → summary
marking; blank optional concentration → no error; 0 JS errors; audits clean.
This completes the production-readiness hardening across the site's two bespoke
engine-backed calculators (CDU + Fire). The Finance-Terminal gateway (Phase 1) is built
tested and awaits the owner's one-time Cloudflare deploy (cf-worker/DEPLOY.md).
v1.50.28
PATCH
July 03, 2026
CDU calculator — production hardening: input validation + CSV export
Added / Changed — production-readiness pass on cdu-calculator.html (Program Phase 2).
Input validation + error states. Every numeric input is validated against its
min/max before the engine runs. Invalid or empty fields are marked (.invalid +
aria-invalid) and a clear inline summary appears (e.g. "ΔT must be 3–20", "IT load
is required"); the results panel shows an "Awaiting valid inputs" prompt instead of
feeding NaN to the engine. Fixes silent/NaN output when a field is cleared or out of range.
CSV export. New "Export CSV" button downloads the full run — all inputs plus the
8 computed KPIs (flow, velocity, ΔP, HX approach, NPSH margin, dew-point margin, pump
power, N+1 count) — built entirely in the browser (no server transmission), matching
the existing PDF export.
Verified headless: valid state renders 8 KPIs + 8 CSV rows; cleared/out-of-range
fields trigger the summary + field marking; recovery restores results; 0 JS errors;
script-tag + js-syntax audits clean.
v1.50.26
PATCH
July 03, 2026
Homepage gradient backdrop + index-only Rainbow mode
Added — the homepage (index.html) now has a full-page gradient backdrop and a
third, index-only Rainbow theme, per owner reference designs.
Gradient backdrop — a fixed, GPU-composited .rz-bg-gradient layer behind all
content (no background-attachment:fixed, so it never repaints on scroll — safe on
low-power tablets). Three tasteful variants driven by the theme:
Day — soft pastel radial wash (blue / lavender / peach, 0.10–0.18 alpha).
Dark — subtle teal / blue / violet aurora on the near-black body.
Rainbow — vibrant multi-hue aurora (violet → blue → teal → magenta → amber),
a slow 26s hue-drift (reduced-motion-safe), brightened hero aurora-orbs, and a
faint iridescent bento-card edge.
Index-only 3-way theme toggle (day → dark → rainbow → day) with a dedicated
rainbow glyph. Architecture keeps it isolated: Rainbow = data-theme="dark" + an
additive html.rz-rainbow class, so every dark component style still applies and
stays readable, and the shared theme key stays light/dark — **the other 66
pages are completely unaffected** (they never see Rainbow; an index-only rzRainbow
localStorage key drives it). A pre-paint FOUC guard applies the theme before first paint.
Verified headless: 3-way cycle + rainbow persistence across reloads + rainbow icon;
other pages correctly stay dark (not rainbow); 0 console errors; no mobile overflow;
dark-coverage CLEAN (both modes); hero-text contrast over the rainbow wash 6.28:1 (AA);
uiux-reviewer APPROVED (no blockers). styles-index.min.css re-minified + cache-bust bumped.
CSS lives ONLY in styles-index.css (index-only feature; 2-stylesheet architecture).
v1.50.27
PATCH
July 03, 2026
Search unification complete — all 29 inline copies migrated
Changed
The remaining 29 pages with per-page inline Fuse.js search (index, articles, insights,
datacenter-solutions, articles 1–19, geopolitics + geopolitics-1/2/3, FF-1, future-forward) migrated to the
shared js/rz-command-palette.js: each page's dedicated "Feature 21: Global Search" inline script block
removed and replaced by the module. Zero inline search copies remain — one implementation site-wide, and
every page now also gets the "/" shortcut + Commands group (theme toggle, quick nav). Verified over HTTP on 7
representative migrated pages: Ctrl+K opens, queries return results, commands present, 0 page errors.
(article-19 had a marker variant + an eager fuse.js CDN tag — both removed; fuse.js is now lazy-loaded
everywhere.) This completes the search unification begun in v1.50.23.
v1.50.26
PATCH
July 03, 2026
Scrollytelling flagship — the Colossus build, step by step
Added
js/rz-scrolly.js — a zero-dep scroll-driven narrative system: a pinned canvas (position:sticky)
evolves as step cards cross the viewport middle (IntersectionObserver band). Steps set data-step on the
container (CSS reveals canvas layers) and animate <text data-cv> counters (rAF easeOutCubic; instant under
prefers-reduced-motion; no-IO browsers see the final state). Works forwards AND backwards.
Flagship: article-23 ("xAI Colossus: 150 MW in 122 Days") — right after "xAI did it in 122 days," the
reader scrolls through the build: (0) an empty Electrolux plant, construction 19 days after conception →
(1) unpermitted gas turbines + Tesla Megapack BESS power up, MW counter climbs to 150 → (2) rack rows fill
the hall, GPU counter spins to 100,000 → (3) DAY 122 — LIVE , with the Huang quote. Every milestone as
stated in the article body (ILLUSTRATIVE-chipped schematic). Canvas reuses the living-diagram SVG tokens +
dash-flow. Verified by real scroll-through: steps 0→3 advance with correct counters/layers and fully reverse,
0 page errors.
Scrollytelling authoring recipe added to ARTICLE_DATAVIZ_STANDARD.md. This completes the 4-phase
"jauh lebih keren" program (v1.50.23 palette → .24 polish → .25 living diagrams → .26 scrollytelling).
v1.50.25
PATCH
July 03, 2026
LIVING DIAGRAMS — animated schematics in the reading flow
Added
js/rz-article-diagram.js — the cockpit animated-schematic language (CSS dash-flow on SVG pipes/busbars +
a live 1s ticker + fault-injection scenarios, the cdu-mini-bms/chiller-plant idiom) packaged as a reusable
in-article widget: [data-rz-diagram] figure = authored SVG + JSON config (baselines with min/max/exact
clamps, flows, scenarios with deltas/alarms/msg). Instrument scenario buttons ("Normal" first,
aria-pressed), aria-live narration, ticker pauses offscreen (IntersectionObserver), prefers-reduced-motion
disables the dash animation, theme-aware --dg-* tokens, caption + basis chip (ILLUSTRATIVE) reusing the chart
styles. Conduit stroke = 4px base + 2px dashed overlay at ~32 px/s (matches the cockpit spec).
Reference pair :
article-13 (Power Distribution) — live 2N single-line diagram: UTILITY → TX → UPS-A/UPS-B → PDU →
GPU RACK (NVL72 ≈ 120 kW, 480 V AC per the article). "Inject: UPS-A failure" kills the A-path, pins UPS-A at
exactly 0%, UPS-B carries 100% — the rack never notices. The 2N story, animated.
article-9 (HVAC Shock) — live warm-water DLC loop: DRY COOLER ↔ CDU ↔ GPU RACK cold plates
(supply ≈45°C per NVIDIA, per the article). "Tropical: Jakarta 35°C" collapses the dry-cooler approach and
pushes supply past the design point (the article's thesis, animated); "CDU pump failover" slows the loop and
recovers.
Provenance gate extended : tools/audit-article-charts.mjs now validates rz-diagram-cfg blocks too
(source + basisTag mandatory) — 24 configs clean. New "Living diagrams" section in ARTICLE_DATAVIZ_STANDARD.md.
uiux-reviewer: APPROVED, no blockers; its MEDIUM patches (exact-value scenarios, aria-pressed,
aria-live, basis-chip mapping) shipped in this release. Conduit-stroke idiom ruled conformant.
Changed
tools/audit-dark-coverage.mjs + tools/audit-responsive-layout.mjs now relaunch the browser when the
Chromium process dies mid-run (ConnectionClosedError under resource pressure) instead of aborting the audit.
v1.50.24
PATCH
June 28, 2026
Reading micro-polish pack
Fixed
Editorial articles ran TWO read-progress bars (an older per-page inline #scrollProgress + the editorial
runtime's .rz-read-prog). The inline bar is now retired wherever the editorial register is active (one CSS
rule in css/rz-article-dark.css) — exactly one bar remains.
View Transitions coverage : the @view-transition cross-page fade/slide block existed only in styles.css
— mirrored into styles-index.css per the 2-stylesheet rule, so the homepage participates too.
Added
Heading anchor links — hover any article h2 for a # affordance; click copies the deep link
(clipboard + ✓ confirmation) and sets the URL hash. Auto-slugs ids where missing. (js/rz-article-editorial.js)
Live "≈N min left" chip in the related-rail head — prose-only word count (excludes embedded calculator/
widget text) ÷ 220 wpm, counts down as you scroll.
Non-blocking editorial fonts — the Fraunces/Plex Google-Fonts stylesheet now loads async
(media="print" onload) with a <noscript> fallback on 68 pages; system-font fallback shows during load
(display=swap behavior), removing a render-blocking request.
Note: the article TOC was found already present on every article (33 inline copies with scrollspy) — the
planned shared-TOC extraction was skipped as pure churn risk with no user-visible gain.
v1.50.23
PATCH
June 28, 2026
Command palette — and fixing the DEAD search on 10 pages
Fixed
Search was completely dead on 9 pages (FF-2, FF-3, articles 20–25, 27): the navbar search button +
"Ctrl+K" tooltip + modal markup rendered, but zero JS was wired — clicking/typing did nothing. And
article-26 ran a degraded inline search that filtered a non-existent tags field (the index has
keywords), so keyword search silently never matched. All 10 now run the shared module below; article-26's
broken inline block removed.
Added
js/rz-command-palette.js — the shared site search + command palette (standard going forward, see
UI_FEATURES_STANDARD.md). Ports the canonical Fuse.js modal (lazy CDN, search-index.json, recents, category
chips, match highlighting, hover preview, Ctrl/Cmd+K + arrows + Enter + Esc) and adds: a "/" shortcut
(outside inputs), a Commands group (theme toggle + quick navigation to Home / Articles / DC Solutions /
Glossary / Insights) shown when the query is empty and substring-matched while typing, and self-injecting
modal markup so it works on any page. Guarded by window.__rzPalette; the 29 pages with a working inline copy
are untouched this batch (migrate opportunistically).
Verified by real keyboard interaction over HTTP: Ctrl+K opens, "fire" → 8 results, Esc closes, "/" reopens,
theme command toggles; article-26 + FF-2 same; index.html inline search regression-free.
v1.50.22
PATCH
June 28, 2026
Finance Terminal B-006 — keyless commodity data + candlestick chart
Fixed / Changed — the Commodities tab rendered empty KPIs/table and a flat line
chart with no candlesticks.
KPIs + table: removed the Enter API key gate; loadCommodities() now uses
batchQuotes(...,{yahooFirst:true}) (keyless Yahoo spark first, no fhLim stall —
same fix as B-009/B-010/B-011). 14 commodity ETFs render in ~0.4s.
Real candlesticks: loadCmdChartLegacy() now renders through the in-house
renderCandles() (lightweight-charts: candle + volume histogram + SMA20 + crosshair
OHLC) using keyless yahooCandles data — the same TradingView-grade renderer the V2
gateway path uses, previously V2-only. New yCandleRows() adapts the candle arrays.
The Chart.js line remains as a graceful fallback if lightweight-charts is unavailable.
Added a crosshair OHLC readout (#cmdOhlc) to the Commodity Chart card header.
Verified headless (no key): 14 rows + drawn candlestick canvas; timeframe switch
(1W–1Y), commodity selection, and light/dark re-render cleanly; 0 console errors.
Tracker: B-006 candlestick chart → SOLVED (the analytics-panel + related-news half of
B-006 is the broader R-008 scope, gateway-backed — deferred).
v1.50.21
PATCH
June 28, 2026
Finance Terminal B-009/B-010/B-011 — keyless data on Sectors / Economy / Futures
Fixed — the Sectors, Economy and Futures tabs rendered empty (they gated on a
Finnhub API key, or stalled behind the shared 55/min Finnhub rate-limit budget that
the overview/watchlist tabs spend on page load).
New keyless Yahoo quote fallback in the data layer: yahooQuote() +
yahooBatchQuotes() derive a Finnhub-shaped {c,dp,d,v} quote from Yahoo's
CORS-proxy-reachable chart/spark endpoints (the same proxy race that already
powers the candlestick charts). The multi-symbol spark endpoint resolves a whole
tab's ETF list in one request (~400ms) instead of N proxied requests that trip
public-proxy rate limits.
batchQuotes(syms,{yahooFirst:true}) — Sectors / Economy / Futures now resolve via
Yahoo first (fast, keyless, no fhLim contention); Finnhub only fills any gaps.
Removed the Enter API key early-returns on those tabs.
loadSectors() now renders the data table before its charts and guards each
new Chart() in try/catch, so a charting exception can no longer blank the tab
(matches the table-before-chart order the Economy/Futures tabs already use).
Verified headless (no API key): all three tabs render real data in ~0.4s, 0 console
errors; the default batchQuotes path (overview/watchlist) is byte-identical
(opts defaults to {}).
Tracker: B-009, B-010, B-011 → SOLVED. (B-006 commodity candlesticks / B-008 news
remain — News is Finnhub-only; the broader fix is the gateway Worker, ROOT item.)
v1.50.20
PATCH
June 28, 2026
CDU suite — second-brain + knowledge graph — Ship 4
Added — the CDU↔FMECA integration (Ships 1–3) is now reflected in the Obsidian
second-brain vault + the web knowledge graph, closing the 4-ship CDU-integration plan.
Apps/second brain/obsidian-knowledge-vault/05-Standards/CDU-Suite.md (new) — living
note documenting the 6-page CDU toolkit, the FMECA fault-mode integration (F11.1–F11.5,
component C-LQC-001..007, with S·O·D + RPN table), the 6 sourced charts, and a
standards-compliance status table. [[wikilinks]] to Standards-Hub / Calculators-Hub /
Comparisons-Hub / Dark-Mode-Rollout.
Standards-Hub.md — added a "CDU Liquid-Cooling Suite" section (6-page table) linking to [[CDU-Suite]].
Apps/second brain/index.html (web graph) — added 8 nodes (cduh, cducal, cdusel, cducmp,
cduchk, cdubms, aim, cspr) + their edge cluster (hub → 5 sub-tools; checklist/mini-BMS → AI
maintenance FMECA engine; calculator ↔ spares; cooling-pillar + Air-vs-Liquid compare + DC
Solutions). sync-graph.py: 0 dead URLs; node + edge arrays parse (146 nodes / 296 edges,
0 dangling endpoints); page renders headless with 0 console errors.
See standarization/CONTENT_LINKAGE_PLAYBOOK.md §2.6.
v1.50.19
PATCH
June 28, 2026
CDU tools — interactive sourced charts — Ship 3
Added
Interactive sourced charts (js/rz-article-chart.js + Chart.js, theme-aware, crosshair) on the CDU
tools — 6 charts, each data-rz-chart figure carrying a source + basisTag, all passing
audit-article-charts --strict. Datasets under data/cdu/chart-*.csv (each with source/basis_tag):
cdu-checklist : PM-cadence by interval (DERIVED) · spare-parts cost × criticality (ILLUSTRATIVE) ·
FMECA fault RPN (DERIVED, from sod_rpn.csv).
cdu-comparison : max single-unit capacity by CDU type (VENDOR, from cdu-models.csv).
cdu-selection-guide : secondary flow vs capacity, ~0.85–0.93 LPM/kW (VENDOR).
cdu-calculator : pressure drop vs flow, dP ∝ Q² Darcy-Weisbach (DERIVED).
Chart CSS is supplied inline per page (un-scoped, theme-aware via each page's --cdu-/--ck-/--cp-
tokens) since the editorial chart CSS in css/rz-article-dark.css is register-scoped + parallel-owned.
Verified: 6 charts render + redraw on theme toggle, source caption + basis chip on each, 0 console errors;
script-tags / js-syntax / version-stamp / mobile / responsive-layout / dark-coverage / article-charts all
pass for the 4 pages. Ship 3 of the 4-ship CDU integration.
v1.50.18
PATCH
June 28, 2026
CDU checklist — FMECA fault-reference section — Ship 2
Added
cdu-checklist.html §10 — FMECA fault reference (liquid cooling, F11.x) : 5 expandable fault-mode
cards sourced from the FMECA-KG (docs/research/csv/), ordered by RPN (Severity × Occurrence ×
Detectability, IEC 60812): F11.1 chemistry-drift 140 · F11.4 fluid-degradation 120 · F11.3
manifold/hose-leak 108 · F11.2 CDU-pump-fail 60 · F11.5 filter-clog 60 . Each card carries
component (C-LQC-00x), mechanism, effect chain, detection, corrective + preventive actions, S·O·D and a
source/confidence tag (ASME/OCP = STD · Vertiv/3M = VENDOR). Notes that RPN understates the high-severity
F11.2 (S=10). Links to the Mini-BMS + the FMECA knowledge base. Printable form renumbered §10 → §11.
Verified: 5 cards render + expand, nav + cross-links resolve, 0 console errors; script-tags / js-syntax /
version-stamp / mobile / responsive-layout / dark-coverage all pass. Ship 2 of the 4-ship CDU integration.
v1.50.17
PATCH
June 28, 2026
CDU ↔ AI-maintenance/FMECA cross-linking — Ship 1
Added
cdu-hub.html — new "Maintenance intelligence" card row linking the CDU toolkit to
ai-engineering-maintenance.html (FMECA + Knowledge-Graph + ML-advisor; calls out the CDU
liquid-cooling fault modes F11.1–F11.5 ) and spares-readiness-calculator.html (CDU critical-spares
readiness — plain link; the spares calc reads only financial query params).
cdu-mini-bms.html — the educational note now maps each injected fault to its FMECA fault mode
(leak → F11.3 , pump-fail → F11.2 , filter-clog → F11.5 ) and links to the FMECA knowledge base.
standarization/CONTENT_LINKAGE_PLAYBOOK.md §2.6 — new handoff rule for maintenance tools / CDU↔FMECA
integration (cross-link AI-maintenance + spares, tag fault IDs, carry sourced charts, update the second-brain).
Cross-links verified (ai-engineering-maintenance + spares-readiness-calculator resolve 200); 0 console errors;
script-tags / js-syntax / version-stamp / mobile / dark-coverage pass for the touched pages. Part of the
4-ship CDU↔maintenance integration. (ai-engineering-maintenance.html is parallel-session-owned — linked TO, not edited.)
v1.50.12
PATCH
June 27, 2026
Finance Terminal B-004 — sort/filter on sector + futures tables
Fixed
B-004 completion (Apps/finance-terminal/index.html): the V2-gate removal (v1.50.9) made
wireTable() work in all modes, but the non-V2 render paths for the Sector and Futures tables
(loadSectors / loadFutures) never called it (the calls lived only in the V2 paths). So with a
Finnhub key in the default non-V2 mode, those tables populated but stayed un-sortable/un-filterable.
Added wireTable('sectorTable','sectorFilter') / wireTable('futuresTable','futuresFilter') to the
non-V2 paths. Both tables have proper <thead>s; page parses clean.
v1.50.11
PATCH
June 27, 2026
Finance Terminal B-005 — Market Dominance renders empty
Fixed
B-005 — "Market Dominance" cards render empty (Apps/finance-terminal/index.html): the working
horizontal-bar renderer (renderDominanceCards) was only wired into the V2 (gateway) crypto path; the
non-V2 loadDominance() still drew a Chart.js doughnut on #dominanceChart that rendered empty
(canvas sizing). Routed the non-V2 path through the same bar renderer (renderDominanceCards(g.data),
since CoinGecko /global wraps the payload in {data:{…}}). Verified: 6 dominance bars
(BTC/ETH/USDT/BNB/…) render with live data, empty canvas gone. (Same V2-gating root pattern as B-004.)
v1.50.10
PATCH
June 27, 2026
Finance Terminal B-002 forex endpoint + B-003 proxy race
Fixed
B-002 — "Error loading forex data" (Apps/finance-terminal/index.html): the forex API
(CFG.FK) pointed at api.frankfurter.app, which now **301-redirects to api.frankfurter.dev
without CORS headers on the redirect** — so the browser blocks the cross-origin redirect and the
fetch throws. Pointed CFG.FK straight at https://api.frankfurter.dev/v1 (HTTP 200 + ACAO:*,
identical {rates} shape; /latest, /{date}, /{start}..{end} all verified). Forex now loads
(29 live rates returned in-browser).
B-003 — slow data load : yahooCandles() tried the 3 CORS proxies sequentially with an 8s
timeout each, so a single hung proxy stalled a chart up to 8s before the next was tried (compounding
across symbols → the reported multi-minute load). Now races all proxies in parallel
(Promise.any, 7s) — the fastest valid responder wins, a hung proxy can't block. Verified a chart
fetch returns 22 points in ~350ms.
v1.50.9
PATCH
June 27, 2026
Finance Terminal B-004 — un-gate table sort + filter
Fixed
Finance Terminal (Apps/finance-terminal/index.html) — table column sorting + live filtering
(B-004) were wired through wireTable(), which early-returned on if(!CFG.V2). So whenever the V2
gateway flag was off (the default, and the state when the gateway is down), every data table was
un-sortable and un-filterable — the reported symptom. Sorting/filtering are pure client-side DOM
operations (reorder the rendered rows / hide by text) with no dependency on the data source, so the
V2 gate was removed. Verified: header click sorts asc, re-click toggles desc, and the filter input
hides non-matching rows (crypto / screener / sector / futures tables). Self-contained app — does not
use rz-version.js; recorded here for the changelog only.
v1.50.4
PATCH
June 27, 2026
Contact copy-to-clipboard — robust fallback chain
Changed
Hardened the Contact-box email copy-to-clipboard (index.html) into a 3-tier fallback:
navigator.clipboard.writeText → document.execCommand('copy') → select the visible email text so
the user can press Ctrl+C. Verified the execCommand tier succeeds even with the Clipboard API forced
unavailable (shows "Copied!"); the final tier selects the address. js-syntax + script-tags clean.
v1.50.3
PATCH
June 27, 2026
Scrub personal phone number from the public changelog
Fixed
The v1.50.0 changelog entry documenting the WhatsApp-number removal had itself printed the full
number into the public /changelog.html — which defeats the privacy intent. Scrubbed the literal
number from the CHANGELOG entry and regenerated changelog.html. (The number remains only in an
internal, noindex, non-sitemapped security-audit report that records the original finding.)
v1.50.19
PATCH
June 28, 2026
Systemic callout de-slop sweep — every article
Changed
Callout AI-slop, eliminated site-wide. The earlier de-slop covered only a handful of callout class names;
the uiux-reviewer flagged it as a systemic gap, and a scan confirmed nearly every article had bespoke
callout namespaces (formula-box, conclusion-box, warning-box, insight-box, danger-box, plus
per-article prefixes aif-* / pjm-* / col-* / dcj-* / a21-* …) still carrying saturated gradient
fills + 3–4px borders. Added attribute-selector rules in css/rz-article-dark.css that catch the whole
-box / -note callout family at once and apply the editorial language (flat color-mix tint +
background-image:none + hairline + 2px semantic accent rail + no heavy shadow), with a --cl accent driven by
the class-name hint (warning→amber, danger→red, success/positive→green). **Cards / panels / grids are
intentionally NOT swept** (structural, not text callouts). Cache-bust on all 38 editorial pages bumped to
?v=1.50.19 so the shared CSS reaches live visitors. Dark-coverage gate CLEAN (114 pages, both modes).
v1.50.18
PATCH
June 28, 2026
Phase 2 batch — article-22 optics-power chart
Added
article-22.html ("NVIDIA's $4B Photonics Play") — free interconnect-power bar: **pluggable optics ~16W
vs co-packaged optics (CPO) ~9W per 800G port** (~44% cut; ≈350 kW saved across a 50,000-GPU factory). New
data/article-22/optics-power.csv. A better, on-thesis angle than the flat $2B+$2B investment split.
Rendered by js/rz-article-chart.js. (article-3 / article-9 checked and skipped — calculator-generated /
scattered-prose data, no defensible free static series.)
v1.50.17
PATCH
June 28, 2026
Phase 2 batch — article-14 community-opposition chart
Added
article-14.html ("The $64 Billion Rebellion") — free opposition-impact bar: **$18B blocked + $46B
delayed = $64B** of US data-center projects stalled by community opposition (24 states; cancellations
quadrupled 6→25, 2024→2025). New data/article-14/opposition.csv. Rendered by js/rz-article-chart.js.
15 interactive sourced charts now live (gate clean). (article-4 MTTR data is calculator-generated/dynamic →
not charted, to keep the free-flow series defensible.)
v1.50.16
PATCH
June 28, 2026
Phase 2 batch — article-7 + article-5 free sourced charts
Added
article-7.html ("From Reliability to Resilience") — free Uptime Tier downtime bar: max annual downtime
28.8 h (Tier I) → 0.4 h (Tier IV) (99.671% → 99.995% availability), red→green severity ramp. New
data/article-7/tier-availability.csv (Uptime Institute Tier Standard).
article-5.html ("Technical Debt Is Operational Risk") — free cost-premium floating bar: vendor-lock-in
premiums integration 30–50% / parts 50–200% / service 20–40% . New data/article-5/tech-debt-premiums.csv
(Schneider WP37). 14 interactive sourced charts now live (gate clean).
v1.50.15
PATCH
June 27, 2026
datacenter-solutions serif hero — landing-skin rollout complete
Changed
datacenter-solutions.html — the DC Solutions landing now adopts the editorial skin:
data-rz-register="editorial" + Fraunces serif hero. The .hero h1 rule is page-INLINE (scoped to this page,
overriding the global .hero), so the gradient-clipped title keeps its gradient and only the global .hero
on other pages is untouched. **This completes the editorial serif-hero rollout across every content landing
on the site** (articles · series landings · CDU landings · pillars · compares · reports · infographics ·
glossary · DC solutions). Cockpits keep the instrument register.
v1.50.14
PATCH
June 27, 2026
Report / glossary / infographic landings adopt the editorial serif hero
Changed
asean-dc-report-2026, carbon-footprint, glossary, and the 3 infographic-* pages now adopt the
editorial landing skin: data-rz-register="editorial" + Fraunces serif hero (was bold Inter sans).
Inline-serif approach. This completes the editorial serif-hero rollout across the site's content landings
(articles, series landings, CDU landings, pillars, compares, reports, infographics, glossary). Cockpits
(calculators / mini-BMS / EPMS / grid monitors) intentionally keep the instrument register.
v1.50.13
PATCH
June 27, 2026
Compare pages adopt the editorial serif hero
Changed
All 10 compare-* pages now adopt the editorial landing skin: data-rz-register="editorial" + Fraunces
serif hero (covers both hero-class variants, .compare-hero and .cmp-hero; was bold Inter sans).
Inline-serif approach — each page keeps its own palette/Inter body. Continues the landing-skin rollout
(articles, series landings, CDU landings, pillars).
v1.50.12
PATCH
June 27, 2026
Pillar pages adopt the editorial serif hero
Changed
The 5 pillar pages (pillar-cooling/power/fire-safety/standards/sustainability) now adopt the editorial
landing skin: data-rz-register="editorial" + Fraunces serif hero (.pillar-hero h1 was bold Inter sans).
Inline-serif approach — the rest of each page keeps its existing palette/Inter body. Brings the topic-hub
landings in line with the CDU landings + series landings (insights / geopolitics / future-forward).
v1.50.11
PATCH
June 27, 2026
cdu-selection-guide editorial serif hero
Changed
cdu-selection-guide.html — the last CDU landing/guide page without the editorial skin now matches its
siblings: data-rz-register="editorial" + Fraunces serif hero (.cdu-hero h1 was generic bold sans). Page
keeps its own palette (inline-serif approach, like cdu-checklist / cdu-comparison). All four CDU landing pages
(hub / selection-guide / checklist / comparison) now share the editorial serif-hero treatment.
v1.50.10
PATCH
June 27, 2026
cdu-hub adopts the editorial landing skin
Changed
cdu-hub.html ("Liquid-Cooling CDU Toolkit" landing) now adopts the editorial register like the other
landing/hub pages (insights / geopolitics / future-forward): data/rz-register="editorial" + Fraunces serif
hero title + css/rz-article-dark.css. The .hub-hero h1/p selectors were added to the shared editorial hero
rules (dark + light). The hero title renders in Fraunces serif (was generic sans); body + cards unchanged.
v1.50.9
PATCH
June 27, 2026
Phase 2 batch — article-19 Singapore-vs-Batam power-cost chart
Added
article-19.html ("Singapore vs Batam: Why Cost Alone Doesn't Win") — free industrial power-cost
comparison: Singapore USD 0.17–0.22/kWh vs Batam USD 0.07–0.09/kWh (SG 2–3× more; a 50 MW Batam
facility saves >US$25M/yr) — floating bars that set up the article's "cost alone doesn't win" thesis. New
data/article-19/power-cost.csv. Rendered by js/rz-article-chart.js. 12 interactive sourced charts now live
(gate clean).
v1.50.8
PATCH
June 27, 2026
Phase 2 batch — article-12 hyperscaler renewable-contracts chart
Added
article-12.html ("How AI Data Centers Fund $57B in Grid Modernization") — free renewable-contracts bar:
Amazon 34 GW vs Microsoft 23.2 GW vs Malaysia's entire 35 GW grid (reference), making the article's "a
single company contracts as much renewable capacity as a whole country" point visible. New
data/article-12/renewable-contracts.csv (basis distinction noted: contracted PPAs vs total grid). Rendered by
js/rz-article-chart.js. 11 interactive sourced charts now live (gate clean).
v1.50.7
PATCH
June 27, 2026
Phase 2 batch — article-18 rack power-density chart
Added
article-18.html ("AI Factories vs Traditional Data Centers") — free rack power-density evolution line:
5 kW (2015 x86) → ~600 kW (Rubin Ultra NVL576, 2027+) across NVIDIA generations (A100, H100, GB300, Vera
Rubin), conveying the AI density explosion. New data/article-18/rack-density.csv (vendor generation specs).
Rendered by js/rz-article-chart.js. 10 interactive sourced charts now live (gate clean).
v1.50.6
PATCH
June 27, 2026
Phase 2 batch — article-16 + article-11 free sourced charts
Added
article-16.html ("Southeast Asia DC bubble?") — free Johor pipeline-by-stage bar: **487 MW operational /
422 MW under construction / 1.4 GW committed / 3.4 GW early-stage planning** (5.8 GW total), making the
"mostly unbuilt / speculative" bear case visible. New data/article-16/johor-pipeline.csv.
article-11.html ("AI Data Centers vs Citizen Bills") — free electricity-cost-index bar: Bloomberg's
267% higher costs near major data-center activity vs 5 years ago (index 100 → 367). New
data/article-11/electricity-cost.csv.
Both via js/rz-article-chart.js. 9 interactive sourced charts now live (gate clean).
v1.50.5
PATCH
June 27, 2026
Phase 2 batch — article-21 + article-23 free sourced charts
Added
article-21.html ("Nuclear SMRs for AI") — free SMR-capacity bar: Oklo Aurora 75 / NuScale VOYGR 77 /
X-energy Xe-100 80 / GE-Hitachi BWRX-300 300 / TerraPower Natrium 345–500 MWe (vendor design ratings).
New data/article-21/smr-capacity.csv.
article-23.html ("xAI Colossus: 150 MW in 122 Days") — free build-pace bar: Colossus ~4 months
(122 days, 100,000 GPUs / 150 MW) vs typical hyperscale 18–24 months . New data/article-23/build-pace.csv.
Both rendered by js/rz-article-chart.js (theme-aware, Source caption + basis chip), using the floating
(min–max) bar support added in v1.50.4. 7 interactive sourced charts now live (gate clean).
v1.50.4
PATCH
June 27, 2026
Phase 2 batch — article-24 salary-ladder chart + floating-bar support
Added
article-24.html ("Data Center Manpower Shortage") gains a free interactive salary-ladder chart — a
min–max floating bar per role/level: Technician $38–57K → Operations mid $68–84K → senior
$105–142K → Liquid-cooling specialist $90–160K → AI-infrastructure specialist $140–200K (no
four-year degree). New validated data/article-24/salary-by-role.csv (Glassdoor / PayScale / SalaryExpert +
BLS). Per ARTICLE_DATAVIZ_STANDARD.md.
Changed
js/rz-article-chart.js — bar charts now support floating (min–max) bars ; the tooltip renders the range
($min–$max).
v1.50.3
PATCH
June 27, 2026
Phase 2 batch — article-25 free sourced auction-price chart
Added
article-25.html ("PJM Grid Crisis") gains a free interactive chart: PJM's Base Residual Auction clearing
price jumped ~9× in a single cycle — $28.92 → $269.92/MW-day (July 2024, 2025/26 delivery; total
procurement $2.2B → $14.7B). New validated data/article-25/auction-prices.csv (source + basis_tag per row),
rendered by js/rz-article-chart.js (theme-aware tokens, Source caption + PUBLISHED chip). Per
ARTICLE_DATAVIZ_STANDARD.md.
v1.50.2
PATCH
June 27, 2026
Phase 2 batch — article-20 free sourced water-use chart
Added
article-20.html ("AI Data Center Water Use: Altman vs the Data") now carries a free, interactive,
finding-titled chart in the reading flow — U.S. data-center water use **2023 measured (17B gal, Joule ,
peer-reviewed) → 2028 projected (68B gal, Global Water Intelligence), ≈4×** — directly grounding the
fact-check. Driven by a new validated data/article-20/water-usage.csv (source + basis_tag per row) via
js/rz-article-chart.js; theme-aware brand tokens, Source caption + PUBLISHED chip. Per
ARTICLE_DATAVIZ_STANDARD.md. (First Phase-2 rollout increment after the v1.50.1 article-26/27 reference pair.)
v1.50.1
PATCH
June 27, 2026
Article experience overhaul — reading column, related rail, callout de-slop, calculator tooltips, interactive sourced charts
Phase 1 (shared system + article-26/article-27 reference pair). The shared CSS/JS lands on all 27 editorial articles; the bespoke calculator/chart work is the reference pair, with the rest to roll out in batches.
Fixed
Article body alignment ("nggak lurus"). Paragraphs were individually centered with a ch-based measure, so the 1.14rem lead paragraph and 1rem body paragraphs computed different widths and landed on different left edges. Replaced with a single left-aligned, justified reading column at a fixed rem measure (css/rz-article-dark.css) — every prose block (incl. the drop-cap lead), the hero figure, and tables now share one left+right edge.
Callout AI-design-slop. .info-box(+variants), .ws-insight-box, .ws-engineer-note, .ws-evidence-block carried saturated gradient fills + 3–4px borders. All adopt the editorial language: flat color-mix tint + 1px hairline + a 2px semantic accent rail + one restrained shadow + capped radius — scoped to the editorial register so it lands site-wide. Inner callout text re-aligned to the heading edge.
Article number badges washed out (articles.html): white text on saturated category gradients → one legible dark-glass instrument chip (hairline + mono tabular number) that reads on any thumbnail in both themes.
Added
Section dividers — a tier-3 hairline above each <h2>, aligned with the hero/reading column.
Related-articles rail — a compact sticky right rail built by js/rz-article-editorial.js from each page's existing "Continue Reading" cards (thumbnail derived from the href). 2-col on wide screens, collapses to the bottom grid < 1024px. Zero per-article markup edits.
Calculator tooltip compliance (article-27.html .ws-calc-wrap): all 12 inputs + 9 KPI cards now carry .tip help affordances (formula / denominator / source) per TOOLTIP_STANDARD.
Interactive, validated-data charts — new js/rz-article-chart.js renders on-brand Chart.js charts (CNBC-style hover crosshair + tooltip, instrument tokens, theme-aware, finding-titled) from an inline sourced config, with a visible Source caption + basis chip . Reference charts: article-26 dual-axis fluid-loss line (from the verified data/article-26/worked-model-scenarios.csv) and article-27 aging-workforce bar (new data/article-27/workforce-stats.csv, AFCOM 2024). New gate tools/audit-article-charts.mjs blocks any chart without a source+basisTag. See standarization/ARTICLE_DATAVIZ_STANDARD.md .
Changed
tools/audit-dark-coverage.mjs + tools/audit-responsive-layout.mjs hardened (--disable-dev-shm-usage, resilient page close) to survive headless browser crashes when cycling many pages.
v1.50.0
MINOR
June 27, 2026
index hover fixes + WhatsApp removal + Contact box enhancement
Fixed
Hover wobble (index.html cards) — the company-logo hover used a springy easing
cubic-bezier(0.34, 1.56, 0.64, 1) (Y=1.56 overshoots) that made the logo bounce/oscillate. Replaced
with a smooth cubic-bezier(0.4, 0, 0.2, 1) + smaller scale(1.02) → a subtle micro-movement.
Hover blink/disappear (index.html cards) — the global hover rule set animation: none !important
while the entrance animations (swingIn on .oe-card, bentoRise on .bento-exp-card) stayed bound
to the cards, so every mouse-leave re-applied and replayed the entrance from opacity:0 . Several
reveal observers also kept re-adding .visible. Fix: the IntersectionObserver now unobserves after the
first reveal, an observer-independent init-time handler freezes each card's entrance animation
(animation:none) once it ends so it can never replay, and the animation:none was removed from the
hover rule. Verified by instrumented hover-testing: 0 entrance-animation restarts on hover.
Removed
Personal WhatsApp number removed from index.html — the visible contact card
and all four structured-data spots (Person telephone+sameAs, ProfessionalService telephone,
Organization sameAs+contactPoint). The generic "Share on WhatsApp" share-bar button (shares the page
URL, not the number) is kept.
Changed
Contact box enhanced (index.html .contact-info): availability line with a pulsing status dot +
a primary "Email me" CTA; the methods are grouped under labels (Direct contact · *Find me
elsewhere · Based in*); each email has a copy-to-clipboard button with "Copied!" feedback; refined
card styling with matching dark-mode overrides. Re-minified styles-index.min.css + script.min.js,
cache-busts bumped.
v1.49.10
PATCH
June 27, 2026
cdu-calculator — slashed-zero KPI numerics
Changed
cdu-calculator.html KPI value displays (.kpi-val, .cc-pp-kpi .v) now use
font-variant-numeric:tabular-nums slashed-zero, matching the instrument-grade numeric style
already used on fire-calculator.html and the checklist tables. Closes the last item of the
CDU-hub uiux back-port (theme-key was already unified in v1.49.5; dark chips already present).
v1.49.9
PATCH
June 27, 2026
Add root favicon.ico — kill the site-wide /favicon.ico 404
Fixed
Added a multi-resolution root favicon.ico (16/32/48 px, generated from assets/Favicon.png).
The site declared a PNG favicon via <link rel="icon">, but browsers still auto-request
/favicon.ico from the web root — which 404'd on every page (a console error visible on all
100+ pages). A health probe across the CDU + Fire pages confirmed this was the only remaining
console artifact; with the file in place, those pages now report 0 console errors and 0 4xx.
v1.49.8
PATCH
June 27, 2026
Responsive reading column + responsive tables
Fixed
Articles no longer sprawl or sit left-stuck on wide screens. Root cause: there was no site-wide
reading-width rule on .article-content / .article-body (only inside @media print), so the body grew
with the viewport while the 68ch paragraph cap held text left-aligned and tables filled the full body width
— at a 2400px viewport article-27's body reached 1520px with a 1520px table beside a 930px text column
("table lebih lebar dari text, berantakan"). Added a shared reading-layout system in styles.css:
.article-body is capped to 1180px and centered, and its direct prose children (`p, h2–h4, ul, ol,
dl, blockquote, figure, pre, table) share one centered 760px` reading column. Because only direct prose
children are capped, the interactive widgets embedded in .article-body (calculators, strategy grids,
gantt charts) keep full width — verified article-27's Workforce calculator still renders at 1116px.
Tables scroll instead of overflowing on phones. .article-body table becomes an overflow-x:auto
scroll container ≤900px. Fixes article-1 (4 data tables, was +210px horizontal page scroll) and
tia-942-checklist (.gap-table, was +38px).
EPMS_Telemetry no longer scrolls sideways on mobile. The position:absolute .ui overlay held a
fixed-height toolbar wider than a phone; the page's overflow-x:hidden guard was defeated by the
overflow-x:hidden+default-overflow-y:visible scroll-promotion quirk. Switched the guard to
overflow-x:clip and constrained the toolbar to 100vw with internal horizontal scroll (cockpit stays a
desktop dashboard).
Editorial skin (css/rz-article-dark.css) reconciled: the 68ch measure is now centered
(margin-inline:auto) and extends to direct-child tables, so editorial articles match the new column.
Added
tools/audit-responsive-layout.mjs — new ship-gate. Renders every content page at 390 / 768 / 2400px
and FAILS on real user-facing horizontal scroll (measured via actual scrollX, not the scrollWidth
artifact) or an article prose table wider than the reading column. CLEAN across 113 pages. Added to the
CLAUDE.md audit suite. See standarization/RESPONSIVE_STANDARD.md "Article reading column".
v1.49.7
PATCH
June 27, 2026
Cooling pillar — link the CDU toolkit
Added
pillar-cooling.html now includes a Liquid-Cooling CDU Toolkit resource card (→ cdu-hub.html),
placed next to the Air-vs-Liquid comparison. The pillar's own intro promises it "links every
cooling-related resource," but the CDU suite — the biggest recent cooling addition — was missing.
Found via a cross-linkage evaluation (search-index coverage for all 9 new pages is complete; the
fire pillar↔tools links were already in place; this was the one real pillar→tool gap).
v1.49.6
PATCH
June 27, 2026
DC Solutions hub — surface the Fire suite
Added
datacenter-solutions.html Engineering & Compliance Tools now lists the **Fire Suppression
Calculator (fire-calculator.html) and Fire Safety Checklist** (fire-checklist.html) alongside
the CDU Toolkit — previously only the Fire-Safety pillar was linked, not the interactive tools
(the same discoverability gap just fixed on tools.html). Tool-count badge 9 → 11.
Fixed
Corrected a stale <!-- coming soon --> code comment on the PLN Sumatra card (the card itself has
been published/linked since v1.46.6).
v1.49.5
PATCH
June 27, 2026
Theme persistence — unify the localStorage key site-wide
Fixed
Cross-page theme persistence. 19 pages stored the theme under non-standard localStorage keys
(rz_theme on the cdu-, compare- , pln-java-grid-*, dc-market-tracker, tier-advisor pages;
rfs_theme on rfs-readiness-workbench) while the rest of the site + script.js + the FOUC guard
use 'theme'. Result: setting dark on one page didn't carry over when you navigated to one of
these — it reverted to its own key's default. Unified all of them to 'theme' so the theme
persists across the whole site (the admin panel's separate rz_admin_theme is intentionally left).
Verified: the affected pages now honour the shared key on load and write it on toggle; dark-coverage
gate CLEAN in both modes; JS audits CLEAN.
Known (pre-existing, separate)
tier-advisor.html has a chartjs-plugin-annotation console error (chart-lifecycle, unrelated to
the theme-key change) — tracked for a separate fix.
v1.49.4
PATCH
June 27, 2026
CDU Mini-BMS — P&ID instruments light up by alarm state
Changed
cdu-mini-bms.html P&ID schematic now colours each tagged instrument by its live alarm state
(amber WARN / red ALARM), mirroring the tiles and the active-alarm banner — so a fault reads
consistently across all three views instead of the schematic only showing the leak marker. Example:
on Filter clog, PDT-01 (filter ΔP) and PDT-02 (loop ΔP) go red and FT-01 (flow) goes amber. The
LT-01 reservoir-level instrument is now also link-interactive (click ↔ its tile) and state-coloured.
v1.49.3
PATCH
June 27, 2026
Both-mode enforcement — fix stuck-dark-in-light + gate covers both themes
The both-mode audit's structural check (body must match the active theme) caught the
inverse of the v1.48.1 bug: pages with a light palette that stay dark in light mode .
Fixed
changelog.html stuck dark in light mode — it had [data-theme="light"] rules for the
content cards but no [data-theme="light"] body, so light mode showed a light navbar over a
dark body (a broken middle state). Added the light body/surface rule to the generator template
(tools/build-changelog-html.py) and regenerated; the hero band stays dark intentionally.
(achievements.html is intentionally dark-only — no light palette — so it's correct as-is.)
Changed — enforcement now covers BOTH modes
tools/audit-dark-coverage.mjs now also fails STUCK-DARK-IN-LIGHT : a page declaring a
light palette ([data-theme="light"] / :root:not([data-theme="dark"])) must render a light
body in light mode. Pages with no light palette are dark-only (cockpits, dark trophy pages) and
skip the light check. Gate CLEAN across 114 pages in both themes.
v1.49.2
PATCH
June 27, 2026
Tools hub — surface the missing Fire suite + PLN Sumatra grid
Added
tools.html now lists the recently-shipped tools that were missing from the hub:
Fire Suppression Calculator (fire-calculator.html) and Fire Safety Checklist
(fire-checklist.html) in Compliance & Standards Tools, and the **PLN Sumatra Interconnected
Grid** (pln-sumatra-grid.html) in Market & Grid Monitors. (All three pages already existed and
were in sitemap/search-index/llms — only the hub listing was stale.)
Fixed
tools.html tool count corrected 18 → 23 across the hero copy, hero badge, meta/OG/Twitter
descriptions, and the JSON-LD CollectionPage ItemList — which was also completed to 23 entries
(it had been missing the CDU toolkit and Spares Readiness calculator in addition to the new tools).
v1.49.1
PATCH
June 27, 2026
Nav cleanup — Tools out of the Insights dropdown
Removed
index.html Insights navbar dropdown — removed the "Tools & Calculators" sub-item (it mixed a
tools link into a reading/insights menu). The dropdown now reads Engineering Journal · Global Analysis
· Future Forward · Glossary · — · Second Brain · All Insights, matching the Insights dropdown already
used on the rest of the site. tools.html stays reachable via the global search and page footers;
the calculators remain in the DC Solutions dropdown.
v1.49.0
MINOR
June 27, 2026
CDU checklist spares-planning view + Mini-BMS tile reading-guide
Added
cdu-checklist.html §07 — "Spares planning" subsection turning the parts register into an
actionable stocking plan: per-item min stock on site , typical service life (real replacement
cadence, not just the inspection interval), lead time (the real driver for holding a critical
spare), and estimated annual spend per CDU . Closed with a budget roll-up : recurring
consumables ≈ $1,000–4,000/yr/CDU, one-time on-site critical-spare kit ≈ $1,500–6,000, shared
fleet spare pump ≈ $600–3,500 — all EST planning bands (not a quote), noting filters + fluid as
the dominant cost drivers.
cdu-mini-bms.html tile reading-guide — a compact "how to read a tile" strip above the live
tiles explaining the anatomy (instrument tag matching the P&ID · value+unit · range bar with normal
band + live marker · NORMAL/WARN/ALARM status · click for trend), so the redesigned board is
self-explanatory to learn.
v1.48.2
PATCH
June 27, 2026
Both-mode text audit — fix comparison-badge contrast
Audited all 114 pages in both light and dark (228 renders) with a refined,
gradient-aware text-contrast probe, then visually verified the worst-flagged pages.
Fixed
.cmp-badge-a/-b low contrast on the comparison pages — the A/B badges set
accent-coloured text on a light tint of the same accent (color:var(--cmp-accent) on
background:var(--cmp-accent-light)), ≈2.5 contrast (sub-WCAG) in both themes. Changed to a
solid accent background with white text (high contrast, theme-independent). 5 compare pages.
Audit result
The rest of the contrast flags were false positives confirmed by screenshot: hero photo /
overlay backgrounds, auth-gate dimming (gated labs/cockpits), gradient card backgrounds, and
intentionally-dim mono labels/captions. Body text, headings, lists, and tables render readable
in both modes across the site. The genuine white-body-in-dark class was already fixed + gated
in v1.48.1 (audit-dark-coverage.mjs, still CLEAN across 114 pages).
v1.48.1
PATCH
June 26, 2026
Dark-mode standard — fix white-body-in-dark on 13 pages + enforcement gate
Owner report: many content pages render broken in dark mode (only nav + title dark,
article body stays white) and the standard isn't enforced across sessions. Root-caused,
fixed, and made self-enforcing.
Fixed
The :root, [data-theme="light"] cascade bug on 11 pages (cdu-calculator, cdu-hub,
cdu-selection-guide, compare-air-vs-liquid-cooling, compare-ashrae-vs-uptime,
compare-fm200-vs-novec, compare-pue-vs-dcie, compare-tier-3-vs-tier-4, fire-calculator,
fire-checklist, pln-sumatra-grid). They defined a dark var palette, but a
:root, [data-theme="light"] selector matched in all themes and (equal specificity, later
in source) overrode the dark values, so body + cards + text stayed light in dark mode.
Changed the light fallback to :root:not([data-theme="dark"]). One-selector fix; flips the
whole var-driven palette (background AND body text) to dark.
tia-942-checklist — :root had only a light palette; added a [data-theme="dark"]
block redefining --bg-primary/--bg-secondary/--text-*/--glass-bg to the dark palette, plus a
.calc-disclaimer dark override.
tier-advisor — added a .calc-disclaimer dark override (the one hardcoded-light element).
Added — enforcement (so future sessions can't ship broken dark mode)
tools/audit-dark-coverage.mjs — render gate: loads every content page in dark and FAILS
on a white body or large light content block, and statically flags the :root, cascade bug.
Added to the ship-audit suite in CLAUDE.md. Run: node tools/audit-dark-coverage.mjs --strict.
Documented the mandatory pattern in CLAUDE.md + standarization/DARK_MODE_STANDARD.md: every
content page must define a dark palette (or load the standard skin) and pass the gate; never use
:root, for the light fallback.
Verification
Gate CLEAN across 114 content pages (0 white-in-dark, 0 cascade bug); cdu-selection-guide
(the reported example) now body-lum 15. Audits script-tags/js-syntax CLEAN.
v1.48.0
MINOR
June 26, 2026
CDU Mini-BMS — accurate fault propagation + tile redesign
Changed
cdu-mini-bms.html live-parameter tiles redesigned for BMS accuracy and clarity.
Each tile now shows its instrument tag (FT-01, TT-01, PT-01, LT-01 … matching the
P&ID), a range bar with the normal band shaded and a live position marker, and an
explicit NORMAL / WARN / ALARM status line with the numeric range. Replaces the
ambiguous "band X" subtitle (which printed nonsense like "band PG25 OK" / "band cap×").
Derived tiles (flow total, return temp) are now labelled DERIVED with their formula.
Faults now propagate to the parameters they physically affect (the previous model
flipped a single flag, so a Leak alarm left every other tile green). Now: Leak →
reservoir level (LT-01) falls + system pressure sags + make-up active; Filter clog →
loop dP up + flow down + ΔT rises; Pump-A fail → N+1 → N (flow holds on standby);
Hot facility water → supply up + HX approach widens; Low flow → ΔT up + dP down.
Correlated tiles change state together, so the board reads like a real BMS.
Added
Active-alarm banner above the tiles — severity badge (NORMAL/WARN/ALARM), a
plain-language cause + operator response for the selected fault, and chips listing every
tripped instrument (tag + parameter). Reads "All parameters nominal" when healthy.
Reservoir-level tile (LT-01) with its own trend, giving the leak scenario a second
correlated signal (level falling) beyond the leak switch.
Fixed
Scenario selector: the active Normal chip now reads neutral-green (healthy) instead
of the alarm-rust colour that made a healthy board look faulted.
v1.47.1
PATCH
June 26, 2026
Articles — KPI hero strip: instrument-grade values
Changed
KPI hero-strip values across all editorial articles now render in JetBrains/IBM Plex
Mono with font-variant-numeric: tabular-nums, and labels in IBM Plex Mono uppercase
(shared css/rz-article-dark.css, both themes). Removes the generic "SaaS hero-metric"
read; per-article accent colour + hero identity kept. Verified mono+tabular both themes.
v1.47.0
MINOR
June 26, 2026
CDU checklist — spare-parts register + exploded-view resources
Added
cdu-checklist.html §07 Spare-parts & consumables register — a 15-row matrix
mapping every PM line that consumes a part to: what to replace, the
acceptance / replace-when trigger, interval, a part reference / spec (commodity
manufacturer family or OEM service-part class), a critical-spare class
(CRITICAL / RECOMMENDED / ON-DEMAND), and an estimated unit-cost band.
Covers filter/strainer element, PG25 fluid, dry-break QDs, EPDM gasket kit, pump
seal kit, spare pump, expansion bladder, leak rope+controller, flow / dP / temp-RH
sensors, TCV actuator, inhibitor/biocide dosing, PSV, and L2A air filter. Cost
bands tagged EST (illustrative market range, not a quote); specs STD/VENDOR.
cdu-checklist.html §08 Exploded-view & IPB resources — per CDU type — per-type
cards (in-rack / in-row / sidecar / L2L end-of-row / L2A air-cooled) with
representative OEMs and links to obtain the Illustrated Parts Breakdown / service
manual (CoolIT, Vertiv, Delta, Stulz, nVent Schroff, Motivair/Schneider, Boyd,
ZutaCore) plus cross-links to the CDU comparison.
Changed
cdu-checklist.html §06 PM checklist — enriched from 3 columns to 4
(Task | Frequency | Acceptance/action | Parts/consumable); each part-consuming row
now deep-links to its §07 register line. Added PSV annual test, QD/gasket inspection
and L2A air-side coil service rows; sharpened acceptance criteria (e.g. filter dP
trigger > clean +0.3–0.5 bar). Symptom and printable-form sections renumbered §09/§10.
v1.46.6
PATCH
June 26, 2026
PLN landing rearrange + Sumatra interconnected grid
Added
pln-sumatra-grid.html + js/pln-sumatra-grid-data.js — a new PLN Sumatra interconnected
grid monitor, built like the Java-Bali one: an interactive Leaflet map + 31-node substation/plant
atlas of the 275/150 kV north-to-south backbone (Aceh→Lampung), major plants (Asahan, Pangkalan
Susu, Bukit Asam, incl Medco gas), and the separate Batam-Bintan island grid with **Medco Power
Panaran** and the Nongsa subsea-cable data island. Self-contained (no engine dep); 0 dangling edges;
curated from RUPTL 2025-2034 + PLN AR 2024 with confidence tags. Registered in sitemap/llms/search-index.
Changed (datacenter-solutions.html — PLN section rearrange)
Removed the 4 placeholder "SOON" cards (Kalimantan, Sulawesi, Maluku-Papua, Nusa Tenggara) — the
grid now shows the 2 published monitors (Java-Bali + Sumatra), a cleaner grouping.
Flipped the Sumatera card from "Coming soon" to published (NEW badge, links to the new monitor,
Medco/Batam/Nongsa features); footnote updated.
Verified
Audits clean; Sumatra page: map + 60 markers/lines + 31 atlas rows + Medco/Batam stats render,
dataset 0 dangling edges, 0 console errors; datacenter-solutions PLN section 2 cards, 0 errors.
No bug, no error.
v1.46.5
PATCH
June 26, 2026
Articles — uiux-review reading-experience overhaul
Acted on a uiux-reviewer audit of the editorial register. All in shared
css/rz-article-dark.css, both themes, every article + hub. Verified 37 pages:
0 light-on-dark, 0 errors, 0 over-wide measure.
Fixed (review CRITICAL/HIGH)
Reading measure — prose was uncapped (~142ch). Capped .article-body p/li/h2/h3/blockquote
to 68ch (lists 70ch); tables/figures stay full-width. The single biggest readability win.
Day body font — the day register block had no .article-body p rule, so day copy fell back
to Inter (the font design.md rejects). Forced IBM Plex Sans + line-height 1.75 in both themes.
Heading hierarchy — skin never set heading sizes (h2 inherited 24px, h2/h3 ratio 1.2, equal
weight in dark). Now explicit editorial scale: h2 clamp(1.75rem,3vw,2.25rem) weight 600 ,
h3 clamp(1.2rem,2vw,1.45rem) weight 500 (ratio ≈1.55, weight contrast restored).
Vertical rhythm — h2 was glued to the next paragraph; added margin:2.4em 0 .55em (h2),
1.7em 0 .4em (h3).
Day hero wash — the day .article-hero::before amber radial stacked over saturated bespoke
heroes (e.g. article-26 orange) and washed out the dek; removed it in day (content:none).
figcaption — articles hardcode inline italic 14px #64748b; the skin rule now uses
!important + font-style:normal so captions render as intended mono/muted.
Title size normalised to one floor clamp(2.6rem,5vw,3.5rem).
Added (requested refinements)
Section-number kickers — magazine-style mono 01 / 02 / 03 on each h2 (CSS counter),
replacing the bare amber tick with the number + an amber underline.
Lead paragraph — first body paragraph set to 1.14rem to open the article (pairs with the drop-cap).
Figure framing — 2.2rem rhythm, soft 8px corners, responsive img.
v1.46.4
PATCH
June 26, 2026
Articles — editorial reading-experience refinements + day-accent contrast fix
Design pass on the editorial register (impeccable-guided, on-brand). All in the shared
css/rz-article-dark.css, so every article + hub gets them; both themes.
Fixed
Day-mode accent contrast. Each article sets style="--rz-art-accent:#E8B563" inline on
<html> (the dark gold). That inline value was overriding the day variant, so day-mode
links/meta/rails rendered in light gold #E8B563 (≈1.7:1 on white — fails). Forced the day
accent to readable #b45309 with !important (beats the inline). Dark unchanged (#E8B563).
Changed
Inline body links now read as editorial amber with an always-on hairline underline that
brightens on hover (accessible; per-link inline colours like the purple disclaimer link are
preserved). Resolves the accent per theme.
Pull-quotes lose the 2px accent side-stripe (an impeccable absolute-ban) for an even
hairline border + a hanging Fraunces quotation glyph — more editorial, on-brand.
Figure captions → IBM Plex Mono, muted (matches the instrument-grade meta).
Selection → a warm amber wash on editorial pages.
Verification
Both themes: pull-quote glyph renders + border is 1px; links amber/underlined and readable
(day #b45309 / dark #E8B563); global dark re-probe 0 light-on-dark / 0 errors (34/34). Audits CLEAN.
v1.46.3
PATCH
June 26, 2026
Article HUBS — editorial parity + theme bug-fixes
Extends v1.46.2 from the 34 articles to the article-ecosystem hub pages
(articles.html, insights.html, future-forward.html) the §08 skin also targets.
Fixed
No-FOUC theme guard added to the 3 hubs (they had the editorial register + skin CSS but
not the guard → dark readers flashed white on load). geopolitics.html already had it.
insights.html — 6 white-card light-on-dark islands. The resource cards
(.reports-grid > a: Live Tracker / Regional Report / AI-HPC Platform / Infographic) use inline
background:var(--bg-card,#fff); --bg-card is undefined in dark there, so they fell back to
pure white. Added dark overrides (#1e293b card / light text). Re-probe: 0 light-on-dark.
Verification
All 3 hubs: FOUC fires pre-paint, dark 0 light-on-dark, toggle flips cleanly, hero renders
Fraunces in both themes, 0 console errors. Audits CLEAN.
v1.46.2
PATCH
June 26, 2026
Articles — §08 editorial skin in BOTH themes + zero switching bugs
Owner report: the approved §08 article skin (plan-dark-mode-standard.html) wasn't
implemented properly across all articles, and many articles were buggy switching
dark↔day. Full sweep across all 34 content articles — "ensure no bug".
Added
Day/light editorial variant (css/rz-article-dark.css). The §08 editorial register
was DARK-ONLY ([data-rz-register="editorial"][data-theme="dark"]); articles fell back to
the plain look in day mode. Added a light-palette mirror scoped
:not([data-theme="dark"]) — Fraunces serif title, IBM Plex Mono kicker/meta, gold drop-cap,
amber h2 accent-rail, pull-quote, soft warm hero wash — so the editorial skin now reads as the
same design in BOTH themes (gold #b45309 accents on light for contrast; article light
surfaces kept so bespoke layouts don't break). Verified Fraunces title/h2/drop-cap + mono meta
render in day on all articles.
No-FOUC theme guard on all 34 content articles — inline <head> script applies the saved
theme before first paint (calculators already had this; articles didn't → dark readers got a
white flash). Confirmed data-theme is set at paint time.
Fixed
Broken dark↔day toggle on article-26 — a redundant inline #themeToggle handler
double-bound with script.js initDarkMode; the two cancelled each other so the toggle was
stuck. Removed the inline handler (script.js owns it). **All 34 toggles now flip cleanly
(probe: 0 broken).**
Dark-mode light-on-dark coverage gaps (via /ultraplan, 5 agents self-verified to zero):
article-10 .table-note-row, article-11 .bar-container, article-16 green pills + amber
timeline-dot, article-17 .highlight-row/.safe-box/.author-section/dot, FF-3
.iec-tooltip-trigger/.iec-benchmark-tag — plus article-13 amber .flow-box. Each light
pastel dark-toned to a same-hue dark tint with readable text; white gauge-needle markers left
intact. Global re-probe: 0 opaque light-on-dark across all 34.
article-2 console TypeError — chartjs-plugin-annotation loaded without defer while
chart.js had it, so the plugin ran before Chart's helpers existed. Added defer. **0
console errors across all 34.**
Verification
Headless probes: dark = 0 light-on-dark / 0 errors (34/34); toggle = 0 broken (34/34); day
editorial chrome renders; FOUC guard fires pre-paint. Audits script-tags/js-syntax CLEAN.
v1.46.1
PATCH
June 26, 2026
Fire-safety hub — Ship 5: pillar deep-analysis expansion
Changed (pillar-fire-safety.html — from thin landing to analysis hub)
Added a fire-strategy four-stage lifecycle (Detect → Confirm → Suppress → Evacuate) and a deep
"Lithium-ion BBU — the thermal-runaway strategy" section (the owner's gap): why suppression does
NOT stop runaway, a 5-layer mitigation stack (cell-level BMS detection · H₂/CO off-gas detection +
ventilation per NFPA 855 · BMS isolation + EPO · compartmentation + UL 9540A spacing · suppression
for the associated fire), the off-gas hazard callout, and a clean-agent sizing/occupant-safety note.
Added 2 resource cards (fire-calculator + fire-checklist ) and a Li-ion FAQ; extended the
CollectionPage hasPart (now 6) + FAQPage schema. Scoped .fa-* styles with full dark-mode overrides.
Verified
Audits clean; 3/3 JSON-LD valid; 6 cards / 4 lifecycle steps / 5 mitigation layers / 4 FAQs render;
0 console errors; dark + mobile pass. Fire-safety hub complete (Ships 1–5). No bug, no error.
v1.46.0
MINOR
June 26, 2026
Fire-safety hub — Ship 4: design/commissioning + Li-ion checklist
Added
fire-checklist.html — a super-detailed fire-safety checklist (9 sections, 5 source-tagged
tables): clean-agent design parameters (NFPA 2001 design conc / NOAEL / discharge / hold), detection
& alarm (aspirating, cross-zoned release, EPO), a dedicated Li-ion battery-room fire-safety
section (NFPA 855 / UL 9540A — off-gas H₂/CO detection ≤25% LFL, ventilation/explosion control,
thermal-runaway onset, BMS↔FACP coordination), the numeric commissioning procedure (door-fan
integrity, discharge test, cross-zone, Li-ion off-gas commissioning), installation + routine
inspection checklists, a PM cadence table (daily→annual), a symptom→cause→action troubleshooting
table, and a printable service-record form (window.print + print CSS). --fc- fire theme,
STANDARD/TYPICAL source tags, dark + mobile.
Registered: sitemap.xml (114), llms.txt (125), search-index.json (new entry).
Verified
Audits clean; 9 sections / 5 tables / 25 checkboxes / 35 source tags render; print form works;
0 console errors; dark + mobile pass. No bug, no error.
v1.45.0
MINOR
June 26, 2026
Fire-safety hub — Ship 3: clean-agent & Li-ion fire calculator
Added
fire-calculator.html — interactive fire-protection calculator wiring js/fire-engine.js to
live KPIs: clean-agent quantity (NFPA 2001) + cylinders + kg/m³, design concentration, **occupant
safety vs NOAEL** (alarms when design conc exceeds NOAEL), GWP-weighted CO₂e (or inert residual-O₂),
smoke-detector coverage, discharge/hold bands, and a Li-ion BBU panel — thermal-runaway heat,
off-gas volume, and off-gas-vs-LFL room concentration (hazard-flagged, NFPA 855 / UL 9540A). Per-
scenario presets, tooltip per input, basis chips + band-coloured rails, --fc- fire theme.
Applied the pending uiux fixes from the start: theme key theme (site-consistent), slashed-zero
numerics, dark-mode chip overrides, keyboard-focusable tooltips, 2px focus outline.
Registered: sitemap.xml (113), llms.txt (124), search-index.json (new entry).
Verified
Audits clean; 9 KPIs render; engine-backed values correct (Novec 500 m³ → 343 kg; FM-200 11% →
occupant-safety alarm −2 pts to NOAEL; IG-541 → 235 m³ inert + residual-O₂; 333 kWh NMC → off-gas
72.7 vol% hazard); 0 console errors; dark + mobile pass. No bug, no error.
v1.44.4
PATCH
June 25, 2026
Fire-safety hub — Ship 2: data layer + glossary
Added (data/fire/ + glossary)
data/fire/clean-agent-properties.csv (5) — Novec 1230 / FM-200 / IG-541 / IG-55 / CO₂: NFPA
2001 design concentrations, min-extinguishing, NOAEL/LOAEL, s=k1+k2·T coefficients, GWP, discharge.
data/fire/li-ion-chemistry.csv (5) — NMC/LFP/LCO/VRLA thermal-runaway onset (150 / 166.8 /
150 °C), energy density, off-gas L/Wh + species, TR heat factor, governing vent-gas LFL.
data/fire/standards-references.csv (12) — NFPA 75/76/2001/72/13/855, NFPA 70, UL 9540/9540A,
IEC 62619, FM Global DS 5-32, ISO 14520.
data/fire/README.md manifest + basis-tag legend + key formulas.
Glossary: 9 new fire/battery terms — Thermal Runaway, UL 9540A, Off-Gassing, Cross-Zoned
Detection, Compartmentation, Room Integrity (door-fan test), Design Concentration, NOAEL & LOAEL,
NFPA 855 — cross-linked to the fire pages.
v1.44.3
PATCH
June 25, 2026
Fire-safety hub — Ship 1: frozen fire engine + tests
Added (foundation for the DC fire-safety calculation hub — no UI yet)
js/fire-model.js — deep-frozen window.FIRE_MODEL: clean-agent data (Novec 1230 / FM-200 /
IG-541 — NFPA 2001 s=k1+k2·T coefficients, design concentrations, NOAEL/LOAEL, GWP, cylinder fill),
Li-ion/VRLA chemistry (NMC/LFP/LCO thermal-runaway onset 150/166.8/150 °C, off-gas L/Wh, energy
density), off-gas LFL, detection/suppression bands (≤10 s discharge, ≥10 min hold, NFPA 72 detector
spacing, 25% LFL gas alarm), and a standards register (NFPA 75/76/2001/72/13/855, UL 9540/9540A,
IEC 62619, FM Global, ISO 14520). Every constant // source:-tagged + basisTag.
js/fire-engine.js — pure deterministic engine window.FIRE_ENGINE (no Math.random): NFPA 2001
halocarbon agent mass W=(V/s)·(C/(100−C)) + inert volume ln(100/(100−C)); occupant safety margin vs
NOAEL; cylinder count; GWP-weighted CO₂e; detector coverage; discharge/hold-time bands; Li-ion
thermal-runaway heat, off-gas volume, room LFL margin; and a roomState() composite.
tools/test-fire-calc.mjs — vm-sandbox, 31/31 PASS , hand-derived NFPA-2001 expecteds +
frozen/no-PRNG/determinism guards. Wired into tools/ship-gate.sh.
v1.44.2
PATCH
June 25, 2026
CDU calculation hub — Ship 4/5: suite integration
Changed (cross-link the new calculator into the CDU suite)
Added in-content links to cdu-calculator.html from cdu-selection-guide.html (sizing lead),
cdu-checklist.html (operating-bands lead), cdu-comparison.html (intro) and cdu-mini-bms.html
(hero crumb) — the calculator was previously reachable only from the hub.
Deferred (with rationale)
The mini-BMS physics-rewrite (route its synthetic basis through cduState()) is **intentionally
deferred**: its TYPES/SCEN values are already numerically identical to cdu-model.js (they were
lifted from it), so a core rewrite of the polished, accuracy-gated 5-phase cockpit would risk
regressions for zero numeric change. Recommended only as a separately-probe-verified effort if desired.
v1.44.1
PATCH
June 25, 2026
CDU calculation hub — Ship 3b: calculator Pro tier + PDF
Added (cdu-calculator.html — Pro analysis tier)
Free/Pro toggle + login modal (demo demo@resistancezero.com / demo2026), gated .cc-pro
section with blur overlay, rz_premium_session auth + rz-auth-change integration.
TCO & ROI panel — capex (engine capexUsd by type), annual energy (computed pump power ×
$/kWh), annual opex, 10-yr NPV of ownership, $/kW·year — all from the engine's TCO functions.
Monte-Carlo (10,000 runs) on annual pump-energy cost — inputs perturbed ±15–20%, P5/P50/P95 +
an inline SVG histogram. Randomness lives only in the page layer (SIMULATED), never the engine.
Sensitivity tornado — ranks heat-load / run-length / fittings / pump-efficiency by impact on
pump kW (inline SVG).
Dynamic engineering narrative (hydraulics / thermal-safety / economics).
PDF tech-spec export — window.open() first, <\/script> escaped, derived-results + Pro
tables + embedded SVG charts, print-color-exact. Privacy note (browser-only).
Font Awesome added for the lock/PDF icons.
Verified end-to-end: real-click login unlocks; TCO/MC/sensitivity/narrative compute; 0 console
errors; audits clean; page still passes version-stamp + mobile.
v1.44.0
MINOR
June 25, 2026
CDU calculation hub — Ship 3: interactive sizing calculator
Added
cdu-calculator.html — a new interactive CDU sizing & thermohydraulic calculator (the
centerpiece of the hub). Wires the validated js/cdu-engine.js to live KPIs: secondary flow +
LPM/kW (vs OCP band), pipe velocity, pressure drop (Darcy-Weisbach), HX approach (ε-NTU), NPSH
margin, dew-point margin, pump electrical power and N+1 count. Per-CDU-type load presets, a tooltip
on every input, basis chips + band-coloured rails on every KPI (ACCURACY_VALIDATION rule 6),
--cdu- theme, full dark-mode + mobile, version stamp. 0 console errors.
Registered across the site: cdu-hub.html (new "05 · Calculate" card + JSON-LD hasPart + "five
resources" copy), sitemap.xml (112 URLs), llms.txt (123 pages), search-index.json (new entry).
Notes
Free-tier core ships first per the rollout plan; the Pro tier (TCO/NPV, Monte-Carlo, sensitivity
and a PDF tech-spec) lands next as Ship 3b. PG-25 fluid properties are handbook-class (ILLUSTRATIVE).
v1.43.74
PATCH
June 25, 2026
CDU calculation hub — Ship 2: data layer + glossary
Added (data/cdu/ + glossary)
data/cdu/coolant-fluid-properties.csv (24 rows) — water + PG-25 density/cp/viscosity/thermal-
conductivity/Prandtl across 5–60 °C, generated from the engine (build-fluid-properties.mjs).
data/cdu/cdu-operating-bands.csv (20 rows) — the acceptance windows (supply, ΔT, flow LPM/kW,
dP, system pressure, approach, dew-margin, velocity, NPSH margin, water chemistry) from
cdu-checklist §01–03 + ASHRAE/OCP, each basis-tagged.
data/cdu/cdu-models.csv (15 rows) — verified vendor CDU models with capacity/flow/dP/approach/
fluid/BMS-protocol/ASHRAE-class/link-status.
data/cdu/standards-references.csv (10 rows) — ASHRAE TC9.9, OCP cold-plate/UQD/Deschutes,
Redfish DSP2064, ASME B31.3, ISO 4406/NAS 1638, ASTM D1193, PG-25.
data/cdu/README.md manifest + basis-tag legend + link-validation mandate.
Glossary: 12 new CDU terms — Approach Temperature, Cold Plate, Dew-Point Reset, Effectiveness-NTU
(ε-NTU), FWS, Filtration (ISO 4406), Inhibitor Reserve, Leak Detection (CDU), Manifold, NPSH,
Redfish CoolingUnit, TCS — each cross-linked to the relevant CDU page.
v1.43.73
PATCH
June 25, 2026
CDU calculation hub — Ship 1: frozen thermohydraulic engine + tests
Added (foundation for the CDU data + calculation hub — no UI yet)
js/cdu-model.js — deep-frozen window.CDU_MODEL: the single source of truth for CDU work.
Per-type presets (lifted from cdu-mini-bms TYPES/SCEN), operational bands (cdu-checklist §01),
ASHRAE W-classes, OCP cold-plate flow points, fluid anchors (water + PG-25), pipe IDs/K-values,
pump + TCO defaults, standards register, and verified vendor model rows. Every constant carries a
// source: tag + basisTag (STANDARD/VENDOR/DERIVED/ILLUSTRATIVE) per ACCURACY_VALIDATION rule 6.
js/cdu-engine.js — pure deterministic engine window.CDU_ENGINE (no Math.random, numeric
guards): fluid properties f(T,glycol%); heat↔flow (Q=ṁ·cp·ΔT); ε-NTU + LMTD + approach; pressure
drop (Darcy-Weisbach, Haaland friction, velocity + fittings); NPSH + cavitation margin; dew-point
reset (Magnus/Tetens); pump hydraulic/shaft/electrical power + N+1; water chemistry (glycol top-up,
make-up, inhibitor reserve); per-type TCO/NPV/payback; and a cduState() composite (one source of
truth for the upcoming calculator + mini-BMS).
tools/test-cdu-calc.mjs — vm-sandbox acceptance harness, 40/40 PASS . ~11 worked examples
with hand-derived expected values (independent of the engine) + deep-frozen, no-PRNG, determinism
guards. Wired into tools/ship-gate.sh.
v1.43.72
PATCH
June 25, 2026
Article 26 — independent source-verification of the evidence CSVs
Changed (data/article-26/ — corrections + verified_source columns)
Two independent verification passes hardened the four curated CSVs; a verified_source column
(DOI/agency URL) was added to fluid-properties.csv, tfa-pfas-reference-values.csv and
regulatory-thresholds.csv. Corrections:
Kazil 2014 journal fixed → J. Geophys. Res. Atmos. 119(24):14059-14079, DOI 10.1002/2014JD022058 (was mis-cited as ACP).
TRI PFAS threshold 25,000 lb → 100 lb (PFAS are chemicals of special concern, NDAA 2020).
ECHA TFA status "proposed" → RAC opinion adopted (June 2026), Repr. 1B / H360Df — also reflected in the article body + ref [21].
Novec 7000/7100 breakdown products → COF₂ / HF / CO₂ (not shorter-chain PFCAs).
Opteon 2P50 : lifetime ~22 d (EPA SNAP), GWP ~2 (was ~10) — propagated to the calculator (runFluidCost) and the worked-model generator; worked-model-scenarios.csv regenerated.
R-1233zd(E) lifetime ~40 d, GWP ~3.9; FC-40 GWP ~7100 / ~500 yr; FC-72 GWP ~7910 / ~3100 yr; Novec 649 GWP <1.
AGAGE portal URL updated to the NASA LaRC archive; GHGRP format corrected to Excel/zip.
Galden (PFPE) GWP flagged unverified/disputed (~10,000 commonly cited but PFPEs are nearly involatile) — marked in the CSV, the model constants, and a Model C footnote in the article.
README.md gains a Verification section documenting the above.
v1.43.71
PATCH
June 25, 2026
Article 26 — GenX extract + the TFA-absence finding
Added
data/article-26/measurements-usgs-wqp-genx-hfpo-da.csv — 4,832 rows of real GenX
(HFPO-DA) monitoring results from the USGS Water Quality Portal since 2020. GenX is the
current-generation "safer" PFAS replacement, now itself EPA-regulated (10 ppt MCL) — the direct
analogue to the article's HFO→TFA replacement argument. Reproduce via fetch-usgs-wqp-genx.sh.
"The dataset that doesn't exist" finding box in the Data & Downloads section: querying the
USGS portal for trifluoroacetic acid (TFA) returns zero records under every name variant —
the breakdown product central to the article is unmonitored in US water-quality systems, a literal
confirmation of the "nobody is measuring it" thesis (this is a finding, not inline data).
Now ~35,000 rows of real measurements across four extracts; grid → 10 cards; README + intro updated.
v1.43.70
PATCH
June 25, 2026
Article 26 — real USGS PFOS water-measurement extract
Added
data/article-26/measurements-usgs-wqp-pfos.csv — 9,230 rows of real PFOS monitoring
results from the USGS Water Quality Portal since 2020 (both controlled-vocabulary terms ORed:
"Perfluorooctanesulfonate" + "Perfluorooctane sulfonic acid"), across water/groundwater/sediment/
tissue. PFOS is the second compound under the EPA 4 ppt MCL. Public domain. Reproduce via
fetch-usgs-wqp-pfos.sh.
Now ~30,000 rows of real measurements across three extracts (atmospheric HFC-134a + aqueous
PFOA + PFOS); Data & Downloads grid → 9 cards; README + section intro updated.
v1.43.69
PATCH
June 25, 2026
Article 26 — real USGS PFOA water-measurement extract
Added
data/article-26/measurements-usgs-wqp-pfoa.csv — 5,438 rows of real PFOA
(Perfluorooctanoic acid) monitoring results from the USGS Water Quality Portal (USGS/EPA/NWQMC)
since 2020: surface water, groundwater, sediment and tissue, reported by state agencies
(Minnesota PCA, Indiana, NJDEP, Arizona DEQ, NY DEC, Delaware River Basin, …). PFOA is one of the
two compounds under the EPA 4 ppt MCL. Public domain. Reproduce via fetch-usgs-wqp-pfoa.sh.
Featured as the second card in the "Data & Downloads" block (now two real measurement extracts:
atmospheric HFC-134a + aqueous PFOA); section intro + README updated.
v1.43.68
PATCH
June 25, 2026
Article 26 — real NOAA atmospheric measurement extract
Added
data/article-26/measurements-noaa-hfc134a.csv — 15,336 rows of real atmospheric
HFC-134a flask measurements from NOAA's Global Monitoring Lab (16 global sites, 1994–2026,
~1.8 → ~150 ppt). HFC-134a degrades to TFA at ~100% molar yield — the same TFA endpoint as the
HFO "PFAS-free" cooling replacements. Public-domain US Government data (PI: Montzka & Vimont).
Committed extract + convert-noaa-hfc134a.py (regenerable from the NOAA source URL).
Featured as the first card in the article's "Data & Downloads" block; section intro + README
manifest updated; added a measured source-class tag.
v1.43.67
PATCH
June 25, 2026
Article 26 — downloadable data & evidence files
Added (data/article-26/ — 6 downloadable CSVs + manifest)
worked-model-scenarios.csv (6,000 rows) — the article's fluid-loss model across charge
(100–5,000 L) × make-up rate (0.5–20 %/yr) × 3 fluids → annual loss (L/kg), replacement cost,
t CO₂e/yr, kg TFA/yr. Reproducible via committed build-worked-model.py.
fluid-properties.csv , loss-zones.csv , regulatory-thresholds.csv ,
tfa-pfas-reference-values.csv — sourced evidence tables (each value source-class tagged).
external-databases.csv — verified portal links to the large public monitoring archives
(EPA UCMR 5, TRI, CompTox; USGS WQP; NOAA GML / AGAGE; EU EEA Waterbase; NORMAN; German UBA;
CA GAMA; EPA GHGRP) where the raw measurement rows can be downloaded in full.
README.md manifest documenting every file + source-class tags.
Article "Data & Downloads" section (#section-data) — a links-only block (no inline data)
with download anchors to all six CSVs; new .pfas-downloads/.pfas-dl styles (dark-mode +
mobile-collapse covered).
Changed
Refreshed article meta description + og:description to the reframed 17.1%/yr framing (they
still asserted the old "20-30x" as fact).
v1.43.66
PATCH
June 24, 2026
Article 26 — uiux-reviewer polish on the new fluid-loss UI
Fixed
Tabular figures — added font-variant-numeric: tabular-nums + slashed-zero to .pfas-stat,
.pfas-kpi-value, and .pfas-table-container td so the number-dense new tables and Panel-5 KPI
cards align per design.md §2 (the chem-block ledgers already used JetBrains Mono numerics).
Tablet dead-band — .pfas-pro-kpi-grid.cols-4 mobile fallback moved from max-width:680px to
768px to align with the page's master breakpoint; the 4-up Panel-5 grid no longer cramps to four
~160px columns on 681–768px tablets. (uiux-reviewer HIGH items; APPROVED with no blockers.)
v1.43.65
PATCH
June 24, 2026
Article 26 "The Invisible Leak" — fluid-loss deep-expansion, Ship 3 of 4
Added (article-26.html — PFAS Risk Calculator Pro extension)
Panel 5 — Fluid-Loss & Environmental Cost (new gated Pro panel) — 4 KPI cards derived from the
calculator's existing maintenance-vapor mass model (single source of truth, no new inputs):
Annual fluid lost (L/yr + kg/yr + make-up % of charge), Replacement cost ($/yr at the
per-fluid unit price), GWP-weighted (t CO₂e/yr), TFA formed (kg/yr for HFO fluids).
Per-fluid property table in JS (runFluidCost): density, $/L, 100-yr GWP, molar TFA yield for
two-phase-pfas (Novec-class, GWP ~320, TFA n/a — yields short-chain PFCAs) and two-phase-hfo
(GWP ~10, TFA yield 0.695). PFAS-free configs zero out cleanly.
.pfas-pro-kpi-grid.cols-4 4-up variant (collapses to 2×2 under 680px); pfasGate5 wired into the
existing lock/unlock + Pro-mode flow. Free-tier risk output untouched.
Verified
Real-mouse Pro login (demo creds) unlocks Panel 5; KPIs compute across PFAS / HFO / PFAS-free paths;
0 console errors; values internally consistent with the on-page vapor estimate (256 kg → 183 L →
$12,800/yr → 82 t CO₂e at default 10×800 L).
v1.43.64
PATCH
June 24, 2026
Article 26 "The Invisible Leak" — fluid-loss deep-expansion, Ship 2 of 4
Added (article-26.html — quantification core)
Fluid-loss KPI framework (#section-kpi) — 6-KPI table (make-up rate, loss rate vs §608 trigger,
GWP-weighted t CO₂e/yr, TFA formation kg/yr, fluid-loss $/yr, reporting completeness) each with
formula · reference threshold · source class, closing on the "~0% reporting completeness" metric.
Worked calculation models (#section-models) — 6 monospace ledgers with every input tagged
[published]/[vendor]/[illustrative] and results as bounded ranges: reference inputs · Model A
(single 800 L tank annual loss & cost, $1,120→$9,590/yr) · Model B (per-MW hall, $9k→$77k/yr) ·
Model C (GWP-weighted emissions, 61 t→1,920 t CO₂e/yr depending on fluid) · Model D (HFO→TFA
10-yr loading, 651–1,303 kg TFA/tank) · plus a "what the numbers do and do not say" caveat box.
Fixed
.pfas-chem-block now renders multi-line — added white-space: pre-wrap + overflow-x:auto
(the class had a monospace font but no whitespace preservation, so the original chemistry block was
silently collapsing to a run-on line). Mobile font-size reduced to keep ledgers on-screen; verified
no horizontal page overflow at 390px.
Changed
article-26.html wordCount 4800 → 6200.
v1.43.63
PATCH
June 24, 2026
Article 26 "The Invisible Leak" — fluid-loss deep-expansion, Ship 1 of 4
Added (article-26.html — research-grounded fluid-loss metrics)
Loss-zone taxonomy (#section-loss-zones) — new 8-row table mapping every fluid-escape pathway
(maintenance vapour, QD spillage, operating evaporative loss, drain/transfer residual, seal/permeation,
fill/flush, end-of-life) against sourced magnitude · metered? · reportable?, plus a "gaps are the
story" callout: the most routine loss zones (seal permeation, sensor-swap loss) carry **no published
value** — reinforcing the "invisible/unmetered" thesis.
"Metrics to Watch" (#section-metrics) — leading-indicator watch-list table (make-up rate,
top-up cadence, level/chemistry drift, worker-air PFAS, exhaust concentration, boundary groundwater)
with healthy band · action threshold · interpretation, and a "cheapest instrument you already own"
box putting make-up rate forward as the single dashboard KPI (purchasing data ÷ installed charge).
"Regulatory Horizon" (#section-horizon) — what changed after the April-2026 publication: the
ECHA RAC proposal to classify TFA as Reproductive Toxicant 1B (2025-2026) and the **EU Drinking
Water Directive PFAS-Total 0.5 µg/L limit live since 12 Jan 2026**, plus a 6-row instrument table
(EPA MCL, EPA §608, EU F-Gas 2024/573, EU DWD, ECHA TFA, member-state TFA limits).
8 new references [16]-[23] — DoD/LBNL field-loss study, UBA TFA degradation, Kazil 2014 rainwater,
EU DWD 2020/2184, EU F-Gas 2024/573, ECHA RAC TFA opinion, EPA §608, Solomon TFA review.
Glossary — new Make-up Rate and TFA (Trifluoroacetic Acid) terms; updated `Maintenance Vapor
Release` term to the reframed estimate.
Changed
Reframed the unsourced "20-30×" headline as a transparent modeled estimate anchored on the one
published field measurement (DoD/LBNL 17.1%/yr evaporative loss) vs the EPA §608 10% sealed-leak
baseline — labelled a modeled upper bound, not a measured constant.
article-26.html dateModified → 2026-06-24, wordCount 3000 → 4800; sitemap lastmod + search-index
keywords/description/readingTime refreshed.
v1.43.62
PATCH
June 24, 2026
CDU Mini-BMS — interaction Phase 5: zoom/pan — ULTRAPLAN complete
Added (ULTRAPLAN cockpit interaction, phase 5 of 5 — final)
cdu-mini-bms.html — zoom / pan on the P&ID and datahall layout: + / − buttons with a
live zoom-level readout and reset (⤢), wheel-zoom toward the cursor (gated on the SVG being
focused or Ctrl held, so it never hijacks page scroll), drag-pan when zoomed (pointer events +
capture, clamped so the content always covers the viewport), and keyboard +/−/0. Implemented as a
CSS transform on the persistent box element, so it survives the SVG re-render. Vector-crisp at any
scale. Real-interaction deep-tested (button/keyboard/wheel zoom + drag-pan + reset + a Phase-1
click regression at 1×), both themes, 0 console errors.
ULTRAPLAN — CDU Mini-BMS operator-interaction layer COMPLETE (v1.43.58 → v1.43.62)
The cockpit is now a fully operable instrument panel: (1) bidirectional P&ID ↔ tile linking,
(2) pause/step/speed simulation controls, (3) trend history drawers, (4) guided fault walkthroughs,
(5) zoom/pan. Five reversible, real-mouse-deep-tested ships; presentation-only throughout — the
simulated values were never altered.
v1.43.61
PATCH
June 21, 2026
CDU Mini-BMS — interaction Phase 4: guided fault walkthrough
Added (ULTRAPLAN cockpit interaction, phase 4 of 5)
cdu-mini-bms.html — a Walkthrough toggle opens a bottom bar that steps through narrated
callouts for the active scenario (Normal · Leak · Pump-A-fail · Filter-clog · Hot-FWS · Low-flow —
4–6 steps each). Each step explains the cause→effect chain and **highlights the relevant P&ID
instrument + parameter tile** (reusing the Phase-1 link). Prev / Next / Exit, a step counter and
scenario label; switching scenario mid-walkthrough resets to step 1 of the new one. Reduced-motion
honoured. Real-mouse deep-tested (start / next / prev / scenario-reset / exit + highlight +
disabled edge-steps), both themes, 0 console errors. Presentation-only.
v1.43.60
PATCH
June 21, 2026
CDU Mini-BMS — interaction Phase 3: trend history drawer
Added (ULTRAPLAN cockpit interaction, phase 3 of 5)
cdu-mini-bms.html — click a parameter tile to open a trend history drawer : a slide-in
panel with the full 300-sample sparkline (history cap raised 30→300; the tile keeps showing
the last 30), current value, min / avg / max , sample count, the parameter band and a sourced
reference, plus a deep-link to the checklist §01. Status tiles (pumps / filter / leak / coolant)
show their info without a chart. The drawer live-updates while open; closes on ✕ / Esc /
backdrop; reduced-motion honoured.
Bug fixed via deep-testing: the .trend-drawer{display:flex} rule overrode the [hidden]
attribute, so the drawer was always rendered on top of the tiles and silently swallowed their
clicks — added .trend-drawer[hidden]{display:none!important}. Real-mouse deep-tested (numeric +
status tiles, Esc + backdrop), both themes, 0 console errors.
v1.43.59
PATCH
June 21, 2026
CDU Mini-BMS — interaction Phase 2: simulation controls
Added (ULTRAPLAN cockpit interaction, phase 2 of 5)
cdu-mini-bms.html — a Simulation control group: Pause / Resume (freezes the data
ticks and the flow/pump animation via body.sim-paused + animation-play-state), Step
(advance exactly one tick while paused), speed 0.5× / 1× / 2× / 4× (variable timer rate +
CSS animation-duration scaling so faster ticks visibly flow faster), and a LIVE / PAUSED
state pill. Play/pause kept neutral (toggle, not radio); reduced-motion honoured. Real-mouse
deep-tested: pause held a value stable over 1.6 s, Step advanced one tick, speed set the rate,
both themes, 0 console errors. Still presentation-only — sim values unchanged.
v1.43.58
PATCH
June 21, 2026
CDU Mini-BMS — interaction Phase 1: P&ID ↔ tile linking
Added (ULTRAPLAN — CDU cockpit operator-interaction layer, phase 1 of 5)
cdu-mini-bms.html — the P&ID is now operable : click (or keyboard-activate) any tagged
instrument (FT-01 / PT-01 / PDT-01 / PDT-02 / TT-01 / TT-02 / TI-03) to highlight + pulse its
parameter tile and scroll it into view; click a tile to pulse its linked instrument; hover
cross-highlights both ways; Esc clears; single-selection invariant. Instruments get
role="button" + tabindex="0" + aria-label + a 32×41 transparent hit-rect.
Fix surfaced by deep-testing: the animated flow pipes were painted over the instruments and
intercepted clicks intermittently (depending on the moving dash position) — set
#pidBox .pipe-* { pointer-events:none } so clicks reach the instruments beneath.
Plan tracker: standarization/CDU_COCKPIT_INTERACTION_PLAN.md (5 phases). Presentation-only —
no change to the simulated values. prefers-reduced-motion honoured. Real-mouse deep-tested, 0 errors.
v1.43.57
PATCH
June 21, 2026
articles — refine amber: gold accent, not yellow highlighter
Owner feedback on the v1.43.54 amber swap: the re-toned callouts read as garish
yellow highlighter blocks in light mode, unlike the restrained §08 mockup (which
uses the soft gold #E8B563 as an accent — rails/borders/text — not a fill).
Changed
De-yellowed every amber FILL across the 9 amber-body articles (article-11/14/20/23/25/26/27
geopolitics/-3). The cream/amber-50/100 backgrounds and gradient stops
(#fffbeb, #fef3c7, #fde68a) on callout boxes, insight boxes, banners, and inline
stat pills were swapped to a subtle gold tint (rgba(232,181,99,0.06–0.22)). Text colours
that legitimately use those hexes (button labels, dark-mode emphasis) were protected and
left intact.
article-27 inline stats refined — the .ws-stat pills lost their yellow box (was
#fffbeb fill + amber border + pill padding); they now read as clean amber-bold figures
with a thin gold underline. The .ws-insight-box / .ws-narrative callouts moved from a
yellow gradient to a subtle gold tint + a #E8B563 left rail (the mockup's "Key finding"
style).
Net effect: articles now match the mockup's gold-accent restraint instead of looking
highlighter-marked. Verified light + dark on article-26 (the mockup's own subject) and
article-27 — 0 page errors.
v1.43.56
PATCH
June 21, 2026
planb Track I4 — instrument chrome on market/grid monitors; planb 100%
Closes the last open planb item (I4 ). With this, every plan-dark-mode-standard.html
track is shipped or already-live — PLAN 02 is 100% .
Added
I4 — instrument-register chrome for the 6 monitor pages (dc-market-tracker +
pln-java-grid and its 4 province pages). Each now declares
data-rz-register="instrument" and loads css/rz-monitor-instrument.css, which applies a
header + section-title signature only : .nav-title reinforced to JetBrains Mono, and
.pjg-section-title / .dmt-section-title get mono + a phosphor cyan→green accent tick.
CHROME ONLY — owner-tuned viz preserved. The stylesheet targets only those heading
classes; it never touches the Leaflet/SVG map, SLD line widths/labels, voltage-tier colours,
legend swatches, tooltips, or animation thresholds. Verified headless: maps render (21/13
Leaflet elements), tier legend colours unchanged, section-title mono+tick present, **0 page
errors**. Reversible (remove the register attr + the <link>).
Status — planb PLAN 02 complete
Track E 100% (E0–E4). §11 index hero ✓. §12 light twin ✓.
Track I I0–I3 already-live (9 cockpits in instrument register, probe 75/75); I4 ✓ here.
v1.43.55
PATCH
June 21, 2026
planb rollout — §11 index editorial hero + E4 calculator shells
Continues "semua di planb diimplementasikan". Closes the remaining Track E item
(E4) and the §11 index-hero recipe from plan-dark-mode-standard.html.
Added
§11 — index identity hero, editorial register (DARK-ONLY, additive, reversible).
Applied the planb §11 recipe to index.html scoped to .bento-identity, dark mode only:
Fraunces serif .bento-name, IBM Plex Mono kicker on .bento-tag with a 20px amber tick
rail, amber-italic .bento-accent-text, and a new .bento-readout hairline strip — 4
site-factual KPIs (12+ Years Ops · 40+ Tools Built · 27 Articles · 100+ Pages) in JetBrains
Mono tabular with amber baseline ticks and a count-up on load (IntersectionObserver,
prefers-reduced-motion-aware, hard final-value guarantee). Day mode untouched —
readout is display:none in light, all reskin rules are [data-theme="dark"]-scoped.
Page-local inline <style> + the amber accent in styles-index.css (re-minified) per the
2-stylesheet rule. Reversible: delete the font link + CSS block + readout markup.
E4 — calculator marketing shells, editorial chrome (css/rz-calc-editorial.css).
All 7 calculators (pue, capex, opex, roi, tco, cx, spares-readiness) now carry
data-rz-register="editorial"; in dark mode the hero only gets the editorial treatment —
Fraunces serif <h1>, mono amber badge (#E8B563), and a thin amber→mint rule under the
title. Chrome only : the calculator engines, inputs, results, and tool UI are not touched;
day mode is unchanged. Verified: dark <h1>=Fraunces / light=Inter on all 7, badge amber,
no new console/page errors (the pre-existing ipapi.co CORS notice on capex/opex is
unrelated to this change).
Notes
§10/Q4 (index = POLISH) remains in force for the bento grid; §11 only restyles the
identity hero card, dark-only — it does not reskin the colourful bento.
Verified via headless dark/light probes + hero screenshots before ship.
v1.43.54
PATCH
June 21, 2026
articles — unify editorial register on the §08 mockup amber
Changed
All 34 editorial pages now use the approved §08-mockup amber accent. The article
editorial register (css/rz-article-dark.css + Fraunces) reads the per-page
--rz-art-accent / --rz-art-accent2 CSS vars to colour its chrome (Fraunces h2 accent
rail, drop-cap, mono kicker/meta rail, pull-quote, read-progress bar). Every editorial
page's vars were flipped to the mockup's exact pair — **--rz-art-accent:#E8B563 (amber)
/ --rz-art-accent2:#6FBF9A (mint)** — sourced verbatim from rz-article-mockup.html
(linear-gradient(90deg,#E8B563,#6FBF9A)). Previously each article carried its own
per-series hue (navy / blue / cyan / emerald / red); the chrome is now uniform amber,
matching the planb mockup the owner approved.
The 9 red-series pages were fully re-toned red → amber in body too (not just chrome):
article-11, article-14, article-20, article-23, article-25, article-26,
article-27, geopolitics, geopolitics-3. The Global-Analysis red palette
(#dc2626/#ef4444/#fca5a5/#fef2f2/#991b1b/#b91c1c/#7f1d1d/#450a0a + matching rgba())
was mapped onto the Tailwind amber ladder (`#b45309/#d97706/#fcd34d/#fffbeb/#92400e/
#78350f/#451a03 + matching rgba()`). This fixes the owner's "warna dll kok masih sama"
report — the chrome had gone amber but the red-themed bodies (hero highlight, callouts,
article-27's .ws-* workforce calculator) were still red.
Preserved
Semantic reds untouched. Reds that encode meaning in non-red articles (e.g. article-8
--accent-red / .trajectory-arrow.deteriorating / "Deteriorating" cells paired with
#10b981 green for good-vs-bad contrast) were deliberately not swapped — only the
series-accent red theme on the 9 red pages was re-toned.
article-27 Workforce Strategy calculator still renders and recalculates — colour-only
swap, no structural/JS change (verified: input→recalc fires, 0 page/console errors ).
article-9-paper.html (print variant) excluded.
Verification
Headless dark-mode probe (hue-accurate): 9/9 red-series pages = 0 residual red, amber chrome present.
article-27 calculator interaction probe: 0 errors , recalc fires on input change.
audit-script-tags --strict CLEAN · audit-js-syntax --strict CLEAN.
v1.43.53
PATCH
June 21, 2026
CDU pages — clear all SEO audit warnings
Changed
SEO compliance — tightened <title> (≤60 chars) and <meta name="description"> (≤160 chars)
on all 5 CDU pages (cdu-hub, cdu-selection-guide, cdu-checklist, cdu-mini-bms,
cdu-comparison) and added the missing <meta name="ai-content-declaration" content="human-authored">.
The CDU pages now pass the full audit suite — script-tags, js-syntax, version-stamp, mobile,
and SEO — with no warnings.
v1.43.52
PATCH
June 21, 2026
editorial skin — 100% render-verified: fix h2 underline bug on all 33 articles
Fixed
The editorial h2 chrome was broken on ~30 articles — not just article-27. The editorial CSS
(rz-article-dark.css) neutralises border-left but NOT border-bottom. Every article whose base
.article-body h2 used a border-bottom: 3px solid <accent> underline kept that underline sitting
on top of the editorial accent-rail in dark mode — so the editorial register never fully took.
The original article-skin rollout shipped this latent bug across the whole batch.
Fixed via a parallel /ultraplan workflow (6 agents): rendered all 33 articles in dark mode,
detected the underline (computed border-bottom-width ≠ 0), and surgically added
[data-theme="dark"] .article-body h2 { border-bottom:none; padding-bottom:0; } per article so the
editorial rail owns the chrome. Light-mode underline preserved ; content-specific styling
(calculators .ws-*, PDF-export strings, data tables) left untouched.
100% verified by an independent full render probe: 33/33 PASS — every article now computes
Fraunces h2 (no underline) + Fraunces title + IBM Plex Mono meta. Audits CLEAN (script-tags,
js-syntax). 31 files changed (article-19/20 were already correct).
Tracker + second-brain vault updated.
v1.43.51
PATCH
June 21, 2026
site-wide — fix transparent-navbar bleed on custom-script pages
Fixed
Scroll-aware navbar, now site-wide. Extended the CDU-page navbar fix (v1.43.49) to the whole
site: the base .navbar is background:transparent and only turns solid via the .scrolled
class added by script.js. ~23 pages use custom inline scripts instead of script.js (calculators,
comparison pages, LTC labs, network hub) and never got it, so content bled through the navbar on
scroll. Added the scroll-aware .scrolled toggle once to the shared js/rz-mobile-nav.js (loaded
site-wide; idempotent + self-guarded so it never double-binds with script.js), fixing all of them
in one place. Also added the missing rz-mobile-nav.js tag to network-visualization-hub.html
(was absent — a hamburger-mandate gap too). Verified the solid-on-scroll navbar on calculators,
comparisons, LTC labs, network hub and CDU pages.
v1.43.50
PATCH
June 21, 2026
editorial skin — final consistency: hubs + print paper, no exceptions
Changed
Editorial skin consistency, tanpa pengecualian. After confirming all 29 articles + 6 series
landings are consistent, closed the last 2 edge cases:
4 hub/landing pages (articles, insights, geopolitics, future-forward) — added the
js/rz-article-editorial.js read-progress/stagger (they already had the editorial CSS + Fraunces;
JS is progressive-enhancement + self-guards). Verified: no errors, hubs render fine.
article-9-paper.html (print/PDF "Technical Paper" variant) — given a **screen-only dark
editorial mode** (Fraunces title + amber accent + dark surfaces) scoped under @media screen so
the print/PDF output stays pristine white — the print feature is untouched. Verified headless:
screen bg #0E0F12 + Fraunces title; print media bg #fff + dark text; zero console errors.
Notes
No .article-* classes on the paper, so it uses a self-contained @media screen override (not
rz-article-dark.css). Colours only — no layout/structure changes. Tracker + vault updated.
v1.43.49
PATCH
June 21, 2026
CDU pages — fix transparent navbar bleed-through on scroll
Fixed
Navbar collision, real root cause — the site's base .navbar is background:transparent and only
gets its solid blur background from a .scrolled class that script.js adds on scroll. The CDU
pages use inline scripts and don't load script.js, so their navbar stayed transparent and table
content bled through it on scroll (most visible in dark mode). Added the scroll-aware .scrolled
toggle to the inline script of all five CDU pages (cdu-hub, cdu-selection-guide, cdu-checklist,
cdu-mini-bms, cdu-comparison). Navbar is now opaque on scroll, matching the rest of the site.
v1.43.48
PATCH
June 21, 2026
article editorial skin — catch up the 3 missed articles
Changed
Applied the approved §08 article editorial skin to the 3 articles the rollout skipped.
The editorial register (css/rz-article-dark.css + Fraunces/Plex fonts + read-progress + staggered
entrance) shipped to 26 articles (v1.43.9–17) but article-27, FF-2, FF-3 were missed and still
rendered in generic dark mode. Added the identical editorial head block (replicated from article-26)
to each:
article-27.html — data-rz-register="editorial" + --rz-art-accent:#dc2626 (Global Analysis red).
FF-2.html / FF-3.html — --rz-art-accent:#E8B563 (Future Forward amber, matching FF-1).
Verified dark: Fraunces serif hero + accent italic, mono meta, editorial chrome, read-progress bar.
article-27's inline .ws-* workforce calculator + content untouched (head-only change). Body copy
stays IBM Plex Sans. Light mode unchanged. Article editorial skin is now 29/29 complete
(article-9-paper = print variant, intentionally excluded).
Tracker + second-brain vault + plan §08/E2 updated.
v1.43.47
PATCH
June 21, 2026
CDU hub consolidation + dense-table fixes
Added
cdu-hub.html (new) — a single landing page for the liquid-cooling CDU toolkit with four
resource cards (Selection Guide · Checklist · Mini-BMS · Deep Comparison). The four separate CDU
cards on datacenter-solutions.html and tools.html are now consolidated into one "Liquid-
Cooling CDU Toolkit" card that opens this hub. Registered in sitemap/search-index/llms.
Fixed
Dense comparison tables were cramped & unprofessional — the 9-column guide tables had
min-width:760px, forcing the spec column to wrap word-by-word. Raised to 1320px with explicit
per-column min-widths (spec column 300–340px) so cells breathe; widened the comparison tables to
880px. Header rows get a 2px under-rule + no-wrap.
Table header collided with the fixed navbar — removed th{position:sticky;top:0} (stuck the
header under the navbar on scroll) and the sticky-first-column z-index rules (raised cells above
the nav) from .cdu-tbl / .cp-tbl / .ck-tbl. Content now scrolls cleanly under the navbar.
v1.43.46
PATCH
June 21, 2026
index — kill distracting hero-name "blink" + OE hover "wobble"
Fixed
Hero name "blink" (disappears/reappears even without hover). .bento-name carried TWO infinite
animations — nameGlow (4s drop-shadow pulse) + rzNameSweep (12s gradient sweep, dark). Removed
both; the gradient text is now static (background-position:0% 50%). Identified via headless
animation probe (cards themselves were stable; the looping name animation was the culprit).
Operational Excellence card "wobble" on hover. .oe-card:hover .oe-desc expanded the description
max-height: 3em → 10em (#30 hover-expand) — the card grew on hover = the bergoyang. Removed the
expand; desc stays 2-line clamped, card no longer changes size on hover. Verified (max-height
38.4px → 38.4px, no growth).
Both removals mirrored in styles.css + styles-index.css, re-minified; cache-bust
styles-index.min.css?v=2026-06-21-calm.
v1.43.45
PATCH
June 21, 2026
CDU Mini-BMS — live sparkline trends on parameter tiles
Added
cdu-mini-bms.html — each numeric parameter tile (flow, flow-total, supply/return temp, ΔT,
dP, system pressure, HX approach) now carries a live sparkline showing the rolling 30-sample
trend with a subtle fill area — making it read as a real BMS dashboard rather than a static
readout. Sparkline colour follows the tile's OK/WARN/ALARM state; history resets on CDU-type
change; status tiles (pumps/filter/leak/coolant) stay static. Pure presentation — no change to
the simulation logic or values.
v1.43.44
PATCH
June 21, 2026
CDU Mini-BMS — full-width P&ID for legibility
Changed
cdu-mini-bms.html — reorganised the cockpit so the detailed ISA P&ID gets a full-width row
(capped 920 px, centred) instead of sharing a half-width column; the datahall layout + live
parameter tiles now share the top row. The dense instrumentation (valve/pump/instrument symbols,
tag bubbles, manifold, legend) is now legible at full scale. No data/logic change.
v1.43.43
PATCH
June 21, 2026
CDU pages — dense-table UIUX polish, round 2
Changed (applied to the new high-density tables)
Sticky first column — the Model/Vendor/Symptom column now pins to the left on the wide 9-column
guide tables, the comparison tables and the 16-row checklist tables, so context stays visible while
scrolling the spec columns horizontally (cdu-selection-guide.html .cdu-tbl, cdu-comparison.html
.cp-tbl, cdu-checklist.html .ck-tbl).
Scroll-shadow affordance — .tbl-wrap gains the classic CSS scroll-shadow (edge fades + inner
shadows that appear only when there's more to scroll), signalling the horizontal overflow on dense
tables instead of silently clipping.
Capability matrix — the comparison matrix's ✓/—/~ glyph columns are now centred + mono for
faster scanning (.cp-matrix).
Lighter inner-row hairlines on the guide table to match the editorial-register tables.
v1.43.42
PATCH
June 21, 2026
CDU checklist + comparison — deeper content
Changed
cdu-checklist.html — §01 operational parameters +5 (supply-vs-dew-point, pipe velocity,
corrosion-inhibitor reserve, pump NPSH margin, footprint+weight) → 16 rows; §06 PM +5 tasks
(make-up/level, dew-point-reset verify, control-valve stroke, BMS telemetry verify, inhibitor+Cu/Fe)
→ 16 rows; §07 symptom→action +6 rows (condensation, GPU throttle/maldistribution, 2-phase dry-out,
frequent make-up, control-valve fault, over-pressure) → 16 rows.
cdu-comparison.html — added a per-vendor published-spec & capability matrix (10 vendors ×
Redfish / dP published / ASHRAE class / hot-swap service / filtration / notable), distilling the
datasheet research into a single scannable view; Redfish is published only by CoolIT, Accelsius,
Lenovo. 6 tables total.
v1.43.41
PATCH
June 21, 2026
CDU guide — deep spec comparison tables
Changed
cdu-selection-guide.html — rebuilt both comparison tables from a single "notable specs" cell
into a 9-column deep comparison (Model · Capacity · Type · Secondary flow · dP/head · Approach ·
Dimensions & weight · Fluid·filter·conn·BMS·class · Links), populated from per-model datasheet
research. In-row table now 13 rows incl. Vertiv Liebert XDU1350 and CoolChip CDU 70 (L2A)
with verified datasheets, CoolIT CHx1500 , and a corrected nVent RackChiller CDU800 (the
earlier "CX121" was wrong — nVent has no CX series). In-rack table now 7 rows incl. **nVent
RackChiller CHx (real 4U specs: 150 L/min, 2.76 bar, 4 °C, 41 kg, W4) and Lenovo Neptune RM100**
(corrected to L2L , with verified O&M manual). Every new external link curl-verified (200) or
tagged VENDOR PORTAL; "n/p" marks genuinely unpublished specs.
v1.43.40
PATCH
June 21, 2026
CDU Mini-BMS — full ISA P&ID + dimensioned layout
Changed
cdu-mini-bms.html — rebuilt the P&ID from a simplified schematic into a full **ISA-instrumented
diagram**: facility isolation valves (HV-01/02) + 3-way control valve TCV-01, E-01 plate HX with
approach (TI-03), CDU skid with expansion tank T-01 + level LT-01 + makeup MV-01 + relief PSV-01,
dual pumps P-01A (duty) / P-01B (standby) with check valves, F-01 50 µm strainer, tagged
instruments FT-01 / PT-01 / PDT-01 (filter) / PDT-02 (loop) / TT-01 / TT-02 with live values,
rack manifold M-01 with QD couplers + cold plates, leak rope LSH-01, a control-setpoint note
(TCV holds TT-01=18 °C ≥ dew-point+3; P-01 VFD on ΔP; N+1 changeover), and a symbol legend.
Datahall layout gained a 600 mm rack-pitch dimension line and a per-type footprint/density caption
(CDU dims, kW/rack, aisle containment). All values feed from the live sim; renders clean across all
5 types × light/dark.
v1.43.39
PATCH
June 21, 2026
dark-mode /ultraplan — batch 5: cockpit cookie banners, probe-gated
Fixed
Cookie banner rendered white-on-dark on datahallAI + dc-conventional (they use the
.cookie-banner + .cookie-accept/.cookie-decline scheme with no dark override). Added shared
dark overrides to css/rz-bms-shell.css (loaded by all 5 cockpits) — banner → rgba(15,23,42,.95),
light text, brighter accept button; !important beats per-page inline. datahall/water/fire already
had a dark banner (this only brightens their accept button). Presentation-only — **accuracy probe
re-run 75/75 PASS** (engine/alarm/SLD untouched). Cache-bust bumped on all 5 cockpit pages.
Notes
Completes the /ultraplan dark-mode defect rollout (batches 1–5). All confirmed real defects fixed;
verified false positives left as-is. Tracker + vault note finalized.
v1.43.38
PATCH
June 21, 2026
dark-mode /ultraplan — batch 4: safe non-cockpit light elements
Fixed
articles.html .philosophy-section — light gradient section block rendered on dark; added
[data-theme="dark"] dark-gradient override.
tia-942-checklist — .tia-btn-reset + .nav-user-dropdown were white-on-dark (chrome);
added dark overrides. (Left .tier-btn.active/.dctype-btn.active white — intentional selected-state
highlight, dark-text-on-white reads fine.)
dc-market-tracker — .dmt-cookie-decline white button on dark cookie bar → dark override.
Part of the /ultraplan rollout. Tracker + vault updated. Remaining: cockpit cookie banners
(probe-gated — they load css/rz-bms-shell.css).
v1.43.37
PATCH
June 21, 2026
CDU suite — UIUX polish pass per design.md review
Changed (uiux-reviewer findings applied across all 4 CDU pages)
Brand typography — cdu-selection-guide.html swapped Inter → IBM Plex Sans (design.md
mandates IBM Plex, "not Inter — generic SaaS") and set an explicit body font-family.
Tabular numerics — added font-variant-numeric:tabular-nums slashed-zero to every mono
numeric class (guide .kw/.formula, checklist .p/form inputs, mini-bms .tile .v/.sch-val,
comparison .mono) so dense data columns align and live instrument readouts stop jittering.
Accessibility — gated the mini-BMS alarm/leak blink animations behind
prefers-reduced-motion:reduce (they already carry text + colour, so motion is now enhancement
only).
Token/radius discipline — container radii 12→8 px (typecard/panel/tbl-wrap) and tile 9→6 px;
taxonomy card border-top 3→2 px; taxonomy SVG pipes re-graded to tier weights (supply 1.6 /
return 1.2 / air 1.4 px) with return re-pointed to fault-red #FF3030; comparison .win/.mid/.lose
re-pointed to RZ severity tokens (#00FF88/#FFAA00/#FF3030 in dark); tier-3 lighter inner-row
hairlines on dense tables; mini-BMS hero line-grid opacity lowered to ≤0.06; FAQ summary hover +
focus-visible ring; lead paragraphs capped at 70ch; removed a no-op sticky th.
v1.43.36
PATCH
June 21, 2026
dark-mode /ultraplan — batch 3: site-wide #64748b disclaimer contrast
Fixed
Inline #64748b disclaimer + nav links low-contrast on dark — across 52 pages. The shared
independence-disclaimer <p style="...color:#64748b..."> (and the "All Insights" nav link) is an
inline style CSS can't normally override. Added one targeted [data-theme="dark"] [style*="color:#64748b"]
rule (!important) in styles.css → lifts to #94a3b8 (readable, still de-emphasized) on every
page at once (pillars, articles, etc.). Index unaffected (uses #94a3b8 already). Verified via probe.
Part of the /ultraplan rollout. Tracker + vault updated.
v1.43.35
PATCH
June 21, 2026
dark-mode /ultraplan — batch 2: geopolitics/FF status badges
Fixed
Status badges rendered light-on-dark on geopolitics-2 · geopolitics-3 · FF-1 · FF-2.
Pages already had [data-theme="dark"] overrides for .confidence-high/-medium but missed
.confidence-low + all .prob-low/-medium/-high (light pastel bg, no dark override). Added the
missing translucent-tint dark overrides per page (prob-high colour matched each page: red for
geo-2/3, violet for FF-1, amber for FF-2). Verified dark via headless probe.
Part of the /ultraplan rollout. Tracker + vault note updated.
v1.43.34
PATCH
June 21, 2026
CDU guide FAQ + FAQPage schema + glossary terms
Added
cdu-selection-guide.html — new §08 FAQ section (8 questions: L2L vs L2A, flow sizing,
coolant/water quality, filtration, dew-point, quick-disconnect standards, type selection, leak
safety) using native <details> accordions, plus a FAQPage JSON-LD block (8 Q&As) for rich
results / AI-search.
glossary.html — three new liquid-cooling terms cross-linked to the CDU suite: L2A
(liquid-to-air CDU), L2L (liquid-to-liquid CDU), and Quick-Disconnect (QD/UQD/UQDB) .
v1.43.33
PATCH
June 21, 2026
dark-mode /ultraplan — batch 1: references-section light-on-dark
Fixed
.references-section rendered light-on-dark on 4 report/infographic pages — the section
carries an inline style="background:#f8fafc" that overrode the shared dark rule, so in dark mode
the panel stayed light gray while its text was light → text invisible. Made the shared
[data-theme="dark"] .references-section rule !important (styles.css) so it beats the inline bg.
Fixes infographic-dc-cost-breakdown · infographic-dc-sustainability · infographic-pue-global
· asean-dc-report-2026 at once. Verified dark (rgb(15,23,42)) via headless probe.
Found by the /ultraplan 9-agent parallel dark-mode audit (56 defects/27 files). Audit also
caught false positives (saturated-accent compare-table headers read fine on dark — left as-is).
Tracker: standarization/DARK_MODE_ROLLOUT_TRACKER.md + vault 05-Standards/Dark-Mode-Rollout.md.
v1.43.32
PATCH
June 21, 2026
CDU suite — SEO/schema, link re-validation & cross-link close-out
Changed
SEO/JSON-LD — added TechArticle/WebApplication + BreadcrumbList structured data and
Twitter Card meta to cdu-checklist.html, cdu-mini-bms.html, cdu-comparison.html, and a
TechArticle block to cdu-selection-guide.html (all 4 pages now carry 2 valid JSON-LD blocks).
Link re-validation — re-curled every external CDU link (21); honestly downgraded the nVent
Data Solutions resource-library link from VERIFIED to VENDOR PORTAL (now intermittently 403s to
automated fetch / bot-blocked).
Cross-link completeness — every CDU page now links to the other three (added Mini-BMS +
Deep Comparison to the checklist footer nav; added Deep Comparison to the Mini-BMS links strip).
AI search — regenerated llms-full.txt so all five CDU pages are included.
Full render QA: 4 pages × light/dark = 8 renders, 0 console errors.
v1.43.31
PATCH
June 21, 2026
CDU guide — sizing & installation requirements section
Added
cdu-selection-guide.html — new §05 Sizing & installation requirements section: the core
flow/ΔT sizing equation (flow ≈ 14.7 × Q(kW) / ΔT for PG25; ≈1.5 L/min/kW at ΔT 10, OCP band
1.25–2.0) with worked rack/node examples; a pipe-sizing table (DN25→DN200 at ~2 m/s); heat-
exchanger approach + W-class supply-temperature + dew-point guidance; and a physical-install
checklist (floor loading, clearances, facility water vs L2A air budget, dual feeds, BMS/leak,
N+1). Manuals/Standards sections renumbered to 06/07.
v1.43.30
PATCH
June 21, 2026
CDU Deep Comparison — all aspects, source-tagged
Added
cdu-comparison.html (new public page, editorial register) — a deep, source-tagged
multi-aspect comparison of liquid-cooling CDUs, the companion to the Selection Guide:
§01 Worldwide common field issues — 12 failure modes (leaks, biofilm, galvanic/chloride
corrosion, glycol degradation, particulate/microchannel clog, flow maldistribution, cavitation,
dew-point condensation, pump/N+1, controls gaps, commissioning defects, standardization) with
symptom → root cause → prevention.
§02 Control systems & BMS/DCIM — pump VFD (flow vs ΔP), temperature PID valve, dew-point
reset, N+1 changeover, leak→action; per-vendor Modbus/BACnet/SNMP/Redfish matrix; DMTF Redfish
CoolingUnit (DSP2064) + OCP telemetry standards.
§03 After-sales & support — per-vendor warranty/SLA/serviceability/remote-monitoring matrix
(Vertiv, CoolIT, Motivair/Schneider, Boyd/Eaton, nVent, Delta, Stulz, Accelsius, ZutaCore,
Lenovo) with honest "not publicly disclosed" markers.
§04 TCO & maintenance by type — relative trade-off matrix (capex/opex/density/water/retrofit/
maintenance/redundancy) across in-rack/in-row/sidecar/L2L/L2A/2-phase.
Every figure tagged STANDARD (ASHRAE/OCP/DMTF) vs VENDOR vs REPORTED; vendor-sponsored TCO
claims attributed by name. Registered in dc-solutions/tools/sitemap/search-index/llms; cross-
linked from the Selection Guide.
v1.43.29
PATCH
June 21, 2026
CDU guide — per-type layout/P&ID mini-diagrams in taxonomy
Changed
cdu-selection-guide.html — the "CDU types — what each is for" taxonomy section now carries a
visual mini-diagram per type (not just text cards): an inline SVG showing the CDU's datahall
placement signature + animated supply/return flow + heat-rejection path. In-rack (CDU slice inside
a rack), In-row (cabinet between racks), Sidecar (slim unit on the rack side), L2A (→ room air, no
facility water), L2L (plate HX to facility CDW), Facility/room-scale (multiple rows → central unit
HX). Each in its type accent colour; flow animation honours prefers-reduced-motion. Full
interactive version lives on the CDU Mini-BMS cockpit.
v1.43.28
PATCH
June 21, 2026
CDU Mini-BMS — layout + P&ID + live parameters
Added
cdu-mini-bms.html (new public page, instrument register) — an interactive miniature
building-management cockpit for liquid-cooling CDUs. Per CDU type (in-rack · in-row · sidecar ·
L2L end-of-row · L2A air-cooled): a datahall installation layout plan view (cold/hot aisle,
rack row, CDU placement, facility-water vs room-air rejection, animated flow), an **animated
P&ID schematic** (HX, N+1 pumps, filter, expansion tank, FT/PT/dPT sensors, manifold → rack
cold-plates, leak rope), and a live simulated parameter panel (flow LPM/kW + total, supply/
return temp, ΔT, dP, system pressure, pump N+1, filter, leak, HX approach, coolant) with
warn/alarm tile states and a RUN/WARN/ALARM P&ID pill. Fault-injection scenarios (leak,
pump-A fail, filter clog, hot facility water, low flow) drive the controls so users can see how
a CDU controller responds. Animation honours prefers-reduced-motion; all values are on-device
simulation from the sourced bands in the CDU Checklist (not a live feed).
Cross-linkage
Registered in datacenter-solutions.html, tools.html, sitemap.xml, search-index.json
(cdu-mini-bms-1), llms.txt; cross-linked from the CDU Selection Guide next-strip and back to
the Guide + Checklist from the cockpit.
v1.43.27
PATCH
June 20, 2026
CDU checklist — water-quality & commissioning super-detail
Changed
cdu-checklist.html — added two deep, source-tagged sections (every figure tagged
STANDARD vs TYPICAL/VENDOR so nothing is overstated):
§02 Water quality — acceptance criteria & standard limits : ASHRAE TC 9.9 facility-water
W-class table (W17–W+, max supply temps); OCP cold-plate TCS fluid acceptance table (pH,
conductivity, TDS, TSS, hardness, chloride, turbidity, bacteria, inhibitor, Cu/Fe, filtration);
ASHRAE/Dell TCS-vs-FWS side-by-side limits; OCP make-up water sub-spec + ASTM D1193 Type II.
Honest caveats on pH/conductivity loop regimes and the absence of a published TOC limit.
§03 Installation & commissioning — numeric procedure : hydrostatic test (1.5× design,
≥10-min hold per ASME B31.3/B31.1, "no-leakage" acceptance), turbulent flush (Re>4000, ISO 4406
/ NAS 1638 target), filtration sizing table, coolant & flow (PG25, 1.5 LPM/kW @10 °C, band
1.25–2.0), OCP UQD/UQDB quick-disconnect spec (100 psi working / 300 psi burst / ≥5000 cycles /
±1 mm blind-mate), leak detection sequence.
Sections renumbered 02→04…06→08; TOC + source-tag legend added.
v1.43.26
PATCH
June 20, 2026
AWS dark logo fix + dark token foundation
Fixed
AWS company logo invisible in dark mode. assets/aws-dark.svg was byte-identical to the day
version and used fill="currentColor" on the wordmark — via <img>, currentColor resolves to the
SVG's default black , so the "dark" logo rendered black-on-dark. Made the wordmark #FFFFFF
(orange #F90 smile kept) + cache-bust the <img src> so the white version loads. The day/dark
toggle CSS ([data-theme="dark"] .exp-logo-aws-dark{display:block}) was already correct.
Added
css/rz-dark.css — POLISH-TRACK consistency tokens (character-agnostic): radius scale
(--rz-r-xs…xl/pill), elevation scale (--rz-elev-1..3, light + dark), .rz-surface premium
card utility, .rz-reveal-on (no hover movement). For the "polish + unify tokens" path — pages keep
their own type + accent, adopt one structural language. Distinct from the Fraunces editorial register.
v1.43.25
PATCH
June 20, 2026
CDU guide — verified 2-phase in-rack units
Changed
cdu-selection-guide.html — enriched the in-rack comparison table with two link-verified
two-phase (dielectric direct-to-chip) units: Accelsius NeuCool IR150 (150 kW rack-
integrated, R-1233zd(E), 1+1 pumps, ASHRAE W27/W45, accelsius.com/ir150/ VERIFIED) and
ZutaCore HyperCool In-Rack (20–120 kW waterless 3U/6U, zutacore.com/solutions VERIFIED).
Added a 2-PHASE tag (violet) and a section-lead note distinguishing single-phase water CDUs
from two-phase/waterless options. Both URLs independently curl-verified (HTTP 200 + content
match); gated lead-capture spec sheets tagged VENDOR PORTAL. Chilldyne (negative-pressure
single-phase) and LiquidStack (2-phase immersion only) excluded as not 2-phase in-rack DTC.
v1.43.24
PATCH
June 20, 2026
index — kill excessive card-hover movement
Fixed
Stale cached JS re-running the cursor-tracking 3D tilt. index.html loaded
script.min.js?v=2026-05-09-v1; the on-disk min has initCardTilt() disabled, but returning
visitors were served the old cached build (active `perspective rotateX/Y + translateY(-10px) +
scale + parallax children`) under that unchanged query string — cards wobbled, shifted out from under
the cursor, and flickered. Bumped to ?v=2026-06-20-cards to force the clean, tilt-free build.
Company-logo hover pop too large — .bento-exp-card:hover .bento-company-logo scaled 1.15
(visible "wobble"); reduced to a subtle 1.04. The grayscale→colour fade on hover is kept.
Both styles.css + styles-index.css re-minified; CSS cache-bust → ?v=2026-06-20-cards.
Card hover feedback is now border/glow + logo colour-fade only — no card movement (matches the
owner's no-card-movement rule). Verified via headless hover probe (card transform = none).
v1.43.23
PATCH
June 20, 2026
CDU Selection & Deployment Guide + Checklist — new pages
Added
cdu-selection-guide.html (new public page) — liquid-cooling Coolant Distribution Unit
resource for the DC Solutions hub. CDU type taxonomy (in-rack · in-row · sidecar · L2A · L2L ·
facility-scale), an in-row + facility comparison table and an in-rack comparison table with
link-verified vendor specs and product/datasheet/manual links (Vertiv CoolChip, CoolIT CHx,
Motivair, Boyd, Delta, nVent, Stulz, Envicool, ZutaCore), a manuals/documentation hub of
HTTP-200-verified vendor portals, an L2L-vs-L2A decision section, and ASHRAE TC 9.9 / OCP
standards references. Every shipped link was fetched and tagged VERIFIED (200 + content match)
or VENDOR PORTAL (working docs page, deep PDF not auto-verifiable) — no unverified deep links.
cdu-checklist.html (new public page, linked from the guide) — operational parameter bands
(supply temp / ΔT / flow / dP / system pressure / coolant / ASHRAE class / filtration / pump
redundancy / leak / ATD), an installation checklist, an inspection checklist, a preventive-
maintenance checklist with cadence tags, a symptom→cause→action troubleshooting table, and a
printable on-screen service-record form (window.print() + print stylesheet).
Cross-linkage (CONTENT_LINKAGE_PLAYBOOK)
Registered both pages: datacenter-solutions.html (two DS tool rows), tools.html (two tool
cards), sitemap.xml, search-index.json (cdu-guide-1 + cdu-checklist-1), llms.txt, and a
glossary cross-link from the existing CDU term.
v1.43.22
PATCH
June 20, 2026
index bento polish — audit fixes
Fixed
Hover-lift removed (it never worked). The translateY(-4px) bento hover added with the
polish was dead on every card — a pre-existing global .bento-card:hover{transform:none!important}
(the owner's deliberate no-card-movement rule) overrode it. Removed the dead rule rather than force
it with !important (which would reintroduce motion the owner removed). Hover feedback stays via the
existing border/glow rules — no card movement. Found by the uiux-reviewer agent (headless-verified).
Stale cache-bust — index.html styles-index.min.css?v=2026-06-14-light → ?v=2026-06-20-bento
so the fixes reach returning visitors.
Rejected-purple disclaimer — the independence-disclaimer box used Anthropic-default #8b5cf6
(CLAUDE.md Rejected-Patterns #3) with no dark path; retoned to neutral slate + emerald link.
No-op .bento-sap dark tint — dark override re-declared the identical 2% emerald (invisible);
bumped to 6% so the SAP card keeps its emerald identity in dark.
Deduped the redundant dark-scoped bentoRise reveal block (theme-agnostic block already covers dark).
Both styles.css + styles-index.css re-minified. Standard DARK_MODE_STANDARD.md updated.
v1.43.21
PATCH
June 14, 2026
P1 — ict + datahall metadata extension
Closes the P1 metadata items (review doc-27 §5.5 + §5.7). ADDITIVE ONLY —
displayed data unchanged (owner mandate: skin/metadata only, never alter
content). Verified: network link table values + rack/CRAH grid byte-identical;
accuracy probe 75/75.
Changed
ict.html — network link rows (tr.linkrow) now carry data-rz-line
metadata derived from the EXISTING row data (from/to/medium/state/capacity/
current/redundancy). The displayed table (cap/traffic/util/latency/loss/
jitter/state/redundancy columns) is unchanged. Loads rz-line-model +
rz-inspector + rz-alarm-state + rz-telemetry-quality; `data-rz-data-mode=
"simulated"`. 5/5 rows tagged, 0 unknown mediums, NONE errors.
datahall.html — data-quality service: data-rz-data-mode="simulated"
rz-telemetry-quality.js (SIM banner + chip). The rack/CRAH grid (200 racks
20 CRAH cells) and all engine-bound values are unchanged. Accuracy probe
75/75 confirms byte-identical.
Scope discipline
Metadata + library + banner only. ZERO content/data edits. Per
feedback_skin_only_preserve_data (owner 2026-06-14).
v1.43.20
PATCH
June 14, 2026
cockpit instrument re-skin — remaining 8 pages; COMPLETE
Completes the cockpit instrument re-skin. Same chrome-only, additive, scoped,
dark-only treatment as the datahallAI pilot, applied to the remaining 8 cockpit
pages via the 2-line opt-in. Per standarization/COCKPIT_RESKIN_PLAN.md.
Hard invariants verified (all green):
SVG semantic colours untouched · engine byte-identical
(probe-accuracy-validation 75/75, test-datahall-calc 57/57,
test-conv-calc 22/22, probe-line-model 52/52) · light mode inert.
All 8 pages headless-verified: instrument register active + graticule
atmosphere on in dark, NONE errors. EPMS ATS→rack green fix intact.
Changed (<html data-rz-register="instrument"> + 1 CSS link each)
dc-conventional.html (2nd light-mode page; light inert)
chiller-plant.html · water-system.html · fuel-system.html
fire-system.html · ict.html · EPMS_Telemetry.html · datahall.html
Rollout status — cockpit instrument register COMPLETE
9 / 9 cockpit pages on the instrument register (datahallAI + 8 here).
Chrome-only: atmosphere + mono headings + cyan-hairline panels. Zero SVG/
engine/inline-CSS edits. Trivially reversible (2 lines per page).
v1.43.19
PATCH
June 14, 2026
cockpit instrument re-skin — datahallAI pilot
First cockpit page on the instrument register. CHROME-ONLY, additive, scoped,
dark-only. Per standarization/COCKPIT_RESKIN_PLAN.md.
Hard invariants verified (the "no mistake" gates):
SVG semantic colours (feed A/B, alarm red, cooling cyan) — UNTOUCHED (CSS
contains zero SVG stroke/fill selectors).
Engine values byte-identical — probe-accuracy-validation 75/75, KPIs
(PUE 1.30 / IT 14.26 / GPU 7,776) unchanged; test-datahall-calc 57/57.
Light mode inert — skin gated :not([data-theme="light"]); datahallAI
defaults to light, so the skin only activates on dark toggle.
Added
css/rz-cockpit-instrument.css — instrument register for cockpits.
Activates on <html data-rz-register="instrument"> + dark. Styles ONLY:
page atmosphere (graticule + faint scanlines via body::before/::after),
display headings → JetBrains Mono (.hdr h1, .bx h3, .cd h4, .sb h4),
panel borders → cyan hairline + 3px radius. No SVG, no engine text.
standarization/COCKPIT_RESKIN_PLAN.md — full plan: invariants, page
inventory (9 pages), ship sequence, per-ship verification checklist, rollback.
Changed
datahallAI.html — <html data-rz-register="instrument"> + one CSS
link. Two lines; trivially reversible. SVG/engine/inline-CSS untouched.
Next (per plan)
v1.43.2x — dc-conventional, then chiller/water/fuel, then fire/ict/EPMS/datahall.
v1.43.18
PATCH
June 14, 2026
index light-mode polish — day twin
Changed
Homepage (index.html) light mode — polished to twin the dark polish (v1.43.14).
Same decision (keep the colourful bento character; raise quality only), now applied
light-scoped so day↔night match. Pure CSS:
Layered light card surfaces — .bento-card gets a soft white gradient body +
layered shadow (was flat white + faint shadow).
Per-card accent restored — .bento-exp-card corner glow (--bexp-accent) now
always-on in light too.
Hover lift — cards rise 4px with a deeper shadow.
Staggered reveal — the bentoRise reveal is now theme-agnostic (runs in light
dark); honours prefers-reduced-motion.
Rules in both styles.css + styles-index.css (2-stylesheet rule), re-minified;
cache-bust styles-index.min.css?v=2026-06-14-light. Plan/mock: rz-index-mockup-day.html.
v1.43.17
PATCH
June 14, 2026
article editorial skin — series landings + FF-1; rollout COMPLETE
Finishes the article-family editorial rollout. The three bespoke series
landings get the serif hero treatment (additive, hero-only — bespoke card
grids untouched); FF-1 (the real Future-Forward article, standard .article-*
template) gets the full opt-in. future-forward-1.html is a redirect stub to
FF-1 and is left as-is.
No cockpit/engine touched. Light mode unchanged (scoped). Gates CLEAN. All four
headless-verified (dark = Fraunces serif hero, light = Inter, NONE errors).
Added
css/rz-article-dark.css — landing-hero block: .insights-hero,
.geopolitics-hero, .futureforward-hero H1/dek → serif; shared
.section-title → serif. Additive + scoped.
Changed (editorial-register opt-in)
insights.html — cyan #0891b2 (hero-only treatment)
geopolitics.html — red #dc2626 (hero-only)
future-forward.html — amber #E8B563 (remapped from violet #a855f7,
a CLAUDE.md rejected token; hero-only)
FF-1.html — amber #E8B563 (remapped from violet #6d28d9); full
.article-* editorial treatment + read-progress runtime.
Rollout status — article family COMPLETE
36 pages on the editorial register : 28 standard articles + geopolitics-1/2/3
FF-1 + articles index + insights/geopolitics/future-forward landings.
Every public article-family page is now on the editorial register (dark-only,
light untouched). The remaining dark-mode work is the instrument-register
cockpit re-skin (separate track, owner approval pending).
v1.43.16
PATCH
June 14, 2026
article editorial skin — articles.html index pilot
Completes the article-family editorial rollout with the journal index. Extends
the scoped css/rz-article-dark.css with an additive index-grid block
(.articles-hero + .article-card-*) and opts in articles.html.
No cockpit/engine touched. Light mode unchanged (skin scoped to
[data-rz-register=editorial][data-theme=dark]). Gates CLEAN. Verified dark =
Fraunces hero + serif card titles across 27 cards; light = Inter (scope guard);
NONE errors. Existing aurora hero + card layout preserved.
Added
css/rz-article-dark.css — index-grid block: .articles-hero h1/p,
.article-card-title (serif), .article-card-excerpt, .article-card-number
(mono accent), .article-card-category (mono). Additive + scoped.
Changed
style="--rz-art-accent:#0891b2">` + Fraunces/Plex fonts + scoped editorial CSS.
Structure + light mode untouched.
Rollout status — article family
32 pages on the editorial register : 28 standard articles + geopolitics-1/2/3
articles.html index.
Out of scope (bespoke landing templates, parallel landing/index track):
insights.html, geopolitics.html, future-forward.html,
future-forward-1.html — handed off to the landing/index design pass.
v1.43.15
PATCH
June 14, 2026
article editorial skin — geopolitics series 1–3
Extends the editorial-register rollout to the Geopolitics series children
(same standard .article-* template as articles 1–26). Landing pages
(geopolitics.html, future-forward.html) use bespoke templates and are
out of scope here.
No cockpit/engine touched. Light mode unchanged (dark-scoped). Gates CLEAN.
All three headless-verified (Fraunces title, read-progress, accent, NONE errors).
Changed (editorial-register opt-in)
geopolitics-1.html — 72-Hour Warning — green #059669
geopolitics-2.html — $50T Shift — green #059669
geopolitics-3.html — Hormuz Fiber Shock — deep red #991b1b
Progress
Standard-template articles + geopolitics children on the editorial register:
31 pages (28 articles + geopolitics-1/2/3).
v1.43.14
PATCH
June 14, 2026
index dark-mode polish
Changed
Homepage (index.html) dark mode — polished, not reskinned. Owner kept the
current colourful bento character (emerald + pastel accents + rounded cards +
photo + Inter); only the dark-mode quality was raised. Pure CSS, dark-only
([data-theme="dark"] scoped) — light/day mode unchanged :
Layered card surfaces — .bento-card gains a gradient body + inner top
highlight + soft layered shadow (was flat #131e2e), so cards read with depth.
Per-card accent restored — each .bento-exp-card keeps its --bexp-accent
(blue/emerald/amber/orange/violet) as an always-on corner glow (was an
invisible 6–12 % hover-only wash).
Hover lift — cards rise 4px with a deeper shadow on hover.
Staggered reveal on load — bentoRise keyframe walks the bento rows in on
first paint; honours prefers-reduced-motion. No JS, no markup change.
Rules mirrored in both styles.css + styles-index.css (2-stylesheet rule),
re-minified; cache-bust styles-index.min.css?v=2026-06-14-polish.
Plan + before/after mock: plan-dark-mode-standard.html §10 · rz-index-polish.html.
See standarization/DARK_MODE_STANDARD.md (Track E3 index).
v1.43.13
PATCH
June 14, 2026
EPMS — ATS→rack final leg renders green
Owner-requested fix on EPMS_Telemetry.html (owner explicitly directed this
edit; the earlier "jangan merusak" applied to the dark-skin rollout, not to
operator-requested corrections).
Single surgical change: the dashed flow line AFTER each rack ATS (ATS → Rack —
the final leg to the load) now renders GREEN instead of inheriting the upstream
source colour (red, Feed A). Downstream of the ATS is on the protected/green
bus regardless of which source the ATS selected.
Changed
EPMS_Telemetry.html energize() — one conditional: wires whose id
starts with w_ats_rack_ use colour class energized-B (green); all other
legs unchanged (upstream PDU→ATS stays Feed-A red). Verified: 10/10 ATS→rack
legs green, upstream legs unchanged, NONE errors.
No other EPMS wiring, engine, or page touched.
v1.43.12
PATCH
June 01, 2026
article editorial skin — sweep: articles 2–18
Final wave of the standard-template article rollout. 17 articles opted into the
editorial register in one sweep (pattern fully proven), each accent read from
its own theme-color meta. **All 28 standard articles now on the editorial
register.**
No cockpit/engine touched. Light mode unchanged (dark-scoped). Gates CLEAN.
16/17 headless-verified clean; art-2 shows a PRE-EXISTING Chart.js
'helpers' timing error (present on origin before this change — not caused by
the skin; the editorial chrome renders correctly).
Changed (editorial-register opt-in, articles 2–18)
Each: <html data-rz-register="editorial" style="--rz-art-accent:…"> + fonts
rz-article-dark.css + rz-article-editorial.js. Accent per theme-color.
article-8.html — its #8b5cf6 (Anthropic-purple, a CLAUDE.md rejected
token) was REMAPPED to editorial amber #E8B563 to avoid reintroducing slop.
Progress
28 / 28 standard articles on the editorial register (1, 2–18, 19–26).
Future-Forward + Geopolitics series pages use different templates — separate
pass if desired.
v1.43.11
PATCH
June 01, 2026
article editorial skin — batch 2: articles 23, 24, 25, 1
Third wave of the article editorial-register rollout. Same one-line-per-page
opt-in via the shared css/rz-article-dark.css; each article keeps its series
accent.
No cockpit/engine touched. Light mode unchanged (dark-scoped). Gates CLEAN.
All four headless-verified (Fraunces title, read-progress, correct accent,
NONE errors).
Changed (editorial-register opt-in)
article-23.html — xAI Colossus — red #dc2626
article-24.html — manpower shortage — green #059669
article-25.html — PJM grid crisis — deep red #b91c1c
article-1.html — When Nothing Happens — navy #1e3a5f
Progress
Articles on editorial register: 9 / 28 (26 pilot + 19/20/21/22 + 23/24/25/1).
Remaining 19 to follow in batches.
v1.43.10
PATCH
June 01, 2026
article editorial skin — batch 1: articles 19–22
Second wave of the article editorial-register rollout. Four articles opted in
via the shared css/rz-article-dark.css (one-line-per-page pattern), each
keeping its series accent.
No cockpit/engine touched. Light mode unchanged (skin dark-scoped). Gates CLEAN.
All four headless-verified (Fraunces serif title, read-progress bar, correct
accent, NONE errors).
Changed (editorial-register opt-in)
article-19.html — Singapore vs Batam — cyan #0891b2
article-20.html — AI water use — red #dc2626
article-21.html — Nuclear SMRs — green #059669
article-22.html — NVIDIA photonics — cyan #0891b2
Each: <html data-rz-register="editorial" style="--rz-art-accent:…"> + Fraunces/
Plex fonts + rz-article-dark.css + rz-article-editorial.js. Structure +
light mode untouched.
Progress
Articles on editorial register: 5 / 28 (26 pilot + 19/20/21/22). Remaining 23
to follow in batches of ~4, each with its series accent.
v1.43.9
PATCH
June 01, 2026
article editorial skin + article-26 pilot
Owner directed the skin rollout at ARTICLES (content), not the DC AI / DC
Conventional cockpits. First real-page adoption of the editorial register.
No cockpit/engine touched. Light mode verified UNCHANGED (skin scoped to
data-rz-register="editorial" + dark). Gates CLEAN. Pilot headless-verified.
Added
css/rz-article-dark.css — editorial register for articles. Activates
ONLY when <html data-rz-register="editorial"> AND dark mode. Restyles the
existing .article-* chrome: Fraunces serif title (italic accent), mono
kickers/meta, drop-cap, accent rail on h2, editorial callout/quote rail,
read-progress bar, staggered entrance. Body copy stays IBM Plex Sans for
readability. Per-series accent via --rz-art-accent override.
js/rz-article-editorial.js — progressive-enhancement runtime
(read-progress bar + entrance stagger). No-op unless editorial register
declared. Honours prefers-reduced-motion.
rz-article-mockup.html (noindex) — article before/after demo.
Changed
article-26.html — PILOT. `
style="--rz-art-accent:#ef4444">` + Fraunces/Plex fonts + the editorial
CSS/JS. Structure + light mode untouched.
plan-dark-mode-standard.html — new §08 (article editorial skin +
before/after iframe).
Rollout plan
Shared CSS + one-line-per-page opt-in. Batch remaining 27 articles 3–4 per
ship, each with its series accent, after this pilot is approved.
v1.43.8
PATCH
June 01, 2026
codify RZ Dark System into design.md — Section 16
DOCS ship: folds the dark-mode design system into the brand bible as a
permanent numbered chapter (was only a standalone standard + live demos).
No page logic touched. audit-script-tags + audit-js-syntax + audit-version-stamp CLEAN.
Changed
documentation/design.md — new Section 16 "Dark Mode — RZ Dark System v1" :
why-it-exists, two-register principle (instrument + editorial, hybrid locked),
tokens, 6 motion primitives (with the probe-safe count-up + hard-settle rule),
anti-slop checklist, responsive rules, adoption order. Plus a Decision Log row
recording the 2026-06-01 dark-system decision.
Links
Implementation: css/rz-dark.css + standarization/DARK_MODE_STANDARD.md.
Live: rz-style-lab.html (picker), rz-skin-gallery.html (12-surface before/after),
rz-cockpit-mockup.html, plan-dark-mode-standard.html (PLAN 02).
v1.43.7
PATCH
June 01, 2026
RZ Skin Gallery — before/after for all 12 surfaces + cockpit mockup
PATCH ship: comprehensive visual mockups for the dark-mode standard, per owner
request "kurang banyak before after buat semua mock up" (make before/after
mockups for ALL surfaces) + "enhance front end design skin".
Internal/noindex only — no cockpit logic touched. Engine + #p-dash unchanged.
audit-script-tags + audit-js-syntax + audit-version-stamp CLEAN. Both new
pages headless-verified NONE errors.
Added
rz-skin-gallery.html (noindex) — before/after for 12 surfaces: KPI strip,
telemetry line (trace-in), per-hall bars (grow+count), energy donut (sweep),
SLD breakers (symbol + semantic colour), equipment inspector, ISA-18.2 alarm
states, data-quality + sim banner, plan card, landing hero, buttons, data
table. Instrument register for cockpit surfaces, editorial for content.
Charts animate on load with hard-settle. Guarded getPointAtLength against
non-finite path length (fixed mid-build).
rz-cockpit-mockup.html (noindex) — datahallAI cockpit slice before/after
(KPI + MV-intake SLD + cooling trace) proving the instrument register lands
on a cockpit WITHOUT breaking load-bearing semantic colours (feed A blue /
feed B green / trip red / cooling cyan). Tripped breaker stays red both sides.
Changed
plan-dark-mode-standard.html — new §02b (cockpit before/after iframe)
new §07 (full skin gallery iframe). Q1 register-split marked LOCKED (hybrid).
Version stamp bumped.
Process
Reinforces the visual mandate (memory feedback_planb_always_visual.md):
every change shows before/after VISUAL + code + explanation.
v1.43.6
PATCH
June 01, 2026
planb PLAN 02 design-system card + dedicated plan page; hybrid register locked
PATCH ship: registers the dark-mode design-system plan in the planb hub as a
live card and adds its dedicated visual plan page. Owner locked the HYBRID
register split (instrument for cockpits, editorial for landing/articles).
Internal/noindex only — no cockpit logic touched. Engine + #p-dash
byte-identical (no change). audit-script-tags + audit-js-syntax CLEAN.
Added
plan-dark-mode-standard.html (noindex) — dedicated PLAN 02 page in the
editorial register (dogfoods RZ Dark System). Fully visual per the planb
mandate: embeds the before/after demo + the 4-variant Style Lab switcher
(iframes), register tables, anti-slop checklist, code, and the 3 decision
questions. Carries version stamp.
Changed
planb.html — new active "PLAN 02 · design system" card (cyan, live)
linking to plan-dark-mode-standard.html; reserved slots renumbered to 03/04.
Added the site version-stamp script.
standarization/DARK_MODE_STANDARD.md — marked the HYBRID register
decision as LOCKED (2026-06-01).
Decision
HYBRID register split LOCKED — Instrument register (oscilloscope
character) for cockpits + SLD/P&ID labs; Editorial register (Fraunces serif,
refined) for landing / articles / hubs / plans. Cockpit instrument re-skin
queued as a future ship — must preserve semantic SLD/alarm colours
(additive atmosphere/type only).
v1.43.5
PATCH
May 26, 2026
RZ Dark System v1 + animated-on-load primitive applied to #p-dash
Owner pivot: existing dark mode read as "AI design slop" — asked for animated-
data-on-load, distinctive type, intuitive responsive (ref raihankalla.id).
This ship lays the design-system foundation + applies the first motion
primitive to the real cockpit.
Engine + #p-dash DISPLAYED values byte-identical. 75/75 accuracy probe
(count-up settles to exact original strings) + 57/57 + 22/22 + all strict
audits PASS.
Added (design system — internal/reference)
rz-style-lab.html (noindex) — 4 switchable dark-mode characters
(Oscilloscope / Blueprint / Terminal / Editorial). Each replays its
signature animated chart on selection (trace-in / plot-in / grow / sweep)
KPI count-up. Mobile-responsive switcher. The character picker.
rz-dark-beforeafter.html (noindex) — side-by-side generic-dark vs
RZ Dark System instrument register, same data block.
css/rz-dark.css — RZ Dark System v1 shared stylesheet. Two registers
([data-rz-register="instrument"|"editorial"]) of one token system:
shared signal semantics + base ramp + atmosphere + motion primitives.
standarization/DARK_MODE_STANDARD.md — the standard: two registers,
anti-slop checklist, tokens, type scale, motion primitives, responsive
rules, adoption plan.
Changed
datahallAI.html — first cockpit adoption of the "animated on load"
primitive. #p-dash headline KPIs (PUE/WUE/CUE/IT/GPU/NVL72) now count up
on first paint via requestAnimationFrame cubic-ease.
PROBE-SAFE : each value's exact original string is captured and
restored verbatim at animation end → displayed final text byte-identical.
HARD-SETTLE guarantee : a setTimeout(settle, dur+300) forces the
exact original value even if rAF stalls (backgrounded/throttled tab).
Critical because dkGpu/dkDom are NOT refreshed by the 4s interval — without
it a stalled animation could freeze a wrong basis number. Caught + fixed
during verification (frozen 1.04 PUE / 6,148 GPU on a throttled read).
Honours prefers-reduced-motion (skips animation entirely).
Process
Owner mandates logged (memory feedback_planb_always_visual.md): planb
plans must ALWAYS show a working visual; any change must present
before-vs-after VISUAL + code + explanation (not code+prose alone).
Docs
standarization/DARK_MODE_STANDARD.md NEW.
CHANGELOG.md (this entry) + changelog.html regen.
Memory tracker + visual-mandate feedback updated.
v1.43.4
PATCH
May 26, 2026
alarm state machine + color discipline — review doc-27 §3.3 P0 + §4.3 P1
MINOR ship: closes the LAST open P0 in review doc-27 — §3.3 color discipline
("warna status harus menang atas warna domain") + §4.3 alarm state UX
(active/acknowledged/shelved/inhibited/returned-to-normal).
Engine + #p-dash byte-identical. 52/52 line-model probe (added 3 alarm-
state assertions per inspector page) + 75/75 accuracy probe + 57/57 + 22/22
Added
js/rz-alarm-state.js — window.RZAlarmState ISA-18.2 alarm state
machine + colour-discipline arbiter:
7 states (normal / unack / ack / rtn_unack / shelved /
suppressed / oos). oos (maintenance) is visually distinct from
fault — closes review requirement.
4 severity tiers (critical / high / medium / low).
resolveColor(alarmState, domainColor) — status colour WINS over domain
unless normal. A faulted cooling pipe shows fault-red, not cyan.
deriveFromEquipment(equipState) — maps line/breaker data-state into
alarm state + severity + summary.
chipHtml() + audit().
standarization/ALARM_STATE.md — full schema + adoption table.
Changed
js/rz-inspector.js — Alarms tab now renders an ISA-18.2 alarm-state
chip + derived summary via RZAlarmState.deriveFromEquipment(). Graceful
fallback to v1.43.0 inline logic if the library is absent.
**datahallAI.html / chiller-plant.html / water-system.html /
fire-system.html** — <script src="js/rz-alarm-state.js?v=1.43.4" defer>
loaded before the inspector. Inspector cache bumped to ?v=1.43.4.
tools/probe-line-model.mjs — 3 new assertions per inspector page:
RZAlarmState exposed, color-discipline (status overrides domain),
fault→unack/critical derivation.
Scope discipline
EPMS_Telemetry.html still untouched per owner mandate.
Review doc-27 P0 status — ALL CLOSED
§ Item Ship
§3.1 Line metadata v1.42.0–v1.42.5
§3.2 Right-side inspector v1.43.0–v1.43.1
§3.3 Color discipline v1.43.4
§3.4 Simulation banner + KPI tooltip v1.43.2 + v1.43.3
§5.3 Breaker symbols v1.42.1
§5.5 Network speed/util/failure-domain v1.42.3
§5.7 BMS/DCIM data quality v1.43.2
Docs
standarization/ALARM_STATE.md NEW spec.
standarization/INSPECTOR.md Alarms-tab note.
standarization/BMS_SHELL.md v1.43.x table extended.
CHANGELOG.md (this entry) + changelog.html regen.
Memory tracker updated.
v1.43.3
PATCH
May 26, 2026
headline KPI source+formula+timestamp tooltips — review doc-27 §3.4 P0
MINOR ship: closes the remaining half of review doc-27 §3.4 P0 ("Setiap
number card harus punya tooltip 'source + formula + timestamp'"). The
#p-dash dashboard's 7 headline KPI cards now carry hover tooltips citing
the engine path, the formula, and the live update timestamp.
Owner-exclusion on #p-dash was lifted 2026-05-23, so this binding is
permitted under the accuracy gates. ADDITIVE only — the tooltip sets
the title attribute; textContent (the displayed value) is never touched,
so the no-random-on-basis-KPI accuracy rule stays intact.
Engine + #p-dash displayed values byte-identical. **40/40 line-model
probe** (added KPI-tooltip assertion) + 75/75 accuracy probe (no random-
basis regression) + 57/57 + 22/22 + all strict audits PASS.
Changed
datahallAI.html updateDashKPI() — appended an additive IIFE that
sets a title tooltip on each headline KPI value:
dkPue — "PUE = Total facility kW ÷ IT kW" · DATAHALL_CALC.pueBasis()
dkWue — "WUE = water L ÷ IT kWh = 0 (dry-cooler closed loop)" · BASELINE-DECISION.md
dkCue — "CUE_IT = grid factor × PUE = 0.69 × " · PLN Java grid 2025
dkIt — "IT Load = 4 halls × 27 NVL72 × 132 kW = 14.256 MW" · Scenario A
dkGpu — "GPUs = 108 domains × 72 = 7,776" · DATAHALL_MODEL
dkDom — "NVL72 domains = 4 halls × 27 = 108" · DATAHALL_MODEL
dkCdu — "CDU = ceil(3,029 kW ÷ 350) = 9/12 per hall × 4" · lockedState().cdu
Each tooltip ends with "Updated: HH:MM:SS (engine-derived, SIM)" —
timestamp refreshes on every 4s tick so operators see data freshness.
tools/probe-line-model.mjs — added datahallAI assertion: all 7
headline KPIs carry a title containing both Source: and Updated:.
Scope discipline
Displayed KPI values unchanged — accuracy probe confirms no
random-basis regression. The owner-excluded #p-dash displayed numbers
are byte-identical; only the hover title metadata is new.
EPMS_Telemetry.html still untouched per owner mandate.
Docs
standarization/BMS_SHELL.md v1.43.x table extended.
standarization/ACCURACY_VALIDATION.md note (KPI tooltip = additive, no
random-basis impact).
CHANGELOG.md (this entry) + changelog.html regen.
Memory tracker updated.
v1.43.2
PATCH
May 26, 2026
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.js — window.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
May 26, 2026
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.mjs — INSPECTOR_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
Page Lines Breakers Inspector
datahallAI.html 171 36 ✓
chiller-plant.html 18 0 ✓
water-system.html 10 0 ✓
fire-system.html 14 0 ✓
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
May 26, 2026
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
May 26, 2026
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.html — js/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.html — 10 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.html — 14 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.mjs — waitUntil:'load' (was networkidle2)
to avoid timeouts on pages with long-running flow animations.
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
May 26, 2026
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 imports — js/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() function — const 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.mjs — ADOPTION_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
May 26, 2026
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.mjs — ADOPTION_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
May 26, 2026
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
May 26, 2026
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.js — window.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
May 26, 2026
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
May 24, 2026
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
May 24, 2026
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-MK → MK-501.
Labels: Cooling Tower + Makeup → Make-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
May 24, 2026
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
May 24, 2026
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
May 24, 2026
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
May 25, 2026
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.js → rz-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
May 25, 2026
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/*.csv — all 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.js → rz-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
May 24, 2026
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)
Pair Shared Pair Shared
RTU↔TCP 0 TCP↔OPC-UA 1
RTU↔BACnet/IP 1 TCP↔DNP3 0
RTU↔OPC-UA 1 TCP↔PROFINET 2
RTU↔DNP3 2 TCP↔Ethernet/IP 2
RTU↔PROFINET 0 TCP↔EtherCAT 2
RTU↔Ethernet/IP 0 TCP↔BACnet MS/TP 1
RTU↔EtherCAT 0 OPC-UA↔DNP3 2
RTU↔BACnet MS/TP 0 OPC-UA↔others ≤2
TCP↔BACnet/IP 1 All 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.js → rz-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)
Topic Trait visible in animation
Modbus RTU RS-485 silent interval + per-role byte freq shift
Modbus TCP MBAP header chip visibly larger than payload chip
BACnet MS/TP Amber token chip passes between nodes before data
BACnet/IP BVLC tunnel = scan-line shroud at packet head
OPC-UA Always-on encryption shroud + layered binary chips
DNP3 UNSOLICITED responses (outstation pushes without poll)
PROFINET Sync line above wire + green cycle-start tick
EtherNet/IP CIP-layer marker stripes on chip head (4 colors)
EtherCAT Telegram 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
May 24, 2026
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
May 24, 2026
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)
Pair Shared fields
RTU vs TCP 0
RTU vs BACnet/IP 1 (tempo medium)
RTU vs OPC-UA 1 (tempo medium)
TCP vs BACnet/IP 1 (wire ethernet)
TCP vs OPC-UA 1 (wire ethernet)
BACnet/IP vs OPC-UA 2 (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
May 24, 2026
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
May 24, 2026
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.js — network-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.py — seek(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
May 24, 2026
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
May 24, 2026
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
May 24, 2026
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
May 24, 2026
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
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
May 25, 2026
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
May 25, 2026
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.html → all-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
May 25, 2026
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: 105 → 180 (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
May 25, 2026
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://<host>/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
May 25, 2026
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
May 24, 2026
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
May 24, 2026
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
May 24, 2026
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
May 24, 2026
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
May 24, 2026
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
May 24, 2026
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 →
#bodDrawerPdf → buildBodPdfHtml(), 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
May 24, 2026
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 unaffected — buildTechSpecHtml() 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
May 24, 2026
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
May 24, 2026
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
May 24, 2026
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
May 24, 2026
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)
Ship Function
v1.32.1 8 critical bugs fixed (AI-ACC-01/02/03/05/06/07/08 + CONV-ACC-01/02/04/08)
v1.32.6 Terminology + UPS 2N + CHW reconciliation (AI-ACC-04/09 + CONV-ACC-03/05)
v1.32.8 Basis drawers on all 15 top KPIs (display contract)
v1.32.9 Puppeteer probe for all 15 acceptance tests authored
v1.32.10 Probe 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
May 24, 2026
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
Phase Ships What
Phase 1 v1.32.1 8 critical bugs fixed (AI-ACC-01/02/03/05/06/07/08 + CONV-ACC-01/02/04/08)
Phase 2 v1.32.6 Terminology + UPS 2N + CHW reconciliation (AI-ACC-04/09 + CONV-ACC-03/05)
Phase 3 v1.32.8 Basis drawers on every top KPI (Rule 6 — display contract)
Phase 4 v1.32.9 Puppeteer 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
May 24, 2026
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
May 24, 2026
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
May 24, 2026
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.8C → Secondary 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
May 23, 2026
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 SOON → PRO; 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
May 23, 2026
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
May 23, 2026
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
May 23, 2026
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
May 23, 2026
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 tools → 6 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
May 23, 2026
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
May 23, 2026
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
May 23, 2026
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
May 23, 2026
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
May 22, 2026
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.1 → rz-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
May 22, 2026
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
May 22, 2026
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
May 22, 2026
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
May 22, 2026
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.js — requireAdmin(), 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
May 22, 2026
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
May 22, 2026
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_KV → wrangler 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
May 22, 2026
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.js — EDUCATOR_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 alignment — demo@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 docs — AUTH_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
May 22, 2026
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
May 22, 2026
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 toolbar — initBmsShellShim() 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
May 22, 2026
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
May 22, 2026
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
May 22, 2026
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
May 22, 2026
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 library — css/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
May 22, 2026
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 library — css/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
May 22, 2026
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 library — css/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
May 22, 2026
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 integration — js/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 library — css/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
May 22, 2026
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 library — css/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
May 22, 2026
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 (#kWue ← CONV_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
May 22, 2026
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.85rem → 2.85rem (~54% larger).
.kpi.hero .k-val weight 700 → 800 ; 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 library — css/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.snapshot → kpi-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
May 22, 2026
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 library — css/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
May 22, 2026
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 loaded — css/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
May 22, 2026
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
May 22, 2026
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 counters — Active / Ack / Cleared, bound to
the existing rules() aggregator (active = crit + warn, ack = 0,
cleared = scheduled maint). Refreshed on the same 4 s cadence.
Historian status — Online · 1 yr hi-res + 5 yr daily
(doc-18 BMS criterion: historian health visible).
Notification service — Online · email + SMS + push
(doc-18: notification service health visible).
Aggregate gateways online — 16 / 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
May 22, 2026
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
May 18, 2026
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:-520px → transform: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
May 18, 2026
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
May 18, 2026
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
May 18, 2026
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
May 18, 2026
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
May 18, 2026
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 <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
May 18, 2026
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
May 18, 2026
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
May 18, 2026
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
May 18, 2026
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
(`