@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
@@ -0,0 +1,142 @@
1
+ # Pacing & encounters — rhythm, arenas, and teaching through space
2
+
3
+ A level is a piece of music, not a list of rooms. This reference covers the
4
+ intensity graph, the breather, the difficulty curve, the encounter template, the
5
+ introduce→develop→twist→combine teaching pattern, and arena-shape design.
6
+
7
+ ## The intensity graph
8
+
9
+ Plot intended intensity (danger + cognitive load + stimulus) against time for
10
+ the whole level. The target shape is a **sawtooth trending upward**: a peak
11
+ (combat, chase, platforming gauntlet, tense stealth), a sharp drop to a valley
12
+ (a breather), then a higher peak. Overall the line climbs, ending on the level's
13
+ hardest, most spectacular moment.
14
+
15
+ ```text
16
+ intensity
17
+ ^ ___/\ <- climax (hardest, last)
18
+ | ___/\ ___/\ /
19
+ | __/\ / \ __/\ / \___/
20
+ | __/ \/ \__/ \/ <- breathers (valleys)
21
+ +---------------------------------------------> time
22
+ intro peak rest peak rest build climax
23
+ ```
24
+
25
+ Two failure shapes to avoid:
26
+
27
+ - **Flat-high** — sustained maximum intensity. The player fatigues and the peaks
28
+ stop reading as peaks; it flattens into undifferentiated noise. This is the
29
+ most common "my level is exhausting / boring despite lots of action" cause.
30
+ - **Flat-low** — long stretches with no tension or stimulus. Reads as padding
31
+ and boredom even if each individual moment is competent.
32
+
33
+ Draw this graph *before* building encounters; it tells you where fights go and
34
+ how long the gaps between them should be.
35
+
36
+ ## The breather (safe room)
37
+
38
+ After each peak, a valley: a **safe room** with no threat, low stimulus, and
39
+ usually a save point and/or restock. The breather does three jobs:
40
+
41
+ 1. **Lets adrenaline drop** so the next peak spikes instead of blending in.
42
+ (Halo's cadence is often described as "thirty seconds of fun" on repeat — the
43
+ calm between is what makes the fun read.)
44
+ 2. **Rewards observation** — a quiet room is where lore, a secret, or a vista
45
+ lands, because the player has attention to spare.
46
+ 3. **Sets up the next escalation** — telegraph what's coming (a locked blast
47
+ door, distant sound, a corpse) so the next peak feels earned, not random.
48
+
49
+ Vary breather length with the peak that preceded it: a brutal fight earns a
50
+ longer rest; a light skirmish gets a short beat.
51
+
52
+ ## Difficulty curve within a level
53
+
54
+ The macro trend is up, but it **resets at checkpoints** — the sawtooth again.
55
+ Let the player re-enter a checkpoint competent and confident, then ramp. A curve
56
+ that only climbs with no resets feels punishing; one that never climbs feels
57
+ trivial. Signposting difficulty (a visibly tougher enemy, a bigger arena) lets
58
+ the player brace, which is fairer than a surprise spike.
59
+
60
+ ## Encounter design
61
+
62
+ An **encounter = enemy composition × space × objective × available resources.**
63
+ Change any single factor to create a fresh encounter without new assets:
64
+
65
+ - **Composition** — which enemy types, how many, in what waves.
66
+ - **Space** — the arena shape (below); the same enemies feel new in a new arena.
67
+ - **Objective** — kill all / survive N seconds / reach the exit / protect / hold
68
+ ground / retreat. The objective reshapes how the space is used.
69
+ - **Resources** — ammo, health, cover, high ground the player can seize.
70
+
71
+ ### The encounter template
72
+
73
+ ```text
74
+ ENCOUNTER — <name>
75
+ Teaches / tests ..... which mechanic or threat (and which of I/D/T/C beat)
76
+ Space ............... arena shape, sightline length, cover, flanks, verticality
77
+ Composition ......... enemy types + counts + wave timing
78
+ Objective ........... win condition (kill / survive / reach / hold / escort)
79
+ Resources ........... ammo/health/cover/high-ground and where they sit
80
+ Entry / exit ........ how the player arrives (telegraph) and leaves (release valve)
81
+ Intensity ........... where this sits on the level's graph (peak height)
82
+ ```
83
+
84
+ ## Introduce -> develop -> twist -> combine
85
+
86
+ The four-beat progression that teaches a new element through space, without
87
+ text. (The pattern behind Portal's test chambers, Half-Life 2's set-pieces, and
88
+ much Nintendo level craft.)
89
+
90
+ 1. **Introduce** — meet it where it cannot hurt you. A turret across a safe gap;
91
+ one tile of the new hazard with a wall to watch from. Zero-risk learning.
92
+ 2. **Develop** — use it for real, low stakes. The turret now guards a corridor
93
+ you must cross; the hazard is a gap you must jump.
94
+ 3. **Twist** — recontextualize it. Two turrets flanking; the turret behind glass
95
+ you must lure enemies past; the hazard now moves. The rule you learned bends.
96
+ 4. **Combine** — the mastery test: the new element + everything learned earlier,
97
+ at full intensity, as the section's climax.
98
+
99
+ ### Worked example — a "gravity plate" that flings the player upward
100
+
101
+ - **Introduce**: one plate in a safe room; step on it, get flung to a ledge with
102
+ a reward. No threat. Player learns "plate = launch."
103
+ - **Develop**: cross a pit by chaining two plates — miss and you just fall back,
104
+ retry. Low stakes, real use.
105
+ - **Twist**: a plate launches you *into* a turret's line of fire — now you must
106
+ time the launch, or use the plate to reach the turret's flank.
107
+ - **Combine**: an arena where plates are the only way to reach high cover, under
108
+ fire, while enemies also use them. Everything at once.
109
+
110
+ ## Arena shape — the geometry is the difficulty knob
111
+
112
+ The shape a fight happens in matters as much as the enemies:
113
+
114
+ - **Sightline length ↔ threat range.** Long lanes favor ranged play and
115
+ sniping; tight rooms favor shotguns/melee and force close engagements. Set the
116
+ lane length to the range you want to be dominant.
117
+ - **Cover rhythm.** Space cover so the player *advances in beats* — peek, move,
118
+ peek — rather than turtling in one spot. Low cover (peek over) vs full cover
119
+ (peek around) change the fight's tempo.
120
+ - **Flanks.** Give at least one flank route so a fight isn't a static peek-war;
121
+ a flank forces the player to move and makes the space three-dimensional in
122
+ play, not just in geometry.
123
+ - **Verticality.** High ground is pressure and reward. The Doom (2016) arena
124
+ is the reference: multi-tier, with resources and enemies placed to pull the
125
+ player *through* and *up* the space rather than hunker in a corner.
126
+ - **Chokepoints + release valves.** A choke concentrates danger (good for a
127
+ last stand); always pair it with an exit or a way to break the standoff, or
128
+ the fight stalls into a stalemate.
129
+ - **Entry and exit.** Telegraph the fight before the player commits (see the
130
+ arena from a safe threshold), and give a clear release when it's won.
131
+
132
+ ### Arena patterns
133
+
134
+ | Pattern | Shape | Good for |
135
+ |---|---|---|
136
+ | **Corridor / lane** | Long, narrow, few flanks | Tension, forced pace, ranged duels |
137
+ | **Open arena** | Wide, multi-cover, multi-flank | Skill expression, mobile fights |
138
+ | **Vertical arena** | Stacked tiers, ramps/lifts | High-ground contests, push-forward combat |
139
+ | **Hub** | Central space, spokes off it | Wave defense, "hold ground" objectives |
140
+ | **Pinch** | Wide → choke → wide | Escalation, last-stand beats |
141
+
142
+ Match the pattern to the encounter's job on the intensity graph, not to habit.
@@ -169,6 +169,13 @@ Filename: the post id slug, e.g. `02-DOCS/wiki/linkedin/share-701234567890123456
169
169
 
170
170
  ```markdown
171
171
  ---
172
+ type: linkedin-record
173
+ title: "Share 7012345678901234567 — OAuth pitfalls carousel"
174
+ description: Performance snapshot for one LinkedIn post, pulled from organizationalEntityShareStatistics.
175
+ tags: [linkedin, analytics, post-performance]
176
+ timestamp: "2026-06-02T10:00:00Z"
177
+ topic: linkedin
178
+ status: stable
172
179
  post_urn: "urn:li:share:7012345678901234567"
173
180
  author: "urn:li:organization:12345"
174
181
  captured_at: "2026-06-02T10:00:00Z"
@@ -181,11 +188,13 @@ shares: 8
181
188
  engagement: 0.0683
182
189
  ---
183
190
 
191
+ # Share 7012345678901234567 — OAuth pitfalls carousel
192
+
184
193
  Carousel on OAuth pitfalls. Highest unique-impression post this month;
185
194
  CTR ~4.4%. The "common 403 causes" hook outperformed the plain howto.
186
195
  ```
187
196
 
188
- Keep the front-matter keys exactly as above — `verify.sh` checks that `post_urn`, `captured_at`, `impressions`, and `engagement` are present in every file under that directory.
197
+ `type` is the only required OKF v0.1 field; `title`/`description`/`tags`/`timestamp` are the recommended OKF surface. The DOMAIN keys below them are mandatory and must stay byte-for-byte — `verify.sh` checks that `post_urn`, `captured_at`, `impressions`, and `engagement` are present in every file under that directory. `captured_at` is the API-capture instant (a domain value verify.sh parses); `timestamp` is the OKF last-edit field — keep both. Note these files share `02-DOCS/wiki/linkedin/` with `linkedin-strategy`; using `type: linkedin-record` keeps the two skills' wiki content consistent.
189
198
 
190
199
  ## Anti-patterns
191
200
 
@@ -131,6 +131,16 @@ Engagement rising while cadence held?
131
131
  Append a dated decision record under `02-DOCS/wiki/linkedin/decisions/`. Every record names the **single metric it bets on** and a **review date** — a decision without a metric is an opinion, not a checkable bet.
132
132
 
133
133
  ```markdown
134
+ ---
135
+ type: linkedin-decision
136
+ title: Move distribution to founder profile
137
+ description: Founder profile carries the POV; the company page amplifies; refine to 4 pillars and hold 3/week.
138
+ tags: [linkedin, distribution, positioning, cadence]
139
+ timestamp: 2026-06-02T00:00:00Z
140
+ topic: linkedin
141
+ status: stable
142
+ ---
143
+
134
144
  # 2026-06-02 — Move distribution to founder profile
135
145
 
136
146
  Context read: SSI 48 (flat 90d); top-2 dwell-time posts both carousels on
@@ -144,6 +154,8 @@ Bets on metric: SSI 48 -> 65 within 90 days (proxy for inbound).
144
154
  Review date: 2026-09-02.
145
155
  ```
146
156
 
157
+ The `type:` field is required (OKF v0.1); `timestamp` is ISO 8601. The dated heading and the `Decision:` / `Bets on metric:` / `Review date:` lines are domain signals `verify.sh` greps for — keep them.
158
+
147
159
  After writing, run `scripts/verify.sh 02-DOCS/wiki/linkedin/` to confirm the record is structurally complete. Full templates and the what-worked format: `references/wiki-records.md`.
148
160
 
149
161
  ## Anti-patterns
@@ -2,6 +2,8 @@
2
2
 
3
3
  The read/write loop's storage. Everything is append-only markdown so future strategy sessions compound instead of restarting from generic advice.
4
4
 
5
+ Every `.md` file written here is part of the `02-DOCS/wiki/` OKF v0.1 bundle, so each carries YAML frontmatter with a non-empty `type:` (the only required OKF field). Cross-references between files use **standard markdown links** (`[Text](./pillars.md)`) — never wikilinks (`[[...]]`). The domain lines `verify.sh` greps for (the dated heading, `Decision:`, the metric/bet field) stay exactly as below.
6
+
5
7
  ## File layout
6
8
 
7
9
  ```text
@@ -18,13 +20,23 @@ A running `decisions.md` log at the root is also accepted instead of `decisions/
18
20
 
19
21
  ## Bootstrap (empty/absent dir)
20
22
 
21
- When `02-DOCS/wiki/linkedin/` does not exist, create it with `positioning.md`, `pillars.md`, `decisions/`, and `what-worked.md` before you decide. Seed `positioning.md` with whatever the account already implies (title, current posts) so the first decision has a baseline to react to.
23
+ When `02-DOCS/wiki/linkedin/` does not exist, create it with `positioning.md`, `pillars.md`, `decisions/`, and `what-worked.md` before you decide. Seed `positioning.md` with whatever the account already implies (title, current posts) so the first decision has a baseline to react to. Each of `positioning.md`, `pillars.md`, and `what-worked.md` gets OKF frontmatter — use `type: linkedin-positioning`, `type: linkedin-pillars`, and `type: linkedin-record` respectively (templates below).
22
24
 
23
25
  ## Decision-record template
24
26
 
25
27
  Every record carries: a dated heading, a context-read line (what you grounded in), a decision line, the single metric it bets on, and a review date. Missing the metric or the review date means it is not a checkable bet.
26
28
 
27
29
  ```markdown
30
+ ---
31
+ type: linkedin-decision
32
+ title: <short decision title>
33
+ description: <one-sentence summary of the choice>
34
+ tags: [linkedin, <pillars|cadence|distribution|ssi>]
35
+ timestamp: <YYYY-MM-DDTHH:MM:SSZ>
36
+ topic: linkedin
37
+ status: stable
38
+ ---
39
+
28
40
  # 2026-06-02 — <short decision title>
29
41
 
30
42
  Context read: <what you pulled from the wiki — prior positioning, current pillars,
@@ -39,9 +51,23 @@ SSI 48 -> 65 within 90 days, or median dwell time +X%, or inbound DMs/week>.
39
51
  Review date: <YYYY-MM-DD — when the next session checks whether the bet paid>.
40
52
  ```
41
53
 
54
+ `type` (required) + `timestamp` (ISO 8601, last meaningful edit) are the OKF surface; everything below the frontmatter is the domain content `verify.sh` checks. A running `decisions.md` log at the root carries one frontmatter block at the top (`type: linkedin-decision`); its dated `## ` entries are prepended newest-first and never edited.
55
+
42
56
  ## what-worked template
43
57
 
58
+ `what-worked.md` is a single running file; new review blocks are prepended newest-first under one frontmatter block at the top.
59
+
44
60
  ```markdown
61
+ ---
62
+ type: linkedin-record
63
+ title: What worked — LinkedIn
64
+ description: Running log of which pillars, formats, and posts earned dwell time and SSI movement.
65
+ tags: [linkedin, what-worked, dwell-time, ssi]
66
+ timestamp: 2026-09-02T00:00:00Z
67
+ topic: linkedin
68
+ status: stable
69
+ ---
70
+
45
71
  ## 2026-09-02 review
46
72
 
47
73
  - Pillar "pipeline reliability" — RISING. 2 carousels in top-3 dwell time. Double down.
@@ -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