Files
3yearplan/outputs/DESIGN.md
Joseph Doherty ec1dfe59e4 Initial commit: 3-year shopfloor IT/OT transformation plan
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.
2026-04-17 09:12:35 -04:00

10 KiB
Raw Blame History

Design — Repeatable Output Generation

Date: 2026-04-15 Topic: PPTX presentation and PDF longform generation from the 3-year plan markdown source. Status: Approved — proceeding to implementation.

Path note. The superpowers-extended-cc:brainstorming skill's default location for this file is docs/plans/YYYY-MM-DD-<topic>-design.md, but this repo's convention (per ../CLAUDE.md) is markdown files at root or under topical subdirectories. This design document is about the output-generation pipeline, so it lives alongside the pipeline it describes in outputs/. Same intent, different path.

Problem

The plan lives in ~10 markdown files. It needs to be published as:

  1. A mixed-stakeholder PowerPoint (18 slides) for steering / leadership / technical-lead audiences.
  2. A long-form PDF of the authoritative plan content for archival, handoff, and offline reading.

Both outputs must be repeatable reliably across sessions and across time — regenerating them after the plan has evolved should produce consistent structure and style, with bounded variability in Claude-authored phrasing only.

Approach — four-part reliability harness

Free-form "Claude, regenerate the outputs" drifts. The four fixes:

  1. Spec files as structure anchors. outputs/presentation-spec.md and outputs/longform-spec.md enumerate exactly which source feeds which slide / chapter, with no Claude discretion over structure. The prompt ("regenerate outputs") stays constant; the specs evolve as the plan does.
  2. Pinned invocation checklist. outputs/README.md documents the trigger phrases and the numbered procedure I follow on every regeneration. No free-form prompting.
  3. Hand-drawn diagrams as committed files. outputs/diagrams/*.mmd + outputs/diagrams/*.png. Diagrams change only when the .mmd is edited and re-rendered; regeneration just embeds the existing PNG.
  4. Diff-friendly intermediate + run log. Every regeneration appends a line to outputs/run-log.md recording the timestamp, what was regenerated, and any warnings (missing source sections, broken links, overflow truncations). Drift between runs is visible by construction.

Together these reduce "what Claude has to decide" to text phrasing inside a fixed structure, which has bounded variability that the run log makes auditable.

Section 1 — Repo structure

plan/
├── current-state.md, goal-state.md, roadmap.md, status.md    (existing, unchanged)
├── current-state/, goal-state/                                (existing, unchanged)
└── outputs/                                                    (NEW)
    ├── README.md                 — trigger phrases + numbered regeneration checklist
    ├── DESIGN.md                 — this document
    ├── run-log.md                — append-only regeneration audit log
    ├── presentation-spec.md      — slide-by-slide PPTX structure anchor
    ├── longform-spec.md          — chapter/appendix structure anchor
    ├── diagrams/
    │   ├── architecture-layers.mmd      (Mermaid source, committed)
    │   ├── architecture-layers.png      (exported, committed)
    │   ├── end-to-end-flow.mmd
    │   └── end-to-end-flow.png
    └── generated/
        ├── plan-presentation.pptx
        └── plan-longform.pdf

Spec files and diagrams are source; generated/ is artifact.

Section 2 — Generation workflow

Trigger phrases (any future Claude session recognizes these from outputs/README.md):

  • regenerate outputs — both
  • regenerate presentation — PPTX only
  • regenerate longform — PDF only

Procedure (checklist in outputs/README.md):

  1. Read outputs/presentation-spec.md or outputs/longform-spec.md — the structure anchor.
  2. Read every source file named in the spec. Files not in the spec are not read.
  3. For each slide / chapter in the spec, populate from the named source using the spec's rules (full text, N-bullet summary, diagram embed, etc.).
  4. Invoke document-skills:pptx or document-skills:pdf to render to outputs/generated/.
  5. Append a run log entry to outputs/run-log.md.

Regeneration is read-only on plan content. The only files it writes to are under outputs/generated/ and outputs/run-log.md.

Section 3 — PPTX spec (18 slides, mixed-stakeholder)

Slide-by-slide mapping (full detail lives in outputs/presentation-spec.md):

# Slide Source anchor
1 Title
2 Executive Summary goal-state.md → Vision + Success Criteria
3 Today's Reality current-state.md → pain points
4 Vision goal-state.md → Vision
5 Three Pillars goal-state.md → Success Criteria
6 Enterprise Layout current-state.md → Enterprise Layout
7 Today's Systems current-state.md → Systems & Interfaces
8 Architecture (diagram) goal-state.md → Layered Architecture + diagrams/architecture-layers.png
9 Data Flow (diagram) goal-state.md → tag flow sentence + diagrams/end-to-end-flow.png
10 OtOpcUa goal-state.md → OtOpcUa
11 Analytics Stack goal-state.md → SnowBridge + Historian→Snowflake
12 Redpanda EventHub goal-state.md → Async Event Backbone
13 Roadmap grid (table) roadmap.md → The grid
14 Year 1 Focus roadmap.md → Year 1 column
15 Pillar 3: Legacy Retirement current-state/legacy-integrations.md
16 Open Coordination Items goal-state.md → Strategic Considerations
17 Non-Goals goal-state.md → Non-Goals
18 Asks & Next Steps status.md → Top pending items

Truncation: max 6 bullets per slide, max ~12 words per bullet. Overflow → footer pointer to source.

Theme: document-skills:theme-factory default professional theme. No custom branding on first pass.

Section 4 — Longform PDF spec

Document shape: Cover → TOC → Chapter 1 (current-state.md) → Chapter 2 (goal-state.md) → Chapter 3 (roadmap.md) → Appendix A (current-state/legacy-integrations.md) → Appendix B (current-state/equipment-protocol-survey.md).

Transformations (applied at render time, source markdown not edited):

  • File H1 → chapter title
  • H2/H3/H4 → numbered sections (1.1, 1.1.1)
  • Inter-file links → "see Chapter N" / "see Appendix X"
  • _TBD_ markers → visual callout
  • ASCII diagrams → preserved as monospace code blocks
  • Tables → preserved as multi-page tables

Page setup: Letter, 1" margins, chapter-name running header, page-number + as-of-date footer. document-skills:theme-factory default serif.

Excluded from PDF: status.md, CLAUDE.md, goal-state/digital-twin-management-brief.md, outputs/* (all meta, working, or prep content — not plan content).

Section 5 — Diagrams

Starter set — two diagrams:

  1. architecture-layers — the 4-layer stack with IT↔OT boundary. Mermaid flowchart TB.
  2. end-to-end-flow — horizontal data flow from equipment to Power BI. Mermaid flowchart LR.

No third roadmap-timeline diagram — the roadmap renders as a PPTX table on slide 13; a Gantt would compete with the grid rather than complement it. Can be added later as diagrams/roadmap-timeline.mmd without changing any other file.

Rendering: on first regeneration, I attempt to render .mmd.png in-session. If the Claude Code environment has Mermaid rendering available, done. If not, the run log directs the human to render the .mmd file at https://mermaid.live and drop the PNG into outputs/diagrams/. After that, regeneration embeds the existing PNG verbatim — zero drift.

Editing: edit .mmd → re-render PNG → regenerate presentation picks up the new PNG automatically.

Open questions for first-run verification

These get resolved during implementation, not during design:

  1. Mermaid rendering in the Claude Code environment. Unknown until I try. Fallback is manual rendering at mermaid.live; neither path breaks the design.
  2. Whether document-skills:pptx can produce a 3-column layout (needed for slide 5: Three Pillars) and a 2-column layout (needed for slide 16: Open Coordination Items). If not, the spec falls back to single-column with visual separation.
  3. Table overflow behavior on slide 13. The 7×3 roadmap grid with truncated cell content should fit one slide, but if it overflows, the spec needs a fallback: either shrink text or split across two slides.
  4. First-pass theme quality. I'll use the theme-factory default; the first output becomes the visual baseline. If it looks wrong, section 3's "visual style" line is where the override goes.

Task list

Implementation tasks are tracked in the native task list:

  • #4 — Scaffold outputs/ directory
  • #5 — Write outputs/README.md (trigger phrases + checklist)
  • #6 — Write outputs/presentation-spec.md
  • #7 — Write outputs/longform-spec.md

Additional tasks to be created on entry to implementation:

  • Draft architecture-layers.mmd + end-to-end-flow.mmd Mermaid source
  • Attempt first PNG rendering (or document manual fallback in run log)
  • Execute first PPTX and PDF generation, save to outputs/generated/
  • Append inaugural run log entry

What happens after first generation

The first outputs are the baseline. Review produces one of:

  • Looks right — done. regenerate outputs works; use it whenever the plan changes.
  • Structure wrong — edit presentation-spec.md or longform-spec.md, regenerate.
  • Style wrong — note override in spec (theme change, truncation rule tweak), regenerate.
  • Content faithful but phrasing drifts between runs — tighten spec rules (e.g., "quote verbatim" instead of "summarize to 5 bullets"), regenerate.

If drift proves unmanageable after a few iterations, the fallback per earlier conversation is to extract the first good output as a template and regenerate against that template instead — turning the pipeline into a content-substitution step against a known-good visual shell. Design section 5's "once the PNG exists" principle (fixed visual, variable text) becomes the model for the whole deck and PDF at that point.