videonut 1.2.8 → 1.3.0
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.
- package/README.md +272 -272
- package/USER_GUIDE.md +90 -90
- package/agents/core/eic.md +771 -771
- package/agents/creative/director.md +246 -246
- package/agents/creative/scriptwriter.md +207 -207
- package/agents/research/investigator.md +394 -394
- package/agents/technical/archivist.md +288 -288
- package/agents/technical/scavenger.md +247 -247
- package/config.yaml +61 -61
- package/docs/scriptwriter.md +42 -42
- package/file_validator.py +186 -186
- package/memory/short_term/asset_manifest.md +64 -64
- package/memory/short_term/investigation_dossier.md +31 -31
- package/memory/short_term/master_script.md +51 -51
- package/package.json +61 -64
- package/requirements.txt +8 -8
- package/tools/check_env.py +76 -76
- package/tools/downloaders/caption_reader.py +237 -237
- package/tools/downloaders/clip_grabber.py +82 -82
- package/tools/downloaders/image_grabber.py +105 -105
- package/tools/downloaders/pdf_reader.py +163 -163
- package/tools/downloaders/screenshotter.py +58 -58
- package/tools/downloaders/web_reader.py +69 -69
- package/tools/validators/link_checker.py +45 -45
- package/workflow_orchestrator.py +336 -336
- package/.claude/commands/archivist.toml +0 -12
- package/.claude/commands/director.toml +0 -12
- package/.claude/commands/eic.toml +0 -12
- package/.claude/commands/investigator.toml +0 -12
- package/.claude/commands/prompt.toml +0 -12
- package/.claude/commands/scavenger.toml +0 -12
- package/.claude/commands/scout.toml +0 -12
- package/.claude/commands/scriptwriter.toml +0 -12
- package/.claude/commands/seo.toml +0 -12
- package/.claude/commands/thumbnail.toml +0 -12
- package/.claude/commands/topic_scout.toml +0 -12
- package/.gemini/commands/archivist.toml +0 -12
- package/.gemini/commands/director.toml +0 -12
- package/.gemini/commands/eic.toml +0 -12
- package/.gemini/commands/investigator.toml +0 -12
- package/.gemini/commands/prompt.toml +0 -12
- package/.gemini/commands/scavenger.toml +0 -12
- package/.gemini/commands/scout.toml +0 -12
- package/.gemini/commands/scriptwriter.toml +0 -12
- package/.gemini/commands/seo.toml +0 -12
- package/.gemini/commands/thumbnail.toml +0 -12
- package/.gemini/commands/topic_scout.toml +0 -12
- package/.qwen/commands/archivist.toml +0 -12
- package/.qwen/commands/director.toml +0 -12
- package/.qwen/commands/eic.toml +0 -12
- package/.qwen/commands/investigator.toml +0 -12
- package/.qwen/commands/prompt.toml +0 -12
- package/.qwen/commands/scavenger.toml +0 -12
- package/.qwen/commands/scout.toml +0 -12
- package/.qwen/commands/scriptwriter.toml +0 -12
- package/.qwen/commands/seo.toml +0 -12
- package/.qwen/commands/thumbnail.toml +0 -12
- package/.qwen/commands/topic_scout.toml +0 -12
package/docs/scriptwriter.md
CHANGED
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
# ✍️ Scriptwriter Agent: Sorkin
|
|
2
|
-
|
|
3
|
-
The Scriptwriter is a specialized creative agent designed to bridge the gap between raw investigative data and cinematic visual direction. It focuses exclusively on the **human element**, **narrative flow**, and **viewer retention**.
|
|
4
|
-
|
|
5
|
-
## 🎯 Purpose
|
|
6
|
-
The primary goal of the Scriptwriter is to humanize the findings of the Investigator. While the Investigator provides the "Truth," the Scriptwriter provides the "Soul." It ensures that all 360-degree perspectives (victims, authorities, systems) are represented with emotional depth and persuasive rhetoric.
|
|
7
|
-
|
|
8
|
-
## 🛠️ Setup & Dependencies
|
|
9
|
-
The Scriptwriter operates within the VideoNut ecosystem and requires the following:
|
|
10
|
-
- **Project Structure:** Must have access to the active project's `truth_dossier.md`.
|
|
11
|
-
- **Dependencies:**
|
|
12
|
-
- Python 3.8+
|
|
13
|
-
- VideoNut Core Framework (for file I/O)
|
|
14
|
-
- `config.yaml` with an active `current_project` path.
|
|
15
|
-
|
|
16
|
-
## 🚀 Usage
|
|
17
|
-
|
|
18
|
-
### CLI Integration
|
|
19
|
-
You can invoke the Scriptwriter directly from the Gemini CLI:
|
|
20
|
-
```bash
|
|
21
|
-
/scriptwriter
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
### Workflow Execution
|
|
25
|
-
1. **Load Agent:** Use `/scriptwriter`.
|
|
26
|
-
2. **Execute Command:** Select `[WS] Write Script`.
|
|
27
|
-
3. **Input:** Automatically reads the `truth_dossier.md` from the active project.
|
|
28
|
-
4. **Output:** Generates `narrative_script.md` in the project folder.
|
|
29
|
-
|
|
30
|
-
## 🧠 Core Logic: The 360-Degree Perspective
|
|
31
|
-
The agent uses a **Recursive Narrative Audit** to ensure:
|
|
32
|
-
- **The Hook:** A 45-second high-retention opening.
|
|
33
|
-
- **Stakeholder Inclusion:** Dedicated emotional beats for victims found by the "Bloodhound" protocol.
|
|
34
|
-
- **Rhetorical Sharpness:** Criticism of authority and systemic issues where supported by facts.
|
|
35
|
-
|
|
36
|
-
## 📝 Configuration (TOML)
|
|
37
|
-
The agent is registered in the CLI via the following TOML structure:
|
|
38
|
-
```toml
|
|
39
|
-
[scriptwriter]
|
|
40
|
-
name = "scriptwriter"
|
|
41
|
-
description = "Invoke the Scriptwriter agent (Sorkin)"
|
|
42
|
-
agent_path = "_video_nut/agents/creative/scriptwriter.md"
|
|
1
|
+
# ✍️ Scriptwriter Agent: Sorkin
|
|
2
|
+
|
|
3
|
+
The Scriptwriter is a specialized creative agent designed to bridge the gap between raw investigative data and cinematic visual direction. It focuses exclusively on the **human element**, **narrative flow**, and **viewer retention**.
|
|
4
|
+
|
|
5
|
+
## 🎯 Purpose
|
|
6
|
+
The primary goal of the Scriptwriter is to humanize the findings of the Investigator. While the Investigator provides the "Truth," the Scriptwriter provides the "Soul." It ensures that all 360-degree perspectives (victims, authorities, systems) are represented with emotional depth and persuasive rhetoric.
|
|
7
|
+
|
|
8
|
+
## 🛠️ Setup & Dependencies
|
|
9
|
+
The Scriptwriter operates within the VideoNut ecosystem and requires the following:
|
|
10
|
+
- **Project Structure:** Must have access to the active project's `truth_dossier.md`.
|
|
11
|
+
- **Dependencies:**
|
|
12
|
+
- Python 3.8+
|
|
13
|
+
- VideoNut Core Framework (for file I/O)
|
|
14
|
+
- `config.yaml` with an active `current_project` path.
|
|
15
|
+
|
|
16
|
+
## 🚀 Usage
|
|
17
|
+
|
|
18
|
+
### CLI Integration
|
|
19
|
+
You can invoke the Scriptwriter directly from the Gemini CLI:
|
|
20
|
+
```bash
|
|
21
|
+
/scriptwriter
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Workflow Execution
|
|
25
|
+
1. **Load Agent:** Use `/scriptwriter`.
|
|
26
|
+
2. **Execute Command:** Select `[WS] Write Script`.
|
|
27
|
+
3. **Input:** Automatically reads the `truth_dossier.md` from the active project.
|
|
28
|
+
4. **Output:** Generates `narrative_script.md` in the project folder.
|
|
29
|
+
|
|
30
|
+
## 🧠 Core Logic: The 360-Degree Perspective
|
|
31
|
+
The agent uses a **Recursive Narrative Audit** to ensure:
|
|
32
|
+
- **The Hook:** A 45-second high-retention opening.
|
|
33
|
+
- **Stakeholder Inclusion:** Dedicated emotional beats for victims found by the "Bloodhound" protocol.
|
|
34
|
+
- **Rhetorical Sharpness:** Criticism of authority and systemic issues where supported by facts.
|
|
35
|
+
|
|
36
|
+
## 📝 Configuration (TOML)
|
|
37
|
+
The agent is registered in the CLI via the following TOML structure:
|
|
38
|
+
```toml
|
|
39
|
+
[scriptwriter]
|
|
40
|
+
name = "scriptwriter"
|
|
41
|
+
description = "Invoke the Scriptwriter agent (Sorkin)"
|
|
42
|
+
agent_path = "_video_nut/agents/creative/scriptwriter.md"
|
|
43
43
|
```
|
package/file_validator.py
CHANGED
|
@@ -1,187 +1,187 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
VideoNut File Validator
|
|
4
|
-
Validates the integrity and format of files generated by the VideoNut agents
|
|
5
|
-
"""
|
|
6
|
-
import os
|
|
7
|
-
import sys
|
|
8
|
-
import re
|
|
9
|
-
from pathlib import Path
|
|
10
|
-
|
|
11
|
-
def validate_truth_dossier(file_path):
|
|
12
|
-
"""Validate the truth_dossier.md file"""
|
|
13
|
-
if not os.path.exists(file_path):
|
|
14
|
-
return False, f"File does not exist: {file_path}"
|
|
15
|
-
|
|
16
|
-
with open(file_path, 'r', encoding='utf-8') as f:
|
|
17
|
-
content = f.read()
|
|
18
|
-
|
|
19
|
-
# Check for essential sections
|
|
20
|
-
required_sections = ['The Investigation Blueprint', 'The Findings', 'The Angle', 'The Conflict']
|
|
21
|
-
missing_sections = []
|
|
22
|
-
|
|
23
|
-
for section in required_sections:
|
|
24
|
-
if f'# {section}' not in content and f'## {section}' not in content:
|
|
25
|
-
missing_sections.append(section)
|
|
26
|
-
|
|
27
|
-
if missing_sections:
|
|
28
|
-
return False, f"Missing required sections: {missing_sections}"
|
|
29
|
-
|
|
30
|
-
# Check for minimum content length
|
|
31
|
-
if len(content.strip()) < 100:
|
|
32
|
-
return False, "File content too short, may be incomplete"
|
|
33
|
-
|
|
34
|
-
return True, "Truth Dossier validation passed"
|
|
35
|
-
|
|
36
|
-
def validate_narrative_script(file_path):
|
|
37
|
-
"""Validate the narrative_script.md file"""
|
|
38
|
-
if not os.path.exists(file_path):
|
|
39
|
-
return False, f"File does not exist: {file_path}"
|
|
40
|
-
|
|
41
|
-
with open(file_path, 'r', encoding='utf-8') as f:
|
|
42
|
-
content = f.read()
|
|
43
|
-
|
|
44
|
-
# Check for essential narrative elements
|
|
45
|
-
required_elements = ['The Hook', 'The Bridge', 'The Meat', 'The Verdict']
|
|
46
|
-
missing_elements = []
|
|
47
|
-
|
|
48
|
-
for element in required_elements:
|
|
49
|
-
if element not in content:
|
|
50
|
-
missing_elements.append(element)
|
|
51
|
-
|
|
52
|
-
if missing_elements:
|
|
53
|
-
return False, f"Missing required narrative elements: {missing_elements}"
|
|
54
|
-
|
|
55
|
-
# Check for minimum content length
|
|
56
|
-
if len(content.strip()) < 100:
|
|
57
|
-
return False, "File content too short, may be incomplete"
|
|
58
|
-
|
|
59
|
-
return True, "Narrative Script validation passed"
|
|
60
|
-
|
|
61
|
-
def validate_master_script(file_path):
|
|
62
|
-
"""Validate the master_script.md file"""
|
|
63
|
-
if not os.path.exists(file_path):
|
|
64
|
-
return False, f"File does not exist: {file_path}"
|
|
65
|
-
|
|
66
|
-
with open(file_path, 'r', encoding='utf-8') as f:
|
|
67
|
-
content = f.read()
|
|
68
|
-
|
|
69
|
-
# Look for the expected format: [NARRATION: "..."] [VISUAL: Description. [Source: URL or MANUAL]]
|
|
70
|
-
narration_pattern = r'\[NARRATION:.*?\]'
|
|
71
|
-
visual_pattern = r'\[VISUAL:.*?\]'
|
|
72
|
-
|
|
73
|
-
narration_matches = re.findall(narration_pattern, content)
|
|
74
|
-
visual_matches = re.findall(visual_pattern, content)
|
|
75
|
-
|
|
76
|
-
if len(narration_matches) == 0:
|
|
77
|
-
return False, "No narration blocks found in expected format [NARRATION: \"...\"]"
|
|
78
|
-
|
|
79
|
-
if len(visual_matches) == 0:
|
|
80
|
-
return False, "No visual blocks found in expected format [VISUAL: ...]"
|
|
81
|
-
|
|
82
|
-
if len(content.strip()) < 100:
|
|
83
|
-
return False, "File content too short, may be incomplete"
|
|
84
|
-
|
|
85
|
-
return True, f"Master Script validation passed ({len(narration_matches)} narration blocks, {len(visual_matches)} visual blocks)"
|
|
86
|
-
|
|
87
|
-
def validate_asset_manifest(file_path):
|
|
88
|
-
"""Validate the asset_manifest.md file"""
|
|
89
|
-
if not os.path.exists(file_path):
|
|
90
|
-
return False, f"File does not exist: {file_path}"
|
|
91
|
-
|
|
92
|
-
with open(file_path, 'r', encoding='utf-8') as f:
|
|
93
|
-
content = f.read()
|
|
94
|
-
|
|
95
|
-
# Look for asset entries (should contain URLs or file references)
|
|
96
|
-
url_pattern = r'https?://[^\s<>"{}|\\^`\[\]]+'
|
|
97
|
-
asset_pattern = r'(\[.*?\])|(\*\*.*?\*\*)' # Markdown links or bold text
|
|
98
|
-
|
|
99
|
-
url_matches = re.findall(url_pattern, content)
|
|
100
|
-
asset_matches = re.findall(asset_pattern, content)
|
|
101
|
-
|
|
102
|
-
if len(url_matches) == 0 and len(asset_matches) == 0:
|
|
103
|
-
return False, "No assets or URLs found in manifest"
|
|
104
|
-
|
|
105
|
-
if len(content.strip()) < 10:
|
|
106
|
-
return False, "File content too short, may be incomplete"
|
|
107
|
-
|
|
108
|
-
return True, f"Asset Manifest validation passed ({len(url_matches)} URLs found)"
|
|
109
|
-
|
|
110
|
-
def validate_project_directory(project_dir):
|
|
111
|
-
"""Validate the entire project directory structure"""
|
|
112
|
-
results = {}
|
|
113
|
-
|
|
114
|
-
# Define expected files
|
|
115
|
-
expected_files = {
|
|
116
|
-
'truth_dossier.md': validate_truth_dossier,
|
|
117
|
-
'narrative_script.md': validate_narrative_script,
|
|
118
|
-
'master_script.md': validate_master_script,
|
|
119
|
-
'asset_manifest.md': validate_asset_manifest
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
for filename, validator in expected_files.items():
|
|
123
|
-
file_path = os.path.join(project_dir, filename)
|
|
124
|
-
is_valid, message = validator(file_path)
|
|
125
|
-
results[filename] = (is_valid, message)
|
|
126
|
-
|
|
127
|
-
return results
|
|
128
|
-
|
|
129
|
-
def main():
|
|
130
|
-
if len(sys.argv) < 2:
|
|
131
|
-
print("Usage: python file_validator.py <project_directory> [specific_file]")
|
|
132
|
-
print("Example: python file_validator.py ./Projects/my_project")
|
|
133
|
-
print("Example: python file_validator.py ./Projects/my_project truth_dossier.md")
|
|
134
|
-
sys.exit(1)
|
|
135
|
-
|
|
136
|
-
project_dir = sys.argv[1]
|
|
137
|
-
specific_file = sys.argv[2] if len(sys.argv) > 2 else None
|
|
138
|
-
|
|
139
|
-
if not os.path.exists(project_dir):
|
|
140
|
-
print(f"❌ Project directory does not exist: {project_dir}")
|
|
141
|
-
sys.exit(1)
|
|
142
|
-
|
|
143
|
-
print(f"🔍 Validating VideoNut project: {project_dir}")
|
|
144
|
-
print("-" * 50)
|
|
145
|
-
|
|
146
|
-
if specific_file:
|
|
147
|
-
# Validate specific file
|
|
148
|
-
validators = {
|
|
149
|
-
'truth_dossier.md': validate_truth_dossier,
|
|
150
|
-
'narrative_script.md': validate_narrative_script,
|
|
151
|
-
'master_script.md': validate_master_script,
|
|
152
|
-
'asset_manifest.md': validate_asset_manifest
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
if specific_file in validators:
|
|
156
|
-
file_path = os.path.join(project_dir, specific_file)
|
|
157
|
-
is_valid, message = validators[specific_file](file_path)
|
|
158
|
-
|
|
159
|
-
status = "✅" if is_valid else "❌"
|
|
160
|
-
print(f"{status} {specific_file}: {message}")
|
|
161
|
-
|
|
162
|
-
if not is_valid:
|
|
163
|
-
sys.exit(1)
|
|
164
|
-
else:
|
|
165
|
-
print(f"❌ Unknown file type: {specific_file}")
|
|
166
|
-
print("Supported files: truth_dossier.md, narrative_script.md, master_script.md, asset_manifest.md")
|
|
167
|
-
sys.exit(1)
|
|
168
|
-
else:
|
|
169
|
-
# Validate entire project
|
|
170
|
-
results = validate_project_directory(project_dir)
|
|
171
|
-
|
|
172
|
-
all_valid = True
|
|
173
|
-
for filename, (is_valid, message) in results.items():
|
|
174
|
-
status = "✅" if is_valid else "❌"
|
|
175
|
-
print(f"{status} {filename}: {message}")
|
|
176
|
-
if not is_valid:
|
|
177
|
-
all_valid = False
|
|
178
|
-
|
|
179
|
-
print("-" * 50)
|
|
180
|
-
if all_valid:
|
|
181
|
-
print("🎉 All files validated successfully!")
|
|
182
|
-
else:
|
|
183
|
-
print("❌ Some files failed validation")
|
|
184
|
-
sys.exit(1)
|
|
185
|
-
|
|
186
|
-
if __name__ == "__main__":
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
VideoNut File Validator
|
|
4
|
+
Validates the integrity and format of files generated by the VideoNut agents
|
|
5
|
+
"""
|
|
6
|
+
import os
|
|
7
|
+
import sys
|
|
8
|
+
import re
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
def validate_truth_dossier(file_path):
|
|
12
|
+
"""Validate the truth_dossier.md file"""
|
|
13
|
+
if not os.path.exists(file_path):
|
|
14
|
+
return False, f"File does not exist: {file_path}"
|
|
15
|
+
|
|
16
|
+
with open(file_path, 'r', encoding='utf-8') as f:
|
|
17
|
+
content = f.read()
|
|
18
|
+
|
|
19
|
+
# Check for essential sections
|
|
20
|
+
required_sections = ['The Investigation Blueprint', 'The Findings', 'The Angle', 'The Conflict']
|
|
21
|
+
missing_sections = []
|
|
22
|
+
|
|
23
|
+
for section in required_sections:
|
|
24
|
+
if f'# {section}' not in content and f'## {section}' not in content:
|
|
25
|
+
missing_sections.append(section)
|
|
26
|
+
|
|
27
|
+
if missing_sections:
|
|
28
|
+
return False, f"Missing required sections: {missing_sections}"
|
|
29
|
+
|
|
30
|
+
# Check for minimum content length
|
|
31
|
+
if len(content.strip()) < 100:
|
|
32
|
+
return False, "File content too short, may be incomplete"
|
|
33
|
+
|
|
34
|
+
return True, "Truth Dossier validation passed"
|
|
35
|
+
|
|
36
|
+
def validate_narrative_script(file_path):
|
|
37
|
+
"""Validate the narrative_script.md file"""
|
|
38
|
+
if not os.path.exists(file_path):
|
|
39
|
+
return False, f"File does not exist: {file_path}"
|
|
40
|
+
|
|
41
|
+
with open(file_path, 'r', encoding='utf-8') as f:
|
|
42
|
+
content = f.read()
|
|
43
|
+
|
|
44
|
+
# Check for essential narrative elements
|
|
45
|
+
required_elements = ['The Hook', 'The Bridge', 'The Meat', 'The Verdict']
|
|
46
|
+
missing_elements = []
|
|
47
|
+
|
|
48
|
+
for element in required_elements:
|
|
49
|
+
if element not in content:
|
|
50
|
+
missing_elements.append(element)
|
|
51
|
+
|
|
52
|
+
if missing_elements:
|
|
53
|
+
return False, f"Missing required narrative elements: {missing_elements}"
|
|
54
|
+
|
|
55
|
+
# Check for minimum content length
|
|
56
|
+
if len(content.strip()) < 100:
|
|
57
|
+
return False, "File content too short, may be incomplete"
|
|
58
|
+
|
|
59
|
+
return True, "Narrative Script validation passed"
|
|
60
|
+
|
|
61
|
+
def validate_master_script(file_path):
|
|
62
|
+
"""Validate the master_script.md file"""
|
|
63
|
+
if not os.path.exists(file_path):
|
|
64
|
+
return False, f"File does not exist: {file_path}"
|
|
65
|
+
|
|
66
|
+
with open(file_path, 'r', encoding='utf-8') as f:
|
|
67
|
+
content = f.read()
|
|
68
|
+
|
|
69
|
+
# Look for the expected format: [NARRATION: "..."] [VISUAL: Description. [Source: URL or MANUAL]]
|
|
70
|
+
narration_pattern = r'\[NARRATION:.*?\]'
|
|
71
|
+
visual_pattern = r'\[VISUAL:.*?\]'
|
|
72
|
+
|
|
73
|
+
narration_matches = re.findall(narration_pattern, content)
|
|
74
|
+
visual_matches = re.findall(visual_pattern, content)
|
|
75
|
+
|
|
76
|
+
if len(narration_matches) == 0:
|
|
77
|
+
return False, "No narration blocks found in expected format [NARRATION: \"...\"]"
|
|
78
|
+
|
|
79
|
+
if len(visual_matches) == 0:
|
|
80
|
+
return False, "No visual blocks found in expected format [VISUAL: ...]"
|
|
81
|
+
|
|
82
|
+
if len(content.strip()) < 100:
|
|
83
|
+
return False, "File content too short, may be incomplete"
|
|
84
|
+
|
|
85
|
+
return True, f"Master Script validation passed ({len(narration_matches)} narration blocks, {len(visual_matches)} visual blocks)"
|
|
86
|
+
|
|
87
|
+
def validate_asset_manifest(file_path):
|
|
88
|
+
"""Validate the asset_manifest.md file"""
|
|
89
|
+
if not os.path.exists(file_path):
|
|
90
|
+
return False, f"File does not exist: {file_path}"
|
|
91
|
+
|
|
92
|
+
with open(file_path, 'r', encoding='utf-8') as f:
|
|
93
|
+
content = f.read()
|
|
94
|
+
|
|
95
|
+
# Look for asset entries (should contain URLs or file references)
|
|
96
|
+
url_pattern = r'https?://[^\s<>"{}|\\^`\[\]]+'
|
|
97
|
+
asset_pattern = r'(\[.*?\])|(\*\*.*?\*\*)' # Markdown links or bold text
|
|
98
|
+
|
|
99
|
+
url_matches = re.findall(url_pattern, content)
|
|
100
|
+
asset_matches = re.findall(asset_pattern, content)
|
|
101
|
+
|
|
102
|
+
if len(url_matches) == 0 and len(asset_matches) == 0:
|
|
103
|
+
return False, "No assets or URLs found in manifest"
|
|
104
|
+
|
|
105
|
+
if len(content.strip()) < 10:
|
|
106
|
+
return False, "File content too short, may be incomplete"
|
|
107
|
+
|
|
108
|
+
return True, f"Asset Manifest validation passed ({len(url_matches)} URLs found)"
|
|
109
|
+
|
|
110
|
+
def validate_project_directory(project_dir):
|
|
111
|
+
"""Validate the entire project directory structure"""
|
|
112
|
+
results = {}
|
|
113
|
+
|
|
114
|
+
# Define expected files
|
|
115
|
+
expected_files = {
|
|
116
|
+
'truth_dossier.md': validate_truth_dossier,
|
|
117
|
+
'narrative_script.md': validate_narrative_script,
|
|
118
|
+
'master_script.md': validate_master_script,
|
|
119
|
+
'asset_manifest.md': validate_asset_manifest
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
for filename, validator in expected_files.items():
|
|
123
|
+
file_path = os.path.join(project_dir, filename)
|
|
124
|
+
is_valid, message = validator(file_path)
|
|
125
|
+
results[filename] = (is_valid, message)
|
|
126
|
+
|
|
127
|
+
return results
|
|
128
|
+
|
|
129
|
+
def main():
|
|
130
|
+
if len(sys.argv) < 2:
|
|
131
|
+
print("Usage: python file_validator.py <project_directory> [specific_file]")
|
|
132
|
+
print("Example: python file_validator.py ./Projects/my_project")
|
|
133
|
+
print("Example: python file_validator.py ./Projects/my_project truth_dossier.md")
|
|
134
|
+
sys.exit(1)
|
|
135
|
+
|
|
136
|
+
project_dir = sys.argv[1]
|
|
137
|
+
specific_file = sys.argv[2] if len(sys.argv) > 2 else None
|
|
138
|
+
|
|
139
|
+
if not os.path.exists(project_dir):
|
|
140
|
+
print(f"❌ Project directory does not exist: {project_dir}")
|
|
141
|
+
sys.exit(1)
|
|
142
|
+
|
|
143
|
+
print(f"🔍 Validating VideoNut project: {project_dir}")
|
|
144
|
+
print("-" * 50)
|
|
145
|
+
|
|
146
|
+
if specific_file:
|
|
147
|
+
# Validate specific file
|
|
148
|
+
validators = {
|
|
149
|
+
'truth_dossier.md': validate_truth_dossier,
|
|
150
|
+
'narrative_script.md': validate_narrative_script,
|
|
151
|
+
'master_script.md': validate_master_script,
|
|
152
|
+
'asset_manifest.md': validate_asset_manifest
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if specific_file in validators:
|
|
156
|
+
file_path = os.path.join(project_dir, specific_file)
|
|
157
|
+
is_valid, message = validators[specific_file](file_path)
|
|
158
|
+
|
|
159
|
+
status = "✅" if is_valid else "❌"
|
|
160
|
+
print(f"{status} {specific_file}: {message}")
|
|
161
|
+
|
|
162
|
+
if not is_valid:
|
|
163
|
+
sys.exit(1)
|
|
164
|
+
else:
|
|
165
|
+
print(f"❌ Unknown file type: {specific_file}")
|
|
166
|
+
print("Supported files: truth_dossier.md, narrative_script.md, master_script.md, asset_manifest.md")
|
|
167
|
+
sys.exit(1)
|
|
168
|
+
else:
|
|
169
|
+
# Validate entire project
|
|
170
|
+
results = validate_project_directory(project_dir)
|
|
171
|
+
|
|
172
|
+
all_valid = True
|
|
173
|
+
for filename, (is_valid, message) in results.items():
|
|
174
|
+
status = "✅" if is_valid else "❌"
|
|
175
|
+
print(f"{status} {filename}: {message}")
|
|
176
|
+
if not is_valid:
|
|
177
|
+
all_valid = False
|
|
178
|
+
|
|
179
|
+
print("-" * 50)
|
|
180
|
+
if all_valid:
|
|
181
|
+
print("🎉 All files validated successfully!")
|
|
182
|
+
else:
|
|
183
|
+
print("❌ Some files failed validation")
|
|
184
|
+
sys.exit(1)
|
|
185
|
+
|
|
186
|
+
if __name__ == "__main__":
|
|
187
187
|
main()
|
|
@@ -1,64 +1,64 @@
|
|
|
1
|
-
# Asset Manifest: The Transformer Paradox
|
|
2
|
-
|
|
3
|
-
**Project:** 2017-TRANS-AI
|
|
4
|
-
**Status:** Pending Download
|
|
5
|
-
**Hunter:** Scavenger
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Visual Assets
|
|
10
|
-
|
|
11
|
-
### Scene 1: The Lab
|
|
12
|
-
* **Asset ID:** V01-PAPER-HEADER
|
|
13
|
-
* **Description:** Header of the paper "Attention Is All You Need".
|
|
14
|
-
* **Search Query:** "Attention Is All You Need paper pdf header 2017"
|
|
15
|
-
* **Type:** Image (Screenshot)
|
|
16
|
-
|
|
17
|
-
* **Asset ID:** V02-GOOGLE-OFFICE-2017
|
|
18
|
-
* **Description:** Google Brain office aesthetic, cluttered desk, code on screen.
|
|
19
|
-
* **Search Query:** "Google Brain office interior 2017 messy desk code monitor stock"
|
|
20
|
-
* **Type:** Stock Image/B-Roll
|
|
21
|
-
|
|
22
|
-
### Scene 2: The Publication
|
|
23
|
-
* **Asset ID:** V03-TWITTER-SCROLL
|
|
24
|
-
* **Description:** Fast scrolling social media feed, tech twitter reaction.
|
|
25
|
-
* **Search Query:** "fast scrolling twitter feed stock video blue light"
|
|
26
|
-
* **Type:** Stock Video
|
|
27
|
-
|
|
28
|
-
### Scene 3: The Boardroom (Google)
|
|
29
|
-
* **Asset ID:** V04-BOARDROOM-TENSION
|
|
30
|
-
* **Description:** Sterile glass meeting room, executives arguing, corporate silhouette.
|
|
31
|
-
* **Search Query:** "corporate boardroom argument glass walls cinematic stock video"
|
|
32
|
-
* **Type:** Stock Video
|
|
33
|
-
|
|
34
|
-
### Scene 4: The Garage (OpenAI)
|
|
35
|
-
* **Asset ID:** V05-OPENAI-EARLY-DAYS
|
|
36
|
-
* **Description:** OpenAI early team working, Ilya Sutskever/Greg Brockman candid, hackathon vibe.
|
|
37
|
-
* **Search Query:** "OpenAI team photo 2016 2017 Ilya Sutskever Greg Brockman coding"
|
|
38
|
-
* **Type:** Image
|
|
39
|
-
|
|
40
|
-
### Scene 5: The Scaling Laws
|
|
41
|
-
* **Asset ID:** V06-SCALING-GRAPH
|
|
42
|
-
* **Description:** Graph from "Scaling Laws for Neural Language Models" (2020).
|
|
43
|
-
* **Search Query:** "OpenAI Scaling Laws for Neural Language Models graph loss vs compute"
|
|
44
|
-
* **Type:** Image
|
|
45
|
-
|
|
46
|
-
* **Asset ID:** V07-RACE-CAR
|
|
47
|
-
* **Description:** Formula 1 car speeding past a slow bus.
|
|
48
|
-
* **Search Query:** "Formula 1 race car overtaking bus stock video"
|
|
49
|
-
* **Type:** Stock Video (Metaphor)
|
|
50
|
-
|
|
51
|
-
### Scene 6: The Empty Chairs (The Authors)
|
|
52
|
-
* **Asset ID:** V08-AUTHORS-COLLAGE
|
|
53
|
-
* **Description:** Photos of the 8 authors: Vaswani, Shazeer, Parmar, Uszkoreit, Jones, Gomez, Kaiser, Polosukhin.
|
|
54
|
-
* **Search Query:** "Attention Is All You Need authors photo collage"
|
|
55
|
-
* **Type:** Image
|
|
56
|
-
|
|
57
|
-
### Scene 7: The Conclusion
|
|
58
|
-
* **Asset ID:** V09-OPENAI-LOGO-SHIFT
|
|
59
|
-
* **Description:** OpenAI logo (Green/White) fading to Black/Closed.
|
|
60
|
-
* **Search Query:** "OpenAI logo animation green to black"
|
|
61
|
-
* **Type:** Motion Graphic/Image
|
|
62
|
-
|
|
63
|
-
---
|
|
64
|
-
*End of Manifest*
|
|
1
|
+
# Asset Manifest: The Transformer Paradox
|
|
2
|
+
|
|
3
|
+
**Project:** 2017-TRANS-AI
|
|
4
|
+
**Status:** Pending Download
|
|
5
|
+
**Hunter:** Scavenger
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Visual Assets
|
|
10
|
+
|
|
11
|
+
### Scene 1: The Lab
|
|
12
|
+
* **Asset ID:** V01-PAPER-HEADER
|
|
13
|
+
* **Description:** Header of the paper "Attention Is All You Need".
|
|
14
|
+
* **Search Query:** "Attention Is All You Need paper pdf header 2017"
|
|
15
|
+
* **Type:** Image (Screenshot)
|
|
16
|
+
|
|
17
|
+
* **Asset ID:** V02-GOOGLE-OFFICE-2017
|
|
18
|
+
* **Description:** Google Brain office aesthetic, cluttered desk, code on screen.
|
|
19
|
+
* **Search Query:** "Google Brain office interior 2017 messy desk code monitor stock"
|
|
20
|
+
* **Type:** Stock Image/B-Roll
|
|
21
|
+
|
|
22
|
+
### Scene 2: The Publication
|
|
23
|
+
* **Asset ID:** V03-TWITTER-SCROLL
|
|
24
|
+
* **Description:** Fast scrolling social media feed, tech twitter reaction.
|
|
25
|
+
* **Search Query:** "fast scrolling twitter feed stock video blue light"
|
|
26
|
+
* **Type:** Stock Video
|
|
27
|
+
|
|
28
|
+
### Scene 3: The Boardroom (Google)
|
|
29
|
+
* **Asset ID:** V04-BOARDROOM-TENSION
|
|
30
|
+
* **Description:** Sterile glass meeting room, executives arguing, corporate silhouette.
|
|
31
|
+
* **Search Query:** "corporate boardroom argument glass walls cinematic stock video"
|
|
32
|
+
* **Type:** Stock Video
|
|
33
|
+
|
|
34
|
+
### Scene 4: The Garage (OpenAI)
|
|
35
|
+
* **Asset ID:** V05-OPENAI-EARLY-DAYS
|
|
36
|
+
* **Description:** OpenAI early team working, Ilya Sutskever/Greg Brockman candid, hackathon vibe.
|
|
37
|
+
* **Search Query:** "OpenAI team photo 2016 2017 Ilya Sutskever Greg Brockman coding"
|
|
38
|
+
* **Type:** Image
|
|
39
|
+
|
|
40
|
+
### Scene 5: The Scaling Laws
|
|
41
|
+
* **Asset ID:** V06-SCALING-GRAPH
|
|
42
|
+
* **Description:** Graph from "Scaling Laws for Neural Language Models" (2020).
|
|
43
|
+
* **Search Query:** "OpenAI Scaling Laws for Neural Language Models graph loss vs compute"
|
|
44
|
+
* **Type:** Image
|
|
45
|
+
|
|
46
|
+
* **Asset ID:** V07-RACE-CAR
|
|
47
|
+
* **Description:** Formula 1 car speeding past a slow bus.
|
|
48
|
+
* **Search Query:** "Formula 1 race car overtaking bus stock video"
|
|
49
|
+
* **Type:** Stock Video (Metaphor)
|
|
50
|
+
|
|
51
|
+
### Scene 6: The Empty Chairs (The Authors)
|
|
52
|
+
* **Asset ID:** V08-AUTHORS-COLLAGE
|
|
53
|
+
* **Description:** Photos of the 8 authors: Vaswani, Shazeer, Parmar, Uszkoreit, Jones, Gomez, Kaiser, Polosukhin.
|
|
54
|
+
* **Search Query:** "Attention Is All You Need authors photo collage"
|
|
55
|
+
* **Type:** Image
|
|
56
|
+
|
|
57
|
+
### Scene 7: The Conclusion
|
|
58
|
+
* **Asset ID:** V09-OPENAI-LOGO-SHIFT
|
|
59
|
+
* **Description:** OpenAI logo (Green/White) fading to Black/Closed.
|
|
60
|
+
* **Search Query:** "OpenAI logo animation green to black"
|
|
61
|
+
* **Type:** Motion Graphic/Image
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
*End of Manifest*
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
# Truth Dossier: The Transformer Paradox
|
|
2
|
-
|
|
3
|
-
## Case File: 2017-TRANS-AI
|
|
4
|
-
**Subject:** How OpenAI Weaponized Google's "Attention Is All You Need"
|
|
5
|
-
**Investigator:** Sherlock
|
|
6
|
-
**Date:** 2025-12-28
|
|
7
|
-
|
|
8
|
-
## 1. The Sweep (Context)
|
|
9
|
-
In 2017, Google Brain researchers released the seminal paper "Attention Is All You Need," introducing the **Transformer** architecture. At the time, it was a breakthrough for machine translation, replacing the sequential processing of RNNs/LSTMs with a parallel "self-attention" mechanism.
|
|
10
|
-
* **The Official Narrative:** Google published this to advance the field of NLP (Natural Language Processing) and improve Google Translate.
|
|
11
|
-
* **The Reality:** They handed the blueprint for AGI (Artificial General Intelligence) to the world on a silver platter.
|
|
12
|
-
|
|
13
|
-
## 2. The Pivot (The Turning Point)
|
|
14
|
-
While Google integrated Transformers into Search (BERT) and research models (T5, Meena), they remained cautious about releasing generative agents due to "reputational risk" and "safety alignment."
|
|
15
|
-
**OpenAI saw what Google missed:** The Transformer wasn't just good for translation; it was the *only* architecture that scaled predictably with compute.
|
|
16
|
-
* **The Shift:** OpenAI abandoned their work on LSTMs (which they had heavily invested in) and went all-in on the Transformer Decoder.
|
|
17
|
-
* **The Bet:** They hypothesized that simply throwing massive data and compute at this specific architecture (GPT - Generative Pre-trained Transformer) would yield emergent reasoning capabilities.
|
|
18
|
-
|
|
19
|
-
## 3. The Deep Dive (The Hidden Agenda)
|
|
20
|
-
Why did the underdog (OpenAI) beat the giant (Google) using the giant's own sword?
|
|
21
|
-
* **The Scaling Laws:** In 2020, OpenAI published "Scaling Laws for Neural Language Models." They cracked the code: Performance depends mostly on scale (parameters, data, compute), not just architectural tweaking. Google knew this but was paralyzed by the Innovator's Dilemma—releasing a chatbot might cannibalize their Search ad revenue.
|
|
22
|
-
* **The Brain Drain:** Of the 8 authors of "Attention Is All You Need," *none* remain at Google. Many founded competitors (Cohere, Character.AI) or joined the ecosystem OpenAI cultivated. OpenAI capitalized on this fragmentation.
|
|
23
|
-
* **Closed vs. Open:** OpenAI started as "Open" but realized the Transformer's value lay in the *weights* and the *data recipe*, closing their doors (GPT-3 onwards) just as they perfected Google's invention.
|
|
24
|
-
|
|
25
|
-
## 4. Conclusion (The Verdict)
|
|
26
|
-
OpenAI didn't "steal" the technology; they **recognized its potential for domination** while Google treated it as an academic curiosity. Google built the engine; OpenAI built the race car and drove it off the lot while Google was still checking the tire pressure.
|
|
27
|
-
|
|
28
|
-
**Motive Uncovered:** OpenAI's usage wasn't just adoption; it was an aggressive strategy to exploit a scalability loophole that Google was too bureaucratic to commercialize.
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
*End of Dossier*
|
|
1
|
+
# Truth Dossier: The Transformer Paradox
|
|
2
|
+
|
|
3
|
+
## Case File: 2017-TRANS-AI
|
|
4
|
+
**Subject:** How OpenAI Weaponized Google's "Attention Is All You Need"
|
|
5
|
+
**Investigator:** Sherlock
|
|
6
|
+
**Date:** 2025-12-28
|
|
7
|
+
|
|
8
|
+
## 1. The Sweep (Context)
|
|
9
|
+
In 2017, Google Brain researchers released the seminal paper "Attention Is All You Need," introducing the **Transformer** architecture. At the time, it was a breakthrough for machine translation, replacing the sequential processing of RNNs/LSTMs with a parallel "self-attention" mechanism.
|
|
10
|
+
* **The Official Narrative:** Google published this to advance the field of NLP (Natural Language Processing) and improve Google Translate.
|
|
11
|
+
* **The Reality:** They handed the blueprint for AGI (Artificial General Intelligence) to the world on a silver platter.
|
|
12
|
+
|
|
13
|
+
## 2. The Pivot (The Turning Point)
|
|
14
|
+
While Google integrated Transformers into Search (BERT) and research models (T5, Meena), they remained cautious about releasing generative agents due to "reputational risk" and "safety alignment."
|
|
15
|
+
**OpenAI saw what Google missed:** The Transformer wasn't just good for translation; it was the *only* architecture that scaled predictably with compute.
|
|
16
|
+
* **The Shift:** OpenAI abandoned their work on LSTMs (which they had heavily invested in) and went all-in on the Transformer Decoder.
|
|
17
|
+
* **The Bet:** They hypothesized that simply throwing massive data and compute at this specific architecture (GPT - Generative Pre-trained Transformer) would yield emergent reasoning capabilities.
|
|
18
|
+
|
|
19
|
+
## 3. The Deep Dive (The Hidden Agenda)
|
|
20
|
+
Why did the underdog (OpenAI) beat the giant (Google) using the giant's own sword?
|
|
21
|
+
* **The Scaling Laws:** In 2020, OpenAI published "Scaling Laws for Neural Language Models." They cracked the code: Performance depends mostly on scale (parameters, data, compute), not just architectural tweaking. Google knew this but was paralyzed by the Innovator's Dilemma—releasing a chatbot might cannibalize their Search ad revenue.
|
|
22
|
+
* **The Brain Drain:** Of the 8 authors of "Attention Is All You Need," *none* remain at Google. Many founded competitors (Cohere, Character.AI) or joined the ecosystem OpenAI cultivated. OpenAI capitalized on this fragmentation.
|
|
23
|
+
* **Closed vs. Open:** OpenAI started as "Open" but realized the Transformer's value lay in the *weights* and the *data recipe*, closing their doors (GPT-3 onwards) just as they perfected Google's invention.
|
|
24
|
+
|
|
25
|
+
## 4. Conclusion (The Verdict)
|
|
26
|
+
OpenAI didn't "steal" the technology; they **recognized its potential for domination** while Google treated it as an academic curiosity. Google built the engine; OpenAI built the race car and drove it off the lot while Google was still checking the tire pressure.
|
|
27
|
+
|
|
28
|
+
**Motive Uncovered:** OpenAI's usage wasn't just adoption; it was an aggressive strategy to exploit a scalability loophole that Google was too bureaucratic to commercialize.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
*End of Dossier*
|