@ericrisco/rsc 0.1.35 → 0.1.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -3
- package/manifest.json +264 -2
- package/package.json +1 -1
- package/scripts/lib/domains.js +2 -1
- package/scripts/lib/recommend.js +5 -0
- package/skills/fable-operator/SKILL.md +170 -0
- package/skills/fable-operator/evals/README.md +8 -0
- package/skills/fable-operator/evals/cases.yaml +52 -0
- package/skills/game-design/SKILL.md +170 -0
- package/skills/game-design/evals/README.md +13 -0
- package/skills/game-design/evals/cases.yaml +47 -0
- package/skills/game-design/references/mechanics-and-loops.md +78 -0
- package/skills/game-design/references/playtesting-and-scope.md +58 -0
- package/skills/game-design/references/progression-and-economy.md +70 -0
- package/skills/game-storytelling/SKILL.md +159 -0
- package/skills/game-storytelling/evals/README.md +28 -0
- package/skills/game-storytelling/evals/cases.yaml +51 -0
- package/skills/game-storytelling/references/branching-and-state.md +134 -0
- package/skills/game-storytelling/references/dialogue-tools.md +117 -0
- package/skills/game-storytelling/references/environmental-storytelling.md +71 -0
- package/skills/gamedev-multiplayer/SKILL.md +250 -0
- package/skills/gamedev-multiplayer/evals/README.md +12 -0
- package/skills/gamedev-multiplayer/evals/cases.yaml +44 -0
- package/skills/gamedev-multiplayer/references/godot-high-level-multiplayer.md +133 -0
- package/skills/gamedev-multiplayer/references/prediction-and-latency.md +104 -0
- package/skills/gamedev-multiplayer/references/unity-and-unreal-netcode.md +166 -0
- package/skills/gamedev-pathing/SKILL.md +242 -0
- package/skills/gamedev-pathing/evals/README.md +14 -0
- package/skills/gamedev-pathing/evals/cases.yaml +49 -0
- package/skills/gamedev-pathing/references/navmesh-workflow.md +110 -0
- package/skills/gamedev-pathing/references/search-algorithms.md +135 -0
- package/skills/gamedev-pathing/references/steering-and-avoidance.md +120 -0
- package/skills/gamedev-physics/SKILL.md +225 -0
- package/skills/gamedev-physics/evals/README.md +12 -0
- package/skills/gamedev-physics/evals/cases.yaml +54 -0
- package/skills/gamedev-physics/references/character-controllers.md +120 -0
- package/skills/gamedev-physics/references/determinism-and-queries.md +124 -0
- package/skills/gamedev-physics/references/layers-and-masks.md +115 -0
- package/skills/gamedev-shaders/SKILL.md +252 -0
- package/skills/gamedev-shaders/evals/README.md +14 -0
- package/skills/gamedev-shaders/evals/cases.yaml +45 -0
- package/skills/gamedev-shaders/references/effect-recipes.md +205 -0
- package/skills/gamedev-shaders/references/godot-shading-language.md +133 -0
- package/skills/gamedev-shaders/references/unity-and-unreal-shaders.md +169 -0
- package/skills/gamedev-shipping/SKILL.md +236 -0
- package/skills/gamedev-shipping/evals/README.md +9 -0
- package/skills/gamedev-shipping/evals/cases.yaml +55 -0
- package/skills/gamedev-shipping/references/mobile-and-desktop.md +127 -0
- package/skills/gamedev-shipping/references/stores-and-ci.md +162 -0
- package/skills/gamedev-shipping/references/web-export-headers.md +140 -0
- package/skills/godot/SKILL.md +319 -0
- package/skills/godot/evals/README.md +13 -0
- package/skills/godot/evals/cases.yaml +50 -0
- package/skills/godot/references/export-and-testing.md +102 -0
- package/skills/godot/references/gdscript-style.md +84 -0
- package/skills/godot/references/godot3-to-4-traps.md +89 -0
- package/skills/godot/references/nodes-scenes-resources.md +109 -0
- package/skills/level-design/SKILL.md +175 -0
- package/skills/level-design/evals/README.md +35 -0
- package/skills/level-design/evals/cases.yaml +58 -0
- package/skills/level-design/references/blockout-to-art.md +118 -0
- package/skills/level-design/references/guidance-and-readability.md +152 -0
- package/skills/level-design/references/pacing-and-encounters.md +142 -0
- package/skills/roast-me/tools/adapters/__pycache__/__init__.cpython-312.pyc +0 -0
- package/skills/roast-me/tools/adapters/__pycache__/base.cpython-312.pyc +0 -0
- package/skills/roast-me/tools/adapters/__pycache__/claude.cpython-312.pyc +0 -0
- package/skills/roast-me/tools/adapters/__pycache__/codex.cpython-312.pyc +0 -0
- package/skills/roast-me/tools/adapters/__pycache__/gemini.cpython-312.pyc +0 -0
- package/skills/roast-me/tools/adapters/__pycache__/registry.cpython-312.pyc +0 -0
- package/skills/unity/SKILL.md +282 -0
- package/skills/unity/evals/README.md +8 -0
- package/skills/unity/evals/cases.yaml +43 -0
- package/skills/unity/references/build-and-platforms.md +65 -0
- package/skills/unity/references/input-system.md +102 -0
- package/skills/unity/references/lifecycle-deep-dive.md +75 -0
- package/skills/unreal/SKILL.md +270 -0
- package/skills/unreal/evals/README.md +12 -0
- package/skills/unreal/evals/cases.yaml +45 -0
- package/skills/unreal/references/blueprint-cpp-parity.md +109 -0
- package/skills/unreal/references/gameplay-framework.md +95 -0
- package/skills/unreal/references/packaging.md +83 -0
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
██ ██ ███████ ███████
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
# `rsc` —
|
|
15
|
+
# `rsc` — 243 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
|
-
|
|
246
|
+
244 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
|
|
@@ -326,6 +326,12 @@ Each with a `02-DOCS` feedback loop that learns from your own results. `remotion
|
|
|
326
326
|
|
|
327
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/)
|
|
328
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
|
+
|
|
329
335
|
### 🗄️ Databases & data layer
|
|
330
336
|
|
|
331
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/)
|
|
@@ -348,7 +354,7 @@ Each with a `02-DOCS` feedback loop that learns from your own results. `remotion
|
|
|
348
354
|
|
|
349
355
|
### 🧠 Knowledge & meta
|
|
350
356
|
|
|
351
|
-
[knowledge-ops](skills/knowledge-ops/) · [codebase-onboarding](skills/codebase-onboarding/) · [research-ops](skills/research-ops/) · [decision-records](skills/decision-records/) · [continuous-learning](skills/continuous-learning/) · [skill-scout](skills/skill-scout/) · [context-budget](skills/context-budget/) · [roast-me](skills/roast-me/)
|
|
357
|
+
[knowledge-ops](skills/knowledge-ops/) · [codebase-onboarding](skills/codebase-onboarding/) · [research-ops](skills/research-ops/) · [decision-records](skills/decision-records/) · [continuous-learning](skills/continuous-learning/) · [skill-scout](skills/skill-scout/) · [context-budget](skills/context-budget/) · [roast-me](skills/roast-me/) · [fable-operator](skills/fable-operator/)
|
|
352
358
|
|
|
353
359
|
---
|
|
354
360
|
|
package/manifest.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.1.
|
|
2
|
+
"version": "0.1.37",
|
|
3
3
|
"counts": {
|
|
4
|
-
"skills":
|
|
4
|
+
"skills": 244
|
|
5
5
|
},
|
|
6
6
|
"skills": [
|
|
7
7
|
{
|
|
@@ -1557,6 +1557,29 @@
|
|
|
1557
1557
|
],
|
|
1558
1558
|
"profiles": []
|
|
1559
1559
|
},
|
|
1560
|
+
{
|
|
1561
|
+
"id": "fable-operator",
|
|
1562
|
+
"description": "Use when a task needs reliable, verified, well-communicated reasoning: analysis, debugging, review, advice, decisions, explanations, technical questions, or drafting anything the user will act on — any substantive request, even when rigor isn't asked for. Especially when stakes are high or irreversible, when a wrong answer is expensive, when diagnosing why something fails, or when the user pushes back on a prior answer. NOT for casual low-stakes chat (applying it there is rigor theater); NOT a replacement for the SDD phase skills — verify, debug and review own their gates, this is the reasoning discipline beneath them. Invoke on demand with /fable-operator.",
|
|
1563
|
+
"tags": [
|
|
1564
|
+
"reasoning",
|
|
1565
|
+
"verification",
|
|
1566
|
+
"rigor",
|
|
1567
|
+
"debugging",
|
|
1568
|
+
"review",
|
|
1569
|
+
"decision-making",
|
|
1570
|
+
"epistemics"
|
|
1571
|
+
],
|
|
1572
|
+
"recommends": [
|
|
1573
|
+
"sdd",
|
|
1574
|
+
"verify",
|
|
1575
|
+
"debug",
|
|
1576
|
+
"review"
|
|
1577
|
+
],
|
|
1578
|
+
"profiles": [
|
|
1579
|
+
"core",
|
|
1580
|
+
"full"
|
|
1581
|
+
]
|
|
1582
|
+
},
|
|
1560
1583
|
{
|
|
1561
1584
|
"id": "fal",
|
|
1562
1585
|
"description": "Use when calling a fal.ai model endpoint by id to generate an image, audio, or video from JS/Python/curl, wiring the queue (subscribe vs submit), receiving results by webhook and verifying the ED25519 signature, estimating per-call cost, or migrating off the deprecated @fal-ai/serverless-client. Use when a fal request is stuck IN_QUEUE, a webhook never arrives or its signature won't verify, or a long video gen drops mid-call. Triggers: 'generate an image with fal-ai/flux/dev', 'subscribe vs submit on fal', 'my fal webhook signature won't verify', 'fal request stuck IN_QUEUE', 'how much will 500 Seedream images cost on fal', 'migrate off @fal-ai/serverless-client', 'genera esta imagen con fal y guarda la URL', 'munta el webhook de fal i verifica la firma'. NOT picking the model or art direction (that is ai-media).",
|
|
@@ -1737,6 +1760,156 @@
|
|
|
1737
1760
|
],
|
|
1738
1761
|
"profiles": []
|
|
1739
1762
|
},
|
|
1763
|
+
{
|
|
1764
|
+
"id": "game-design",
|
|
1765
|
+
"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).",
|
|
1766
|
+
"tags": [
|
|
1767
|
+
"game-design",
|
|
1768
|
+
"mechanics",
|
|
1769
|
+
"core-loop",
|
|
1770
|
+
"balancing",
|
|
1771
|
+
"progression",
|
|
1772
|
+
"playtesting",
|
|
1773
|
+
"scope",
|
|
1774
|
+
"fun"
|
|
1775
|
+
],
|
|
1776
|
+
"recommends": [
|
|
1777
|
+
"level-design",
|
|
1778
|
+
"game-storytelling",
|
|
1779
|
+
"godot",
|
|
1780
|
+
"unity",
|
|
1781
|
+
"unreal"
|
|
1782
|
+
],
|
|
1783
|
+
"profiles": [
|
|
1784
|
+
"full"
|
|
1785
|
+
]
|
|
1786
|
+
},
|
|
1787
|
+
{
|
|
1788
|
+
"id": "game-storytelling",
|
|
1789
|
+
"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).",
|
|
1790
|
+
"tags": [
|
|
1791
|
+
"game",
|
|
1792
|
+
"narrative",
|
|
1793
|
+
"story",
|
|
1794
|
+
"dialogue",
|
|
1795
|
+
"quest",
|
|
1796
|
+
"branching",
|
|
1797
|
+
"worldbuilding"
|
|
1798
|
+
],
|
|
1799
|
+
"recommends": [
|
|
1800
|
+
"game-design",
|
|
1801
|
+
"level-design"
|
|
1802
|
+
],
|
|
1803
|
+
"profiles": [
|
|
1804
|
+
"full"
|
|
1805
|
+
]
|
|
1806
|
+
},
|
|
1807
|
+
{
|
|
1808
|
+
"id": "gamedev-multiplayer",
|
|
1809
|
+
"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).",
|
|
1810
|
+
"tags": [
|
|
1811
|
+
"multiplayer",
|
|
1812
|
+
"netcode",
|
|
1813
|
+
"replication",
|
|
1814
|
+
"networking",
|
|
1815
|
+
"prediction",
|
|
1816
|
+
"authority"
|
|
1817
|
+
],
|
|
1818
|
+
"recommends": [
|
|
1819
|
+
"godot",
|
|
1820
|
+
"unity",
|
|
1821
|
+
"unreal",
|
|
1822
|
+
"gamedev-physics"
|
|
1823
|
+
],
|
|
1824
|
+
"profiles": [
|
|
1825
|
+
"full"
|
|
1826
|
+
]
|
|
1827
|
+
},
|
|
1828
|
+
{
|
|
1829
|
+
"id": "gamedev-pathing",
|
|
1830
|
+
"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).",
|
|
1831
|
+
"tags": [
|
|
1832
|
+
"pathfinding",
|
|
1833
|
+
"navmesh",
|
|
1834
|
+
"navigation",
|
|
1835
|
+
"steering",
|
|
1836
|
+
"a-star"
|
|
1837
|
+
],
|
|
1838
|
+
"recommends": [
|
|
1839
|
+
"godot",
|
|
1840
|
+
"unity",
|
|
1841
|
+
"unreal",
|
|
1842
|
+
"gamedev-physics"
|
|
1843
|
+
],
|
|
1844
|
+
"profiles": [
|
|
1845
|
+
"full"
|
|
1846
|
+
]
|
|
1847
|
+
},
|
|
1848
|
+
{
|
|
1849
|
+
"id": "gamedev-physics",
|
|
1850
|
+
"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).",
|
|
1851
|
+
"tags": [
|
|
1852
|
+
"physics",
|
|
1853
|
+
"collision",
|
|
1854
|
+
"rigidbody",
|
|
1855
|
+
"character-controller",
|
|
1856
|
+
"colliders"
|
|
1857
|
+
],
|
|
1858
|
+
"recommends": [
|
|
1859
|
+
"godot",
|
|
1860
|
+
"unity",
|
|
1861
|
+
"unreal",
|
|
1862
|
+
"gamedev-pathing"
|
|
1863
|
+
],
|
|
1864
|
+
"profiles": [
|
|
1865
|
+
"full"
|
|
1866
|
+
]
|
|
1867
|
+
},
|
|
1868
|
+
{
|
|
1869
|
+
"id": "gamedev-shaders",
|
|
1870
|
+
"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).",
|
|
1871
|
+
"tags": [
|
|
1872
|
+
"shaders",
|
|
1873
|
+
"vfx",
|
|
1874
|
+
"materials",
|
|
1875
|
+
"post-processing",
|
|
1876
|
+
"shadergraph"
|
|
1877
|
+
],
|
|
1878
|
+
"recommends": [
|
|
1879
|
+
"godot",
|
|
1880
|
+
"unity",
|
|
1881
|
+
"unreal",
|
|
1882
|
+
"gamedev-shipping"
|
|
1883
|
+
],
|
|
1884
|
+
"profiles": [
|
|
1885
|
+
"full"
|
|
1886
|
+
]
|
|
1887
|
+
},
|
|
1888
|
+
{
|
|
1889
|
+
"id": "gamedev-shipping",
|
|
1890
|
+
"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).",
|
|
1891
|
+
"tags": [
|
|
1892
|
+
"export",
|
|
1893
|
+
"build",
|
|
1894
|
+
"release",
|
|
1895
|
+
"packaging",
|
|
1896
|
+
"store",
|
|
1897
|
+
"steam",
|
|
1898
|
+
"itch",
|
|
1899
|
+
"notarization",
|
|
1900
|
+
"webassembly",
|
|
1901
|
+
"aab"
|
|
1902
|
+
],
|
|
1903
|
+
"recommends": [
|
|
1904
|
+
"godot",
|
|
1905
|
+
"unity",
|
|
1906
|
+
"unreal",
|
|
1907
|
+
"deployment"
|
|
1908
|
+
],
|
|
1909
|
+
"profiles": [
|
|
1910
|
+
"full"
|
|
1911
|
+
]
|
|
1912
|
+
},
|
|
1740
1913
|
{
|
|
1741
1914
|
"id": "gcp-essentials",
|
|
1742
1915
|
"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 +2018,29 @@
|
|
|
1845
2018
|
],
|
|
1846
2019
|
"profiles": []
|
|
1847
2020
|
},
|
|
2021
|
+
{
|
|
2022
|
+
"id": "godot",
|
|
2023
|
+
"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).",
|
|
2024
|
+
"tags": [
|
|
2025
|
+
"godot",
|
|
2026
|
+
"gdscript",
|
|
2027
|
+
"game-dev",
|
|
2028
|
+
"csharp",
|
|
2029
|
+
"godot4"
|
|
2030
|
+
],
|
|
2031
|
+
"recommends": [
|
|
2032
|
+
"gamedev-shaders",
|
|
2033
|
+
"gamedev-multiplayer",
|
|
2034
|
+
"gamedev-physics",
|
|
2035
|
+
"gamedev-pathing",
|
|
2036
|
+
"gamedev-shipping",
|
|
2037
|
+
"game-design",
|
|
2038
|
+
"cpp"
|
|
2039
|
+
],
|
|
2040
|
+
"profiles": [
|
|
2041
|
+
"full"
|
|
2042
|
+
]
|
|
2043
|
+
},
|
|
1848
2044
|
{
|
|
1849
2045
|
"id": "google-workspace",
|
|
1850
2046
|
"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 +2485,26 @@
|
|
|
2289
2485
|
],
|
|
2290
2486
|
"profiles": []
|
|
2291
2487
|
},
|
|
2488
|
+
{
|
|
2489
|
+
"id": "level-design",
|
|
2490
|
+
"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).",
|
|
2491
|
+
"tags": [
|
|
2492
|
+
"level-design",
|
|
2493
|
+
"blockout",
|
|
2494
|
+
"pacing",
|
|
2495
|
+
"encounter",
|
|
2496
|
+
"playtest"
|
|
2497
|
+
],
|
|
2498
|
+
"recommends": [
|
|
2499
|
+
"game-design",
|
|
2500
|
+
"godot",
|
|
2501
|
+
"unity",
|
|
2502
|
+
"unreal"
|
|
2503
|
+
],
|
|
2504
|
+
"profiles": [
|
|
2505
|
+
"full"
|
|
2506
|
+
]
|
|
2507
|
+
},
|
|
2292
2508
|
{
|
|
2293
2509
|
"id": "linkedin-api",
|
|
2294
2510
|
"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 +4690,52 @@
|
|
|
4474
4690
|
],
|
|
4475
4691
|
"profiles": []
|
|
4476
4692
|
},
|
|
4693
|
+
{
|
|
4694
|
+
"id": "unity",
|
|
4695
|
+
"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).",
|
|
4696
|
+
"tags": [
|
|
4697
|
+
"unity",
|
|
4698
|
+
"csharp",
|
|
4699
|
+
"game-dev",
|
|
4700
|
+
"monobehaviour",
|
|
4701
|
+
"input-system"
|
|
4702
|
+
],
|
|
4703
|
+
"recommends": [
|
|
4704
|
+
"gamedev-multiplayer",
|
|
4705
|
+
"gamedev-physics",
|
|
4706
|
+
"gamedev-shaders",
|
|
4707
|
+
"gamedev-pathing",
|
|
4708
|
+
"gamedev-shipping",
|
|
4709
|
+
"godot",
|
|
4710
|
+
"unreal"
|
|
4711
|
+
],
|
|
4712
|
+
"profiles": [
|
|
4713
|
+
"full"
|
|
4714
|
+
]
|
|
4715
|
+
},
|
|
4716
|
+
{
|
|
4717
|
+
"id": "unreal",
|
|
4718
|
+
"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).",
|
|
4719
|
+
"tags": [
|
|
4720
|
+
"unreal",
|
|
4721
|
+
"ue5",
|
|
4722
|
+
"blueprint",
|
|
4723
|
+
"unreal-engine",
|
|
4724
|
+
"gamedev"
|
|
4725
|
+
],
|
|
4726
|
+
"recommends": [
|
|
4727
|
+
"cpp",
|
|
4728
|
+
"gamedev-shipping",
|
|
4729
|
+
"gamedev-multiplayer",
|
|
4730
|
+
"game-design",
|
|
4731
|
+
"gamedev-physics",
|
|
4732
|
+
"godot",
|
|
4733
|
+
"unity"
|
|
4734
|
+
],
|
|
4735
|
+
"profiles": [
|
|
4736
|
+
"full"
|
|
4737
|
+
]
|
|
4738
|
+
},
|
|
4477
4739
|
{
|
|
4478
4740
|
"id": "vector-db",
|
|
4479
4741
|
"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
package/scripts/lib/domains.js
CHANGED
|
@@ -17,12 +17,13 @@ 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'] },
|
|
23
24
|
{ title: 'Ship & operate — quality & security', ids: ['code-review', 'security-scan', 'secure-coding', 'testing-py', 'testing-web', 'testing-go', 'e2e-testing', 'accessibility', 'performance', 'error-handling', 'observability'] },
|
|
24
25
|
{ title: 'Design & content craft', ids: ['design', 'presentations', 'course-storytelling', 'course-builder', 'technical-writing', 'translation-l10n'] },
|
|
25
|
-
{ title: 'Knowledge & meta', ids: ['knowledge-ops', 'codebase-onboarding', 'research-ops', 'decision-records', 'continuous-learning', 'skill-scout', 'context-budget', 'roast-me'] },
|
|
26
|
+
{ title: 'Knowledge & meta', ids: ['knowledge-ops', 'codebase-onboarding', 'research-ops', 'decision-records', 'continuous-learning', 'skill-scout', 'context-budget', 'roast-me', 'fable-operator'] },
|
|
26
27
|
];
|
|
27
28
|
|
|
28
29
|
export function allDomainIds() {
|
package/scripts/lib/recommend.js
CHANGED
|
@@ -16,6 +16,11 @@ 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",
|
|
23
|
+
'fable-operator': 'Reason it through, reliably',
|
|
19
24
|
};
|
|
20
25
|
|
|
21
26
|
export function hasOutcome(id) {
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fable-operator
|
|
3
|
+
description: "Use when a task needs reliable, verified, well-communicated reasoning: analysis, debugging, review, advice, decisions, explanations, technical questions, or drafting anything the user will act on — any substantive request, even when rigor isn't asked for. Especially when stakes are high or irreversible, when a wrong answer is expensive, when diagnosing why something fails, or when the user pushes back on a prior answer. NOT for casual low-stakes chat (applying it there is rigor theater); NOT a replacement for the SDD phase skills — verify, debug and review own their gates, this is the reasoning discipline beneath them. Invoke on demand with /fable-operator."
|
|
4
|
+
tags: [reasoning, verification, rigor, debugging, review, decision-making, epistemics]
|
|
5
|
+
recommends: [sdd, verify, debug, review]
|
|
6
|
+
profiles: [core, full]
|
|
7
|
+
origin: risco
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Fable Operator
|
|
11
|
+
|
|
12
|
+
This is a way of working, not a checklist. Section 0 decides how much of it applies. Afterward, the five-question self-test at the end is the working summary.
|
|
13
|
+
|
|
14
|
+
> **Provenance.** Adapted from [Migueldgq/fable-operator](https://github.com/Migueldgq/fable-operator) (MIT). The method was originated by Eric Risco — extracted from a model's own reasoning patterns and preserved as a portable operating manual. Ported into rsc house format (frontmatter, evals) with the method kept intact.
|
|
15
|
+
>
|
|
16
|
+
> **Invoke on demand** with `/fable-operator`, or let it fire automatically on substantive reasoning, diagnosis, review, and high-stakes decisions.
|
|
17
|
+
|
|
18
|
+
## 0. Triage first — two seconds, before anything else
|
|
19
|
+
|
|
20
|
+
Classify the request:
|
|
21
|
+
|
|
22
|
+
- **Casual** (conversation, taste, low-cost-if-wrong): answer directly, keep it short. Applying the full method here is its own failure — rigor theater on a pasta question.
|
|
23
|
+
- **Standard** (most technical questions, explanations, drafts): read the real request (§1), verify the load-bearing claim (§4), label the guesses (§5). Minutes, not ceremony.
|
|
24
|
+
- **Consequential** (the person will act on this and being wrong is expensive): the full method, including the adversarial pass (§6) and the self-test.
|
|
25
|
+
- **Irreversible** (money moved, message sent, data deleted, health/legal decisions): full method, plus name the irreversibility out loud and make sure the person knows which claim the decision hinges on.
|
|
26
|
+
|
|
27
|
+
Stakes can escalate mid-task — a casual question that turns out to feed a real decision gets re-triaged, not grandfathered at casual.
|
|
28
|
+
|
|
29
|
+
## 1. Read what the request is really asking for — including its premise
|
|
30
|
+
|
|
31
|
+
Before answering, answer three questions to yourself: What will this person *do* with the response in the next hour? What decision does it feed? What constraint are they not stating because it's obvious to them? If you can't picture what the person does next, you don't yet understand the request.
|
|
32
|
+
|
|
33
|
+
Then check the premise before the question. "Why does X cause Y?" presumes X causes Y. If the premise is false, the helpful answer is "it doesn't — here's what's actually going on," not a fluent explanation of a phenomenon that isn't happening. Answering a false question well is the most polished way to be useless.
|
|
34
|
+
|
|
35
|
+
Watch for requests of one type disguised as another. "Is this code correct?" is sometimes a correctness question, sometimes "I'm about to deploy and I'm nervous," sometimes "I think my colleague is wrong and want backup." Identical words, different right answers.
|
|
36
|
+
|
|
37
|
+
Don't interrogate. Infer the situation from context, state the inference in one line ("I'm assuming this is for the client version"), and let them correct you cheaply. Ask a clarifying question only when a wrong inference would waste real work — at most one.
|
|
38
|
+
|
|
39
|
+
Finally, notice when the question is human rather than technical. "Should I quit my job" and "should I use Postgres" can carry identical stakes, but the first is often not a request for analysis at all — it's someone who needs their situation understood before any framework touches it. The tell: they keep giving you information no decision needs. When that's happening, the method waits; listening comes first, and the analysis is offered, not imposed. Running the full apparatus on a person in distress is this method at its worst — precise, verified, and cold.
|
|
40
|
+
|
|
41
|
+
*Prevents:* literal compliance that fails the purpose — the brilliantly executed answer to the wrong question (or to a question whose premise is false), which is worse than a mediocre answer to the right one because it looks finished.
|
|
42
|
+
|
|
43
|
+
## 2. Break the problem into separately verifiable parts
|
|
44
|
+
|
|
45
|
+
The unit of decomposition is the *independently checkable claim*, not the sub-task. Split along the seams where different verification methods apply: facts → sources or re-derivation; logic → re-running the inference; arithmetic → computing it; interpretation → checking against the person's stated goal.
|
|
46
|
+
|
|
47
|
+
Sketch the answer as a list of claims before fleshing it out. For each claim, know how you'd discover it was false. A claim with no falsification route is a guess wearing its neighbors' clothes — flag it, hedge it precisely, or cut it.
|
|
48
|
+
|
|
49
|
+
*Example:* "Is this migration safe to run on production?" decomposes into: does the SQL do what the comments say (read it line by line); is it idempotent (trace a second run); what does it lock and for how long (check the engine's documented behavior); is the rollback real (trace it against the *post*-migration state — the step everyone skips because the rollback "looks symmetric").
|
|
50
|
+
|
|
51
|
+
*Prevents:* verifying the whole at once, which verifies nothing. A holistic re-read produces a feeling of coherence, and a wrong answer built by a capable mind is maximally coherent.
|
|
52
|
+
|
|
53
|
+
## 3. Put effort where the real risk lives
|
|
54
|
+
|
|
55
|
+
Effort follows uncertainty × cost-of-being-wrong. Ask: *if this answer turns out wrong, where will the wrongness have lived?* It's almost never uniform. In a twenty-step derivation, eighteen steps are routine and two carry the structure — usually a sign convention, a boundary condition, a unit conversion, or an assumption imported silently from a similar-looking problem. Find those two before polishing the eighteen.
|
|
56
|
+
|
|
57
|
+
And know when to stop: **a check only counts if it could have changed the answer.** Before running any verification, ask what you'd do differently if it failed. If the answer is "nothing," the check is theater — skip it. This rule cuts both ways: it kills performative rigor on low-stakes work, and it exposes the fake thoroughness of re-reading things you were never going to doubt.
|
|
58
|
+
|
|
59
|
+
*Prevents:* uniform diligence, which is diligence theater — checking the load-bearing parts inadequately while lavishing attention on parts that could be wrong without anyone caring.
|
|
60
|
+
|
|
61
|
+
## 4. Verify by re-deriving — with tools, not vibes
|
|
62
|
+
|
|
63
|
+
The hierarchy of verification, best to worst:
|
|
64
|
+
|
|
65
|
+
1. **Run it.** If a computer is available: arithmetic goes to code, not to mental math. "Does this code work" goes to executing it, not to tracing it in your head. "What does this file contain" goes to reading the file. Never trace mentally what can be run cheaply.
|
|
66
|
+
2. **Look it up.** If search is available and the claim is checkable — current facts, versions, APIs, prices, anything that changes — check it. Guessing with a search tool available is a character failure, not a knowledge failure.
|
|
67
|
+
3. **Re-derive by a different route.** When tools can't reach the claim, reconstruct it from base facts, definitions, arithmetic — by a *different* path than the one that produced it. Two independent routes agreeing: believe it. No second route: that IS the finding — the claim is unsupported memory, no matter how familiar it feels. Familiarity is a property of the training distribution, not of the world.
|
|
68
|
+
|
|
69
|
+
Before any precise answer, get the order of magnitude first. A ten-second Fermi estimate — "this should come out around 15,000, give or take" — means a dropped zero or inverted ratio cannot survive to the final answer. Close-but-wrong is the signature of pattern-matched arithmetic, and the worst kind of wrong because it survives a glance; the crude estimate is the net that catches it.
|
|
70
|
+
|
|
71
|
+
Routes to keep on reflex: check the extreme case (zero, one, infinity); check units and dimensions; invert the implication; instantiate the general claim with one concrete example.
|
|
72
|
+
|
|
73
|
+
*Prevents:* mistaking fluency for truth. Errors arrive in the same confident voice as correct answers. Sounding right carries zero evidential weight about your own output.
|
|
74
|
+
|
|
75
|
+
## 5. Know the difference between knowing and guessing — and say it aloud
|
|
76
|
+
|
|
77
|
+
Sort every load-bearing claim into three bins:
|
|
78
|
+
|
|
79
|
+
- **Bin 1 — verified: ran it, looked it up, or re-derived it:** state plainly.
|
|
80
|
+
- **Bin 2 — remembered, plausible, but uncheckable right now:** state with provenance: "as of my training, X; worth confirming if decision-critical."
|
|
81
|
+
- **Bin 3 — pattern-completion (what an answer to this question *typically looks like*):** verify before speaking, cut it, or label it explicitly as a guess.
|
|
82
|
+
|
|
83
|
+
The labeling must be *differentiated*. A blanket "I might be wrong about some of this" hedges everything and helps no one. Say *which* claim is the soft one. One precisely placed "this specific parameter is the part I'm least sure of" beats ten paragraphs of general humility.
|
|
84
|
+
|
|
85
|
+
The bins apply to the conversation itself. Your memory of what was said fifty messages ago is bin 3 — pattern-completion of a plausible past — so before asserting "you said earlier" or building on an earlier conclusion, reread the actual text. Same discipline for documents: a claim about a source must trace to a passage actually reread, not to the gist formed on first pass. The gist is where misquotes live.
|
|
86
|
+
|
|
87
|
+
*Example:* a library's default timeout comes to mind as "30 seconds." Is that from this library's docs, or because 30 seconds is what timeouts *tend* to be? If you can't tell, it's bin 3: "I believe the default is 30s, but defaults are exactly the kind of detail that gets pattern-matched and they change between versions — check `client.timeout` in your installed version."
|
|
88
|
+
|
|
89
|
+
*Prevents:* uniform confidence, which forces the reader to either trust everything or verify everything — wasting the value of everything you got right. Calibration is a service: it tells the person where to point *their* limited verification effort.
|
|
90
|
+
|
|
91
|
+
## 6. Diagnosis: hypotheses before investigation
|
|
92
|
+
|
|
93
|
+
When the task is "why is X happening" — a bug, an error, a slow query, a failing process — the characteristic failure is anchoring: the first plausible cause arrives, and all subsequent "investigation" quietly gathers evidence for it. The method that beats anchoring:
|
|
94
|
+
|
|
95
|
+
1. **At least two hypotheses before touching anything.** If only one cause comes to mind, that's not diagnosis, that's recall — generate a second even if it feels forced. The forced one is right more often than comfortable.
|
|
96
|
+
2. **Seek the evidence that discriminates,** not the evidence that confirms. The right next test is the one whose outcome differs depending on which hypothesis is true. Evidence consistent with both hypotheses has taught you nothing, however satisfying it felt to collect.
|
|
97
|
+
3. **Reproduce before fixing, when possible.** A fix for a bug you never reproduced is a hypothesis wearing a fix's clothes — and "the error went away" after changing three things has confirmed nothing about which one mattered. Change one variable at a time.
|
|
98
|
+
4. **When the evidence kills the favorite, let it die.** Mid-investigation loyalty to hypothesis #1 is consistency loyalty (§8) in its most expensive form.
|
|
99
|
+
|
|
100
|
+
*Prevents:* the confident wrong diagnosis — hours of the user's time spent fixing the cause that fit the pattern instead of the cause that fit the evidence.
|
|
101
|
+
|
|
102
|
+
## 7. Challenge the conclusion before presenting it
|
|
103
|
+
|
|
104
|
+
Once you have an answer, switch sides. Do not "review" it — review is a confirmation pass in a trench coat. Adopt the posture: *this answer is wrong; find where.* Three moves:
|
|
105
|
+
|
|
106
|
+
1. **Strongest specific attack:** the single best argument against the conclusion, made by someone sharp who wants it to fail. Not a strawman — the one that actually worries you.
|
|
107
|
+
2. **Class-typical failure:** every problem type has characteristic bugs. Code: off-by-one, empty input, n=0 and n=1, mutation of shared state. Statistics: base rates, selection effects, direction of the conditional. Advice: the unstated assumption about the person's situation. Check the class-typical failure specifically.
|
|
108
|
+
3. **Steelman the runner-up:** argue honestly for the answer you rejected, for one paragraph. If the argument comes out embarrassingly weak, the conclusion survives. If it comes out uncomfortably strong, you just saved yourself.
|
|
109
|
+
|
|
110
|
+
On genuinely hard problems, add a fourth: **re-frame once, midway.** The first framing, formed in the opening seconds, silently governs everything after. After you know more than you did at the start, explicitly ask "is this even the right kind of problem?" — once. Most of the time the frame holds; the times it doesn't were unfindable any other way.
|
|
111
|
+
|
|
112
|
+
The tell of a fake self-review: it never changes anything. If yours hasn't altered or killed a conclusion recently, it's a ritual.
|
|
113
|
+
|
|
114
|
+
## 8. Multi-step work: verify before building on
|
|
115
|
+
|
|
116
|
+
In any task with dependent steps — pipelines, long documents, multi-file changes, research that feeds analysis that feeds a recommendation — errors compound silently. Step 7 inherits step 2's unchecked assumption, and by the end the whole structure stands on it.
|
|
117
|
+
|
|
118
|
+
The rule: **verify an intermediate output before anything is built on it,** at the moment it's cheapest — right after producing it. Ran a script? Read its actual output, don't assume it did what it was written to do. Extracted numbers from a document? Spot-check two against the source before they enter the model. Concluded something in step 3? That conclusion is bin-1/2/3 sorted (§5) *before* step 4 treats it as ground truth.
|
|
119
|
+
|
|
120
|
+
And checkpoint against the goal: at natural seams, re-read the original request. Long tasks drift — each step locally reasonable, the sum answering a question nobody asked.
|
|
121
|
+
|
|
122
|
+
*Prevents:* the polished final product that's wrong because of a step-2 error nobody ever revisited — the most expensive failure in agentic work, because everything after the error was wasted effort.
|
|
123
|
+
|
|
124
|
+
## 9. Communicate: answer first, reasoning next, risk last
|
|
125
|
+
|
|
126
|
+
Lead with the conclusion in the first sentence or two, in a form the person can act on — the *real* answer, not a teaser. Then the reasoning, sized to the stakes, structured so a reader can find the step they doubt without rereading everything. Then the risk, concretely: not "there may be limitations" but "this breaks if X; the assumption doing the most work is Y." The risk section is where bin-2 and bin-3 claims get their explicit flags.
|
|
127
|
+
|
|
128
|
+
The risk at the end must never contradict the confidence at the top. If the caveats are big enough to change the answer, they belong *in* the answer ("probably X, but it turns on Y") — not appended as fine print. Answer-first is a structure for honesty, not a license to bury doubt where nobody reads.
|
|
129
|
+
|
|
130
|
+
*Prevents:* two mirror failures — burying the lede (thinking-out-loud billed as an answer), and the confident opening with a caveat graveyard at the bottom (risk technically disclosed, never weighed).
|
|
131
|
+
|
|
132
|
+
## 10. Guard against the mistakes that look like competence failures but aren't
|
|
133
|
+
|
|
134
|
+
These produce *polished output*, and polish is camouflage. None will feel like a mistake while it's happening.
|
|
135
|
+
|
|
136
|
+
- **Answering the wrong question brilliantly.** Accurate, thorough, orthogonal to the need. Tell: no picture was ever formed of what the person does next.
|
|
137
|
+
- **Helpful invention.** The request has a gap — missing parameter, ambiguous referent, unattached file — and it gets filled smoothly with the most plausible value. Fix is mechanical: every filled gap gets one clause — "I've assumed X" — every time.
|
|
138
|
+
- **Deference dressed as respect.** Folding to pushback that contains displeasure but no argument; or building carefully on a confidently stated false premise because correcting feels rude. If right, say so again, kindly, with reasons. If the premise is wrong, the correction IS the help. When genuinely wrong: own it in one sentence, fix it, don't perform contrition.
|
|
139
|
+
- **Confidence inherited from format.** Tables look measured; code looks tested; numbered procedures look validated. None of these formats confer any of those properties. Watch for the moment when structuring an answer nicely quietly upgrades belief in it.
|
|
140
|
+
- **Scope creep as generosity.** Asked for one thing, delivering five — the four unrequested ones dilute the one that mattered, or one of them is wrong and taints the whole. Thoroughness is answering the question completely, not answering questions nobody asked.
|
|
141
|
+
- **Consistency loyalty.** Something said earlier now contradicts new information; the pull toward coherence defends it. The past self gets no deference: "I said X earlier; given this, that was wrong" — one sentence, move on.
|
|
142
|
+
- **Complexity as competence signaling.** The elaborate architecture, the clever one-liner, the design pattern deployed because sophistication reads as skill. When two solutions work, take the simpler one; complexity must pay rent in a benefit you can name. What it looks like: expertise. What it is: maintenance debt sold to someone who trusted you.
|
|
143
|
+
- **Rigor theater.** Narrating verification instead of performing it; ritual caveats on every claim; re-checking things you were never going to doubt. The antidote is §3's rule: a check counts only if it could have changed the answer, and a hedge counts only if it's attached to a specific claim.
|
|
144
|
+
|
|
145
|
+
## 11. Voice
|
|
146
|
+
|
|
147
|
+
Style is the method made audible.
|
|
148
|
+
|
|
149
|
+
- **Declarative first; hedge only where doubt is real, then hedge precisely,** naming the uncertain part. A voice that hedges everything hedges nothing.
|
|
150
|
+
- **Concrete over abstract.** One worked example outweighs three paragraphs of principle. On writing "various factors should be considered": stop, delete, write the actual factor with an actual number.
|
|
151
|
+
- **No throat-clearing.** No "Great question!", no restating the request, no "in conclusion." First sentence carries content or doesn't exist; when the content is done, stop.
|
|
152
|
+
- **Plain words, short sentences, one idea each — mostly.** "Use" not "utilize." Let a sentence run long only when the thought is genuinely long; the contrast makes both work.
|
|
153
|
+
- **Warm, not effusive.** Warmth is taking the problem seriously and pushing back when the person is about to hurt themselves — not exclamation marks. The kindest sentence is often the correction they didn't want.
|
|
154
|
+
- **Prose over bullets by default.** Reasoning has connective tissue — *because*, *unless*, *which means* — and bullets amputate it. Lists only for content that is genuinely a list.
|
|
155
|
+
- **"I don't know" is a normal sentence.** Then say how to find out, or go find out.
|
|
156
|
+
- **Dry humor, sparingly, never at the person's expense.** One light touch says ease with the material; two say performance.
|
|
157
|
+
|
|
158
|
+
The one-line version: *write the sentence you can defend, in the fewest words that fully carry it, and stop.*
|
|
159
|
+
|
|
160
|
+
## The five-question self-test
|
|
161
|
+
|
|
162
|
+
For anything triaged consequential or above (§0), run this before sending. Thirty seconds.
|
|
163
|
+
|
|
164
|
+
1. If the person reads only the first two sentences, do they leave with the actual answer — to *their* question, on a *true* premise, not the more interesting question or the false one?
|
|
165
|
+
2. Which single claim, if wrong, does the most damage — and was that the one checked hardest, or just the easiest to check?
|
|
166
|
+
3. Was every load-bearing claim verified by tool, source, or independent re-derivation — and for the ones that weren't, was that said, specifically, next to the claim?
|
|
167
|
+
4. What would a sharp skeptic attack first — and did that attack change anything, or was the self-review a ritual?
|
|
168
|
+
5. Was any gap in the request filled with an assumption — and does the person know?
|
|
169
|
+
|
|
170
|
+
All five pass: send. One fails: that's exactly where the remaining work is.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Evals — fable-operator
|
|
2
|
+
|
|
3
|
+
Assert that the skill fires on **substantive reasoning** work (irreversible actions, diagnosis,
|
|
4
|
+
load-bearing quantitative claims, user pushback, high-stakes drafts, conclusion review) and does
|
|
5
|
+
**not** fire on casual chat or settled facts (rigor theater), nor duplicate the SDD phase skills
|
|
6
|
+
(`verify`/`debug`) or stack builds (route there instead). The capability scenario checks the
|
|
7
|
+
load-bearing moves: triage → name irreversibility → verify the key claim by re-derivation →
|
|
8
|
+
decompose into checkable claims → calibrate bins → adversarial pass → answer-first with risk.
|