1
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Processing Pipeline
2
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
PlanOpticon has four main pipelines: **video analysis**, **document ingestion**, **source connector**, and **export**. Each pipeline can operate independently, and they connect through the shared knowledge graph.
4
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
5
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
6
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
7
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Single video pipeline
8
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
9
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The core video analysis pipeline processes a single video file through eight sequential steps with checkpoint/resume support.
10
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
11
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```mermaid
12
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
sequenceDiagram
13
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
participant CLI
14
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
participant Pipeline
15
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
participant FrameExtractor
16
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
participant AudioExtractor
17
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
participant Provider
18
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
participant DiagramAnalyzer
19
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
participant KnowledgeGraph
20
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
participant Exporter
21
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
22
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
CLI->>Pipeline: process_single_video()
23
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
24
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Note over Pipeline: Step 1: Extract frames
25
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Pipeline->>FrameExtractor: extract_frames()
26
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Note over FrameExtractor: Change detection + periodic capture (every 30s)
27
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
FrameExtractor-->>Pipeline: frame_paths[]
28
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
29
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Note over Pipeline: Step 2: Filter people frames
30
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Pipeline->>Pipeline: filter_people_frames()
31
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Note over Pipeline: OpenCV face detection removes webcam/people frames
32
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
33
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Note over Pipeline: Step 3: Extract + transcribe audio
34
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Pipeline->>AudioExtractor: extract_audio()
35
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Pipeline->>Provider: transcribe_audio()
36
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Note over Provider: Supports speaker hints via --speakers flag
37
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
38
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Note over Pipeline: Step 4: Analyze visuals
39
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Pipeline->>DiagramAnalyzer: process_frames()
40
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
loop Each frame (up to 10 standard / 20 comprehensive)
41
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
DiagramAnalyzer->>Provider: classify (vision)
42
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
alt High confidence diagram
43
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
DiagramAnalyzer->>Provider: full analysis
44
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Note over Provider: Extract description, text, mermaid, chart data
45
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
else Medium confidence
46
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
DiagramAnalyzer-->>Pipeline: screengrab fallback
47
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
end
48
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
end
49
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
50
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Note over Pipeline: Step 5: Build knowledge graph
51
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Pipeline->>KnowledgeGraph: register_source()
52
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Pipeline->>KnowledgeGraph: process_transcript()
53
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Pipeline->>KnowledgeGraph: process_diagrams()
54
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Note over KnowledgeGraph: Writes knowledge_graph.db (SQLite) + .json
55
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
56
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Note over Pipeline: Step 6: Extract key points + action items
57
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Pipeline->>Provider: extract key points
58
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Pipeline->>Provider: extract action items
59
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
60
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Note over Pipeline: Step 7: Generate report
61
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Pipeline->>Pipeline: generate markdown report
62
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Note over Pipeline: Includes mermaid diagrams, tables, cross-references
63
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
64
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Note over Pipeline: Step 8: Export formats
65
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Pipeline->>Exporter: export_all_formats()
66
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Note over Exporter: HTML report, PDF, SVG/PNG renderings, chart reproductions
67
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
68
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Pipeline-->>CLI: VideoManifest
69
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
70
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
71
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Pipeline steps in detail
72
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
73
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Step | Name | Checkpointable | Description |
74
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|------|------|----------------|-------------|
75
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| 1 | Extract frames | Yes | Change detection + periodic capture. Skipped if `frames/frame_*.jpg` exist on disk. |
76
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| 2 | Filter people frames | No | Inline with step 1. OpenCV face detection removes webcam frames. |
77
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| 3 | Extract + transcribe audio | Yes | Skipped if `transcript/transcript.json` exists. Speaker hints passed if `--speakers` provided. |
78
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| 4 | Analyze visuals | Yes | Skipped if `diagrams/` is populated. Evenly samples frames (not just first N). |
79
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| 5 | Build knowledge graph | Yes | Skipped if `results/knowledge_graph.db` exists. Registers source, processes transcript and diagrams. |
80
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| 6 | Extract key points + actions | Yes | Skipped if `results/key_points.json` and `results/action_items.json` exist. |
81
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| 7 | Generate report | Yes | Skipped if `results/analysis.md` exists. |
82
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| 8 | Export formats | No | Always runs. Renders mermaid to SVG/PNG, reproduces charts, generates HTML/PDF. |
83
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
84
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
85
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
86
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Batch pipeline
87
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
88
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The batch pipeline wraps the single-video pipeline and adds cross-video knowledge graph merging.
89
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
90
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```mermaid
91
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
flowchart TD
92
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
A[Scan input directory] --> B[Match video files by pattern]
93
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
B --> C{For each video}
94
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
C --> D[process_single_video]
95
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
D --> E{Success?}
96
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
E -->|Yes| F[Collect manifest + KG]
97
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
E -->|No| G[Log error, continue]
98
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
F --> H[Next video]
99
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
G --> H
100
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
H --> C
101
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
C -->|All done| I[Merge knowledge graphs]
102
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
I --> J[Fuzzy matching + conflict resolution]
103
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
J --> K[Generate batch summary]
104
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
K --> L[Write batch manifest]
105
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
L --> M[batch_manifest.json + batch_summary.md + merged KG]
106
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
107
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
108
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Knowledge graph merge strategy
109
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
110
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
During batch merging, `KnowledgeGraph.merge()` applies:
111
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
112
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
1. **Case-insensitive exact matching** for entity names
113
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
2. **Fuzzy matching** via `SequenceMatcher` (threshold >= 0.85) for near-duplicates
114
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3. **Type conflict resolution** using a specificity ranking (e.g., `technology` > `concept`)
115
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
4. **Description union** across all sources
116
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
5. **Relationship deduplication** by (source, target, type) tuple
117
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
118
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
119
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
120
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Document ingestion pipeline
121
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
122
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The document ingestion pipeline processes files (Markdown, plaintext, PDF) into knowledge graphs without video analysis.
123
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
124
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```mermaid
125
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
flowchart TD
126
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
A[Input: file or directory] --> B{File or directory?}
127
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
B -->|File| C[get_processor by extension]
128
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
B -->|Directory| D[Glob for supported extensions]
129
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
D --> E{Recursive?}
130
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
E -->|Yes| F[rglob all files]
131
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
E -->|No| G[glob top-level only]
132
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
F --> H[For each file]
133
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
G --> H
134
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
H --> C
135
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
C --> I[DocumentProcessor.process]
136
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
I --> J[DocumentChunk list]
137
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
J --> K[Register source in KG]
138
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
K --> L[Add chunks as content]
139
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
L --> M[KG extracts entities + relationships]
140
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
M --> N[knowledge_graph.db]
141
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
142
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
143
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Supported document types
144
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
145
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Extension | Processor | Notes |
146
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|-----------|-----------|-------|
147
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `.md` | `MarkdownProcessor` | Splits by headings into sections |
148
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `.txt` | `PlaintextProcessor` | Splits into fixed-size chunks |
149
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `.pdf` | `PdfProcessor` | Requires `pymupdf` or `pdfplumber`. Falls back gracefully between libraries. |
150
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
151
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Adding documents to an existing graph
152
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
153
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The `--db-path` flag lets you ingest documents into an existing knowledge graph:
154
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
155
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
156
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon ingest spec.md --db-path existing.db
157
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon ingest ./docs/ -o ./output --recursive
158
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
159
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
160
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
161
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
162
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Source connector pipeline
163
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
164
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Source connectors fetch content from cloud services, note-taking apps, and web sources. Each source implements the `BaseSource` ABC with three methods: `authenticate()`, `list_videos()`, and `download()`.
165
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
166
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```mermaid
167
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
flowchart TD
168
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
A[Source command] --> B[Authenticate with provider]
169
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
B --> C{Auth success?}
170
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
C -->|No| D[Error: check credentials]
171
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
C -->|Yes| E[List files in folder]
172
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
E --> F[Filter by pattern / type]
173
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
F --> G[Download to local path]
174
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
G --> H{Analyze or ingest?}
175
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
H -->|Video| I[process_single_video / batch]
176
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
H -->|Document| J[ingest_file / ingest_directory]
177
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
I --> K[Knowledge graph]
178
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
J --> K
179
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
180
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
181
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Available sources
182
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
183
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
PlanOpticon includes connectors for:
184
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
185
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Category | Sources |
186
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|----------|---------|
187
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Cloud storage | Google Drive, S3, Dropbox |
188
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Meeting recordings | Zoom, Google Meet, Microsoft Teams |
189
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Productivity suites | Google Workspace (Docs/Sheets/Slides), Microsoft 365 (SharePoint/OneDrive/OneNote) |
190
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Note-taking apps | Obsidian, Logseq, Apple Notes, Google Keep, Notion |
191
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Web sources | YouTube, Web (URL), RSS, Podcasts |
192
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Developer platforms | GitHub, arXiv |
193
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Social media | Reddit, Twitter/X, Hacker News |
194
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
195
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Each source authenticates via environment variables (API keys, OAuth tokens) specific to the provider.
196
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
197
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
198
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
199
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Planning agent pipeline
200
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
201
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The planning agent consumes a knowledge graph and uses registered skills to generate planning artifacts.
202
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
203
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```mermaid
204
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
flowchart TD
205
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
A[Knowledge graph] --> B[Load into AgentContext]
206
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
B --> C[GraphQueryEngine]
207
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
C --> D[Taxonomy classification]
208
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
D --> E[Agent orchestrator]
209
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
E --> F{Select skill}
210
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
F --> G[ProjectPlan skill]
211
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
F --> H[PRD skill]
212
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
F --> I[Roadmap skill]
213
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
F --> J[TaskBreakdown skill]
214
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
F --> K[DocGenerator skill]
215
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
F --> L[WikiGenerator skill]
216
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
F --> M[NotesExport skill]
217
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
F --> N[ArtifactExport skill]
218
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
F --> O[GitHubIntegration skill]
219
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
F --> P[RequirementsChat skill]
220
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
G --> Q[Artifact output]
221
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
H --> Q
222
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
I --> Q
223
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
J --> Q
224
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
K --> Q
225
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
L --> Q
226
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
M --> Q
227
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
N --> Q
228
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
O --> Q
229
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
P --> Q
230
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Q --> R[Write to disk / push to service]
231
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
232
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
233
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Skill execution flow
234
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
235
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
1. The `AgentContext` is populated with the knowledge graph, query engine, provider manager, and any planning entities from taxonomy classification
236
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
2. Each `Skill` checks `can_execute()` against the context (requires at minimum a knowledge graph and provider manager)
237
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3. The skill's `execute()` method generates an `Artifact` with a name, content, type, and format
238
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
4. Artifacts are collected and can be exported to disk or pushed to external services (GitHub issues, wiki pages, etc.)
239
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
240
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
241
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
242
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Export pipeline
243
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
244
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The export pipeline converts knowledge graphs and analysis artifacts into various output formats.
245
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
246
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```mermaid
247
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
flowchart TD
248
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
A[knowledge_graph.db] --> B{Export command}
249
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
B --> C[export markdown]
250
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
B --> D[export obsidian]
251
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
B --> E[export notion]
252
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
B --> F[export exchange]
253
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
B --> G[wiki generate]
254
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
B --> H[kg convert]
255
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
C --> I[7 document types + entity briefs + CSV]
256
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
D --> J[Obsidian vault with frontmatter + wiki-links]
257
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
E --> K[Notion-compatible markdown + CSV database]
258
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
F --> L[PlanOpticonExchange JSON payload]
259
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
G --> M[GitHub wiki pages + sidebar + home]
260
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
H --> N[Convert between .db / .json / .graphml / .csv]
261
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
262
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
263
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
All export commands accept a `knowledge_graph.db` (or `.json`) path as input. No API key is required for template-based exports (markdown, obsidian, notion, wiki, exchange, convert). Only the planning agent skills that generate new content require a provider.
264
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
265
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
266
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
267
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## How pipelines connect
268
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
269
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```mermaid
270
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
flowchart LR
271
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
V[Video files] --> VP[Video Pipeline]
272
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
D[Documents] --> DI[Document Ingestion]
273
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
S[Cloud Sources] --> SC[Source Connectors]
274
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
SC --> V
275
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
SC --> D
276
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
VP --> KG[(knowledge_graph.db)]
277
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
DI --> KG
278
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
KG --> QE[Query Engine]
279
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
KG --> EP[Export Pipeline]
280
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
KG --> PA[Planning Agent]
281
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
PA --> AR[Artifacts]
282
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
AR --> EP
283
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
284
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
285
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
All pipelines converge on the knowledge graph as the central data store. The knowledge graph is the shared interface between ingestion (video or document), querying, exporting, and planning.
286
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
287
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
288
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
289
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Error handling
290
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
291
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Error handling follows consistent patterns across all pipelines:
292
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
293
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Scenario | Behavior |
294
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|----------|----------|
295
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Video fails in batch | Batch continues. Failed video recorded in manifest with error details. |
296
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Diagram analysis fails | Falls back to screengrab (captioned screenshot). |
297
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| LLM extraction fails | Returns empty results gracefully. Key points and action items will be empty arrays. |
298
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Document processor not found | Raises `ValueError` with list of supported extensions. |
299
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Source authentication fails | Returns `False` from `authenticate()`. CLI prints error message. |
300
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Checkpoint file found | Step is skipped entirely and results are loaded from disk. |
301
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Progress callback fails | Warning logged. Pipeline continues without progress updates. |
302
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
303
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
304
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
305
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Progress callback system
306
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
307
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The pipeline supports a `ProgressCallback` protocol for real-time progress tracking. This is used by the CLI's progress bars and can be implemented by external integrations (web UIs, CI systems, etc.).
308
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
309
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
310
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from video_processor.models import ProgressCallback
311
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
312
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
class MyCallback:
313
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def on_step_start(self, step: str, index: int, total: int) -> None:
314
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
print(f"Starting step {index}/{total}: {step}")
315
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
316
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def on_step_complete(self, step: str, index: int, total: int) -> None:
317
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
print(f"Completed step {index}/{total}: {step}")
318
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
319
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def on_progress(self, step: str, percent: float, message: str = "") -> None:
320
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
print(f" {step}: {percent:.0%} {message}")
321
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
322
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
323
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Pass the callback to `process_single_video()`:
324
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
325
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
326
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from video_processor.pipeline import process_single_video
327
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
328
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
manifest = process_single_video(
329
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
input_path="recording.mp4",
330
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
output_dir="./output",
331
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
progress_callback=MyCallback(),
332
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
)
333
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
334
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
335
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The callback methods are called within a try/except wrapper, so a failing callback never interrupts the pipeline. If a callback method raises an exception, a warning is logged and processing continues.
336
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!