@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
package/README.md CHANGED
@@ -12,7 +12,7 @@
12
12
  ██ ██ ███████ ███████
13
13
  ```
14
14
 
15
- # `rsc` — 231 agent skills, one CLI, zero bloat
15
+ # `rsc` — 242 agent skills, one CLI, zero bloat
16
16
 
17
17
  **A self-recommending skill catalog for 17 coding assistants** — Claude Code,
18
18
  Codex, GitHub Copilot, Cursor, Gemini, Windsurf, Cline, Antigravity, Zed and more.
@@ -243,7 +243,7 @@ just asks in plain language.
243
243
 
244
244
  ## The catalog
245
245
 
246
- 232 skills, grouped by what you're trying to do. Click any skill to read its
246
+ 243 skills, grouped by what you're trying to do. Click any skill to read its
247
247
  `SKILL.md`. It fires on its own when a task matches.
248
248
 
249
249
  ### 🧭 Core & control plane
@@ -256,6 +256,26 @@ The front door and the workspace brain.
256
256
  > self-improving wiki. It governs software *or* a whole company. **orient** is the
257
257
  > always-on compass that keeps a non-technical human oriented after every step.
258
258
 
259
+ > #### 📦 The `02-DOCS/` brain is now 100% Open Knowledge Format (OKF v0.1) conformant
260
+ >
261
+ > Google Cloud published the [**Open Knowledge Format**](https://github.com/GoogleCloudPlatform/knowledge-catalog/tree/main/okf)
262
+ > — a vendor-neutral standard for portable, agent-readable knowledge — built on the
263
+ > same Karpathy *LLM-wiki* pattern our `02-DOCS/` engine has used from day one. We
264
+ > independently converged on the same design, so adopting the standard cost almost
265
+ > nothing. As of now, **every `02-DOCS/wiki/` is a valid, portable OKF bundle**:
266
+ >
267
+ > - **Markdown + YAML frontmatter**, `type` on every concept doc, OKF-standard
268
+ > fields (`title`, `description`, `resource`, `tags`, `timestamp`).
269
+ > - **Standard markdown links** (not wikilinks) form the knowledge graph — any OKF
270
+ > consumer reads it, *and* it stays a native Obsidian vault (graph, backlinks,
271
+ > Properties, Bases). Same files, no export step.
272
+ > - **Reserved files** honored: `index.md` (no frontmatter) for navigation,
273
+ > `log.md` (newest-first, ISO 8601) for history.
274
+ >
275
+ > Tarball a `wiki/` and any OKF tool — including Google's own viewer — can read it.
276
+ > And the brain now **keeps your repo clean**: a loose file it ingests (a PDF at the
277
+ > root, anything in `inbox/`) is *moved* into `raw/`, never left as clutter.
278
+
259
279
  ### 📐 Spec-Driven Development
260
280
  Take a fuzzy intent to a shipped, verified change — phase by phase. `npx @ericrisco/rsc install --profile core`.
261
281
 
@@ -306,6 +326,12 @@ Each with a `02-DOCS` feedback loop that learns from your own results. `remotion
306
326
 
307
327
  [fastapi](skills/fastapi/) · [nextjs](skills/nextjs/) · [react](skills/react/) · [react-native](skills/react-native/) · [vue-nuxt](skills/vue-nuxt/) · [angular](skills/angular/) · [svelte](skills/svelte/) · [astro](skills/astro/) · [solid-js](skills/solid-js/) · [htmx](skills/htmx/) · [nodejs](skills/nodejs/) · [nestjs](skills/nestjs/) · [django](skills/django/) · [laravel](skills/laravel/) · [rails](skills/rails/) · [spring-boot](skills/spring-boot/) · [phoenix](skills/phoenix/) · [flutter](skills/flutter/) · [swift-ios](skills/swift-ios/) · [kotlin-android](skills/kotlin-android/) · [compose-multiplatform](skills/compose-multiplatform/) · [expo](skills/expo/) · [tauri](skills/tauri/) · [electron](skills/electron/) · [rust](skills/rust/) · [wordpress](skills/wordpress/) · [shopify](skills/shopify/) · [no-code-app](skills/no-code-app/) · [chrome-extension](skills/chrome-extension/) · [api-design](skills/api-design/)
308
328
 
329
+ ### 🎮 Game development
330
+
331
+ Three engines + engine-agnostic disciplines. Every engine skill pins the current version and bans deprecated APIs, so the agent stops emitting stale Godot-3 / legacy-Unity code.
332
+
333
+ [godot](skills/godot/) · [unity](skills/unity/) · [unreal](skills/unreal/) · [game-design](skills/game-design/) · [game-storytelling](skills/game-storytelling/) · [level-design](skills/level-design/) · [gamedev-shaders](skills/gamedev-shaders/) · [gamedev-multiplayer](skills/gamedev-multiplayer/) · [gamedev-physics](skills/gamedev-physics/) · [gamedev-pathing](skills/gamedev-pathing/) · [gamedev-shipping](skills/gamedev-shipping/)
334
+
309
335
  ### 🗄️ Databases & data layer
310
336
 
311
337
  [postgresdb](skills/postgresdb/) · [mysql](skills/mysql/) · [mongodb](skills/mongodb/) · [redis](skills/redis/) · [supabase](skills/supabase/) · [neon](skills/neon/) · [planetscale](skills/planetscale/) · [sqlite-turso](skills/sqlite-turso/) · [prisma-orm](skills/prisma-orm/) · [drizzle-orm](skills/drizzle-orm/) · [firebase](skills/firebase/) · [dynamodb](skills/dynamodb/) · [vector-db](skills/vector-db/) · [clickhouse-analytics](skills/clickhouse-analytics/) · [duckdb](skills/duckdb/) · [db-migrations](skills/db-migrations/) · [backups](skills/backups/)
package/manifest.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
- "version": "0.1.34",
2
+ "version": "0.1.36",
3
3
  "counts": {
4
- "skills": 232
4
+ "skills": 243
5
5
  },
6
6
  "skills": [
7
7
  {
@@ -1737,6 +1737,156 @@
1737
1737
  ],
1738
1738
  "profiles": []
1739
1739
  },
1740
+ {
1741
+ "id": "game-design",
1742
+ "description": "Use when designing or repairing the design of a game — inventing mechanics and systems, shaping the core loop, layering moment-to-moment / session / meta loops, planning progression, economy, currencies and sinks/faucets, tuning difficulty curves and balance, killing dominant strategies, adding 'juice'/game feel as design intent, prototyping and playtesting, or controlling scope, and especially when the ask is 'why isn't my game fun'. Triggers: 'design the core loop', 'my game isn't fun / doesn't hook', 'balance the economy', 'the difficulty curve feels off', 'players found a dominant strategy', 'how do I scope this', 'reward / progression loop', 'diseñar la mecánica', 'el juego no engancha', 'com equilibro l'economia'. NOT writing engine code, scripts or shaders (route to godot/unity/unreal), NOT narrative, dialogue or story beats (route to game-storytelling), NOT level layout or encounter placement (route to level-design).",
1743
+ "tags": [
1744
+ "game-design",
1745
+ "mechanics",
1746
+ "core-loop",
1747
+ "balancing",
1748
+ "progression",
1749
+ "playtesting",
1750
+ "scope",
1751
+ "fun"
1752
+ ],
1753
+ "recommends": [
1754
+ "level-design",
1755
+ "game-storytelling",
1756
+ "godot",
1757
+ "unity",
1758
+ "unreal"
1759
+ ],
1760
+ "profiles": [
1761
+ "full"
1762
+ ]
1763
+ },
1764
+ {
1765
+ "id": "game-storytelling",
1766
+ "description": "Use when designing a game's STORY as an interactive system: premise, theme and narrative pillars; branching narrative and meaningful choice; dialogue trees with state and flags; quests, objectives and fail states; worldbuilding; environmental and systemic storytelling; and keeping story in harmony with play (avoiding ludonarrative dissonance). Engine-agnostic — it designs the narrative graph, variables and beats, then hands the wiring to the engine skill. Triggers: 'write my game's story/premise', 'branching narrative', 'dialogue system/tree', 'quest structure', 'worldbuilding', 'meaningful choices', 'illusion of choice', 'Ink/Yarn Spinner/Twine/articy narrative', 'story keeps fighting the gameplay'. NOT core mechanics, systems or balance (that's game-design); NOT spatial/level layout or encounter placement (that's level-design); NOT the actual dialogue-node code, save format or plugin wiring inside an engine (that's godot/unity/unreal).",
1767
+ "tags": [
1768
+ "game",
1769
+ "narrative",
1770
+ "story",
1771
+ "dialogue",
1772
+ "quest",
1773
+ "branching",
1774
+ "worldbuilding"
1775
+ ],
1776
+ "recommends": [
1777
+ "game-design",
1778
+ "level-design"
1779
+ ],
1780
+ "profiles": [
1781
+ "full"
1782
+ ]
1783
+ },
1784
+ {
1785
+ "id": "gamedev-multiplayer",
1786
+ "description": "Use when adding multiplayer, netcode, or replication to a game — syncing players/state across a network, online co-op or PvP, client-server vs peer-to-peer, server-authoritative design, client-side prediction + server reconciliation, snapshot interpolation, lag compensation, tick/netrate, and per-engine wiring: Godot 4.x MultiplayerSpawner/MultiplayerSynchronizer/@rpc/ENetMultiplayerPeer/set_multiplayer_authority, Unity Netcode for GameObjects (NetworkObject/NetworkBehaviour/NetworkVariable/[Rpc]/ServerRpc/ClientRpc), Unreal Actor replication (Replicated/ReplicatedUsing, Server/Client/NetMulticast RPCs, relevancy). Triggers: 'how do I sync players', 'client and server desync', 'players rubber-band or teleport', 'who has authority', 'laggy movement', 'cheater set their own health'. NOT single-player gameplay, AI, or input (route to engine skill godot/unity/unreal), and NOT matchmaking, dedicated-server hosting, or backend infra (route to deployment).",
1787
+ "tags": [
1788
+ "multiplayer",
1789
+ "netcode",
1790
+ "replication",
1791
+ "networking",
1792
+ "prediction",
1793
+ "authority"
1794
+ ],
1795
+ "recommends": [
1796
+ "godot",
1797
+ "unity",
1798
+ "unreal",
1799
+ "gamedev-physics"
1800
+ ],
1801
+ "profiles": [
1802
+ "full"
1803
+ ]
1804
+ },
1805
+ {
1806
+ "id": "gamedev-pathing",
1807
+ "description": "Use when implementing AI navigation or pathfinding in a game - moving enemies/NPCs/units toward goals, \\\"how do enemies navigate the level\\\", A*/Dijkstra/JPS/HPA* search, choosing grid vs waypoint-graph vs navmesh, baking a navmesh and tuning agent radius/height, off-mesh/nav links, dynamic obstacles and re-baking, steering (seek/flee/arrive/pursue/wander/path-following/flocking), local avoidance (RVO/ORCA, crowds), and flow fields for many agents to one goal. Per-engine: Godot 4.x (NavigationServer2D/3D, NavigationRegion, NavigationAgent, get_next_path_position), Unity (NavMeshAgent + NavMeshObstacle + AI Navigation baking), Unreal (RecastNavMesh + AIController + Behavior Trees/EQS). Triggers: \\\"my enemies get stuck\\\", \\\"units clump together\\\", \\\"navmesh not updating\\\", \\\"agentes se atascan\\\". NOT physics/rigidbody collision response or character-controller tuning (gamedev-physics), and NOT high-level enemy AI behaviour design like aggro/states/difficulty (game-design).",
1808
+ "tags": [
1809
+ "pathfinding",
1810
+ "navmesh",
1811
+ "navigation",
1812
+ "steering",
1813
+ "a-star"
1814
+ ],
1815
+ "recommends": [
1816
+ "godot",
1817
+ "unity",
1818
+ "unreal",
1819
+ "gamedev-physics"
1820
+ ],
1821
+ "profiles": [
1822
+ "full"
1823
+ ]
1824
+ },
1825
+ {
1826
+ "id": "gamedev-physics",
1827
+ "description": "Use when working with a game engine's physics — rigid bodies, colliders, collision layers/masks, character controllers, joints, forces vs impulses, raycasts/shapecasts, or when physics is unstable. Triggers: \\\"my character falls through the floor\\\", \\\"bullet tunnels through walls at high speed\\\", \\\"rigidbody jitters / vibrates / explodes\\\", \\\"objects that should collide pass through each other\\\", \\\"which collision layer and mask do I set\\\", \\\"kinematic vs dynamic body\\\", \\\"move_and_slide / CharacterBody\\\", \\\"AddForce vs impulse vs setting velocity\\\", \\\"physics in FixedUpdate or _physics_process\\\", \\\"slope and step detection\\\", \\\"trigger / Area overlap not firing\\\", Godot RigidBody/StaticBody/CharacterBody/Area, Unity Rigidbody/Collider/CharacterController, Unreal Chaos/collision presets. NOT rendering, materials, or visual jitter from shaders (use gamedev-shaders); NOT AI navigation, pathfinding, or navmesh (use gamedev-pathing).",
1828
+ "tags": [
1829
+ "physics",
1830
+ "collision",
1831
+ "rigidbody",
1832
+ "character-controller",
1833
+ "colliders"
1834
+ ],
1835
+ "recommends": [
1836
+ "godot",
1837
+ "unity",
1838
+ "unreal",
1839
+ "gamedev-pathing"
1840
+ ],
1841
+ "profiles": [
1842
+ "full"
1843
+ ]
1844
+ },
1845
+ {
1846
+ "id": "gamedev-shaders",
1847
+ "description": "Use when writing shaders, materials, VFX, or post-processing for a game engine, or asking \\\"how do I make this effect\\\" — covers the vertex→fragment pipeline, UVs / normals / coordinate spaces, and per-engine authoring in Godot 4.x (shader_type spatial/canvas_item/particles, source_color, hint_screen_texture, ShaderMaterial), Unity 6 (Shader Graph vs HLSL, URP/HDRP, ShaderLab), and Unreal 5.x (Material graph, material domains, Custom HLSL node). Includes recipes for dissolve, rim/outline, toon/cel, water/flow, force field, hologram; full-screen post-process; and shader performance (overdraw, texture-sample cost, branching, mobile). Triggers: \\\"write a dissolve shader\\\", \\\"rim light\\\", \\\"toon shading\\\", \\\"screen-space effect\\\", \\\"my shader is slow on mobile\\\", \\\"cómo hago un shader de agua\\\". NOT gameplay or engine-API code (→ godot / unity / unreal) and NOT physics simulation, collision, or rigid bodies (→ gamedev-physics).",
1848
+ "tags": [
1849
+ "shaders",
1850
+ "vfx",
1851
+ "materials",
1852
+ "post-processing",
1853
+ "shadergraph"
1854
+ ],
1855
+ "recommends": [
1856
+ "godot",
1857
+ "unity",
1858
+ "unreal",
1859
+ "gamedev-shipping"
1860
+ ],
1861
+ "profiles": [
1862
+ "full"
1863
+ ]
1864
+ },
1865
+ {
1866
+ "id": "gamedev-shipping",
1867
+ "description": "Use when exporting, building, packaging, or publishing a game — per engine (Godot export templates, Unity Build Profiles, Unreal Shipping vs Development) and per platform: desktop (Windows/macOS/Linux; macOS codesign + notarytool notarization), web (the COOP same-origin + COEP require-corp headers threaded SharedArrayBuffer WebAssembly builds need, and that Godot's C#/.NET edition can't export to web), mobile (Android JDK 17 build template, AAB vs APK, release keystore; iOS provisioning). Also store prep (icons/splash, metadata, age ratings, AAB for Play, Mac App Store, Steamworks/SteamPipe, itch.io butler), headless-export CI/CD, build/version numbers, and ship-time size/startup optimization. Triggers: 'export my game', 'build for Steam', 'ship to web/mobile', 'publish to the Play Store', 'notarize my Mac build', 'itch.io upload', 'SharedArrayBuffer is not defined'. NOT for writing gameplay/runtime code (that's the engine skill — godot/unity/unreal) or hosting a normal web app/API/container (→ deployment).",
1868
+ "tags": [
1869
+ "export",
1870
+ "build",
1871
+ "release",
1872
+ "packaging",
1873
+ "store",
1874
+ "steam",
1875
+ "itch",
1876
+ "notarization",
1877
+ "webassembly",
1878
+ "aab"
1879
+ ],
1880
+ "recommends": [
1881
+ "godot",
1882
+ "unity",
1883
+ "unreal",
1884
+ "deployment"
1885
+ ],
1886
+ "profiles": [
1887
+ "full"
1888
+ ]
1889
+ },
1740
1890
  {
1741
1891
  "id": "gcp-essentials",
1742
1892
  "description": "Use when running a small product on the core of Google Cloud with the gcloud CLI: creating a project, deploying a container to Cloud Run, standing up a Cloud Storage bucket, a managed Cloud SQL Postgres/MySQL, and wiring them together with least-privilege IAM. Triggers: 'deploy to Cloud Run', 'gcloud run deploy', 'set up a GCP project', 'crear bucket en GCP', 'desplegar a Cloud Run', 'service account sin claves JSON', 'why is my Cloud Run running as the default service account', 'connect Cloud Run to Cloud SQL', 'turn off the bucket public access'. NOT AWS (that is aws-essentials).",
@@ -1845,6 +1995,29 @@
1845
1995
  ],
1846
1996
  "profiles": []
1847
1997
  },
1998
+ {
1999
+ "id": "godot",
2000
+ "description": "Use when writing, reviewing, or debugging Godot 4.x games in GDScript (typed) or C# — nodes/scenes/custom Resources, autoload singletons and an EventBus, signals via Callable, @onready/@export/@tool, static typing, CharacterBody2D/3D + velocity + move_and_slide(), _process vs _physics_process, .tscn/.tres text formats, and headless GUT/gdUnit4 tests. Enforces Godot 4 APIs and rejects Godot 3 leftovers: yield→await, onready→@onready, .instance()→.instantiate(), KinematicBody→CharacterBody, Spatial→Node3D, string connect(\\\"sig\\\",obj,\\\"m\\\")→Callable. Triggers: 'write a Godot player controller', 'my move_and_slide does nothing', 'port this Godot 3 script to 4', 'connect a signal in Godot', 'GDScript won't type-check', 'CharacterBody2D won't move', 'add an autoload', 'escribe un script de Godot', 'por qué no se mueve mi personaje'. NOT Unity MonoBehaviour or Unreal (route to unity/unreal); NOT pure C++/CMake tooling unrelated to GDExtension (that is cpp); NOT shader code in .gdshader (that is gamedev-shaders).",
2001
+ "tags": [
2002
+ "godot",
2003
+ "gdscript",
2004
+ "game-dev",
2005
+ "csharp",
2006
+ "godot4"
2007
+ ],
2008
+ "recommends": [
2009
+ "gamedev-shaders",
2010
+ "gamedev-multiplayer",
2011
+ "gamedev-physics",
2012
+ "gamedev-pathing",
2013
+ "gamedev-shipping",
2014
+ "game-design",
2015
+ "cpp"
2016
+ ],
2017
+ "profiles": [
2018
+ "full"
2019
+ ]
2020
+ },
1848
2021
  {
1849
2022
  "id": "google-workspace",
1850
2023
  "description": "Use when building server-side automation that reads or writes Gmail, Drive, Calendar, or Sheets against a real Google Workspace account via the official client libraries and a GCP service account — picking the auth mode, scoping OAuth scopes, building the authed client, and debugging 403/429/unauthorized_client errors. Triggers: 'send mail from a service account in a cron', 'unauthorized_client when impersonating a user', 'which Drive scope to upload to a shared drive', 'set up domain-wide delegation client ID', 'getting 403 insufficient permissions from the Sheets API', 'automatizar Gmail con cuenta de servicio sin login del usuario', 'enviar correos desde un script sense login d'usuari'. NOT generic SMTP/marketing/deliverability email (that is email-connector).",
@@ -2289,6 +2462,26 @@
2289
2462
  ],
2290
2463
  "profiles": []
2291
2464
  },
2465
+ {
2466
+ "id": "level-design",
2467
+ "description": "Use when designing a game level, map, arena, or encounter — laying out a blockout/greybox, fixing pacing that drags or spikes, guiding players without hand-holding, placing secrets and rewards, or diagnosing a level that plays as boring, confusing, or where players get lost or stuck. Engine-agnostic craft: the blockout->greybox->playtest->art pipeline, sightlines and landmarks, tension/release rhythm, the introduce->develop->twist->combine encounter progression, readability via light/color/composition, and traversal heatmaps. Triggers: 'design this level', 'my level is boring/confusing', 'players keep getting lost', 'how do I pace this', 'blockout', 'greybox', 'encounter design', 'where do I put the secret'. NOT systemic mechanics or economy tuning (that's game-design), NOT narrative or story beats (that's game-storytelling), and NOT engine-specific level tooling — nav meshes, occlusion, tilemap editors, lightmap baking (that's the godot/unity/unreal skill).",
2468
+ "tags": [
2469
+ "level-design",
2470
+ "blockout",
2471
+ "pacing",
2472
+ "encounter",
2473
+ "playtest"
2474
+ ],
2475
+ "recommends": [
2476
+ "game-design",
2477
+ "godot",
2478
+ "unity",
2479
+ "unreal"
2480
+ ],
2481
+ "profiles": [
2482
+ "full"
2483
+ ]
2484
+ },
2292
2485
  {
2293
2486
  "id": "linkedin-api",
2294
2487
  "description": "Use when wiring an app to LinkedIn's organic Posts / Community Management API — completing 3-legged OAuth, publishing text/article/document posts to a member profile or company page, or pulling impressions/engagement/follower stats and logging them as a durable feedback record. Triggers: 'connect our app to the LinkedIn Posts API', 'publish to our company page programmatically', 'pull last month's impressions for our org posts', 'my /v2/ugcPosts call returns 403', 'unauthorized scope w_organization_social at consent', 'log post performance into the wiki', 'publica a la pàgina de LinkedIn per API', 'conectar la API de LinkedIn y traer las impresiones'. NOT writing the post copy (that is linkedin-content), planning cadence (that is linkedin-strategy), or DM sequences (that is linkedin-outreach).",
@@ -4474,6 +4667,52 @@
4474
4667
  ],
4475
4668
  "profiles": []
4476
4669
  },
4670
+ {
4671
+ "id": "unity",
4672
+ "description": "Use when writing, reviewing, or structuring Unity game code in C# for current Unity 6 LTS (6000.x) — GameObjects and Transform hierarchy, MonoBehaviour lifecycle, prefabs and prefab variants, ScriptableObjects for data, scenes and additive loading, the new Input System, coroutines vs async/await/Awaitable, Addressables, and build/player settings for 2D and 3D. Triggers: 'my Unity script', 'Awake vs Start', 'why is my physics jittery', MonoBehaviour .cs files, 'set up the new Input System', 'ScriptableObject config', 'load a scene additively', 'Instantiate a prefab', 'convert Input.GetAxis to the new system', 'build for Android/WebGL', 'por qué no se llama mi Start', 'com carrego una escena en additiu'. NOT Godot/GDScript (that is godot); NOT Unreal/Blueprint/C++ engine work (that is unreal); NOT the netcode wire protocol itself (that is gamedev-multiplayer).",
4673
+ "tags": [
4674
+ "unity",
4675
+ "csharp",
4676
+ "game-dev",
4677
+ "monobehaviour",
4678
+ "input-system"
4679
+ ],
4680
+ "recommends": [
4681
+ "gamedev-multiplayer",
4682
+ "gamedev-physics",
4683
+ "gamedev-shaders",
4684
+ "gamedev-pathing",
4685
+ "gamedev-shipping",
4686
+ "godot",
4687
+ "unreal"
4688
+ ],
4689
+ "profiles": [
4690
+ "full"
4691
+ ]
4692
+ },
4693
+ {
4694
+ "id": "unreal",
4695
+ "description": "Use when building, scripting, or debugging a game in Unreal Engine 5 (UE5) with Blueprint and/or C++ — gameplay framework (Actor/Pawn/Character/GameMode/PlayerController), Actor lifecycle and tick, UPROPERTY/UFUNCTION/UCLASS reflection and garbage collection, Enhanced Input, dynamic multicast delegates, UMG widgets, Paper2D sprites/flipbooks, and Blueprint↔C++ parity (exposing C++ to Blueprint, calling Blueprint from C++). Triggers: \\\"UE5\\\", \\\"Unreal\\\", \\\"Blueprint\\\", \\\"make a Character in C++\\\", \\\"expose this to Blueprint\\\", \\\"BlueprintCallable\\\", \\\"why is my UObject garbage collected\\\", \\\"Enhanced Input mapping context\\\", \\\"UMG widget\\\", \\\"Paper2D flipbook\\\", \\\".uproject\\\", \\\"GameMode vs GameState\\\". NOT for Godot (→ godot), NOT for Unity/C#/MonoBehaviour (→ unity), NOT for language-only C++ memory/RAII questions with no Unreal types (→ cpp).",
4696
+ "tags": [
4697
+ "unreal",
4698
+ "ue5",
4699
+ "blueprint",
4700
+ "unreal-engine",
4701
+ "gamedev"
4702
+ ],
4703
+ "recommends": [
4704
+ "cpp",
4705
+ "gamedev-shipping",
4706
+ "gamedev-multiplayer",
4707
+ "game-design",
4708
+ "gamedev-physics",
4709
+ "godot",
4710
+ "unity"
4711
+ ],
4712
+ "profiles": [
4713
+ "full"
4714
+ ]
4715
+ },
4477
4716
  {
4478
4717
  "id": "vector-db",
4479
4718
  "description": "Use when operating a vector store as a data layer — choosing or migrating between Pinecone, Qdrant, Weaviate, or pgvector; designing a collection/index (distance metric, dimensions, HNSW m/ef_construction, named vectors); filtering on metadata/payload; running hybrid dense+sparse search; or picking quantization to cut RAM and cost. Symptoms: search returns garbage, filters get silently ignored, recall is low, queries are slow, the bill is too high, a filtered query returns fewer than k rows. Triggers: 'set up a vector database', 'my similarity search ignores the metadata filter', 'ef_search vs recall', 'move off Pinecone to pgvector to cut cost', 'hybrid search with RRF', 'why does my filtered query return fewer than k results', 'crear una colección en Qdrant con cuantización binaria', 'la cerca vectorial retorna resultats dolents'. NOT how to produce, chunk, or judge embeddings (that is embeddings-search).",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ericrisco/rsc",
3
- "version": "0.1.34",
3
+ "version": "0.1.36",
4
4
  "description": "Eric Risco's agent-skills catalog as a granular, self-recommending CLI installer.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -17,6 +17,7 @@ export const DOMAINS = [
17
17
  { title: 'AI — run it on', ids: ['replicate', 'runpod', 'modal', 'huggingface', 'ollama', 'together-fireworks', 'fal'] },
18
18
  { title: 'Languages', ids: ['typescript', 'python', 'java', 'csharp-dotnet', 'php', 'ruby', 'cpp', 'elixir', 'bash-scripting', 'sql', 'go'] },
19
19
  { title: 'Frameworks & app stacks', ids: ['fastapi', 'nextjs', 'react', 'react-native', 'vue-nuxt', 'angular', 'svelte', 'astro', 'solid-js', 'htmx', 'nodejs', 'nestjs', 'django', 'laravel', 'rails', 'spring-boot', 'phoenix', 'flutter', 'swift-ios', 'kotlin-android', 'compose-multiplatform', 'expo', 'tauri', 'electron', 'rust', 'wordpress', 'shopify', 'no-code-app', 'chrome-extension', 'api-design'] },
20
+ { title: 'Game development', ids: ['godot', 'unity', 'unreal', 'game-design', 'game-storytelling', 'level-design', 'gamedev-shaders', 'gamedev-multiplayer', 'gamedev-physics', 'gamedev-pathing', 'gamedev-shipping'] },
20
21
  { title: 'Databases & data layer', ids: ['postgresdb', 'mysql', 'mongodb', 'redis', 'supabase', 'neon', 'planetscale', 'sqlite-turso', 'prisma-orm', 'drizzle-orm', 'firebase', 'dynamodb', 'vector-db', 'clickhouse-analytics', 'duckdb', 'db-migrations', 'backups'] },
21
22
  { title: 'Ship & operate — platforms', ids: ['vercel', 'netlify', 'cloudflare', 'railway', 'render', 'fly-io', 'coolify', 'hetzner', 'digitalocean', 'aws-essentials', 'gcp-essentials'] },
22
23
  { title: 'Ship & operate — devops', ids: ['docker', 'github-actions', 'git-workflow', 'domains-dns', 'monitoring', 'email-deliverability', 'scaling', 'deployment'] },
@@ -16,6 +16,10 @@ const OUTCOMES = {
16
16
  'building-agents': 'Your own AI agent',
17
17
  'secure-coding': 'Make it secure',
18
18
  deployment: 'Put it online',
19
+ godot: 'Your game (Godot)',
20
+ unity: 'Your game (Unity)',
21
+ unreal: 'Your game (Unreal)',
22
+ 'game-design': "Design a game that's fun",
19
23
  };
20
24
 
21
25
  export function hasOutcome(id) {
@@ -199,7 +199,7 @@ Pick by where the eval runs and what it must do. Versions as of 2026-06 — re-v
199
199
 
200
200
  ## Project grounding
201
201
 
202
- If the workspace has a `02-DOCS/` harness, record the eval policy in `02-DOCS/wiki/stack/evals.md`: dataset location, scorer mix, gate baseline file, judge model, and the failure modes covered. Index it in `02-DOCS/wiki/index.md` (the Knowledge map; root `CLAUDE.md` keeps only a short pointer). This is **recorded, not gated** — skip silently if there is no harness.
202
+ If the workspace has a `02-DOCS/` harness, record the eval policy in `02-DOCS/wiki/stack/evals.md`: dataset location, scorer mix, gate baseline file, judge model, and the failure modes covered. Write it as an OKF v0.1 wiki article per the harness [`wiki-article-template.md`](../harness/references/wiki-article-template.md): open with YAML frontmatter carrying a non-empty `type:` (use `type: stack`), `timestamp` in ISO 8601, and standard markdown links — never wikilinks. Index it in `02-DOCS/wiki/index.md` (the Knowledge map; root `CLAUDE.md` keeps only a short pointer). This is **recorded, not gated** — skip silently if there is no harness.
203
203
 
204
204
  ## verify.sh
205
205
 
@@ -112,7 +112,7 @@ Produce a single consistency report:
112
112
  3. **Findings table** — `# | Severity | Type | Artifact A (loc) | Artifact B (loc) | Conflict | Resolve in (phase)`.
113
113
  4. **Recommended routing** — group fixes by the phase that owns them (`clarify` for spec ambiguity, `plan` for missing architecture, `tasks` for a missing done-check, `constitution` if a principle itself is wrong).
114
114
 
115
- Write the report to `02-DOCS/wiki/sdd/analysis/<slug>.md` (create the dir if absent) and index it in `02-DOCS/wiki/index.md` (the Knowledge map; root `CLAUDE.md` keeps only a short pointer) under the `sdd/` topic, so the next phase and the harness can find it. The report is the artifact analyze owns — it is the *only* thing analyze writes. Per-run point-in-time; overwrite on re-run, the wiki keeps history.
115
+ Write the report to `02-DOCS/wiki/sdd/analysis/<slug>.md` (create the dir if absent) and index it in `02-DOCS/wiki/index.md` (the Knowledge map; root `CLAUDE.md` keeps only a short pointer) under the `sdd/` topic, so the next phase and the harness can find it. It is an OKF v0.1 wiki article: open it with YAML frontmatter carrying a non-empty `type:` (use `type: analysis`), a `timestamp` in ISO 8601, and standard markdown links — never wikilinks. The report is the artifact analyze owns — it is the *only* thing analyze writes. Per-run point-in-time; overwrite on re-run, the wiki keeps history.
116
116
 
117
117
  Adapt the rendered verbosity to the dial (L0 = table only; L3 = full walk-through). Do not log a decision to `decisions.md` — analyze decides nothing; the phase that resolves the finding logs its own decision.
118
118
 
@@ -150,7 +150,7 @@ Tone by context: onboarding=warm; error=plain+reassuring, no humor;
150
150
  success=light warmth, no hype; billing=precise+calm; legal=formal+exact.
151
151
  ```
152
152
 
153
- **Persist it.** Write the compiled guide under `02-DOCS/wiki/brand/voice-guide.md` and the voice-DNA block beside it, per the `harness` Karpathy-wiki convention (compiled brand articles under `02-DOCS/wiki/brand/`, raw user inputs under `02-DOCS/raw/brand/`). This is the exact study `marketing`, `landing-copy`, and `content-engine` read to ground their copy. A guide in a slide deck is invisible to them.
153
+ **Persist it.** Write the compiled guide under `02-DOCS/wiki/brand/voice-guide.md` and the voice-DNA block beside it, per the `harness` Karpathy-wiki convention (compiled brand articles under `02-DOCS/wiki/brand/`, raw user inputs under `02-DOCS/raw/brand/`). The persisted file is an OKF v0.1 wiki article: open it with YAML frontmatter carrying a non-empty `type:` (use `type: brand-voice`) — see the frontmatter block in [`references/voice-guide-template.md`](references/voice-guide-template.md). This is the exact study `marketing`, `landing-copy`, and `content-engine` read to ground their copy. A guide in a slide deck is invisible to them.
154
154
 
155
155
  ## Auditing for drift
156
156
 
@@ -2,6 +2,20 @@
2
2
 
3
3
  Fill every slot. Delete the instruction lines in italics before you ship. The finished file lives at `02-DOCS/wiki/brand/voice-guide.md`. A fully worked mini-example follows the blank template — copy its shape, not its content.
4
4
 
5
+ The persisted guide is an OKF v0.1 wiki article: it MUST open with YAML frontmatter carrying a non-empty `type`. Copy the block below verbatim to the top of `02-DOCS/wiki/brand/voice-guide.md`, fill the values, and set `timestamp` to the ISO 8601 datetime of the edit:
6
+
7
+ ```yaml
8
+ ---
9
+ type: brand-voice
10
+ title: <brand> — Voice & Tone Guide
11
+ description: How the <brand> brand sounds — traits, rules, dimensions, word bank, and AI voice-DNA.
12
+ tags: [brand-voice, tone-of-voice, voice-guide]
13
+ timestamp: YYYY-MM-DDTHH:MM:SSZ
14
+ topic: brand
15
+ status: stable
16
+ ---
17
+ ```
18
+
5
19
  ---
6
20
 
7
21
  ## Blank template
@@ -454,9 +454,9 @@ agent inherits the conventions instead of re-deriving them.
454
454
 
455
455
  1. **Find the article** `02-DOCS/wiki/stack/agents.md`, indexed in `02-DOCS/wiki/index.md` (the Knowledge map index; root `CLAUDE.md` points to it).
456
456
  2. **If missing or stale**, create/update it with the project's real choices — the provider(s) and model routing, where the provider adapter lives, tool/RAG conventions, the eval gates, and the observability backend —
457
- then index it in `02-DOCS/wiki/index.md` (the Knowledge map; root `CLAUDE.md` keeps only a short pointer to it).
457
+ then index it in `02-DOCS/wiki/index.md` (the Knowledge map; root `CLAUDE.md` keeps only a short pointer to it). Write it as an OKF v0.1 wiki article per the harness [`wiki-article-template.md`](../harness/references/wiki-article-template.md): open with YAML frontmatter carrying a non-empty `type:` (use `type: stack`), and use standard markdown links — never wikilinks.
458
458
  3. **Read it first on every use** and stay consistent; when a convention changes, update the
459
- article (bump its `Updated` date) in the same change.
459
+ article (bump its `timestamp`) in the same change.
460
460
 
461
461
  No `02-DOCS/` layer? Skip silently (optionally suggest `harness`). Unlike the
462
462
  brand study, technical conventions are *recorded, not gated* — never block the task on this.
@@ -122,10 +122,15 @@ Good: 2026-05-20 · pricing · Acme · acme.com/pricing
122
122
  ## The tracker artifacts
123
123
 
124
124
  Three structured files. Required fields named here; full schema + a filled end-to-end example
125
- competitor live in `references/tracker-schema.md`.
126
-
127
- - **Competitor profile** (one per rival): `name`, `positioning_line`, `segment`, pricing tiers
128
- (each with `amount`, `currency`, `source_url`, `date`), feature-matrix rows, watched URLs.
125
+ competitor live in `references/tracker-schema.md`. The profile is a `.md` page under the
126
+ `02-DOCS/wiki/` OKF v0.1 bundle, so its YAML frontmatter carries a non-empty `type: competitor`
127
+ (plus the OKF-recommended `title`/`description`/`tags`/`timestamp`) alongside the domain keys;
128
+ its body uses standard markdown links, never wikilinks. The two CSVs are data files, not OKF
129
+ documents.
130
+
131
+ - **Competitor profile** (one per rival): OKF frontmatter (`type: competitor`, …) + the domain
132
+ keys `name`, `positioning_line`, `segment`, pricing tiers (each with `amount`, `currency`,
133
+ `source_url`, `date`), feature-matrix rows, watched URLs.
129
134
  - **Feature matrix** (CSV): rows = features, columns = competitors, each cell sourced + dated.
130
135
  - **Change log** (CSV, append-only): `date,competitor,axis,url,old_value,new_value,materiality,action`.
131
136
 
@@ -5,12 +5,28 @@ captures (the diffed HTML/JSON snapshots) go under `02-DOCS/raw/competitors/<riv
5
5
  rule that overrides everything: **a price or feature cell without a `source_url` + `date` is
6
6
  not knowledge — leave it blank and say so.**
7
7
 
8
+ `02-DOCS/wiki/` is an OKF v0.1 bundle, so the one `.md` file here (the competitor profile)
9
+ carries YAML frontmatter with a non-empty `type:`; the two CSVs are data files, not OKF
10
+ documents. Any cross-references in the profile body use **standard markdown links** (e.g.
11
+ `[Beta](./beta.md)`), never wikilinks. See `../../harness/references/wiki-protocol.md`
12
+ "## Conventions".
13
+
8
14
  ## 1. Competitor profile (one file per rival)
9
15
 
10
16
  Markdown front-matter + body. One per rival, named `02-DOCS/wiki/competitors/<rival>.md`.
17
+ The frontmatter is OKF v0.1 conformant: `type:` is the only required field (non-empty);
18
+ `title`/`description`/`tags`/`timestamp` are the recommended standard surface. All the
19
+ domain keys below (`name`, `positioning_source.date`, every `pricing_tiers[].date`, …) are
20
+ kept verbatim — OKF allows any extra key and `verify.sh` reads them, so adding the OKF
21
+ fields is purely additive.
11
22
 
12
23
  ```yaml
13
24
  ---
25
+ type: competitor
26
+ title: Acme
27
+ description: "Tracker of record for Acme — positioning, pricing tiers, and watched surfaces."
28
+ tags: [competitor, pricing-watch, feature-watch]
29
+ timestamp: 2026-05-28T00:00:00Z
14
30
  name: Acme
15
31
  positioning_line: "The all-in-one workspace for remote-first teams"
16
32
  positioning_source: { url: "https://acme.com", date: "2026-05-28" }
@@ -28,6 +44,9 @@ pricing_tiers:
28
44
 
29
45
  ## Notes
30
46
  Repositioned from "project tool" to "workspace" in Q2 2026 — see change log 2026-05-12.
47
+
48
+ ## Related
49
+ - [Beta](./beta.md) — closest competing positioning; cross-watch their pricing moves.
31
50
  ```
32
51
 
33
52
  Every `pricing_tiers` row and any feature claim must carry `source_url` + `date`. If you only
@@ -5,6 +5,16 @@ Render this into `02-DOCS/wiki/sdd/constitution.md`. Keep it to 1-2 screens. Eve
5
5
  ---
6
6
 
7
7
  ```markdown
8
+ ---
9
+ type: constitution
10
+ title: <Project> — Constitution
11
+ description: The non-negotiable principles every rsc-sdd phase obeys.
12
+ tags: [sdd, constitution]
13
+ timestamp: YYYY-MM-DDTHH:MM:SSZ
14
+ topic: sdd
15
+ version: v1.0.0
16
+ ---
17
+
8
18
  # <Project> — Constitution
9
19
 
10
20
  > Version: v1.0.0 · Ratified: YYYY-MM-DD · Last amended: YYYY-MM-DD
@@ -79,7 +79,7 @@ date,pillar,cluster,format,owner,stage,brief_link,atomization,mix
79
79
 
80
80
  ## The brief
81
81
 
82
- A slot **cannot leave the `idea` stage without a brief.** One canonical brief format means consistent output regardless of who writes it. Required fields (inline minimum):
82
+ A slot **cannot leave the `idea` stage without a brief.** One canonical brief format means consistent output regardless of who writes it. The brief is a `.md` page in the `02-DOCS/wiki/` OKF v0.1 bundle: its YAML frontmatter carries a non-empty `type: content-brief` (plus the OKF-recommended `title`/`description`/`tags`/`timestamp`) alongside the domain fields below, and any body cross-references use standard markdown links, never wikilinks. Required fields (inline minimum):
83
83
 
84
84
  - **objective** — the one outcome this piece drives.
85
85
  - **persona** — which of the 2–4 you target.
@@ -8,6 +8,13 @@ template, the stage gates, and the CSV column docs you fill in.
8
8
  Every slot carries one brief in the same shape. A slot cannot leave the `idea` stage
9
9
  without it. Store briefs under `02-DOCS/wiki/content/briefs/<slug>.md`.
10
10
 
11
+ These briefs live in the `02-DOCS/wiki/` OKF v0.1 bundle, so each brief `.md` carries YAML
12
+ frontmatter with a non-empty `type: content-brief` (the OKF-recommended `title`/`description`/
13
+ `tags`/`timestamp` are added where meaningful). The domain brief fields below are kept as-is —
14
+ OKF allows any extra key. Cross-references in the body use **standard markdown links**, never
15
+ wikilinks (e.g. `[brand voice](../brand-voice.md)`). See
16
+ `../../harness/references/wiki-protocol.md` "## Conventions".
17
+
11
18
  | Field | Required | What goes here |
12
19
  |---|---|---|
13
20
  | `objective` | yes | the one outcome (e.g. "drive activation-checklist signups") |
@@ -25,6 +32,13 @@ without it. Store briefs under `02-DOCS/wiki/content/briefs/<slug>.md`.
25
32
 
26
33
  ```markdown
27
34
  ---
35
+ # OKF v0.1 standard surface — `type` is the only REQUIRED field (non-empty).
36
+ type: content-brief
37
+ title: "Onboarding activation guide — brief"
38
+ description: "Brief of record for the flagship activation-checklist guide."
39
+ tags: [content-brief, onboarding, flagship]
40
+ timestamp: 2026-07-01T00:00:00Z
41
+ # Domain brief fields (OKF allows any extra key; the pipeline + verify read these).
28
42
  slug: onboarding-activation-guide
29
43
  objective: drive activation-checklist signups from new-trial users
30
44
  persona: hands-on-ops-lead
@@ -36,7 +50,7 @@ owner: ana
36
50
  target_keyword: "saas user activation checklist"
37
51
  success_metric: 100 checklist downloads in 30 days
38
52
  atomization_intent: 10 derivatives — 3 LinkedIn, 1 X thread, 2 shorts, 1 newsletter, 3 carousels
39
- voice_ref: 02-DOCS/wiki/brand-voice.md
53
+ voice_ref: ../brand-voice.md
40
54
  ---
41
55
  ```
42
56
 
@@ -46,6 +46,29 @@ Reuse the learner profile if it exists rather than re-interviewing. When you wri
46
46
  matrix, persist them there so `course-storytelling` can pick up the same grounding for the hand-off.
47
47
  Note in the file that the profile is shared, so neither skill clobbers the other's section.
48
48
 
49
+ Each persisted `02-DOCS/wiki/teaching/*.md` file is an OKF v0.1 wiki article: open it with YAML
50
+ frontmatter carrying a non-empty `type:` (`type: course-outline`), then the H1 and body. Use standard
51
+ markdown links between articles (`[Outcomes](./<course>-outcomes.md)`), never wikilinks. Mirror the
52
+ harness `wiki-article-template.md` shape:
53
+
54
+ ```markdown
55
+ ---
56
+ type: course-outline
57
+ title: <Course> — Outcomes
58
+ description: The measurable, ABCD-complete learning outcomes for <course>.
59
+ tags: [course, learning-outcomes]
60
+ timestamp: YYYY-MM-DDTHH:MM:SSZ
61
+ topic: teaching
62
+ status: stable
63
+ ---
64
+
65
+ # <Course> — Outcomes
66
+
67
+ > Sources: {user interview, YYYY-MM-DD}
68
+
69
+ ...
70
+ ```
71
+
49
72
  ## Right-sizing scope by format
50
73
 
51
74
  The single most common failure is too many outcomes for the time. Honest ceilings: