Seed UNS hierarchy across 6 sites; rebrand outputs to SCADA IT/OT with ZB template
Lands per-site UNS subtree files (Warsaw West/North, Shannon, Galway, TMT, Ponce) seeded from OpenText facility docs — Warsaw split confirmed as numbered = legacy Zimmer = West, lettered = legacy Biomet = North. Renames project framing from "Shopfloor IT/OT" to "SCADA IT/OT" for accuracy. Extracts a ZB-branded PowerPoint template from example_powerpoint.pptx and wires it into the outputs pipeline. Trims deck from 18 to 16 slides (BOBJ->Power BI transferred to another team, Non-Goals and Asks dropped); goal-state BOBJ analysis pruned to a stub.
This commit is contained in:
26
outputs/workspace/slides/slide01.html
Normal file
26
outputs/workspace/slides/slide01.html
Normal file
@@ -0,0 +1,26 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
html { background: #ffffff; }
|
||||
body {
|
||||
width: 720pt; height: 405pt; margin: 0; padding: 0;
|
||||
background: #1C2833; font-family: Arial, sans-serif;
|
||||
display: flex; color: #F4F6F6;
|
||||
}
|
||||
.wrap { width: 720pt; padding: 140pt 60pt 0 60pt; text-align: center; }
|
||||
.accent-bar { width: 100pt; height: 4pt; background: #D4843D; margin: 0 auto 22pt auto; }
|
||||
h1 { font-size: 32pt; font-weight: bold; margin: 0 0 12pt 0; letter-spacing: -0.5pt; text-align: center; }
|
||||
.subtitle { font-size: 20pt; color: #AAB7B8; margin: 0 0 44pt 0; font-weight: normal; text-align: center; }
|
||||
.date { font-size: 11pt; color: #AAB7B8; margin: 0; letter-spacing: 1pt; text-align: center; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrap">
|
||||
<div class="accent-bar"></div>
|
||||
<h1>SCADA IT/OT Transformation</h1>
|
||||
<p class="subtitle">3-Year Plan</p>
|
||||
<p class="date">AS OF 2026-04-24</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
33
outputs/workspace/slides/slide02.html
Normal file
33
outputs/workspace/slides/slide02.html
Normal file
@@ -0,0 +1,33 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
html { background: #ffffff; }
|
||||
body {
|
||||
width: 720pt; height: 405pt; margin: 0; padding: 0;
|
||||
background: #FFFFFF; font-family: Arial, sans-serif;
|
||||
display: flex; flex-direction: column;
|
||||
}
|
||||
.header { padding: 12pt 40pt 4pt 40pt; border-bottom: 1.5pt solid #0066B3; }
|
||||
.header h1 { margin: 0; font-size: 22pt; font-weight: bold; color: #0066B3; }.body { padding: 22pt 40pt; flex: 1; color: #333333; }
|
||||
.vision-wrap { border-left: 3pt solid #0066B3; padding-left: 12pt; margin: 0 0 14pt 0; }
|
||||
.vision { color: #2B2A80; font-size: 14pt; font-style: italic; margin: 0; }
|
||||
ul { margin: 6pt 0 0 22pt; padding: 0; }
|
||||
li { font-size: 12pt; margin-bottom: 8pt; line-height: 1.35; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<h1>Executive Summary</h1>
|
||||
</div>
|
||||
<div class="body">
|
||||
<div class="vision-wrap"><p class="vision">Vision: stable, single point of integration between shopfloor OT and enterprise IT.</p></div>
|
||||
<ul>
|
||||
<li><b>Pillar 1 — Unification:</b> 100% of sites on the standardized stack at end of Year 3.</li>
|
||||
<li><b>Pillar 2 — Analytics/AI enablement:</b> ≤15-minute analytics SLO; one "not possible before" use case in production.</li>
|
||||
<li><b>Pillar 3 — Legacy retirement:</b> bespoke IT↔OT integration inventory driven to zero.</li>
|
||||
<li><b>Out of scope:</b> operator UX modernization, licensing strategy, VM-level DR, physical network segmentation.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
34
outputs/workspace/slides/slide03.html
Normal file
34
outputs/workspace/slides/slide03.html
Normal file
@@ -0,0 +1,34 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
html { background: #ffffff; }
|
||||
body {
|
||||
width: 720pt; height: 405pt; margin: 0; padding: 0;
|
||||
background: #FFFFFF; font-family: Arial, sans-serif;
|
||||
display: flex; flex-direction: column;
|
||||
}
|
||||
.header { padding: 12pt 40pt 4pt 40pt; border-bottom: 1.5pt solid #0066B3; }
|
||||
.header h1 { margin: 0; font-size: 22pt; font-weight: bold; color: #0066B3; }.body { padding: 24pt 40pt; flex: 1; color: #333333; }
|
||||
ul { margin: 0 0 0 22pt; padding: 0; }
|
||||
li { font-size: 13pt; margin-bottom: 11pt; line-height: 1.35; }
|
||||
.footer { padding: 6pt 40pt 10pt 40pt; color: #AAB7B8; font-size: 9pt; font-style: italic; }
|
||||
.footer p { margin: 0; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<h1>Today's Reality</h1>
|
||||
</div>
|
||||
<div class="body">
|
||||
<ul>
|
||||
<li><b>Split SCADA stack</b> — Aveva System Platform for validated data; Ignition for KPI monitoring.</li>
|
||||
<li><b>Central Ignition</b> in South Bend holds direct OPC UA sessions to site equipment over the WAN.</li>
|
||||
<li><b>Multiple concurrent OPC UA sessions</b> to the same equipment from different consumers.</li>
|
||||
<li><b>Three legacy IT↔OT integrations</b> bypass ScadaBridge central (Delmia DNC, Camstar MES, custom email service).</li>
|
||||
<li><b>Fragmented data access</b> — consumers reading the same tag can see different values depending on sampling/deadband settings.</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer"><p>Full detail: current-state.md → Systems & Interfaces, Equipment OPC UA.</p></div>
|
||||
</body>
|
||||
</html>
|
||||
32
outputs/workspace/slides/slide04.html
Normal file
32
outputs/workspace/slides/slide04.html
Normal file
@@ -0,0 +1,32 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
html { background: #ffffff; }
|
||||
body {
|
||||
width: 720pt; height: 405pt; margin: 0; padding: 0;
|
||||
background: #FFFFFF; font-family: Arial, sans-serif;
|
||||
display: flex; flex-direction: column;
|
||||
}
|
||||
.header { padding: 12pt 40pt 4pt 40pt; border-bottom: 1.5pt solid #0066B3; }
|
||||
.header h1 { margin: 0; font-size: 22pt; font-weight: bold; color: #0066B3; }.body { padding: 40pt 60pt; flex: 1; color: #333333; display: flex; flex-direction: column; justify-content: center; }
|
||||
.quote-wrap { border-left: 5pt solid #0066B3; padding-left: 18pt; margin: 0 0 28pt 0; }
|
||||
.quote { font-size: 22pt; color: #2B2A80; font-weight: bold; line-height: 1.3; margin: 0; }
|
||||
ul { margin: 0 0 0 22pt; padding: 0; }
|
||||
li { font-size: 13pt; margin-bottom: 9pt; line-height: 1.35; color: #333333; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<h1>Vision</h1>
|
||||
</div>
|
||||
<div class="body">
|
||||
<div class="quote-wrap"><p class="quote">A stable, single point of integration between shopfloor OT and enterprise IT.</p></div>
|
||||
<ul>
|
||||
<li>Every cross-domain path flows through ScadaBridge central — the sole sanctioned IT↔OT crossing point.</li>
|
||||
<li>Equipment data is site-local, canonically modeled, and shared through a single session per device.</li>
|
||||
<li>Tiebreaker for ambiguous decisions: preserve this stable-single-point-of-integration posture.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
45
outputs/workspace/slides/slide05.html
Normal file
45
outputs/workspace/slides/slide05.html
Normal file
@@ -0,0 +1,45 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
html { background: #ffffff; }
|
||||
body {
|
||||
width: 720pt; height: 405pt; margin: 0; padding: 0;
|
||||
background: #FFFFFF; font-family: Arial, sans-serif;
|
||||
display: flex; flex-direction: column;
|
||||
}
|
||||
.header { padding: 12pt 40pt 4pt 40pt; border-bottom: 1.5pt solid #0066B3; }
|
||||
.header h1 { margin: 0; font-size: 22pt; font-weight: bold; color: #0066B3; }.body { padding: 26pt 36pt; flex: 1; color: #333333; display: flex; flex-direction: row; gap: 18pt; }
|
||||
.pillar { flex: 1; background: #ffffff; border-top: 4pt solid #0066B3; padding: 18pt 16pt; border-radius: 4pt; }
|
||||
.pillar h2 { margin: 0 0 6pt 0; font-size: 14pt; color: #2B2A80; }
|
||||
.pillar .tag { font-size: 9pt; color: #AAB7B8; margin: 0 0 12pt 0; letter-spacing: 1pt; }
|
||||
.pillar .criterion { font-size: 12pt; font-weight: bold; color: #2B2A80; margin: 0 0 10pt 0; }
|
||||
.pillar .context { font-size: 11pt; margin: 0; color: #333333; line-height: 1.4; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<h1>Three Pillars</h1>
|
||||
</div>
|
||||
<div class="body">
|
||||
<div class="pillar">
|
||||
<p class="tag">PILLAR 1</p>
|
||||
<h2>Unification</h2>
|
||||
<p class="criterion">100% of sites on the standardized stack.</p>
|
||||
<p class="context">Every site runs OtOpcUa + ScadaBridge + Redpanda + SnowBridge + Snowflake. No bespoke site-specific integration.</p>
|
||||
</div>
|
||||
<div class="pillar">
|
||||
<p class="tag">PILLAR 2</p>
|
||||
<h2>Analytics / AI Enablement</h2>
|
||||
<p class="criterion">≤15-minute SLO; one "not possible before" use case in production.</p>
|
||||
<p class="context">Canonical model + curated layer unlock cross-domain analytics that fragmented today's estate can't deliver.</p>
|
||||
</div>
|
||||
<div class="pillar">
|
||||
<p class="tag">PILLAR 3</p>
|
||||
<h2>Legacy Retirement</h2>
|
||||
<p class="criterion">Inventory driven to zero.</p>
|
||||
<p class="context">Three bespoke IT↔OT integrations today; each migrates to ScadaBridge-central or is decommissioned.</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
44
outputs/workspace/slides/slide06.html
Normal file
44
outputs/workspace/slides/slide06.html
Normal file
@@ -0,0 +1,44 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
html { background: #ffffff; }
|
||||
body {
|
||||
width: 720pt; height: 405pt; margin: 0; padding: 0;
|
||||
background: #FFFFFF; font-family: Arial, sans-serif;
|
||||
display: flex; flex-direction: column;
|
||||
}
|
||||
.header { padding: 12pt 40pt 4pt 40pt; border-bottom: 1.5pt solid #0066B3; }
|
||||
.header h1 { margin: 0; font-size: 22pt; font-weight: bold; color: #0066B3; }.body { padding: 22pt 40pt; flex: 1; color: #333333; }
|
||||
.group { margin-bottom: 13pt; }
|
||||
.group-label { font-size: 10pt; color: #0066B3; letter-spacing: 1pt; font-weight: bold; margin: 0 0 4pt 0; }
|
||||
.group-content { font-size: 13pt; margin: 0; line-height: 1.35; color: #2B2A80; }
|
||||
.footer { padding: 6pt 40pt 10pt 40pt; color: #AAB7B8; font-size: 9pt; font-style: italic; }
|
||||
.footer p { margin: 0; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<h1>Enterprise Layout</h1>
|
||||
</div>
|
||||
<div class="body">
|
||||
<div class="group">
|
||||
<p class="group-label">PRIMARY DATA CENTER</p>
|
||||
<p class="group-content">South Bend — central hosting for Aveva System Platform primary cluster, Ignition, Historian, Snowflake.</p>
|
||||
</div>
|
||||
<div class="group">
|
||||
<p class="group-label">LARGEST SITES</p>
|
||||
<p class="group-content">Warsaw West (bldg-5, bldg-19) · Warsaw North — one cluster per production building.</p>
|
||||
</div>
|
||||
<div class="group">
|
||||
<p class="group-label">OTHER INTEGRATED SITES</p>
|
||||
<p class="group-content">Shannon · Galway · TMT · Ponce — single cluster per site.</p>
|
||||
</div>
|
||||
<div class="group">
|
||||
<p class="group-label">NOT YET INTEGRATED</p>
|
||||
<p class="group-content">Berlin · Winterthur · Jacksonville · others — lighter-weight onboarding pattern Year 2+.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer"><p>Smaller-site list is volatile; rely on named examples as illustrative, not authoritative.</p></div>
|
||||
</body>
|
||||
</html>
|
||||
32
outputs/workspace/slides/slide07.html
Normal file
32
outputs/workspace/slides/slide07.html
Normal file
@@ -0,0 +1,32 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
html { background: #ffffff; }
|
||||
body {
|
||||
width: 720pt; height: 405pt; margin: 0; padding: 0;
|
||||
background: #FFFFFF; font-family: Arial, sans-serif;
|
||||
display: flex; flex-direction: column;
|
||||
}
|
||||
.header { padding: 12pt 40pt 4pt 40pt; border-bottom: 1.5pt solid #0066B3; }
|
||||
.header h1 { margin: 0; font-size: 22pt; font-weight: bold; color: #0066B3; }.body { padding: 22pt 40pt; flex: 1; color: #333333; }
|
||||
ul { margin: 0 0 0 22pt; padding: 0; }
|
||||
li { font-size: 12pt; margin-bottom: 9pt; line-height: 1.35; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<h1>Today's Systems</h1>
|
||||
</div>
|
||||
<div class="body">
|
||||
<ul>
|
||||
<li><b>Aveva System Platform</b> — validated data collection; primary cluster central + site clusters.</li>
|
||||
<li><b>Ignition SCADA</b> — KPI monitoring; central in South Bend, WAN-dependent direct OPC UA to sites.</li>
|
||||
<li><b>ScadaBridge</b> — in-house Akka.NET integration layer; already deployed; the IT↔OT strategic layer.</li>
|
||||
<li><b>LmxOpcUa</b> — in-house OPC UA server exposing System Platform objects; per-node today, evolves into OtOpcUa.</li>
|
||||
<li><b>Camstar MES</b> — sole enterprise MES; today integrates via single Aveva Web API call.</li>
|
||||
<li><b>Aveva Historian</b> — sole historian; central-only in South Bend; permanent retention; BOBJ → Power BI migration in flight.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
54
outputs/workspace/slides/slide08.html
Normal file
54
outputs/workspace/slides/slide08.html
Normal file
@@ -0,0 +1,54 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
html { background: #ffffff; }
|
||||
body {
|
||||
width: 720pt; height: 405pt; margin: 0; padding: 0;
|
||||
background: #FFFFFF; font-family: Arial, sans-serif;
|
||||
display: flex; flex-direction: column;
|
||||
}
|
||||
.header { padding: 12pt 40pt 4pt 40pt; border-bottom: 1.5pt solid #0066B3; }
|
||||
.header h1 { margin: 0; font-size: 22pt; font-weight: bold; color: #0066B3; }.body { padding: 22pt 40pt; flex: 1; color: #333333; display: flex; flex-direction: column; }
|
||||
.layer-stack { display: flex; flex-direction: column; gap: 6pt; }
|
||||
.layer { background: #ffffff; padding: 10pt 14pt; border-left: 6pt solid #0066B3; border-radius: 3pt; }
|
||||
.layer .tag { font-size: 9pt; color: #0066B3; letter-spacing: 1pt; font-weight: bold; margin: 0 0 2pt 0; }
|
||||
.layer .name { font-size: 12pt; font-weight: bold; margin: 0 0 2pt 0; color: #2B2A80; }
|
||||
.layer .desc { font-size: 10pt; margin: 0; color: #333333; }
|
||||
.callout { background: #0066B3; color: #FFFFFF; padding: 10pt 14pt; border-radius: 3pt; margin-top: 10pt; }
|
||||
.callout p { margin: 0; font-size: 11pt; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<h1>Goal State — Layered Architecture</h1>
|
||||
</div>
|
||||
<div class="body">
|
||||
<div class="layer-stack">
|
||||
<div class="layer">
|
||||
<p class="tag">LAYER 1 — EQUIPMENT</p>
|
||||
<p class="name">PLCs, CNCs, OPC UA-native devices</p>
|
||||
<p class="desc">One OPC UA session per device; OtOpcUa holds it.</p>
|
||||
</div>
|
||||
<div class="layer">
|
||||
<p class="tag">LAYER 2 — OtOpcUa</p>
|
||||
<p class="name">Equipment namespace + System Platform namespace (absorbs LmxOpcUa)</p>
|
||||
<p class="desc">Clustered, site-local. Single sanctioned OPC UA access point per site.</p>
|
||||
</div>
|
||||
<div class="layer">
|
||||
<p class="tag">LAYER 3 — SCADA</p>
|
||||
<p class="name">Aveva System Platform (validated) · Ignition (KPI)</p>
|
||||
<p class="desc">Derives canonical machine state from raw signals.</p>
|
||||
</div>
|
||||
<div class="layer">
|
||||
<p class="tag">LAYER 4 — ScadaBridge</p>
|
||||
<p class="name">IT/OT bridge — central integration layer</p>
|
||||
<p class="desc">Deadband, store-and-forward, producer to Redpanda.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="callout">
|
||||
<p><b>ScadaBridge central is the sole IT↔OT crossing point.</b></p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
50
outputs/workspace/slides/slide09.html
Normal file
50
outputs/workspace/slides/slide09.html
Normal file
@@ -0,0 +1,50 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
html { background: #ffffff; }
|
||||
body {
|
||||
width: 720pt; height: 405pt; margin: 0; padding: 0;
|
||||
background: #FFFFFF; font-family: Arial, sans-serif;
|
||||
display: flex; flex-direction: column;
|
||||
}
|
||||
.header { padding: 12pt 40pt 4pt 40pt; border-bottom: 1.5pt solid #0066B3; }
|
||||
.header h1 { margin: 0; font-size: 22pt; font-weight: bold; color: #0066B3; }.body { padding: 22pt 30pt; flex: 1; color: #333333; display: flex; flex-direction: column; justify-content: center; }
|
||||
.flow-row { display: flex; justify-content: space-between; align-items: center; gap: 4pt; margin-bottom: 16pt; }
|
||||
.node { background: #ffffff; border: 1pt solid #AAB7B8; padding: 10pt 6pt; border-radius: 3pt; flex: 1; text-align: center; }
|
||||
.node p { margin: 0; font-size: 9pt; font-weight: bold; color: #2B2A80; }
|
||||
.node .type { font-size: 7pt; color: #AAB7B8; margin-top: 2pt; letter-spacing: 0.5pt; }
|
||||
.arrow { font-size: 12pt; color: #0066B3; font-weight: bold; }
|
||||
.arrow p { margin: 0; }
|
||||
.ot { background: #E8EDF0; }
|
||||
.it { background: #FCEFE3; }
|
||||
.caption { font-size: 11pt; color: #333333; text-align: center; line-height: 1.4; margin: 12pt 20pt 0 20pt; font-style: italic; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<h1>End-to-End Data Flow</h1>
|
||||
</div>
|
||||
<div class="body">
|
||||
<div class="flow-row">
|
||||
<div class="node ot"><p>Equipment</p><p class="type">OT</p></div>
|
||||
<div class="arrow"><p>→</p></div>
|
||||
<div class="node ot"><p>OtOpcUa</p><p class="type">OT · Layer 2</p></div>
|
||||
<div class="arrow"><p>→</p></div>
|
||||
<div class="node ot"><p>System Platform / Ignition</p><p class="type">OT · Layer 3</p></div>
|
||||
<div class="arrow"><p>→</p></div>
|
||||
<div class="node ot"><p>ScadaBridge</p><p class="type">OT · Layer 4</p></div>
|
||||
</div>
|
||||
<div class="flow-row">
|
||||
<div class="node it"><p>Redpanda</p><p class="type">IT · EventHub</p></div>
|
||||
<div class="arrow"><p>→</p></div>
|
||||
<div class="node it"><p>SnowBridge</p><p class="type">IT · Ingest + Transform</p></div>
|
||||
<div class="arrow"><p>→</p></div>
|
||||
<div class="node it"><p>Snowflake</p><p class="type">IT · Curated Layer</p></div>
|
||||
<div class="arrow"><p>→</p></div>
|
||||
<div class="node it"><p>Power BI</p><p class="type">IT · Consumer</p></div>
|
||||
</div>
|
||||
<p class="caption">A tag read from a machine in Warsaw West flows across the stack into enterprise analytics, without a second IT↔OT crossing.</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
35
outputs/workspace/slides/slide10.html
Normal file
35
outputs/workspace/slides/slide10.html
Normal file
@@ -0,0 +1,35 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
html { background: #ffffff; }
|
||||
body {
|
||||
width: 720pt; height: 405pt; margin: 0; padding: 0;
|
||||
background: #FFFFFF; font-family: Arial, sans-serif;
|
||||
display: flex; flex-direction: column;
|
||||
}
|
||||
.header { padding: 12pt 40pt 4pt 40pt; border-bottom: 1.5pt solid #0066B3; }
|
||||
.header h1 { margin: 0; font-size: 22pt; font-weight: bold; color: #0066B3; }.body { padding: 22pt 40pt; flex: 1; color: #333333; }
|
||||
.tagline-wrap { border-left: 3pt solid #0066B3; padding-left: 10pt; margin: 0 0 12pt 0; }
|
||||
.tagline { font-size: 12pt; color: #2B2A80; margin: 0; font-style: italic; }
|
||||
ul { margin: 0 0 0 22pt; padding: 0; }
|
||||
li { font-size: 12pt; margin-bottom: 9pt; line-height: 1.35; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<h1>OtOpcUa — the Unification Layer</h1>
|
||||
</div>
|
||||
<div class="body">
|
||||
<div class="tagline-wrap"><p class="tagline">Single sanctioned OPC UA access point per site — one session per piece of equipment.</p></div>
|
||||
<ul>
|
||||
<li><b>Two namespaces:</b> equipment (raw) + System Platform (processed) — absorbs LmxOpcUa.</li>
|
||||
<li><b>Clustered,</b> co-located on existing System Platform nodes — no new hardware footprint.</li>
|
||||
<li><b>Hybrid driver strategy:</b> proactive core library (8 drivers) + on-demand long-tail.</li>
|
||||
<li><b>OPC UA-native auth:</b> UserName tokens + standard security modes (inherited from LmxOpcUa).</li>
|
||||
<li><b>Data-path ACL model:</b> scope hierarchy + per-node permissions, committed in v2.</li>
|
||||
<li><b>Tiered cutover:</b> ScadaBridge first, Ignition second, System Platform IO last (across Years 1–3).</li>
|
||||
</ul>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
35
outputs/workspace/slides/slide11.html
Normal file
35
outputs/workspace/slides/slide11.html
Normal file
@@ -0,0 +1,35 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
html { background: #ffffff; }
|
||||
body {
|
||||
width: 720pt; height: 405pt; margin: 0; padding: 0;
|
||||
background: #FFFFFF; font-family: Arial, sans-serif;
|
||||
display: flex; flex-direction: column;
|
||||
}
|
||||
.header { padding: 12pt 40pt 4pt 40pt; border-bottom: 1.5pt solid #0066B3; }
|
||||
.header h1 { margin: 0; font-size: 22pt; font-weight: bold; color: #0066B3; }.body { padding: 22pt 40pt; flex: 1; color: #333333; }
|
||||
.tagline-wrap { border-left: 3pt solid #0066B3; padding-left: 10pt; margin: 0 0 12pt 0; }
|
||||
.tagline { font-size: 12pt; color: #2B2A80; margin: 0; font-style: italic; }
|
||||
ul { margin: 0 0 0 22pt; padding: 0; }
|
||||
li { font-size: 12pt; margin-bottom: 8pt; line-height: 1.35; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<h1>Analytics Stack — SnowBridge + Snowflake</h1>
|
||||
</div>
|
||||
<div class="body">
|
||||
<div class="tagline-wrap"><p class="tagline">SnowBridge owns the full path: ingest + in-process transform + curated-table write.</p></div>
|
||||
<ul>
|
||||
<li><b>Custom-built .NET service</b> that reads from Aveva Historian SQL (Year 1) and Redpanda/ScadaBridge (Year 2).</li>
|
||||
<li><b>In-process transforms,</b> canonical-model-aligned — aggregation, state enrichment, dim_equipment resolution.</li>
|
||||
<li><b>No dbt, no external orchestrator, no Snowflake landing tier</b> — transforms live in the service.</li>
|
||||
<li><b>Governed selection</b> of topics/tags via operator web UI with blast-radius-based approval workflow.</li>
|
||||
<li><b>≤15-minute analytics SLO</b> end-to-end (ScadaBridge emit → curated table in Snowflake).</li>
|
||||
<li><b>One "not possible before" AI/analytics use case</b> in production by end of plan — pillar 2 gate.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
35
outputs/workspace/slides/slide12.html
Normal file
35
outputs/workspace/slides/slide12.html
Normal file
@@ -0,0 +1,35 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
html { background: #ffffff; }
|
||||
body {
|
||||
width: 720pt; height: 405pt; margin: 0; padding: 0;
|
||||
background: #FFFFFF; font-family: Arial, sans-serif;
|
||||
display: flex; flex-direction: column;
|
||||
}
|
||||
.header { padding: 12pt 40pt 4pt 40pt; border-bottom: 1.5pt solid #0066B3; }
|
||||
.header h1 { margin: 0; font-size: 22pt; font-weight: bold; color: #0066B3; }.body { padding: 22pt 40pt; flex: 1; color: #333333; }
|
||||
.tagline-wrap { border-left: 3pt solid #0066B3; padding-left: 10pt; margin: 0 0 12pt 0; }
|
||||
.tagline { font-size: 12pt; color: #2B2A80; margin: 0; font-style: italic; }
|
||||
ul { margin: 0 0 0 22pt; padding: 0; }
|
||||
li { font-size: 12pt; margin-bottom: 8pt; line-height: 1.35; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<h1>Redpanda EventHub — the Async Backbone</h1>
|
||||
</div>
|
||||
<div class="body">
|
||||
<div class="tagline-wrap"><p class="tagline">Self-hosted Kafka-compatible backbone. Single-cluster HA, central in South Bend.</p></div>
|
||||
<ul>
|
||||
<li><b>Per-topic tiered retention</b> — operational 7d · analytics 30d · compliance 90d.</li>
|
||||
<li><b>Bundled Schema Registry,</b> Protobuf schemas in central <b>schemas</b> repo with <b>buf</b> CI.</li>
|
||||
<li><b>BACKWARD_TRANSITIVE compatibility</b> — consumers can upgrade independently of producers.</li>
|
||||
<li><b>Topic naming:</b> <b>{domain}.{entity}.{event-type}</b>; site identity lives in the message, not the topic.</li>
|
||||
<li><b>Auth:</b> SASL/OAUTHBEARER via enterprise IdP + prefix ACLs per producer/consumer principal.</li>
|
||||
<li><b>Store-and-forward at ScadaBridge</b> handles WAN outages; analytics-tier retention doubles as a replay surface.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
26
outputs/workspace/slides/slide13.html
Normal file
26
outputs/workspace/slides/slide13.html
Normal file
@@ -0,0 +1,26 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
html { background: #ffffff; }
|
||||
body {
|
||||
width: 720pt; height: 405pt; margin: 0; padding: 0;
|
||||
background: #FFFFFF; font-family: Arial, sans-serif;
|
||||
display: flex; flex-direction: column;
|
||||
}
|
||||
.header { padding: 12pt 40pt 4pt 40pt; border-bottom: 1.5pt solid #0066B3; }
|
||||
.header h1 { margin: 0; font-size: 22pt; font-weight: bold; color: #0066B3; }.body { padding: 14pt 30pt; flex: 1; color: #333333; }
|
||||
.sub { font-size: 11pt; color: #333333; margin: 0 0 8pt 0; font-style: italic; }
|
||||
.placeholder { width: 640pt; height: 300pt; background: transparent; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<h1>3-Year Roadmap — Workstreams × Years</h1>
|
||||
</div>
|
||||
<div class="body">
|
||||
<p class="sub">Six workstreams across three years. Each cell shows the single most load-bearing commitment.</p>
|
||||
<div id="roadmap-table" class="placeholder"></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
32
outputs/workspace/slides/slide14.html
Normal file
32
outputs/workspace/slides/slide14.html
Normal file
@@ -0,0 +1,32 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
html { background: #ffffff; }
|
||||
body {
|
||||
width: 720pt; height: 405pt; margin: 0; padding: 0;
|
||||
background: #FFFFFF; font-family: Arial, sans-serif;
|
||||
display: flex; flex-direction: column;
|
||||
}
|
||||
.header { padding: 12pt 40pt 4pt 40pt; border-bottom: 1.5pt solid #0066B3; }
|
||||
.header h1 { margin: 0; font-size: 22pt; font-weight: bold; color: #0066B3; }.body { padding: 22pt 40pt; flex: 1; color: #333333; }
|
||||
ul { margin: 0 0 0 22pt; padding: 0; }
|
||||
li { font-size: 12pt; margin-bottom: 9pt; line-height: 1.35; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<h1>Year 1 Focus</h1>
|
||||
</div>
|
||||
<div class="body">
|
||||
<ul>
|
||||
<li><b>OtOpcUa</b> — evolve LmxOpcUa, deploy to every site, begin ScadaBridge-first cutover, UNS hierarchy walk.</li>
|
||||
<li><b>Redpanda</b> — stand up central cluster, schema registry, initial topics, publish canonical model v1.</li>
|
||||
<li><b>SnowBridge</b> — design + build; first source adapter (Historian SQL); first curated tables aligned to canonical model.</li>
|
||||
<li><b>ScadaBridge Extensions</b> — deadband / exception-based publishing + EventHub producer with store-and-forward.</li>
|
||||
<li><b>Site Onboarding</b> — no new sites; define the lightweight onboarding pattern for smaller sites.</li>
|
||||
<li><b>Legacy Retirement</b> — inventory populated (3 rows); retire first integration as pattern-proving exercise.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
44
outputs/workspace/slides/slide15.html
Normal file
44
outputs/workspace/slides/slide15.html
Normal file
@@ -0,0 +1,44 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
html { background: #ffffff; }
|
||||
body {
|
||||
width: 720pt; height: 405pt; margin: 0; padding: 0;
|
||||
background: #FFFFFF; font-family: Arial, sans-serif;
|
||||
display: flex; flex-direction: column;
|
||||
}
|
||||
.header { padding: 12pt 40pt 4pt 40pt; border-bottom: 1.5pt solid #0066B3; }
|
||||
.header h1 { margin: 0; font-size: 22pt; font-weight: bold; color: #0066B3; }.body { padding: 22pt 40pt; flex: 1; color: #333333; display: flex; flex-direction: column; }
|
||||
.item { background: #ffffff; border-left: 5pt solid #0066B3; padding: 10pt 14pt; margin-bottom: 10pt; }
|
||||
.item .id { font-size: 9pt; color: #0066B3; letter-spacing: 1pt; font-weight: bold; margin: 0; }
|
||||
.item .title { font-size: 12pt; font-weight: bold; color: #2B2A80; margin: 2pt 0; }
|
||||
.item .desc { font-size: 10pt; margin: 0; color: #333333; line-height: 1.35; }
|
||||
.callout { background: #0066B3; color: #FFFFFF; padding: 8pt 14pt; border-radius: 3pt; margin-top: auto; }
|
||||
.callout p { margin: 0; font-size: 10pt; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<h1>Pillar 3 — Legacy Retirement (3 → 0)</h1>
|
||||
</div>
|
||||
<div class="body">
|
||||
<div class="item">
|
||||
<p class="id">LEG-001</p>
|
||||
<p class="title">Aveva Web API → Delmia DNC</p>
|
||||
<p class="desc">Bidirectional orchestrated handshake. Harder retirement — requires ScadaBridge scripts to re-implement System Platform parse logic.</p>
|
||||
</div>
|
||||
<div class="item">
|
||||
<p class="id">LEG-002</p>
|
||||
<p class="title">Aveva Web API ← Camstar MES</p>
|
||||
<p class="desc">Camstar-initiated. Easier retirement — ScadaBridge already has a native Camstar path; requires Camstar-side reconfiguration.</p>
|
||||
</div>
|
||||
<div class="item">
|
||||
<p class="id">LEG-003</p>
|
||||
<p class="title">System Platform → custom email notification service</p>
|
||||
<p class="desc">Easier retirement — ScadaBridge native notifications already exist.</p>
|
||||
</div>
|
||||
<div class="callout"><p><b>Carve-out:</b> Historian MSSQL reporting surface (BOBJ / Power BI) is explicitly not legacy — see legacy-integrations.md → Deliberately not tracked.</p></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
47
outputs/workspace/slides/slide16.html
Normal file
47
outputs/workspace/slides/slide16.html
Normal file
@@ -0,0 +1,47 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
html { background: #ffffff; }
|
||||
body {
|
||||
width: 720pt; height: 405pt; margin: 0; padding: 0;
|
||||
background: #FFFFFF; font-family: Arial, sans-serif;
|
||||
display: flex; flex-direction: column;
|
||||
}
|
||||
.header { padding: 12pt 40pt 4pt 40pt; border-bottom: 1.5pt solid #0066B3; }
|
||||
.header h1 { margin: 0; font-size: 22pt; font-weight: bold; color: #0066B3; }
|
||||
.body { padding: 24pt 40pt; flex: 1; color: #333333; }
|
||||
.lede { font-size: 12pt; color: #2B2A80; margin: 0 0 14pt 0; line-height: 1.4; }
|
||||
.lede b { color: #0066B3; }
|
||||
.patterns { display: flex; gap: 18pt; margin: 0 0 12pt 0; }
|
||||
.pattern { flex: 1; background: #F5F8FB; border-top: 4pt solid #0066B3; padding: 12pt 14pt; border-radius: 3pt; }
|
||||
.pattern .tag { font-size: 8pt; color: #0066B3; letter-spacing: 1pt; margin: 0 0 4pt 0; font-weight: bold; }
|
||||
.pattern h2 { font-size: 12pt; color: #2B2A80; margin: 0 0 6pt 0; }
|
||||
.pattern p { font-size: 10pt; margin: 0; line-height: 1.4; }
|
||||
.footnote { font-size: 9pt; color: #666666; margin: 6pt 0 0 0; line-height: 1.35; font-style: italic; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<h1>Digital Twin Scope</h1>
|
||||
</div>
|
||||
<div class="body">
|
||||
<p class="lede">Scope is <b>two access-control patterns</b> — not a new component, not a new workstream. Both are delivered by architecture already committed (OtOpcUa ACL model + canonical model + single-connection-per-equipment).</p>
|
||||
|
||||
<div class="patterns">
|
||||
<div class="pattern">
|
||||
<p class="tag">PATTERN 1</p>
|
||||
<h2>Environment-lifecycle promotion</h2>
|
||||
<p>Promote between dev / staging / prod by flipping write-authority ACLs against stable equipment UUIDs — no client reconfiguration.</p>
|
||||
</div>
|
||||
<div class="pattern">
|
||||
<p class="tag">PATTERN 2</p>
|
||||
<h2>Safe read-only consumption</h2>
|
||||
<p>KPI / monitoring consumers get read-only grants with a structural zero-write-path guarantee — no equipment-side session for them to misuse.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p class="footnote">Out of scope for this plan: physics simulation, FAT, commissioning emulation. Those would be separate funded initiatives — adjacent to the plan, not part of it.</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user