Adversarial re-audit of every prior owner review comment against the live code
(owner: "semua comment saya tidak di eksekusi dengan proper"). 17 of 19 items
verified genuinely engine-wired; 2 real defects of the "shipped but degraded"
class were found and fixed. Full ledger: dcmoc/OWNER_COMMENT_AUDIT.md.
Fixed
Strategic Planning — single-source lock was conditional (StrategicPlanningDashboard.tsx).
Total Land Area / Grid Capacity / Climate / Target PUE were only disabledwhen a
site fed them, so with no site selected they degraded to editable phantom inputs showing
seed values (10000 m² / 20 MW) — contradicting the page's own "LOCKED (single source)"
banner. Now always read-only mirrors; with no site the page shows a clear empty state
("Select a site to run feasibility → Site Intelligence") instead of a fake editable seed.
Rack form factor was a fake CAPEX cost driver (CapexEngine.ts). rackFormFactor
(std42u 1.0 / tall48u 0.90 / OCP 1.15, sourced EIA-310 / OCP Open Rack v3) only fed the
reported floorSpace metric — switching rack form changed reported m² but $0 of CAPEX,
though v1.115.92 claimed it a "real cost driver". Now multiplied into the space-driven
building (shell + civil) category, so 42U/48U/OCP move the CAPEX total as intended.
Added
DC Incidents — Case Library (dc-incidents.html), a root-only knowledge base of major data-center / cloud incidents worldwide. Ranked hub (transparent magnitude composite: blast radius 35% · users 25% · financial 20% · duration 20%) → each incident opens a dedicated dossier page (incident-<slug>.html) with a full sequence of events (SOE), root cause, correction of errors (COE), contributing factors, lessons learnt, engineering improvements, technical deep-dive, and a provenance-mandatory reference list (every fact traces to a public post-incident report).
Data-driven build:data/incidents/*.json corpus → tools/build-incidents.py renders the hub + all incident pages from one audit-passing template (gate markup, dark palette, mobile patch, version stamp, cookie consent). New ship gate tools/test-incidents-corpus.mjs rejects any incident missing sourcing/SOE/COE/≥2 references.
Gating + landing padlock: root-only page-access feature flag dc-incidents; enforceTierFeatureAccess('dc-incidents') on every page; /dc-incidents.html added to ROOT_ONLY_PATHS; a 🔒 DC Incidents entry on the landing-page menu. Anonymous visitors see the locked overlay; root accounts see the content (verified headless).
Phase A reference incident: AWS S3 US-EAST-1 (28 Feb 2017) — the archetype of COE/SOE post-incident culture — hand-built from the official AWS postmortem. Gated pages are intentionally excluded from the public sitemap / llms / search-index. Gates green: page-gates, dark-coverage, responsive-layout, mobile-responsive, version-stamp, script-tags, incidents-corpus.
Operations OPEX breakdown now recomputes when the deferred rz-engine.min.js finishes loading — the models.opex.fullBreakdown memo gates on the useEngineReady() signal (same class of fix as the WS2 Financial-statements engine tick). Previously, if the Operations page mounted from persisted state before the engine script loaded, the breakdown could stay empty until an input changed. End-to-end verified all four OPEX-program surfaces render with 0 console errors (Operations breakdown · Finance P&L/Balance-Sheet/Sankey · Maintenance 5-strategy deep-dive · CAPEX read-only mirrors).
Finishes the CAPEX Assumptions input-dedup (WS4). Seven fields that were still editable in BOTH the CAPEX Assumptions drawer and Requirements → Infrastructure — Deep-Sea Water Cooling, Green Certification, Renewable Energy, Design Fee, PM Fee, Contingency, Project Year — are now read-only mirrors on the CAPEX page (Edit ↗ jumps to Requirements), matching the established Building/Fire/Substation/Power-Backup pattern. Requirements → Infrastructure is the sole editor (it already carries the richer editors — sustainability + solar/BESS sizing, the delivery-basis group, and Design Margin ⇄ Contingency binding at Growth & Availability 1.5). No CAPEX cost input is editable in two places anymore; the CAPEX drawer reflects one shared source. Removed the now-dead setDeepSea setter. walk 31/0, trace-parity 116/116, enum-coverage 25. The DCMOC OPEX program (WS0–WS4) is complete.
Maintenance-strategy deep-dive on Maintenance → Strategy. The planned-maintenance regime expanded from 2 (OEM-full / standard-annual) to the full 5-strategy worldwide taxonomy — Full OEM-compliant · Predictive/CBM · Hybrid (criticality-tiered) · Standard annual + compliance-only · Reactive/run-to-failure — researched from SFG20 / OEM RCM / NFPA 25/70B / Uptime O&M. A dropdown + per-strategy cards surface each strategy's PM frequency, task scope, contract-vs-in-house split, indicative in-house FTE/10 MW, availability delta and annual cost index, alongside the engine-computed PM labor-hours, site FTE and availability % for the current project.
Changed
DATA.maintenance.ops.pmRegime carries all 5 strategies (aligned key-for-key with DATA.opexModel.maintenanceStrategies): pmHoursMult scales PM labor demand in models.maintenance.opsHeadcount; failureMult scales the deferred-servicing failure exposure in models.maintenance.availabilityImpact — so the strategy choice flows through to staffing (Staffing page) and computed availability (Risk page) app-wide (predictive/CBM gives the best availability 99.982%, reactive the worst 99.968% at the reference 20 MW / Tier III). Store pmRegime enum + DowntimeCalculator widened to 5. Sourced. Engine 762/0, reference-parity 155/0, walk 31/0, trace-parity 116/116, calibration 19/0.
Detailed project financial statements on the Financial → Pro Forma (Full) tab, driven by the same engine cashflows the KPIs use (no re-computed or fabricated financials):
Income Statement (P&L) — per-year Revenue → OPEX → EBITDA → Depreciation (tax shield) → Taxable Income → Tax → Net Cash Flow (after-tax), with EBITDA/net margins. Labelled to match the engine's convention exactly (taxableIncome = max(0, EBITDA − depreciation), netIncome = EBITDA − tax = unlevered FCF; depreciation is a non-cash tax shield added back), so the statement reconciles line-to-line.
Balance Sheet — assets (net PP&E + cash) = liabilities (debt schedule from an adjustable debt-ratio + debt-rate) + equity (paid-in + retained earnings). Cash is the accounting identity plug (cumulative net income + D&A − principal), so the sheet balances by construction — a live check asserts a < $1 residual every year. Operating P&L is unlevered (project basis, matches NPV/IRR); interest is a financing memo.
Sankey — the actual money distribution for a stabilized year: Revenue → each OPEX group (from the WS1 per-country breakdown, scaled to the P&L OPEX) + EBITDA → Tax / Net Cash Flow. Depreciation (non-cash) is correctly excluded; renders only when the cash chain is positive, else an honest note.
Changed
Guarded the OPEX-breakdown call against the deferred-engine race (persisted CAPEX can mount the statements before window.RZEngine loads) with an engine-readiness tick, so the Sankey populates deterministically. DCMOC build green; walk 31/0, trace-parity 116/116.
v1.116.0MINOR
DCMOC — complete per-country OPEX model + maintenance-strategy taxonomy
Added
Complete per-country OPEX model. The Operations page previously showed only "Energy Cost 24h". It now renders a full annual operating-cost breakdown — grouped Energy / People / Contracts & Maintenance / Security / Compliance & Licenses / Connectivity / Real Estate & Tax / Overhead — with $/yr, % share and a per-line basis. New engine model models.opex.fullBreakdown (additive; totalAnnual untouched, all existing gates green) covers electricity, water, in-house manpower, outsourced M&E O&M, M&E preventive maintenance, ICT/network maintenance, outsourced cleaning, physical security (guards), security-system maintenance, software/BMS/DCIM licenses, certification renewals, annual permits, corporate internet/bandwidth, land lease, property & local tax, insurance, carbon levy and G&A overhead.
Per-country sourced cost factors (40 countries). A 3-agent research loop (deep-research → adversarial fact-check → merge) produced sourced values for the six genuinely location-variant factors — water tariff $/m³, industrial land lease $/m²·yr, property-tax %, enterprise DIA $/Mbps·mo, cleaning $/m²·yr and fully-loaded guard $/guard·yr — added to CountryProfile.opex and regenerated into DATA.countries. Each cell carries a source_url+quote+confidence provenance row in tools/dc-corpus/opex-research/facts.jsonl; screening-confidence cells (benchmark-extrapolated) are logged. The fact-checker corrected NZ/CA water (USD conversion), ZA internet and NG/KE/ZA/CO guard clamping.
Worldwide maintenance-strategy taxonomy + selector.DATA.opexModel.maintenanceStrategies (full OEM-compliant · standard annual + compliance-only · reactive/run-to-failure · predictive/CBM · hybrid), each with contract-vs-in-house split, in-house FTE/10MW, availability delta and cost index (SFG20 / OEM RCM / NFPA / Uptime). A dropdown on the Operations OPEX card drives the contract / PM / manpower / availability mix coherently (highest-cost OEM = best availability; reactive = lowest cost, worst availability).
Changed
Every new DATA value carries a DATA.sources entry (opexModel, opexModel.maintenanceStrategies, countries.opex). Engine 762/0, value-bindings 85/0, reference-parity 155/0, walk 31/0, trace-parity 116/116, enum-coverage 25, model-calibration 19/0.
v1.115.94PATCH
DCMOC — CAPEX infra dedup complete: Power Backup single-owner + fuel AutoField at its home
Changed
Finishes the CAPEX Assumptions dedup. The Power Backup block (UPS / generator / fuel autonomy) was the last section editable in both the CAPEX Assumptions tab and Requirements → Infrastructure. It's now read-only mirrors on the CAPEX page, and the fuel-autonomy AUTO/override field moved to its canonical home in Requirements → Infrastructure → Systems (AUTO from the tier's Uptime backup band; tick to override) — so the auto-with-override lives where the field is owned, with exactly one editor. No CAPEX infrastructure parameter is editable in two places anymore. walk 31/0, trace-parity 116/116.
v1.115.93PATCH
DCMOC — CAPEX infra dedup, cont.: Fire + Substation now read-only mirrors
Changed
Continuing the CAPEX Assumptions dedup — the Fire Protection (suppression + alarm) and Substation & Grid (front-of-meter scope + utility rate) sections were editable in both the CAPEX Assumptions tab and Requirements → Infrastructure, writing the same store. They're now read-only mirrors on the CAPEX page (value + "Edit in Requirements ↗"), so each has one owner. Editing them in Requirements still flows to the CAPEX total. walk 31/0, trace-parity 116/116, enum 25.
> Still remaining: the Power Backup block (UPS / generator / fuel) is dual-editable — its dedup also moves the fuel AUTO/override field to Requirements, so it's a careful follow-up.
v1.115.92PATCH
DCMOC — rack-form is now a real cost driver + AutoField extracted & rolled to CAPEX
Added
Rack Type (42U / 48U tall / OCP) now drives floor space — previously an inert control. Backed by engine DATA.requirements.rackFormFactor (48U tall packs ~14% more usable U in the same footprint → 0.90× floor; OCP Open Rack is 21″ wide + open busbar aisle → 1.15×), wired into the CAPEX floor-space calc. Picking a rack form now moves floor space (and its building cost) + shows a hint of the effect. Sourced (OCP OpenRack v3 21″; EIA-310 48U vs 42U).
CAPEX "Fuel Storage" now auto-derives with override — the AUTO/OVERRIDE field primitive (previously embedded in the Financial page) is extracted to a shared components/ui/AutoField.tsx and applied to fuel-storage hours: AUTO follows the Uptime backup-autonomy band for the tier (II 48h · III 72h · IV 96h); tick to override for remote/hurricane sites. "Auto tapi bisa override."
Changed
Engine chain rebuilt (762/0, catalog 234 fns / 159 sources); gates green (walk 31/0, trace-parity 116/116, enum 25, reference-parity 155/0). Completes Workstream C of the IA/auto-derive program.
v1.115.91PATCH
DCMOC — Time-to-COD tooltip + Target Rack Density auto-derives from architecture
Added
"Time to COD" now explains itself — a hint on the Requirements field: months from today to the Commercial Operation Date (the date the facility starts revenue service), derived from Target COD in Project Overview; drives schedule pressure, phasing + interest-during-construction.
Target Rack Density (Max) auto-derives from the selected AI architecture — picking an architecture (GB200 ≈ 132 kW/rack peak, etc.) auto-fills the target ceiling; the field shows an AUTO chip when it matches the architecture, or a one-click "↺ match" button + "overridden" note when you've changed it. Owner: "target rack density bukannya auto dari architecture rack." Manual override still allowed. Pure frontend; walk 31/0.
> Note: rack-form (42U/48U/OCP) wired as a real cost driver + the AutoField roll-out to more CAPEX inputs are a follow-up (Workstream C, part 2).
v1.115.90PATCH
DCMOC — Site Intelligence: guided Auto-optimize + blink-highlight what to edit
Added
The Edit-Criteria drawer now shows you what to fix and can fix it. On open, the parameters that are dragging the site's score down (the drivers of every weak axis) pulse — so you're not guessing which of 36 fields to touch. A new "Auto-optimize criteria → best score" button solves each weak-axis driver to its best realistic value on the real score model (autoOptimizeSite, reusing the axis-lever bisection), applies them, highlights exactly what it changed, and reports the score move (e.g. 42 → 57 · 2 weak axes lifted · 6 criteria set to best). It never regresses, and is honest that some axes can't reach "Good" by criteria alone. Pure frontend (reuses the site scoring + lever solver); walk 31/0, site page 0 errors.
v1.115.89PATCH
DCMOC — Site Intelligence edit-criteria: per-parameter help + country auto-derive
Added
Every site criterion now explains itself. The Edit-Criteria drawer's 36 parameters each carry a plain-language "what it is + a worked example" tooltip (e.g. Cable Landings — number of submarine-cable landing stations serving the region; more = diverse international connectivity + lower latency. e.g. Singapore ~4, an inland site 0) — so the numbers and scales aren't a wall of unexplained values.
The categorical criteria now auto-derive from the per-country research tables (countryBaselineEnums): earthquake risk from the seismic zone, flood/cyclone/coastal risk from the natural-disaster table, construction-labor from the talent pool, fuel availability from the diesel table, and government support from the tax-incentive programs — shown as a cyan "baseline" chip (and named in the select placeholder) so far fewer fields sit blank. Editing still overrides to a "custom" value; the store stays unset (= engine baseline) until you do. Pure frontend; walk 31/0.
v1.115.88PATCH
DCMOC — CAPEX "Assumptions & Config" dedup: one owner per field
Changed
Removed the duplicated content from the CAPEX Assumptions & Config sub-tab so each thing has a single edit home and the wiring can't diverge:
The project-timeline Gantt (which the Construction page already owns, with the 4-level WBS + planned-vs-actual EVM) is gone from CAPEX — replaced by a compact "Construction timeline: N mo (L2 cost basis)" line + an "Open full schedule & EVM in Construction ↗" jump.
Building Type, Site Condition and Market Condition — which are (or now are) owned by Requirements → Infrastructure — are read-only mirrors on the CAPEX page (value + "Edit in Requirements ↗"), matching the existing shared-canonicals pattern. Market Condition was added to Requirements → Infrastructure so all three sit together.
Net: no field is editable in two places. Editing them in Requirements still flows through to the CAPEX total (same store). Pure frontend; walk 31/0, trace-parity 116/116.
> Note: several other infrastructure parameters (substation / UPS / generator / fuel / fire / floor / seismic) are still editable in both the CAPEX Assumptions tab and Requirements → Infrastructure — a broader dedup pass for a follow-up.
v1.115.87PATCH
DCMOC — alternative power tech wired into a real CAPEX/OPEX/CO₂ delta
Changed
The Alternative Power section is now a techno-economic comparison, not just a reference table. Each on-site power option (reciprocating engine, open/combined-cycle turbine, SOFC, SMR, geothermal, solar+BESS, diesel) now shows its CAPEX, annual OPEX and annual CO₂ sized to this project's facility load (IT × PUE, continuous prime) plus the Δ vs the diesel baseline — green when lower, red when higher. Backed by new engine DATA.fuelGen.altPowerTech.capexUsdPerKw + lcoeUsdPerKwh (Lazard LCOE+ 2024/25: gas-CC ~$76/MWh, nuclear ~$182/MWh; + NREL ATB + vendor est) with a DATA.sources entry. Example at 2.5 MW IT: SMR carries ~+$25M CAPEX but ~−$3M/yr OPEX and ~−19 kt/yr CO₂ vs diesel — the real high-capex/low-carbon-and-fuel tradeoff. Screening, not a procurement basis. Engine chain rebuilt (762/0, 158 sources); walk 31/0.
v1.115.86PATCH
DCMOC — polish round 3: card-consistency capstone
Changed
Aligned the Planned-Maintenance Compliance Regime card to its page's card idiom (added the shadow-sm dark:shadow-none its sibling cards use) — the last real in-page consistency gap on the session's new components. (Cross-page card differences are a pre-existing DCMOC pattern, not introduced here, and consolidating onto the shadcn <Card> would move against the dominant slate-card idiom, so left as-is.) walk 31/0; no engine change.
Completed the rz-* token sweep on the remaining session components: the Phased Financial Improvement Recommendations cards + icon (cyan→rz-info), and the CDU water-balance range sliders (accent-cyan-500→ the --rz-accent-info var) — the new UI now sits entirely on the token palette.
Added
The Alternative On-Site Power Technologies table highlights the row matching your current fuel-type selection ("your selection" chip + subtle tint), connecting the modelled choice to the broader technology landscape. Verified: selecting Fuel cell tags the SOFC row. No engine change; walk 31/0.
v1.115.84PATCH
DCMOC — IST fail→issue loop + UIUX token polish of the session's new components
Added
A failed IST scenario now auto-raises a linked open Cx issue (High severity), so a failed integrated test surfaces in the Issues & Punch list, the readiness guidance and the PDF — passing or clearing it closes the linked issue. Closes the loop from "test failed" to "tracked remediation."
Changed
Design-token polish across the session's new components (from a UIUX review). Introduced a shared StatusChip (rz-* semantic tokens) and routed every status/label badge through it so "pass" is rz-data, "fail" is rz-alert, and measured/info accents are rz-info site-wide — the IST tab, alt-power-tech maturity chips, and the pmRegime "Selected" pill were using raw emerald/rose/cyan/violet families that fought the palette. Also: PhasedFinancial negative states red-500→rz-alert; PageDescription + CDU + commissioning info accents →rz-info; the two new accordions standardized on ChevronDown; IST Pass/Fail tap targets raised to min-h-[32px]; and the one real a11y gap — the Phased Financial phase row (<tr onClick>) — is now keyboard-operable (role="button", tabIndex, Enter/Space handler, focus ring). No engine change; gates green (walk 31/0), no new console errors.
v1.115.83PATCH
DCMOC — IST scenarios in the Commissioning PDF export
Added
The Commissioning PDF now includes an "Integrated Systems Tests (L5)" section — each applicable IST scenario (redundancy-filtered) with its category, duration and Pass/Fail/pending status. Closes the gap where the IST scenarios drove the on-screen readiness but were absent from the exported report. Export probe 44/44, walk 31/0; no engine change.
v1.115.82PATCH
DCMOC — IST scenario pass/fail now drives the commissioning readiness index
Changed
The rich IST scenarios are now the single source for the ist readiness key. Marking scenarios Pass/Fail in the IST Scenarios tab feeds the engine readinessIndex (via checklistStats['ist'] = passed ÷ applicable, redundancy-filtered) and the overview per-level readiness bar + the Tests-passed tally — so the integrated-systems tests actually move operational readiness, not just a local count. The old shallow CX_CHECKLIST['ist'] accordion is removed from the Cx Checklist tab (replaced by a pointer to the IST Scenarios tab) so there is exactly one IST source — no double-count. Verified: a Pass on the IST tab shows "1/10 passed" on the checklist pointer and lifts the ist readiness. Pure frontend; gates green (walk 31/0, trace-parity 116/116).
v1.115.81PATCH
DCMOC — editable pass/fail tracking on the IST scenarios
Added
The IST Scenarios now carry editable Pass/Fail tracking, like the Cx checklist. Each integrated-systems-test scenario has a Pass / Fail / clear control (in its expanded body) and a status badge in the header; the tab shows a live tally — passed / failed / pending + a % pass progress bar. State persists in the shared cxTracking store under an ist-scn: namespace (no collision with the readiness-driving checklist ticks), survives reload, and is plan-mode-clean until touched. Pure frontend reuse of the existing tracking store; no engine change. Verified: marking Pass updates the tally and persists across reload. Walk 31/0.
v1.115.80PATCH
DCMOC — alternative on-site power technology research reference
Added
An "Alternative On-Site Power Technologies" reference on the Fuel & Generator page — closing out the A-slice ask ("deep research cari alternative tech lain"). A sourced screening comparison of the credible behind-the-meter options for an off-grid / prime-power data center beyond the reciprocating genset: reciprocating gas engine, open- and combined-cycle gas turbine, solid-oxide fuel cell (SOFC), small modular reactor (SMR), geothermal/EGS, solar+BESS, and diesel backup — each with electrical efficiency, operating CO₂ (kg/kWh), TRL, power density (MW/acre), deploy window, H₂-readiness, maturity, and a note. Backed by engine DATA.fuelGen.altPowerTech with a DATA.sources entry citing 2025-26 industry reporting (Goldman Sachs, DataCenterDynamics, Bloom Energy, GE; NuScale's 77 MWe NRC Standard Design Approval, May 2025). Reference/education only — collapsible, and explicitly not wired into the cost model (the fuel-type selector remains the modelled path). Engine chain rebuilt (762/0, 158 sources); walk 31/0.
v1.115.79PATCH
DCMOC — review-hardening of the power-source / fuel / water batch
Fixed
Carbon Scope-1 now uses the selected fuel's consumption rate (fuelTypeModel.effLPerKwh), not a fixed diesel 0.3 L/kWh. Previously fuel-cell (0.20) and biogas (0.32) selections computed their fuel volume — and therefore Scope-1 CO₂ — on diesel efficiency, giving a wrong carbon number.
The HVO cost/CO₂ comparison panel is now gated to fuelType === 'diesel'. HVO is a diesel substitute, and the panel's baseline is the diesel 2.68 kgCO₂/L factor — showing it for a gas/biogas selection produced a nonsensical saving computed against a non-diesel fuel volume.
Prime (off-grid, continuous) power no longer double-counts test fuel. With gensets running 8760 × utilisation, the periodic test schedule is a subset of continuous operation; the separate test-fuel line is now zeroed for prime (standby/hybrid keep it). Prime CO₂ corrects slightly (e.g. 20,236 → 20,207 t/yr at 2.5 MW).
Guarded the generator OPEX-breakdown percentage divisor against a zero total; removed a dead/misleadingly-named annualGlycolMakeupPlusWaterM3 field from models.water.coolingLoop; the IST scenario tab now renders unordered lists as <ul> (was <ol>) and guards the risk-badge style lookup.
All from an adversarial review of v1.115.72–.78. Engine chain rebuilt (762/0, bindings 85/0); gates green (walk 31/0, trace-parity 116/116, enum 25, fuel-gen probe 5/5).
v1.115.78PATCH
DCMOC — Commissioning Integrated Systems Test (IST
scenario deep-dive)
Added
A new "IST Scenarios" tab on the Commissioning page with the scripted Level-5 integrated-systems-test procedures the checklist was missing. Backed by engine DATA.commissioning.istScenarios (sourced: Uptime Tier Certification IST practice + NFPA 110/72/75, ISO 8528, IEC 62040-3, ASHRAE TC9.9). Ten scenarios, each with purpose, pre-conditions, scripted method steps, acceptance criteria, what to observe during the transient, the systems involved, duration, risk and the governing standard — specifically covering the tests requested:
Dual-source (A/B feed) transfer — either feed carries 100% with no IT drop.
Bus-tie breaker & interlock — tie closes on a source loss under a valid sync-check permissive; interlock blocks an unsafe close.
Mechanical redundancy degradation (N+2 → N) hotspot test — deliberately shed cooling units step-by-step to N, map where rack-inlet hotspots form, and observe the surviving plant's ramp-up response (fan/valve/flow) to hold setpoint. This is the headline test the owner asked for.
Cooling unit failover & ramp-up, black-building / pull-the-plug, generator step-load + fuel endurance, UPS transfer & autonomy, fire/EPO cause-and-effect, and BMS/network failover.
Scenarios are gated to the project's redundancy (appliesFrom): a N+1 design sees the single-path tests; the dual-source and N+2→N degradation tests unlock at 2N. The tab shows the in-scope count and estimated test-hours, and lists what unlocks at higher redundancy. Engine chain rebuilt (762/0, catalog 234 fns / 157 sources); gates green (walk 31/0, trace-parity 116/116, enum 25).
An always-visible "Improvement Recommendations" panel on the Phased Financial page. Previously the quantified levers were only reachable by clicking a red IRR/NPV/PI number; now they sit on the page as a ranked, comprehensive list. It combines:
Solved levers — the revenue-uplift and CAPEX-cut magnitudes that reach the 12% hurdle, computed by bisection on the same cashflow model (with the target $/kW·mo and resulting IRR).
Structural levers with the real on-page figures — capture the incentives already modelled (tax + grid $), reduce interest-during-construction (the live IDC $ over the build months), re-phase the build (defer later-phase CAPEX), and trim OPEX drivers (PUE/staffing/SLA) — each with a jump-to-tab.
A prominent "Auto-optimize revenue → 12% IRR" button that runs the existing deterministic bisection solver and previews the allowlisted revenue move before applying.
The panel adapts its framing to whether the program is above or below the hurdle, and is honest that structural levers are directional while revenue/CAPEX levers are solved. Pure frontend (reuses the optimizer + decision-explain); no engine change. Gates green (optimizer 8/8, financial-auto 9/9, walk 31/0).
v1.115.76PATCH
DCMOC — two planned-maintenance compliance regimes: OEM-full vs standard-annual
Added
Planned maintenance now has two compliance regimes on the Maintenance → Strategy tab, wired end-to-end:
OEM-compliant (full) — every OEM PM task at the manufacturer's interval: maximum reliability and warranty compliance, maximum manpower.
Standard (annual) — most tasks consolidated to annual, with only 1–2 critical systems (UPS batteries, gensets) kept at OEM frequency: far fewer PM labor-hours, at a ~12% higher failure exposure from deferred servicing.
Backed by engine DATA.maintenance.ops.pmRegime (pmHoursMult 1.0 vs 0.55, failureMult 1.0 vs 1.12, sourced). models.maintenance.opsHeadcount scales PM labor demand by the regime, and models.maintenance.availabilityImpact scales the failure rate — so choosing standard-annual honestly lowers labor-hours in Staffing while nudging the computed availability in Reliability/Risk. The selector shows the live delta and, importantly, is honest that at a small single-DC site the total headcount stays floor-bound by 24/7 emergency-response coverage (the saving lands on vendor/overtime labor cost; the FTE drop appears at larger campuses).
Held in the sim store inputs.pmRegime (default oem-full). Enum-coverage gate extended to pmRegime (2/2). Engine chain rebuilt (762/0, bindings 85/0, catalog 234 fns / 156 sources); gates green (walk 31/0, trace-parity 116/116, enum 25).
v1.115.75PATCH
DCMOC — per-page "what this page is for" descriptions, site-wide
Added
Every DCMOC page now explains itself. A single registry-driven PageDescription component is injected once in the Shell, above every tab's content, and renders a one-line "what this page shows + when to use it" note keyed by the active tab. Covers all ~48 tabs (Requirements, Capacity, Fuel & Generator, CDU, Architecture, CAPEX, Financial, Reliability, Operations/Staff/Maintenance, Carbon, Commissioning, Scenarios, Diagnostics, and the rest). No more guessing what a page is for. One component + one registry — not a per-page copy; adding a tab is a one-line registry entry. Gates green (walk 31/0); no engine change.
v1.115.74PATCH
DCMOC — Simulation KPIs + Cause-Effect levers get trace/diagnostic modals
Added
Click-to-trace diagnostics on the Simulation (Staff Model Config) KPIs. The four KPI cards — Internal Staff Cost, Vendor Labor Cost, Parts & Consumables, Hidden Turnover Loss — are now clickable and open a diagnostic modal that explains, from the SAME live model the card renders, how the number is built (headcount × labor multiplier, the vendor-premium strategy multiplier, the AQI consumables multiplier + filter-life, the turnover amortisation) plus quantified levers with jump-to-tab.
Cause-Effect Lever Map is now interactive and honest. Each lever row is clickable → the same diagnostic modal with its direction (raises/reduces/mixed) and effect. Fixed a real bug: the "Air → Direct Liquid Cooling" lever displayed a literal unfilled ~$X/yr placeholder — it now computes the actual annual energy saving from the live IT load at the PUE delta ($0.10/kWh screening) and shows the real PUE figures from the engine.
Changed
The shared DiagnosticModal gained an explain variant — a neutral cyan "Trace — how this is calculated" framing (vs the red "threshold breached" framing) so a healthy KPI breakdown isn't mislabelled as a fault. Reused, not re-implemented per card. Gates green (walk 31/0, trace-parity 116/116); no engine change.
v1.115.73PATCH
DCMOC — CDU liquid-cooling water & glycol consumption model
Added
Water & Glycol Balance section on the CDU / Liquid-Cooling page — liquid cooling was modelled for hydraulics and refrigerant but not for water use, which for an evaporative-tower site is the dominant sustainability cost. New engine model models.water.coolingLoop (backed by DATA.coolingWater, ASHRAE TC9.9 + cooling-tower practice, sourced) computes the full balance:
Technical coolant loop — closed water + glycol loop (~8 L/kW IT charge), user-set glycol fraction (20–35%), and annual makeup (~15%/yr of charge from leaks/drain-refill/service), split into water vs glycol.
Heat-rejection tower losses — evaporation (≈ latent heat of the rejected duty, IT×PUE × 1.4 L/kWh_th × wet-fraction), blowdown (evaporation ÷ (cycles-of-concentration − 1)), and drift (~0.5% of evaporation with modern eliminators).
Heat-rejection selector — Evaporative tower (max water) / Hybrid-adiabatic (~half) / Dry cooler (no tower water, but higher fan energy/PUE), plus glycol-% and cycles-of-concentration sliders.
Outputs annual m³ by stream, glycol makeup (flagged as chemical, not water), and WUE (L/kWh). Verified live: a 2.5 MW evaporative site ≈ 2.64 L/kWh WUE; switching to a dry cooler drops tower water to zero. The balance is also written into the CDU PDF export.
Engine chain rebuilt (terser + catalog 234 fns / 155 sources + value-bindings 85/0 + test-rz-engine 762/0); gates green (walk 31/0, trace-parity 116/116, enum-coverage 24). DATA.sources.coolingWater entry added (no economically-material literal left in the model body).
Power source + fuel type on the Fuel & Generator page — the model now covers three power topologies and six fuel/generation types, and they drive the whole app (not just a label):
Power source — Utility grid + standby gensets (gensets run ~grid-outage hours only), Prime power (off-grid) for sites like Ireland where the DNO has no grid capacity so on-site generation is the primary continuous supply (gensets run 8760h × 0.85 utilisation), and Hybrid (grid + on-site sharing ~55% of the year).
Fuel / generation type — Diesel (EN590/ULSD), HVO-100 (renewable diesel, −90% lifecycle CO₂ per EN 15940), Natural gas (reciprocating gas engine, −24% CO₂), Solar + BESS hybrid (shaves genset run-hours ~30%), Fuel cell (SOFC on gas), and Biogas/RNG (near carbon-neutral). Each carries efficiency, CO₂/unit, cost premium and run-hours factors from engine DATA.fuelGen.powerSourceModel / fuelTypeModel (ISO 8528 duty ratings; EN 15940; DATA.sources).
The selection is held in the simulation store so every related surface reacts:
Fuel & Generator — annual fuel, consumption, and CO₂ scale with the run-hours implied by the topology (verified live: standby ≈ 14 h/yr → prime ≈ 7,446 h/yr; prime CO₂ ≈ 20,236 t/yr, prime + HVO ≈ 2,061 t/yr = −90%).
CAPEX — prime removes the utility substation + grid-connection front-of-meter cost entirely (off-grid) and oversizes the gensets (prime-rated); hybrid at ~half grid cost.
Carbon & ESG — Scope-1 generator emissions now use the topology run-hours and the fuel-type CO₂ factor instead of a fixed 200h diesel approximation.
Architecture SLD — prime power relabels the utility intake to an off-grid On-Site Plant node and the generation lane from STANDBY to PRIME POWER PLANT (continuous), with a paralleling-switchgear stage in place of the ATS.
audit-dcmoc-enum-coverage extended to gate powerSource (3/3) and fuelType (6/6) against their engine DATA maps (their keys live in JS, so tsc can't catch drift). Engine chain rebuilt (terser + catalog + value-bindings 85/0 + test-rz-engine 762/0); gates green (walk 31/0, trace-parity 116/116, arch-diagram 7/7, reference-parity 155/0).
v1.115.71PATCH
DCMOC — CAPEX-total trace now decomposes the real cost stack
Fixed
The CAPEX-total trace was inaccurate — it showed the total as computed from just "IT Load + Contingency %", as if CAPEX were a contingency assumption rather than a calculation. It now decomposes into the REAL components that sum to the total: Hard Cost (Σ all disciplines — electrical/cooling/UPS/building/generator/network/fire/seismic/security/commissioning/testing/permits × their multipliers) + Soft Costs (design + PM) + Contingency + Front-of-Meter (substation/grid/switchgear). Four new drill-down trace nodes (capex.hardTotal / capex.softTotal / capex.contingencyAmt / capex.fomAmt) read the engine's own costs/softCosts/contingency/fomTotal, so clicking through the trace reaches the actual cost calculation. Value-bindings + trace-parity 116/116 green.
v1.115.70PATCH
DCMOC — Trace popover Collapse/Expand-all fixed + made reusable
Fixed
The Trace-Number popover "Collapse all / Expand all" toggle now actually works per node. It previously flipped a single boolean that showed/hid one flat list (owner: "no effect"). Replaced with a reusable per-node collapsible tree: new hooks/useCollapsibleTree.ts (tracks expanded ids, toggle/expandAll/collapseAll/allExpanded) + components/ui/CollapsibleTree.tsx (nested renderer with per-node chevrons + a renderNode callback). The popover's dependency tree is now genuinely expandable node-by-node, Expand-all/Collapse-all act on every node, and filtering still falls back to a flat matched list. The primitive is reusable by any tree UI (owner: not hardcoded per-use). Trace-parity 116/116 unaffected.
CAPEX Engine no longer duplicates Requirements inputs. The Project-Parameters panel had editable Region/Country, IT Capacity, Redundancy, Cooling, and Rack Density selects — the exact shared canonicals a banner already said Requirements owns, so the page could fork them (two owners of one value). They're now READ-ONLY derived cards (value + "requirements" chip + "Edit ↗" jump to Requirements); only CAPEX-only assumptions (building type, UPS/generator, fuel storage, utility rate, green cert, contingency, fees, FOM quality selects, substation) stay editable here. One source of truth (owner: "jangan ada duplicate").
Setup Wizard removed — the Scenario-Controls "Wizard" modal (Region / Reliability Tier / Technical Systems / Maint. Strategy) duplicated Requirements configuration; deleted the trigger + mount so there's a single configuration path.
Gates: walk 31/0 · trace-parity 116/116. No engine change.
Generators showed 115% utilization — impossible for a self-sized component. Root cause: the capacity component table counted gensets from IT load (ceil(IT/2000), engine equipScale) but divided FACILITY load (IT × PUE) by that capacity → utilization = PUE ≈ 115–127%. Generators back the WHOLE facility (IT + cooling + losses), so they must be sized on facility load — this was a genuinely under-sized genset plant, not just a display glitch. Now capacity-adapter.ts equipmentTable() derives the genset count from facility kW, so utilization can never exceed 100% (verified: Generators 115% → 94% at 110 MW IT).
At-Risk / Watch rows are now clickable → diagnosis modal on ALL four capacity system tables (Power + Cooling + Rack & Space + Network), not just the power utilization bars. The status chip opens the shared DiagnosticModal with the already-computed remediation (add N units / shed X MW / raise rating) + quantified levers + jump-to-Requirements/Phase-Plan. Closes the "every red value clickable" mandate for the capacity page.
Gates: walk 31/0 · trace-parity 116/116. No engine change.
v1.115.67PATCH
DCMOC — futureExpansionMw wired: Architecture reserve now shown as capacity headroom
Fixed
futureExpansionMw (Architecture rail) was a dead control — set by the user, drove nothing. It now surfaces on the Capacity Planning page as an "Expansion Reserve" KPI (reserved IT MW + the implied ≈MW facility-power headroom at the current PUE), so the declared future growth visibly reserves capacity the utility feed and footprint should be sized for. Display-only wire — deliberately does NOT alter the utilization/forecast math (kept the sensitive capacity model untouched). Last of the store-wide dead-control sweep.
Gates: walk 31/0 · trace 116/116. No engine change.
Found by a store-wide dead-control audit (agent), directions confirmed with the owner:
Removed
AI Chip Type (Primary) select (Requirements → Workload) — a dead control redundant with the Arch Profile Picker right above it, which is the real AI-hardware selector (applies density / cooling / tier / archKey). The chip dropdown set a store field that drove nothing. Removed the select, the aiChipType/AiChip store field + type, and its Summary row.
contractorAvail — a CapexInput interface field with no UI control and no reader; removed.
Fixed
Long-Shift Permit is now a real control with a cost effect. The PP 35/2021 warning (12h shift in Indonesia) was shown but the includeLongShiftPermit flag was orphaned — no toggle, no effect. Added a permit checkbox under the warning; without the permit a 12h ID shift now carries a screening +10% labor OT penalty (≈14h OT/week per PP 35/2021), with it the penalty is removed. The flag flows into the staffing cost memo (and its deps), so the toggle visibly moves monthly labor cost.
rackForm (42U/48U/OCP) left as-is — it's a documented design spec shown in the Summary/dossier, not a misleading cost control.
DCMOC — 3 more dead controls wired: transformer lead/type + delivery method
Fixed
Three more dead controls (same class as v1.115.64, found by continuing the sweep): the Requirements → Infrastructure Transformer Lead, Transformer Type, and Delivery Method selects were declared in CapexInput and written to the CAPEX store, but calculateCapex never read them — picking Expedited transformer, Oil-filled, or EPC/Turnkey moved CAPEX by $0. Now wired to real screening multipliers (DATA.capexDetail.fomTxLeadMult/fomTxTypeMult/fomDeliveryMult + capex-data.ts twin), default option = 1.0 (baseline unchanged). Deliberately NOT reused the engine advanced-model's transformerLeadMult/deliveryMethodMult — their enum domains differ (standard/extended/emergency vs the UI's standard/expedited/long_lead; dbb/db vs design_build/design_bid_build), which would have silently fallen back. contractorAvail left alone — it's an unused interface field with no UI control (nothing to wire).
tools/audit-dcmoc-enum-coverage.mjs extended to the 3 → 22/22 clean.
DCMOC — 8 dead CAPEX controls now actually affect cost
Fixed
Eight CapexDashboard FOM selects were dead controls — declared in CapexInput but never read by calculateCapex, so the user could pick Power Distribution, PDU type, Cabling, Floor, Security level, Fiber entry, Site condition, and Market condition and CAPEX would not move at all (a "control that does nothing"). Each is now wired to a real screening multiplier (DATA.capexDetail.fom*Mult + capex-data.ts twin), combined into the cost stack. Every one defaults to 1.0 at its UI default option so baseline projects are unchanged — only non-default picks move CAPEX (verified: default $60M → retrofit + military security + overheated market + intelligent PDU ≈ 1.40× → $80M).
The new fom*Mult maps are deliberately DCMOC-specific names: the audit gate (below) caught that the engine's own advanced capex model already had a marketConditionMult/siteConditionMult with DIFFERENT enum domains (buyer/balanced/seller), which a naive add would have silently collided with — so the DCMOC maps are namespaced to avoid it.
Changed
tools/audit-dcmoc-enum-coverage.mjs extended to cover the 8 newly-wired selects — 19/19 mappings clean; it's what surfaced the naming collision during development.
DCMOC — permanent gate against the silent enum→DATA-key fallback bug class
Added
tools/audit-dcmoc-enum-coverage.mjs (STRICT ship gate). The same bug class bit us twice (v1.115.61 market northern_virginia, v1.115.62 four CAPEX selects) — a UI <select> value used as a key into an engine DATA map that has no such key, silently falling back to a neutral 1.0 multiplier / $1M cost and mis-costing a real design choice with no warning. Rather than keep finding these by hand, this gate mechanically verifies every cost/value UI option resolves to a real key: it loads the engine DATA (vm sandbox), extracts each select's option domain from CapexDashboard.tsx (+ curated array-selects for redundancy/seismic), and asserts membership against DATA.capexDetail.* / DATA.markets (cityMarket alias-aware via resolveMarketKey). 11/11 mappings clean (rack/cooling/building/fire/alarm/ups/gen/substation/redundancy/seismic/market); exit 1 on any gap. Self-tested: removing a key makes it fail with the exact field "value" → map has no key. Wired into the DCMOC ship-gate list (CLAUDE.md) so a new option or renamed key can never silently regress this class again.
v1.115.62PATCH
DCMOC — CAPEX select options that silently fell back to default cost, now resolve to real values
Fixed
Four CAPEX selects had UI option values with no matching engine DATA key → silent fallback (same bug class as the Northern Virginia market fix; found by an audit sweep). Every one under-/over-costed a real design choice with no warning:
Rack densityultra (75 kW/rack) had no rackMult key → used 1.0× instead of 1.9× (electrical/building CAPEX understated ~47% on the highest-density option).
Fire suppressioninert (IG-541) and sprinkler (wet-pipe) had no keys → both 1.0× instead of inergen 1.2× / water 0.6×.
Fire alarmbeam (beam/aspirating detection) had no key → 1.0× (added a real 1.2× premium).
Substationpad_mounted_11kv and dedicated_66kv had no keys → both fell to the $1M shared cost instead of ~$2M / ~$5.5M (front-of-meter CAPEX understated 50–80%).
Fix: completed DATA.capexDetail (rackMult/rackKw/fireSuppressionMult/fireAlarmMult/substationCosts) in the engine + the capex-data.ts fallback twin with every UI option value as a real, sourced key. Additive — no rename, no persisted-value migration.
Changed
Two stale-memo wiring fixes (audit): Construction Engine's WBS/Gantt tree now re-derives when IT load changes (was missing itLoad from its useMemo deps — read via getState()); Executive capacity sparkline now subscribes to occupancyRamp instead of reading getState() outside the memo, so it updates when the ramp changes in isolation.
DCMOC — fix Northern Virginia market → real $215 colo rate, not the fallback band
Fixed
City-market → colo-rate resolution was broken for Northern Virginia. The <select> emits northern_virginia, but the alias map only had virginia → n-virginia, so northern_virginia resolved to the non-existent key northern-virginia and the flagship market silently fell back to the JLL band ($185) instead of its real $215/kW·mo rate — directly undercutting the "se akurat" AUTO revenue. Extracted the duplicated (and broken) alias into one resolveMarketKey() (lib/market-key.ts), fixed the alias, and adopted it in all three surfaces that map city → DATA.markets (Financial AUTO, FinancialPage pro-forma, Strategic Planning). Verified: selecting Northern Virginia now sets revenue AUTO = $215 and writes it through app-wide. Probe _dcmoc_financial_auto_probe strengthened with the market-resolution assertion (regression guard).
v1.115.60PATCH
DCMOC Financial — AUTO-by-default with per-field manual override
Changed
Financial Pro-Forma is now AUTO-first. Owner: "masih banyak data manual — saya mau auto, tapi bisa manual override klw di tick, se akurat dan optimum." All 15 parameters (revenue, discount/WACC, project life, escalations, tax, depreciation, NRC/MRC, contract, take-or-pay) default to an accurate value derived from REAL data — market colo rate (DATA.markets[market].coloPrice, e.g. N.Virginia $215) else the JLL/CBRE 2026 band × tier; Damodaran regional WACC (DATA.discountDefaults); country economy (tax / inflation / wage growth); design CAPEX/kW for NRC; Contract Duration (Requirements). Each field shows a green AUTO chip whose tooltip names the exact source.
Per-field override. A tick on any field flips just that one to OVERRIDE (editable, amber chip); the rest stay AUTO. Un-tick returns it to live AUTO. Replaces the old single all-or-nothing userEdited boolean that froze the entire block on any edit, and removes the un-sourced 120 + electricityRate×500 / 0.06 + riskPremium magic formulas (last holdout of the number-provenance audit).
Revenue write-through preserved. The effective revenue (auto market colo OR manual override) writes through to the sim-store SSOT, so Executive / Monte Carlo / Report / Phased Finance all compute on the same basis. Store clamps 50–500/kW·mo. Opening Financial applies the market-accurate basis app-wide (honest consequence: the default with no market selected is the JLL mid-band $185, more defensible than the prior conservative $150 seed).
DCMOC — honest payback propagated to comparison/phased surfaces + PDFs
Fixed
Payback honesty reached the remaining surfaces: ReportDashboard's negative-NPV narrative used a paybackLive <= projectLifeYears heuristic that printed "payback 15.0 yr" for a never-reached payback (clamp == life) → now reads the paybackReached flag. Scenario Comparison (KpiCell + matrix row) and Phased Financial (headline + per-phase table + scenario table) now show "> N yr" for unreached payback and suppress the distorting delta; the Phased Financial PDF (weighted, per-phase, scenario rows) matches. Extends the v1.115.57 fix so no surface — screen or export — prints a fabricated payback year.
v1.115.58PATCH
DCMOC — honest break-even occupancy: "not reachable" instead of a clamped "100%"
Fixed
Break-even occupancy no longer lies at the clamp: calculateFinancials clamped min(1, opex/revenue) — when OPEX exceeds revenue even at FULL occupancy the card printed "100%" as if break-even existed there. FinancialResult gains breakEvenReachable; the Financial card now prints fault-red "not reachable — OPEX > revenue @100%", and the Financial PDF's occupancy table no longer places its "← Break-Even" marker on the fabricated 100% row. (FinancialPage's overview stress card already handled this honestly with its own bisection — the engine + card + PDF now match.) Completes the honest-metrics family: revenue SSOT → EBITDA/IRR diagnosis → IRR n/a → payback not-reached → break-even not-reachable.
v1.115.57PATCH
DCMOC — honest payback: "> 15 yr (not reached
" instead of a fabricated "15.0 yr")
Fixed
Payback no longer fabricates a year: calculateFinancials fell back to paybackPeriodYears = projectLifeYears when cumulative cash never turns positive — every surface then printed "15.0 yr" as if capital were recovered in year 15. FinancialResult gains paybackReached / discountedPaybackReached flags + one shared fmtPayback() formatter ("> 15 yr (not reached)"); adopted on the Executive IRR-card sub, Financial engine payback card (simple + discounted), Portfolio comparison row, and the Cash-Flow chart no longer draws a payback marker on a curve that never crosses zero. Same honesty class as the IRR "n/a" fix (v1.115.56).
v1.115.56PATCH
DCMOC — honest IRR "n/a" + last stale-basis strings unified
Fixed
IRR no longer fabricates "0.0%": when the DCF never turns cash-positive (NPV < 0 and the solver pins ≤ 0) there is NO positive root — the Executive card now shows n/a ("no positive root (cash-negative)"), the diagnosis modal explains it, and the ƒx trace node returns null to match (trace-parity baseline 117→116 while the default project is cash-negative — the node honestly has no number to compare).
Stale revenue-basis strings unified: lib/screening.ts REVENUE_PER_KW_MONTH was a duplicate 150 literal — now re-exports DEFAULT_REVENUE_PER_KW_MONTH so the two names can never drift; Financial overview stress-test fallback used $280 while its own Pro Forma ran $150 (same page, two bases) — now falls back to the live store basis with an honest label; fin.ebitdaY5 trace template and the site.ctx binding formula no longer cite the dead $280.
v1.115.55PATCH
DCMOC — below-hurdle IRR diagnosis on the Executive KPI, Auto-optimize wired to the real solver
Added
Executive IRR card diagnoses itself below the 12% hurdle: fault-red + "BELOW 12% HURDLE — click for diagnosis"; the DiagnosticModal explains the equity case vs a DC fund's cost of capital and offers levers (raise the write-through revenue basis, re-phase the build via Phased Finance, cut OPEX drivers) — and its Auto-optimize button invokes the page's real 3-objective solver (bisects revenue to the hurdle, preview-then-Apply). Verified headless end-to-end: red card → modal → Auto-optimize → "3 objectives evaluated" results panel, 0 errors. Completes the mandate pair with the negative-EBITDA card (v1.115.53).
v1.115.54PATCH
DCMOC — revenue basis edit WRITES THROUGH: Financial field → sim-store SSOT → every DCF surface
Fixed
Financial revenue field was local-only: the "Revenue per kW/month" input (Financial → Pro Forma) edited only this page's state — Executive/Monte-Carlo/Report/Phased-Finance kept the old basis, so the EBITDA-diagnosis lever "raise the basis in Financial" silently did nothing app-wide. The edit now writes through to the sim-store tunable (the same one the optimizer moves), with reverse sync so an optimizer Apply refreshes the field while the page is open. Store clamps the tunable to $50-500/kW·mo (a typo can no longer poison every DCF).
Verified headless end-to-end: set $200 in Financial → store reads 200 → Executive negative-EBITDA chip clears. Probes: walk 31/0 · trace-parity 117/117 · optimizer 8/8 · fuelgen-scale 5/5.
v1.115.53PATCH
DCMOC — negative-EBITDA diagnosis on the Executive KPI
Added
Executive EBITDA card now diagnoses itself when negative: at the honest $150/kW·mo screening basis a small project can run operating-cash-negative (the old $280 default masked it) — the card turns fault-red ("NEGATIVE — click for diagnosis") and opens the shared DiagnosticModal: why (year-5 revenue vs OPEX, live figures), levers with jump-to-tab (raise the revenue basis in Financial — JLL 2026 $140-230 band; Run Optimization to bisect revenue to the 12% hurdle; cut OPEX drivers in Operations), and the honest note that this is real screening economics, not a bug. Closes the "every red value clickable" mandate for the Executive KPI row. Verified headless: card renders red, modal opens with levers (screenshot).
v1.115.52PATCH
SecondBrain — OmniRoute portal pill
Added
OmniRoute pill in the SecondBrain nav, third portal beside Vector Index and Sessions (rose→violet CTA): one click opens the locally-installed OmniRoute dashboard (http://localhost:20128/) — the MIT free AI gateway (250 providers, 90+ free tiers, one OpenAI-compatible endpoint at /v1). OmniRoute v3.8.48 installed globally via npm and persisted as a systemd --user service (omniroute.service, auto-restart, boots with login). Local-app pattern identical to the Sessions pill.
tools/_dcmoc_fuelgen_scale_probe.mjs — headless verification of the Y-slice's behavior change: seeds a 2.5 MW project (genset class N× 2.5 MW) then a 150 MW project and asserts the unit class switches to N× 3.0 MW (DATA.fuelGen scale rule, AssetGenerator-consistent); asserts Phased Finance break-even revenue derives from the live $150/kW·mo basis (a $280 regression would print ~$27x); screenshots FuelGen/Executive/Financial/Phased Finance for visual review. 5/5 green.
Verified
Screenshot review of the finance surfaces on the unified $150 basis: Phased Finance blended IRR 13.7% ≥ 12% hurdle, NPV +$2.2M, MoIC 1.15×, payback 7.6 yr — coherent. Known honest consequence: the default 2.5 MW Indonesia project's Executive year-5 EBITDA reads slightly negative at conservative wholesale $150 (raise revenue in Financial or run the optimizer to clear it) — this is the real economics, not a bug; the previous $280 default was masking it.
v1.115.50PATCH
post-audit certification sweep — full site gate suite green, 1 mobile fix
Fixed
setup-supabase.html mobile overflow (+20px @390px): injected step-list <li>/<span> tokens (URLs, keys) pushed past the viewport — mobile guard added (overflow-x: hidden + overflow-wrap: anywhere on li/span/code). Responsive-layout render gate back to CLEAN 116/116.
Verified (certification, no changes needed)
Full remaining gate suite after the X/Y/Z audit ships: dark-coverage CLEAN (117 pages × both themes) · responsive-layout CLEAN · mobile-responsive strict pass · interactions CLEAN (palette/diagrams/scrolly real-input) · a11y CLEAN (0 critical/serious × 2 themes) · page-gates CLEAN · hero-images CLEAN · article-charts provenance CLEAN (29) · explain-db ALL GREEN · dc-corpus ALL GREEN.
v1.115.49PATCH
LTC — trace coverage completed: 48 traceable values across every surface
Added
Trace everywhere: the DETAILED tab's full output grid (20 values — liquid/air heat, flow, pump, CDU, PUE, COP, WUE, energy, OPEX gross/credit/net, carbon ±, densities, control index, future factor, risk, confidence) and all 6 MODEL VALIDATION values are now click-to-trace targets, joining the KPI strip, RESULTS cards and P&ID equipment — 48 traceable values total. New dependency entries (futureFactor, confidence, rack/design density) mirror the compute chain. DETAILED-grid ƒx badges render via CSS ::after so the engine's per-render setText() cannot wipe them (verified surviving recompute).
v1.115.48PATCH
LTC — trace indicators now VISIBLE + RESULTS values traceable
Fixed
The v1.115.47 trace indicators never rendered (owner: "belum ada tracenya"): the ltc-traceable class was applied to the KPI value element while the CSS targeted the card — so no ƒx badge or dotted underline appeared anywhere. The whole KPI card is now the trace target (badge + underline render, keyboard-focusable), 12 RESULTS-card values gained inline ƒx chips (Supply/Return temp, ΔT, Flow, Capture, CDU count, Pump Power, System COP, PUE, WUE, Total Facility, Annual Energy), and the SYSTEM OVERVIEW label carries the hint "klik equipment / angka ƒx untuk trace perhitungan". Verified: 6 ƒx cards + 12 traceable rows render, card click opens the trace, 0 console errors.
v1.115.47PATCH
LTC — click-to-trace engine (DCMOC pattern
, information-rich P&ID, clean steppers)
Added
RZ Trace — the DCMOC trace-engine indicator, adopted into the LTC lab. Headline values (KPI strip, P&ID equipment) carry a dotted-amber underline + ƒx chip; click opens a trace popover: big live value + label + provenance chip (ENGINE · models.ltc.compute / INPUT), description + formula from the page's own 95-key parameter metadata, and clickable dependency pills (each dep's live value — click to drill deeper, with a breadcrumb back). Footer: "Open in DETAILED tab" (jumps to the live equation inspector) + "Copy trace" audit text. Content 100% sourced from the existing PARAM_TOOLTIPS metadata + live model — only the ~22-KPI dependency map is new, and it mirrors the compute chain.
Information-rich SYSTEM OVERVIEW (owner: values were being overlooked): every equipment now shows its live headline value inside the diagram — Dry cooler "2,244 kW rejected", Pump "124.1 kW · 28 m head · η 78%", CDU "10 CDU · ΔT 8.1 K", IT racks "12.00 MW IT · 97.1% captured" — plus the loop labels. Equipment groups are clickable (hover highlight) → their trace.
Clean − / + steppers replacing the ugly native number-input spinners (hidden page-wide): on all 6 primary-slider value boxes and every number input in OTHER PARAMETERS (84 steppers), stepping by each input's real step/min/max and firing the live recompute; 32px touch targets on mobile.
Changed
Modelling block diagrams — essentials first, nothing removed: dense sub-value lines are de-emphasized (dimmed) and light up on hover; every block keeps its existing click-to-detail popup (the detail layer is one click away, per "yang utama aja, detailnya klw di klik — jangan dihilangkan").
v1.115.46PATCH
DCMOC Z-SLICE — hardcode audit FINISHED: 227 → 0 WARN, every number carries a documented basis
Fixed
Hardcode gate v2 (string/comment-blind): the v1 scanner flagged ~140 false positives — numbers inside STRING literals (regulation cites like "PP 35/2021" parse as division) and comments. Scanner now blanks string/comment spans before token matching, adds calendar/physical conversions to the ignore set (365 d/yr, 4.33 wk/mo, 4046.86 m²/acre, 255 RGB, 2^32 LCG divisor, 168 h/wk) and recognizes more provenance keywords (EPA/CBRE/BNEF/IEA/Uptime/JLL/USGS/ASCE/DEFRA/World Bank/audit-ok).
All 45 real findings triaged to zero: RevenueEngine guard fallbacks ($185 MRC / $280 NRC) now single-source from the JLL/CBRE-cited defaultRevenueInputs (were duplicate literals that could drift); every remaining screening constant honestly annotated at the point of use — vendor-labor ×1.30 premium (Simulation ↔ Sensitivity parity pair), labor 4% / maintenance-CPI 3% escalators (Report/TaxIncentive/MaintenanceStrategy), diesel CO₂ 2.68 kg/L (EPA/DEFRA) + HVO +3% volumetric / −90% lifecycle, Uptime tier availability band 99.700–99.995% (dimension-explain ↔ value-trace parity pair), rack density classes 6/12.5/25/75 kW, NFPA 2001 clean-agent options, forecast-vs-budget skews, Numerical-Recipes LCG constants, PDF/SVG layout offsets (audit-ok).
Gate result: 227 WARN → 0 WARN across 227 scanned files — "jangan ada angka yang muncul tiba-tiba" now holds mechanically, and the gate stays in the ship suite to keep it that way.
v1.115.45PATCH
LTC — clickable engine-verified fix suggestions on out-of-band metrics
Added
Every out-of-band MODEL VALIDATION metric now tells you how to fix it. Under an amber row, up to two suggestion chips appear (e.g. PUE → "Economizer ↑", Flow intensity → "Supply Temp ↓"), computed by perturbing each impact parameter ±1 step through the REAL models.ltc.compute and ranking which moves pull the metric back toward its band — no heuristics, no hardcode. Chips are clickable: one click applies that ±1 step to the actual input (sliders sync, auto-run recomputes, the band marker moves live). Verified: six clicks walked PUE 1.28 → 1.26 toward the design band; 0 console errors; parity 15,750/0; calibration gate 38/0.
v1.115.44PATCH
DCMOC Y-SLICE — X-audit deferred violations: fuel/gen sizing to DATA, grid economics sourced, one depreciation convention, portfolio on live revenue
Fixed
Fuel & Generator sizing single-sourced + scale bug: DATA.fuelGen gains genset unit classes (2.5 MW ≤100 MW-IT / 3 MW above — CAT 3512E-3516E / MTU 20V4000 class), tank module 20 kL (UL-142 class), PM economics ($18k/unit + $5/kW, CBRE FM 2025) and per-genset environmental-compliance admin; FuelGenEngine reads them with parity fallbacks. Also fixes a real inconsistency: the engine displayed flat 2,500 kW units at every scale while AssetGenerator switches to 3,000 kW above 100 MW — spec and quantity now agree.
Grid Reliability economics sourced: diesel $1.25/L (IEA 2025 C&I band), UPS $27/kW·yr (blended VRLA/Li-ion, Uptime 2025), dual-feed $50/kW·yr, BESS $300/kWh (BNEF 2026 C&I) hoisted to one sourced constant block; fuel burn rate now reads DATA.fuelGen.genEfficiencyLPerKwh — the same EPA Tier 4 source FuelGenEngine uses.
ONE depreciation convention: new DEFAULT_DEPRECIATION_YEARS = 15 — Benchmark/Monte-Carlo/Scenario/Portfolio used 7 and Report used 20 while Financial/Investment/trace used 15, so the same project tax-shielded differently per page.
Portfolio on the live revenue basis: calculatePortfolio no longer hardcodes $120/kW·mo — the dashboard passes the sim-store revenue tunable, making portfolio IRRs comparable with every other surface.
Hazard-pay screening constants: AQI-driven O&M labor premium (0.15%/point above AQI 100, +10% hazardous step) hoisted with the EPA-band rationale; dead first-assignment code removed.
v1.115.43PATCH
LTC — MODEL VALIDATION: the model now shows its receipts vs ASHRAE/OCP/Uptime bands
Added
models.ltc.validation(model) in the shared engine + DATA.ltcCalibration.validationBands — six benchmark bands, each MIRRORING its DATA anchor (PUE = pueMatrix.liquid tier4–tier2 [Uptime 2026, corpus hyperscale p10/p50 as fleet ref]; WUE = water.wueByType immersion…rear-door envelope; loop ΔT, supply temperature and flow intensity = DATA.cdu.bands [ASHRAE TC9.9 W-classes + OCP cold-plate]; pump fraction ≤3% IT [OCP hydraulic guidance]) with a DATA.sources provenance entry.
MODEL VALIDATION card in the LTC right rail: live band bars with a value marker per metric, green in-band / amber out, an "N/6 in band" pill, and the source citation on hover. Honest by design — the default config correctly reports PUE 1.28 above the 1.10–1.22 design band and flow intensity 2.0 above the OCP 1.0–1.5 LPM/kW band (redundancy + hydraulic margin inflate design flow), pointing the user at exactly what to tune. Updates on every recompute.
Permanent gate tools/test-ltc-calibration.mjs (38 checks): bands finite + sourced + mirrored to their DATA anchors (a divergent copy fails), validation structure, and the default-config findings LOCKED — a future shift in what the model reports is a visible gate failure, never a silent change (MODEL_CALIBRATION_STANDARD).
DCMOC X-AUDIT — total wiring audit: 35 fixes, fabricated-PDF financials killed, ONE revenue basis everywhere
Fixed
Report/PDF fabricated financials (worst find): ReportDashboard's PDF export hardcoded NPV $15M / IRR 18.5% / payback 3.2 yr while the screen showed the real engine numbers — the exported document now uses the SAME live financialResult as the page (audit X, 3 opus agents over all 33 modules).
ONE revenue basis app-wide: DEFAULT_REVENUE_PER_KW_MONTH aligned to the sim-store optimizer tunable ($150 — the constant said $280 while PhasedFin read the store's 150, so the same project showed two different IRRs). Every surface (Executive, Financial, Investment, Report, Benchmark, Monte-Carlo, Scenario Comparison, dashboard DCF, ƒx trace) now reads the LIVE store value with the constant as fallback — an optimizer Apply that raises revenue now moves every IRR on every page, not just Phased Finance.
Executive design margin wired: hardcoded ×1.2 provisioning margin now reads designMarginPct (the Requirements slider actually moves the Executive capacity KPI).
Carbon tooltip prices matched to engine ($25 vs $35, $50 vs $68 contradictions), Benchmark depreciation aligned, ~30 more magic literals moved to constants/DATA or labeled screening across CarbonEngine, CBMEngine, BenchmarkEngine, AssetLifecycleEngine, CapacityPlanningEngine, Reliability, DesignTools.
WorkOrderView Rules-of-Hooks bug: overloadAlerts useMemo sat AFTER the null-country early return (hook count could change between renders) — moved above the guard, null-safe.
Added
tools/audit-dcmoc-hardcodes.mjs — permanent WARN-level heuristic gate scanning module render paths for unexplained numeric literals (225 advisory findings baseline; violations get fixed or annotated, the gate keeps new ones visible).
Comparison charts wired to the site (Q): Talent/Grid/Disaster/Tax country charts always include the Requirements country (Oman-class bug — top-15 slice dropped it); selected bar highlighted.
Capacity margin coherence (R): utilization ≡ 1/(1+margin) structural floor exposed — margin-aware bands (OK starts above the floor; "margin 30% = Watch forever" absurdity gone), built-capacity denominator from the committed phase plan, white space AUTO-derived (racks × 0.72 m² ÷ 35% gross-up) instead of guesswork, space lever no longer jumps to Staff Model Config.
Added
ScoreValue 100% (M): shared gradient primitive (green→amber→red, direction-aware: risk/utilization lower-better) + ƒx trace + explain tooltip — adopted across Site-Intelligence (5 children + comparison matrix), Results, Sustainability pillars (4 new trace ids), Reliability, Financial, Construction (SPI/CPI 1.2-scale), Commissioning, Assets, Risk, Capacity. 20 new per-score explain keys (838-entry DB).
Run Optimization is now a real solver (U): 3 objectives (blended IRR ≥ hurdle via a page-parity closure + 40-iteration bisection with residual line; capacity margin-aware band check; budget vs CAPEX P80 AACE band) → per-objective status + preview-then-Apply through the tunables allowlist guard. Project Status derived from lifecycle (was hardcoded "Design").
FAQ → glossary with analogies (W): 41 analogies (Lightbulb callouts) + 39 new entries (incl. Delivery & PM category: RFI/Submittal/ITP/NCR/punch/turnover/DoA/decision velocity) + auto Engine Glossary rendering all 838 explain-DB entries with combined search; 25 core DB entries now carry analogies site-wide.
LTC — micro-polish: live run stamp, preset dots, hover/edit feedback
Changed
Live run stamp: "Last run HH:MM:SS ✓ Completed" now updates on every recompute (auto-run included), not only on the manual button.
Preset dots on the three architecture-filled primary sliders (Liquid Capture, Supply/Return Temperature) — green dot with "Auto-set by the architecture preset — adjust freely" tooltip, mirroring the AUTO taxonomy.
Feedback: KPI cards get a subtle hover lift; the slider value box pulses on drag (both prefers-reduced-motion aware).
Every input is now classified, ending the "which is which" confusion: OTHER PARAMETERS regroups into three numbered sections — 1 · Design inputs (20 — your decisions), 2 · Auto-filled (11 — filled from the country & architecture presets with sourced engine data; chip shows AUTO · country/AUTO · architecture, flips to OVERRIDDEN the moment you edit, with a per-field ↺ that restores the preset value and recomputes), 3 · Optimization & calibration (6 — targets and tuning knobs). A 3-step guide strip (1 Set design → 2 Review auto-filled → 3 Tune & optimize) sits under the INPUTS header; single-column readable layout in the rail. All element ids/bindings untouched; the page's advanced-mode toggle still works (tier grids keep the input-grid class).
Firm-precision pass: thousand separators on all ≥4-digit values in the result cards, quick-KPI snapshot and model diagrams ("23,312 LPM"), dT→ΔT, tabular-nums on numeric columns so figures align. Display only — engine math untouched (parity 15,750/0).
The dense legacy blocks no longer render as an all-expanded wall. Every relocated analytical block (24 across the four tabs) is now a titled collapsible card — collapsed by default, the most useful one per tab open (FLOW leads with the visual Energy + Loss Breakdown instead of the raw variable dump). Each tab opens with a one-line guide of what lives inside; tab buttons gain icons. Accordion heads are keyboard-accessible (aria-expanded, focus-visible) and the titles carry the existing hover-explanations. All element ids/bindings untouched; charts and controls fully functional when expanded (verified: Pareto expands + renders, scenario replay, 0 console errors).
Requirements · Average Rack Density dropdown vanished on scroll (owner, Android): options committed on pointerdown, so on touch a scroll gesture's first contact instantly selected an option and closed the list. Selection moved to click (the standard pattern — a real swipe never synthesizes a click), plus touch-pan-y overscroll-contain on the list, max-h-56 → max-h-72 (the old height also hid the last rows — why it looked like options stopped at 75 kW), and a label-forwarding guard on the combobox root (Fields wrap controls in a <label>; clicks on non-labelable descendants were re-dispatched to the button). Fix lives in the shared CreatableCombobox — every dropdown in the app benefits.
Added
AI-era density presets (engine-true nominals from DATA.requirements.archProfiles): 120 kW GB200 NVL72 / OCP ORV3 · 140 kW GB300 NVL72 · 200 kW Rubin VR200 class (analyst est.) — average density takes the NOMINAL rack kW; peak (EDPp, e.g. GB300 192 kW) is the CAPEX power-provisioning side. Target Rack Density max raised 250 → 300.
Red-value diagnostic adoption widened (owner: "tidak hanya ini tapi semua"): Construction EVM SPI/CPI < 1 (live EV/PV/AC, behind-plan phases, forecast slip + quantified levers), Financial health grade D/E + CPI/SPI passthrough (composite formula with live terms), Reliability composed availability below tier target (reuses the page's own availExplain — modal can never disagree with the panel), Sustainability overall grade C/D + every pillar score < 50 (thresholds SOLVED from the pillar formulas: score ≥ 50 ⇔ PUE ≤ 1.35 / grid share ≤ ⌊45/gi⌋% / WUE ≤ 1.1). Investment & Maintenance SLA skipped honestly — rich inline diagnostics already exist there (no double-diagnosis).
Changed
Commissioning WBS card now full-width (a 7-level WBS with sub-activities was cramped in a half column).
Dead code removed: openWorstPhase (superseded by the diagnostic modal) + unused leverNav.
v1.115.35PATCH
LTC — country presets now pull the crawled, sourced tariffs from the shared engine
Changed
Country profile selection re-baselined to the sourced engine data (deliberate + disclosed): picking a country in the LTC lab now fills electricity price, grid-carbon intensity and water tariff from the shared DATA.electricityTariffs / DATA.waterTariffs (EIA/Eurostat/PLN/EMA/Ember/PUB…, each with DATA.sources provenance) instead of the page's older inline numbers — e.g. Indonesia: 0.08→0.082 $/kWh (PLN B3 2024), carbon 0.73→0.726 kgCO2e/kWh (Ember). Inline profile values remain the offline fallback; computeModel formulas untouched (parity 15,750/0).
Reliability: Redundancy What-If via engine reliability.kOutOfN — UPS + genset at N/N+1/2N with per-step cost and the technology-economics verdict incl. the explicit "negligible — the simpler N+1 option wins" branch + $/downtime-minute break-even; chain-derived SPOF list (single-path series elements + remediation); Monte-Carlo availability band (200 seeded-LCG re-runs, MTBF/MTTR ±20% → P10/P50/P90 vs tier target).
Sustainability: facility-level water table via engine water.facilityFootprint (climate-adjusted WUE, upstream-power water — with the honest note that on fossil grids the upstream share dominates), CUE row + ERF rendered honestly as 0 (no heat reuse modeled), 24/7 CFE note card (annual % vs not-modeled-hourly, no fake numbers).
Financial: WACC basis + scenario NPV table (base / rate+200bp / rev−15% / capex+10% via engine roi, NOT-ROBUST banner), break-even occupancy (bisection on the page's own cashflow), TCO $/kW·mo KPI benchmarked against the market colo price — replacing a mislabeled DATA.decision.revenuePerKwMonth fallback (key never existed; $280 always fired while labeled "engine") with the real DATA.markets colo price or an honestly-labeled screening default.
Strategy as a % mix (RTF/PPM/PdM editor summing 100%, discrete buttons = presets) + selectable SLA (2hr/4hr/NBD radio in the SLA tab) in store/simulation — and the Risk/Simulation "Expected Availability"/"Financial Exposure" cards now COMPUTE from these choices (design vs adjusted delta shown) instead of a hardcoded tier lookup.
Staffing page: "Campus Operations Model (engine)" accuracy card (nDc, tech basis strings, labor-hours strip, phenotype) + 18↔20 reconciliation — modeled base FTE vs employed FTE (+relief/shrinkage) explicitly reconciled; org chart re-captioned. Maintenance now precedes Staffing in the menu (regime determines headcount). 7 new engine-gate assertions (availability ordering, campus split, skeleton floor).
I — Construction "Delivery Governance" dossier beside BOQ: engine DATA.dossier.deliverables (9 playbooks: IFC/RFI/Submittal/ITP/NCR/look-ahead/variation/punch-list/turnover — purpose/trigger/owner/approver/cycle-time/hold-impact/standard) + DATA.dossier.pmFramework (control accounts, decision-velocity delegation bands, reporting rhythm, stakeholder-pressure responses, ISO 19650-5 security exposure, senior/intermediate PM charters) + models.dossier.deliveryGovernance (document volumes scaled by MW+months, variation bands $-scaled to CAPEX, program windows). New print-window dossier (13 sections, LIVE-WIRED vs STANDARD-PRACTICE chips, live tracked risks/issues).
J — Energy Audit & Management + Renewable & Storage Economics (2 new Sustainability tabs): engine models.energy.enpi (ISO 50001/IPMVP claim test — numerator/denominator/boundary/climate-normalization/window/exclusions PINNED and rendered verbatim; SUPPORTED/UNSUPPORTED verdicts), models.energy.storageEconomics (cycle+calendar degradation curve, augmentation plan, dispatch constraint, grid-services band, per-region regulator notes), models.energy.renewableProject (hybridScreen coverage → NPV @ regional WACC / IRR / payback → bankability gate with the honest "GRID-ONLY WINS HERE" verdict — technology-economics balance, not enthusiasm). Renewable tab gated on the CAPEX renewable selection; tariff ±30% / sizing ±50% scenario sensitivity. 5 new engine-gate assertions.
L — Capacity Planning tabs equalized: Cooling / Rack & Space / Network now carry the same component·capacity·utilization·status table + escalation levers as Power (cooling duty = IT heat not IT×PUE; density ceilings per cooling tech; binding-constraint row; network clearly labeled screening) — and the generic 5-card strip + Key Insights are tab-specific instead of duplicated.
Changed
Walk probe extended with program assertions (Cx WBS sub-activities, sane Cx duration, Construction WBS, Delivery-Governance button, capacity cooling table, campus ops card, strategy mix) — 31/0; full suite green (trace 117/117, optimizer 8/8, synergy 6/6, export 44/44, 0 console errors).
v1.115.32PATCH
DCMOC Architecture — BESS/PV in the diagram + Mechanical & Cooling view
Added
On-site renewables drawn (Workstream K1): when the CAPEX questionnaire selects Solar/Solar+BESS, the Architecture diagram now renders a Solar PV Array + BESS + PCS (sizing badges from renewSolarMwp/renewBessMwh) in an ON-SITE RENEWABLES group, tied to the MV bus — the owner-reported missing BESS. New vendored IEC-style symbols: solarArray, inverter, pump, heatExchanger (assets/engineering → 24 symbols).
Mechanical & Cooling view (Workstream K2): third Architecture diagram view — a dedicated cooling schematic via computeCoolingLayout, fully dynamic on the set parameters: air → cooling towers · chillers · CHW pumps · CRAH/in-row; liquid/RDHx → dry coolers · plate-HX (FWS/TCS) · primary/secondary pumps · CDU loops; deep-sea → intake (depth) · titanium plate-HX (loop ΔT) · seawater pumps (pipeline km), chiller-less. Unit counts from equipScale, duty = IT heat (not IT×PUE), supply/return loop edges, per-node hover detail.
v1.115.31PATCH
DCMOC — Commissioning WBS: L0–L6 × 3–5 sub-activities on the recursive Gantt
Added
Commissioning WBS (Workstream E2): new DATA.commissioning.cx.rich.subActivities (25 sub-activities across L0–L6, ASHRAE Gl.0/BCxA practice — FAT witness, pre-functional checklists, startups, point-to-point, power-path/cooling-chain integration, load-bank stages, IST scenario matrix, burn-in, punch/turnover) + models.commissioning.programWbs — levels get CALENDAR windows from the log-damped program schedule with crew-days effort attached; sub-activities distribute serial-with-overlap; drivers substituted live (witnessed-unit counts, IST scenario count per redundancy class, BMS point-count note). L5 flagged critical (endurance burn-ins are a hard calendar floor).
The Commissioning page timeline is now the shared recursive Gantt (expand a level → its sub-activities, per-bar diagnosis tooltip), replacing the flat 7-bar strip; legacy strip kept as engine-absent fallback.
Auto/Manual Optimizer (Workstream D): lib/optimizer/tunables.ts — the reviewable ALLOWLIST of fine-tune parameters Auto may move (revenue $/kW·mo band 100–300, CAPEX contingency 5–15%, design margin 5–30%, maintenance in-house share), with LOCKED_FIELDS (IT MW, tier, cooling, redundancy, country, workload, phases) asserted before every Apply. lib/optimizer/optimize.ts — deterministic bisection over the page's OWN verdict model (capex-weighted phase IRR), honest infeasibility (band edge can't clear → "nothing applied" verdict). Phased-Finance red IRR/NPV/PI modals now carry Auto-optimize → proposal preview (from→to, IRR/NPV deltas, guard note) → explicit Apply writes only revenuePerKwMonth (new persisted sim tunable; all revenue math now derives from it).
Capacity Planning At-Risk/Watch chips → shared DiagnosticModal: the inline expansion is replaced by the Workstream-C modal (reason + bisection-solved levers + jump-to-tab), consistent with Phased-Finance.
Permanent gate tools/_dcmoc_optimizer_probe.mjs (8 assertions): red IRR → modal → Auto-optimize → feasible proposal → Apply clears the NO-GO → requirement base data byte-identical. 8/8 green.
v1.115.29PATCH
article-28 — hero image + fixed card thumbnail
Added
article-28 cover image (assets/article-28-hero.webp, 1200×509): generated dark-editorial hero — a datacenter rack wall compressing through golden data streams into a single glowing laptop (the article's Compression Horizon motif, matching its gold/amber palette). Inserted at the top of the article body per the article-27 pattern.
Fixed the broken-looking article card: the articles-grid thumbnail now uses the hero image instead of the dark OG card (which rendered as an empty block with overlapping title); dimensions corrected (1200×509).
Commissioning "Program Duration 7832 d" (owner: "angkanya ngacau"): models.commissioning.programRich summed per-level LABOR-days serially and the page displayed it as calendar wall-time (100 MW → 7832 d ≈ 356 mo). The engine now also returns calendarDays/calendarMonths (the log-damped, capped programSchedule wall-time — crews work levels in parallel; never above the single-crew serial total) plus laborDays + crewEquivalent. Page headline shows CALENDAR (100 MW ≈ 20 mo, ~17.8 crews); labor effort is labeled secondary. Golden cx-calculator parity untouched (durationDays semantics preserved); 4 new engine-gate assertions.
Added
Universal detailed tooltips (owner: "tooltip untuk semuanya… harus detail"): 74 new bindings across 12 modules (Financial, Maintenance, Staffing, Capacity, Construction, Commissioning, Reliability, Sustainability, CAPEX, Risk, Asset Intelligence) — every KPI strip now carries a 2-4 sentence tooltip (definition + engine basis + drivers + decision caveat). Explain DB enriched with 10 detailed finance/energy keys (irr, pi, blended-irr, payback, hurdle-rate, discount-rate, idc, landed-cost, lcoe, bankability) → 818 entries, gate 10/10.
4-level Construction WBS (owner: "jangan hanya 2 level… in such detail"): new DATA.construction.wbs (72 L3 tasks + L4 work-packages across all 22 sub-phases, engineering-real bases) + models.construction.detailedSchedule — expands the CAPEX timeline into phase → sub-phase → task → work-package, durations distributed serial-with-fast-track-overlap, procurement-bound tasks carry longLeadWeeks basis + CRITICAL-path flag (e.g. transformer 60–120 wk ⇒ PO before NTP) + screening unit counts. GanttChart rebuilt as a recursive N-level renderer (collapse/expand per node, per-bar diagnosis tooltip: basis · depends-on · critical/risk); legacy 2-level API preserved for CapexDashboard.
Red-value diagnostic modal (Workstream C start): shared RedValue + DiagnosticModal (components/ui/RedValue.tsx) — any breached value renders red + clickable → modal with WHY (computed reason), threshold vs actual + gap, quantified levers with jump-to-tab, and an Auto-optimize slot (Workstream D). Adopted on Phased-Financial Blended IRR / Total NPV / PI.
Changed
Operations menu order: Maintenance now precedes Staffing (the maintenance regime determines headcount).
Version-stamp audit: corpus crawl artifacts (tools/dc-corpus/raw/*.html) excluded — not site pages.
v1.115.27PATCH
LTC SYSTEM OVERVIEW — clean SVG P&ID from the RZ Engineering Symbol Atlas
Changed
The P&ID is now a crisp, theme-aware inline SVG built from the RZ Engineering Symbol Atlas — equinor ISO P&ID symbols (PP001A centrifugal pump, PV005A gate valves; recolored to currentColor) + lucide fan/server (dry-cooler fans, rack servers), with a plate-HEX/CDU line-art vessel: dry cooler → valve → pump → valve → CDU/plate HEX ⇄ IT racks with liquid cold plates. Blue supply / red return dashed lines with arrowheads and animated flow (reduced-motion aware). Every label is live-wired — Supply/Return °C, total flow LPM, pump kW, CDU count update with the model; no baked text, so nothing bleeds. Replaces the muddy cropped-PNG strip (pid-day/night.png deleted; atlas source symbols vendored to assets/ltc/src/ for provenance). Sharp at any width, both themes.
v1.115.26PATCH
LTC Modelling Lab is now ONE app — old page fully consolidated into the dashboard
Fixed
"Seperti ada 2 apps." The dashboard revamp had left the ENTIRE original page visible below it (hero "Root Only Module", Legal Notice, "Integrated Engineering Architecture Focus", "High-Fidelity Engineering Calculator" + Workspace Controls) because relocateExistingPanels() targeted class names that don't exist (.pipeline-section/.sankey-section/.calc-output-section/.report-section — zero matches), so all ~27 analytical blocks stayed put and the tabs stayed empty. Rewritten as a route-everything consolidation: every child of the old .calc-output-panel is routed into a dashboard tab by its REAL class/contained-id — FLOW gets the pipeline/variable-flow/energy-breakdown blocks; CHARTS gets Target Guidance, Constraint/Degraded-Mode, Pareto, Monte-Carlo and Sankey; REPORT gets the Scenario Manager, Provenance Ledger, CSV + Executive/Engineering export packs and Methodology; DETAILED (catch-all — nothing can be orphaned) gets the quick-KPI snapshot, the full 23-card output grid, block/control diagrams, Explorer, Rule DSL, Equation Inspector, Calibration Quality, Self-Test and the rest. Fixed-overlay modals (#blockDetailModal, #sankeyDrillModal, #modeHelpModal) move to <body> so a hidden tab can't trap them; the full 61-input legacy panel folds into OTHER PARAMETERS (with a settings count); the emptied old shells + chrome are hidden under body.ltc-consolidated (fail-safe: if consolidation throws, the flag is never set and the original page still renders). The legal notice text now lives in the dashboard's SCENARIO INFO card (Terms/Privacy links kept).
Acceptance verified headless: single shell (page height ~1,577px, previously multi-screen dual-render), DETAILED 14 blocks / FLOW 3 / CHARTS 5 / REPORT 4, all functional; every element id preserved (engine bindings intact); both themes; 0 console errors. Gates: ltc-parity 15,750/0, dark-coverage, page-gates, a11y, interactions all CLEAN.
v1.115.25PATCH
Fix: login no longer drops when navigating — Supabase session rehydration
Fixed
Login state "lepas" on navigation/back — real root cause.auth.js getSession() reads only the rz_premium_session localStorage mirror; when that mirror was missing/expired while the Supabase session token (sb-*-auth-token) was still valid, every page showed "Login" although the user was signed in (the Supabase→sitewide bridge was never implemented — rz-supabase.js "plan B4"). New rehydrateFromSupabase() in init(): when the mirror is absent but a Supabase token exists, it lazy-loads the shared client, reads supabase.auth.getSession(), rebuilds the mirror (tier from the profile when available, role via the allowlist), re-renders the auth UI and dispatches rz-auth-change (so page gates like the LTC lab unlock immediately). Async + fail-silent; skips entirely (no module load) when no Supabase token exists, so offline/demo flows are untouched.
Second real cause on the homepage:index.html loads auth.min.js, a minified twin that was a week stale (2026-07-16) — the homepage always ran old auth logic regardless of auth.js fixes. Rebuilt auth.min.js from the fixed auth.js (terser) and bumped its ?v=.
Cache-bust: auth.js?v=2026-07-24a unified across ALL 156 pages (three divergent versions found: 2026-07-23 ×154, 2026-07-16b, 2026-07-14a).
Verified headless: Supabase-token-only → mirror rebuilt in <10ms (cached), user pill shows, LTC gate unlocks; navigation keeps state; logged-out still shows Login. 0 console errors.
Double tooltip (owner screenshot): Requirements Field labels set a native browser title even when the field also renders a rich RZExplain panel — the black native box covered the panel header. Native title now renders ONLY when there is no explainKey (requirements/ui.tsx).
Added
Phased-Financial KPI tooltips: Total NPV, Payback, and Investment cards (previously bare) now carry detailed tooltips — definition + formula basis + what moves them + decision caveats (e.g. payback ignores time-value; NPV can be positive while IRR misses hurdle).
KpiCard.explainKey: KPI cards can now bind the shared RZ_EXPLAIN_DB (rich Explain tooltip) instead of a hardcoded tip — the enabler for the universal-tooltip sweep.
DCMOC Architecture · Single-Line Diagram: the cooling/BMS lanes are hidden in SLD view, but their labeled group frames (COOLING PLANT / NETWORK & CONTROL) were still drawn — leaving empty boxes. The group loop now applies the same lane guard, so an empty frame is never rendered in SLD. Logical view unchanged (DiagramSvg.tsx).
Changed
DCMOC Operations · Staff Model Config: the controls+results block was locked to full viewport height (h-[calc(100vh-140px)]), so the shorter right panel left a large dead gap and the below-fold sections (Cause-Effect Lever Map, Environmental Impact) were undiscoverable. The right panel is now an in-page tab menu (Overview · Environment & Risk · Power & Cooling · Cause-Effect Map); forced height dropped so height follows content. No dead gap; every section reachable (SimulationDashboard.tsx).
v1.115.22PATCH
TCO — replace stretched market cards with a rate-outlook chart
Changed
TCO market-data card fixed: the earlier empty-area fix had stretched the 8 market KPI cells to fill the left column (huge cards, tiny content). Reverted to compact cells and added a real Market Rate Outlook line chart (build $/MW, colo $/kW, power $/kWh — indexed to Year 1 = 100 over the analysis period, from MARKET_DATA/country projections; day/night-aware, re-renders on region/country/theme change). Column now shows analysis, not stretched whitespace.
v1.115.21PATCH
TCO — flatten the saturated results panel
Changed
TCO Comparison results panel de-slopped: the right-hand results panel was a saturated indigo gradient (#312e81→#4338ca, CLAUDE.md rejected-pattern #7). Flattened to a clean flat instrument surface (#0e1626 + hairline border) so it matches the site's flat aesthetic + the spares dashboard; inner KPI cards / chart / white text unchanged.
v1.115.20PATCH
LTC — coolant thermophysical properties surfaced from the shared engine
Added
The RESULTS Flow & Temperature card now shows the selected coolant's Cp / density / viscosity / thermal conductivity, read live from the shared DATA.coolants (including the crawled/sourced viscosity + thermal-conductivity fields) — connecting the v1.115.10 data crawl to visible UI use. Switching coolant updates the props from the engine. No hardcode.
v1.115.19PATCH
Spares — tab-group chips for the module nav
Changed
Spares module tab bar tidied: the 25-tab wall now shows its group labels (ANALYTICAL / OPERATING ENGINE / REFERENCE / SUPPLY CHAIN & TRANSPORT) as clear blue section chips instead of tiny inline text, so the tabs read as grouped sections; active tab is a solid blue pill. Dropped the faint | dividers.
v1.115.18PATCH
Spares — left-rail input unit labels
Fixed
Spares ANALYSIS SETUP rail units: added the missing unit hints to input labels — Annual Failure Rate λ (/yr), Installed Base (units), Lead Time Sigma (wk), Qualified Alternates (suppliers) — so every input reads self-explanatory (the rest already carried wk/$/% units).
v1.115.17PATCH
Spares — KPI strip tidy: no truncation, one-line values
Fixed
Spares 8-module KPI strip readability: the single-row 8-across layout squeezed each card so word values truncated ("ESSEN…", "CRITI…", "Strat…") and labels clipped. Reworked to a 4×2 grid (8-across only ≥1650px) so every card is wide enough for one-line values; text values (tier/quadrant/status words) use a slightly smaller size via a JS-set .sp-kpi-txt class, numbers stay large, white-space:nowrap prevents mid-word breaks. Full labels + status colors + count-up preserved.
v1.115.16PATCH
LTC — REPORT A/B scenario compare
Added
Scenario compare in the REPORT tab. "Pin current as A" snapshots the current design's engine KPIs; as you tune inputs, a table shows A (pinned) vs B (current) with color-coded deltas (green = better) for PUE / System COP / Total Flow / Pump Power / Risk / Net OPEX / Carbon. Snapshots and deltas are pure engine values — no hardcode.
v1.115.15PATCH
Spares KB — deep-research crawl-enrich into the shared engine
Added
Spares knowledge base enriched with real, sourced facts via the provenance-mandatory dc-corpus pipeline (every fact carries a source URL + verbatim quote or it's rejected — nothing fabricated). New sources appended to tools/dc-corpus/sources.yaml (segment spares): OEM/FM reliability (Riello UPS ~250,000 h MTBF, Oxmaint, IEEE-493-lineage), procurement lead-times (DC Atlas / Wood Mackenzie Q2-2025 — transformers ~128 wk, gensets/switchgear/chillers/UPS), and obsolescence/DMSMS (JEDEC J-STD-048 6-mo LTB / 12-mo LTS). New negation-guarded extract patterns (mtbf_hours, mttr_hours, lead_time_weeks, obsolescence_months) in extract.mjs. 25 spares facts aggregated into 3 monotonic multi-source distributions in the engine @@CORPUS block: lead-time p10/p50/p90 = 16/30/52 wk, MTBF = 2.8k/4.8k/250k h, obsolescence = 4/8/12 mo. Wired as DATA.sparesPricing.corpusBands — additional sourced sanity bands, NOT replacing the golden reliability/sparesCatalog/classes values — with DATA.sources provenance (asOf 2026-07-23). Shared engine → benefits the spares calculator + DCMOC. Gates: test-dc-corpus 2847/0, test-rz-engine 747/0, value-bindings 85/0, calibration 19/0, min reproducible; rz-engine.min.js?v → 2026-07-23-sp. Unfetchable sources (403/404/429) were dropped, mttr kept below the distribution floor rather than fabricated.
DCMOC Architecture diagram — interactive topology tracing: hovering (or tapping) any node now shows a rich equipment tooltip (title · badge · counts · description) and highlights the edges it connects to while dimming everything else, so the power/backup/cooling/control topology reads itself. The hovered node's cell lights up (lane-accent glow); pan/zoom/Logical-SLD unchanged; prefers-reduced-motion respected via short CSS transitions. next build green, arch-probe 7/7, 24 interactive nodes.
v1.115.13PATCH
LTC — power-breakdown donut: center total + per-slice %
Added
POWER BREAKDOWN donut now shows the facility total in the ring center (e.g. "15.42 MW Total") and each legend row carries both kW and its % of total — all from model.breakdown (engine single-source), matching the reference.
v1.115.12PATCH
DCMOC Architecture diagram — label/badge polish
Fixed
DCMOC Architecture diagram label overlaps: the per-node redundancy/use-case badge (e.g. "2N", "AI") was drawn at the cell bottom where the sub-label already sits, colliding (MV Switchgear "1× boards", IT-Load "+10% margin"). Symbol nodes now render the badge as a top-left corner pill (the ×N unit count stays top-right), clear of the title/sub labels; phase boxes keep their bottom-centered NOW/PLAN badge. next build green, arch-probe 7/7.
v1.115.11PATCH
LTC — sensitivity tornado in CHARTS, engine-computed
Added
Two-directional sensitivity TORNADO in the CHARTS tab (renderTornado). For each of the engine's DATA.ltcCalibration.impactParams it perturbs the input −1 and +1 step through window.RZEngine.models.ltc.compute and draws a horizontal bar spanning ΔPUE(low)…ΔPUE(high) on a zero-centered axis (top-8 by range, blue→red). Fully engine-computed — no hardcoded deltas; wired to the same single source as the right-rail sensitivity. Both themes; responsive.
v1.115.10PATCH
Shared engine data crawl: coolants/CDU vendors, refrigerants, electricity+water tariffs, lead times
Added
Real sourced DC data crawled into the shared rz-engine.js (consumed by LTC + TCO + DCMOC via the engine — no page-local copies). Six new curated CSVs under /data/ + engine DATA keys, every value carrying a DATA.sources entry (source+asOf+unit+method):
DATA.coolants extended — added pg40 + dielectric_1p/2p and viscosityMpas/thermalCondWmk/ashraeClass on all fluids (ASHRAE HoF 2021 ch.31 / IAPWS-IF97 / OCP Immersion Fluid Base Spec).
DATA.refrigerants extended — added R744 + Novec7000 and priceUsdPerKg/pfas on all 11 (Chemours/Honeywell/3M TDS · EPA SNAP · ASHRAE 34-2022).
DCMOC Architecture diagram — blocks → proper engineering standard symbols
Changed
DCMOC Architecture-Engine single-line diagram rebuilt from filled blocks to real engineering standard symbols. Vendored a shared engineering-symbol SVG library assets/engineering/ (20 IEC/single-line symbols, viewBox 0 0 48 48, fill=none stroke=currentColor — utility pylon, transformer two-circle, MV switchgear, breaker, disconnect, ATS, genset+G, fuel tank, UPS, battery, PDU, rack, spine/leaf fabric, chiller, cooling-tower, dry-cooler, CDU, CRAH, pump, heat-exchanger, BMS, IT-load) + manifest.json — the canonical seam the parallel session's symbol DB merges into. New tools/build-engineering-symbols.mjs inlines them into dcmoc/.../diagram/symbols.gen.ts. Rewrote palette.tsx to render each node AS its symbol (44px), DiagramSvg.tsx so the node is the symbol + a label below (no filled box), inside labeled group boxes (POWER TRAIN / GENERATION / COOLING PLANT / NETWORK & CONTROL / IT HALL / GROWTH PHASES) with A/B bus voltage labels, day/night CSS-var surfaces, pan/zoom + Logical/SLD switch intact. layout.ts: enlarged cells to fit the symbols + labels and fixed the IT-HALL 3-cell / NETWORK-lane overlap. Topology/edges/buses unchanged; tsc --noEmit clean, next build green, arch-diagram probe 7/7. (Excludes the concurrent LTC session's uncommitted rz-engine.js edits.)
v1.115.8PATCH
LTC — sensitivity + design sub-scores single-sourced to the engine; DCMOC PUE fallback reconciled
Changed
Sensitivity is now real, engine-computed — no fabricated numbers. The dashboard's SENSITIVITY ANALYSIS previously invented deltas from hardcoded coefficients (*0.15, *0.003, *0.05, 0.002, *0.001, refs 24/40) whenever it couldn't read the page's impact table. Added models.ltc.sensitivity(input) to rz-engine.js — it perturbs each of DATA.ltcCalibration.impactParams (the single-source copy of the page's IMPACT_PARAMS) by its step through models.ltc.compute and returns ranked ΔPUE/ΔCOP/ΔOPEX/ΔCarbon/ΔRisk, mirroring the page's pdfImpactRows exactly. renderSensitivity now calls it (offline fallback reads the page's own #impactRows table, else "—"); the fabricated block is deleted.
Design sub-scores single-sourced. Efficiency/Resilience/Sustainability/Operability were UI-invented ((2.0-pue)/(2.0-1.02), annualGwh*0.4, :30). Added models.ltc.designSubScores(model) with its thresholds in DATA.ltcCalibration.designSubScores (+ DATA.sources entries); renderDesignStatus reads it — no magic numbers in the UI.
DCMOC pue.ts fallback reconciled to the engine (was a divergent second source): air 1.42→1.50, liquid 1.08→1.15, DEFAULT_PUE 1.42→1.50 — now mirrors DATA.pueMatrix[type].tier3 exactly (engine stays primary via getPUE).
Owner mandate "wired satu sama lain jangan hardcode sendiri2": LTC sensitivity, design sub-scores, PUE (LTC/TCO/DCMOC) and all LTC data now resolve through the one shared engine.
Notes
Additive only — test-ltc-parity.mjs still 15,750/15,750 with 0 drift (computeModel output unchanged). Engine chain green: test-rz-engine 747/0, test-value-bindings 85/0, test-reference-parity 155/0; rz-engine.min.js reproducibly rebuilt.
v1.115.7PATCH
LTC Modelling Lab — data basis migrated to the shared RZ engine + micro-interaction polish
Changed
LTC data basis is now the shared RZ engine (was 100% inline heuristics). Lifted the LTC lab's inline constant tables + every "magic" coefficient out of computeModel into provenance-tagged rz-engine.js DATA — DATA.coolants, DATA.rackProfiles, DATA.coolingArchProfiles, DATA.ltcClimate, DATA.ltcCountryProfiles, DATA.ltcCalibration — each with a DATA.sources entry (ASHRAE HoF / OCP / Uptime where empirical; method:"model-calibration" labeled honestly where a coefficient is a modeling choice). Added models.ltc.compute() that runs the LTC formulas from those DATA. js/ltc-system-modelling-lab.jscomputeModel() now delegates to window.RZEngine.models.ltc.compute (inline tables retained as offline fallback), and the LTC page now loads rz-engine.min.js. LTC + TCO + DCMOC now share one sourced knowledge base.
Formulas unchanged — golden-parity locked. New gate tools/test-ltc-parity.mjs drives the old inline model and the new engine model over 250 seeded input combinations (15,750 field checks) and asserts bit-identical output (max relative drift 0.000e+0). Engine chain re-run green: test-rz-engine 747/0, test-value-bindings 85/0 (catalog regenerated), test-reference-parity 155/0; rz-engine.min.js reproducibly rebuilt.
Micro-interaction polish (js/ltc-lab-ui.js + css/ltc-lab.css). KPI values now count up (eased, prefers-reduced-motion aware) with thousands-separated flow (e.g. 23,312); tab switches get a fade+slide entrance; a one-time card-entrance stagger on load; WCAG 2.4.7 :focus-visible rings on all sliders/tabs/buttons/preset-cards; and hover-explanations (RZExplain) wired across the dashboard (22 glossary terms: PUE/COP/WUE/CDU/ΔT/economizer…).
v1.115.6PATCH
Spares: interactive heatmaps + count-up + 445-part catalog wired into the engine, calc & DCMOC
Changed
Spares interaction layer (spares-readiness-calculator.html): the Supply-Risk × RPN and Kraljic heat-maps now show real values on hover / focus / tap (band × band + the current part's RPN + alternates + the recommended action) via a reusable cell tooltip — fixing the "colored boxes with no value" complaint. Replaced the cheap sp-num color-flash with a smooth rAF count-up + underline-settle on KPI/result numbers (prefers-reduced-motion safe). Added semantic status colors on readiness/hub % (green ≥95 / amber ≥80 / red), P(stockout), and tier (VITAL red / ESSENTIAL amber / DESIRABLE green), and a Run-Analysis loading→done state.
445-part catalog wired as a shared engine data source (was browse-only). New tools/build-spares-catalog-aggregate.mjs distils the curated 445-part catalog (js/spares-parts-catalog.js) into a compact per-commodity DATA.sparesCatalog aggregate (p50 MTBF/MTTR/lead-weeks/cost/alts/crit/EOL + part count) in rz-engine.js, exposed via models.spares.catalog.{commodities,byCommodity,classAggregate} with a DATA.sources.sparesCatalog provenance entry. The spares page gains a "Pick a real catalog part" searchable picker (filtered by commodity) that drives the real inputs (cost←cTyp, lead←ltTyp, alternates←alts, severity←crit, demand←MTBF, LTB←life/eol) with catalog vs screening provenance chips; screening defaults remain the fallback. DCMOC spares-adapter.ts layers the same catalog aggregate over its 6-class screening table into the shared models.spares.newsvendor. Golden-compare: the default screening path is unchanged; picking a real part deliberately shifts to catalog values. Engine chain green (test-rz-engine 747/0, dc-corpus 2700/0, value-bindings 85/0, calibration 19/0); rz-engine.min.js?v → 2026-07-23-cat. (Deep-research crawl-enrich of the KB follows in a later ship.)
v1.115.5PATCH
LTC Modelling Lab — TEMPERATURE PROFILE chart to match reference
Changed
TEMPERATURE PROFILE (LIQUID LOOP) rebuilt to the reference: two dot-marked line series (Supply blue / Return red) on a fixed 20–40–60 °C axis with 0–100% loop-length X labels, a top-right legend, and colored endpoint value pills — replacing the thin two-line sketch (odd 18/28/39 ticks, leftover monospace label font, no markers/legend/axis). Still live-wired to model.input.supplyTemp/returnTemp.
tco-calculator.html — Region → Country cascade (owner: "region dulu baru negara", like DCMOC). Replaced the flat 12-metro dropdown with two selects: Region (Americas / Asia Pacific / Europe / MENA / Africa / LATAM) → Country / Location filtered by region, built on load from RZEngine.data.countries (40 countries) grouped by .region, with every existing rich US/global metro kept under its matching region (no metro lost). A metro selection uses the unchanged MARKET_DATA record (golden-compare: N. Virginia / Dallas / Singapore TCO identical to before); a country selection derives a market record from the engine — power = economy.electricityRate, staff = baseSalary_Engineer×12 (fallback 85k×constructionIndex), buildCost = 12.0×constructionIndex, tax = economy.taxRate (wired to the WACC tax-shield), with per-region screening estimates for colo/land/CAGR (seeded from regional metro averages) and projection curves escalated via the country's inflationRate/laborEscalation. Snapshot card gains Corp-Tax + Currency cells + a provenance note ("engine: power/tax/labor/build-index; screening: colo/land/cagr"). Default stays Americas / N. Virginia (unchanged view). Verified: Indonesia → power $0.090, buildCost $7.8M/MW (12×0.65); UAE → $10.2M/MW (12×0.85), tax 9%.
tco-calculator.html — empty bottom-left area fixed: the left .tco-simulator-inputs column stretched to the grid cell but the market-data card's content ended ~1332px short, leaving a dead band. Gave the inputs column height:100% and made the snapshot grid flex:1 with grid-auto-rows:minmax(44px,1fr) so the KPI cells consume the height — dead space 1332px → 21px (padding only).
spares-readiness-calculator.html — hero banner de-boxed: the data-rz-hero + rz-hero-fit blur-letterbox rendered a black box when the cover image was absent. The banner is now default-hidden and reveals ONLY on a successful image load (assets/spares-readiness-calculator-hero.webp); onerror removes it — no dark void until the owner supplies the image.
v1.115.3PATCH
LTC Modelling Lab — topbar brand + design-status radial to match reference
Changed
Topbar brand now matches the reference: "Bagus Dwi Permana / LTC Modelling Lab" with a light hex-tile mark (fa-diagram-project on a blue-tint tile), replacing the dark gradient chip + "LTC System Modelling Lab / Comprehensive…" line.
DESIGN STATUS restructured to the reference layout — the blue ring sits on the left with the score % inside, and "Design Score" + the word grade (Excellent/Good/Fair) sit to the right of the ring (was a centered ring with the grade below). Sub-bars unchanged below.
Confirmed (screenshot, seeded root session): the light-theme topbar is white and the legacy DC-Solutions/Glossary back-links are hidden on desktop; both themes verified 0 console errors.
v1.115.1PATCH
Critical Spares Engine — rebuilt to the reference 3-column dashboard
Changed
spares-readiness-calculator.html — actual reference LAYOUT (the prior ship only recolored the old top-to-bottom sprawl; owner rejected it). Rebuilt the page body into the reference's dense 3-column analyst dashboard (.sp-shell grid, 264px / fluid / 312px, contained ~1460px so no empty voids; rails stack < 1180px):
LEFT rail — ANALYSIS SETUP: Select Commodity + 12 compact Fleet & Operational inputs (rail_* mirrored two-way to the real c1_*/s_*/r_* calc inputs via sp_bind + native event dispatch, so the existing calc reruns), Edit All Inputs, SCENARIO Active pill, ▶ Run Analysis (→ recalcAll()), Last-run stamp.
CENTER: the 8-module KPI strip + all 25 module tabs + panes, restyled to the flat reference card language.
RIGHT rail: View Methodology, Monte-Carlo card, Portfolio Summary, Supply-Risk × RPN 3×3 heat map, Quick Actions (Export Full Report / Save / Reset — wired to existing handlers). Filled by renderSpRails() appended to recalcAll (original body untouched).
Workflow-Overview flowchart hidden (not in the reference). Hero-banner band added at top (assets/spares-readiness-calculator-hero.webp via js/rz-hero-fit.js blur-letterbox; collapses cleanly to nothing until the owner adds the image — no dark void). Day + night both screenshot-matched to uiux_day.png / uiux_night.png. All calc functions + element ids preserved.
v1.115.2PATCH
LTC Modelling Lab — pixel-match rebuild to reference: real P&ID + de-terminal skin + gate fix
Changed
SYSTEM OVERVIEW is now the reference photorealistic P&ID. The generic outlined-box SVG was replaced by the actual reference equipment render (dry-cooler bank → pump → plate heat-exchanger → cold-plate racks, blue supply / red return pipes with valves), cropped from the reference mockups into assets/ltc/pid-day.png + pid-night.png and theme-swapped live. Only the Supply/Return temperature chips are overlaid, live-wired to the model (they cover the baked labels). This closes the owner's "P&ID tidak sama" report.
De-terminalized the whole dashboard skin. Every JetBrains Mono declaration in css/ltc-lab.css (~20 rules, incl. all KPI numbers) is now Inter sans to match the reference's clean SaaS look — no monospace, no thin-outline instrument aesthetic. Font Awesome icon fonts untouched.
Right rail matched to reference: COMPLIANCE & STANDARDS rows are now green-check circles + "Compliant" (ASHRAE TC 9.9 / ASHRAE 90.4 / ISO 14644 / ANSI/BICSI 002 / NFPA 75 / Uptime Institute), not score-bars; DESIGN STATUS radial is the reference blue ring + word grade (Excellent/Good/Fair). All still wired to model.scores.*.
Fixed
LTC page false access-gate lock ("keep asking Sign In"). The tier gate flashed "Pro or Educator access required" for a logged-in owner because _rzAuth/_rzFeatures load after the gate's first checks and the heavy dashboard init widened that window. Added an email-allowlist fast-path in the page's inline gate script: an allowlisted root email (bagus@/admin@resistancezero.com) unlocks on the very first synchronous check, before _rzFeatures exists — no gate flash. Logged-out still gates (login modal renders on top, z=99999).
Initial-paint gap carried from v1.114.x: the new dashboard now renders the cached model at the end of init() (defer ordering had the engine's first applyModelToUI fire before the scaffold existed).
Notes
Backend math untouched — computeModel and all solvers unchanged (the only engine-file edit remains the additive return fields + hook from v1.114.0). Every KPI is engine-wired (values differ from the mockup's illustrative figures because they are computed from the live default inputs).
v1.114.2PATCH
Fix: login state now persists on every page — real root cause
Fixed
Login button wrongly shown on pages after logging in (recurring; the earlier ?v= cache-bust fixed a real drift but not this). TRUE root cause in auth.js: pages that carry their OWN hardcoded nav auth markup (#navAuthWrap with navLoginBtn/navUserBtn) — calculators, spares-readiness-calculator.html, dc-market-tracker, etc. — make injectAuthButton() skip injecting the shared rzLoginBtn/rzUserBtn (line 543), and then updateAuthUI() early-returned because those shared buttons don't exist (line 634) → the page's own Login button was never switched to the account widget even with a valid localStorage.rz_premium_session. Calculators masked it with their own local sync; spares had the markup but no sync, so it always showed "Login". Fix: updateAuthUI() now falls back to the page-local nav* button/avatar/email/badge/dropdown IDs when the shared rz* ones are absent — one additive change that syncs auth state on every page carrying #navAuthWrap, permanently (idempotent + safe on pages that also self-sync). Verified headless on spares + a manual page + tco. Cache-bust: auth.js?v=2026-07-16b → 2026-07-23 unified across all 155 pages that load it.
v1.114.1PATCH
LTC Modelling Lab — mockup topbar
Added
LTC Modelling Lab topbar (mockup match) — js/ltc-lab-ui.js now injects (non-destructively, via buildTopbar()) the reference top navigation to finish the pixel-match: a center nav (Home / DC Solutions / Technical Manuals / LTC Modelling Lab [active underline] / Contact — all real destinations) and a right action cluster — What's-new bell → changelog.html, report-doc icon → REPORT tab, Save Scenario → the existing #saveScenarioBtn (or focuses the scenario-name field on the REPORT tab when unnamed), Export Report → the existing #exportExecutive. Every control wires to a REAL existing handler — no fake buttons. The existing theme toggle, auth widget, and mobile hamburger are preserved: the center nav + action cluster are desktop-only (≥ 981px), the legacy back-links are hidden on desktop and remain in the mobile drawer. Styled for both themes under body.ltc-revamp in css/ltc-lab.css. Fixed an initial-paint gap from the same session: because both the engine and the UI module are defer, the engine's first applyModelToUI fired the __ltcModelHook before the dashboard scaffold existed, so the new KPI strip/schematic/right-rail showed placeholders until the first input — init() now re-renders the cached model once the scaffold is built.
css/ltc-lab.css + js/ltc-lab-ui.js — a JS-driven visual reflow of ltc-system-modelling-lab.html into a pixel-matched 3-column dashboard (INPUTS rail · center breadcrumb/title/badge/SYSTEM OVERVIEW schematic/KPI strip/tabs · right rail COMPLIANCE·DESIGN STATUS·SENSITIVITY·SCENARIO INFO), for both light and dark themes. All new CSS is scoped under body.ltc-revamp (light :root:not([data-theme="dark"]), dark [data-theme="dark"]). The backend math is untouched — the UI module is additive, builds its scaffold on DOMContentLoaded, and RELOCATES the existing input/output panels into the new tab panels (RESULTS · DETAILED CALCULATION · FLOW DIAGRAM · CHARTS · REPORT) via appendChild, so every existing element id / chart SVG id+viewBox / the <script src> list / version stamp / #rootGate+#rootLoginBtn are preserved.
6 primary sliders (IT Load / Liquid Capture / Supply Temp / Return Temp / Pump Head / Pump Efficiency) two-way bound to the existing number inputs (inItLoad/inLiquidCapture/inSupplyTemp/inReturnTemp/inPumpHead/inPumpEff) — moving a slider mirrors the numeric box and dispatches input/change on the underlying input so auto-run recomputes. 3 architecture preset cards set inCoolingArchitecture + fire change. An OTHER PARAMETERS collapsible holds the remaining ~45 inputs.
Wired renderers invoked via a 1-line additive hook at the end of applyModelToUI (window.__ltcModelHook): KPI strip (IT Load / Liquid Cooling / Total Flow / Pump Power / PUE / System COP), theme-aware SYSTEM OVERVIEW SVG schematic (dry-cooler → distribution loop w/ center pump + blue supply / red return animated flow lines → CDU/HEX → IT-load rack, prefers-reduced-motion aware), RESULTS tab (FLOW & TEMPERATURE · PUMP & HYDRAULIC · PERFORMANCE · POWER BREAKDOWN donut · TEMPERATURE PROFILE line chart · ENERGY BALANCE table), COMPLIANCE list (6 standards, compliant when the mapped sub-score ≥ 70), DESIGN STATUS radial gauge (scores.total + grade + 4 sub-bars mapped from the 5 sub-scores by averaging), SENSITIVITY top-5 impact-on-PUE bars, and SCENARIO INFO. Every displayed number derives from the engine model object — no hardcoded KPI literals in markup.
assets/ltc/ — vendored 4 clean engineering-symbol glyphs from the RZ Engineering Symbol Atlas (tabler outline: pump.svg, heat-exchanger.svg, dry-cooler.svg, rack.svg, currentColor-recolorable).
Changed
js/ltc-system-modelling-lab.js (additive only — NO formula changed): exposed already-computed liquidCop, airCopEff, massFlowKgS on the top-level computeModel return object (previously only in internals), and added the window.__ltcModelHook(model) call at the tail of applyModelToUI.
ltc-system-modelling-lab.html (2-line edit): load css/ltc-lab.css?v=2026-07-22-ltc after the inline styles and js/ltc-lab-ui.js?v=2026-07-22-ltc after the engine script. Everything else preserved.
spares-readiness-calculator.html — "Critical Spares Engine" reference reskin (day + night): re-pointed the page's amber accent tokens to a reference instrument-blue design system and restyled the hero (breadcrumb + title + Analysis-Summary badge + Analysis-ID/Created/Scenario meta trio), the 8-module KPI strip, tabs, module/result cards, tables, badges, and buttons to the reference's flat-card visual language — sampled palette (day #f6f7f9/#1c2534, night #061119/#f1f5f9), all 25 tabs kept. Added a footer RZEngine v2.5.1 stamp (reads RZEngine.DATA.version), analysis-header meta (auto Analysis-ID/timestamp), active-KPI-card sync to the current tab, and count-up/entrance micro-interactions (no sound; prefers-reduced-motion safe). Engine wiring: the statistical kernels are now single-sourced to RZEngine.models.spares.{normInv,normCdf,poissonCdf} (local implementations kept as fallback) — the "update the engine → updates everywhere" contract; all module algorithms preserved unchanged.
tco-calculator.html — engine-wired + dropdown parity: market rates (power $/kWh, colo $/kW-mo, CAGR) now sourced at load from RZEngine.data.markets (syncMarketRatesFromEngine, byte-identical to the inline seeds); annual power cost and cost/kW-yr delegate to RZEngine.models.opex.powerCostAnnual / models.tco.costPerMwYear via guarded helpers with inline fallback — golden-compare identical, no result drift. Dark-mode <option> styling added to .tco-input-field selects (matched the canonical .input-field look; blanket rename avoided per the v1.4.1 regression note). .tco-page-background → inset:0 hardening.
Fixed
Auth login state not persisting on manual/* pages (recurring): all 40 manual/*.html loaded a stale cache-busted auth.js?v=2026-07-14a while the rest of the site loaded the current ?v=2026-07-16b (Supabase-primary login + updated session handling). Returning users ran the old cached auth.js on manual pages → the nav showed "Login" even when logged in. Re-stamped all 40 to ?v=2026-07-16b; headless-verified the account widget shows and Login hides with a seeded session. Root cause was cache-bust drift, not the injection logic.
v1.113.3PATCH
article-28 editorial overhaul: skin compliance + real source links + research-backed depth + OG photo card
Fixed
article-28.html reading layout — the page was missing the <div class="container"> wrapper inside <article class="article-content"> that every compliant editorial article uses (see article-27.html). Without it the prose ran full-bleed (no centered column, no L/R margins) and the shared editorial runtime could not build the sticky related rail (it keys off .article-content > .container). Added the wrapper → prose now sits in the centered reading column with margins, and the "Related" rail hydrates from the new Continue-Reading block. This is the true root of the recurring "no margins / doesn't follow the article standard" report (the earlier .article-body wrapper alone was insufficient).
Changed
article-28 skin → editorial compliance (rejected-pattern #7/#9): removed the gradient drop-cap (linear-gradient first-letter → solid --rz-art-accent), flattened the gradient h2::before accent to a 2px solid rail, and deleted the bespoke hand-rolled scroll-progress bar + its script (the shared js/rz-article-editorial.js runtime owns read-progress). Body callouts were already editorial-flat via css/rz-article-dark.css. Wide 7-column data tables now scroll inside the reading measure (.ws-lever-table clamped to min(--rz-measure, 880px)) so they no longer sprawl past the prose (fixes the responsive wide-article-table gate; note this site's editorial measure is 46rem @ 20px root = 920px).
article-28 content depth (owner: "harus sangat2 lebih detail", concrete max limits + conditions + per-process cost/duration/needs/risk): added a hardware-ceiling table (what fits on 16GB/24–32GB/70B/CPU-only, with the Q4 ≈ 0.5GB/1B rule), expanded the local-AI pipeline table to needs·cost·time·ROI·risk with real figures (QLoRA 65–70B on one 48GB GPU ~24h/~$15–30, RAG < ~100K interactions/mo cheaper than fine-tune, MCPVerse best-model 57.77%), a provider-notes table (Claude MCP / ChatGPT function-calling / Ollama local GGUF / Gemini long-context grounding), concrete BitNet 70B numbers (4.1× faster · 8.9× throughput · 7.16× less memory · 71.4× matmul energy, from-scratch-only caveat), DistilBERT (97% at −40% params) + dataset-distillation (50 IPC → −5.9% on ImageNet-1K), and rewrote the 3 generic FAQ into concrete max-and-conditions answers. Honesty guardrails: the "~4,000×" density figure is labeled illustrative (the solid, sourced number is corpus→FP16-70B ≈ 100–150×; cascade chart + CSV corrected from ~60 TB to ~15–20 TB), "30–60%" prompt gain labeled reported, Extropic "~10,000×" labeled aspirational.
article-28 sources — every reference is now a real clickable link (arXiv abs/, DOI, publisher pages) with [proven]/[reported]/[frontier]/[claim] confidence tags (owner: "sources reference ini tidak ada linknya"). Fixed the wrong glossary anchor on Landauer and corrected the series-nav (was mislabeled "Article 23"/prev article-22 → Article 28/prev article-27).
Open Graph index card (tools/build-og-images.py → assets/og/index.webp) — the generic gradient card now composites a circular profile photo (assets/profile-photo.jpg, anti-aliased mask + brand hairline ring) over an index-aligned dark hero (near-#0a0e1a base + low-opacity gold/mint aurora, RZ mark, resistancezero.com footer). Graceful fallback if the photo is absent.
v1.113.2PATCH
Fix: mobile hamburger appearing + misfiring on desktop
Fixed
The injected mobile hamburger (js/rz-mobile-nav.js) was hard-coded with inline display:inline-flex !important, which overrode the stylesheet's desktop .rz-nav-burger{display:none} rule — so on pages without a pre-existing .hamburger (e.g. the LTC labs) the burger appeared at desktop width and, when clicked, set body{overflow:hidden} while the drawer CSS only exists ≤768px → no menu opened and the top HUD collapsed. Now the injected burger's visibility is gated by matchMedia('(max-width:768px)') (+ change listener), so it shows only on mobile and never misfires on desktop. Cache-busted js/rz-mobile-nav.js?v= across 119 pages.
v1.113.1PATCH
DCMOC sidebar color restored — semantic lifecycle-phase coding
Fixed
Sidebar lost its color (owner report) — the v1.110.0 de-slop killed the 13-color engine rainbow but overshot to all-grey (only the active engine had amber), so the "13-Layer Lifecycle" nav read colorless. Restored color by lifecycle phase (not the rejected rainbow): engine badges + icons now colored by phase — Plan & Design (1-5) instrument-cyan, Deliver (6-7) signal-amber, Operate (8-10) data-green, Optimize (11-13) mint. Color now MEANS the lifecycle stage (design.md §5); the active engine keeps its solid signal-amber "you are here" chip. Shell.tsx only, no engine change. tsc 0 + build, screenshot-verified.
v1.113.0MINOR
dossier Permitting Matrix → EPC-grade register
Added
DATA.dossier.permittingMatrix deepened — 10 → 21 permits across the full DC lifecycle (zoning/EIA/building/fire/grid-interconnection · excavation/crane/confined-space/hot-work/working-at-height/traffic/temp-power/temp-water/fuel/hazmat · water-discharge/MV-HV-energization/telecom · occupancy/operational-license/periodic-inspection). Each permit carries the full EPC fields: phase, purpose, requiredDocs[], submissionFlow, durationWk, dependency, approvalRisk, inspection, renewal, standard. STANDARD-PRACTICE reference (jurisdiction-agnostic; validate against the AHJ).
Dossier Section 2 render — flat table → detailed per-permit blocks grouped by lifecycle phase (Pre-Construction / Construction / Energization / Occupancy-Operation), each showing purpose · required docs · submission flow · dependency · inspection · renewal · standard + risk chip + duration. Flat-table fallback for older engines. Dossier 380 KB → 423 KB.
Platform post-drafts for Article 28 in Article/Post Draft/Article 28/ (LinkedIn, X thread, Mastodon, Medium long-form, Facebook) — completes the CONTENT_LINKAGE_PLAYBOOK §1 distribution mandate.
Rebuilt llms-full.txt (130 pages) so the AI-content mirror includes Article 28.
v1.112.1PATCH
Article 28 deepened — more detail + comprehensiveness
Changed
Expanded article-28.html substantially: +2 sourced charts (the ~60 TB corpus → ~14 GB capability cascade on a log scale; efficiency headroom of analog/neuromorphic/reversible/thermodynamic/brain substrates), +2 tables (a substrate comparison matrix and the full 9-stage local-AI pipeline), a Capability Density formula callout, a concrete no-GPU recipe (ollama + qwen + persistent chat + RAG + tools, mapping to the site's own local stack), an in-body FAQ, and a Sources & further reading list. Now 4 charts + 3 tables + SVG diagram, ~2,900 words.
New datasets data/article-28/compression-cascade.csv + substrate-efficiency.csv (both provenance-tagged).
article-28.html — "The Compression Horizon: how close can a laptop get to a datacenter's mind?" (Future Forward). A rigorous, bold-but-fenced take on two impossible-sounding targets — 300 TB of data into 1 KB, one CPU-only PC equal to a 1 GW datacenter — mapping the hard walls (Shannon, Kolmogorov complexity, Landauer's principle) against the real frontier that climbs them (dataset distillation, BitNet b1.58, implicit neural representations, hyperdimensional computing, Matryoshka embeddings; reversible/analog memristor/photonic/neuromorphic/thermodynamic compute; algorithmic-efficiency halving). Introduces the Capability Density / Compression Horizon framing, a default→genius local-AI pipeline with an inline SVG block diagram, 2 sourced charts (bits-per-weight; compute-per-capability over time), and a myths-vs-reality confidence table.
Cross-linkage: prepended to insights.html (Latest Publications) + articles.html grid; 6 new glossary terms (Shannon entropy, Kolmogorov complexity, knowledge/dataset distillation, hyperdimensional computing, memristor, RAG); search-index.json (id 46) + search-sections.json; sitemap.xml (145 URLs) + llms.txt; OG card assets/og/article-28.webp; two provenance-tagged datasets in data/article-28/.
Verified
Headless: 2 charts render, SVG pipeline diagram, 8 sections, 0 console errors; article-charts provenance gate CLEAN (source+basisTag on both); dark-coverage CLEAN; script-tags CLEAN; article-28 passes version-stamp + mobile + responsive. (Pre-existing gate noise on tools/dc-corpus/raw/* version stamps and setup-supabase.html mobile overflow is unrelated and untouched.)
v1.111.2PATCH
SecondBrain → Claude Session Manager entry pill
Added
"Sessions" entry pill in the SecondBrain graph nav, next to "Vector Index" (amber→green filled-glow CTA, so the two portals read as a pair) → opens the local Claude Session Manager at http://localhost:8770/.
The manager itself is a local-only tool (lives in ~/.claude/rzsessions/, auto-started by a systemd user service; not in this repo): a dark, reference-grade 3-column web GUI that lists every AI-CLI session on the PC — Claude (~/.claude/projects) + Codex (~/.codex/sessions) + persistent ollama chats — each with the correct provider logo, title, model, folder, event count, and a per-session Resume button that opens a terminal running claude --resume / codex resume / rzchat --resume in the session's cwd. Search, provider/model/folder filters, sort, and a detail panel (Summary + Key Topics + Metadata). Backend is bounded-parse (never full-reads the 80 MB+ Codex logs) + mtime-cached; localhost-bound, UUID-validated resume.
Verified
Headless: pill renders next to Vector Index → localhost:8770, 0 console errors. Manager: 71 sessions (8 Claude + 63 Codex) render, provider filters + detail panel + dry-run resume all work; favicon 204 (no stray 404). systemd user service active + enabled. (Session data never leaves the PC; nothing session-related is committed to the repo.)
v1.111.1PATCH
worked-calc accuracy fixes — adversarial review
Fixed
Fire-water density mislabeled (HIGH) — the sprinkler-demand calc tagged "NFPA 13 OH-2" but used 12.2 L/min·m² (that's Extra-Hazard-1). Corrected to the true OH-2 density 8.15 L/min·m² (0.20 gpm/ft²; 1 mm/min = 1 L/min·m²). (Only surfaces for water-suppression projects; novec default = zeros.)
Availability rendered "100 %" (MED) — a redundant chain rounds to 7+ nines and the renderer caps at 4 decimals → an unqualified, physically-impossible "100 %". Now clamped to 99.9999 % (4-nines display); the Annual-downtime step carries the real per-topology figure. _availRaw (the reliability-model match) unchanged.
Transformer step-3 unit mix (MED) — the count step used kW while the prior steps were MVA/MW, breaking the audit trail; now ⌈facMVA / unitMVA⌉ (all MVA).
WUE step not self-contained (MED) — the annual-water step referenced IT_kWh with no kWh value shown; now the IT-energy step outputs kWh and the water step shows the full WUE × kWh ÷ 1000 arithmetic.
Disclosure notes (LOW) — UPS autonomy flagged "(screening default — validate vs project UPS spec)"; availability inputs note the 3-group (ups/crac/chiller) screening scope vs a full IEEE 493 RAM study.
Verified
engine 747/0 (_availRaw still == models.reliability) · parity 155/0 · bindings 85/0 (catalog 221fn/123src) · export 44/0 · tsc 0 + build. Hand-verified UPS/cooling/fuel calcs reconcile. Availability now renders 99.9999% (screenshot-confirmed). Engine ?v -m→-n. 0 CRITICAL in review; 1 HIGH + 3 MED + 2 LOW all resolved.
Owner: dossier "masih jauh" from a real EPC reference. Deepened engine-sourced across 4 sections (dossier 272 KB → 380 KB, all numbers track the live project).
Added — Engineering Calculations = WORKED CALCS (Section 4, the biggest gap)
BOQ dossier input-sync fix — dossier tracks the live project
Fixed
Dossier showed the wrong project (usa · 1 MW vs the app's Indonesia · 2.5 MW). The CAPEX store persists inputs; on reload after any CAPEX edit, onRehydrateStorage respected the STALE persisted itLoad/location instead of reconciling to the Simulation store (the SSOT the top bar reads). So buildBoqModel built the header — AND the CAPEX results the whole BOQ decomposes — on stale inputs. Now onRehydrateStorage ALWAYS reconciles the shared canonicals (itLoad, country/location) from the live Simulation store (capex-specific fields like fireType/redundancy stay persisted), so the dossier total recomputes on the live project. Belt-and-suspenders: withProjectMeta + all 3 dossier callers (CapexEnginePage, ConstructionEngine, TraceValue) now pass location/itMw from the Simulation SSOT (same source as the top bar), so the header can't diverge.
Verified
Seeded headless test (persisted capex = usa/1000, sim = ID/2500) → dossier header now reads Indonesia / 2.5 MW (was usa / 1 MW). tsc 0 + build · trace-parity 117/117 · walk 24 · export 44. No engine change (DCMOC-only).
v1.110.1PATCH
deep-BOQ correctness fixes — adversarial review
Fixed
Seismic zone now consistent + functional (HIGH) — the Seismic Zone dropdown never affected CAPEX cost (CapexEngine hardcoded zone2), while the BOQ take-off read input.seismicZone (default zone1) — so civil rebar/bracing quantities were calibrated to a different zone than the cost basis. Now CapexEngine reads input.seismicZone (the dropdown works: zone0 0.2× → zone4 8× on the seismic category), BOQ driver + store defaultInputs both default zone2 — all three agree. (Deliberate CAPEX re-baseline for non-zone2 selections — the control now does something.)
Lump-fallback line coherence (MED) — the zero-load reconciliation fallback hijacked the first real component row (qty 0 / rate 0 / full total); now pushes a dedicated Lump sum line (qty 1) so the discipline tree reads coherently.
Removed 3 dead unitRates keys (MED) — securityPerRack/cxPerMw/permitPerMw were pre-deepening anchors referenced by no leaf (a future author using securityPerRack would get a wrong $1,500/rack vs the real acs+cctv+intrusion path).
Four-phase DCMOC overhaul (owner: dossier too shallow "3 levels deeper" + "design warna terlalu AI slop, harus intuitive" + KPI cards uneven/overflowing).
Vector Index dashboard (Apps/second brain/vector-index.html)
Smooth cluster density replaces the ugly overlapping convex-hull polygons — d3.contourDensity() soft isobands per client-cluster, cached in world space so zoom/pan stay smooth.
Constant-size category labels (screen space, fade out on zoom-in) instead of labels that ballooned when zoomed.
Live left-panel controls: Namespace (collection filter), Time Range (mtime filter), and Cluster Algorithm (client re-cluster on the 2D projection — KMeans / DBSCAN / agglomerative) now actually drive the canvas. Similarity-threshold fade + smooth animated zoom buttons.
3D enhanced + interactive: raycaster hover-tooltip + click-to-select fills the right panel (was inert); round sprite points, additive glow, depth fog, auto-orbit (pauses on interaction), fit-to-bounds.
Detail + scalable + robust tabs: shared sortable / filterable / paginated table (Documents · Chunks · Embeddings) with row-click → locate the point in the visualization; richer Overview (cluster mini-table · recency · token stats) with distribution bars whose width equals the % shown; Analytics gains a similarity-to-centroid histogram (oversized SVG charts replaced with bounded bars); full Settings health (index · projection · per-collection · cluster-size tables + copy rzmem viz). Right panel adds a vector sparkline + nearest-neighbors. Tab reveal animation, Esc clears selection, tabular-nums, solid gate scrim (no glassmorphism).
Fixed the toolbar "aneh behaviour" root cause: the empty-state #emp lived inside the vis-network container, which wipes its children on first render — so every later rebuild (Force / filter / search / focus / orphan) threw Cannot read properties of null (reading 'style'). Moved #emp out of the container + defensive guards → all controls work without crashing. Hierarchical layout now auto-fits (no more off-screen "explosion").
Prominent "Vector Index" entry CTA: filled cyan→violet gradient pill with glow + shine (replaces the tiny buried icon), clearly signalling a major feature.
China duty band (HIGH) — CN.importDutyBand was high (17%) but DATA.sources documented punitive (~30% China↔US). For AI DCs the frontier equipment is predominantly US-origin (Section-301 / retaliatory tariffs dominate), so CN is now punitive — matches the documented intent + the realistic worst-case, and retires the previously-unused punitive band.
GB300 cooling-kit duty (HIGH) — the $50k/rack cooling kit is added after the CapexEngine cost loop, so it bypassed landedFactor — import duty was silently zero on imported cooling hardware. Now applies landedFactor(country,'coolingKit') (new equipmentShareByCategory.coolingKit 0.90); a 72-rack GB300 in a high-duty country was ~$0.4M short.
Dossier landed table completeness (MED) — the per-category supply-chain table disclosed only 5 of the duty-receiving categories; now shows all material equipment disciplines (adds bms/security 0.60, fireSuppression/fireAlarm 0.50) so the disclosed uplift matches the cost math.
Type widening (MED) — CountryProfileLike in BoqDossier now includes gpuExportTier/customsLeadBand (were read via a cast, hidden from tsc).
Verified
engine 710/0 · parity 155/0 (after country regen: CN punitive) · calibration 19/0 · bindings 85/0 (catalog 216fn/118src) · trace-parity 117/117 · export 44/0 · tsc 0 + build. Split-rule / null-safety / country-coverage / honesty PASSED the review (0 CRITICAL). Engine ?v -i→-j. Closes the review-discipline gap on Ship-C (which shipped without a dedicated review).
v1.107.0MINOR
Vector Index dashboard revision + SecondBrain gate/lock/modal fixes
Added
Vector Index dashboard — 8 functional tabs (Apps/second brain/vector-index.html): Overview (stat cards + category/collection distribution + top documents), Documents, Chunks, Embeddings (filterable + paginated tables), Vector Visualization (the canvas), Search (semantic/text), Analytics (SVG bar charts — category, cluster sizes, collection split, token histogram), Settings. All driven from the local vector-index.json (no backend).
Prominent, labeled entry point — the SecondBrain toolbar's tiny 7-dot icon is promoted to a labeled "Vector Index" nav pill (with a padlock cue) next to Wiki.
Padlock on the "Second Brain" nav item across 61 pages (Insights dropdown) — signals root-only.
Fixed
Login modal on SecondBrain rendered with no visible fields — the gate z-index:100000 covered the auth modal (99999) and the page-blur rule blurred the modal into mush. Gate lowered to z-index:9000 and the blur now excludes #rzModalOverlay, so the standard Email+Password Sign-In modal renders cleanly on top.
Similarity Threshold slider had no visible effect — it now fades every point less similar than the threshold to the selected point / query, with a live "N / total ≥ threshold" caption.
Vector Visualization looked bare — cluster hulls + category labels now default ON, larger points with halos, a faint reference grid, brighter selected/neighbor states.
Dead controls wired — topbar bell/cog/avatar; added a "← SecondBrain" back button.
three.js pinned to a single version (0.128) for the 2D/3D toggle.
Verified
Headless (puppeteer): root unlocks both pages; all 8 tabs render real content; slider + back + tabs + zoom work; 0 console errors. Non-root context → index.html locks and the Sign-In modal shows visible Email + Password fields (z 99999, unblurred). Padlock present on 61 pages. Viz data (vector-index.json) stays local/gitignored — 0 PureDC in committed files.
v1.106.0MINOR
Ship-D: DC Corpus / KB dive-deep — new-domain sources + rack-power metric
Added
DC Corpus deepened — 12 new authoritative public sources appended (append-only) to tools/dc-corpus/sources.yaml: microfluidic/advanced cooling (Corintis, Microsoft in-chip, IMEC, arXiv power-stabilization + microfluidic-survey), AI-arch power (OCP ORV3 HPR/Mount Diablo, NVIDIA GB200 NVL72, arXiv AI-DC-power), supply-chain (US BIS EAR, WTO Tariff Profiles 2024, DCD supply-chain lead-time, T&T DC Cost Index). 10/12 fetched (2 bot-blocked, handled gracefully — remain as provenance citations).
New corpus metric rack_power_kw (extract.mjs, bounded 5-400 kW/rack) — AI-architecture rack power draw, distinct from rack_density_kw. Yielded 4 source-quoted facts (20/40/50/100 kW; IMDA, NVIDIA DGX H100, Uptime 2024). Distribution n=3, monotonic, 2 independent sources.
Verified
engine 708/0 · parity 155/0 · calibration 19/0 (constants still in-band vs deepened corpus) · bindings 85/0 (catalog 216fn/118src) · dc-corpus 2678→2700 asserts, all green · export 44/0 · tsc 0 + next build. corpus-facts 649→653 (+4). Engine ?v -h→-i. HONESTY: heat_flux_wcm2 + import_duty_pct patterns DROPPED (0 matches / trade-vs-utility-tariff false positives) rather than ship noise — arXiv PDFs converted poorly (binary), so W/cm² + GPU-TDP-W + import-duty-% don't exist in extractable form; sources stand as citations. Ship-D COMPLETE — the full CAPEX+BOQ program (Ships A/B, BOQ P1-P3, C, D) is shipped.
v1.105.0MINOR
Supply-Chain per Country: landed cost + export-control + customs lead-time
Added
RZEngine DATA.supplyChain + models.supplyChain — per-country landed-cost / export-control / customs lead-time (the pending original CAPEX ask "supply chain per selected country"). equipmentShareByCategory (import-exposed fraction per cost category: ups 0.70, generator 0.75, network 0.80, cooling 0.55, electrical 0.40; labor-heavy ≈ 0), importDutyBands (fta 0 / low 3% / med 7.5% / high 17% / punitive 30%), exportTiers (1/2/3 PROXY), frontierArchKeys, customsLeadWk. models.supplyChain.landedFactor(country, category) = 1 + duty×equipmentShare (floored 1.0 — split-rule: duty on imported-equipment fraction ONLY; local labor/civil already in constructionIndex, never double-discounted), exportControl(country, archKey), leadTimeCustomsWk, dutyRate, exportTier. Standard: standarization/SUPPLY_CHAIN_STANDARD.md.
Dangling engine references (HIGH) — DATA.dossier Design Basis + Engineering Calculations pointed structural floor-loading at DATA.requirements.floorLoadingKnM2, which doesn't exist; the key lives in DATA.architecture.floorLoadingKnM2. Corrected both (the "Engine Reference" column an engineer follows to validate the calc now resolves).
Executive-summary timeline via native engine path (HIGH) — models.dossier.executiveSummary read only result.metrics.timelineMonths; a native models.capex result (no .metrics) silently rendered "— mo". Added || result.timeline.totalMonths fallback.
Section-title single-source drift (HIGH) — dossier sections 5/6/7 hardcoded their titles instead of reading SECTION_TITLES, defeating the single-source ToC/header design. Now all sections read SECTION_TITLES[n-1].
Verified
engine 697/0 (new: timeline fallback + floorLoading-path guards) · parity 155/0 · calibration 19/0 · bindings 85/0 · trace-parity 117/117 · export 44/0 · tsc 0 + build · script-tags CLEAN. Engine ?v -f→-g. Found by an adversarial review of the P3 dossier (0 CRITICAL, 3 HIGH resolved; MED/LOW were non-issues or false positives — models.maintenance does exist).
DCMOC full dossier (BoqDossier.ts) — the BOQ is now section 6 of a numbered 10-section "Technical Project Dossier — Bill of Quantities & EPC Reference" with a Table of Contents (shared SECTION_TITLES single-source so numbers/titles can't drift): 1 Executive Summary (KPI grid, live CAPEX) · 2 Regulatory & Permitting Matrix (risk chips) · 3 Design Basis · 4 Engineering Calculations · 5 Equipment Schedule · 6 Bill of Quantities (reconciled + disclaimer/margin/safety-factor) · 7 Procurement Packages · 8 Risk Register · 9 Operations Readiness · 10 Document Register. Dossier-level STANDARD-PRACTICE banner ("permitting durations/risks indicative; validate against AHJ + full design; not a quotation/tender").
Verified
engine 695/0 · parity 155/0 · calibration 19/0 · bindings 85/0 (catalog 211fn/117src) · dc-corpus 2678/0 · trace-parity 117/117 · walk 24/0 · synergy 6/0 · export 44/0 · tsc 0 + next build · js-syntax/script-tags/dark CLEAN. Exec summary pulls live CAPEX; 6 static datasets resolve; no </script> hazard. Engine ?v -e→-f. Grand plan COMPLETE: BOQ P1 (reconciled line items + margin/safety) + P2 (equipment + procurement) + P3 (full EPC dossier) all shipped.
v1.103.1PATCH
BOQ correctness fixes — adversarial review
Fixed
BOQ cooling-quantity overcount (HIGH) — models.boq.drivers.coolingKw (and equipmentSchedule) used IT×PUE, inflating the displayed CRAH count + glycol/coolant volume by a factor of PUE (~1.4-1.6×). Cooling duty ≈ IT heat load (the (PUE−1) overhead is the cooling plant's own fan/pump/chiller power, not extra white-space heat), so coolingKw = itKw. Gensets/transformers correctly stay sized to IT×PUE (they power the whole facility). Line-item $ were already correct (reconciled); this fixes the physical quantities an engineer reads off the schedule.
Margin-override label (HIGH) — models.boq.summary.marginPctGross returned the constant (10%) even when opts.epcMarginPct overrode it, contradicting the embedded-margin $ on the same disclosure. Now reflects the actual margin used.
Popup-blocked feedback (MED) — CAPEX Engine + Construction Engine BOQ buttons ignored openBoqDossier's false return; now alert the user when the dossier popup is blocked (TraceValue already handled it).
Vacuous reconcile (MED) — summary.reconciles read true at capexTotal === 0; now requires capexTotal > 0.
Zero-load reconciliation guard (LOW) — generate now carries the category $ as a lump line if bottom-up is 0 while the category $ is nonzero, preserving Σ(lines)===categoryTotal.
Verified
engine 686/0 (new: coolingKw=IT-heat, margin-override, zero-capex reconcile guards) · parity 155/0 · calibration 19/0 · bindings 85/0 · trace-parity 117/117 · export 44/0 · tsc 0 + build · script-tags/dark CLEAN. Engine ?v -d→-e. Found by an adversarial code-review pass (0 CRITICAL, 2 HIGH + 2 MED + 1 LOW — all resolved).
RZEngine models.boq.equipmentSchedule — major-equipment schedule from DATA.boq.equipmentSizing: UPS modules / gensets / MV transformers / PDU / CRAH / CDU sized by IT load × PUE with N + redundancy counts (N+1 → +1, 2N → ×2, 2N+1 → ×2+1) + lead times reflecting the 2026 long-lead reality — MV transformer/switchgear ~120 wk dominant, UPS 26, genset 40, chiller 32. Informational (indicative, not reconciled to $).
RZEngine DATA.boq.procurement + models.boq.procurementPackages — 12 standard mission-critical DC EPC packages (P01 civil → P12 permits) with scope, tender method, lead time, FAT/SAT, warranty; est value = Σ mapped CapexResult category $. Flagged non-additive (electrical/mechanical categories span several packages — indicative scope envelopes for procurement planning, NOT a cost rollup). DATA.boq.laborBurdenPct (45%, informational) added.
BOQ dossier (BoqDossier.ts) +2 sections after the discipline tables: Equipment Schedule (Equipment · Spec · Capacity · Qty N · Qty Installed · Redundancy · Lead Time · confidence; long-lead ≥52 wk amber-highlighted with LONG-LEAD tag) + Procurement Packages (Pkg# · Name · Scope · Tender · Lead · FAT/SAT · Warranty · Indicative Value · confidence; prominent non-additive-overlap caption).
DCMOC surfaces — Requirements cooling picker +3 options (immersion_1p/2p/microfluidic) with amber "EMERGING · pilot/riset" tag + microfluidic TRL~6-7 advisory note (selectable for scenario modelling, clearly not-production; true 7-key on CAPEX store drives real coolingMult/PUE, sim store gets thermally-equivalent downcast). New Data Library "Cooling Tech" tab (vendor table + COMMERCIAL/EMERGING chips + honesty caption). CDU dashboard "Advanced & Emerging Cooling" subsection (TRL badges). Microfluidic NEVER encoded as an NVIDIA architecture fact.
Fixed
Region dropdown EMEA/MENA/Africa overlap (owner report "EMEA kok ada 2") — regions.ts REGION_LABELS relabels the EMEA bucket "Europe, Middle East & Africa" → "Europe". All 14 EMEA-tagged countries are European; Middle East (MENA) + Africa (AFR) are already separate buckets, so the old label double-listed those geographies. Bucket key + CapexEngine region==='EMEA'→europe mapping unchanged; label only.
DCMOC CAPEX Ship-A: AI reference-architecture profiles + peak-provisioning
Added
RZEngine DATA.requirements.archProfiles — 5 AI reference architectures ber-sumber + confidence-tagged: NVIDIA H100 SuperPOD (~30/45kW air, OFFICIAL), GB200 NVL72 (120 nominal / 132 TDP OFFICIAL / 192 peak = EDPp ANALYST est ~1.5×, liquid), GB300 NVL72 (140/192, cooling-kit ~$50k/rack = Morgan Stanley BOM ANALYST, hybrid), Vera Rubin VR200 NVL72 (~200/300kW, ANALYST — NVIDIA belum publish rack-kW), OCP ORV3 HPR (92-140kW→roadmap 750/1MW, OFFICIAL). Plus peakProvisionFactor:1.5, baselinePeakRatio:1.2, interconnect (IB $4900 / Ethernet $2600 per GPU, ANALYST — SemiAnalysis 512-GPU cluster ÷512). Model fns models.requirements.archProfile / provisionedRackKw / powerProvisionUplift / interconnectCost. Semua leaf punya DATA.sources entry dgn confidence tag di string. Fact-checked vs NVIDIA RA / OCP spec / SemiAnalysis / Morgan Stanley — semua angka firm + label jujur.
DCMOC Reference-Architecture picker (WorkloadProfileSection) — pilih arsitektur AI mutakhir; tiap opsi tampil peak/nominal kW + GPU + cooling + Tier-floor + confidence chip (emerald OFFICIAL / amber ANALYST + sub-note "estimasi analis, bukan datasheet vendor"). applyArchProfile set density=nominal + cooling + tier-floor bump, mirror applyUseCaseProfile. Store additive archKey (default null).
CapexEngine peak-provisioning — arch terpilih menerapkan MARGINAL power-plant uplift (powerProvisionUplift = (peak/nominal) ÷ baselinePeakRatio 1.2, floored 1.0) HANYA di electrical/UPS/generator (bukan raw peak/nominal — CPU-era base $/kW sudah harga ~1.2× headroom via NEC 125% + Google power-provisioning literature, jadi raw ratio = double-count). GB200 → ×1.333. GB300 tambah cooling-kit line ($50k×rack) ke total. Interconnect IB/Ethernet = field terpisah, EXCLUDED dari infra total (fabric IT di luar scope CAPEX). 2 value-trace node baru (req.provisionedRackKw, capex.provisionedPowerUplift).
Hover tooltip sitewide (owner "banyak tooltip tidak ada"): ~85 chart Chart.js di 21 halaman user-facing (article-2/3/17/18/24/25/26/27, tier-advisor, carbon-footprint, dc-market-tracker, tia-942-checklist, water-system, geopolitics-3, FF-1/2/3, spares-readiness — melengkapi v1.99.7 tco/cx/pue/roi) dapat interaction:{mode:'index',intersect:false} (line/bar/scatter/radar) atau {intersect:false} (doughnut/pie/bubble) → tooltip muncul saat hover-dekat, bukan hanya di titik persis. Callbacks existing dipertahankan; chart yang sudah ber-interaction dilewati.
DC Hub calculator charts — fix stretching + hover tooltips
Fixed
Chart "continuous stretching" (owner screenshot tco-calculator): .tco-chart-canvas-wrap + .tco-pro-chart-wrap pakai flex:1 + height:100%!important di flex-parent tanpa tinggi tetap → Chart.js responsive membaca clientHeight → set canvas → resize loop → canvas meledak vertikal saat hover. Fix: tinggi deterministik height:340px/300px + max-height (loop putus, mirror pola terbukti .chart-container{height:280px}). Verifikasi headless: canvas 340→340 STABLE setelah 5× hover (was: tumbuh tak terbatas).
Tooltip value tidak keluar saat hover ("banyak tooltip tidak ada"): Chart.js 4.4.x default intersect:true → tooltip hanya saat kursor TEPAT di titik. Fix: interaction:{mode:'index',intersect:false} di 17 chart (tco 3, cx 6, pue 4, roi 4) — line/bar mode 'index' (semua seri di X), doughnut/pie intersect:false saja (nearest). Verifikasi: tooltip muncul on-hover-near (pue/roi ✓ headless). opex-calculator TIDAK disentuh (standing order).
Adversarial verify v1.99.5 (deploy): Diagnostics Center struktur/deep-link/skip-chip + Trace English + 3 enhance (Copy chain/Expand all/leaf summary) semua PASS; menemukan 5 fragmen ID sisa di Center → difix di ronde ini.
DIAGNOSTICS CENTER + Trace notes → English + enhance
Added
Diagnostics Center (tab SUPPORT baru): agregasi 12/13 collector diagnostik ke satu permukaan — semua indikator merah/amber aktif lintas engine, dikelompokkan per severity (N critical · M warning), tiap temuan → kartu (surface chip, metric, angka value/threshold, detail) + tombol "Open →" setActiveTab ke halaman sumber. lib/diagnostics.ts type kanonik DiagFinding + normalizer (menyatukan 4 bentuk Finding berbeda antar file) + registry (tiap run membangun model dari store + adapter/engine chain SAMA dgn halaman; try/catch per collector). MonteCarlo di-skip JUJUR (10k iterasi sinkron = jank) + chip "skipped (honest)". Empty-state jujur "No active red indicators — everything within limits ✓". Cakupan 12/13 dinyatakan.
Trace enhance (owner): tombol Copy trace chain (seluruh rantai formula+nilai+sumber tree text → clipboard), Expand all (buka seluruh pohon dep sekaligus + filter saat >6 dep), leaf composition summary ("3 inputs · 2 engine constants · 1 screening").
Changed
Trace notes DCMOC → English (owner "change it in english"): 147 node value-trace.ts (label + formulaTemplate kata penghubung + provenance) + seluruh UI string TraceValue.tsx ("Your input / Engine (sourced) / Computed / Screening estimate", "This number is computed from:", "Open / edit in tab", "External source", tooltip) → English natural. traceId/deps/sourceKey/external.href/nilai UTUH → trace-parity tetap 117/117. Diagnostics Center juga English.
Verified
tsc/build · walk 24/0 · synergy 6/0 · trace-parity 117/117 (teks-only, nilai popover tak berubah) · export 44/0 · bindings 85/0 (catalog regen — Center consumer baru) · screenshot Center + trace-EN.
v1.99.4PATCH
Diagnostics Tier-2/3/4 — SEMUA indikator merah kini ber-guidance
DisasterRisk High/Extreme → dekomposisi per hazard engine-live + trade-off asuransi vs hardening vs EAL (basis ROI mitigasi diverifikasi reproduksi angka engine).
FuelGen CO₂ → HVO swap delta live + abatement $/t vs harga carbon negara (DATA.envCosts) + offset compliance/voluntary + lever run-hours (re-run grid engine).
Strategic bottleneck → formula feasibility di-extract single-source + lever grid/land marginal (MW per MVA/acre); Talent Very-Difficult → matriks premium via re-run TalentAvailabilityEngine nyata (temuan jujur: time-to-staff engine tak sensitif salary → note).
ScenarioComparison arah warna delta kontradiktif (CAPEX naik = hijau di KPI vs merah di tabel halaman sama) → merah = lebih buruk konsisten (higherIsBetter IRR/NPV + invertDelta CAPEX/OPEX/PUE/Staff).
Bug #333 kambuh: revenue $120 hardcode di ScenarioComparison → DEFAULT_REVENUE_PER_KW_MONTH 280 single-source (IRR/NPV komparasi kini konsisten dgn MC & surface finansial lain).
ReportDashboard insight statis ("NPV positif <3yr payback" bisa bohong) → rule-derived dari financialResult live.
Beberapa dashboard: useEngineReady() dep fix (recompute saat engine telat load).
Verified
tsc/build · walk 24/0 · synergy 6/0 · trace-parity 117/117 · export 44/0. Diagnostics program COMPLETE (kontrak collector siap Diagnostics Center — DEFER sadar).
DCMOC: lib/cloudProjects.ts (size-guard 240KB pesan jujur tanpa auto-trim; validasi bundle version+10-slice; error tabel-belum-ada → link Owner Action Board), section "Cloud (opsional)" di Projects (label jujur "localStorage tetap primer, tanpa sinkron otomatis"; badge ☁ tersinkron; Share modal salin URL + Cabut), view-only ?share=TOKEN: backup viewer ke sessionStorage DULU → fetch anon → restore → readOnly lock (guard store) + banner "Mode lihat-saja · Keluar & kembali ke data saya" (restore utuh + strip query); share view bypass login (pseudo-viewer), StrictMode-safe.
Added — Diagnostics Tier-1 (standarization/DIAGNOSTICS_STANDARD.md baru; kontrak collectDiagnostics per file)
Financial NPV/ROI merah klik → lever bisection nyata ("Revenue +117% ke $357/kW/bln utk NPV=0; capex-saja unreachable — jujur").
Benchmark grade F/D klik → kontributor terburuk + lever PUE diskret live ("1.50 p50 → RDHx 1.18 p23, overall D→C") + lever kontinu ke band p75; chip drift → panel nilai vs band + arah koreksi + kebijakan drift + ↗ Model Calibration.
Compliance <80 klik → item mandatory yang belum + biaya per item + lever "79→93 · $10,000 initial" (formula runtime-verified vs engine).
CapacityDashboard At-Risk ≥60 klik → atribusi kontributor via neutralize-rerun + lever defer-IT/kompresi-jadwal ter-bisection.
Maintenance riskExposure >50k klik → dekomposisi ber-chip parity "≡ engine" + lever upgrade SLA (net hemat/tambah vs DATA.omContracts) + lever desain Tier IV.
Semua: threshold satu konstanta dgn pewarnaan; honest-unreachable; ekspor collector.
Guided tour DCMOC (TourOverlay.tsx): 8 langkah spotlight (context bar → 13 engine → angka ƒx → panel "kenapa?" → chip rec: → Data Library → Knowledge Base → Export PDF) — teknik spotlight spares di-port ke React portal, positioning clamp viewport + fallback center, Esc/klik tutup, a11y dialog+focus; auto-launch sekali (flag dcmoc.tour.v1), tombol ? replay di header. Probe di-seed flag agar tak terhalang.
Chip global "⚠ perubahan tidak tersimpan" di Shell header — usePersistHealth() subscribe flag persistFailed 5 store tracking; tooltip menyebut store yang gagal.
Changed
Responsive 10 titik (17 baris, 8 file, desktop tak bergeser): KPI grid clamp xl (Executive 7-col, GridReliability 6-col), nested grid md:, min-w semua tabel lebar (AssetLifecycle 720px, ScenarioComparison/Report/Investment 420-640px ×11 tabel), gap sm: FuelGen, label utilization w-24 sm:w-28 truncate.
Verified
tsc/build · walk 24/0 · synergy 6/0 (probe seed diperbaiki — sed arrow-body) · trace-parity 117/117 · export 44/0 · screenshot tour step-3 spotlight ƒx.
v1.99.1PATCH
SHIP 2 Arc-2: KORPUS LOOP HIDUP + sumber APAC/Indonesia
Added
3 extractor pattern baru (+unit test positif/negatif di gate, guard "$/kWh"): construction_months, capex_usd_per_kw, rack_density_kw — fakta jadwal konstruksi NYATA pertama masuk (EIAR Google Dublin 27 bln, Vantage 30/60 bln) + rack density Uptime (7/9/50 kW).
9 sumber APAC/Indonesia (7 ter-fetch): DCI Indonesia (IDX), NeutraDC Nxera Batam 18→54 MW (Telkom), Komdigi PDN 2024, IMDA Green DC Roadmap (300 MW, PUE ≤1.3) + factsheet, NEXTDC FY24 (capex A$1B, 172,6 MW contracted), YTL Kulai 500-600 MW, METI Energy Plan 2025. Gagal jujur: BKPM (TLS chain rusak — dicatat), 1 lainnya. fetch.mjs +flag per-source insecure/referer.
corpus-facts.json kini output pipeline deterministik (aggregate.mjs; sort stabil, quote 240 char) — langkah manual dihapus; diff migrasi diverifikasi (+fakta baru saja, 0 hilang). Konsumen Data Library dibetulkan (count → facts.length).
README recipe refresh lengkap + kebijakan drift.
Verified — LOOP TERBUKTI
Regen penuh (fetch→extract→aggregate→terser→catalog) → dc-corpus 2491/0 (fakta 597→649, research docs 35→39) → kalibrasi tetap 19/0 (band bergeser mengikuti korpus, engine tetap in-band — inilah loop-nya).
Catatan metodologi jujur: mapping-4 di-downgrade dari rencana "fleet-PUE inferens" ke "koherensi capacity-factor" — PUE tak dapat diinferensikan sahih tanpa energi IT per dokumen.
IT Load (Requirements) tidak bisa dihapus/ketik ulang digitnya (owner): NumInput fully-controlled + konsumen hanya commit bila valid (≥100 kW) → tiap ketikan di bawah ambang snap balik. Fix: draft buffer saat fokus di NumInput (berlaku semua field angka Requirements) — bebas kosongkan/ketik, commit tetap tervalidasi, blur mengembalikan nilai valid terakhir bila input tak sah. Probe headless: clear ✓, 1 digit ✓, komit desimal ✓.
v1.98.5PATCH
null-honesty 16 family + hardening 5 store tracking + smoke produksi
Fixed
Sweep null-honesty narasi (16 family): 3 klaim palsu lagi terbunuh — Operations "Healthy · 100% PM Compliance" saat belum ada log PM → "Plan Mode — belum ada tracking"; Site Intelligence "0/100 · Challenged" + false HIGH sebelum analisis → "Not Analyzed"; Financial NPV null → "Not Evaluated" (bukan "$0 · NPV negatif"). 13 family lain diverifikasi aman (metric selalu terhitung); jalur nilai-nyata byte-identical. Konsumen PDF + panel on-page ikut jujur.
Hardening 5 store tracking (sisa audit A 19-Jul): opsLog/cxTracking/financialTracking/constructionTracking/sustainability — payload localStorage versioned {version:1} + migrasi legacy transparan; quota-fail tidak lagi senyap (flag persistFailed non-persisted + warn dev sekali + auto-clear saat pulih); cap FIFO 500 pada semua array unbounded (alarms/incidents/tickets/issues/punch/revisions/initiatives); seed hygiene diverifikasi (seed hanya first-run, tidak pernah menimpa data user).
Verified
Smoke produksi live (resistancezero.com): manual hub tampil 33 manual · pill "Technical Manual ↗" live di kalkulator · dcmoc serve normal.
Theme manual/ sinkron sitewide: 41 halaman manual membaca key theme sitewide (fallback rz_theme legacy) dan menulis keduanya — pilihan dark/light kini konsisten antara manual/ dan seluruh site (pre-existing sejak halaman manual dibuat).
3 straggler biner .html di tools/dc-corpus/raw/ (SEC 10-K pre-hardening) dihapus → audit-version-stamp strict kembali exit 0.
Changed
llms.txt regen: +41 entri manual (170 halaman).
Allowance ShiftEngine didokumentasikan eksplisit sebagai shift-pattern-based BY DESIGN (bukan gap country-data): benefits per negara sudah di benefitsOverheadRate/socialSecurityRate — tabel negara di allowance = double-count. Menutup item MEDIUM terakhir inventori DM.
Section manual/ (41 halaman technical manual) de-orphan: sitemap 115→156 URL (generator build-sitemap sudah include, tinggal stale — regen); 39 inlink baru (footer+dropdown index.html "Technical Manuals" + pill "📖 Technical Manual & Methodology ↗" di 37 halaman tool, theme-aware AA; opex-calculator TIDAK disentuh per standing order); search-index 98→139 entri (command palette otomatis). Dark-coverage 116 CLEAN.
Benchmarks "Corpus Distributions": 12 baris distribusi (PUE/WUE/Capacity/Investment $B/Renewable × segmen finance/hyperscale/pm/research/spec) — n + p10/p50/p90 + bar interkuartil + marker proyek live via interpolasi persentil piecewise ("PUE 1.50 = ~p81 di hyperscale n=30"); chip "n kecil — indikatif" (n<5); nilai proyek dari calculateCapex live (bukan lookup statis).
Data Library DC Corpus: filter segmen dinamis + drill-down klik baris → 597 fakta mentah (nilai, company, tahun, link source_url, kutipan verbatim) via artifact baru corpus-facts.json.
Fixed
Narasi assessment Commissioning: readiness null tidak lagi dirender "0% Early Stage" → "Not Started — plan mode" jujur (kelas bug advisory phantom v1.98.1).
Catatan follow-up: manual/ pakai theme key rz_theme vs sitewide theme (pre-existing, tidak sinkron) — kandidat penyatuan.
v1.98.2PATCH
USER_MANUAL DCMOC dirombak total — mandat owner
Changed
dcmoc/USER_MANUAL.md 191 → 355 baris: daftar LENGKAP 49/49 engine (26 dikonsumsi DCMOC — kegunaan detail + fungsi kunci + halaman pemakai; 19 site/artikel via KB; 4 no-consumer dijelaskan jujur) diverifikasi programatik ≡ engine-catalog.json; tabel 20+ keluarga DATA bersumber; fitur platform per menu (trace ƒx, panel Kenapa?, prefill, Env Costs, Data Library, KB, peta, PDF, kalender, kejujuran presentasi); gate kualitas; changelog ringkas v1.89→v1.98.1. Deskripsi "untuk apa" bersumber DATA.sources katalog, bukan karangan.
v1.98.1PATCH
wave M/L audit tuntas: kontradiksi Architecture + kejujuran plan-mode + Asset MTBF + air ganda + LCC hidup
Fixed
Architecture 3 kontradiksi: profil default "ai-liquid" tak pernah ter-apply → chip drift amber "Profile recommends D2C Liquid — not applied · apply"; Power Topology bind sim.powerRedundancy (bukan tabel tier) — "2N — two fully independent active paths"; ASHRAE compliance kini baca density ceiling (air+60kW → 40% + "liquid/D2C required", rail Review + PDF ikut).
Asset MTBF/MTTR "—" semua baris: field mismatch mtbfHours vs engine mtbf — kini terisi IEEE-493 per class; "—" tinggal class yang memang tak ada di tabel (header jujur).
Dashboard LCC (15yr) "—": guard memanggil models.tco.totalCost yang tidak ada — fn engine sebenarnya lifecycleNPV → KPI hidup (TCO diskonto 15 thn + siklus refresh); node trace fin.lcc15 mirror (parity 117/117).
Readiness advisory phantom (readiness null dianggap 0) + Ops PM Compliance sub jujur; insight duplikat Requirements dedup (rule lokal vs flag engine).
Plan-mode tidak lagi "berprestasi": Construction Progress/AC/SPI/CPI + Financial health "A (baseline)" + Results dimensi Construction/Financial ber-chip "baseline" + footnote komposit "2 dimensi masih baseline plan-mode".
4 IRR diberi basis eksplisit + tooltip rekonsiliasi lintas halaman (Dashboard "unlevered after-tax · ramp · 15 thn"; Results "screening — unlevered 15y flat"; angka memang sah berbeda — kini dijelaskan, bukan disamakan).
Air Sustainability disatukan berlabel: KPI = volume engine pre-climate (≡ node trace), kartu Env menampilkan kedua baris (engine → ×climate ×1.2 → biaya) — tidak ada lagi dua angka tanpa penjelasan.
Site single-site tidak lagi "Recommended/Best" (komparatif butuh ≥2 site); basis note outage blended vs SAIDI mentah. Fire CAPEX "—" → tombol "run the CAPEX Engine →". Jahitan bahasa EN/ID dirapikan ("Penilaian: …").
16 halaman manual/*.html (technical manual per kalkulator, sudah lama ada tapi untracked) ikut tercommit.
EA-2 KORPUS BESAR 47 dokumen + audit visual 2 ronde: 4 bug kalkulasi HIGH fixed
Added — EA-2 Big-Project Corpus (owner: "crawl semua — PM, tech spec, tender, research, calculation")
47/48 dokumen publik baru ter-ingest (markitdown-only, biner dihapus, 60MB cap): spec 15 (OCP ORv3/immersion/manifold, ASHRAE TC9.9 liquid/water-cooled, NVIDIA DGX H100/GB200/GB300 RA, Green Grid PUE/WUE, Schneider WP110 AI) · pm/tender 10 (EIAR Google Dublin/Vantage/CyrusOne, Loudoun 5.33GW brief, ADB IFB, PJM/Dominion DC load, RFP colo) · finance 9 (10-K Equinix/DLR SEC EDGAR, deck Equinix/IronMountain/NTT ¥1.5T, Keppel DC REIT, Digital Core) · research 14 (LBNL 2024 176→580 TWh, IEA Energy&AI 415→945 TWh, arXiv AI-thirsty/POLCA/cooling-RL, EPRI, DOE, Uptime Survey 2024 PUE 1.56).
Korpus: gate 389 → 2.451 assert hijau — fakta PUE 69 · investment $B 134 · renewable 104 · WUE 12 · kapasitas MW lintas segment finance/hyperscale/pm/research/spec; Research Library 9 → 35 dokumen (KB) + Data Library DC Corpus persentil baru. Provenance (source_url + kutipan) wajib per fakta.
Fixed — audit visual 2 ronde (4 HIGH + 2 M + 3 kecil)
H1 CAPEX basis salah 1.0 MW/USA di sesi baru (menular Dashboard/Results/Financial): default capex store tidak pernah direkonsiliasi dgn simulation (2.5 MW/ID) sampai user mengedit requirement → $9.07M @1MW USA → $14.75M @2.5MW Indonesia (constructionIndex 0.65 kini aktif); rekonsiliasi on-rehydrate tanpa loop; $/kW dibulatkan.
H3 Pro-Forma Energy ~1000× off: pembagi /1000 salah unit ($/kWh diperlakukan $/MWh) di 3 lokasi FinancialDashboard → Energy $3K → $2.96M (NPV/IRR/sensitivity pro-forma kini sebasis).
H4 Commissioning racks 417 & "Tier IV": programRich tanpa rackDensity (fallback 6kW) → bucket ai_hpc (racks 34, konsisten fleet); label tier kini bind sim.tierLevel (Tier III), IST diatribusikan ke config 2N. Trace programRich ikut dibetulkan.
M: kolom HEADCOUNT proyeksi 5-thn kosong (field headcount vs totalHeadcount) · deep-link Monte Carlo tidak pindah tab (initialTab useState stale → effect sync) · breadcrumb FAQ.
Env costs benar KOMPUTASI per negara (SG $520K vs ID $116K vs US voluntary $185K, chip+basis+band flip). ƒx popover angka live + drill. NO-GO lever bisection nyata ("Revenue +22% ATAU CAPEX −29%"). Kalender per-class ×N tanpa baris #unit. Capacity chip forecast-aware. Site axis explain. Coverage 98.3% render.
1 FAIL environmental: CORS /fx dari origin localhost (worker allowlist — fallback snapshot jalan; bukan bug kode; produksi origin resmi tak terdampak).
Capacity banding forecast-aware — keputusan owner "go ahead"
Changed
Capacity Utilization status kini forecast-aware: chip OK/Watch/At-Risk dihitung dari puncak forecast pertumbuhan (share kapasitas design) bukan util saat ini yang struktural ≈1/(1+margin); tiap sistem dapat estimasi tahun exhaust ("At Risk ·~2029") — semua baris scale ∝ IT MW (power/cooling via facility, rack/space/network via racks), overlay di capacity-adapter.utilization() (field additive forecastPct/exhaustYear, fallback aman bila forecast kosong). Hover % = "Sekarang X% · puncak forecast Y% · exhaust ~tahun". Basis note diperbarui.
Results dimension explain (DL final): skor dimensi < 60 → chip Poor/Fair ⓘ klik → alasan formula live + lever solved atas fungsi dimensi yang SAMA dgn render (extract single-source dimension-explain.ts): capex bisection $/kW, sustainability upgrade cooling via pueMatrix ("air→inrow: skor 20→66"), financial revenue/capex bisection lewat rantai IRR engine, tier upgrade, requirements field-fill (+16.7/field) — + catatan jujur per dimensi (renewable TIDAK di formula PUE, hurdle 10% = konstanta scorecard). Grade < B → ringkasan 2 dimensi terlemah + apakah lever cukup mencapai 70 (dihitung).
Data Library "Country Coverage": matriks 40 negara × 30 field ✓/— dihitung live dari countries.ts — 98.3% (1.180/1.200); satu-satunya gap = HVO price kosong 20 negara (pasar belum ada); panel klik per negara daftar field kosong (actionable).
Fixed
Staffing "Cost per MW" benar-benar dibagi MW IT (sebelumnya ÷1 = total payroll); trace node diperbarui.
Capacity Utilization dapat basis-note jujur (util current ≈ 1/(1+margin) by construction; exhaustion ada di Forecast).
DL Site Intelligence: chip band Poor/Fair klik → panel alasan (kontributor terbesar weight×value live) + lever DIHITUNG via scoreSite nyata ter-bisection ("SAIDI ≤407 → axis 60 Good"; "cable landings 1→4 → 66"; unreachable → catatan jujur) + tombol Edit Criteria / deep-dive tab.
DL Capacity: baris utilization dapat chip OK/Watch/At-Risk klik → panel reason + lever solved atas rantai adapter yang sama (defer IT load → keluar band; margin honesty note) + tombol Phase Plan/Requirements di remediation rows.
Notes (kandidat pagi, terdokumentasi jujur)
Staffing "Cost per MW" ternyata dibagi 1 (bukan MW aktual) — node trace mendokumentasikan basis; fix menyusul.
HVO jadi opsi bahan bakar NYATA (FuelGen): baris perbandingan HVO vs diesel (harga negara × pajak, litres ×1.03 EN 15940, CO₂ −90%, delta $/thn) untuk 20 negara ber-harga HVO.
Changed (DM fase 3 — dead data dikonsumsi, scoring dinormalisasi; fallback verbatim semua)
Commissioning explainers (DE): chip L1-L5/FAT/SAT/IST bernama penuh + tooltip (label live engine + definisi ASHRAE Gl.0/BCxA berlabel); grup checklist derived dari equipScale (×N live; sistem 0 unit tidak dirender) — totals/readiness ikut config nyata.
CDU page rebuild (DE): 5 section engine-real — Sizing (models.cdu.size), tabel Hydraulics (Darcy/Haaland + Magnus dew point, bar + head), PUE mini-bars air vs liquid (pueMatrix), Refrigerant 9-baris GWP/COP + selected-summary (user vs auto), Deep-Sea advanced (intake @depth, seawater flow, pump, PUE ≤1.15) gated tick + teaser 1.6.
DA3 snapshot jujur: kartu ACTIVE Projects = live sim (chip hijau); kartu tersimpan "saved snapshot · tanggal"; badge amber "differs from current project" (Projects/Scenarios/Portfolio; portfolio +savedAt additive).
Monte Carlo revenue basis divergen: hardcode $120/kW/bln → DEFAULT_REVENUE_PER_KW_MONTH ($280 single-source) — MC sebelumnya menghitung distribusi di basis revenue berbeda dari semua permukaan lain.
2 tooltip escalation Pro-Forma salah copy-paste dikoreksi.
Changed
#333 Financial dedup: Lease Term input → derived dari Requirements contractDuration (+link ↗); Tax Rate sync reaktif negara; MC dapat kartu "Base Case" provenance (project chip + ↗); input analisis lokal diberi hint eksplisit.
EB trace wave-3: 19 node baru (staff.monthlyCost, constr.spi/cpi/ev/progress/forecast, cx.readiness/tests, results.score+4 dimensi, asset.fleet/health/replacement) + wraps di Staffing/Construction/Commissioning/Results/Assets; coverage gate permanen di walk probe (trace-coverage x/y per halaman, floor ≥30% halaman ter-instrument) — walk kini 24/0.
DN consumers: biaya kontrak SLA Maintenance dari DATA.omContracts (NBD≈on-call/4hr≈preventive/2hr≈comprehensive × IT kW; toggle third-party ×0.65 + aging ×1.5; fallback verbatim); Spares tab band harga; Data Library +3 dataset live (O&M Contracts, Spares Pricing, Env Costs sortable 40 negara).
Site Intelligence full trace (ƒx): 30 node site.* (5 engine terintegrasi: grid/disaster/tax/talent/compliance + leaf panel SAIDI/tarif/AQI/WRI/PGA/tax) — semua angka kartu Integrated Analyses + Detail Panels klik-to-trace.
Edit Criteria PREFILL: field kosong menampilkan nilai efektif — baseline negara (chip cyan, dari tabel COUNTRIES) atau screening typical (amber); store tetap unset (= semantik baseline). Preset Grid Voltage site +11/20/66 kV.
1.6 prefill DINAMIS (CB): lib/recommended.ts — 13 rule rekomendasi dihitung live dari parameter (substation by band MW, deep-sea dari poster spec engine, refrigerant lowest-GWP by cooling, fuel by tier, fee AACE band, solar 10% IT + BESS 2h); chip rec: X klik-apply + "Terapkan semua rekomendasi"; tanpa overwrite diam-diam. Field Fuel Autonomy ditambah di 1.6.
Decision explainability (DL, Phased Financial): verdict GO/NO-GO klik → alasan angka live + lever TERUKUR via bisection 36-iter pada model cashflow yang sama (Revenue +X% ke $Y/kW/bln, CAPEX −Z%, catatan hurdle); KPI merah klik → panel fase terburuk; PDF dapat section "Decision Rationale & Required Changes".
Staff Model (sim): slider AQI predefined dari environment.baselineAQI negara + turnover dari DATA.attritionFactors engine (chip baseline/override + reset); Monthly Hidden Loss klik "▸ kenapa?" → formula live + breakdown per-hire + lever terukur (reset baseline → hemat $X/bln, shift 12h, link lokasi).
Kalender maintenance dirombak: baris per SYSTEM ×count (222→19 baris; 500MW: 34.815→20), toggle Week/Month, blok ×N warna per tipe, hover panel kaya, klik → detail event di bawah grid.
Fixed (3 bug nyata)
IRR tax incentives ×100 dobel (site-intel — sumber "5780%" di screenshot owner): engine sudah mengembalikan persen; render & trace disinkronkan.
PI "0x" (Phased Financial): formula meng-nol-kan PI saat NPV ≤ 0 — kini (NPV+investasi)/investasi benar (mis. 0.65x), propagasi ke narasi + PDF.
Kalender maintenance blank di fleet besar: filter nama per-unit #idx tidak pernah match event batch (batch N — X units) sejak v1.91.4 — baris kosong ratusan; agregasi per-class baru menghilangkan akar masalah.
Changed
Dedup input (owner): Staff Model Config Region & Country → display derived "project" + "Edit di Requirements ↗" (satu sumber); Simulation Year diberi keterangan jujur (kontrol proyeksi analisis); dead code region dibuang. Substation dilabel "Dedicated 20–33kV (5-20MW)" (PLN 20kV, basis biaya sama) di 1.6 + Capex.
?v engine loader UNIFIED 2026-07-20-b (57 loader; sebagian stale 2026-07-16 ikut tersapu).
Value Trace instrument wave-2 (5 halaman engine): KPI ber-ƒx di Reliability (Tier Target → rel.tierTarget), Financial (Total Budget → capex.total), Operations (Availability Target + Energy Cost 24h → node baru ops.energyCostDaily), Sustainability (PUE Design → engine.pueMatrix, Carbon Annual → carbon.annualEmissions), Architecture (IT Load, Facility Load, Availability Target). Node ops.energyCostDaily ditambah ke graf value-trace.ts (acyclic, gate 73/0 tetap hijau).
RZExplain coverage sweep (CC): 42 explainKey di 4 file section Requirements (was 4, satu rusak mv-switchgear→voltage); 23 istilah baru di tools/explain-extra.json (budget-usd, design-margin, p50/p80, aace-class, newsvendor, spi/cpi/evm, saidi, pga, water-stress, deep-sea-depth, dll) → DB regen 802 entri (js/rz-explain-db.js), test-explain-db.mjs 10/10, layout dcmoc ?v=2026-07-19-cc.
Spares on-page assessment: panel Executive Assessment + prioritized actions (ReportNarrative spares family) di atas grid metrik Spares Optimization — fill-rate & classes-at-risk dinilai on-page, bukan hanya di PDF.
Changed
Staffing Cost Structure Decomposition dirapikan (owner: "chart aneh"): bar vertikal menggantung diganti 100% composition bar + baris waterfall horizontal kumulatif (offset Σ berjalan, nilai + persen + deskripsi per kategori) — geometri deterministik, tidak ada bar melayang/overflow.
TRACE VISIBLE everywhere it exists + final-audit fixes
Added
Trace "ƒx" badge (owner: "fitur trace kok belum ada" — it existed but was invisible): every traceable number now shows a small violet ƒx badge; graph +3 nodes (capacity committed MW, annual emissions chain, NPV screening chain); Capacity page KPIs (IT Load, Facility Load) now click-to-trace like Dashboard + CAPEX.
Fixed (final total audit, 2 agents)
localStorage migration: capacityPhasesCustomized gets a safe default on old persisted blobs (phase derivation can no longer break on reload).
New candidate sites + portfolio sites now seed from the LIVE project country + real capital coordinates (were hardcoded 'ID'/schematic).
Dead code from the tab deletion cleaned (DashTopBar props/ChevronDown, dashboard tab state); projects console.warn dev-guarded.
v1.94.9PATCH
on-page guidance — Site Intelligence; pattern complete
Added
Site Intelligence rail gains the on-page guidance panel (5th and final planned adoption): site band chip + narrative (leading risk factor named) + prioritized actions. The assessment pattern now covers Carbon, Reliability, Results, Commissioning and Site — every major grade/score in the app explains itself and says what to fine-tune.
v1.94.8PATCH
on-page guidance — Commissioning
Added
Commissioning Engine gains the on-page readiness guidance panel (4th adoption): readiness band chip + narrative (level composition, failed tests / open issues gating) + top-3 prioritized actions — live above the progress view.
v1.94.7PATCH
on-page guidance — Results
Added
Results Engine gains the on-page guidance panel (3rd adoption of the pattern after Carbon + Reliability): composite grade chip + narrative (why the band, strongest/weakest dimension) + top-3 prioritized actions naming the dimension to work first — live beside the score hero.
Strategic Planning explains itself and stops re-asking (owner: "bingung untuk apa; parameter tidak perlu diisi karena sudah ada"): a purpose banner states the three analyses (Feasibility fit / Expansion timing / Acquisition buy-vs-build) and the rule — inputs that already exist elsewhere are LOCKED here (land/grid/climate from Site Intelligence, target PUE from the engine, current footprint ≡ Requirements IT load, capex $/MW ≡ CAPEX engine) with edit-at-source hovers; only analysis-local parameters (growth %, horizon, comparables) stay editable.
v1.94.5PATCH
At-Risk remediation guidance — capacity equipment
Added
Every non-OK capacity status now says exactly WHAT to fine-tune (owner: "At Risk itu apa maksudnya — harus ada guidance per equipment"): computed from the same scaling divisors — e.g. "Utilisasi 122% > 85%: tambah +45 unit (250→295) untuk target ≤80%, ATAU turunkan beban 12.5 MW (phase plan/IT load), ATAU naikkan rating unit" — hover on the status chip AND remediation lines under the table (Watch rows get a plan-ahead variant). Pattern rolls out to reliability SPOF / spares / sustainability chips next.
v1.94.4PATCH
Cx level explainers
Added
Commissioning levels explain themselves (owner: "L1 itu apa kepanjangannya, misal FAT"): every readiness key renamed with its full meaning (L1 — Factory Witness, L2 — Site Inspection, L3 — Startup/Pre-Functional, L4 — Functional Performance, L5 — IST Integrated, SAT/FAT expanded) + hover explainer describing what each level covers (industry Cx Level 1-5 basis) on both the checklist accordion and the slider rows.
v1.94.3PATCH
site score explainers — every criterion self-explanatory
Added
Site Score & Compare rows explain themselves (owner: "score ini tidak menunjukkan apapun — get it done"): every criterion label carries a hover explainer (what it measures, the deriveFactors formula behind it, and an honest note when a low value just means site data hasn't been entered — country baseline in use) + each score cell gains a band chip ("91 · Excellent", "10 · Poor"); Natural Risks band inverts (lower = better). Explainer map lives in AXIS_EXPLAIN (site-intel types) — one source for table + radar.
v1.94.2PATCH
dashboard integrity — fake selector + fragment tabs deleted
Changed
The fake dashboard project dropdown is gone (owner-caught: "Indonesia DC Campus — 3MW" hardcoded label vs 2.5 MW context bar): the header now reads LIVE from the shared stores — real project name + "2.5 MW IT · design 3.0 MW" so the IT-vs-design distinction is explicit, one source with the context bar.
Engineering/Construction/Operations/Financial/Analytics/Reports dashboard tabs DELETED (owner: "isinya cuma potongan Executive Overview"): they were honest subsets; the full Executive Overview is now the single dashboard view (engine deep-dives live in their own sidebar pages).
v1.94.1PATCH
map integrity — real styles, no fakes, clean fallback
Changed
Map style tabs are now REAL (owner: "3D terrain dll cari repos, kalau tidak ada delete"): Map = OpenFreeMap vector · Satellite = Esri World Imagery raster (free tiles, mandatory Esri attribution rendered); fake Hybrid + 3D Terrain buttons DELETED (3D needs a DEM terrain source — backlogged, not faked).
"Wave aneh" fixed: the schematic SVG fallback now renders ONLY when the real map fails to load (onStatus callback) — no more decorative coastline under a working map.
Context-bar hover cleaned: the raw black title box is gone; the data-vintage note lives on the small "data 2026-Q1 ⓘ" chip only.
v1.94.0MINOR
Pro-Forma predefined visible + lease-term dedup
Changed
Financial & Revenue parameters announce their predefined basis (owner: "dibuat predefined, saya tidak perlu isi, tapi bisa override"): a violet banner states every parameter auto-derives from data (country tariff/tax/inflation · tier multipliers · CAPEX-linked NRC) with manual edits preserved (the auto-derive + userEdited guard already existed — now visible). Lease term dedup: contract years now follows Requirements 1.1 Contract Duration (one source) instead of a hardcoded 10.
v1.93.9PATCH
EA6b — Research Library in the Knowledge Base
Added
Knowledge Base "Engine Models" tab gains a Research Library card (owner: "journal/research masukkan ke knowledge base"): the corpus document index rendered from auto-generated research-library.json — each source document (Google Environmental Reports, operator sustainability hubs, Uptime/IEA pages) with a direct link, segment, fact count and metric coverage. The aggregate pipeline emits this index; corpus refresh updates the card automatically.
v1.93.8PATCH
Benchmarks — project position vs the live corpus
Added
Benchmarks page opens with "Posisi Proyek vs Korpus Publik Multi-Sumber" (owner: "jangan cuma JLL/CBRE; benchmarks kurang detail"): per metric (PUE, site capacity, renewable share) a distribution bar shows the corpus p10-p90 band (interquartile shaded, median tick) with YOUR project's marker + percentile chip ("proyekmu: 1.22 (p25-50)") and full provenance line (n facts · document count · companies). Data = live DATA.benchmarksCorpus; corpus refresh updates the page automatically.
v1.93.7PATCH
EA6 — DC Corpus surfaces in the Data Library
Added
Data Library gains a "DC Corpus" tab (first tab): the multi-source public-data distributions rendered live from DATA.benchmarksCorpus — per metric × segment rows with n, p10/p25/p50/p75/p90, company list and document count; auto-generated chip + provenance note (every underlying fact carries source_url + verbatim quote). Regenerating the corpus pipeline updates this tab with zero manual edits (auto-link chain).
v1.93.6PATCH
corpus round 2 — 92 facts, 5 metric families
Changed
Corpus extractor round-2 patterns (phrasings actually present in hyperscaler reports): water (million gallons), investment ($B), energy (GWh), WUE loose-form — corpus now 92 facts across pue/capacity/renewable/water/investment; DATA.benchmarksCorpus regenerated (5 metric families with p10-p90 distributions), full auto-link chain green.
v1.93.5PATCH
Financial input dedup — batch 1
Changed
Tax Rate is no longer a manual input on Financial (owner: "input duplikat di menu lain hapus"): it renders as a derived read-only value from the project country's economy.taxRate (emerald "country" chip, single source — change the Country in Requirements and it follows). Revenue/escalation stay editable but are already country-predefined (auto-derive with manual-edit guard). More dedup (project life ↔ contract duration, Pro-Forma fields) continues per task #332/#333.
v1.93.4PATCH
tooltip coverage — Field primitive cascade
Added
Every Requirements form label is now hoverable (CC toward 100%): the shared Field primitive gains built-in hover — explainKey renders the RZExplain ⓘ panel (779-entry DB), otherwise the hint doubles as the hover title, otherwise a generated fallback — ONE primitive change cascades to all ~67 Field usages; cursor-help affordance on labels. First explain keys wired (tier, SLA, rack density, contingency/margin, grid voltage).
v1.93.3PATCH
predefined values batch 1 + cascading country select
Added
Predefined values, editable (owner mandate, first 4 fields): Peak IT Load auto = IT Load ("menyamakan"), Avg IT Load auto = 75% of peak (AI-cluster utilization band, screening), SLA Target auto = tier availability target (Uptime engine), Budget auto ≈ CAPEX P80 (P50 × AACE band factor, "budget-commitment basis") — each auto-fills ONLY when empty, violet "predefined" chip shows the basis, any manual edit is preserved.
Cascading Region → Country dropdown (owner: "40 negara kepanjangan"): CountrySelect now picks the REGION first (EMEA/APAC/AMER/MENA/AFR/LATAM), the country field lists only that region's markets; region auto-syncs on external changes (project restore). One shared component — Requirements, Site editor, Settings inherit.
v1.93.2PATCH
REAL MAP — MapLibre GL + OpenFreeMap
Added
Site Location & Overview now shows a REAL geographic map (owner: "harus map tampilan beneran, jangan kolot"): MapLibre GL + OpenFreeMap vector tiles (no API key, production-allowed, researched 2026 stack) — dynamically imported so it loads only on the Site tab. Candidate-site pins at REAL WGS84 coordinates (legacy schematic 0-1 values auto-migrate to the country/city anchor), click-to-select, popups, fit-bounds, nav controls. The old schematic SVG demotes to an honest offline fallback below. Headless-verified: maplibre canvas + markers render, 0 errors.
v1.93.1PATCH
DC-hub city dropdown
Added
City / Region is no longer free-typing (owner: "kok isi manual"): new DC_CITIES table — 2-4 real DC-hub cities WITH coordinates for all 40 countries (Ashburn/Dallas/Phoenix/SV, Jakarta/Bekasi-Cikarang/Batam, Madrid/Barcelona/Zaragoza, Muscat/Salalah/Duqm, Hamina, Johor/Cyberjaya, NEOM, Luleå…). Requirements 1.1 City field becomes a dropdown-first combobox (datalist — custom entry still allowed) filtered by the selected country. City coordinates feed the upcoming real-map pin placement.
v1.93.0MINOR
COUNTRY EXPANSION — 32 → 40 markets
Added
8 new country profiles (owner: "tidak ada Oman, Finland, Madrid dll yang penting"): Oman (Duqm/Salalah zones, $0.07/kWh), Finland (Hamina, grid 0.08 kgCO2), Spain (Madrid/Barcelona/Aragón), Canada (Toronto/Montreal, Québec hydro note), Italy (Milan), Norway (hydro 0.03), Denmark (Copenhagen/Odense), Switzerland (Zurich, highest labor rates) — full profiles (economy/labor/compliance/environment/risk/tax-incentives/disaster/grid/talent/fuel) in the authoring source, screening-labeled per value; SITE_AUGMENT rows (Aqueduct/ASHRAE/SAIDI/PGA); COUNTRY_GEO anchors (DC-hub cities). DATA.currency +OMR/CAD/NOK/DKK/CHF (gateway /fx-verified). Engine regenerated: parity gate now 155/0 (was 126), engine gate count pin 32→40. All country dropdowns, site engines, fuel/tax/talent/grid analyses cover the new markets automatically.
v1.92.6PATCH
on-page guidance — Reliability
Added
Reliability Engine gains the on-page guidance panel (pattern from Carbon v1.91.6): availability status chip + plain narrative (why the band, β common-cause note) + top-3 prioritized actions naming exactly what to fix (redundancy on the weakest chain, SPOF elimination, MTTR levers) — rendered live beside the KPI row.
v1.92.5PATCH
trace graph batch 3
Added
Trace graph extended: staff.fte (sub-linear headcount chain, formula shows the MW^0.65 calibration), rel.tierTarget (engine tier availability, glossary-linked), opex.totalAnnual (engine dcContract basis, deps on IT load + FTE). CAPEX Engine page KPI grid is now trace-aware — Total CAPEX (P50) is click-to-trace; the render pattern (trace key on KPI rows) rolls out to every KPI grid next.
v1.92.4PATCH
trace cross-surface links + trace standard
Added
Trace links beyond DCMOC (owner: "trace bisa beda page atau data lain, tidak terbatas DCMOC"): trace leaves gain external cross-surface links — "🌐 Sumber eksternal" beside "↗ Edit di menu" (PUE → site glossary; tariff → DC market tracker; corpus facts → the original public document URL as the graph grows). Audit chain now runs DCMOC number → parameter → engine constant → public source document.
standarization/VALUE_TRACE_STANDARD.md — the trace system codified (registry schema, traceId ≡ data-bind ≡ value-bindings id, provenance colors, adoption RULE: every newly rendered number MUST register a traceId — added to the Definition of Done in ENGINE_UNIFICATION.md; USER_MANUAL §9).
v1.92.3PATCH
Trace Angka v2 — intuitive visual formula
Changed
Click-to-trace popover redesigned for clarity (owner: "sangat bagus, intuitive, mudah dimengerti"): big live value header + provenance chip in plain language ("Input kamu" / "Engine (bersumber)" / "Dihitung") · formula rendered as VISUAL PILLS — each operand is a clickable provenance-colored card showing its label + live value, with large operators between, ending in "= result" · clicking a pill drills into ITS formula with a breadcrumb path back · leaves show a plain-language source card ("Ini titik ujung: angka yang KAMU isi") + an "Edit di menu" button. Headless-verified: "[IT Load 2,500 kW] × [Design PUE 1.5] ÷ 1000 = 3.75".
v1.92.2PATCH
live FX + shared currency list
Added
Live FX rates via the existing gateway /fx (owner: "auto update pakai gate yang sudah ada"): src/lib/fx.ts — 1h-TTL cached live rates (verified live: GBP 0.744, CNY 6.78, IDR 17,945 /USD), offline fallback = engine DATA.currency snapshot with an honest source flag. Project-context bar shows the project currency's live rate chip ("IDR 17,945 /USD · live") when the project currency ≠ USD; fmtInCurrency ready for display-conversion adoption.
Shared CURRENCY_LIST — Settings default-currency dropdown gains GBP/CNY/AUD/INR (one list with Requirements 1.1, drift impossible).
v1.92.1PATCH
VALUE TRACE INDEX — Excel-style formula field, batch 1
Added
Click-to-trace "Formula Field" (owner: "seperti Excel — klik X tahu rumus A+3=X, trace sampai titik paling ujung"): new live trace graph (src/lib/value-trace.ts — deps + formula templates + live getters, acyclic) + TraceValue popover component: click an instrumented number → its formula with LIVE numbers substituted ("3.75 = IT Load [2500] × Design PUE [1.5] ÷ 1000"), every source row expandable (recursive drill-down to leaf inputs/DATA constants with provenance chips + DATA.sources ref) or jumpable (↗ opens the value's home menu). Batch 1 instruments the Dashboard IT Load + Facility Load tiles; the graph seeds from the value-bindings catalog and grows per page. Headless-verified (popover renders live formula + expand controls, 0 errors).
v1.92.0MINOR
DC DATA CORPUS — multi-source benchmarks land in the engine
Added
DATA.benchmarksCorpus (owner mandate: "jangan cuma JLL/CBRE — crawl banyak DC operator/developer"): the engine now carries REAL multi-source distributions (n, p10-p90, company list, source count) per metric x segment, GENERATED from the new public-data corpus pipeline tools/dc-corpus/ — sources.yaml (20 curated public sources: Digital Realty, NTT, Vantage, STACK, AirTrunk, Princeton Digital, CoreWeave, Oracle, Microsoft, Google, Meta, AWS, Uptime, IEA + Google Environmental Report 2024/2025 PDFs) → fetch (rate-limited curl + markitdown, PDF-aware) → extract (every fact REQUIRES source_url + verbatim quote — rejected otherwise) → aggregate (percentiles → engine between @@CORPUS markers, DATA.sources entry, auto-link chain). Seed corpus: 82 facts incl. 30 per-site fleet PUE values from Google's published site table. Append-only growth; refresh = rerun pipeline.
v1.91.6PATCH
on-page grade guidance — Carbon/ESG first
Added
Carbon/ESG Rating now explains itself on-page (owner: "Rating F itu kenapa, apa yang di-finetune"): a guidance panel under the header renders the SAME deterministic assessment the PDF uses — profile chip + narrative (why this band, which inputs drive it) + prioritized HIGH/MED/LOW actions naming the parameter to adjust (PUE via cooling class, renewable share, etc.). Pattern (buildAssessment/buildActions live on-page) rolls out to every grade/rating chip app-wide in the next slices.
v1.91.5PATCH
scale-aware maintenance fleet ratings
Fixed
Absurd fleet counts at hyperscale (owner-caught: x15,625 CRAC 100 kW + x600 gensets on 500 MW): unit ratings now step up with facility scale the way real designs do — air handling 100 kW CRAC (≤5 MW) → 300 kW CRAH (≤50 MW) → 900 kW fan-wall (>50 MW); chillers 1 MW → 2.5 MW; gensets 2.5 → 3.0 MW above 100 MW. 500 MW now shows ~667 air units / ~500 gensets (engineering-plausible campus counts). Screening tiers, labeled in-code; schedule/SLA/spares consumers inherit automatically.
Maintenance Schedule tab hung ~3 minutes at 500 MW (owner-caught): the generator enumerated EVERY unit (x600 gensets, x15625 CRAC → ~300K+ event objects). Units now batch per class (≤26 stagger slots — beyond that duplicate slots add no scheduling information), each event carries units and hours multiply by batch size — ~130x fewer objects, totals identical, every task × frequency × stagger week still present. Batch labels show "(batch N — X units)".
v1.91.3PATCH
calc hygiene — Financial hardcodes bound to canonical sources
Fixed
Financial energy cost hardcoded PUE 1.4 + $0.10/kWh in 3 places (audit finding): now reads the live pueMatrix[cooling][tier] + the project country's economy.electricityRate — changing country or cooling moves the Financial opex/budget lines automatically (owner mandate: tarif listrik auto per negara). Maintenance $50/kW/yr literals bound to the shared sourced screening constant. Revenue screening bases (Disaster/Tax) unified to lib/screening.ts in the prior commit.
v1.91.2PATCH
sub-linear staffing algorithm
Fixed
Auto headcount scaled LINEARLY per MW (owner-caught: 834 FTE at 500 MW vs the Uptime benchmark 204 shown on the same page). calculateAutoHeadcount now applies economies of scale: effective MW = 10 x (MW/10)^0.65 above the 10 MW reference anchor — 10 MW reproduces the reference model exactly; 500 MW Tier-4 lands at ~203 FTE (benchmark 204). Per-role formula strings show the scale curve. Consumers (Staffing, Portfolio, Capacity engines) inherit automatically.
v1.91.1PATCH
chart tooltips dark-theme sweep
Fixed
21 chart hover tooltips rendered as WHITE boxes with invisible text in dark mode (owner-caught on the CAPEX forecast curve): every bare contentStyle={{ fontSize: 10 }} recharts Tooltip across 13 files (capex, capacity, construction, commissioning, financial, operations, reliability, results, sustainability, assets, architecture rail, site radar, scenarios) now carries the dark panel style (#1e293b bg, #334155 border, explicit light text) — hover values readable everywhere.
Capex + simulation stores now PERSIST (audit-critical): reload no longer wipes IT load/tier/cooling/phases/deep-sea tick while requirements survived — the root of the owner-caught cross-page contradictions ("Requirements 1.6 enabled, CDU says off"; "Indonesia · 1,000 kW" headers on a UAE 500 MW project). selectedCountry rehydrates by id against the live COUNTRIES table.
Candidate site follows the project country: syncToCountry updates the pristine scenario site (name/country/coords from the new COUNTRY_GEO table) on every writeSharedCountry + stale-localStorage rebase on load; user-customized sites keep manual values. Kills "Indonesia Site" on a UAE project.
Capacity phases derive from IT load: hardcoded 2/5/10 MW seeds replaced by derivePhases(itLoad) (4-phase staggered split); pristine phases re-derive on itLoad change, manual edits set capacityPhasesCustomized and stop derivation. Kills "22 MW plan on a 500 MW project".
Engine-ready signal: useEngineReady() hook + rz-engine-ready event fix the deferred-engine race (Spares memo never re-ran; CDU deep-sea stuck "off"); CDU banner now distinguishes "engine loading" from "off".
Changed
Data-vintage banner → live project-context bar (project name · country · MW IT · tier · cooling from the shared stores; vintage note moved to hover) — every page shows which project it is working on.
maplibre-gl dependency added (real-map slice upcoming); src/constants/geo.ts country geo anchors.
v1.90.2PATCH
article-calculator engine sweep, batch 4
Added
models.mttr + DATA.mttrResponse (promoted from article-4): vendor-vs-inhouse MTTR phase model (per-category base durations, skill 1.5..0.55, coverage mobilization, spares gap factor) + full annual economics compare (downtime delta x effective cost/hr, callout + 55% retainer recovery, ROI, break-even); 7 engine asserts. Article-4 phases + savings block delegate.
Engine catalog AUTO-regenerated by the ship gate: 34→37 namespaces, 160→173 functions, 85→88 sourced tables — Knowledge Base + FAQ reflect the new models with zero manual doc edits (the auto-linking chain doing its job on its first real engine change).
Owner Action Board: backend-deploy-v163 marked DONE + VERIFIED (owner ran wrangler deploy, Version 06e8006; /calc POST live with engineVersion 2.5.1, NPV test ≡ engine).
v1.90.0MINOR
DCMOC revision round 3: PDF executive-assessment engine · architecture visual depth · auto-linking system
Added
PDF Executive Assessment engine (dcmoc/src/modules/reporting/pdf/ReportNarrative.ts): every DC-OS export now ends with the min-standard algorithmic conclusion — a deterministic profile chip chosen by per-family threshold rubrics (16 families: capex $/kW bands, financial NPV/IRR-vs-hurdle, reliability nines-vs-tier-target, sustainability PUE bands, capacity stranded %, construction SPI/CPI, operations PM-compliance, commissioning readiness, results grade, site score, assets health, spares fill, staffing, requirements completeness, architecture layer validation, cooling) + a narrative built from the page's live numbers + prioritized HIGH/MED/LOW action items. Wired into ALL 16 export call sites (11 verified headless by the new tools/_dcmoc_export_probe.mjs — 44/0: Executive Assessment + actions + summary band present in every captured print document, 0 page errors).
AUTO-LINKING system (owner: "harus auto, tidak perlu Claude"): tools/build-engine-catalog.mjs generates dcmoc/src/lib/engine-catalog.json from rz-engine.js — 34 model namespaces · 160 functions with parameter lists · 85 sourced DATA tables · consumers GREP-DERIVED from real usage (site articles + DC-OS modules). Knowledge Base "Engine Models" tab + FAQ "Engine & Data Reference" section render the catalog LIVE (auto-generated, never hand-written). New SHIP GATE tools/test-value-bindings.mjs (73/0): value-bindings coherence (unique ids, engine-provenance entries carry engineFn, every engineFn resolves against the live engine, pages ⊆ real tab ids — caught 3 stale tab aliases + 1 missing engineFn on first run) + catalog STALENESS (regenerates in-memory and diffs vs committed — an engine change cannot ship with stale docs). Chain codified in ENGINE_UNIFICATION.md + CLAUDE.md + USER_MANUAL §8.
Requirements 1.1 "Data Center Image (Dashboard hero)" upload card restored where the owner expects it: same store as the CAPEX card (useCapexStore.heroImage, WebP-compressed client-side) — custom/default chip, preview ring, "Reset to default"; the Executive Dashboard falls back to the default DC-OS render when nothing is uploaded.
Changed
Architecture diagram visual depth (reference-parity round): transformer glyph now draws primary/secondary winding coil pairs; genset = engine block + shaft + alternator; UPS carries an integrated battery-cell stack; chiller = evap/cond barrels + compressor; rack = dense U-unit grid; fuel = saddle tank + level line; cooling tower gains fan + fill louvers; pylon + switchgear + PDU + CRAH/CDU detail passes. Stacked-unit CASCADE rendering with real ×N count badges (layout units field), group containment headers rendered as count-badged chips ("COOLING PLANT — 8 chillers"), A/B bus bars emphasized (3px, junction dots, tap points).
Owner Action Board (setup-supabase.html): github-token-rotate updated — rotation reported DONE 2026-07-19; remaining owner-typed step documented (store the new PAT in ~/.git-credentials, verify git push --dry-run).
v1.89.1PATCH
article-calculator engine sweep, batch 2 — includes a REAL unit-bug fix
Added
models.water.aiQueryFootprint + DATA.aiWater (promoted from article-20 "AI Water Footprint" + "AI Vs Human" tabs): per-query water model — 19 AI models (mL/query, sourced), complexity/cooling/region multipliers, upstream factor (×3 grid-power water), scale multipliers (personal → global 1e10), bottle/shower/drinking-day equivalences + CO₂ + cost; 12 engine asserts. Both article-20 tabs now delegate to the engine (inline fallback kept), headless-verified page ≡ engine.
models.aiFactory.gpuBuild + DATA.aiFactory.gpuBuild (promoted from article-23 Colossus calculator): GPU capex, annual power at PUE, build-speed vs the 122-day Colossus benchmark, $8M/MW infra screening, 5-yr TCO; 4 engine asserts. Article-23 delegates (verified: defaults $4.59B TCO ≡ engine; reactive input change $7.59B ≡ engine; 0 console errors).
Fixed
article-18 annualEnergy ×1000 unit bug (REAL "angka ngawur" caught by the sweep): the article computed facPowerMW × 8760 × elecRate × 1,000,000 — MWh→kWh conversion needs ×1e3, not ×1e6, so the annual-energy cost line was overstated 1000× (a 1 MW facility at $0.08/kWh showed ~$700.8M instead of ~$700.8K). Fixed in the engine promotion AND the article's inline fallback; correction documented in DATA.sources.aiFactory; accuracy assert added proving the sane value. Headless-verified: page now shows $1.1M-scale energy ≡ engine.
Changed
Engine min rebuilt (terser); ?v=2026-07-19-a23 bumped sitewide (59 files + engine pdf scriptTagsHTML). Sweep tracker updated in ENGINE_UNIFICATION.md — 5 calculators engine-bound, 18 article pages remaining.
v1.89.0MINOR
article-calculator engine sweep, batch 1
Added
models.gridImpact.residentialBillImpact + DATA.gridImpact (promoted from article-11): the SEA citizen-bill screening model — DC annual GWh at 90% CF, household equivalence, tariff pass-through (40% screening) × IEA 15%/yr growth, monthly/annual bill impact in local + USD, grid-load share — 6 SEA countries with sourced tariffs/grid data; 5 engine asserts.
models.water.facilityFootprint + DATA.waterFootprint (promoted from article-20): full facility water screening — WUE base per cooling class × climate multiplier + upstream-power water factor (1.5 L/kWh non-renewable), household/city/pool equivalences, water cost per source type, AI share, hyperscaler benchmarks (Google/Microsoft/Meta/AWS per-MW) — 6 engine asserts.
Changed
article-11 & article-20 calculators now ENGINE-BOUND: page computations delegate to the shared models (inline math retained as no-engine fallback); headless-verified page ≡ engine on both. ?v=2026-07-19-a11 bumped sitewide. Sweep progress: 2 of 22 pages; tracker in ENGINE_UNIFICATION.md.
v1.88.3PATCH
Owner Action Board pindah ke setup-supabase.html
Changed
Owner Action Board dipindah dari rz-ops ke setup-supabase.html (halaman "Yang harus kamu lakukan" — rumah aslinya, per owner): 8 item hidup (rotasi GitHub token, deploy backend v1.63.0 + tes, SQL hardening Supabase, Edge Function admin-users + Migrate, reset password terekspos, naikkan spend limit Claude, musik intro CC0, taste-skill Dunia) dengan alasan owner-only + langkah + tick persist (rz_owner_actions_v1) + badge terbuka; item merujuk step detail ber-perintah di halaman yang sama. Nav rz-ops kini link eksternal ke halaman ini.
v1.88.2PATCH
accuracy program M3-full: truth coverage across EVERY model family
Added
Accuracy gate expanded 27 → 40 green asserts covering every remaining model family with formula-grade independent truth: fire NFPA-2001 clean-agent mass (m = V/s·C/(100−C)) + inert flooding (V·ln(100/(100−C))), water WUE·kWh, partial-load-PUE exact identity, deep-sea ACCURATE-mode energy balance (TEOS-10 ρ=1025/cp=3985), commissioning readinessIndex weighted-sum identity, newsvendor Q* end-to-end replication (erf-Newton Φ⁻¹ ≡ engine Acklam at ceil grain), compound-growth FV, plus recomputed-from-DATA identities: staffing round(hc·salary·load), carbon scopes Σ s1+s2+s3 ≡ total, construction schedule bounded by Σ phases, tier classify bounds, LCOE ≡ CRF reconstruction ($48.82/MWh exact match). Engine formulas certified — zero code changes needed this batch (all families already exact).
v1.88.1PATCH
rz-ops: Owner Action Board
Added
Owner Actions section in the rz-ops admin console: the standing list of actions only the OWNER can perform (Supabase SQL hardening, admin-users Edge Function deploy + migrate, exposed-password resets, Claude spend-limit raise, CC0 intro-music file, Dunia taste-skill install) — each with why-owner-only, exact steps and an added-date; per-item done-ticks persist locally and an open-count badge sits on the nav. The list is maintained: any future task that ends blocked-on-owner lands here.
v1.88.0MINOR
ENGINE ACCURACY PROGRAM M1-M3: independent truth harness + precision core
Added
Independent accuracy truth harness (permanent gates): tools/verify-engine-accuracy.py computes 27 worked examples at 50-digit Decimal / machine-erf precision from the AUTHORITATIVE formulas (never engine output) — annuity/CRF, NPV/IRR bisection, Weibull, exact binomial k-of-n, availability chains, Φ⁻¹, exact Poisson sums, Magnus dew point, Colebrook iterated to 1e-14, deep-sea poster identities, opex accounting identity — into tools/fixtures/accuracy-truth.json; tools/test-engine-accuracy.mjs asserts every engine value within its documented per-family tolerance. Baseline run MEASURED the defect list before any fix.
Deep-sea poster-floor spec (owner baseline): DATA.deepSeaCooling.spec + deepSea().spec now carry every poster field — intake 800-1,000 m @ 4-6 °C, return 9-11 °C, three loops (TCS/FWS/seawater), Ti Grade-2 PHE (approach 1.5-2.5 °C @ 10 bar), 4-stage filtration (50 mm → 5 mm → 200 µm → 50 µm backwash), full materials + redundancy map, facility 20-21/28-32 °C, trim-chiller basis. Poster identities gate-locked (8.625 m³/s exact, 4+1 pumps).
Changed (measured error, before → after)
Reliability chain de-saturated (MATERIAL): availability/parallel/series/kOutOfN/downtime no longer round 6 dp INSIDE the chain — two-path parallel of a 0.999968 item was collapsing to exactly 1.000000 (downtime 0.0 min/yr, the engine-level origin of the fake "100.0000%"); now full double precision end-to-end (err 1.0e-9 → < 1e-15; downtime 0.0 → 0.00243 min/yr on the reference chain).
Inverse normal CDF upgraded: Beasley-Springer-Moro (1977, |ε|<4.5e-4) → Acklam (2003, |ε|<1.15e-9) — spares newsvendor quantiles now precision-grade; kernels exposed as models.spares.normInv/normCdf/poissonCdf (one implementation, gate-verified at 2e-9).
IRR solver scale-aware: Newton/bisection tolerances now scale with cashflow magnitude (1e-12·max|cf|) — $M-scale series converge to machine precision (measured err 5.6e-17) instead of a fixed $1e-7 cutoff.
Provenance: sources updated (spares.acklam, pue.partialLoad screening basis); ?v=2026-07-19-accuracy bumped across all 58 engine-loading pages + DCMOC.
Verified unchanged (parity locks held)
capex golden EXACT (<$1), commissioning cx golden exact, opex default ≡ dcContract bit-identical, reference-parity 126/0, engine suite 426/0, datahall 57/57, conv DoD, DCMOC walk 23/23 + synergy 6/6. Whole-dollar opex line rounding kept as the documented ACCOUNTING convention (components+overhead ≡ total identity now gate-asserted; max error ≤$3 on multi-$M totals).
Value Binding & Sync catalog (src/lib/value-bindings.ts): machine-readable documentation of every bound number in DC-OS — 38 rich entries across 7 groups (shared canonicals, CAPEX chain, PUE/OPEX, reliability & Cx, site & sibling engines, staff/assets/spares, financial & results). Each entry: source parameters → exact formula/engine function → every consumer page, with provenance (input/engine/derived/tracking/screening) and trap notes (pueMatrix-direct, EVM single-source, margin→contingency).
Knowledge Base rebuilt as the manual: searchable/filterable "Value Bindings" tab — expandable per-value detail with source-param chips, engine fn, consumer list and REAL page links; engine-models tab retained. FAQ gains a "Where does every number come from?" section linking to it.
Cross-page synergy probe (tools/_dcmoc_synergy_probe.mjs, permanent): drives the app and ASSERTS the same bound number renders identically everywhere — CAPEX total identical on 4 pages (Dashboard/CAPEX P50/Financial baseline/Investment), design PUE (Dashboard = Architecture), Ops partial-load PUE ≥ design (documented separate basis), IT load, dashboard design-capacity ≥ IT (margin basis), tier labels. 6/6 green.
Changed
Strategic Planning "Estimated CAPEX" now states its basis explicitly: CAPEX-module rate × the land/grid-CONSTRAINED MW — not the project MW (the audit's one confusable pair, now labeled + documented in the manual).
v1.86.2PATCH
DCMOC audit round 2, batch AG: visual-audit fixes
Fixed
Data Library "Latest As-Of" KPI showed prose text ("const") — now filters to date-like source entries.
Spares "Recommended Stock Value $0" now explains itself honestly when every class' newsvendor Q* is zero at a small fleet (ROP covers the low failure demand).
Audit Trail was an explainer-only page — now shows the REAL local change history (settings change log + scenario saves + project updates, newest first) with KPI chips; server-side audit_log note retained.
Fire Suppression enriched: suppression-zones section (engine equipment scaling), volume per zone, fire-system CAPEX from the capex engine (fire + detection keys, same source as CAPEX page), shared fire/alarm type basis.
Asset Lifecycle depreciation-by-year strip capped with internal scroll (was dominating the page).
Audit verification: 43-tab full-page screenshot walk reviewed one-by-one; Grid/Talent "empty chart" appearances confirmed false positives (recharts entrance animation vs screenshot timing — bars verified present at runtime).
v1.86.1PATCH
DCMOC batch 7: universal hover sweep
Changed
Every KPI card across the 10 engine pages is now hoverable (Phase X): native title with the exact label/value/basis on Architecture, Capacity, CAPEX, Construction, Commissioning, Site Intelligence, Operations, Financial, Sustainability and Assets — on top of the hover titles already carried by the new diagram symbols, div-bars, comparison cells and radar/donut recharts Tooltips shipped in batches 1-6.
v1.86.0MINOR
DCMOC batch 6: Platform group rebuilt to the reference UIUX
Added
Scenarios page (was only a side panel): platform header, KPI chips (total/in-comparison/countries/baseline), search filter, rich table with per-scenario CAPEX/OPEX DELTA columns vs baseline (oldest save), ★ comparison selection, detail rail (full saved config + restore/compare quick actions), pagination footer.
Template Library to reference: platform header + KPI chips, engine-profile cards with what-it-sets checklists; "Use This Template" now runs the FULL shared profile writer (density + cooling + tier floor + workload-mix preset — same path as Requirements 1.2).
Data Library + Projects: platform header + KPI chip rows (datasets/provenance/DATA version/as-of; projects/active/engines-ready/scenarios/countries) over the existing honest data.
Fixed
Settings/Integrations deep link now switches tabs correctly (React instance reuse keyed).
v1.85.4PATCH
DCMOC batch 5: Settings & Integrations to the reference UIUX
Changed
Settings rebuilt to the reference layout (setting.png): Overview tab with KPI chip row (projects/scenarios/integrations/engine-data/storage — all real counts), Quick Settings rows (organization, default country w/ Apply, currency, theme — icon + subtitle + inline control), System Preferences card grid (Data Management, Integrations, User Management, Audit Trail, real JSON Backup & Export, Security note), right rail with Platform Information (site version, engine DATA version, real storage estimate bar), Recent Activity (real settings change log, additive store field) and Need Help (FAQ/Knowledge links).
Integrations rebuilt to the reference layout (integration.png): KPI row (total/reachable/configured/errors), search filter, integrations TABLE (name, kind, status chip, last test, test/delete row actions), selected-integration DETAIL RAIL (name/kind/URL/secret-ref editors + Test Connection), Add Custom Integration; the sidebar Integrations tab now opens this same surface (old card grid retired). Honest scope labels retained (CORS-limited reachability, secrets never stored).
v1.85.3PATCH
DCMOC batch 4: Architecture dynamic symbol palette + all-parameter diagram
Added
Dynamic symbol palette (diagram/palette.tsx): data-driven registry of 16 parametric equipment glyphs (utility pylon, IEC transformer, switchgear/breaker, genset, fuel tank, UPS AC/DC, battery plates, PDU, rack, spine-leaf fabric, chiller, cooling tower, CDU pump+HX, CRAH, BMS, IT load) with logical + SLD skins — the layout engine composes ONLY from the palette; a new equipment kind is one registry entry.
Diagram plots from ALL requirement parameters: transformer stage (MV/LV bank counts), A/B bus bars (+ dashed spare trunk at 2N+1), battery-autonomy annotation per tier, utility blocks named from the 1.1 utility provider, IT hall split into CELLS sized by the workload mix (AI/GPU, storage, general+network with per-cell rack counts), growth-phase boxes from the capacity plan (NOW/PLAN badges), design-margin + SLA + use-case annotations, group containment boxes (POWER TRAIN / IT HALL / GENERATION / COOLING PLANT / NETWORK & CONTROL) with live counts. Every block carries an exact-value hover title. Param-reactivity probe: changing grid voltage (incl. new 20 kV) re-labels the diagram live — 7/7.
v1.85.2PATCH
DCMOC batch 3: Monte Carlo folded in + Strategic dedup + CDU rebuild with deep-sea advanced
Changed
Monte Carlo folded into Financial: sidebar sub-menu removed; MonteCarloDashboard now lives as the "Monte Carlo Risk" tab inside the Financial Engine (deep links land there). Its analysis-local inputs (iterations/seed/variables) stay.
Strategic Planning is now an OUTPUT page: feasibility land/grid/climate auto-derive from the active candidate site (Site Intelligence) with source chips + edit-at-source links; target PUE from the engine matrix; expansion footprint/growth/horizon/capex-per-MW derive from Requirements growth, contract duration and CAPEX results. Acquisition comparables stay local (genuinely market data).
Added
CDU / Liquid Cooling rebuilt: loop hydraulics (Darcy-Weisbach ΔP, Reynolds, pump power, dew-point margin), PUE-impact panel (air vs D2C vs current from the engine matrix), refrigerant selection table (engine GWP/COP database, click-to-select shared capex field), and the Deep-Sea Water Cooling ADVANCED section — gated on the shared capex deep-sea tick: seawater flow, intake temp @ depth, pump station N+1, chiller-less PUE, marine CAPEX/OPEX + screening warnings, with depth/pipeline/ΔT parameters editable in place. Full-standard PDF export.
v1.85.1PATCH
DCMOC batch 2: Site Intelligence full integration + Requirements 1.6 Infrastructure
Added
Site Intelligence FULL INTEGRATION: the five sibling analyses (Tax & Incentives, Disaster Risk, Grid Reliability, Talent, Compliance) are now COMPUTED PER CANDIDATE SITE inside the unified page — integrated analysis panels with real engine outputs (grade/outage-minutes/required gen, composite risk/insurance/EAL, incentive value/NPV uplift/rank, time-to-staff/recruitment cost, mandatory items/costs), radar axes remapped to the integrated engines, comparison table gains 7 engine rows, deep-dive links preserved.
Requirements 1.6 Infrastructure & Site Options: the capex-calculator questionnaire surfaced in Requirements writing straight to the SHARED capex store — Deep-Sea Cooling (tick + depth/pipeline/ΔT), Front-of-Meter (substation/transformer lead/utility rate), Building & Site (building type, seismic zone, site condition, floor), Systems (UPS/gen/fire/alarm/refrigerant from the engine GWP database), Distribution & Security, Sustainability & Renewables (solar MWp + BESS MWh), Delivery basis (year/market/method/fees; contingency stays bound to Design Margin). Deep-sea tick in the CAPEX drawer now shares the same store field.
v1.85.0MINOR
DCMOC revision round batch 1: PDF standard renderer + Cx checklist + spares engine + shell UIUX + reliability depth
Fixed
PDF export crash ("Invalid arguments passed to jsPDF.text") on Operations → Staffing: shiftComparisons shape mismatch mapped correctly in StaffingPdf; systemic hardening at the initDoc chokepoint — doc.text/splitTextToSize now String-coerce and NaN-guard for all 12 legacy jsPDF generators.
Sidebar tooltip clipped at the sidebar edge: React Tooltip now renders via a body portal with fixed positioning + viewport flip — no overflow ancestor can clip it.
Reliability fake precision: "100.0000%" availability and "0.0 min/yr" downtime replaced by nines-formatted availability (with nines chip), seconds-scale downtime, and a β=5% common-cause screening factor on parallel paths.
Added
Standard PDF renderer (print-window): new PrintReport.ts renders every DCMOC export in the OPEX-report min-standard visual language (header + headline chip, KPI cards, configuration table, colored section titles, navy-header tables, SVG donut, tinted callouts, executive assessment, prioritized actions with priority chips, dark summary band, disclaimer). generatePillarPDF now routes through it; jsPDF path retained as fallback.
Export PDF on every engine page: Capacity, CAPEX, Operations, Financial, Sustainability, Results (composite), Assets — plus full-standard upgrades (config/callouts/actions/summary band) for Architecture, Construction, Site rail and Requirements summary.
Commissioning Cx Checklist (DC Hub cx-calculator port): 20 real test-procedure templates (NETA/IEEE/ASHRAE basis — IR/megger, CT ratio, relay, breaker, transformer, UPS, genset load bank, chiller/DLC startup, balancing, IST scenarios, doc review, training, closeout) mapped per readiness level and system; PASS/FAIL tri-state ticks with witness badges (Hold/Witness/Review), expandable procedure detail (steps, acceptance + standard, tools, safety, logsheet fields); checklist-derived completion now drives the engine readinessIndex (sliders become coarse fallback with a "from checklist" chip); FAIL → one-click issue logging.
Spares Optimization rebuilt engine-real: fleet from engine equipment scaling × IEEE-493 MTBF → per-class newsvendor optimization (Q*, ROP, safety stock, fill rate, annual cost) with country lead times, criticality fill targets, per-class overrides and provenance chips — single spares model aligned with Maintenance.
Resizable sidebar: drag the right edge (200–420 px, persisted; double-click resets).
Requirements calculator-basis parity: use-case pick auto-applies the engine profile (density/cooling/tier floor/mix preset) with reference-guidance card; single use-case picker (Industry/Use-case/Workload-category duplication removed); Total Racks overridable (auto chip ⇄ manual); workload-mix manual-override tick; rack-class descriptions on density presets; Grid Voltage gains 20 kV (PLN MV standard).
Reliability Engine deepened: Tier Classification folded in as an in-page tab (sidebar sub-menu removed); per-component RAM table with fleet counts and unavailability contribution; downtime-budget waterfall; MTTR/path-loss sensitivity; maintenance-basis honesty note; Export PDF.
v1.84.3PATCH
DCMOC: Data Library provenance browser
Added
Data Library "Provenance" tab: searchable read-only browser over the engine's DATA.sources ledger (80 entries) — data key, source citation, method, as-of date. Surfaces the gate-enforced provenance discipline (every economically-material DATA value carries a source) directly in the platform UI.
Promised bindings now real (no-placeholder mandate): Settings default currency actually seeds the Requirements currency default; Settings orgName auto-resolves into every PillarPdf export ("Prepared for …" footer) without per-caller changes.
Project breadcrumb per the DC-OS reference: header now reads Projects / {active project} / {page} — Projects clickable, active project name violet, wired to the projects store.
Input-vs-generated visual convention (owner UX rule): editable input labels now carry a 2px violet left-accent (shared Field primitive) — derived/generated values keep the flat tinted read-only panels with provenance chips. Instantly distinguishable.
Sidebar labels aligned to the new engine pages (CAPEX Engine, Architecture Engine, Construction Engine, Commissioning Engine, Asset Intelligence, Reliability Engine, Sustainability Engine, Capacity Planning, Results Engine).
RZExplain tooltips wired on technical KPI labels (PUE, WUE, MTBF, MTTR, Redundancy) via the shared knowledge DB — renders nothing when a key is absent (safe), per the resistancezero tooltip standard.
v1.84.0MINOR
DCMOC Phase O: PDF export standard
Added
PillarPdf standard extension (additive — every existing call keeps working) per the owner's reference PDF (opex-calculator report): PillarReport gains optional config (full configuration table), callouts (tinted analysis boxes info/good/warn), actions (prioritized HIGH/MEDIUM/LOW table), summaryBand (footer mini-KPI band), orgName (from Settings → "Prepared for" footer). All DCMOC page exports can now compose the full standard: header+KPI cards → configuration → sections → callouts → actions → summary band → disclaimer.
v1.83.0MINOR
DCMOC Phase R: Settings & Integrations
Added
DCMOC "Settings" (Phase R): 3 functional menus — General (org name → PDF exports; default country w/ real Apply through the shared writers; default currency seeding Requirements), Data (per-store reset actions clearing the REAL stores — requirements/sites/trackings/ledger/log/sustainability), Integrations (versioned IntegrationConfig schema: webhook/REST/BMS/export-schedule kinds, real reachability Test via no-cors fetch with honest CORS-limited labeling, secretRef labels only — secrets NEVER stored, backend-bound kinds show their true status). Scalable schema (versioned persist) ready for future backend wiring — zero placeholder controls.
v1.82.0MINOR
DCMOC Phase N: Projects — the workflow spine
Added
DCMOC "Projects" page (Phase N): full-state PROJECT BUNDLES — every program store snapshotted (sim/capex canonicals + requirements + candidate sites + architecture + construction/cx/financial trackings + ops log + sustainability), versioned payloads, ordered sanitized restore (sim → capex auto-recalc → requirements → sites → arch → trackings), max 10, active-project tracking with Update. Lifecycle strip (9 engine dots w/ live completion booleans + deep links — the wired workflow). Template Library = engine cx scenario presets (enterprise-2MW … AI-factory-100MW) applied through the shared writers (itLoad/cooling/redundancy) → lands on Requirements. Scenarios remain the lightweight input-only snapshots (cross-linked).
v1.81.0MINOR
DCMOC Phase I: Results Engine
Added
DCMOC "Results Engine" (Phase I, tab report): final scorecard/verdict for the current configuration — 8 dimension scores as DOCUMENTED deterministic composites over live engine data (Requirements = intake completeness; Site = engine site score; Architecture = 100−0.35×complexity; CAPEX = $/kW vs the cx reference band; Construction = SPI/CPI blend from tracking EVM; Ops readiness = tier availability positioning; Sustainability = PUE band; Financial = screening IRR vs 10%% hurdle via models.roi on the dcContract opex basis). Weighted overall + grade, performance radar, dimension ranking, key financial outcomes (NPV/IRR screening, "not investment advice" note), deterministic recommendations, HONEST validation chips ("computed successfully", not a fake audit). Distinct role vs the Executive Dashboard (live cockpit); full ReportDashboard kept as "Full Report" tab.
v1.80.0MINOR
DCMOC Phase M: Sustainability Engine
Added
DCMOC "Sustainability Engine" (Phase M, tab carbon): engine-real core — GHG Protocol scope 1/2/3 donut (models.carbon.scopes), monthly energy (MW × PUE-matrix × 730h), annual water (engine WUE), energy mix DERIVED from the capex renewable + certification inputs (labeled), documented scorecard composites (PUE band / grid-carbon × mix / WUE band / waste diversion) → grade A–D. Initiatives (progress sliders) + certifications (user-attested status selects) via the sustainability store (EXAMPLE seeds). Old CarbonDashboard kept as "Carbon / ESG Detail" tab.
v1.79.0MINOR
DCMOC Phase L: Reliability Engine
Added
DCMOC "Reliability Engine" (Phase L): per-system availability chains composed ENGINE-REAL from IEEE-493 component MTBF/MTTR (models.reliability series/parallel at the current redundancy paths — chains documented per row), composed overall availability vs the Uptime tier target (BELOW-target flagged), downtime budget, composite MTBF (harmonic) + avg MTTR, SPOF list from single-path components at the config, documented reliability-score composite (availability-margin 40 + redundancy 30 + maintainability 15 + SPOF 15), component-MTBF chart, active failure events from the SHARED ops log (no duplicate ledger). Old ReliabilityDashboard kept as "RAM Detail" tab; risk/tier children deep-linked.
v1.78.0MINOR
DCMOC Phase J: Asset Intelligence
Added
DCMOC "Asset Intelligence" (Phase J): fleet GENERATED engine-real — per-class unit counts from equipment scaling, health from the engine Weibull healthIndex at a user-set fleet age + condition slider (dropdown-first combobox for age), wear-out risk (Weibull CDF), MTBF/MTTR from the engine IEEE-493 component data. Honest per-CLASS aggregates (no fabricated per-unit registry). Category donut, class health/reliability table, health-distribution chart, KPI buckets (excellent→critical, at-risk ≥25%% CDF). Old AssetIntelDashboard (replacement schedule + failure risk) survives as "Lifecycle Detail" tab; asset-lifecycle/cbm/spares children untouched + deep-linked.
v1.77.0MINOR
DCMOC Phase K: Commissioning Engine page
Added
DCMOC "Commissioning Engine" (Phase K): planned plane = the v1.68.0 RICH cx engine (L0–L6 staffed-duration timeline bars, equipment-scaled systems list, IST scenarios/tier); actuals = cxTracking store — per-level completion sliders feed the ENGINE readinessIndex (real linkage, engine weights), test counters, issues & punch CRUD (EXAMPLE seeds, Plan-Mode banner); tests-per-system = labeled screening (unit counts × tests-per-unit table); program-cost-share donut (engine fixed proportions). The rich cost + Monte-Carlo band + tornado cards survive as the "Program Cost & Risk" tab (absorbed by composition).
v1.76.0MINOR
DCMOC Phase H: Financial Engine
Added
DCMOC "Financial Engine" (Phase H): budget baseline = engine capex P50 + approved change orders (checkbox revisions); committed/paid from a fraction-scaled tracking ledger (transactions + AR/AP invoices CRUD, EXAMPLE seeds, Plan Mode); CPI/SPI passthrough from the Construction EVM — single source, never recomputed; Forecast-at-Completion = AC + remaining/CPI; PV budget curve from the engine CPM schedule; Annual OPEX donut via models.opex.totalAnnual on the Phase-Q dcContract preset (labeled basis); Financial Health grade A–E (documented composite 0.3 budget-var + 0.35 CPI + 0.35 SPI); deep-dive links (Investment/Monte-Carlo/Portfolio/Benchmarks/Strategic all preserved); full legacy FinancialDashboard as "Pro Forma (Full)" tab — EditableCell workflow intact.
DCMOC "Operations Engine" (new 'ops' tab, Engine-8 group [ops, sim, staff, maint]): derived plane engine-real (availability shown as the Tier design TARGET, PUE-at-load via partialLoadPUE × occupancy, active IT load, 24h energy cost at the country tariff, Weibull asset-health distribution, shift overview from the staffing model), ops-log plane user-entered (opsLog store: alarms/incidents/tickets CRUD with EXAMPLE-chipped seeds + Plan-Mode banner + PM-week compliance log). 24h load curve = documented deterministic diurnal cosine (±5%%, peak 14:00) — labeled SIMULATED, no Math.random. Shift & People + Maintenance sub-tabs absorb the existing dashboards by composition; quick actions wired to real targets.
Changed (owner UX corrections — retroactive)
CreatableCombobox v2 — dropdown-FIRST: the control now renders as a normal select-style button listing preset options (the simple dropdown experience preserved exactly); "Custom value…" row switches to validated typed entry; "Use default" row clears overrides. Applies everywhere the primitive is used (Requirements density/margin, Architecture, Capacity, Construction).
No fabricated sites: Site Intelligence now seeds exactly ONE candidate site bound to the active scenario country; multi-site compare appears only after the user adds sites.
v1.74.0MINOR
DCMOC Phase F: Construction Engine
Added
DCMOC "Construction Engine" (Phase F): Plan-Mode-first tracking — planned plane engine-real (CPM schedule, PV S-curve, engine milestones, long-lead procurement w/ derived PO-by/ETA + example-labeled vendors, screening trapezoid manpower), actuals user-entered (constructionTracking store: status month, per-phase actual %% combobox, AC spend, risks/issues CRUD w/ EXAMPLE seeds). Deterministic EVM SPI/CPI (baseline 1.00 in Plan Mode; single source for Financial), forecast = planned/clamp(SPI), documented health composite (SPI 40 + CPI 30 + schedule 15 + issues 15). L2 Gantt reused.
Fixed
Latent zero-schedule bug: old dashboard fed capex.timeline (no duration keys) into models.construction.schedule → durations 0, "Total Build" 0. Durations now mapped explicitly from timeline phases + engine long-lead months.
Phase-editor write-back bug: legacy CapacityDashboard kept phases in local React state and never wrote back to inputs.capacityPhases — Strategic/Phased-Finance/Report only ever saw defaults. Debounced store write-back added (same schema).
v1.71.0MINOR
DCMOC Phase C: Architecture Engine + dynamic system diagram
Added
DCMOC "Architecture Engine" (Phase C) — per the DC-OS reference with a fully DYNAMIC system-architecture diagram (owner mandate: not a static image): pure layout engine computes blocks + orthogonal edges from live requirements — utility feeds/trunks follow redundancy (N+1 single trunk + spare · 2N dual A/B · 2N+1 dual + spare), UPS/generator/switchgear/PDU/rack counts from the engine equipment-scaling model (per-module MW from the redundancy factor), cooling chain follows coolingType (liquid/rdhx → CDU loops + heat rejection · air/inrow → chiller + CRAH), voltage labels from the requirements grid voltage, network fabric leaf estimate, BMS control edges. Logical + Single-Line-Diagram skins of the same graph, pan/zoom, 5-line-type legend. Changing ANY upstream requirement re-renders the diagram.
Header selects: Design Standard (Uptime III+/IV, TIA Rated-3/4 → writes shared tier) + Architecture Profile presets (multi-param registry writes: AI-liquid/AI-rdhx/colo/enterprise). KPI row (IT/facility MW, design PUE via pueMatrix direct lookup — defaultFor key-trap avoided, availability target, redundancy). Absorbed old dashboard cards: complexity → KPI/BOM, ASHRAE thermalCheck → Cooling card, topology + floorLoading → Power card, disciplines + designFee → BOM section. Rail: Architecture Summary, Load-Breakdown donut derived from LIVE PUE (labeled screening split), per-layer Design Validation. Bottom: Key Design Decisions, Reference Design id (pattern template), HONEST compliance (Uptime/TIA/ASHRAE engine-derived %; NFPA + ISO/IEC 22237 = SCREENING chips, no fake bars), Next Steps → Capacity.
Fixed
zustand v5 object-selector infinite-render trap (React #185) in the diagram pan/zoom state — selectors split per-field.
v1.70.0MINOR
DCMOC Phase B: multi-site Site Intelligence Engine
Added
DCMOC "Site Intelligence Engine" (Phase B) — the single-country Site Score tab becomes a MULTI-SITE comparison engine per the DC-OS reference: up to 5 candidate sites (3 illustrative EXAMPLE-labeled seeds, fully editable), schematic SVG site map (4 style skins, no map lib), 8-axis radar overlay (recharts), site cards with rank badges, 6 detail panels (Power/Connectivity/Environmental/Risks/Land/Cost with per-value provenance dots: site attribute vs country baseline), Site Score & Compare table (+ absorbed legacy 10-factor engine breakdown), sticky rail (Run Analysis stamp, ranking bars, deterministic key takeaways, Next: Architecture), Edit Criteria drawer — every numeric attribute a CreatableCombobox (preset or custom, clamped; clear → country baseline).
site-adapter (src/lib/site-adapter.ts): site attributes → engine factor overrides MIRRORING models.site.deriveFactors formulas exactly (SAIDI/PGA/tax/flood/water/power); PARITY INVARIANT verified — a site with no overrides reproduces the engine country score exactly (42.1 ≡ 42.1). Engine remains the authoritative Total Score; the 8 axes are a documented presentation decomposition. "View Power/Risk/Tax Analysis" links route to the existing grid/disaster/tax tabs — all 6 Engine-2 children preserved.
Changed
Sidebar label 'Site Score' → 'Site Intelligence' (tab id unchanged). Old SiteIntelDashboard export dormant (content absorbed).
DCMOC "Requirements & Workload Engine" page (Phase A of the DC-OS UIUX program) — replaces the thin Requirements intake dashboard with the full reference design: 1.1 Project Overview (project/customer/COD/grid-voltage/project-type/contract/currency/use-case), 1.2 Workload Profile (IT/peak/avg load w/ MW|kW toggle, rack density CreatableCombobox, computed Total Racks, auto-normalized workload-mix sliders, AI chip, cooling approach), 1.3 Growth Plan (Y0 always = shared IT load; linear/step/custom; 5-yr CAGR), 1.4 Availability Target (engine tier fraction → %, downtime budget min/yr, SLA check), 1.5 Business, Margin & Priority (budget, Design Margin wired into CAPEX contingency per owner mandate, rankable priorities), 1.7 Summary (engine-real models.requirements.validate checklist + flags + PDF). Sticky right rail: deterministic AI Insights, Requirement Score ring, Active Scenarios, per-section Input Quality bars, Next: Site Intelligence.
Phase 0 state layer now live: requirements store registers as the registry's req.* provider; shared fields (itLoad/cooling/country/tier/rack-density) written through mapping helpers into BOTH simulation + capex stores (no drift).
Changed
Sidebar: Engine-1 children → [Requirements & Workload]; Staff Model Config moved to Engine-8 Operations (sim/staff/maint) per owner. Old RequirementsDashboard deleted after absorption.
v1.68.1PATCH
fix: root-tier lockout on premium gates, 22 pages
Fixed
Root accounts were locked out of premium actions site-wide (owner report: "export PDF capex-calculator tidak bisa"). Supabase profiles.tier legitimately holds 'root' (rz-supabase.js allow-list), but 22 pages carried LOCAL strict gates (tier === 'pro' / userTier !== 'pro') that treated a root session as free → login modal instead of the action. Patched every local gate to accept pro || root (capex-calculator gatedAction/isFullPremium/exportCapexCSV path, dc-market-tracker, roi/carbon calculators, FF-1/2/3, geopolitics-3, dashboard tier badge, 13 article premium blocks). Headless regression probe: seeded tier:'root' session → gatedAction('pdf') passes on capex + market-tracker (was BLOCKED). Note: js/rz-feature-flags.js + auth.js getTier() were already root-aware — only page-local checks had drifted.
v1.68.0MINOR
DCMOC 7·Commissioning wired to the RICH cx engine
Added
Rich commissioning engine promoted into rz-engine.js (models.commissioning.*, DATA 2.4.0→2.5.0) — a faithful port of the DC-Hub cx-calculator.html model so DCMOC and the standalone calculator share ONE brain. New pure models: equipScale (26 equipment counts scaled from IT load + rack density), levelDurations/levelCosts (per-level L0–L6 staffed durations + costs at 30 regional day-rate cards — cxDay/fieldDay/oemDay/witnessDay + per-diem + diesel), programRich (gm-normalized ^0.45 base-vs-level-sum blend + campus adders + 15%% contingency → grand total, per-level + per-discipline splits, pctCapex, tier/availability), monteCarlo (N=10000 Box-Muller, itLoad ±7.5%% + pricing ±5%% → P5/P50/P95/CVaR95, seedable for tests), sensitivity (7-param tornado), and mapInput (DCMOC store → rich schema; liquid→dlc, ISO-2 country → nearest CX region, redundancy passthrough). New DATA.commissioning.cx.rich tables (30 rates + cooling/redundancy/building/seismic/substation/BMS/delivery/scope/fire/UPS/gen/density/base + fixed display proportions + 8 scenario presets). Compact programCost/programSchedule kept for back-compat.
DCMOC CommissioningDashboard (Layer 7) rewired to the rich model — equipment-scaled program cost + %%-of-capex, per-level L0–L6 duration+cost bars, equipment-count grid, discipline breakdown, a Monte-Carlo cost-uncertainty band (P5–P95 + P50 marker + CVaR95 + CoV), and a sensitivity tornado. All values move with IT load / cooling / redundancy / country. Graceful fallback to the compact estimate if a stale engine build lacks programRich.
Changed
Engine gate tools/test-rz-engine.mjs 395→421 asserts (rich-cx worked examples with golden values computed from cx-calculator.html's own cxCalcTotalCost — exact grand/subtotal/contingency/duration/equipment parity across enterprise_2mw/hyperscale_50mw/colo_10mw). Reference-parity 126/0 unchanged. rz-engine.min.js rebuilt; DCMOC engine cache-bust dcos2→cxrich; bridge header 2.4.0→2.5.0.
v1.67.6PATCH
audit fixes: LOW polish D11/G3
Changed
Pillar Metric cards (NewEngineDashboards + DesignTools) now lift + glow on hover (intuitive). OPEX KPI labels its basis ("DC-contract rate · 100%% util") + the tooltip explains why it can differ from the standalone OPEX calculator (retail rate + partial utilization) — the documented dual-rate made visible.
v1.67.5PATCH
audit fixes: honesty D8/D9
Fixed
Integrations panel no longer shows hardcoded true — RZ Engine status is a real check (rzModels().capex resolved), gateway labeled honestly "configured" (no fake live-ping). Report availability fallback used Tier-3 (99.982%%) for all tiers → now tier-correct (Tier 2 99.741 / 3 99.982 / 4 99.995) or "—".
v1.67.4PATCH
audit fixes: gaps + docs D7/D10/G1/G2
Fixed
Site data completed: the 7 countries missing from SITE_AUGMENT (CL/CO/KE/NG/NZ/PL/PT) now carry real WRI-Aqueduct/ASHRAE-zone/SAIDI/PGA values → all 32 countries score on real data (was neutral fallback). Missing tooltip: added tab-dashboard to the RZExplain DB (779 entries) + bumped the DCMOC ?v. Dead tab: removed the unrouted scenarios id from the store union. Doc drift: ENGINE_UNIFICATION.md test count 299/0→395/0; rz-engine.ts bridge header v2.3.0→DATA.version 2.4.0. Engine 395/0, parity 126/0, JS-audit clean.
v1.67.3PATCH
audit fixes: DCMOC integrity D1-D6
Fixed
Executive Dashboard site score was hardcoded (constant 68.4 regardless of country, diverged from the Site Intel pillar) → now uses models.site.deriveFactors(country) — the two surfaces agree. Revenue default diverged across 5 surfaces ($120/$150/$280 → contradictory IRR) → single shared DEFAULT_REVENUE_PER_KW_MONTH (constants/finance.ts) in Executive/Financial/Report. SimulationDashboard hardcoded $20,000 salary + $1,126.30 overtime → real selectedCountry.labor + derived OT premium. TierDashboardnetwork sub-score was fixed 70 → derived from tier. StrategicPlanning acquisition ROI used fixed 5MW → real inputs.itLoad. PortfolioDashboard "Grid Intensity" column showed PUE values → relabeled "Site PUE". tsc+build clean.
v1.67.2PATCH
audit fixes: engine correctness E1-E6
Fixed
CRITICALmodels.decision.recommend crashed when objectives passed as {} (guard only covered null/undefined). MAJORmodels.tax.macrsDepreciation treated discountRate=0 as 0.10 (~30%% wrong undiscounted NPV). models.architecture.topology(1) now returns real Tier-1 (was Tier-3 fallback). Climate free-cooling denom 5500→5800 so ASHRAE zone 8 (subarctic) scores above zone 7. Added DATA.sources['decision'] provenance (was missing, CLAUDE.md rule). +5 edge-case asserts (test-rz-engine 395/0, parity 126/0). From a 3-agent adversarial audit.
v1.67.1PATCH
DCMOC: surface AACE accuracy band on CAPEX
Added
CapexDashboard shows the AACE 18R-97 Class-4 budgetary accuracy range (−30%%/+50%%) under Total CAPEX (models.capex.accuracyRange) — honest estimate confidence band. (Carbon scope 1/2/3 already computed locally in CarbonDashboard.)
v1.67.0MINOR
engine research-deepening: pillars 5/10/13 — all 13 covered
engine research-deepening: Pillar 2 Site + per-country data
Added
Pillar 2 Site deepened with real per-country data (25 major DC markets augmented): WRI Aqueduct 4.0 water-stress (0-5), ASHRAE 169-2021 climate zone → free-cooling hours, IEEE-1366 SAIDI grid reliability, USGS PGA → seismic design category. models.site.deriveFactors now uses them: water is no longer hardcoded (0.65→real, e.g. Saudi 0.00 desert), a climate free-cooling factor was added (Sweden 0.91 vs Singapore 0.15), grid prefers SAIDI, seismic prefers PGA (Japan 0.10). Site scores now discriminate realistically (Sweden 80 B prime vs Indonesia 42 D). DATA.sources provenance; test-rz-engine 376/0, parity 126/0. 7 of 13 pillars research-deepened.
v1.65.6PATCH
DCMOC: surface facility-load + lease-up S-curve on Capacity
Added
CapacityDashboard shows PUE-adjusted facility load (models.capacity.facilityLoad) + year-2 lease-up occupancy by market type (occupancyScurve: hyperscale/wholesale/retail). Completes surfacing of all 6 research-deepened pillars (1/3/4/6/8/9) in the DCMOC UI.
v1.65.5PATCH
DCMOC: surface Uptime staffing benchmark on Staffing
Added
StaffingDashboard shows the Uptime Institute critical-facilities staffing benchmark (models.maintenance.staffingBenchmark) vs the configured headcount — FTE/MW by tier, with an aligned/above/below variance chip.
v1.65.4PATCH
DCMOC: surface density-safety + rack-count on Requirements
Added
RequirementsDashboard now feeds the real cooling type into models.requirements.validate and surfaces the density band, implied rack count, and a CRITICAL red flag when the workload density exceeds the cooling ceiling (e.g. AI on air) — ASHRAE-TC9.9 safety check.
v1.65.3PATCH
DCMOC: surface Weibull wear-out risk on Asset
Added
AssetIntelDashboard surfaces models.asset.failureProbability — per-class Weibull cumulative failure probability at 60%% of design life (battery/ups/generator/crac/chiller/transformer), color-coded, driving condition-based replacement timing.
v1.65.2PATCH
DCMOC: surface research-deepened engine outputs
Added
ConstructionDashboard surfaces models.construction.longLeadRisk — critical long-lead gear (transformer/switchgear/genset/UPS/chiller) vs power-on month, flagging what to pre-order (rose = critical). ArchitectureDashboard surfaces thermalCheck (ASHRAE TC9.9 compliance) + topology (Uptime/TIA-942-C rating, power/cooling paths, floor loading). Makes the v1.65 research depth visible.
v1.65.1PATCH
engine research-deepening: pillars 6/8/9
Added
Pillars 6/8/9 deepened (research pass cont.): L6 construction long-lead procurement risk (transformer 60-120wk, switchgear, genset, UPS, chiller — the dominant AI-era schedule driver, models.construction.longLeadRisk); L8 Uptime critical-facilities staffing benchmark (FTE per position × tier + per-MW techs, models.maintenance.staffingBenchmark); L9 Weibull wear-out failure curves per asset class (models.asset.failureProbability, β/η from IEEE-493 + manufacturer MTBF). DATA.sources provenance + asserts (test-rz-engine 373/0, parity 126/0). 6 of 13 pillars now research-deepened.
v1.65.0MINOR
engine research-deepening: pillars 1/3/4, cited
Added
Deep-research enhancement of the DC-OS engine (pillars 1/3/4) from authoritative standards. L1 requirements: coolingMaxRackKw density ceilings (ASHRAE TC9.9 5th ed. — air ~20kW/rack; NVIDIA GB200 132kW), rackCount, densityBand + a CRITICAL density-vs-cooling safety flag. L3 architecture: ASHRAE thermal-envelope check (A1-A4/H1 supply-temp + ΔT), Uptime/TIA-942-C tier topology, floor loading, design-fee. L4 capacity: logistic S-curve lease-up by market type (CBRE H1 2025), PUE-adjusted facility load, stranded-capacity (Uptime 2024), power-vs-space binding. All with DATA.sources provenance + worked-example asserts (test-rz-engine 366/0, parity 126/0). Pillars 2 (site) + 5-8 + 9-13 research follow.
v1.64.4PATCH
DCMOC: engine tooltips + hover on the KPI efficiency row
Changed
KpiEfficiencyRow (PUE/WUE/CUE/Availability/LCC) now has hover-lift + engine-sourced tooltips (glossary keys pue/wue/cue/availability/tco). Completes the metric-tooltip sweep across the dashboard's main panels.
LifecycleStrip "7. Commissioning" chip was dead — it (and several others) had a missing/stale tab mapping, so the button was disabled. All 13 chips now route to their real pillar tab (Requirements→requirements, Site→site, Architecture→architecture, Construction→construction, Commissioning→commissioning, Assets→asset-health, AI→dashboard).
Changed
Lifecycle chips are now color-coded per engine, identical to the sidebar submenu numbers (ENGINE_COLORS 1–13) — intuitive alignment; each chip's icon + number + border + hover glow use its engine accent. The Engine Dependency Graph matches.
Metric tiles get hover highlight + engine-sourced tooltips (CapacityArchOverview): each tile lifts on hover and carries an <Explain> tooltip pulled from the RZExplain knowledge DB (glossary keys — NOT hardcoded strings). Tiles also made responsive.
Data Flow & Digital Thread is now LIVE: each stage shows its real count (configured inputs / 13 engines / N model namespaces / computed outputs / AI decisions / actions) with a flowing pulse + a "live" indicator — no longer a static image.
StrategicPlanningDashboard acquisition ROI now derives annual OPEX from models.opex.totalAnnual (engine-real, country + PUE aware) instead of a flat 8%-of-CAPEX heuristic — with a graceful fallback to the heuristic when the engine is unavailable. Backend /calc redeployed with the v1.64 rich models live.
v1.64.1PATCH
DCMOC: Platform surfaces made real, engine-backed
Added
The 8 DCMOC sidebar Platform/Support entries (were dead "coming soon") are now functional, engine-backed surfaces (PlatformDashboards.tsx):
Data Library — read-only browser of the canonical rz-engine.js DATA (32 countries with electricity/tax/grid-carbon/constr-index, 25 markets, PUE matrix, refrigerants) — proves the single source.
Templates — one-click apply of the engine use-case profiles (models.requirements.useCaseProfiles: AI/HPC/cloud/colo/enterprise/edge) to the project.
Projects — saved-scenario list (restore/compare/delete).
Knowledge Base — live engine-model list + glossary link. Integrations — real connection status (Supabase/engine/backend/AI). Audit / User Management — honest status tied to the Supabase audit_log + rz-ops admin.
DC-OS: promote the RICH standalone models into the engine
Added
The richer models that lived only in the standalone tools are now full-fidelity in rz-engine.js (extending, not replacing, the simple functions — tier.classify/fire.agentQuantity/cdu.size/spares.eoq unchanged):
models.tier.advise() — 6-band Uptime grading (I / I+ / II / II+ / III / IV) + per-category scores + canT3/canT4 floor constraints + recommendations (from tier-advisor.html).
models.cdu.hydraulics() — water/glycol properties + Darcy-Weisbach ΔP (Haaland friction) + Reynolds + pump power + Magnus dew-point margin (from js/cdu-engine.js).
models.spares.newsvendor() — critical ratio, Q* via Φ⁻¹(CR) or Poisson (low-demand), fill rate, annual cost curve (from spares-readiness-calculator.html).
Constants moved to DATA.{tier,fire,cdu,spares} with DATA.sources provenance. tools/test-rz-engine.mjs355/0 (+34 asserts). cf-worker/src/calc.js allow-lists the new data.
DCMOC pillars upgraded to the rich functions: Fire (NOAEL margin + CO₂e + cylinders), CDU (ΔP + Reynolds + pump kW + dew-point margin), Spares (newsvendor Q* + fill rate). Tier pillar stays on classify (the 6-band advise needs the full topology dropdowns the tool collects). All with graceful fallback to the simple function.
standalone tools: engine as fallback where the dedicated engine is richer
Changed
fire-calculator.html + cdu-calculator.html now load rz-engine.min.js and delegate to models.fire/models.cduonly as a fallback — their dedicated FIRE_ENGINE/CDU_ENGINE (NOAEL safety, GWP, thermohydraulics, NPSH) are richer, so they stay primary. tier-advisor.html (6-band I/I+/…/IV grading) + spares-readiness-calculator.html (newsvendor/fill-rate) kept inline — their models are richer than the engine's 4-band tier / EOQ; promoting the richer logic into rz-engine.js is the honest next step, not downgrading the tools. Audits CLEAN; no calculator behavior changed.
setup-supabase.html repurposed → DC-OS manual-action checklist (token rotation, backend deploy for the v1.63.0 /calc models, tests).
models.decision.recommend() — Layer-13 deterministic decision brain in the engine (mirrors the DCMOC provider): always-on, never-empty, explainable recommendations (PUE/availability/cost-band/financial/density/schedule/site rules + objective ranking + disclaimer).
All 5 registered on the cf-worker /calc allow-list (backend-served, anti-theft). tools/test-rz-engine.mjs +10 asserts → 321/0.
DCMOC surfaces the 4 new pillars (DesignToolsDashboards.tsx): Tier Classification (Reliability group), Fire Suppression (Architecture), CDU/Liquid Cooling (Capacity), Spares Optimization (Asset) — each engine-real + input-driven, in the sidebar under its lifecycle engine.
Retail vs DC-contract electricity rate documented, not force-merged:DATA.countries.economy.electricityRate is the retail/display rate (single-sourced across calculators + DCMOC); models.opex keeps its calibrated DC-contract blend (what the cockpit-accuracy gate is validated against) — the two are intentionally distinct (a DC gets PPA/wholesale rates), with ppaRate override available. This resolves the user-visible rate divergence without degrading OPEX accuracy.
models.site.deriveFactors(countryId) — derives the 0-1 site factor vector (power/grid/seismic/talent/tax/carbon/flood/latency/water) from DATA.countries, so site.score() is REAL and country-varying (SG 70, US 72, DE 61, ID 55). Was: a hardcoded factor vector that produced a constant score regardless of country.
models.commissioning.programCost() + programSchedule() — full L0–L6 commissioning PROGRAM cost + schedule (discipline $/kW base, level cost/schedule shares, discipline split, cooling/redundancy multipliers, region scaling via DATA.countries.constructionIndex), promoted from cx-calculator.html's inline logic into the shared engine (DATA.commissioning.cx + DATA.sources row). Cost/schedule now move with itLoad/cooling/redundancy/country.
DCMOC integrity fixes ("de-fake"): the Commissioning module fed a hardcoded {L1:1,L2:1,…} completion vector to a real engine function (constant output); it now shows the LIVE models.commissioning program cost + schedule + discipline breakdown from the current project inputs. The Site Intelligence module fed a hardcoded factor vector; it now derives factors from the selected country via models.site.deriveFactors. (DCMOC static app — versioned separately; noted here for the engine wiring.)
DCMOC Layer-13 AI Assistant: the "AI Assistant" button now opens a config modal — plug in an OpenAI/Anthropic/custom API (key stored only in-browser) and the decision layer routes through it; empty ⇒ the built-in deterministic RZ engine runs everything (auto-fallback on any error). remoteApiProvider is now runtime-configurable.
Root calculators single-sourced:opex-calculator.html, carbon-footprint.html, tco-calculator.html now resolve country electricity rate / grid-carbon / PUE from RZEngine.data.countries + pueMatrix (inline fallback), killing the per-tool divergence (Singapore rate now 0.22 everywhere; air PUE 1.50). Also fixed: carbon-footprint.html previously referenced the engine only inside a PDF template string — it now actually loads rz-engine.min.js. Audits (audit-js-syntax, audit-script-tags) CLEAN.
DCMOC Phase C wiring: 9 modules (GridReliability, DisasterRisk, Compliance, Capacity, AssetLifecycle, CBM, FuelGen, TaxIncentive, Carbon) now delegate to their existing rzModels() engine models with local fallback; Carbon reconciled to models.carbon.annualTonnes (agrees with the Executive Dashboard). DCMOC module KPI grids made mobile-responsive (12 files); dashboard 0 horizontal overflow at 390px + 768px.
Still to build (deferred, need judgment): models.decision (promote the DCMOC deterministic provider into the engine), and consolidate fire/cdu/tier/spares (standalone js/*.js + inline tool logic) into shared models.*.
Dual DC electricity-rate (DATA.regions.powerKwh DC-blend vs DATA.countries.economy.electricityRate retail) intentionally NOT force-merged — needs a deliberate accuracy decision on the canonical DC power rate.
v1.61.0MINOR
DC-OS engine unification P-A: single-source country reference
Added
rz-engine.js DATA.countries — THE single source of truth for region/country economics
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.0MINOR
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.10PATCH
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.9PATCH
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.8PATCH
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.7PATCH
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.6PATCH
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.5PATCH
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.4PATCH
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.3PATCH
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.2PATCH
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 CollectionPageItemList — 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.1PATCH
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.0MINOR
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
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.
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.71PATCH
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.70PATCH
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
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
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)
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.7PATCH
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.jsROOT_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.6PATCH
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)