coaia-visualizer 1.6.3 → 1.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/Dockerfile +61 -0
  2. package/Dockerfile.app +50 -0
  3. package/cli.ts +11 -5
  4. package/components/chart-detail-editable.tsx +2 -0
  5. package/components/chart-detail.tsx +6 -1
  6. package/components/edit-action-step.tsx +2 -0
  7. package/components/github-provenance.tsx +226 -0
  8. package/components/relation-graph.tsx +91 -27
  9. package/dist/cli.js +9 -5
  10. package/docker-build-push.sh +20 -0
  11. package/docker-entrypoint.sh +27 -0
  12. package/index.tsx +26 -0
  13. package/lib/chart-editor.ts +3 -3
  14. package/lib/github-provenance.ts +316 -0
  15. package/lib/jsonl-parser.ts +2 -2
  16. package/lib/types.ts +15 -2
  17. package/mcp/test_mcp/.gemini/settings.json +18 -0
  18. package/package.json +14 -13
  19. package/rispecs/README.md +170 -0
  20. package/rispecs/accountability-responsibility.rispec.md +110 -0
  21. package/rispecs/api-mcp-interface.spec.md +287 -0
  22. package/rispecs/app.spec.md +364 -0
  23. package/rispecs/chart-editing-workflow.spec.md +297 -0
  24. package/rispecs/chart-visualization-hierarchy.spec.md +235 -0
  25. package/rispecs/cli-mode.spec.md +224 -0
  26. package/rispecs/github-project-runtime-memory-integration.spec.md +381 -0
  27. package/rispecs/jsonl-parsing-data-types.spec.md +243 -0
  28. package/rispecs/narrative-beats-display.spec.md +189 -0
  29. package/rispecs/pde-integration.spec.md +280 -0
  30. package/rispecs/planning-integration.spec.md +329 -0
  31. package/rispecs/relation-graph-visualization.spec.md +171 -0
  32. package/rispecs/relation-to-mcp-structural-thinking.kin.md +65 -0
  33. package/rispecs/ui-component-library.spec.md +258 -0
  34. package/mcp/dist/api-client.d.ts +0 -138
  35. package/mcp/dist/api-client.d.ts.map +0 -1
  36. package/mcp/dist/api-client.js +0 -115
  37. package/mcp/dist/api-client.js.map +0 -1
  38. package/mcp/dist/index.d.ts +0 -2
  39. package/mcp/dist/index.d.ts.map +0 -1
  40. package/mcp/dist/index.js +0 -286
  41. package/mcp/dist/index.js.map +0 -1
  42. package/mcp/dist/tools/index.d.ts +0 -18
  43. package/mcp/dist/tools/index.d.ts.map +0 -1
  44. package/mcp/dist/tools/index.js +0 -322
  45. package/mcp/dist/tools/index.js.map +0 -1
  46. package/mcp/package-lock.json +0 -210
@@ -0,0 +1,189 @@
1
+ # Narrative Beats Display
2
+ ## RISE Specification for Narrative Beat Rendering and Multi-Universe Perspectives
3
+
4
+ **Component Purpose**: Render the story layer of structural tension work — narrative beats that document creative acts, insights, and lessons across multiple archetypal universe perspectives.
5
+
6
+ **Source Files**: `components/narrative-beats.tsx`
7
+
8
+ ---
9
+
10
+ ## 🎯 What This Component Enables Users to Create
11
+
12
+ - Visible narrative context for structural tension work
13
+ - Story documentation across three archetypal universes (engineer-world, ceremony-world, story-engine-world)
14
+ - Chronological beat sequences with act numbering and dramatic type classification
15
+ - Prose narrative passages with lessons learned
16
+ - Temporal metadata for understanding when narrative beats occurred
17
+
18
+ ---
19
+
20
+ ## 🌊 Structural Tension Dynamics
21
+
22
+ ### Current Reality
23
+ Narrative beats exist as `narrative_beat` entity records in JSONL. They carry rich metadata (act, dramatic type, universes, prose, lessons) but are just JSON objects. Without rendering, the story of structural tension work remains invisible — users see charts and actions but not the *meaning* of the work.
24
+
25
+ ### Desired Result
26
+ Each narrative beat rendered as a richly structured card showing:
27
+ - Act sequence and dramatic type (header)
28
+ - Multi-universe perspective badges
29
+ - Description and narrative prose
30
+ - Lessons learned as discrete insight items
31
+ - Temporal context via timestamps
32
+
33
+ ### Natural Resolution
34
+ The `NarrativeBeats` component reads metadata from `EntityRecord[]` and renders each beat as a visually distinct card within the chart detail view, making the story layer tangible alongside the structural tension elements.
35
+
36
+ ---
37
+
38
+ ## 📋 NarrativeBeats Component
39
+
40
+ ### Props
41
+ ```typescript
42
+ interface NarrativeBeatsProps {
43
+ beats: EntityRecord[] // Array of narrative_beat entities
44
+ }
45
+ ```
46
+
47
+ ### EntityRecord Metadata Schema (for narrative beats)
48
+ ```typescript
49
+ metadata: {
50
+ act: number // Act number in sequence (1, 2, 3...)
51
+ type_dramatic: string // "Crisis/Antagonist Force", "Turning Point", "Setup", etc.
52
+ universes: string[] // ["engineer-world", "ceremony-world", "story-engine-world"]
53
+ timestamp: string // ISO 8601 creation timestamp
54
+ narrative: {
55
+ description: string // Short description of the beat
56
+ prose: string // Full narrative passage
57
+ lessons: string[] // Array of lessons/insights
58
+ }
59
+ }
60
+ ```
61
+
62
+ ### Render Structure
63
+
64
+ ```
65
+ ┌─────────────────────────────────────────────────────────┐
66
+ │ 🎭 Act 3 · Crisis/Antagonist Force · Beat #7 │
67
+ │ 2024-03-15 14:30 │
68
+ │ │
69
+ │ 🧭 Universes: [engineer-world] [ceremony-world] │
70
+ │ │
71
+ │ ✨ The parsing algorithm encountered a hierarchy depth │
72
+ │ that exceeded the expected 3-level nesting... │
73
+ │ │
74
+ │ ┌─────────────────────────────────────────────────────┐ │
75
+ │ │ "The tension between flat JSONL and deep hierarchy │ │
76
+ │ │ became the very structural tension the tool was │ │
77
+ │ │ designed to visualize — a recursive mirror of │ │
78
+ │ │ its own purpose." │ │
79
+ │ └─────────────────────────────────────────────────────┘ │
80
+ │ │
81
+ │ 📚 Lessons: │
82
+ │ • Recursive structures require iterative assembly │
83
+ │ • The tool's challenge mirrors the user's challenge │
84
+ └─────────────────────────────────────────────────────────┘
85
+ ```
86
+
87
+ ### Visual Elements
88
+
89
+ | Element | Lucide Icon | Display | Styling |
90
+ |:---|:---|:---|:---|
91
+ | **Act & Type** | `Drama` | "Act {N} · {type_dramatic} · Beat #{index}" | Header text, muted timestamp |
92
+ | **Universes** | `Compass` | Badge per universe | Badge components in row |
93
+ | **Description** | `Sparkles` | Short description text | Normal text |
94
+ | **Prose** | — | Quoted narrative passage | Highlighted/quoted box, muted color |
95
+ | **Timestamp** | `Clock` | ISO timestamp formatted | Muted text |
96
+ | **Lessons** | *(no icon)* | Bulleted list | Muted boxes per lesson item |
97
+
98
+ ### Empty State
99
+ When `beats.length === 0`, renders a centered muted text: "No narrative beats documented yet"
100
+
101
+ ### Card Styling
102
+ - Left border accent using `chart-3` color theme
103
+ - Card component with header and content sections
104
+ - Responsive layout within chart detail view
105
+
106
+ ---
107
+
108
+ ## 📋 Integration Points
109
+
110
+ ### Within ChartDetailEditable
111
+ ```
112
+ ChartDetailEditable
113
+ └── if chart.narrativeBeats.length > 0:
114
+ <NarrativeBeats beats={chart.narrativeBeats} />
115
+ ```
116
+
117
+ Narrative beats section appears between the Structural Tension section (desired outcome + current reality) and the Actions/Relations tabs.
118
+
119
+ ### Within ChartDetail (Read-Only)
120
+ Same placement — narrative beats displayed as read-only cards.
121
+
122
+ ### Data Source
123
+ Narrative beats are populated during `organizeData()` Pass 3, where entities with `entityType === "narrative_beat"` are collected into their chart's `narrativeBeats` array based on chart ID prefix matching.
124
+
125
+ ---
126
+
127
+ ## 📋 Multi-Universe Perspectives
128
+
129
+ The Three Archetypal Universes represent different lenses through which the same structural tension work is understood:
130
+
131
+ | Universe | Perspective | What It Illuminates |
132
+ |:---|:---|:---|
133
+ | **engineer-world** | Technical precision | Algorithms, data structures, system behavior |
134
+ | **ceremony-world** | Relational meaning | Kinship, accountability, ceremonial intent |
135
+ | **story-engine-world** | Narrative arc | Drama, character, plot progression |
136
+
137
+ A single narrative beat may exist in one, two, or all three universes simultaneously. The universe badges communicate which perspectives apply to each beat.
138
+
139
+ ---
140
+
141
+ ## 📋 Creative Advancement Scenario
142
+
143
+ ### Scenario: Reading the Story of a Sprint
144
+ **User Intent**: Understand the narrative arc of structural tension work across a multi-day session
145
+ **Current Structural Reality**: Chart has 5 completed actions and 12 narrative beats recorded by an agent
146
+
147
+ **Natural Progression**:
148
+ 1. User selects chart from hierarchy view
149
+ 2. Scrolls to narrative beats section
150
+ 3. Sees beats ordered by act number with dramatic types
151
+ 4. Act 1 beats: "Setup" type — initial structural tension established
152
+ 5. Act 2 beats: "Turning Point" — key insight changes approach
153
+ 6. Act 3 beats: "Crisis/Antagonist Force" — complexity challenge encountered
154
+ 7. Act 4 beats: "Resolution" — structural tension resolved through creation
155
+ 8. Each beat shows universe badges indicating which perspectives apply
156
+ 9. Prose passages provide the full narrative of each moment
157
+ 10. Lessons capture the transferable wisdom from each beat
158
+
159
+ ---
160
+
161
+ ## ✅ Quality Criteria
162
+
163
+ ✅ **Narrative Visibility**
164
+ - Every narrative beat is rendered with its full metadata
165
+ - Prose is visually distinct (quoted/highlighted) from description
166
+ - Lessons are discrete, scannable items
167
+
168
+ ✅ **Universe Clarity**
169
+ - Universe badges clearly labeled
170
+ - Multiple universes displayed in a row without confusion
171
+ - Missing universe data handled gracefully
172
+
173
+ ✅ **Temporal Context**
174
+ - Timestamps displayed in human-readable format
175
+ - Act numbering provides sequence context
176
+ - Dramatic type provides narrative arc context
177
+
178
+ ✅ **Graceful Handling**
179
+ - Empty beats array shows meaningful empty state message
180
+ - Missing metadata fields don't crash the component
181
+ - Component is purely presentational (no side effects)
182
+
183
+ ---
184
+
185
+ ## 🔗 Related Components
186
+
187
+ - [chart-visualization-hierarchy.spec.md](./chart-visualization-hierarchy.spec.md) — ChartDetail hosts NarrativeBeats
188
+ - [jsonl-parsing-data-types.spec.md](./jsonl-parsing-data-types.spec.md) — EntityRecord type with narrative metadata
189
+ - [app.spec.md](./app.spec.md) — narrative beats as one of the core display layers
@@ -0,0 +1,280 @@
1
+ # 🔮 Future Integration: PDE-Sourced Chart Visualization
2
+
3
+ > How coaia-visualizer COULD surface the ceremonial origin and Four Directions structure of charts born from Prompt Decomposition Engine transformations.
4
+
5
+ **Status**: 🔮 FUTURE / ASPIRATIONAL
6
+ **Framework**: RISE
7
+ **Cross-references**:
8
+ - [app.spec.md](./app.spec.md) — current visualizer architecture
9
+ - [chart-visualization-hierarchy.spec.md](./chart-visualization-hierarchy.spec.md) — current chart rendering
10
+ - [`coaia-pde/rispecs/pde-to-stc-transformation.rispec.md`](../../coaia-pde/rispecs/pde-to-stc-transformation.rispec.md) — PDE metadata schema
11
+ - [`coaia-pde/KINSHIP.md`](../../coaia-pde/KINSHIP.md) — PDE lineage and identity
12
+
13
+ ---
14
+
15
+ ## 🌊 Structural Tension
16
+
17
+ ### Current Reality
18
+
19
+ coaia-visualizer treats all JSONL charts identically. A chart produced by coaia-pde (from a PDE DecompositionResult with Four Directions metadata, implicit intents, confidence scores, and decomposition provenance) looks exactly the same as a hand-authored coaia-narrative chart. The `.coaia/pde/<UUID>.jsonl` files contain a `pde_session` header line and entities with `metadata.fourDirections`, `metadata.implicit`, `metadata.confidence`, and `metadata.direction` fields — none of which the visualizer reads or renders.
20
+
21
+ Specifically:
22
+ - PDE sessions start with `{ "type": "pde_session", ... }` — the visualizer ignores this entirely
23
+ - Action steps carry `metadata.direction` (EAST/SOUTH/WEST/NORTH) — rendered as flat list
24
+ - Some actions carry `metadata.implicit: true` — invisible to the user
25
+ - Entity metadata contains `metadata.fourDirections` with `north_vision`, `east_intention`, `south_emotion`, `west_introspection` — not displayed
26
+ - No link back to the `.pde/` decomposition that birthed the chart
27
+
28
+ ### Desired Result
29
+
30
+ Practitioners see the **ceremony origin** of their structural tension. When a chart was born from PDE decomposition, the visualizer surfaces:
31
+ - The Four Directions as a navigable Medicine Wheel layout with directional color coding
32
+ - Which `.pde/` decomposition sourced this chart, with a facet count
33
+ - Implicit intents flagged as visual badges so nothing is silently dropped
34
+ - Action steps grouped by their ceremonial direction instead of a flat list
35
+ - A provenance breadcrumb trail: Original Prompt → PDE Decomposition → STC Chart
36
+
37
+ This creates a **living ceremonial map** — not just structural tension, but structural tension with its vision-lineage visible.
38
+
39
+ ---
40
+
41
+ ## 🎨 Design Approach
42
+
43
+ ### 1. Four Directions Visualization
44
+
45
+ **Concept**: Replace or augment the flat action list with a quadrant layout when `metadata.fourDirections` is present on the chart entity.
46
+
47
+ **Medicine Wheel Color Scheme**:
48
+
49
+ | Direction | Color | Icon | Role in Chart |
50
+ |-----------|-------|------|---------------|
51
+ | 🌅 EAST | `amber-400` / gold | Sunrise/Eye | Desired Outcome — what wants to emerge |
52
+ | 🔥 SOUTH | `red-500` / crimson | Flame/Shield | Current Reality — what must be understood |
53
+ | 🌊 WEST | `blue-500` / deep blue | Wave/Mirror | Structural Tension — the generative gap |
54
+ | ❄️ NORTH | `slate-200` / white | Snowflake/Star | Action Steps — strategic secondary choices |
55
+
56
+ **Layout Options**:
57
+
58
+ A. **Quadrant View** (primary): Four-panel grid within ChartDetailEditable. Each quadrant holds its direction's content. Center shows the chart title and overall progress.
59
+
60
+ ```
61
+ ┌─────────────────┬─────────────────┐
62
+ │ 🌅 EAST │ ❄️ NORTH │
63
+ │ Vision │ Wisdom │
64
+ │ (desired │ (actions / │
65
+ │ outcome) │ strategic) │
66
+ ├─────────────────┼─────────────────┤
67
+ │ 🔥 SOUTH │ 🌊 WEST │
68
+ │ Analysis │ Experience │
69
+ │ (current │ (tension / │
70
+ │ reality) │ practice) │
71
+ └─────────────────┴─────────────────┘
72
+ ```
73
+
74
+ B. **Direction Badges** (minimal): Each action step gets a colored direction badge beside it in the existing flat list. Lower lift, still informative.
75
+
76
+ **Implementation Approach**:
77
+ - Detect PDE origin via `pde_session` line or `metadata.fourDirections` on chart entity
78
+ - New component: `FourDirectionsView` wrapping four `DirectionPanel` sub-components
79
+ - `DirectionPanel` renders entities filtered by `metadata.direction`
80
+ - Falls back to standard flat layout when no direction metadata exists
81
+ - Transitions smoothly between quadrant and flat via toggle button
82
+
83
+ ### 2. PDE Source Linking
84
+
85
+ **Concept**: When a chart originated from a PDE decomposition, show a provenance badge in the chart header.
86
+
87
+ **Badge Content**:
88
+ - 🔬 PDE source icon
89
+ - Decomposition ID (truncated UUID)
90
+ - Facet count (e.g., "4 facets — 2 implicit")
91
+ - Original prompt snippet (first 80 chars)
92
+ - Link/tooltip showing the `.pde/` file path
93
+
94
+ **Data Source**: The `pde_session` metadata line contains:
95
+ ```json
96
+ {
97
+ "type": "pde_session",
98
+ "id": "<UUID>",
99
+ "pdeId": "<decomposition-uuid>",
100
+ "createdAt": "ISO-8601",
101
+ "status": "active"
102
+ }
103
+ ```
104
+
105
+ **Implementation Approach**:
106
+ - Extend `parseJSONL()` to recognize `pde_session` records and attach to chart metadata
107
+ - New component: `PdeSourceBadge` displayed in `ChartDetailEditable` header
108
+ - Optional: clicking badge opens a popover with full decomposition metadata
109
+
110
+ ### 3. Implicit Intent Indicators
111
+
112
+ **Concept**: PDE extracts implicit intents that weren't explicitly stated in the original prompt. These become action steps with `metadata.implicit: true` and sometimes lower confidence. Surface these as visual warnings so practitioners know what was inferred vs. stated.
113
+
114
+ **Visual Treatment**:
115
+ - Implicit actions get a `⚡ Inferred` badge in `amber-500`
116
+ - Tooltip explains: "This intent was not explicitly stated but was detected by PDE decomposition"
117
+ - Optional filter toggle: "Show/Hide inferred intents"
118
+ - Confidence score shown as a thin progress bar beneath the action text
119
+
120
+ **Implementation Approach**:
121
+ - Read `metadata.implicit` boolean on action_step entities
122
+ - Read `metadata.confidence` number (0–1) on action_step entities
123
+ - New sub-component: `ImplicitBadge` — conditional render within action item
124
+ - New sub-component: `ConfidenceBar` — thin colored bar (green ≥0.8, amber ≥0.5, red <0.5)
125
+
126
+ ### 4. Direction-Based Action Grouping
127
+
128
+ **Concept**: Instead of a flat action list, group actions by their Four Direction when `metadata.direction` is present.
129
+
130
+ **Grouped Layout**:
131
+ ```
132
+ ❄️ NORTH — Strategic Actions
133
+ ├─ ☐ Implement authentication module
134
+ ├─ ☐ Deploy staging environment
135
+ └─ ✓ Configure CI pipeline
136
+
137
+ 🌅 EAST — Vision Actions
138
+ └─ ☐ Draft architecture decision record
139
+
140
+ 🔥 SOUTH — Analysis Actions
141
+ ├─ ☐ Audit existing dependencies
142
+ └─ ⚡ Review security assumptions (inferred)
143
+
144
+ 🌊 WEST — Experiential Actions
145
+ └─ ☐ Prototype user flow
146
+ ```
147
+
148
+ **Implementation Approach**:
149
+ - New utility: `groupActionsByDirection(actions: EntityRecord[])` → `Map<string, EntityRecord[]>`
150
+ - New component: `DirectionActionGroup` renders a collapsible section per direction
151
+ - Direction header shows icon, color, direction name, and count
152
+ - Actions within each group maintain existing edit/complete/telescope capabilities
153
+ - Ungrouped actions (no direction metadata) render in an "Uncategorized" section
154
+
155
+ ### 5. PDE-to-Chart Provenance Trail
156
+
157
+ **Concept**: Visual breadcrumb showing the transformation path from original prompt to the current chart.
158
+
159
+ **Breadcrumb Layout**:
160
+ ```
161
+ 💬 Original Prompt → 🔬 PDE Decomposition (4 facets) → 📊 STC Chart (chart_7)
162
+ ```
163
+
164
+ **Each Segment**:
165
+ - **Original Prompt**: Truncated prompt text, click to expand full text in dialog
166
+ - **PDE Decomposition**: Decomposition ID, facet count, link to `.pde/` markdown export
167
+ - **STC Chart**: Current chart ID with creation timestamp
168
+
169
+ **Implementation Approach**:
170
+ - New component: `ProvenanceTrail` rendered above chart header when PDE metadata exists
171
+ - Data assembled from `pde_session` record + chart entity metadata
172
+ - Each breadcrumb segment is a clickable element (expand or navigate)
173
+
174
+ ---
175
+
176
+ ## 📊 Entity Metadata Requirements
177
+
178
+ For this integration to work, coaia-pde JSONL must include these metadata fields (most already exist per the transformation rispec):
179
+
180
+ ### On `pde_session` Record (Line 1)
181
+ ```typescript
182
+ {
183
+ type: "pde_session"
184
+ id: string // Session UUID
185
+ pdeId: string // Source decomposition UUID
186
+ originalPrompt?: string // The prompt that was decomposed
187
+ facetCount?: number // Number of PDE facets
188
+ implicitCount?: number // Number of implicit intents detected
189
+ createdAt: string // ISO-8601
190
+ status: "active" | "completed"
191
+ }
192
+ ```
193
+
194
+ ### On `structural_tension_chart` Entity
195
+ ```typescript
196
+ metadata: {
197
+ fourDirections?: {
198
+ north_vision: string
199
+ east_intention: string
200
+ south_emotion: string
201
+ west_introspection: string
202
+ }
203
+ pdeSource?: string // Decomposition UUID
204
+ phase?: string // Current phase
205
+ }
206
+ ```
207
+
208
+ ### On `action_step` Entity
209
+ ```typescript
210
+ metadata: {
211
+ direction?: "EAST" | "SOUTH" | "WEST" | "NORTH"
212
+ implicit?: boolean
213
+ confidence?: number // 0–1
214
+ dependency?: string // Name of dependent action
215
+ completionStatus?: boolean
216
+ order?: number
217
+ }
218
+ ```
219
+
220
+ ---
221
+
222
+ ## 🧩 UI Components Needed
223
+
224
+ | Component | Purpose | Parent |
225
+ |-----------|---------|--------|
226
+ | `FourDirectionsView` | Quadrant layout for directional chart display | `ChartDetailEditable` |
227
+ | `DirectionPanel` | Single direction content panel with color/icon | `FourDirectionsView` |
228
+ | `PdeSourceBadge` | Provenance badge in chart header | `ChartDetailEditable` |
229
+ | `ImplicitBadge` | "⚡ Inferred" indicator on action steps | Action item row |
230
+ | `ConfidenceBar` | Thin colored confidence indicator | Action item row |
231
+ | `DirectionActionGroup` | Collapsible direction-grouped action section | Actions tab |
232
+ | `ProvenanceTrail` | Breadcrumb trail: Prompt → PDE → Chart | Above chart header |
233
+ | `PdeDetailPopover` | Expanded PDE decomposition metadata | `PdeSourceBadge` click |
234
+
235
+ ---
236
+
237
+ ## 🎯 What This Enables
238
+
239
+ ### For Practitioners
240
+ - **See the ceremony**: A chart born from PDE decomposition visually carries its Medicine Wheel origin — not as decoration, but as navigational structure
241
+ - **Trust the inference**: Implicit intents are visible, not hidden. Practitioners can validate or dismiss PDE's inferences with full awareness
242
+ - **Navigate by direction**: Instead of a flat action list, practitioners move through EAST (vision) → SOUTH (analysis) → WEST (experience) → NORTH (wisdom) — the natural creative cycle
243
+
244
+ ### For the Ecosystem
245
+ - **coaia-pde gains a face**: Its JSONL output becomes visually distinct and meaningful in the visualizer
246
+ - **Provenance creates trust**: Seeing the transformation path (prompt → decomposition → chart) builds confidence in the automated pipeline
247
+ - **Four Directions become tangible**: The Medicine Wheel framework moves from metadata convention to lived visual experience
248
+
249
+ ---
250
+
251
+ ## ✅ Quality Criteria
252
+
253
+ ✅ **Ceremonial Integrity**
254
+ - Four Directions use authentic Medicine Wheel colors and ordering (East → South → West → North)
255
+ - Direction layout is a navigational tool, not decorative — each quadrant is interactive
256
+
257
+ ✅ **Graceful Degradation**
258
+ - Charts without PDE metadata render exactly as they do today — zero regression
259
+ - Missing fields (no `fourDirections`, no `implicit`) silently degrade to standard view
260
+ - PDE components never render on non-PDE charts
261
+
262
+ ✅ **Structural Tension Preserved**
263
+ - Desired outcome ↔ current reality tension remains the primary visual axis
264
+ - Four Directions enhance but do not replace the core STC display
265
+ - Creative orientation language maintained throughout all new components
266
+
267
+ ✅ **Data Fidelity**
268
+ - No new JSONL fields invented — only existing coaia-pde metadata consumed
269
+ - Provenance trail reads from data already in the JSONL (pde_session + entity metadata)
270
+ - Round-trip: editing a PDE chart and exporting preserves all PDE metadata
271
+
272
+ ---
273
+
274
+ ## 🔗 Cross-References
275
+
276
+ - [chart-visualization-hierarchy.spec.md](./chart-visualization-hierarchy.spec.md) — ChartDetailEditable extension point
277
+ - [jsonl-parsing-data-types.spec.md](./jsonl-parsing-data-types.spec.md) — parseJSONL extension for `pde_session`
278
+ - [ui-component-library.spec.md](./ui-component-library.spec.md) — color and icon patterns
279
+ - [`coaia-pde/rispecs/pde-to-stc-transformation.rispec.md`](../../coaia-pde/rispecs/pde-to-stc-transformation.rispec.md) — source metadata schema
280
+ - [planning-integration.spec.md](./planning-integration.spec.md) — sibling future spec