1
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Batch Processing
2
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Basic usage
4
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
5
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
6
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon batch -i ./recordings -o ./output --title "Sprint Reviews"
7
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
8
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
9
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## How it works
10
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
11
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Batch mode:
12
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
13
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
1. Scans the input directory for video files matching the pattern
14
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
2. Processes each video through the full single-video pipeline
15
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3. Merges knowledge graphs across all videos with fuzzy matching and conflict resolution
16
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
4. Generates a batch summary with aggregated stats and action items
17
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
5. Writes a batch manifest linking to per-video results
18
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
19
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## File patterns
20
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
21
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
22
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Default: common video formats
23
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon batch -i ./recordings -o ./output
24
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
25
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Custom patterns
26
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon batch -i ./recordings -o ./output --pattern "*.mp4,*.mov"
27
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
28
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
29
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Output structure
30
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
31
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
32
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
output/
33
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
├── batch_manifest.json # Batch-level manifest
34
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
├── batch_summary.md # Aggregated summary
35
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
├── knowledge_graph.db # Merged KG across all videos (SQLite, primary)
36
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
├── knowledge_graph.json # Merged KG across all videos (JSON export)
37
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
└── videos/
38
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
├── meeting-01/
39
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
│ ├── manifest.json
40
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
│ ├── transcript/
41
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
│ ├── diagrams/
42
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
│ ├── captures/
43
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
│ └── results/
44
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
│ ├── analysis.md
45
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
│ ├── analysis.html
46
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
│ ├── knowledge_graph.db
47
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
│ ├── knowledge_graph.json
48
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
│ ├── key_points.json
49
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
│ └── action_items.json
50
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
└── meeting-02/
51
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
├── manifest.json
52
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
└── ...
53
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
54
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
55
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Knowledge graph merging
56
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
57
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
When the same entity appears across multiple videos, PlanOpticon merges them using a multi-strategy approach:
58
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
59
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Entity deduplication
60
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
61
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **Case-insensitive exact matching** -- `"kubernetes"` and `"Kubernetes"` are recognized as the same entity
62
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **Fuzzy name matching** -- Uses `SequenceMatcher` with a threshold of 0.85 to unify near-duplicate entities (e.g., `"K8s"` and `"k8s cluster"` may be matched depending on context)
63
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **Descriptions are unioned** -- All unique descriptions from each video are combined
64
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **Occurrences are concatenated with source tracking** -- Each occurrence retains its source video reference
65
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
66
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Relationship deduplication
67
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
68
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Relationships are deduplicated by (source, target, type) tuple
69
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Descriptions from duplicate relationships are merged
70
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
71
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Type conflict resolution
72
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
73
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
When the same entity appears with different types across videos, PlanOpticon uses a specificity ranking to resolve the conflict. More specific types are preferred over general ones:
74
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
75
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `technology` > `concept`
76
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `person` > `concept`
77
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `organization` > `concept`
78
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- And so on through the full type hierarchy
79
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
80
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
This ensures that an entity initially classified as a generic `concept` in one video gets upgraded to `technology` if it is identified more specifically in another.
81
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
82
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The merged knowledge graph is saved at the batch root in both SQLite (`knowledge_graph.db`) and JSON (`knowledge_graph.json`) formats, and is included in the batch summary as a Mermaid diagram.
83
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
84
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Error handling
85
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
86
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
If a video fails to process, the batch continues. Failed videos are recorded in the batch manifest with error details:
87
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
88
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```json
89
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{
90
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"video_name": "corrupted-file",
91
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"status": "failed",
92
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"error": "Audio extraction failed: no audio track found"
93
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
94
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
95
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
96
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The batch manifest tracks completion status:
97
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
98
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```json
99
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{
100
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"title": "Sprint Reviews",
101
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"total_videos": 5,
102
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"completed_videos": 4,
103
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"failed_videos": 1,
104
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"total_diagrams": 12,
105
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"total_action_items": 23,
106
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"total_key_points": 45,
107
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"videos": [...],
108
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"batch_summary_md": "batch_summary.md",
109
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"merged_knowledge_graph_json": "knowledge_graph.json",
110
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"merged_knowledge_graph_db": "knowledge_graph.db"
111
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
112
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
113
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
114
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Using batch results
115
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
116
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Query the merged knowledge graph
117
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
118
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
After batch processing completes, the merged knowledge graph at the batch root contains entities and relationships from all successfully processed videos. You can query it just like a single-video knowledge graph:
119
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
120
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
121
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Show stats for the merged graph
122
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon query --db output/knowledge_graph.db
123
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
124
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# List all people mentioned across all videos
125
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon query --db output/knowledge_graph.db "entities --type person"
126
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
127
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# See what connects to an entity across all videos
128
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon query --db output/knowledge_graph.db "neighbors Alice"
129
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
130
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Ask natural language questions about the combined content
131
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon query --db output/knowledge_graph.db "What technologies were discussed across all meetings?"
132
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
133
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Interactive REPL for exploration
134
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon query --db output/knowledge_graph.db -I
135
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
136
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
137
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Export merged results
138
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
139
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
All export commands work with the merged knowledge graph:
140
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
141
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
142
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Generate documents from merged KG
143
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon export markdown output/knowledge_graph.db -o ./docs
144
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
145
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Export as Obsidian vault
146
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon export obsidian output/knowledge_graph.db -o ./vault
147
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
148
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Generate a project-wide exchange file
149
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon export exchange output/knowledge_graph.db --name "Sprint Reviews Q4"
150
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
151
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Generate a GitHub wiki
152
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon wiki generate output/knowledge_graph.db -o ./wiki
153
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
154
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
155
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Classify for planning
156
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
157
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Run taxonomy classification on the merged graph to categorize entities across all videos:
158
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
159
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
160
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon kg classify output/knowledge_graph.db
161
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
162
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
163
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Use with the planning agent
164
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
165
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The planning agent can consume the merged knowledge graph for cross-video analysis and planning:
166
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
167
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
168
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon agent --db output/knowledge_graph.db
169
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
170
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
171
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Incremental batch processing
172
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
173
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
If you add new videos to the recordings directory, you can re-run the batch command. Videos that have already been processed (with output directories present) will be detected via checkpoint/resume within each video's pipeline, making incremental processing efficient.
174
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
175
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
176
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Add new recordings to the folder, then re-run
177
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon batch -i ./recordings -o ./output --title "Sprint Reviews"
178
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
179
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!