Core plan: current-state, goal-state (layered architecture, OtOpcUa, Redpanda EventHub, SnowBridge, canonical model, UNS posture + naming hierarchy, digital twin use cases absorbed), roadmap (7 workstreams x 3 years), and status bookmark. Component detail files: legacy integrations inventory (3 integrations, pillar 3 denominator closed), equipment protocol survey template (dual mandate with UNS hierarchy snapshot), digital twin management brief (conversation complete, outcome recorded). Output generation pipeline: specs for 18-slide mixed-stakeholder PPTX and faithful-typeset PDF, with README, design doc, and implementation plan. No generated outputs yet — deferred until source data is stable.
207 lines
18 KiB
Markdown
207 lines
18 KiB
Markdown
# 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** | 30–45 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** | "Shopfloor 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 content → single column with a horizontal rule.** Applies to slide 16 (Open Coordination Items).
|
||
- **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: *"Shopfloor 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 1–3. |
|
||
|
||
## Slide 11 — Analytics Stack: SnowBridge, Snowflake, dbt
|
||
|
||
| 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 machine-data-to-Snowflake upload service; (2) source abstraction — Aveva Historian SQL in Year 1, Redpanda/ScadaBridge in Year 2; (3) governed selection with blast-radius approval workflow; (4) dbt curated layers, orchestrator out of scope; (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 7×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 7×3 table doesn't fit one slide at readable type size, split across two slides: workstreams 1–4 on slide 13a (OtOpcUa, Redpanda, SnowBridge, dbt), workstreams 5–7 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 7 workstreams |
|
||
| **Population** | 7 bullets, one per workstream, ordered by prerequisite position: (1) OtOpcUa — evolve LmxOpcUa, protocol survey, deploy to every site, begin tier-1 cutover; (2) Redpanda — stand up central cluster, schema registry, initial topics; (3) SnowBridge — design + first source adapter (Historian SQL) with filtered flow; (4) dbt — scaffold project, first curated model; (5) ScadaBridge Extensions — deadband publishing + EventHub producer; (6) Site Onboarding — document lightweight onboarding pattern (no new sites Year 1); (7) 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 — Open Coordination Items
|
||
|
||
| Property | Value |
|
||
|---|---|
|
||
| **Layout** | 2-column content (fallback: single column with horizontal rule) |
|
||
| **Source** | [`../goal-state.md`](../goal-state.md) → **Strategic Considerations (Adjacent Asks)** |
|
||
| **Population** | **Left column — Digital Twin:** 4 bullets: (1) Management ask, not a committed workstream; (2) Plan shaped to serve if it materializes (OtOpcUa, Redpanda, Snowflake); (3) 8 clarification questions + 4-bucket decision framework ready; (4) Next: schedule management conversation — brief at `goal-state/digital-twin-management-brief.md`. **Right column — BOBJ → Power BI:** 4 bullets: (1) In-flight reporting initiative, not owned by this plan; (2) Three consumption paths analyzed (Snowflake dbt / Historian direct / both); (3) Recommended position: Path C — hybrid, with Path A as strategic direction; (4) Next: schedule coordination conversation with reporting team — 8 questions ready in `goal-state.md`. |
|
||
|
||
## Slide 17 — Non-Goals
|
||
|
||
| Property | Value |
|
||
|---|---|
|
||
| **Layout** | Content (bulleted) |
|
||
| **Source** | [`../goal-state.md`](../goal-state.md) → **Non-Goals** |
|
||
| **Population** | 6 bullets, one line each: (1) Operator UX modernization — deprioritized against the three pillars; (2) Support staffing decisions — other teams; (3) Licensing strategy — not tracked; (4) Self-hosted orchestrator selection — chosen outside this plan; (5) VM-level DR — out of scope for Redpanda; (6) Physical network segmentation — out of scope. |
|
||
| **Notes** | This slide is important for managing stakeholder expectations — what the plan *does not* commit to is as load-bearing as what it does commit to. Do not drop this slide even if time is short. |
|
||
|
||
## Slide 18 — Asks & Next Steps
|
||
|
||
| Property | Value |
|
||
|---|---|
|
||
| **Layout** | Content (bulleted) |
|
||
| **Source** | [`../status.md`](../status.md) → **Top pending items** + inferred from [`../roadmap.md`](../roadmap.md) → Year 1 |
|
||
| **Population** | 5 bullets: (1) Sponsor confirmation + Year 1 funding commitment; (2) Named owners for each of the 7 workstreams (build team alignment); (3) Digital Twin management conversation — schedule (see brief); (4) Power BI coordination conversation with reporting team — schedule; (5) Equipment protocol survey owner named (Q1 Year 1 prerequisite for OtOpcUa core driver library). |
|
||
| **Notes** | This is the closer slide. Each bullet should be a discrete ask with a clear "who needs to do what" so the audience leaves with action. |
|
||
|
||
---
|
||
|
||
## 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: **18 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.
|