feat: replace ASCII art diagrams with SVG

- README: SpeckDL pipeline and architecture diagrams
- docs/strategy.md: Plan D→C→A→B flow diagram
- docs/consulting-packages.md: consulting pipeline flow diagram
- New: docs/diagrams/ with 4 static SVGs (dark-mode compatible, responsive viewBox)
This commit is contained in:
Content Agent 2026-04-28 16:01:00 -07:00
parent 75aed78a43
commit f59488a197
7 changed files with 190 additions and 80 deletions

View file

@ -27,35 +27,13 @@ speck RetryHandler {
SpeckDL compiles through a deterministic pipeline:
```
SpeckDL ──► Z3 (SMT solver) ──► DST (decision structures) ──► WASM
│ │ │ │
│ verify constraints compile to decision deploy verified
│ catch contradictions trees artifacts
│
└── Provenance graph grows automatically at each stage
```
![SpeckDL compilation pipeline](docs/diagrams/speckdl-pipeline.svg)
No LLMs in the compilation path. No non-determinism. Same input, same output — every time.
## Architecture
```
┌─────────────────────────────────────────────────┐
│ Orchestrator │
│ Accepts Specks, decomposes tasks │
└───────────┬─────────────────┬───────────────────┘
│ │
┌───────▼───────┐ ┌───────▼───────┐
│ Team Lead │ │ Team Lead │
│ Verification │ │ Codegen │
└───────┬───────┘ └───────┬───────┘
│ │
┌───────▼───────┐ ┌───────▼───────┐
│ Z3 SME │ │ TypeScript │
│ (verify) │ │ SME (emit) │
└───────────────┘ └───────────────┘
```
![Architecture diagram](docs/diagrams/architecture.svg)
- **Orchestrator** — client entry point, task decomposition
- **Team Leads** — manage specialized agents, elastic scaling

View file

@ -156,34 +156,7 @@ Speckl is the data source for the advisory work. Scott doesn't advise from theor
## Pipeline Flow
```
┌─────────────────┐
│ Content Entry │
│ (book, essay, │
│ workshop) │
└────────┬────────┘
│
┌────────▼────────┐
│ First Call │
│ "What do you │
│ do?" → 1L │
└────────┬────────┘
│
┌────────▼────────┐
│ Package 1 │
│ Assessment │
│ $5K–$10K │
└────────┬────────┘
│
┌─────────────┼─────────────┐
│ │ │
┌────────▼───┐ ┌─────▼──────┐ ┌───▼────────┐
│ Package 2 │ │ Package 3 │ │ Both │
│ Speckl │ │ Fractional │ │ (P2 → P3) │
│ $30K–$50K │ │ $10K–$15K │ │ │
└────────────┘ │ /mo │ └────────────┘
└────────────┘
```
![Consulting pipeline flow](diagrams/consulting-pipeline.svg)
Package 1 feeds into both. Package 2 often converts to Package 3 for ongoing retainers. Some high-maturity clients skip straight to Package 3.

View file

@ -0,0 +1,45 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 320">
<defs>
<marker id="arrow" markerWidth="10" markerHeight="7" refX="10" refY="3.5" orient="auto" fill="#3b82f6">
<polygon points="0 0, 10 3.5, 0 7"/>
</marker>
</defs>
<!-- Orchestrator -->
<rect x="170" y="20" width="260" height="70" rx="8" fill="#1e3a5f" stroke="#3b82f6" stroke-width="2"/>
<text x="300" y="50" text-anchor="middle" fill="#f8fafc" font-family="system-ui, sans-serif" font-size="16" font-weight="bold">Orchestrator</text>
<text x="300" y="70" text-anchor="middle" fill="#94a3b8" font-family="system-ui, sans-serif" font-size="12">Accepts Specks, decomposes tasks</text>
<!-- Branching lines from Orchestrator -->
<line x1="230" y1="90" x2="230" y2="120" stroke="#3b82f6" stroke-width="2"/>
<line x1="370" y1="90" x2="370" y2="120" stroke="#3b82f6" stroke-width="2"/>
<line x1="230" y1="120" x2="370" y2="120" stroke="#3b82f6" stroke-width="2"/>
<line x1="165" y1="120" x2="230" y2="120" stroke="#3b82f6" stroke-width="2"/>
<line x1="370" y1="120" x2="435" y2="120" stroke="#3b82f6" stroke-width="2"/>
<line x1="165" y1="120" x2="165" y2="150" stroke="#3b82f6" stroke-width="2" marker-end="url(#arrow)"/>
<line x1="435" y1="120" x2="435" y2="150" stroke="#3b82f6" stroke-width="2" marker-end="url(#arrow)"/>
<!-- Team Lead: Verification -->
<rect x="60" y="155" width="210" height="70" rx="8" fill="#1e3a5f" stroke="#f59e0b" stroke-width="2"/>
<text x="165" y="185" text-anchor="middle" fill="#f8fafc" font-family="system-ui, sans-serif" font-size="14" font-weight="bold">Team Lead</text>
<text x="165" y="205" text-anchor="middle" fill="#fbbf24" font-family="system-ui, sans-serif" font-size="12">Verification</text>
<!-- Team Lead: Codegen -->
<rect x="330" y="155" width="210" height="70" rx="8" fill="#1e3a5f" stroke="#10b981" stroke-width="2"/>
<text x="435" y="185" text-anchor="middle" fill="#f8fafc" font-family="system-ui, sans-serif" font-size="14" font-weight="bold">Team Lead</text>
<text x="435" y="205" text-anchor="middle" fill="#6ee7b7" font-family="system-ui, sans-serif" font-size="12">Codegen</text>
<!-- Connectors: Team Lead → SME -->
<line x1="165" y1="225" x2="165" y2="260" stroke="#f59e0b" stroke-width="2" marker-end="url(#arrow)"/>
<line x1="435" y1="225" x2="435" y2="260" stroke="#10b981" stroke-width="2" marker-end="url(#arrow)"/>
<!-- SME: Z3 -->
<rect x="60" y="265" width="210" height="50" rx="8" fill="#1e3a5f" stroke="#f59e0b" stroke-width="1.5"/>
<text x="165" y="287" text-anchor="middle" fill="#f8fafc" font-family="system-ui, sans-serif" font-size="14" font-weight="bold">Z3 SME</text>
<text x="165" y="303" text-anchor="middle" fill="#fbbf24" font-family="system-ui, sans-serif" font-size="11">(verify)</text>
<!-- SME: TypeScript -->
<rect x="330" y="265" width="210" height="50" rx="8" fill="#1e3a5f" stroke="#10b981" stroke-width="1.5"/>
<text x="435" y="287" text-anchor="middle" fill="#f8fafc" font-family="system-ui, sans-serif" font-size="14" font-weight="bold">TypeScript SME</text>
<text x="435" y="303" text-anchor="middle" fill="#6ee7b7" font-family="system-ui, sans-serif" font-size="11">(emit)</text>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View file

@ -0,0 +1,47 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 460 480">
<defs>
<marker id="arrow-down" markerWidth="10" markerHeight="7" refX="5" refY="7" orient="auto" fill="#3b82f6">
<polygon points="0 0, 10 0, 5 7"/>
</marker>
</defs>
<!-- Content Entry -->
<rect x="130" y="10" width="200" height="60" rx="8" fill="#1e3a5f" stroke="#3b82f6" stroke-width="2"/>
<text x="230" y="36" text-anchor="middle" fill="#f8fafc" font-family="system-ui, sans-serif" font-size="14" font-weight="bold">Content Entry</text>
<text x="230" y="54" text-anchor="middle" fill="#94a3b8" font-family="system-ui, sans-serif" font-size="11">book, essay, workshop</text>
<line x1="230" y1="70" x2="230" y2="105" stroke="#3b82f6" stroke-width="2" marker-end="url(#arrow-down)"/>
<!-- First Call -->
<rect x="105" y="110" width="250" height="60" rx="8" fill="#1e3a5f" stroke="#f59e0b" stroke-width="2"/>
<text x="230" y="136" text-anchor="middle" fill="#f8fafc" font-family="system-ui, sans-serif" font-size="14" font-weight="bold">First Call</text>
<text x="230" y="154" text-anchor="middle" fill="#fbbf24" font-family="system-ui, sans-serif" font-size="11">"What do you do?" → 1-liner</text>
<line x1="230" y1="170" x2="230" y2="205" stroke="#3b82f6" stroke-width="2" marker-end="url(#arrow-down)"/>
<!-- Package 1 -->
<rect x="105" y="210" width="250" height="60" rx="8" fill="#1e3a5f" stroke="#10b981" stroke-width="2"/>
<text x="230" y="236" text-anchor="middle" fill="#f8fafc" font-family="system-ui, sans-serif" font-size="14" font-weight="bold">Package 1: Assessment</text>
<text x="230" y="254" text-anchor="middle" fill="#6ee7b7" font-family="system-ui, sans-serif" font-size="11">$5K - $10K</text>
<!-- Branching lines from Package 1 -->
<line x1="230" y1="270" x2="230" y2="295" stroke="#3b82f6" stroke-width="2"/>
<line x1="80" y1="295" x2="380" y2="295" stroke="#3b82f6" stroke-width="2"/>
<line x1="80" y1="295" x2="80" y2="330" stroke="#3b82f6" stroke-width="2" marker-end="url(#arrow-down)"/>
<line x1="230" y1="295" x2="230" y2="330" stroke="#3b82f6" stroke-width="2" marker-end="url(#arrow-down)"/>
<line x1="380" y1="295" x2="380" y2="330" stroke="#3b82f6" stroke-width="2" marker-end="url(#arrow-down)"/>
<!-- Package 2 -->
<rect x="10" y="335" width="210" height="65" rx="8" fill="#1e3a5f" stroke="#8b5cf6" stroke-width="2"/>
<text x="115" y="361" text-anchor="middle" fill="#f8fafc" font-family="system-ui, sans-serif" font-size="13" font-weight="bold">Package 2: Speckl</text>
<text x="115" y="379" text-anchor="middle" fill="#c4b5fd" font-family="system-ui, sans-serif" font-size="11">$30K - $50K</text>
<!-- Package 3 -->
<rect x="240" y="335" width="210" height="65" rx="8" fill="#1e3a5f" stroke="#ec4899" stroke-width="2"/>
<text x="345" y="361" text-anchor="middle" fill="#f8fafc" font-family="system-ui, sans-serif" font-size="13" font-weight="bold">Package 3: Fractional</text>
<text x="345" y="379" text-anchor="middle" fill="#f9a8d4" font-family="system-ui, sans-serif" font-size="11">$10K - $15K /mo</text>
<!-- Both (P2 → P3) -->
<rect x="125" y="420" width="210" height="40" rx="8" fill="#1e3a5f" stroke="#94a3b8" stroke-width="1.5" stroke-dasharray="5,3"/>
<text x="230" y="445" text-anchor="middle" fill="#94a3b8" font-family="system-ui, sans-serif" font-size="12">Both (P2 → P3)</text>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View file

@ -0,0 +1,47 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 550 380">
<defs>
<marker id="arrow-down" markerWidth="10" markerHeight="7" refX="5" refY="7" orient="auto" fill="#3b82f6">
<polygon points="0 0, 10 0, 5 7"/>
</marker>
<marker id="arrow-right" markerWidth="10" markerHeight="7" refX="10" refY="3.5" orient="auto" fill="#3b82f6">
<polygon points="0 0, 10 3.5, 0 7"/>
</marker>
</defs>
<!-- Plan D -->
<rect x="75" y="10" width="400" height="85" rx="8" fill="#1e3a5f" stroke="#3b82f6" stroke-width="2.5"/>
<text x="275" y="36" text-anchor="middle" fill="#3b82f6" font-family="system-ui, sans-serif" font-size="14" font-weight="bold">PLAN D</text>
<text x="275" y="55" text-anchor="middle" fill="#f8fafc" font-family="system-ui, sans-serif" font-size="14" font-weight="bold">Speckl Open Standard + Foundation</text>
<text x="275" y="73" text-anchor="middle" fill="#94a3b8" font-family="system-ui, sans-serif" font-size="11">SpeckDL language · Dark Provenance · Reference agents · Certification</text>
<!-- Branches from Plan D -->
<line x1="155" y1="95" x2="155" y2="130" stroke="#3b82f6" stroke-width="2" marker-end="url(#arrow-down)"/>
<line x1="395" y1="95" x2="395" y2="130" stroke="#3b82f6" stroke-width="2" marker-end="url(#arrow-down)"/>
<!-- Plan C -->
<rect x="30" y="135" width="250" height="80" rx="8" fill="#1e3a5f" stroke="#f59e0b" stroke-width="2"/>
<text x="155" y="161" text-anchor="middle" fill="#f59e0b" font-family="system-ui, sans-serif" font-size="14" font-weight="bold">PLAN C</text>
<text x="155" y="180" text-anchor="middle" fill="#f8fafc" font-family="system-ui, sans-serif" font-size="13" font-weight="bold">Consulting + Services</text>
<text x="155" y="198" text-anchor="middle" fill="#94a3b8" font-family="system-ui, sans-serif" font-size="11">Validates methodology · Funds early work</text>
<!-- Plan A -->
<rect x="270" y="135" width="250" height="80" rx="8" fill="#1e3a5f" stroke="#10b981" stroke-width="2"/>
<text x="395" y="161" text-anchor="middle" fill="#10b981" font-family="system-ui, sans-serif" font-size="14" font-weight="bold">PLAN A</text>
<text x="395" y="180" text-anchor="middle" fill="#f8fafc" font-family="system-ui, sans-serif" font-size="13" font-weight="bold">Developer Tool (SaaS)</text>
<text x="395" y="198" text-anchor="middle" fill="#94a3b8" font-family="system-ui, sans-serif" font-size="11">Self-serve PLG · Provenance graph data</text>
<!-- C → A connector -->
<text x="257" y="175" text-anchor="middle" fill="#94a3b8" font-family="system-ui, sans-serif" font-size="16">→</text>
<!-- Plan A → Plan B -->
<line x1="395" y1="215" x2="395" y2="255" stroke="#10b981" stroke-width="2" marker-end="url(#arrow-down)"/>
<!-- Plan B -->
<rect x="150" y="260" width="250" height="80" rx="8" fill="#1e3a5f" stroke="#8b5cf6" stroke-width="2"/>
<text x="275" y="286" text-anchor="middle" fill="#8b5cf6" font-family="system-ui, sans-serif" font-size="14" font-weight="bold">PLAN B</text>
<text x="275" y="305" text-anchor="middle" fill="#f8fafc" font-family="system-ui, sans-serif" font-size="13" font-weight="bold">Compliance Infra (API)</text>
<text x="275" y="323" text-anchor="middle" fill="#94a3b8" font-family="system-ui, sans-serif" font-size="11">Highest margin · Enterprise sticky</text>
<!-- Description text at bottom -->
<text x="275" y="365" text-anchor="middle" fill="#64748b" font-family="system-ui, sans-serif" font-size="11">Open standard (D) → Consulting (C) → SaaS (A) → Compliance API (B)</text>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

View file

@ -0,0 +1,47 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 200">
<defs>
<marker id="arrow" markerWidth="10" markerHeight="7" refX="10" refY="3.5" orient="auto" fill="#3b82f6">
<polygon points="0 0, 10 3.5, 0 7"/>
</marker>
<marker id="arrow-down" markerWidth="10" markerHeight="7" refX="5" refY="7" orient="auto" fill="#6b7280">
<polygon points="0 0, 10 0, 5 7"/>
</marker>
</defs>
<!-- Box: SpeckDL -->
<rect x="20" y="20" width="140" height="60" rx="6" fill="#1e3a5f" stroke="#3b82f6" stroke-width="2"/>
<text x="90" y="47" text-anchor="middle" fill="#f8fafc" font-family="system-ui, sans-serif" font-size="15" font-weight="bold">SpeckDL</text>
<text x="90" y="66" text-anchor="middle" fill="#94a3b8" font-family="system-ui, sans-serif" font-size="11">specification language</text>
<!-- Arrow: SpeckDL → Z3 -->
<line x1="160" y1="50" x2="230" y2="50" stroke="#3b82f6" stroke-width="2" marker-end="url(#arrow)"/>
<!-- Box: Z3 -->
<rect x="235" y="20" width="140" height="60" rx="6" fill="#1e3a5f" stroke="#3b82f6" stroke-width="2"/>
<text x="305" y="47" text-anchor="middle" fill="#f8fafc" font-family="system-ui, sans-serif" font-size="15" font-weight="bold">Z3 (SMT Solver)</text>
<text x="305" y="66" text-anchor="middle" fill="#94a3b8" font-family="system-ui, sans-serif" font-size="11">verify constraints</text>
<!-- Arrow: Z3 → DST -->
<line x1="375" y1="50" x2="445" y2="50" stroke="#3b82f6" stroke-width="2" marker-end="url(#arrow)"/>
<!-- Box: DST -->
<rect x="450" y="20" width="150" height="60" rx="6" fill="#1e3a5f" stroke="#3b82f6" stroke-width="2"/>
<text x="525" y="47" text-anchor="middle" fill="#f8fafc" font-family="system-ui, sans-serif" font-size="15" font-weight="bold">DST</text>
<text x="525" y="66" text-anchor="middle" fill="#94a3b8" font-family="system-ui, sans-serif" font-size="11">decision structures</text>
<!-- Arrow: DST → WASM -->
<line x1="600" y1="50" x2="670" y2="50" stroke="#3b82f6" stroke-width="2" marker-end="url(#arrow)"/>
<!-- Box: WASM -->
<rect x="675" y="20" width="110" height="60" rx="6" fill="#1e3a5f" stroke="#3b82f6" stroke-width="2"/>
<text x="730" y="47" text-anchor="middle" fill="#f8fafc" font-family="system-ui, sans-serif" font-size="15" font-weight="bold">WASM</text>
<text x="730" y="66" text-anchor="middle" fill="#94a3b8" font-family="system-ui, sans-serif" font-size="11">verified artifacts</text>
<!-- Provenance sub-flow -->
<rect x="20" y="120" width="765" height="65" rx="6" fill="none" stroke="#6b7280" stroke-width="1.5" stroke-dasharray="6,3"/>
<text x="400" y="143" text-anchor="middle" fill="#6b7280" font-family="system-ui, sans-serif" font-size="12">Provenance graph grows automatically at each stage</text>
<line x1="90" y1="80" x2="90" y2="118" stroke="#6b7280" stroke-width="1.5" marker-end="url(#arrow-down)"/>
<line x1="305" y1="80" x2="305" y2="118" stroke="#6b7280" stroke-width="1.5" marker-end="url(#arrow-down)"/>
<line x1="525" y1="80" x2="525" y2="118" stroke="#6b7280" stroke-width="1.5" marker-end="url(#arrow-down)"/>
<line x1="730" y1="80" x2="730" y2="118" stroke="#6b7280" stroke-width="1.5" marker-end="url(#arrow-down)"/>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View file

@ -13,34 +13,7 @@
Plan D (open standard + foundation) is not one option among four. It is the **engine**. All revenue flies by on the credibility, adoption, and ecosystem that the open standard builds.
```
┌─────────────────────────────────────────────────────┐
│ PLAN D │
│ Speckl Open Standard + Foundation │
│ (SpeckDL language, Dark Provenance methodology, │
│ reference agents, community, certification) │
└────────────┬──────────────┬─────────────────────────┘
│ │
▼ ▼
┌────────────────┐ ┌──────────────────────────┐
│ PLAN C │ │ PLAN A │
│ Consulting ├─▶ Developer Tool (SaaS) │
│ + Services │ │ - Self-serve PLG │
│ - Validates │ │ - Scales from C learnings│
│ - Funds early │ │ - Generates provenance │
│ - Builds case │ │ graph data │
│ studies │ │ │
└────────────────┘ └──────────────┬─────────────┘
│
▼
┌────────────────────────┐
│ PLAN B │
│ Compliance Infra (API) │
│ - Feeds on SaaS data │
│ - Highest margin │
│ - Enterprise sticky │
└────────────────────────┘
```
![Plan D → C → A → B flow](diagrams/plan-flow.svg)
**The flow:** Open standard (D) builds the language and community → hands-on consulting (C) validates the methodology and funds development → SaaS (A) scales it to more teams and generates real provenance graph data → compliance API (B) monetizes that data at enterprise margins.