@ericrisco/rsc 0.1.34 → 0.1.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +28 -2
  2. package/manifest.json +241 -2
  3. package/package.json +1 -1
  4. package/scripts/lib/domains.js +1 -0
  5. package/scripts/lib/recommend.js +4 -0
  6. package/skills/agent-eval/SKILL.md +1 -1
  7. package/skills/analyze/SKILL.md +1 -1
  8. package/skills/brand-voice/SKILL.md +1 -1
  9. package/skills/brand-voice/references/voice-guide-template.md +14 -0
  10. package/skills/building-agents/SKILL.md +2 -2
  11. package/skills/competitor-watch/SKILL.md +9 -4
  12. package/skills/competitor-watch/references/tracker-schema.md +19 -0
  13. package/skills/constitution/references/constitution-template.md +10 -0
  14. package/skills/content-engine/SKILL.md +1 -1
  15. package/skills/content-engine/references/brief-and-pipeline.md +15 -1
  16. package/skills/course-builder/references/grounding-and-scoping.md +23 -0
  17. package/skills/course-storytelling/references/learner-grounding.md +22 -2
  18. package/skills/decision-records/SKILL.md +14 -1
  19. package/skills/decision-records/references/templates.md +20 -0
  20. package/skills/design/references/brand-grounding.md +11 -1
  21. package/skills/game-design/SKILL.md +170 -0
  22. package/skills/game-design/evals/README.md +13 -0
  23. package/skills/game-design/evals/cases.yaml +47 -0
  24. package/skills/game-design/references/mechanics-and-loops.md +78 -0
  25. package/skills/game-design/references/playtesting-and-scope.md +58 -0
  26. package/skills/game-design/references/progression-and-economy.md +70 -0
  27. package/skills/game-storytelling/SKILL.md +159 -0
  28. package/skills/game-storytelling/evals/README.md +28 -0
  29. package/skills/game-storytelling/evals/cases.yaml +51 -0
  30. package/skills/game-storytelling/references/branching-and-state.md +134 -0
  31. package/skills/game-storytelling/references/dialogue-tools.md +117 -0
  32. package/skills/game-storytelling/references/environmental-storytelling.md +71 -0
  33. package/skills/gamedev-multiplayer/SKILL.md +250 -0
  34. package/skills/gamedev-multiplayer/evals/README.md +12 -0
  35. package/skills/gamedev-multiplayer/evals/cases.yaml +44 -0
  36. package/skills/gamedev-multiplayer/references/godot-high-level-multiplayer.md +133 -0
  37. package/skills/gamedev-multiplayer/references/prediction-and-latency.md +104 -0
  38. package/skills/gamedev-multiplayer/references/unity-and-unreal-netcode.md +166 -0
  39. package/skills/gamedev-pathing/SKILL.md +242 -0
  40. package/skills/gamedev-pathing/evals/README.md +14 -0
  41. package/skills/gamedev-pathing/evals/cases.yaml +49 -0
  42. package/skills/gamedev-pathing/references/navmesh-workflow.md +110 -0
  43. package/skills/gamedev-pathing/references/search-algorithms.md +135 -0
  44. package/skills/gamedev-pathing/references/steering-and-avoidance.md +120 -0
  45. package/skills/gamedev-physics/SKILL.md +225 -0
  46. package/skills/gamedev-physics/evals/README.md +12 -0
  47. package/skills/gamedev-physics/evals/cases.yaml +54 -0
  48. package/skills/gamedev-physics/references/character-controllers.md +120 -0
  49. package/skills/gamedev-physics/references/determinism-and-queries.md +124 -0
  50. package/skills/gamedev-physics/references/layers-and-masks.md +115 -0
  51. package/skills/gamedev-shaders/SKILL.md +252 -0
  52. package/skills/gamedev-shaders/evals/README.md +14 -0
  53. package/skills/gamedev-shaders/evals/cases.yaml +45 -0
  54. package/skills/gamedev-shaders/references/effect-recipes.md +205 -0
  55. package/skills/gamedev-shaders/references/godot-shading-language.md +133 -0
  56. package/skills/gamedev-shaders/references/unity-and-unreal-shaders.md +169 -0
  57. package/skills/gamedev-shipping/SKILL.md +236 -0
  58. package/skills/gamedev-shipping/evals/README.md +9 -0
  59. package/skills/gamedev-shipping/evals/cases.yaml +55 -0
  60. package/skills/gamedev-shipping/references/mobile-and-desktop.md +127 -0
  61. package/skills/gamedev-shipping/references/stores-and-ci.md +162 -0
  62. package/skills/gamedev-shipping/references/web-export-headers.md +140 -0
  63. package/skills/godot/SKILL.md +319 -0
  64. package/skills/godot/evals/README.md +13 -0
  65. package/skills/godot/evals/cases.yaml +50 -0
  66. package/skills/godot/references/export-and-testing.md +102 -0
  67. package/skills/godot/references/gdscript-style.md +84 -0
  68. package/skills/godot/references/godot3-to-4-traps.md +89 -0
  69. package/skills/godot/references/nodes-scenes-resources.md +109 -0
  70. package/skills/harness/SKILL.md +3 -3
  71. package/skills/harness/references/daily-curation-automation.md +8 -6
  72. package/skills/harness/references/obsidian-scaffolding.md +16 -9
  73. package/skills/harness/references/wiki-article-template.md +31 -14
  74. package/skills/harness/references/wiki-index-template.md +7 -3
  75. package/skills/harness/references/wiki-protocol.md +120 -54
  76. package/skills/harness/references/wiki-worklog-template.md +5 -1
  77. package/skills/instagram-api/SKILL.md +8 -1
  78. package/skills/instagram-api/references/insights-metrics.md +8 -1
  79. package/skills/knowledge-ops/SKILL.md +9 -9
  80. package/skills/knowledge-ops/evals/cases.yaml +1 -1
  81. package/skills/knowledge-ops/references/gardening-playbook.md +18 -8
  82. package/skills/level-design/SKILL.md +175 -0
  83. package/skills/level-design/evals/README.md +35 -0
  84. package/skills/level-design/evals/cases.yaml +58 -0
  85. package/skills/level-design/references/blockout-to-art.md +118 -0
  86. package/skills/level-design/references/guidance-and-readability.md +152 -0
  87. package/skills/level-design/references/pacing-and-encounters.md +142 -0
  88. package/skills/linkedin-api/SKILL.md +10 -1
  89. package/skills/linkedin-strategy/SKILL.md +12 -0
  90. package/skills/linkedin-strategy/references/wiki-records.md +27 -1
  91. package/skills/marketing/references/brand-grounding.md +22 -2
  92. package/skills/medium-strategy/SKILL.md +12 -0
  93. package/skills/medium-strategy/references/wiki-records.md +39 -1
  94. package/skills/medium-writing/SKILL.md +19 -0
  95. package/skills/plan/references/plan-template.md +12 -1
  96. package/skills/roast-me/tools/adapters/__pycache__/__init__.cpython-312.pyc +0 -0
  97. package/skills/roast-me/tools/adapters/__pycache__/base.cpython-312.pyc +0 -0
  98. package/skills/roast-me/tools/adapters/__pycache__/claude.cpython-312.pyc +0 -0
  99. package/skills/roast-me/tools/adapters/__pycache__/codex.cpython-312.pyc +0 -0
  100. package/skills/roast-me/tools/adapters/__pycache__/gemini.cpython-312.pyc +0 -0
  101. package/skills/roast-me/tools/adapters/__pycache__/registry.cpython-312.pyc +0 -0
  102. package/skills/shortform-packaging/SKILL.md +7 -2
  103. package/skills/shortform-packaging/references/package-templates.md +13 -2
  104. package/skills/shortform-strategy/SKILL.md +30 -6
  105. package/skills/shortform-strategy/references/learning-loop-template.md +9 -1
  106. package/skills/specify/references/spec-template.md +12 -1
  107. package/skills/tiktok-api/SKILL.md +6 -2
  108. package/skills/tiktok-api/references/wiki-schema.md +38 -4
  109. package/skills/unity/SKILL.md +282 -0
  110. package/skills/unity/evals/README.md +8 -0
  111. package/skills/unity/evals/cases.yaml +43 -0
  112. package/skills/unity/references/build-and-platforms.md +65 -0
  113. package/skills/unity/references/input-system.md +102 -0
  114. package/skills/unity/references/lifecycle-deep-dive.md +75 -0
  115. package/skills/unreal/SKILL.md +270 -0
  116. package/skills/unreal/evals/README.md +12 -0
  117. package/skills/unreal/evals/cases.yaml +45 -0
  118. package/skills/unreal/references/blueprint-cpp-parity.md +109 -0
  119. package/skills/unreal/references/gameplay-framework.md +95 -0
  120. package/skills/unreal/references/packaging.md +83 -0
  121. package/skills/verify/SKILL.md +11 -1
  122. package/skills/youtube-api/SKILL.md +7 -2
  123. package/skills/youtube-api/references/wiki-schema.md +25 -4
  124. package/skills/youtube-packaging/SKILL.md +10 -2
  125. package/skills/youtube-packaging/references/description-and-chapters.md +70 -2
  126. package/skills/youtube-strategy/SKILL.md +9 -2
  127. package/skills/youtube-strategy/references/wiki-records.md +39 -6
  128. package/skills/youtube-strategy/scripts/verify.sh +4 -0
  129. package/skills/youtube-thumbnails/SKILL.md +10 -5
  130. package/skills/youtube-thumbnails/references/experiment-log-format.md +28 -2
@@ -215,10 +215,15 @@ A pull that prints to stdout and vanishes is wasted. **Every pull appends a date
215
215
  videos/<VIDEO_ID>.md # per-video running log, newest entry on top
216
216
  ```
217
217
 
218
- Per-pull entry template:
218
+ Per-pull entry template (OKF v0.1: non-empty `type` + the domain keys siblings parse):
219
219
 
220
220
  ```markdown
221
221
  ---
222
+ type: youtube-metrics
223
+ title: Channel snapshot 2026-05-31
224
+ description: Channel KPIs, traffic and retention for 2026-05-01..2026-05-31.
225
+ tags: [youtube, channel-snapshot]
226
+ timestamp: 2026-05-31T00:00:00Z
222
227
  date: 2026-05-31
223
228
  range: 2026-05-01..2026-05-31
224
229
  channel: MINE
@@ -237,7 +242,7 @@ Sharp drop 0.00→0.06 (intro), recovers, second dip ~0.55.
237
242
  avg_view_pct +2.1pts; SUGGESTED share up 6pts after the Ep.13 packaging change.
238
243
  ```
239
244
 
240
- Rule: **append, never overwrite.** The feedback log *is* the value — overwriting yesterday's snapshot destroys the trend the siblings need. Exact file tree, naming, and how siblings read the log: `references/wiki-schema.md`.
245
+ Rule: **append, never overwrite.** The feedback log *is* the value — overwriting yesterday's snapshot destroys the trend the siblings need. `02-DOCS/wiki/` is an OKF v0.1 bundle: keep the domain keys (`date`, `range`, `channel`, `source`) the siblings parse, add `type`/`timestamp` alongside them, use standard markdown links (never `[[wikilinks]]`), and leave the reserved `index.md` frontmatter-free. Exact file tree, naming, per-video log shape, and how siblings read the log: `references/wiki-schema.md`.
241
246
 
242
247
  ## 7. Quota & failure math
243
248
 
@@ -2,6 +2,8 @@
2
2
 
3
3
  The point of this skill is not to print stats once; it is to grow a **feedback log** the strategy/packaging siblings can read. The log lives under `02-DOCS/wiki/youtube/` and every pull **appends** to it.
4
4
 
5
+ `02-DOCS/wiki/` is an **OKF v0.1** bundle, so every non-reserved `.md` file written here carries YAML frontmatter with a non-empty `type`. This skill writes `type: youtube-metrics` on its snapshots/logs and keeps the domain keys (`date`, `range`, `channel`, `source`) that the strategy/packaging siblings parse literally — `type` and `timestamp` are added *alongside* them, never replacing them. OKF allows arbitrary extra keys, so the shared keys stay stable. Links between wiki files are standard markdown links (`[text](./file.md)`), never Obsidian wikilinks.
6
+
5
7
  ## File tree
6
8
 
7
9
  ```text
@@ -24,6 +26,11 @@ Naming:
24
26
 
25
27
  ```markdown
26
28
  ---
29
+ type: youtube-metrics
30
+ title: Channel snapshot 2026-05-31
31
+ description: Channel KPIs and traffic for 2026-05-01..2026-05-31.
32
+ tags: [youtube, channel-snapshot]
33
+ timestamp: 2026-05-31T00:00:00Z
27
34
  date: 2026-05-31
28
35
  range: 2026-05-01..2026-05-31
29
36
  channel: MINE
@@ -40,9 +47,20 @@ BROWSE 44% · SUGGESTED 31% · YT_SEARCH 12%
40
47
  avg_view_pct +2.1pts; SUGGESTED share +6pts after the Ep.13 packaging change.
41
48
  ```
42
49
 
43
- ## Per-video entry template (prepended to `videos/<id>.md`)
50
+ ## Per-video log file — `videos/<VIDEO_ID>.md`
51
+
52
+ The file carries frontmatter once (at the top); each new dated block is **prepended directly under the frontmatter** (newest entry first — this is an append-log, past entries are immutable). On the first write, create the frontmatter; on every later pull, refresh `timestamp` and insert the new block above the previous newest one. Keep the domain key `channel` so siblings can parse it.
44
53
 
45
54
  ```markdown
55
+ ---
56
+ type: youtube-metrics
57
+ title: Video log — dQw4w9WgXcQ
58
+ description: Per-pull KPI/traffic/retention log for video dQw4w9WgXcQ, newest entry first.
59
+ tags: [youtube, video-log]
60
+ timestamp: 2026-05-31T00:00:00Z
61
+ channel: MINE
62
+ source: youtube-analytics-api-v2
63
+ ---
46
64
  ## 2026-05-31 (range 2026-05-01..2026-05-31)
47
65
  views: 8,902 | avg_view_pct: 41.0% | ctr(studio): 6.2%
48
66
  traffic: SUGGESTED 52% · BROWSE 23% · YT_SEARCH 9%
@@ -52,10 +70,12 @@ note: held suggested-traffic share week over week.
52
70
 
53
71
  ## index.md
54
72
 
73
+ OKF **reserved file**: a directory listing, so it carries **no frontmatter**. Point at the latest snapshot and tracked videos with standard markdown links (never wikilinks).
74
+
55
75
  ```markdown
56
76
  # YouTube channel feedback log
57
- latest snapshot: channel-2026-05-31.md
58
- videos tracked: dQw4w9WgXcQ, abc123XYZ
77
+ latest snapshot: [channel-2026-05-31.md](./channel-2026-05-31.md)
78
+ videos tracked: [dQw4w9WgXcQ](./videos/dQw4w9WgXcQ.md), [abc123XYZ](./videos/abc123XYZ.md)
59
79
 
60
80
  ## Open questions for strategy/packaging
61
81
  - Intro drop-off at 0.06 recurs across last 3 uploads — packaging or pacing?
@@ -67,4 +87,5 @@ videos tracked: dQw4w9WgXcQ, abc123XYZ
67
87
  1. **Append, never overwrite.** A snapshot is a point in time; deleting it erases the trend. The history is the deliverable.
68
88
  2. **One source of truth for derived numbers.** Store what the API returned. Mark Studio-sourced values explicitly (`ctr(studio)`) so a reader knows it was not API-derived.
69
89
  3. **No interpretation in the log beyond a one-line "what changed."** Deeper reading ("we should change the hook") is the strategy/packaging sibling's job — this skill records, it does not prescribe.
70
- 4. **Siblings read this tree.** Keep frontmatter keys stable (`date`, `range`, `channel`, `source`) so a sibling can parse the latest snapshot without guessing.
90
+ 4. **Siblings read this tree.** Keep the domain frontmatter keys stable (`date`, `range`, `channel`, `source`) so a sibling can parse the latest snapshot without guessing. The OKF keys (`type`, `title`, `description`, `tags`, `timestamp`) are added alongside them, never instead of them — all four youtube skills share this same key set and the same markdown-link style.
91
+ 5. **OKF-conformant wiki content.** Every non-reserved `.md` here has a non-empty `type` (`youtube-metrics`). `index.md` is the lone reserved file (no frontmatter, a directory listing). Per-video logs are newest-first append-logs with ISO 8601 dates; past dated blocks are never edited. Cross-references use standard markdown links (`[text](./file.md)`), never `[[wikilinks]]`.
@@ -46,7 +46,13 @@ produce generic copy in someone else's voice.
46
46
  hook, the keyword, and the audience all at once.)
47
47
 
48
48
  Persist what you write under `02-DOCS/wiki/youtube/` (the package) and raw test
49
- results under `02-DOCS/raw/youtube/`.
49
+ results under `02-DOCS/raw/youtube/`. `02-DOCS/wiki/` is an **OKF v0.1** bundle:
50
+ every package or log file persisted there carries YAML frontmatter with a
51
+ non-empty `type` (`youtube-package`) plus the OKF surface (`title`, `description`,
52
+ `tags`, `timestamp`) shared with the strategy/thumbnail/api siblings, and all
53
+ cross-references use standard markdown links — never `[[wikilinks]]`. The OKF
54
+ frontmatter shape for the persisted package and log is in
55
+ [references/description-and-chapters.md](references/description-and-chapters.md).
50
56
 
51
57
  ## The title
52
58
 
@@ -158,7 +164,9 @@ carry forward what won as priors: if numeric titles beat curiosity titles 3 test
158
164
  running on this channel, the new set leans numeric. If a hashtag set tanked, drop
159
165
  it.
160
166
 
161
- **Append after you test.** One row per test:
167
+ **Append after you test.** One row per test, into `02-DOCS/wiki/youtube/packaging-log.md`
168
+ (OKF v0.1: file-level `type: youtube-package` frontmatter at the top, the table
169
+ below it, newest rows appended, past rows immutable):
162
170
 
163
171
  ```text
164
172
  | date | video | title set tried | winner | CTR | impressions | avg view duration | note |
@@ -1,8 +1,9 @@
1
1
  # Description, chapters & feedback-log formats
2
2
 
3
- Offloaded depth for [../SKILL.md](../SKILL.md). Three things live here: the full
3
+ Offloaded depth for [../SKILL.md](../SKILL.md). Four things live here: the full
4
4
  description template with a filled example, the chapter format spec with the four
5
- failure cases worked through, and the feedback-log entry schema with a filled row.
5
+ failure cases worked through, the feedback-log entry schema with a filled row, and
6
+ the OKF v0.1 frontmatter shape for the package and log when persisted into the wiki.
6
7
 
7
8
  ## 1. Description template
8
9
 
@@ -110,6 +111,31 @@ should be short and scannable — it doubles as a search jump-to target.
110
111
  One markdown table in `02-DOCS/wiki/youtube/packaging-log.md`. One row per A/B
111
112
  test, appended when Test & Compare resolves (~2 weeks).
112
113
 
114
+ `02-DOCS/wiki/` is an **OKF v0.1** bundle, so `packaging-log.md` carries
115
+ file-level frontmatter once at the top (a non-empty `type` plus the OKF surface
116
+ shared across all four youtube skills), then the table below it. Refresh
117
+ `timestamp` when you append a row; past rows are immutable.
118
+
119
+ ```markdown
120
+ ---
121
+ type: youtube-package
122
+ title: Packaging feedback log
123
+ description: One row per Test & Compare result — title sets tried, winner, and the transferable lesson.
124
+ tags: [youtube, packaging-log, ab-testing]
125
+ timestamp: 2026-05-28T00:00:00Z
126
+ ---
127
+ # Packaging feedback log
128
+
129
+ | date | video | title set tried | winner | CTR | impressions | avg view duration | note |
130
+ |------|-------|-----------------|--------|-----|-------------|-------------------|------|
131
+ ```
132
+
133
+ > Note: this frontmatter is for the **persisted wiki file**. The package *draft*
134
+ > you point `scripts/verify.sh` at uses labeled sections (`Titles:`,
135
+ > `Description:`, …) and stays frontmatter-free so the linter parses it cleanly.
136
+
137
+ Column meanings:
138
+
113
139
  | Column | Meaning |
114
140
  |---|---|
115
141
  | `date` | resolution date of the test (YYYY-MM-DD) |
@@ -133,3 +159,45 @@ The `note` column is the point: it turns one data row into a prior the next
133
159
  package carries forward. Always grade the winner by watched-time-per-impression
134
160
  (reflected in CTR *and* avg view duration together), never CTR alone — a high-CTR /
135
161
  low-duration row is a warning, not a win.
162
+
163
+ ## 4. Persisted package — the wiki file
164
+
165
+ When you persist a finished package under `02-DOCS/wiki/youtube/` (e.g.
166
+ `packages/<video-slug>.md`), wrap it in OKF v0.1 frontmatter — a non-empty `type`
167
+ plus the shared OKF surface — so the wiki bundle stays conformant and the
168
+ strategy/thumbnail siblings can read it. The body holds the human-readable
169
+ package; cross-references use standard markdown links, never `[[wikilinks]]`.
170
+
171
+ ```markdown
172
+ ---
173
+ type: youtube-package
174
+ title: Package — Learn Python in 2026 (beginner tutorial)
175
+ description: Title set, description, tags, hashtags and chapters for the 12-minute beginner Python tutorial.
176
+ tags: [youtube, packaging]
177
+ timestamp: 2026-05-28T00:00:00Z
178
+ ---
179
+ # Package — Learn Python in 2026 (beginner tutorial)
180
+
181
+ ## Titles (A/B set)
182
+ - Learn Python in 2026: 12-Min Beginner Tutorial
183
+ - Python in 12 Minutes (Total Beginner)
184
+ - I Taught a Beginner Python in 12 Min
185
+
186
+ ## Description
187
+ <above-fold line + body + links + hashtag line, per §1>
188
+
189
+ ## Tags
190
+ python, learn python, python tutorial, python for beginners, …
191
+
192
+ ## Hashtags
193
+ #Python #LearnToCode #ProgrammingForBeginners
194
+
195
+ ## Chapters
196
+ 00:00 Intro — what you'll build
197
+ …
198
+ ```
199
+
200
+ > The `scripts/verify.sh` linter runs on the package **draft** (labeled sections,
201
+ > no frontmatter). The persisted wiki file adds the frontmatter above the same
202
+ > body — do not feed the frontmatter'd wiki copy to the linter, since its `tags:`
203
+ > frontmatter key would be read as the Tags section.
@@ -128,14 +128,21 @@ Read CTR (>~6% is healthy for new channels) and AVD/retention from the wiki to c
128
128
  A strategy session that does not write back does not compound — the next session starts from zero. On exit, append a **dated decision record** under `02-DOCS/wiki/youtube/` and, when reviewing, a **what-worked** entry tied to specific videos/playlists. Minimal record inline; full templates in `references/wiki-records.md`:
129
129
 
130
130
  ```markdown
131
+ ---
132
+ type: youtube-strategy-record
133
+ title: Niche down to budget mechanical keyboards for programmers
134
+ description: Reposition from broad tech reviews to budget mechanical keyboards for programmers; hold 2/wk cadence.
135
+ tags: [youtube, strategy-decision, positioning]
136
+ timestamp: 2026-06-02T00:00:00Z
137
+ ---
131
138
  # 2026-06-02 — Niche down to budget mechanical keyboards for programmers
132
- - Context read: flat subs at 40 videos; top 3 by AVD all keyboard reviews (wiki/youtube/what-worked.md)
139
+ - Context read: flat subs at 40 videos; top 3 by AVD all keyboard reviews ([what-worked.md](./what-worked.md))
133
140
  - Decision: reposition from "tech reviews" to "budget mechanical keyboards for programmers"; cadence 2/wk held
134
141
  - Bets on metric: AVD on keyboard videos (currently ~48%) holding while non-keyboard topics are dropped
135
142
  - Review date: 2026-09-02
136
143
  ```
137
144
 
138
- Every record names **the metric it is betting on** and a **review date**. A decision with no metric is an opinion, not a bet you can later check. Run `scripts/verify.sh 02-DOCS/wiki/youtube/` after writing to confirm the records are structurally complete.
145
+ `02-DOCS/wiki/` is an OKF v0.1 bundle: every record carries a non-empty `type` (`youtube-strategy-record`) above the body, and cross-references use standard markdown links (never `[[wikilinks]]`). Every record names **the metric it is betting on** and a **review date**. A decision with no metric is an opinion, not a bet you can later check. Run `scripts/verify.sh 02-DOCS/wiki/youtube/` after writing to confirm the records are structurally complete (date, `Decision:`, metric, and `type`). Full templates in `references/wiki-records.md`.
139
146
 
140
147
  ## Anti-patterns
141
148
 
@@ -2,6 +2,8 @@
2
2
 
3
3
  This is where the channel's strategy memory lives. The skill READs it on entry and WRITEs to it on exit so sessions compound. Keep it append-only.
4
4
 
5
+ `02-DOCS/wiki/` is an **OKF v0.1** bundle, so every `.md` record this skill writes carries YAML frontmatter with a non-empty `type` (`youtube-strategy-record`) plus the OKF surface (`title`, `description`, `tags`, `timestamp`). These are shared, identically, across all four youtube skills. The strategy-specific body fields the loop and `verify.sh` rely on (`Decision:`, `Bets on metric:`, the date) stay in the body exactly as before — the frontmatter is purely additive. All cross-references use standard markdown links (`[text](./file.md)`), never `[[wikilinks]]`.
6
+
5
7
  ## File layout under `02-DOCS/wiki/youtube/`
6
8
 
7
9
  ```text
@@ -28,6 +30,13 @@ mkdir -p 02-DOCS/wiki/youtube/decisions
28
30
  `positioning.md` stub:
29
31
 
30
32
  ```markdown
33
+ ---
34
+ type: youtube-strategy-record
35
+ title: Channel positioning
36
+ description: The channel's current niche, who-it's-for, and three-factor rationale.
37
+ tags: [youtube, positioning]
38
+ timestamp: 2026-06-02T00:00:00Z
39
+ ---
31
40
  # Channel positioning
32
41
  - Niche: <to define — narrow 2-3 levels, not an industry>
33
42
  - Who it's for: <specific viewer>
@@ -37,11 +46,18 @@ mkdir -p 02-DOCS/wiki/youtube/decisions
37
46
 
38
47
  ## Decision-record template
39
48
 
40
- Every decision file carries these fields. The metric line is mandatory — a decision with no metric is an opinion, not a checkable bet.
49
+ Every decision file carries the frontmatter (`type` + OKF surface) **and** these body fields. The metric line is mandatory — a decision with no metric is an opinion, not a checkable bet. The body fields (`Decision:`, `Bets on metric:`, the date) are what `verify.sh` lints, so keep them verbatim; the frontmatter sits above them.
41
50
 
42
51
  ```markdown
52
+ ---
53
+ type: youtube-strategy-record
54
+ title: <one-line decision title>
55
+ description: <one-sentence summary of the decision and what it bets on>
56
+ tags: [youtube, strategy-decision]
57
+ timestamp: <YYYY-MM-DDTHH:MM:SSZ>
58
+ ---
43
59
  # <YYYY-MM-DD> — <one-line decision title>
44
- - Context read: <what the wiki/data said that drove this; cite files>
60
+ - Context read: <what the wiki/data said that drove this; cite files with markdown links>
45
61
  - Decision: <positioning / cadence / series choice, stated concretely>
46
62
  - Bets on metric: <the single metric this decision expects to move, with current value>
47
63
  - Review date: <YYYY-MM-DD — when to check whether the bet paid off>
@@ -50,8 +66,15 @@ Every decision file carries these fields. The metric line is mandatory — a dec
50
66
  Worked example:
51
67
 
52
68
  ```markdown
69
+ ---
70
+ type: youtube-strategy-record
71
+ title: Niche down to budget mechanical keyboards for programmers
72
+ description: Reposition from broad tech reviews to budget mechanical keyboards for programmers, holding 2/wk cadence.
73
+ tags: [youtube, strategy-decision, positioning]
74
+ timestamp: 2026-06-02T00:00:00Z
75
+ ---
53
76
  # 2026-06-02 — Niche down to budget mechanical keyboards for programmers
54
- - Context read: flat subs at 40 videos; top 3 by AVD all keyboard reviews (what-worked.md)
77
+ - Context read: flat subs at 40 videos; top 3 by AVD all keyboard reviews ([what-worked.md](../what-worked.md))
55
78
  - Decision: reposition from "tech reviews" to "budget mechanical keyboards for programmers"; hold cadence 2/wk
56
79
  - Bets on metric: AVD on keyboard videos (~48%) holds while non-keyboard topics are dropped
57
80
  - Review date: 2026-09-02
@@ -59,15 +82,24 @@ Worked example:
59
82
 
60
83
  ## What-worked template
61
84
 
62
- Append one entry per observed win or loss, tied to a real asset so future sessions can pattern-match.
85
+ `what-worked.md` carries the file-level frontmatter once at the top; below it, **append one entry per observed win or loss** (append-only, ISO 8601 dates, past entries immutable), tied to a real asset so future sessions can pattern-match. Refresh `timestamp` when you append.
63
86
 
64
87
  ```markdown
88
+ ---
89
+ type: youtube-strategy-record
90
+ title: What worked — wins and losses log
91
+ description: Running log of channel wins/losses tied to specific videos and playlists.
92
+ tags: [youtube, what-worked]
93
+ timestamp: 2026-05-20T00:00:00Z
94
+ ---
95
+ # What worked
96
+
65
97
  ## <YYYY-MM-DD> — <video or playlist id/title>
66
98
  - Metric: <CTR / AVD / session lift, with the number>
67
99
  - Lesson: <the transferable insight — what to do more or less of>
68
100
  ```
69
101
 
70
- Example:
102
+ Example entry (appended under the frontmatter + heading):
71
103
 
72
104
  ```markdown
73
105
  ## 2026-05-20 — "I Tested 5 Sub-$20 Keyboards" (vid abc123)
@@ -82,5 +114,6 @@ Example:
82
114
  1. The target `02-DOCS/wiki/youtube/` directory exists.
83
115
  2. At least one decision record is present (a `decisions/*.md` file or a `decisions.md` log).
84
116
  3. Each decision record contains the three required signals: a date, a `Decision:` line, and a named metric/bet (a `Bets on metric:` line or equivalent `metric`/`bet` field).
117
+ 4. Each decision record carries a non-empty `type:` frontmatter field (the OKF v0.1 conformance check). A record with no `type` is a hard failure.
85
118
 
86
- A record missing the metric field is a hard failure with a clear message. An empty or missing target reports cleanly and exits 0 — no false failure on a fresh channel.
119
+ A record missing the metric or `type` field is a hard failure with a clear message. An empty or missing target reports cleanly and exits 0 — no false failure on a fresh channel. The `type` check is additive: it does not touch the existing date/`Decision:`/metric checks.
@@ -13,6 +13,8 @@
13
13
  # - a named metric/bet (a "Bets on metric:" / "metric" / "bet" field)
14
14
  # A record missing the metric/bet field is a HARD FAILURE — a decision with
15
15
  # no metric is an opinion, not a checkable bet.
16
+ # 4. Each decision record carries a non-empty `type:` frontmatter field
17
+ # (OKF v0.1 conformance). A record with no `type` is a HARD FAILURE.
16
18
  #
17
19
  # Missing date or Decision line is also a hard failure. A missing/empty target
18
20
  # (a fresh channel with no wiki yet) is reported and exits 0 — no false failure.
@@ -105,6 +107,8 @@ while IFS= read -r rec; do
105
107
  grep -Eq "$DATE_RE" "$rec" || miss="$miss date"
106
108
  grep -Eiq '^[[:space:]-]*Decision:' "$rec" || miss="$miss decision-line"
107
109
  grep -Eiq '(bets on metric:|metric|bet:)' "$rec" || miss="$miss metric/bet"
110
+ # OKF v0.1: a non-empty `type:` frontmatter field is required.
111
+ grep -Eiq '^[[:space:]]*type:[[:space:]]*[^[:space:]]' "$rec" || miss="$miss type"
108
112
 
109
113
  if [ -n "$miss" ]; then
110
114
  fail "$rec: missing required field(s):$miss"
@@ -125,17 +125,22 @@ the video doesn't cash. That is a promise problem, not an image problem.
125
125
  ## The feedback loop (wiki)
126
126
 
127
127
  Every test result goes to the channel wiki. Exact path:
128
- `02-DOCS/wiki/youtube/`.
128
+ `02-DOCS/wiki/youtube/`. `02-DOCS/wiki/` is an **OKF v0.1** bundle: both files
129
+ below carry file-level frontmatter with a non-empty `type` (`thumbnail-experiment`)
130
+ plus the OKF surface (`title`, `description`, `tags`, `timestamp`) shared with the
131
+ api/strategy/packaging siblings, and cross-references use standard markdown links,
132
+ never `[[wikilinks]]`.
129
133
 
130
- **Log file** — `thumbnail-experiments.md`, one row per test:
134
+ **Log file** — `thumbnail-experiments.md`, frontmatter at the top then one row per
135
+ test (append-only, ISO 8601 dates, past rows immutable):
131
136
 
132
137
  ```text
133
138
  | date | video | variants | axis tested | winner | CTR | watch-time share | note |
134
139
  ```
135
140
 
136
- **Derived file** — `thumbnail-patterns.md`, a running table of what wins on THIS
137
- channel (e.g. "faces beat objects 4/5 tests", "no-text wins on tutorials"). You
138
- update this after each logged test.
141
+ **Derived file** — `thumbnail-patterns.md`, frontmatter at the top then a running
142
+ table of what wins on THIS channel (e.g. "faces beat objects 4/5 tests", "no-text
143
+ wins on tutorials"). You update this after each logged test.
139
144
 
140
145
  **Next-concept rule:** the next thumbnail keeps the winning level of every axis
141
146
  already settled by the log, and tests the next unsettled axis. You only re-test a
@@ -3,6 +3,14 @@
3
3
  The wiki layout, schema, filled example, and pattern-mining heuristic for the
4
4
  feedback loop in SKILL.md. Everything lives under `02-DOCS/wiki/youtube/`.
5
5
 
6
+ `02-DOCS/wiki/` is an **OKF v0.1** bundle, so both files below carry file-level
7
+ YAML frontmatter with a non-empty `type` (`thumbnail-experiment`) plus the OKF
8
+ surface (`title`, `description`, `tags`, `timestamp`) — the same shared key set the
9
+ api/strategy/packaging siblings use. The frontmatter sits once at the top of each
10
+ file, above the table. Refresh `timestamp` when you append/rewrite. Any
11
+ cross-reference uses a standard markdown link (`[text](./file.md)`), never an
12
+ Obsidian `[[wikilink]]`.
13
+
6
14
  ## Files
7
15
 
8
16
  - `thumbnail-experiments.md` — append-only log, one row per Test & Compare run.
@@ -11,7 +19,18 @@ feedback loop in SKILL.md. Everything lives under `02-DOCS/wiki/youtube/`.
11
19
 
12
20
  ## `thumbnail-experiments.md` schema
13
21
 
14
- ```text
22
+ File-level frontmatter once at the top, then the append-only table below it:
23
+
24
+ ```markdown
25
+ ---
26
+ type: thumbnail-experiment
27
+ title: Thumbnail experiments log
28
+ description: One row per Test & Compare run — variants, axis tested, winner, and the takeaway.
29
+ tags: [youtube, thumbnails, ab-testing]
30
+ timestamp: 2026-06-01T00:00:00Z
31
+ ---
32
+ # Thumbnail experiments
33
+
15
34
  | date | video | variants | axis tested | winner | CTR | watch-time share | note |
16
35
  ```
17
36
 
@@ -38,7 +57,14 @@ feedback loop in SKILL.md. Everything lives under `02-DOCS/wiki/youtube/`.
38
57
 
39
58
  ## `thumbnail-patterns.md` shape
40
59
 
41
- ```text
60
+ ```markdown
61
+ ---
62
+ type: thumbnail-experiment
63
+ title: What wins on this channel
64
+ description: Derived summary of the settled thumbnail axes and their confidence.
65
+ tags: [youtube, thumbnails, patterns]
66
+ timestamp: 2026-06-01T00:00:00Z
67
+ ---
42
68
  # What wins on this channel
43
69
 
44
70
  | axis | settled winner | evidence | confidence |