Files
3yearplan/outputs/presentation-spec.md
Joseph Doherty ebc76e9315 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.
2026-04-30 10:54:49 -04:00

190 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Presentation Spec — Mixed-Stakeholder Deck
**The structure anchor for [`generated/plan-presentation.pptx`](generated/).** Every regeneration reads this file first and populates slides exactly as described below. Edit this file to change deck structure; do not edit prompts, do not edit the source plan files.
## Meta
| Property | Value |
|---|---|
| **Audience** | Mixed stakeholder — steering committee, leadership, build team leads, adjacent-initiative owners. Some execs, some technical. |
| **Total slides** | 18 |
| **Target read time** | 3045 minutes walked through, ~10 minutes self-read |
| **Theme** | `document-skills:theme-factory` default professional theme. Clean, neutral, no custom branding on first pass. Override: add a `**Theme override:**` line here with the target preset if you want different. |
| **Body font** | Theme default sans-serif |
| **Accent color** | Theme default |
| **Source of truth for title** | "SCADA IT/OT Transformation — 3-Year Plan" |
| **Subtitle template** | "As of {{date}}" where `{{date}}` is the regeneration timestamp in `YYYY-MM-DD` form |
## Truncation rules (apply to every slide unless overridden per-slide)
- **Max 6 bullets per slide.** If the source section has more than 6 bullets of load-bearing content, pick the 6 most load-bearing and add a footer line: *"Full detail: `<source file> → <section name>`."*
- **Max ~12 words per bullet.** Aim for scan-ability, not completeness.
- **No nested bullets.** If the source has nested bullets, flatten to one level by merging or dropping sub-points.
- **Preserve source vocabulary.** Use the same words the plan uses (e.g., "OtOpcUa," "ScadaBridge," "SnowBridge," "pillar 3," "data locality," "single sanctioned crossing point") — don't paraphrase technical terms or the Vision line.
- **TBDs stay visible.** If a source section contains a `_TBD_` that is load-bearing for the slide's point, call it out explicitly: *"(TBD — see source.)"* Don't silently drop TBDs.
- **Overflow callout.** When content is truncated, the footer line *"Full detail: `<source file> → <section name>`"* appears in small text at the bottom of the slide.
## Layout fallbacks
If `document-skills:pptx` cannot render a requested layout:
- **3-column content → single column with visual separators.** Applies to slide 5 (Three Pillars).
- **2-column patterns → single column.** Applies to slide 16 (Digital Twin Scope) where the two access-control patterns are shown side-by-side; collapse to stacked patterns if the side-by-side layout doesn't fit at readable type size.
- **Diagram + caption → caption only with a "(Diagram not yet available — render `<path>.mmd` and re-run)" note.** Applies to slides 8 and 9 until the PNG files exist in `diagrams/`.
- **Multi-column table that overflows → split across two slides labeled "N/2" and "2/2".** Applies to slide 13 (Roadmap grid) if 7 rows × 3 columns doesn't fit one slide at readable type size.
---
## Slide 1 — Title
| Property | Value |
|---|---|
| **Layout** | Title |
| **Source** | — (no source file) |
| **Content** | Title: *"SCADA IT/OT Transformation"* · Subtitle: *"3-Year Plan"* · Footer: *"As of {{regeneration-date}}"* |
| **Rules** | No bullets, no extra content. Title slide is deliberately minimal. |
## Slide 2 — Executive Summary
| Property | Value |
|---|---|
| **Layout** | Content (bulleted) |
| **Source** | [`../goal-state.md`](../goal-state.md) → **Vision** + **Success Criteria** |
| **Population** | 5 bullets: (1) the Vision line verbatim, (2)(4) one line per pillar (the binary success criterion, not the rationale), (5) a single line naming the key non-goals in the form *"Out of scope: operator UX modernization, licensing, VM-level DR, physical network segmentation."* |
| **Notes** | This slide is the TL;DR for anyone who reads only one slide. Keep it tight. |
## Slide 3 — Today's Reality
| Property | Value |
|---|---|
| **Layout** | Content (bulleted) |
| **Source** | [`../current-state.md`](../current-state.md) — synthesize from Systems & Interfaces and Equipment OPC UA sections |
| **Population** | 5 bullets describing the pain points of the current state: (1) split SCADA stack (Aveva + Ignition by purpose), (2) WAN-dependent central Ignition with direct OPC UA sessions to site equipment, (3) multiple concurrent OPC UA sessions to the same equipment, (4) legacy IT↔OT integrations outside ScadaBridge (3 of them), (5) fragmented data access and inconsistent values between consumers |
| **Notes** | The source file doesn't have a dedicated "pain points" section (it's a `_TBD_`). Synthesize from the inline observations in Systems & Interfaces and Equipment OPC UA. Don't invent pain points that aren't grounded in the source. |
## Slide 4 — Vision
| Property | Value |
|---|---|
| **Layout** | Big-text / quote layout |
| **Source** | [`../goal-state.md`](../goal-state.md) → **Vision** |
| **Population** | The Vision line ("stable, single point of integration between shopfloor OT and enterprise IT") as the centerpiece. 3 sub-bullets below it on what that means concretely — extracted from the paragraph that follows the Vision line in goal-state.md. |
| **Notes** | This slide repeats the Vision from slide 2 deliberately — slide 2 is the 30-second summary; slide 4 is where the Vision actually gets the airtime the conversation will return to. |
## Slide 5 — Three Pillars
| Property | Value |
|---|---|
| **Layout** | 3-column content (fallback: single column with visual separators) |
| **Source** | [`../goal-state.md`](../goal-state.md) → **Success Criteria** |
| **Population** | Column 1: Pillar 1 — Unification (100% of sites on standardized stack). Column 2: Pillar 2 — Analytics/AI Enablement (≤15-minute analytics SLO; one "not possible before" use case in production). Column 3: Pillar 3 — Legacy Retirement (inventory to zero). Each column: (a) title, (b) the binary criterion in one line, (c) one line of "what this means" context. |
| **Rules** | All three pillars must appear. Do not prioritize one over the others here — they are equal end-state criteria per the plan. |
## Slide 6 — Enterprise Layout
| Property | Value |
|---|---|
| **Layout** | Content (bulleted, grouped by tier) |
| **Source** | [`../current-state.md`](../current-state.md) → **Enterprise Layout** |
| **Population** | Grouped bullets: (a) Primary Data Center — South Bend. (b) Largest Sites — Warsaw West, Warsaw North (one cluster per building). (c) Other Integrated Sites — Shannon, Galway, TMT, Ponce (single cluster per site). (d) Not Yet Integrated — Berlin, Winterthur, Jacksonville (and others, with volatility note). |
| **Notes** | The volatility note about smaller sites changing belongs on the slide as a one-line disclaimer at the bottom. |
## Slide 7 — Today's Systems
| Property | Value |
|---|---|
| **Layout** | Content (bulleted) |
| **Source** | [`../current-state.md`](../current-state.md) → **Systems & Interfaces** |
| **Population** | 6 bullets, one line each: (1) Aveva System Platform — validated data collection; (2) Ignition SCADA — KPI monitoring (central, WAN-dependent); (3) ScadaBridge — in-house Akka.NET integration layer, already deployed; (4) LmxOpcUa — in-house OPC UA server exposing System Platform objects; (5) Camstar MES — sole enterprise MES; (6) Aveva Historian — sole historian, central-only, permanent retention. |
| **Notes** | Delmia DNC is mentioned as one of the two legacy Web API interfaces but does not need its own bullet here — it's captured on slide 15. |
## Slide 8 — Goal State: Layered Architecture
| Property | Value |
|---|---|
| **Layout** | Diagram + caption |
| **Source** | [`../goal-state.md`](../goal-state.md) → **Layered Architecture** + [`diagrams/architecture-layers.png`](diagrams/) |
| **Population** | Embed `diagrams/architecture-layers.png` as the centerpiece. Caption: one line per layer — *"Layer 1 Equipment · Layer 2 OtOpcUa (equipment + System Platform namespaces) · Layer 3 SCADA (System Platform + Ignition) · Layer 4 ScadaBridge (IT↔OT bridge)"*. Callout: *"ScadaBridge central is the sole IT↔OT crossing point."* |
| **Fallback** | If `architecture-layers.png` does not exist, render a placeholder box with the text *"Diagram not yet available — render `diagrams/architecture-layers.mmd` at https://mermaid.live and save PNG to `diagrams/architecture-layers.png`, then re-run `regenerate presentation`."* |
## Slide 9 — Goal State: End-to-End Data Flow
| Property | Value |
|---|---|
| **Layout** | Diagram + caption |
| **Source** | [`../goal-state.md`](../goal-state.md) → the tag-flow sentence (search for "A tag read from a machine in Warsaw West") + [`diagrams/end-to-end-flow.png`](diagrams/) |
| **Population** | Embed `diagrams/end-to-end-flow.png`. Caption: the tag-flow sentence from goal-state.md, verbatim or near-verbatim. |
| **Fallback** | Same fallback pattern as slide 8, but for `end-to-end-flow.mmd` / `.png`. |
## Slide 10 — OtOpcUa — the unification layer
| Property | Value |
|---|---|
| **Layout** | Content (bulleted) |
| **Source** | [`../goal-state.md`](../goal-state.md) → **OtOpcUa — the unified site-level OPC UA layer** |
| **Population** | 6 bullets: (1) single sanctioned OPC UA access point per site, one session per equipment; (2) two namespaces — equipment + System Platform (absorbs LmxOpcUa); (3) clustered, co-located on existing System Platform nodes; (4) hybrid driver strategy — proactive core library + on-demand long-tail; (5) OPC UA-native auth (UserName + standard security modes, inherited from LmxOpcUa); (6) tiered cutover — ScadaBridge → Ignition → System Platform IO across Years 13. |
## Slide 11 — Analytics Stack: SnowBridge + Snowflake
| Property | Value |
|---|---|
| **Layout** | Content (bulleted) |
| **Source** | [`../goal-state.md`](../goal-state.md) → **SnowBridge** + **Aveva Historian → Snowflake** + **Snowflake-side transform tooling** |
| **Population** | 6 bullets: (1) SnowBridge — custom-built .NET service owning **ingest + in-process transform + curated-table write** into Snowflake; (2) source abstraction — Aveva Historian SQL in Year 1, Redpanda/ScadaBridge in Year 2; (3) governed selection with blast-radius approval workflow; (4) **no dbt, no external orchestrator, no Snowflake landing tier** — transforms live in the service; (5) ≤15-minute analytics SLO; (6) one "not possible before" AI/analytics use case in production by end of plan (pillar 2 gate). |
## Slide 12 — Redpanda EventHub: the async backbone
| Property | Value |
|---|---|
| **Layout** | Content (bulleted) |
| **Source** | [`../goal-state.md`](../goal-state.md) → **Async Event Backbone** |
| **Population** | 6 bullets: (1) self-hosted, central in South Bend (single-cluster HA); (2) per-topic tiered retention — operational 7d / analytics 30d / compliance 90d; (3) bundled Schema Registry; (4) Protobuf schemas in central `schemas` repo with `buf` CI, `BACKWARD_TRANSITIVE` compatibility; (5) `{domain}.{entity}.{event-type}` topic naming, site identity in message not topic; (6) SASL/OAUTHBEARER auth + prefix ACLs. |
## Slide 13 — 3-Year Roadmap (workstreams × years)
| Property | Value |
|---|---|
| **Layout** | Table — 7 rows × 3 columns (+ workstream name column = 4 columns total) |
| **Source** | [`../roadmap.md`](../roadmap.md) → **The grid** |
| **Population** | Render the 6×3 roadmap grid as a PPTX table. **Truncate** each cell to the **single most important commitment** (not the full cell text, which would overflow). Workstream column: full name. Year columns: ~10-word headline per cell. Color-code cells by pillar if the theme supports it. |
| **Fallback** | If the 6×3 table doesn't fit one slide at readable type size, split across two slides: workstreams 13 on slide 13a (OtOpcUa, Redpanda, SnowBridge), workstreams 46 on slide 13b (ScadaBridge Extensions, Site Onboarding, Legacy Retirement). Label slides 13 and 14, renumber subsequent slides. |
## Slide 14 — Year 1 Focus
| Property | Value |
|---|---|
| **Layout** | Content (bulleted) |
| **Source** | [`../roadmap.md`](../roadmap.md) → the Year 1 column across all 6 workstreams |
| **Population** | 6 bullets, one per workstream, ordered by prerequisite position: (1) OtOpcUa — evolve LmxOpcUa, deploy to every site, begin tier-1 cutover, UNS hierarchy snapshot walk; (2) Redpanda — stand up central cluster, schema registry, initial topics, publish canonical model v1; (3) SnowBridge — design + first source adapter (Historian SQL) with filtered ingest + in-process transform + first curated tables aligned to canonical model; (4) ScadaBridge Extensions — deadband publishing + EventHub producer; (5) Site Onboarding — document lightweight onboarding pattern (no new sites Year 1); (6) Legacy Retirement — populate inventory (done), retire first integration as pattern-proving exercise. |
| **Rules** | **Exceeds the 6-bullet truncation rule.** 7 bullets here is intentional because each bullet represents one workstream's Year 1 commitment — dropping one would misrepresent the plan. Keep all 7, tighten wording to ≤10 words per bullet. |
## Slide 15 — Pillar 3: Legacy Retirement (3 → 0)
| Property | Value |
|---|---|
| **Layout** | Content (bulleted + callout) |
| **Source** | [`../current-state/legacy-integrations.md`](../current-state/legacy-integrations.md) → Current inventory |
| **Population** | 3 bullets — one per legacy integration: (1) **LEG-001** Aveva Web API → Delmia DNC (bidirectional orchestrated handshake; harder retirement — requires ScadaBridge scripts to re-implement System Platform parse logic). (2) **LEG-002** Aveva Web API ← Camstar MES (Camstar-initiated; easier retirement — ScadaBridge already has native Camstar path; requires Camstar-side reconfiguration). (3) **LEG-003** System Platform → custom email notification service (easier retirement — ScadaBridge native notifications already exist). Callout at bottom: *"Historian MSSQL reporting surface (BOBJ / Power BI) is explicitly carved out as not legacy — see `legacy-integrations.md` → Deliberately not tracked."* |
## Slide 16 — Digital Twin Scope
| Property | Value |
|---|---|
| **Layout** | Lede + 2-column pattern cards (fallback: stacked patterns) |
| **Source** | [`../goal-state.md`](../goal-state.md) → **Strategic Considerations → Digital Twin** |
| **Population** | **Lede:** scope is two access-control patterns — not a new component, not a new workstream — both delivered by already-committed architecture (OtOpcUa ACL model + canonical model + single-connection-per-equipment). **Pattern 1 card — Environment-lifecycle promotion:** promote between dev / staging / prod by flipping write-authority ACLs against stable equipment UUIDs; no client reconfiguration. **Pattern 2 card — Safe read-only consumption:** KPI / monitoring consumers get read-only grants with a structural zero-write-path guarantee — no equipment-side session for them to misuse. **Footnote:** physics simulation, FAT, commissioning emulation are out of scope; would be separate funded adjacent initiatives. |
| **Notes** | This is the deck's closing slide. It exists because digital-twin scope was the most contested decision in the plan; making the resolved scope concrete prevents the topic from re-opening unnecessarily. The previous BOBJ → Power BI column was removed when that coordination was transferred to another team (2026-04-30). The previous Non-Goals and Asks & Next Steps slides were removed in the same pass. |
---
## Editing this spec
- **Structural changes go here.** If you want to add, remove, reorder, or reshape a slide, edit this file. Don't edit the prompt ("regenerate presentation") and don't edit the source plan files.
- **Content changes go in the source.** If a slide's content is wrong because the plan itself is wrong, edit the source plan file (`current-state.md`, `goal-state.md`, `roadmap.md`, etc.) — the next regeneration will pick up the change automatically because this spec references the source file, not a snapshot.
- **Theme / visual changes go in the meta section at the top of this file.** Add a `**Theme override:**` line naming the target preset, or tweak the truncation rules. First regeneration uses theme-factory default; iterate from there.
- **Never edit `generated/plan-presentation.pptx` by hand.** Any hand-edits are overwritten on the next regeneration. If you find yourself wanting to hand-edit, the correct move is to edit this spec and regenerate.
## Slide-count budget
Current: **16 slides.** If additions push this above 22, reconsider whether the deck is still "mixed-stakeholder" or has quietly become a build-team deck. The mixed-stakeholder audience tops out around 20 slides before attention fragments; a build-team deck belongs in a separate spec file (`build-team-spec.md` or similar) feeding a second generated output.