@ericrisco/rsc 0.1.34 → 0.1.35

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 (61) hide show
  1. package/README.md +20 -0
  2. package/manifest.json +1 -1
  3. package/package.json +1 -1
  4. package/skills/agent-eval/SKILL.md +1 -1
  5. package/skills/analyze/SKILL.md +1 -1
  6. package/skills/brand-voice/SKILL.md +1 -1
  7. package/skills/brand-voice/references/voice-guide-template.md +14 -0
  8. package/skills/building-agents/SKILL.md +2 -2
  9. package/skills/competitor-watch/SKILL.md +9 -4
  10. package/skills/competitor-watch/references/tracker-schema.md +19 -0
  11. package/skills/constitution/references/constitution-template.md +10 -0
  12. package/skills/content-engine/SKILL.md +1 -1
  13. package/skills/content-engine/references/brief-and-pipeline.md +15 -1
  14. package/skills/course-builder/references/grounding-and-scoping.md +23 -0
  15. package/skills/course-storytelling/references/learner-grounding.md +22 -2
  16. package/skills/decision-records/SKILL.md +14 -1
  17. package/skills/decision-records/references/templates.md +20 -0
  18. package/skills/design/references/brand-grounding.md +11 -1
  19. package/skills/harness/SKILL.md +3 -3
  20. package/skills/harness/references/daily-curation-automation.md +8 -6
  21. package/skills/harness/references/obsidian-scaffolding.md +16 -9
  22. package/skills/harness/references/wiki-article-template.md +31 -14
  23. package/skills/harness/references/wiki-index-template.md +7 -3
  24. package/skills/harness/references/wiki-protocol.md +120 -54
  25. package/skills/harness/references/wiki-worklog-template.md +5 -1
  26. package/skills/instagram-api/SKILL.md +8 -1
  27. package/skills/instagram-api/references/insights-metrics.md +8 -1
  28. package/skills/knowledge-ops/SKILL.md +9 -9
  29. package/skills/knowledge-ops/evals/cases.yaml +1 -1
  30. package/skills/knowledge-ops/references/gardening-playbook.md +18 -8
  31. package/skills/linkedin-api/SKILL.md +10 -1
  32. package/skills/linkedin-strategy/SKILL.md +12 -0
  33. package/skills/linkedin-strategy/references/wiki-records.md +27 -1
  34. package/skills/marketing/references/brand-grounding.md +22 -2
  35. package/skills/medium-strategy/SKILL.md +12 -0
  36. package/skills/medium-strategy/references/wiki-records.md +39 -1
  37. package/skills/medium-writing/SKILL.md +19 -0
  38. package/skills/plan/references/plan-template.md +12 -1
  39. package/skills/roast-me/tools/adapters/__pycache__/__init__.cpython-312.pyc +0 -0
  40. package/skills/roast-me/tools/adapters/__pycache__/base.cpython-312.pyc +0 -0
  41. package/skills/roast-me/tools/adapters/__pycache__/claude.cpython-312.pyc +0 -0
  42. package/skills/roast-me/tools/adapters/__pycache__/codex.cpython-312.pyc +0 -0
  43. package/skills/roast-me/tools/adapters/__pycache__/gemini.cpython-312.pyc +0 -0
  44. package/skills/roast-me/tools/adapters/__pycache__/registry.cpython-312.pyc +0 -0
  45. package/skills/shortform-packaging/SKILL.md +7 -2
  46. package/skills/shortform-packaging/references/package-templates.md +13 -2
  47. package/skills/shortform-strategy/SKILL.md +30 -6
  48. package/skills/shortform-strategy/references/learning-loop-template.md +9 -1
  49. package/skills/specify/references/spec-template.md +12 -1
  50. package/skills/tiktok-api/SKILL.md +6 -2
  51. package/skills/tiktok-api/references/wiki-schema.md +38 -4
  52. package/skills/verify/SKILL.md +11 -1
  53. package/skills/youtube-api/SKILL.md +7 -2
  54. package/skills/youtube-api/references/wiki-schema.md +25 -4
  55. package/skills/youtube-packaging/SKILL.md +10 -2
  56. package/skills/youtube-packaging/references/description-and-chapters.md +70 -2
  57. package/skills/youtube-strategy/SKILL.md +9 -2
  58. package/skills/youtube-strategy/references/wiki-records.md +39 -6
  59. package/skills/youtube-strategy/scripts/verify.sh +4 -0
  60. package/skills/youtube-thumbnails/SKILL.md +10 -5
  61. package/skills/youtube-thumbnails/references/experiment-log-format.md +28 -2
@@ -91,9 +91,19 @@ If the user can't answer a question, that dimension stays incomplete — note th
91
91
 
92
92
  ### Brand wiki article template
93
93
 
94
- Each `02-DOCS/wiki/brand/*.md` article follows the harness wiki format:
94
+ Each `02-DOCS/wiki/brand/*.md` article follows the harness wiki format. It is an OKF v0.1 article: open it with YAML frontmatter carrying a non-empty `type:` (`brand-study`), then the H1 and body:
95
95
 
96
96
  ```markdown
97
+ ---
98
+ type: brand-study
99
+ title: Brand — Value Proposition
100
+ description: The core benefit and what makes this brand different from the named alternatives.
101
+ tags: [brand, value-proposition]
102
+ timestamp: YYYY-MM-DDTHH:MM:SSZ
103
+ topic: brand
104
+ status: stable
105
+ ---
106
+
97
107
  # Brand — Value Proposition
98
108
 
99
109
  > Sources: {user interview, YYYY-MM-DD}
@@ -124,9 +134,19 @@ One paragraph: the core benefit and what makes it different.
124
134
 
125
135
  ### Voice article specifics
126
136
 
127
- `voice.md` must contain the do/don't word lists and link to every raw sample:
137
+ `voice.md` must contain the do/don't word lists and link to every raw sample (same OKF frontmatter; `type: brand-study`):
128
138
 
129
139
  ```markdown
140
+ ---
141
+ type: brand-study
142
+ title: Brand — Tone & Voice
143
+ description: Tone descriptors, do/don't word lists, and the voice fingerprint extracted from real samples.
144
+ tags: [brand, voice, tone]
145
+ timestamp: YYYY-MM-DDTHH:MM:SSZ
146
+ topic: brand
147
+ status: stable
148
+ ---
149
+
130
150
  # Brand — Tone & Voice
131
151
 
132
152
  > Sources: {user interview, YYYY-MM-DD}
@@ -133,6 +133,16 @@ On a monthly/quarterly review:
133
133
  Every session ends with a dated record under `02-DOCS/wiki/medium/decisions/`. Minimum fields — the bet-on metric is mandatory, because a decision with no metric is an opinion, not a checkable bet:
134
134
 
135
135
  ```markdown
136
+ ---
137
+ type: medium-decision
138
+ title: Solo vs publication for AI-tools series
139
+ description: Stay solo + canonical-import the blog series; pitch one Boost-eligible AI pub with a native original.
140
+ tags: [medium, publications, monetization, distribution]
141
+ timestamp: 2026-06-02T00:00:00Z
142
+ topic: medium
143
+ status: stable
144
+ ---
145
+
136
146
  # 2026-06-02 — Solo vs publication for AI-tools series
137
147
 
138
148
  Decision: Stay solo profile + canonical-import the blog series; pitch one Boost-eligible AI pub with a native original.
@@ -140,6 +150,8 @@ Rationale: 400 followers, no editor nomination path; the blog has evergreen sear
140
150
  Bets on metric: member reading time from external/search referral; 1 Boost nomination this quarter.
141
151
  ```
142
152
 
153
+ `type:` is the required OKF v0.1 field; `timestamp` is ISO 8601. The `Decision:` / `Bets on metric:` lines are domain signals `verify.sh` greps for — keep them.
154
+
143
155
  After a review, append a `what-worked.md` entry tied to specific stories/pubs/tags (e.g. "`AI Coding Tools` long-tail + Boost → 3.2h member reading time"). Full templates, layout, and the verify.sh contract: [`references/wiki-records.md`](references/wiki-records.md). Sanity-check the wiki with `scripts/verify.sh 02-DOCS/wiki/medium/`.
144
156
 
145
157
  ## Anti-patterns
@@ -2,6 +2,8 @@
2
2
 
3
3
  This is the persistence layer that makes medium-strategy compound. Read SKILL.md §1 and §9 first; this file is the exact format.
4
4
 
5
+ Every `.md` file written under `02-DOCS/wiki/medium/` is part of the OKF v0.1 bundle: it carries YAML frontmatter with a non-empty `type:` (the only required OKF field), and any cross-references use **standard markdown links** (`[Text](./pubs.md)`), never wikilinks (`[[...]]`). The domain lines `verify.sh` greps for (the dated heading, `Decision:`, the metric/bet field) stay exactly as shown below.
6
+
5
7
  ## Layout under `02-DOCS/wiki/medium/`
6
8
 
7
9
  ```text
@@ -21,6 +23,16 @@ This is the persistence layer that makes medium-strategy compound. Read SKILL.md
21
23
  Every decision file MUST carry three signals: a **date**, a **Decision:** line, and a **named metric/bet**. The metric is mandatory — a decision with no metric is an opinion, not something you can check next quarter.
22
24
 
23
25
  ```markdown
26
+ ---
27
+ type: medium-decision
28
+ title: Solo vs publication for the AI-tools series
29
+ description: Stay solo; canonical-import the evergreen blog posts; pitch one Boost-eligible AI pub.
30
+ tags: [medium, publications, monetization, distribution]
31
+ timestamp: 2026-06-02T00:00:00Z
32
+ topic: medium
33
+ status: stable
34
+ ---
35
+
24
36
  # 2026-06-02 — Solo vs publication for the AI-tools series
25
37
 
26
38
  Decision: Stay solo profile; canonical-import the 6 evergreen blog posts; pitch one Boost-eligible AI publication with a new native original.
@@ -29,11 +41,23 @@ Bets on metric: member reading time from external + search referral over 90 days
29
41
  Status: open
30
42
  ```
31
43
 
32
- When the bet resolves, append a short outcome to the same file (`Status: won — Boost nomination 2026-07; +2.1h member reading time`) rather than editing the original — append-only history.
44
+ `type:` (required) + `timestamp:` (ISO 8601, last meaningful edit) are the OKF surface; the `Status:` line in the body is the domain bet-lifecycle marker — distinct from the frontmatter `status:` (the OKF article lifecycle: draft | stable | stale). When the bet resolves, append a short outcome to the body (`Status: won — Boost nomination 2026-07; +2.1h member reading time`) rather than editing the original — append-only history. A running `decisions.md` log at the root carries one frontmatter block at the top (`type: medium-decision`).
33
45
 
34
46
  ## what-worked.md entry template
35
47
 
48
+ `what-worked.md` is one running file; new review blocks are prepended newest-first under a single frontmatter block at the top.
49
+
36
50
  ```markdown
51
+ ---
52
+ type: medium-record
53
+ title: What worked — Medium
54
+ description: Running log of outcomes tied to specific Medium stories, publications, and tags.
55
+ tags: [medium, what-worked, member-reading-time, boost]
56
+ timestamp: 2026-09-01T00:00:00Z
57
+ topic: medium
58
+ status: stable
59
+ ---
60
+
37
61
  ## 2026-09-01 — Q3 review
38
62
  - `AI Coding Tools` (long-tail) + Boost → 3.2h member reading time on one story. Double down: keep the long-tail tag, pitch the same pub again.
39
63
  - Imported blog post w/ canonical + newsletter push → +5% external bonus visible, but low member conversion. Keep importing; stop expecting member reads from cold list.
@@ -44,6 +68,20 @@ When the bet resolves, append a short outcome to the same file (`Status: won —
44
68
 
45
69
  Keep these lightweight. `pubs.md`: pub name | status (accepted/pitched/dropped) | niche fit | a one-line guideline note. `tags.md`: tag | popular-or-long-tail | did it pull member reading time?
46
70
 
71
+ Both still carry OKF frontmatter (one block at the top of each file):
72
+
73
+ ```markdown
74
+ ---
75
+ type: medium-record
76
+ title: Publications tracker # or: Tag sets tried
77
+ description: Accepted / pitched / dropped Medium publications and their guideline notes.
78
+ tags: [medium, publications] # or [medium, tags, distribution] for tags.md
79
+ timestamp: 2026-09-01T00:00:00Z
80
+ topic: medium
81
+ status: stable
82
+ ---
83
+ ```
84
+
47
85
  ## The verify.sh contract
48
86
 
49
87
  `scripts/verify.sh` is a **structural lint, not a craft judge.** Run it after a session:
@@ -117,6 +117,25 @@ If `02-DOCS/` exists, learn before you write:
117
117
  - Bias toward the title/subtitle patterns and topics that historically beat a 50% read ratio for *this* author; avoid angles that drew clicks but bounced.
118
118
  - After a notable result, append the learned pattern to `02-DOCS/wiki/medium/read-ratio-patterns.md` so the next draft inherits it.
119
119
 
120
+ `read-ratio-patterns.md` lives in the `02-DOCS/wiki/` OKF v0.1 bundle, so it carries YAML frontmatter with a non-empty `type:` — one block at the top, with new pattern blocks prepended newest-first below it. Use `type: medium-record` (the same type the `medium-strategy` skill writes under `02-DOCS/wiki/medium/`, keeping the two skills' wiki content consistent). Create it with this header if it does not yet exist:
121
+
122
+ ```markdown
123
+ ---
124
+ type: medium-record
125
+ title: Read-ratio patterns — Medium
126
+ description: Title/subtitle/topic patterns that historically beat a 50% read ratio for this author.
127
+ tags: [medium, read-ratio, titles, hooks]
128
+ timestamp: 2026-06-02T00:00:00Z
129
+ topic: medium
130
+ status: stable
131
+ ---
132
+
133
+ ## 2026-06-02 — <pattern learned>
134
+ - <title/subtitle archetype + topic that beat the 50% read ratio, with the number observed>
135
+ ```
136
+
137
+ Cross-references use standard markdown links (`[Text](./what-worked.md)`), never wikilinks (`[[...]]`).
138
+
120
139
  If `02-DOCS/` is absent, proceed from the craft defaults above and say so in one line, rather than inventing stats.
121
140
 
122
141
  ## Anti-patterns
@@ -9,9 +9,20 @@ flows, levels — not framework syntax.
9
9
  ---
10
10
 
11
11
  ```markdown
12
+ ---
13
+ type: plan
14
+ title: Plan — <feature name>
15
+ description: The structure-level implementation plan for <feature> — contracts, shapes, flows.
16
+ tags: [sdd, plan]
17
+ timestamp: YYYY-MM-DDTHH:MM:SSZ
18
+ topic: sdd
19
+ slug: <slug>
20
+ status: draft
21
+ ---
22
+
12
23
  # Plan — <feature name>
13
24
 
14
- > Spec: ../specs/<slug>.md · Constitution: ../constitution.md · Status: draft | approved
25
+ > Spec: [../specs/<slug>.md](../specs/<slug>.md) · Constitution: [../constitution.md](../constitution.md) · Status: draft | approved
15
26
  > Last updated: YYYY-MM-DD
16
27
 
17
28
  ## 0. Global Constraints
@@ -63,8 +63,13 @@ stranger's voice that contradicts what already won.
63
63
  4. **No script or no settled angle? Route OUT** (see Handoffs). Never invent here.
64
64
 
65
65
  Persist the package under `02-DOCS/wiki/shortform/` and raw test results under
66
- `02-DOCS/raw/shortform/`. Pattern depth lives in
67
- [references/package-templates.md](references/package-templates.md).
66
+ `02-DOCS/raw/shortform/`. The `shortform/` wiki tree is an **OKF v0.1 bundle** shared
67
+ with the `tiktok-api` and `shortform-strategy` siblings: each persisted package `.md`
68
+ leads with YAML frontmatter carrying a non-empty `type: shortform-package` (plus the
69
+ recommended `title`/`tags`/`timestamp`), and any cross-references use standard markdown
70
+ links, never `[[wikilinks]]`. The raw feedback log under `02-DOCS/raw/shortform/` is
71
+ `raw/`, not `wiki/` — no frontmatter required. The full frontmatter + pattern depth
72
+ lives in [references/package-templates.md](references/package-templates.md).
68
73
 
69
74
  ## The two-second decision
70
75
 
@@ -6,10 +6,21 @@ filled `02-DOCS` feedback-log schema.
6
6
 
7
7
  ## The package file format
8
8
 
9
- Emit one plain-text/markdown block per short. `scripts/verify.sh` lints exactly these
10
- labels (English or ES/CA, one per line, content following):
9
+ Emit one markdown file per short under `02-DOCS/wiki/shortform/`. The `shortform/`
10
+ wiki tree is an **OKF v0.1 bundle** shared with the `tiktok-api` and
11
+ `shortform-strategy` siblings, so the file leads with YAML frontmatter (a non-empty
12
+ `type` is the only OKF hard requirement; `title`/`tags`/`timestamp` are the recommended
13
+ surface). The labeled body below is unchanged — `scripts/verify.sh` lints exactly these
14
+ labels (English or ES/CA, one per line, content following) and ignores the frontmatter:
11
15
 
12
16
  ```text
17
+ ---
18
+ type: shortform-package
19
+ title: faceless productivity TikTok — package
20
+ tags: [shortform, packaging, tiktok]
21
+ timestamp: 2026-06-02T12:00:00Z
22
+ platform: tiktok
23
+ ---
13
24
  Hook:
14
25
  - I deleted my to-do app. Here's why.
15
26
  - The app that runs my whole week (it's free)
@@ -113,9 +113,21 @@ Every decision must end up in the ledger so next month's call is grounded.
113
113
 
114
114
  ### Decision record format
115
115
 
116
- Append every call to `02-DOCS/wiki/shortform/decisions.md` as a dated block:
116
+ `02-DOCS/wiki/shortform/decisions.md` is an OKF append-log: write the frontmatter
117
+ header once (a non-empty `type` is the only OKF hard requirement; `title`/`tags`/`timestamp`
118
+ are the recommended surface), then **prepend each new dated block newest-first** so the
119
+ latest call is on top. Use ISO 8601 dates; never edit a past block. Bump the header
120
+ `timestamp` on each append. Header + one block:
117
121
 
118
122
  ```markdown
123
+ ---
124
+ type: shortform-decision-log
125
+ title: Shortform strategy decisions
126
+ tags: [shortform, strategy, decisions]
127
+ timestamp: 2026-06-02T10:00:00Z
128
+ ---
129
+ # Shortform strategy decisions
130
+
119
131
  ## 2026-06-02 — Drop daily posting to 4 Reels/week
120
132
  **Decision:** Cut from ~7 thin posts/week to 4 strong Reels/week, fixed Tue/Fri.
121
133
  **Rationale:** Reach fell as volume rose; consistency > velocity past the ceiling.
@@ -140,10 +152,22 @@ Append every call to `02-DOCS/wiki/shortform/decisions.md` as a dated block:
140
152
 
141
153
  ## Persist it
142
154
 
143
- Write the account's brain back so it compounds (mirrors the harness Karpathy-wiki convention):
155
+ Write the account's brain back so it compounds (mirrors the harness Karpathy-wiki convention). The `shortform/` wiki tree is an **OKF v0.1 bundle** shared with the `tiktok-api` and `shortform-packaging` siblings: every `.md` written here carries YAML frontmatter with a non-empty `type`, cross-references are standard markdown links (never `[[wikilinks]]`), and `decisions.md` follows the OKF newest-first append-log rule.
156
+
157
+ - `02-DOCS/wiki/shortform/strategy.md` — positioning, cadence/mix, KPI, length bands, current series. Lead with frontmatter; the body keeps the H1 + sections the linter checks:
158
+
159
+ ```markdown
160
+ ---
161
+ type: shortform-strategy
162
+ title: Shortform account strategy
163
+ tags: [shortform, strategy, positioning, cadence]
164
+ timestamp: 2026-06-02T10:00:00Z
165
+ ---
166
+ # Shortform account strategy
167
+ ...
168
+ ```
144
169
 
145
- - `02-DOCS/wiki/shortform/strategy.md` — positioning, cadence/mix, KPI, length bands, current series.
146
- - `02-DOCS/wiki/shortform/decisions.md` — the dated decision log (format above).
147
- - `02-DOCS/raw/shortform/metrics.csv` — the per-post ledger (schema in `references/learning-loop-template.md`).
170
+ - `02-DOCS/wiki/shortform/decisions.md` — the dated decision log, OKF append-log (`type: shortform-decision-log`, newest block on top; format above).
171
+ - `02-DOCS/raw/shortform/metrics.csv` — the per-post ledger (schema in `references/learning-loop-template.md`). This is `raw/`, not `wiki/` — a CSV, no frontmatter.
148
172
 
149
- Verify a produced strategy doc with `scripts/verify.sh 02-DOCS/wiki/shortform/strategy.md` — a read-only structural lint (positioning, cadence, completion KPI, ride-or-skip rule, ≥1 dated decision, sends/saves logged).
173
+ Verify a produced strategy doc with `scripts/verify.sh 02-DOCS/wiki/shortform/strategy.md` — a read-only structural lint (positioning, cadence, completion KPI, ride-or-skip rule, ≥1 dated decision, sends/saves logged). The lint reads body content, so the added frontmatter does not affect it.
@@ -38,9 +38,17 @@ Run once a month, reading `02-DOCS/raw/shortform/metrics.csv`:
38
38
 
39
39
  ## Decision-record template
40
40
 
41
- Append to `02-DOCS/wiki/shortform/decisions.md`. Every block is dated, rests on a named metric, and carries a revisit date so it is an experiment, not folklore.
41
+ `02-DOCS/wiki/shortform/decisions.md` is an OKF v0.1 append-log: the frontmatter header (a non-empty `type` is the only OKF hard requirement; `title`/`tags`/`timestamp` are recommended) is written once, then each new block is **prepended newest-first** under the H1. Every block is dated (ISO 8601), rests on a named metric, and carries a revisit date so it is an experiment, not folklore. Past blocks are immutable; bump the header `timestamp` on each append.
42
42
 
43
43
  ```markdown
44
+ ---
45
+ type: shortform-decision-log
46
+ title: Shortform strategy decisions
47
+ tags: [shortform, strategy, decisions]
48
+ timestamp: YYYY-MM-DDTHH:MM:SSZ
49
+ ---
50
+ # Shortform strategy decisions
51
+
44
52
  ## YYYY-MM-DD — <short decision title>
45
53
  **Decision:** <what changes, concretely — cadence/positioning/series/trend rule>
46
54
  **Rationale:** <the one-line why>
@@ -6,10 +6,21 @@ endpoint, library, file path, or algorithm. If you can't phrase it without
6
6
  naming the tech, it's a *point to clarify*, not a requirement.
7
7
 
8
8
  ```markdown
9
+ ---
10
+ type: spec
11
+ title: Spec — <Feature name>
12
+ description: WHAT and WHY for <feature> — problem, goals, behaviour, acceptance criteria.
13
+ tags: [sdd, spec]
14
+ timestamp: YYYY-MM-DDTHH:MM:SSZ
15
+ topic: sdd
16
+ slug: <slug>
17
+ status: draft
18
+ ---
19
+
9
20
  # Spec — <Feature name>
10
21
 
11
22
  > Slug: `<slug>` · Status: draft · Created: <YYYY-MM-DD>
12
- > Inherits: 02-DOCS/wiki/sdd/constitution.md
23
+ > Inherits: [constitution](../constitution.md)
13
24
 
14
25
  ## Problem & why
15
26
  <The pain, who feels it, and the cost of leaving it unsolved. One short
@@ -251,10 +251,14 @@ A pull that prints to stdout and vanishes is wasted. **Every pull appends a date
251
251
 
252
252
  Filenames carry the `tiktok-` prefix because the same `shortform/` wiki may also hold Instagram and YouTube pulls — namespacing keeps platforms from colliding.
253
253
 
254
- Per-pull entry template:
254
+ Per-pull entry template. The frontmatter is **OKF v0.1 conformant** — a non-empty `type` is the only hard requirement; `title`/`tags`/`timestamp` are the recommended OKF surface; the domain `date`/`range`/`account`/`platform`/`source` keys the siblings parse are preserved additively (OKF tolerates extra keys). `date` is the reporting day; `timestamp` is the ISO 8601 write moment:
255
255
 
256
256
  ```markdown
257
257
  ---
258
+ type: shortform-metrics
259
+ title: TikTok account snapshot — 2026-06-02
260
+ tags: [tiktok, metrics, snapshot]
261
+ timestamp: 2026-06-02T09:00:00Z
258
262
  date: 2026-06-02
259
263
  range: 2026-05-26..2026-06-01
260
264
  account: <open_id>
@@ -274,7 +278,7 @@ For You 71% · Personal profile 14% · Search 7%
274
278
  completion +3.1pts after the tighter cold-open; FYP share up 5pts.
275
279
  ```
276
280
 
277
- Rule: **append, never overwrite.** The feedback log *is* the value — overwriting yesterday's snapshot destroys the trend the siblings need, and erases the 24–48h settling you only see across pulls. Exact file tree, naming, and how siblings read the log: `references/wiki-schema.md`.
281
+ Rule: **append, never overwrite.** The feedback log *is* the value — overwriting yesterday's snapshot destroys the trend the siblings need, and erases the 24–48h settling you only see across pulls. The per-video log (`videos/tiktok-<id>.md`) is an OKF append-log: write its frontmatter header once, prepend each new dated block newest-first, never edit a past block. `index.md` is the OKF reserved file — no frontmatter, standard markdown links only. Exact file tree, frontmatter, naming, and how siblings read the log: `references/wiki-schema.md`.
278
282
 
279
283
  ## 6. Rate & failure math
280
284
 
@@ -24,8 +24,19 @@ from colliding and lets a sibling grep `tiktok-*` for just this account.
24
24
 
25
25
  ## Account snapshot entry (one file per pull)
26
26
 
27
+ Frontmatter is **OKF v0.1 conformant**: a non-empty `type` is the only hard
28
+ requirement; `title`/`tags`/`timestamp` are the recommended OKF surface. The
29
+ domain keys (`date`, `range`, `account`, `platform`, `source`, `provisional`) are
30
+ preserved verbatim — siblings parse them, and OKF tolerates arbitrary extra keys.
31
+ `date` is the snapshot's reporting day; `timestamp` is the ISO 8601 moment the file
32
+ was written. Keep both.
33
+
27
34
  ```markdown
28
35
  ---
36
+ type: shortform-metrics
37
+ title: TikTok account snapshot — 2026-06-02
38
+ tags: [tiktok, metrics, snapshot]
39
+ timestamp: 2026-06-02T09:00:00Z
29
40
  date: 2026-06-02
30
41
  range: 2026-05-26..2026-06-01
31
42
  account: <open_id>
@@ -50,11 +61,23 @@ completion +3.1pts after the tighter cold-open; FYP share up 5pts.
50
61
 
51
62
  Newest entry on top, so a glance shows the latest. Each pull **prepends** a block —
52
63
  this is where the 24–48h settling becomes visible (the same video's
53
- `full_video_watched_rate` will drift between pulls).
64
+ `full_video_watched_rate` will drift between pulls). This is an OKF append-log:
65
+ the frontmatter header is written once and stays immutable; new dated blocks are
66
+ prepended **above** older ones (newest-first), past blocks are never edited, and
67
+ dates are ISO 8601.
54
68
 
55
69
  ```markdown
70
+ ---
71
+ type: shortform-record
72
+ title: tiktok-7399 — "cold open hook test"
73
+ tags: [tiktok, video-log]
74
+ timestamp: 2026-06-02T09:00:00Z
75
+ video_id: "7399..."
76
+ platform: tiktok
77
+ posted: 2026-05-28
78
+ duration: 21s
79
+ ---
56
80
  # tiktok-7399... — "cold open hook test"
57
- posted: 2026-05-28 | duration: 21s
58
81
 
59
82
  ## 2026-06-02 (final-ish)
60
83
  views 52,140 | completion 28.4% | avg_watched 6.1s | FYP 71%
@@ -63,13 +86,18 @@ views 52,140 | completion 28.4% | avg_watched 6.1s | FYP 71%
63
86
  views 18,900 | completion 24.1% | avg_watched 5.3s | FYP 64%
64
87
  ```
65
88
 
89
+ On each prepend, bump the header `timestamp` to the new pull's ISO moment; never
90
+ edit a past dated block.
91
+
66
92
  ## index.md
67
93
 
68
- A thin pointer, not a data dump:
94
+ A thin pointer, not a data dump. As an OKF **reserved** file it carries **no
95
+ frontmatter**, and its cross-references are standard markdown links (never
96
+ wikilinks), so an OKF consumer can follow them straight to the snapshot files:
69
97
 
70
98
  ```markdown
71
99
  # shortform wiki — index
72
- - tiktok: latest snapshot → tiktok-account-2026-06-02.md
100
+ - tiktok: latest snapshot → [tiktok-account-2026-06-02.md](./tiktok-account-2026-06-02.md)
73
101
  - open questions:
74
102
  - is the cold-open change holding completion above 27%? (watch next 2 pulls)
75
103
  ```
@@ -83,3 +111,9 @@ A thin pointer, not a data dump:
83
111
  - **Namespace by platform.** `tiktok-` prefix on every file so IG/YouTube pulls coexist.
84
112
  - **Numbers only, no interpretation.** "What changed" is a factual delta line, not a
85
113
  recommendation — what to *do* about it belongs to `shortform-strategy`.
114
+ - **OKF v0.1 conformant.** Every snapshot and per-video file carries YAML frontmatter
115
+ with a non-empty `type` (`shortform-metrics` / `shortform-record`) plus the OKF
116
+ `title`/`tags`/`timestamp` surface; domain keys like `date` are kept additively. The
117
+ reserved `index.md` carries no frontmatter. All cross-references are standard markdown
118
+ links — never `[[wikilinks]]` — so the `shortform/` tree is a portable OKF bundle the
119
+ siblings (and any OKF consumer) read without translation.
@@ -113,9 +113,19 @@ A criterion you "reviewed by reading the code" is not verified. Reading is `revi
113
113
 
114
114
  ### 4 — RECORD
115
115
 
116
- Write a dated verification record to `02-DOCS/wiki/sdd/verifications/<slug>-YYYY-MM-DD.md` so the project's living knowledge carries the proof, then index it in `02-DOCS/wiki/index.md` (the Knowledge map; root `CLAUDE.md` keeps only a short pointer) under the `sdd/` topic. Keep it short and factual:
116
+ Write a dated verification record to `02-DOCS/wiki/sdd/verifications/<slug>-YYYY-MM-DD.md` so the project's living knowledge carries the proof, then index it in `02-DOCS/wiki/index.md` (the Knowledge map; root `CLAUDE.md` keeps only a short pointer) under the `sdd/` topic. It is an OKF v0.1 wiki article: open it with YAML frontmatter carrying a non-empty `type:`. Keep it short and factual:
117
117
 
118
118
  ```markdown
119
+ ---
120
+ type: verification
121
+ title: Verification — <slug> — YYYY-MM-DD
122
+ description: Evidence-backed verdict for <slug> — stack gate, task done-checks, acceptance criteria.
123
+ tags: [sdd, verification]
124
+ timestamp: YYYY-MM-DDTHH:MM:SSZ
125
+ topic: sdd
126
+ slug: <slug>
127
+ ---
128
+
119
129
  # Verification — <slug> — YYYY-MM-DD
120
130
 
121
131
  ## Stack gate
@@ -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 |