@ericrisco/rsc 0.1.49 → 0.1.51
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/manifest.json +14 -14
- package/package.json +1 -1
- package/scripts/skill-migration-brief.md +14 -6
- package/skills/accessibility/scripts/verify.sh +0 -0
- package/skills/forecasting/SKILL.md +17 -17
- package/skills/game-storytelling/SKILL.md +14 -39
- package/skills/gamedev-shipping/SKILL.md +28 -44
- package/skills/godot/SKILL.md +17 -36
- package/skills/grants/SKILL.md +2 -20
- package/skills/harness/SKILL.md +27 -85
- package/skills/harness/evals/cases.yaml +1 -1
- package/skills/hiring/SKILL.md +14 -26
- package/skills/instagram-api/SKILL.md +12 -22
- package/skills/machine-learning/SKILL.md +21 -53
- package/skills/observability/SKILL.md +2 -4
- package/skills/observability/scripts/verify.sh +0 -0
- package/skills/rag/SKILL.md +21 -38
- package/skills/suggest/SKILL.md +1 -0
- package/skills/tauri/SKILL.md +6 -11
- package/skills/webhooks/SKILL.md +17 -34
package/manifest.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.1.
|
|
2
|
+
"version": "0.1.51",
|
|
3
3
|
"counts": {
|
|
4
4
|
"skills": 258
|
|
5
5
|
},
|
|
@@ -1802,7 +1802,7 @@
|
|
|
1802
1802
|
},
|
|
1803
1803
|
{
|
|
1804
1804
|
"id": "forecasting",
|
|
1805
|
-
"description": "Use when
|
|
1805
|
+
"description": "Use when projecting history forward — sales, demand, units, revenue, signups, traffic — into a defensible number with an error band: method by data shape, rolling-origin backtest, MASE vs the naive baseline. NOT an assumption-driven P&L or runway model (that is `financial-model`), NOT sizing reorder points or safety stock (that is `inventory`).",
|
|
1806
1806
|
"tags": [
|
|
1807
1807
|
"forecasting",
|
|
1808
1808
|
"demand-planning",
|
|
@@ -1869,7 +1869,7 @@
|
|
|
1869
1869
|
},
|
|
1870
1870
|
{
|
|
1871
1871
|
"id": "game-storytelling",
|
|
1872
|
-
"description": "Use when
|
|
1872
|
+
"description": "Use when a game's story is the work: premise and pillars, branching topology, meaningful choice, dialogue state, quests, environmental storytelling, ludonarrative harmony. Author portable — engine wiring is `godot`/`unity`/`unreal`. NOT the mechanics and economy the story serves (that is `game-design`), NOT level layout (that is `level-design`).",
|
|
1873
1873
|
"tags": [
|
|
1874
1874
|
"game",
|
|
1875
1875
|
"narrative",
|
|
@@ -1970,7 +1970,7 @@
|
|
|
1970
1970
|
},
|
|
1971
1971
|
{
|
|
1972
1972
|
"id": "gamedev-shipping",
|
|
1973
|
-
"description": "Use when exporting,
|
|
1973
|
+
"description": "Use when exporting, packaging, signing, or publishing a game — export presets per engine, macOS notarization, cross-origin isolation for threaded web builds, Android AAB/keystore, iOS provisioning, store submission (Steam, Play, App Store, itch.io), headless build CI. NOT gameplay code inside the artifact (that is `godot`, `unity`, `unreal`), NOT hosting a web app or container (that is `deployment`).",
|
|
1974
1974
|
"tags": [
|
|
1975
1975
|
"export",
|
|
1976
1976
|
"build",
|
|
@@ -2103,7 +2103,7 @@
|
|
|
2103
2103
|
},
|
|
2104
2104
|
{
|
|
2105
2105
|
"id": "godot",
|
|
2106
|
-
"description": "Use when writing, reviewing, or debugging Godot 4.x games in GDScript
|
|
2106
|
+
"description": "Use when writing, reviewing, or debugging Godot 4.x games in GDScript or C# — scenes, nodes, custom Resources, autoload/EventBus signals, typed GDScript, CharacterBody2D/3D movement, GUT/gdUnit4 — or porting Godot 3 APIs to 4. NOT Unity/Unreal (that is `unity`/`unreal`), NOT `.gdshader` code (`gamedev-shaders`), NOT GDExtension C++ tooling (`cpp`).",
|
|
2107
2107
|
"tags": [
|
|
2108
2108
|
"godot",
|
|
2109
2109
|
"gdscript",
|
|
@@ -2150,7 +2150,7 @@
|
|
|
2150
2150
|
},
|
|
2151
2151
|
{
|
|
2152
2152
|
"id": "grants",
|
|
2153
|
-
"description": "Use when
|
|
2153
|
+
"description": "Use when pursuing non-dilutive public or foundation funding — money you neither repay nor give equity for: finding a fit call, go/no-go, registration (UEI/PIC/BDNS), or writing the rubric-scored application, logic model, budget justification, or LOI. NOT an equity round (that is `fundraising`), NOT a paying-customer SOW (that is `proposals`).",
|
|
2154
2154
|
"tags": [
|
|
2155
2155
|
"grants",
|
|
2156
2156
|
"subsidies",
|
|
@@ -2170,7 +2170,7 @@
|
|
|
2170
2170
|
},
|
|
2171
2171
|
{
|
|
2172
2172
|
"id": "harness",
|
|
2173
|
-
"description": "Use
|
|
2173
|
+
"description": "Use when governing a workspace's control plane, code or not — the `01-TOOLS/` tooling layer, the `02-DOCS/` chaos→knowledge wiki, the root Knowledge map. Audits it, migrates legacy `XX-*` folders, scaffolds provider tooling, sweeps the inbox, writes root CLAUDE.md/AGENTS.md. NOT the bootstrap front door (that is `init`, which hands off here).",
|
|
2174
2174
|
"tags": [
|
|
2175
2175
|
"harness",
|
|
2176
2176
|
"company",
|
|
@@ -2214,7 +2214,7 @@
|
|
|
2214
2214
|
},
|
|
2215
2215
|
{
|
|
2216
2216
|
"id": "hiring",
|
|
2217
|
-
"description": "Use when
|
|
2217
|
+
"description": "Use when a role is open and you must write the job post, screen inbound candidates, structure the interview loop, or score them to a defensible Hire / On-Hold / No-Hire — including whether an AI résumé filter is legal. NOT after the offer is accepted — onboarding, payroll, performance (that is `people-ops`), NOT offer terms (that is `contracts`).",
|
|
2218
2218
|
"tags": [
|
|
2219
2219
|
"hiring",
|
|
2220
2220
|
"recruiting",
|
|
@@ -2315,7 +2315,7 @@
|
|
|
2315
2315
|
},
|
|
2316
2316
|
{
|
|
2317
2317
|
"id": "instagram-api",
|
|
2318
|
-
"description": "Use when wiring an agent into Instagram's Graph API
|
|
2318
|
+
"description": "Use when wiring an agent into Instagram's Graph API: publishing a Reel through the create/poll/publish container dance, reading per-media insights, checking the 24h publish cap, or ingesting Reel metrics into 02-DOCS/wiki/shortform. NOT TikTok (that is `tiktok-api`), NOT YouTube (that is `youtube-api`), NOT cross-platform cadence (that is `social-publisher`).",
|
|
2319
2319
|
"tags": [
|
|
2320
2320
|
"instagram",
|
|
2321
2321
|
"graph-api",
|
|
@@ -2740,7 +2740,7 @@
|
|
|
2740
2740
|
},
|
|
2741
2741
|
{
|
|
2742
2742
|
"id": "machine-learning",
|
|
2743
|
-
"description": "Use when
|
|
2743
|
+
"description": "Use when predicting a column from rows of tabular features with classic models — scikit-learn pipelines, RandomForest, XGBoost/LightGBM, leak-free cross-validation, metrics for imbalanced classes, or a model that aced CV then collapsed in production. NOT PyTorch neural nets (that is `deep-learning`), NOT cleaning the dirty table first (that is `data-cleaning`), NOT forecasting a dated series (that is `forecasting`), NOT text/token modeling (that is `nlp`).",
|
|
2744
2744
|
"tags": [
|
|
2745
2745
|
"machine-learning",
|
|
2746
2746
|
"scikit-learn",
|
|
@@ -3196,7 +3196,7 @@
|
|
|
3196
3196
|
},
|
|
3197
3197
|
{
|
|
3198
3198
|
"id": "observability",
|
|
3199
|
-
"description": "Use when instrumenting a service from the inside so an incident can be explained from telemetry alone — wiring OpenTelemetry logs, metrics and traces, standing up a Collector, exporting via OTLP, and defining telemetry-driven alerts.
|
|
3199
|
+
"description": "Use when instrumenting a service from the inside so an incident can be explained from telemetry alone — wiring OpenTelemetry logs, metrics and traces, standing up a Collector, exporting via OTLP, and defining telemetry-driven alerts. NOT outside-in uptime probes, on-call rotation, or who-gets-paged (that is `monitoring`).",
|
|
3200
3200
|
"tags": [
|
|
3201
3201
|
"observability",
|
|
3202
3202
|
"opentelemetry",
|
|
@@ -3662,7 +3662,7 @@
|
|
|
3662
3662
|
},
|
|
3663
3663
|
{
|
|
3664
3664
|
"id": "rag",
|
|
3665
|
-
"description": "Use when building grounded Q&A over your own
|
|
3665
|
+
"description": "Use when building grounded Q&A over your own corpus — chunk, retrieve hybrid, rerank, ground, cite chunk ids, refuse when the sources fall short — or when the right document is retrieved but the answer is still wrong, invented, or unmeasured. NOT operating the store itself — collection schema, HNSW ef_search, quantization (that is `vector-db`).",
|
|
3666
3666
|
"tags": [
|
|
3667
3667
|
"rag",
|
|
3668
3668
|
"retrieval-augmented-generation",
|
|
@@ -4664,7 +4664,7 @@
|
|
|
4664
4664
|
},
|
|
4665
4665
|
{
|
|
4666
4666
|
"id": "tauri",
|
|
4667
|
-
"description": "Use when building a lightweight cross-platform desktop (or v2 mobile) app with Tauri — a Rust core plus the OS-native WebView
|
|
4667
|
+
"description": "Use when building a lightweight cross-platform desktop (or v2 mobile) app with Tauri — a Rust core plus the OS-native WebView: Rust commands and IPC, streaming to the frontend, the default-deny capabilities/permissions ACL, bundling and signed auto-updates. NOT a Chromium+Node shell needing Node APIs in a main process (that is electron).",
|
|
4668
4668
|
"tags": [
|
|
4669
4669
|
"tauri",
|
|
4670
4670
|
"desktop",
|
|
@@ -5140,7 +5140,7 @@
|
|
|
5140
5140
|
},
|
|
5141
5141
|
{
|
|
5142
5142
|
"id": "webhooks",
|
|
5143
|
-
"description": "Use when building the
|
|
5143
|
+
"description": "Use when building the receiving end of a webhook — a provider-agnostic endpoint that proves pushed events are authentic and never processes one twice: raw-body HMAC, ~5-min replay window, idempotency on the event id, fast-ack-then-queue. NOT the Stripe-Signature scheme (that is stripe), NOT outbound clients you call (that is api-connector-builder).",
|
|
5144
5144
|
"tags": [
|
|
5145
5145
|
"webhooks",
|
|
5146
5146
|
"inbound-webhooks",
|
package/package.json
CHANGED
|
@@ -114,16 +114,24 @@ Everything above is for the agent doing one skill. This half is for whoever is d
|
|
|
114
114
|
|
|
115
115
|
## Resuming, from nothing
|
|
116
116
|
|
|
117
|
-
There is no state file to keep in sync, on purpose. **The
|
|
117
|
+
There is no state file to keep in sync, on purpose. **The content is the ledger** — a migrated skill
|
|
118
|
+
no longer carries a `Triggers:` list in its description:
|
|
118
119
|
|
|
119
120
|
```bash
|
|
120
|
-
|
|
121
|
-
git ls-remote --heads origin 'refs/heads/skill/*'
|
|
122
|
-
# what is left = skills/ minus those, minus what is already merged to main
|
|
121
|
+
node -e "const fs=require('fs');const out=[];for(const d of fs.readdirSync('skills')){const p='skills/'+d+'/SKILL.md';if(!fs.existsSync(p))continue;const m=/^---\n([\s\S]*?)\n---/.exec(fs.readFileSync(p,'utf8'));if(m&&/Triggers:/i.test(m[1]))out.push(d)}console.log(out.join('\n'))"
|
|
123
122
|
```
|
|
124
123
|
|
|
125
|
-
So a cold session resumes with: *read this brief,
|
|
126
|
-
|
|
124
|
+
So a cold session resumes with: *read this brief, run that, launch one agent per remaining skill in
|
|
125
|
+
its own worktree.* Nothing from any previous conversation is required.
|
|
126
|
+
|
|
127
|
+
**An earlier version of this section said the remote `skill/*` branches were the ledger. They are
|
|
128
|
+
not, and the failure is instructive**: once integration PRs started merging with `--delete-branch`,
|
|
129
|
+
the branches for finished skills vanished, so a branch-based check re-offered work that was already
|
|
130
|
+
on main — and an agent duly re-migrated `harness` a second time before anyone noticed. The
|
|
131
|
+
instruction was true when written and was invalidated by a later change to the merge flow, with
|
|
132
|
+
nothing to catch the drift. That is the same failure this whole migration keeps finding in the
|
|
133
|
+
catalog; the brief was not exempt from it. Prefer a check against the artifact over a check against
|
|
134
|
+
bookkeeping that something else can quietly change.
|
|
127
135
|
|
|
128
136
|
## Order: by profile, not alphabetically
|
|
129
137
|
|
|
File without changes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: forecasting
|
|
3
|
-
description: "Use when
|
|
3
|
+
description: "Use when projecting history forward — sales, demand, units, revenue, signups, traffic — into a defensible number with an error band: method by data shape, rolling-origin backtest, MASE vs the naive baseline. NOT an assumption-driven P&L or runway model (that is `financial-model`), NOT sizing reorder points or safety stock (that is `inventory`)."
|
|
4
4
|
tags: [forecasting, demand-planning, time-series, sales-forecast, statsforecast]
|
|
5
5
|
recommends: [inventory, financial-model, unit-economics, data-cleaning, analyze, duckdb]
|
|
6
6
|
origin: risco
|
|
@@ -51,13 +51,13 @@ When in doubt between two, fit both plus the baseline in one `StatsForecast` run
|
|
|
51
51
|
|
|
52
52
|
The metrics are not decoration — they decide what you ship.
|
|
53
53
|
|
|
54
|
-
- **WAPE, not MAPE.** MAPE divides by the actual, so it explodes and misleads whenever actuals approach zero (constant in SKU and intermittent data). WAPE = total absolute error / total actual volume —
|
|
55
|
-
- **Pair WAPE with bias.** WAPE
|
|
56
|
-
- **MASE < 1.0 is the pass/fail line.** MASE is scale-free
|
|
57
|
-
- **Rolling-origin, never a single holdout.** Time-series CV repeats the train/test split across multiple cutoffs (expanding window),
|
|
58
|
-
- **Always emit an interval.** A point forecast cannot express uncertainty, and point metrics cannot evaluate a distribution. Report `level=[80]` or `[95]`. The interval is not optional polish
|
|
54
|
+
- **WAPE, not MAPE.** MAPE divides by the actual, so it explodes and misleads whenever actuals approach zero (constant in SKU and intermittent data). WAPE = total absolute error / total actual volume — volume-weighted and stable. It is the default magnitude metric.
|
|
55
|
+
- **Pair WAPE with bias.** WAPE is *how big* the error is; bias is the *direction* — whether you systematically over- or under-forecast. A 10% WAPE with +9% bias means you are almost always forecasting high, an actionable problem quite different from random error.
|
|
56
|
+
- **MASE < 1.0 is the pass/fail line.** MASE is scale-free: your error over the naive forecast's error. Below 1.0 you beat naive; at or above it, ship the naive forecast instead. The single most important number in the readout.
|
|
57
|
+
- **Rolling-origin, never a single holdout.** Time-series CV repeats the train/test split across multiple cutoffs (expanding window), a far more reliable estimate than one lucky/unlucky split. Use `cross_validation(h=…, n_windows=…)`.
|
|
58
|
+
- **Always emit an interval.** A point forecast cannot express uncertainty, and point metrics cannot evaluate a distribution. Report `level=[80]` or `[95]`. The interval is half the deliverable, not optional polish.
|
|
59
59
|
|
|
60
|
-
Formulas (WAPE, MASE, bias, pinball, coverage), rolling-origin mechanics, and how to read a backtest table are in `references/accuracy-and-backtesting.md
|
|
60
|
+
Formulas (WAPE, MASE, bias, pinball, coverage), rolling-origin mechanics, and how to read a backtest table are in [`references/accuracy-and-backtesting.md`](references/accuracy-and-backtesting.md). Per-method when-to-use and the exact statsforecast one-liner for each are in [`references/methods-cheatsheet.md`](references/methods-cheatsheet.md).
|
|
61
61
|
|
|
62
62
|
## Minimal pipeline
|
|
63
63
|
|
|
@@ -116,24 +116,24 @@ out.to_csv("forecast.csv", index=False)
|
|
|
116
116
|
- **Structural breaks.** A pricing change, a relaunch, a regime shift. Do not train across the break — train on the post-break segment, even if it is short, or the model averages two different worlds.
|
|
117
117
|
- **Promotions and outliers.** A promo spike is not baseline demand. Mark promo periods and either model them as a regressor or exclude them from the level estimate; otherwise the forecast inherits a spike that will not recur.
|
|
118
118
|
- **Granularity.** Forecast at the level you act on. If you must report higher, aggregate the forecasts — and check the aggregate is plausible (this often catches per-SKU nonsense).
|
|
119
|
-
- **Hierarchy reconciliation.** When SKU forecasts must sum to a category total, reconcile (bottom-up or MinT). Brief note here; the mechanics belong in `references/methods-cheatsheet.md
|
|
119
|
+
- **Hierarchy reconciliation.** When SKU forecasts must sum to a category total, reconcile (bottom-up or MinT). Brief note here; the mechanics belong in [`references/methods-cheatsheet.md`](references/methods-cheatsheet.md).
|
|
120
120
|
|
|
121
121
|
## Anti-patterns
|
|
122
122
|
|
|
123
|
-
|
|
|
123
|
+
| Anti-pattern | Why it bites | Do instead |
|
|
124
124
|
|---|---|---|
|
|
125
|
-
| Report a single point number |
|
|
126
|
-
| Tune ARIMA orders before any baseline |
|
|
127
|
-
| Score with MAPE on intermittent demand |
|
|
128
|
-
| Single train/test holdout |
|
|
129
|
-
| Fit a model on 8 months of monthly data |
|
|
130
|
-
| "The model picked it, so it's right" |
|
|
131
|
-
| Trust SKU forecasts without checking the sum |
|
|
125
|
+
| Report a single point number | A point hides uncertainty the reader needs to plan around. | Report point + 80/95% interval |
|
|
126
|
+
| Tune ARIMA orders before any baseline | If you cannot beat the free baseline, the tuning was wasted. | Compute naive/seasonal-naive first |
|
|
127
|
+
| Score with MAPE on intermittent demand | MAPE explodes near zero actuals and lies about accuracy. | Use WAPE + bias |
|
|
128
|
+
| Single train/test holdout | One split is one sample; CV estimates real out-of-sample error. | Rolling-origin CV (`n_windows≥3`) |
|
|
129
|
+
| Fit a model on 8 months of monthly data | Too few points; the model overfits and underreports its own error. | SeasonalNaive only under 2 cycles |
|
|
130
|
+
| "The model picked it, so it's right" | A forecast you cannot defend is worse than no forecast. | State method + MASE vs naive |
|
|
131
|
+
| Trust SKU forecasts without checking the sum | Per-SKU errors compound; the total exposes nonsense fast. | Sanity-check vs the aggregate |
|
|
132
132
|
|
|
133
133
|
## Handoffs
|
|
134
134
|
|
|
135
135
|
- **`../inventory/SKILL.md`** — feed it the demand number; it sizes reorder points and safety stock. Forecasting produces the demand; it does not size the stock.
|
|
136
136
|
- **`../financial-model/SKILL.md`** — when the projection is driven by *assumptions and drivers* (pricing, hiring), not history, that is a model, not a forecast.
|
|
137
137
|
- **`../unit-economics/SKILL.md`** — contribution margin, CAC/LTV, payback. No time series, route there.
|
|
138
|
-
-
|
|
138
|
+
- **`../data-cleaning/SKILL.md`** — dirty input (dupes, missing rows, mixed units) goes here *before* you model.
|
|
139
139
|
- **`../analyze/SKILL.md`** — when the question is "why" or a backward-looking metric/aggregation rather than forward extrapolation.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: game-storytelling
|
|
3
|
-
description: "Use when
|
|
3
|
+
description: "Use when a game's story is the work: premise and pillars, branching topology, meaningful choice, dialogue state, quests, environmental storytelling, ludonarrative harmony. Author portable — engine wiring is `godot`/`unity`/`unreal`. NOT the mechanics and economy the story serves (that is `game-design`), NOT level layout (that is `level-design`)."
|
|
4
4
|
tags: [game, narrative, story, dialogue, quest, branching, worldbuilding]
|
|
5
5
|
recommends: [game-design, level-design]
|
|
6
6
|
profiles: [full]
|
|
@@ -9,23 +9,11 @@ origin: risco
|
|
|
9
9
|
|
|
10
10
|
# Game Storytelling — Narrative Design (engine-agnostic)
|
|
11
11
|
|
|
12
|
-
*Design the story as a system the player operates, not a script they watch. This skill owns the narrative graph — premise, pillars, branches, choices, dialogue state, quests, and the storytelling embedded in the world
|
|
12
|
+
*Design the story as a system the player operates, not a script they watch. This skill owns the narrative graph — premise, pillars, branches, choices, dialogue state, quests, and the storytelling embedded in the world.*
|
|
13
13
|
|
|
14
|
-
You produce **design artifacts**: a premise/theme/pillars doc, a branch topology, a state/flag table, dialogue in a portable format (Ink/Yarn/Twee/articy), quest specs, and environmental beats.
|
|
14
|
+
You produce **design artifacts**: a premise/theme/pillars doc, a branch topology, a state/flag table, dialogue in a portable format (Ink/Yarn/Twee/articy), quest specs, and environmental beats. Story is a **system in service of play**; when you catch yourself designing a great scene the mechanics can't honor, reconcile it (see Ludonarrative harmony) rather than ship the dissonance.
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
Use when the request is about: a game's story or premise; branching or non-linear narrative; a dialogue system, tree, or conversation logic; quests, objectives, or mission structure; worldbuilding/lore for a game; meaningful choice vs. the illusion of choice; environmental or systemic storytelling; or story that "fights" the gameplay (ludonarrative dissonance).
|
|
19
|
-
|
|
20
|
-
Do NOT use (delegate or decline):
|
|
21
|
-
|
|
22
|
-
- Core loop, verbs, systems, progression, economy, difficulty, or balance → **game-design**.
|
|
23
|
-
- Spatial layout, encounter placement, sightlines, blockout, pacing *of a space* → **level-design**.
|
|
24
|
-
- Implementing the dialogue runner, save/serialize of story state, or wiring Ink/Yarn/articy into a build → the engine skill (**godot/unity/unreal**).
|
|
25
|
-
- Prose fiction, a screenplay, or a novel with no interactive/branching structure → general writing.
|
|
26
|
-
- Marketing copy, store page, or trailer script → **marketing**.
|
|
27
|
-
|
|
28
|
-
Story is a **system in service of play**. When you catch yourself designing a great scene the mechanics can't honor, reconcile it (see Ludonarrative harmony) rather than ship the dissonance.
|
|
16
|
+
Boundaries: **game-design** owns what the player *does* — core loop, verbs, systems, progression, economy, difficulty, balance — and the story serves those verbs; call it when resolving dissonance needs a *mechanic* change, or when designing the conditions for systemic/emergent story. **level-design** owns spatial layout, encounter placement, sightlines, blockout and the pacing *of a space* — the space environmental storytelling lives inside; co-own the set-dressing. **godot / unity / unreal** implement the dialogue runner, quest state, save-serialization of story state, and the Ink/Yarn/articy plugin glue — author portable, they wire it. **marketing** owns the store page, premise pitch and trailer copy (external-facing, not in-game narrative). Prose fiction, a screenplay, or a novel with no interactive/branching structure is general writing, not this skill.
|
|
29
17
|
|
|
30
18
|
## Premise, theme, and pillars (do this first)
|
|
31
19
|
|
|
@@ -119,25 +107,18 @@ Deliver story *through the world* so the player assembles it and feels ownership
|
|
|
119
107
|
- **VO considerations** *(design-side, not recording — that's audio/engine)* — write for the ear (contractions, short clauses); budget line counts early (VO is expensive and near-frozen once recorded); keep a **stable line ID** on every spoken line; don't splice recorded fragments across variables (gender/number/name concatenation breaks in most languages).
|
|
120
108
|
- **Localization-readiness** *(so the loc pipeline can do its job)* — externalize all player-facing text to string tables keyed by stable id; **never concatenate** sentences or embed grammar in code (gender/plural/word-order differ per language — use full templated strings with ICU-style placeholders); allow +30–40% text expansion; keep variables as named tokens (`{playerName}`), not positional; leave translator notes per line.
|
|
121
109
|
|
|
122
|
-
## Anti-patterns
|
|
110
|
+
## Anti-patterns
|
|
123
111
|
|
|
124
|
-
|
|
|
112
|
+
| Anti-pattern | Do instead |
|
|
125
113
|
| --- | --- |
|
|
126
|
-
|
|
|
127
|
-
|
|
|
128
|
-
|
|
|
129
|
-
|
|
|
130
|
-
|
|
|
131
|
-
| "
|
|
132
|
-
|
|
|
133
|
-
|
|
|
134
|
-
|
|
135
|
-
## Related skills
|
|
136
|
-
|
|
137
|
-
- **game-design** — the verbs, systems, economy, and balance the story must serve; call it when resolving dissonance needs a *mechanic* change, or when designing systemic/emergent story conditions.
|
|
138
|
-
- **level-design** — the spatial layout and encounter flow environmental storytelling lives inside; co-own set-dressing narrative.
|
|
139
|
-
- **godot / unity / unreal** — the engine that wires the dialogue runner, quest state, save/serialize, and Ink/Yarn/articy plugins. Author portable; they implement.
|
|
140
|
-
- **marketing** — store page, premise pitch, trailer copy (external-facing, not in-game narrative).
|
|
114
|
+
| Branching everything because "players love choices" | Pure trees explode (2^N). Use foldback + gates; reconverge on beats. |
|
|
115
|
+
| A choice that feels huge but no later node reads it back | If no later node reads the flag, the choice is noise. Show the consequence or cut it. |
|
|
116
|
+
| Both options lead to the same scene, and it's sold as a big decision | Fine as expression, not as stakes. Never sell a fake choice as consequential. |
|
|
117
|
+
| Explaining in the story why he's a mass murderer | Words don't beat verbs. Fix the ludonarrative dissonance, don't narrate around it. |
|
|
118
|
+
| Adding an audio log to explain the backstory | Text-dump is the fallback. Try to *show* it environmentally first. |
|
|
119
|
+
| Hardcoding strings, "we'll localize later" | Concatenation and hardcoded text break loc. Externalize to keyed string tables now. |
|
|
120
|
+
| A quest that can't be failed because it's simpler that way | Sometimes right; but soft-locking the game on a missed step is a defect — leave an escape. |
|
|
121
|
+
| Wiring the Ink file into Unity here | Not this skill. Author portable narrative; hand wiring to the engine skill. |
|
|
141
122
|
|
|
142
123
|
## Checklist
|
|
143
124
|
|
|
@@ -151,9 +132,3 @@ Deliver story *through the world* so the player assembles it and feels ownership
|
|
|
151
132
|
- [ ] Environmental/diegetic delivery preferred over text-dumps and non-diegetic narration where the world can carry it.
|
|
152
133
|
- [ ] All player-facing text externalized to keyed string tables; no concatenation; variables are named tokens; +30–40% expansion allowed.
|
|
153
134
|
- [ ] VO lines have stable IDs, are written for the ear, and the script is locked before recording is proposed.
|
|
154
|
-
|
|
155
|
-
## References
|
|
156
|
-
|
|
157
|
-
- `references/branching-and-state.md` — topologies + diagrams, meaningful vs. illusory choice, state modeling, and the combinatorial-explosion containment kit.
|
|
158
|
-
- `references/dialogue-tools.md` — Ink/Yarn/Twine/articy compared, the four primitives, a "pick one" guide, and the same conversation in three formats.
|
|
159
|
-
- `references/environmental-storytelling.md` — show-don't-tell catalog, diegetic vs. non-diegetic delivery, systemic/emergent storytelling and the anecdote factory.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gamedev-shipping
|
|
3
|
-
description: "Use when exporting,
|
|
3
|
+
description: "Use when exporting, packaging, signing, or publishing a game — export presets per engine, macOS notarization, cross-origin isolation for threaded web builds, Android AAB/keystore, iOS provisioning, store submission (Steam, Play, App Store, itch.io), headless build CI. NOT gameplay code inside the artifact (that is `godot`, `unity`, `unreal`), NOT hosting a web app or container (that is `deployment`)."
|
|
4
4
|
tags: [export, build, release, packaging, store, steam, itch, notarization, webassembly, aab]
|
|
5
5
|
recommends: [godot, unity, unreal, deployment]
|
|
6
6
|
profiles: [full]
|
|
@@ -29,21 +29,14 @@ Godot templates·Unity Build Profiles·Unreal Shipping desktop·web·mobile
|
|
|
29
29
|
| Android | JDK **17**, target a recent API level | AAB required for Google Play (new apps + updates). APK only for sideload/itch/direct. |
|
|
30
30
|
| iOS/macOS | Xcode 16+, `notarytool` | `altool` notarization is dead — use `xcrun notarytool`. |
|
|
31
31
|
|
|
32
|
-
## When to use
|
|
32
|
+
## When NOT to use — and who owns it instead
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
-
|
|
40
|
-
- Automating headless exports in CI, or setting version/build numbers.
|
|
41
|
-
- Shrinking build size / startup time before release.
|
|
42
|
-
|
|
43
|
-
**NOT for (route elsewhere, say so, stop):**
|
|
44
|
-
- Writing gameplay, shaders, netcode, or any runtime logic → the **engine** skill (`godot`/`unity`/`unreal`) or `gamedev-shaders`/`gamedev-multiplayer`. This skill packages code; it does not write it.
|
|
45
|
-
- Hosting a normal web app, API, or container (Dockerfile, Coolify, Vercel, VPS) → **`deployment`**. A WebAssembly game is *static files*; only its **headers** are special (below).
|
|
46
|
-
- Designing game feel, economy, or narrative → `game-design` / `game-storytelling`.
|
|
34
|
+
| Ask | Owner | Why the line is there |
|
|
35
|
+
| --- | --- | --- |
|
|
36
|
+
| Gameplay, shaders, netcode, physics — any runtime logic | `../godot/SKILL.md`, `../unity/SKILL.md`, `../unreal/SKILL.md`, `../gamedev-shaders/SKILL.md`, `../gamedev-multiplayer/SKILL.md`, `../gamedev-physics/SKILL.md` | This skill packages code, it does not write it. The boundary is the export button. |
|
|
37
|
+
| Hosting a normal web app, API or container (Dockerfile, Coolify, Vercel, VPS) | `../deployment/SKILL.md` | A WebAssembly game is *static files*; only its **headers** are special (below). Borrow its Actions + header-setting patterns. |
|
|
38
|
+
| Game feel, economy, narrative | `../game-design/SKILL.md`, `../game-storytelling/SKILL.md` | Design intent, not packaging. |
|
|
39
|
+
| Signing-key and CI secret handling in general | `../secure-coding/SKILL.md` | The practice this skill assumes for keystores/certs. |
|
|
47
40
|
|
|
48
41
|
## Decision rules (settle these before touching a build)
|
|
49
42
|
|
|
@@ -96,7 +89,8 @@ RunUAT BuildCookRun -project="Game.uproject" -platform=Win64 \
|
|
|
96
89
|
Android adds `-distribution` for an AAB; iOS requires a Mac + provisioning. Run the platform
|
|
97
90
|
**Turnkey**/SDK setup once (Android Studio + NDK, or Xcode) or the cook fails.
|
|
98
91
|
|
|
99
|
-
→ full per-engine preset/flag tables:
|
|
92
|
+
→ full per-engine preset/flag tables: [references/mobile-and-desktop.md](references/mobile-and-desktop.md)
|
|
93
|
+
and [references/stores-and-ci.md](references/stores-and-ci.md).
|
|
100
94
|
|
|
101
95
|
## Per-platform
|
|
102
96
|
|
|
@@ -141,7 +135,8 @@ files are fine. Where to set them:
|
|
|
141
135
|
`COEP: require-corp` also means every cross-origin subresource (fonts, analytics, embeds) must
|
|
142
136
|
send CORP/CORS or it's blocked. **Godot C#/.NET has no web export at all** — use GDScript.
|
|
143
137
|
|
|
144
|
-
→
|
|
138
|
+
→ per-host configs, the service-worker shim, COEP subresource fallout, a self-test snippet and the
|
|
139
|
+
Godot vs Unity web specifics: [references/web-export-headers.md](references/web-export-headers.md).
|
|
145
140
|
|
|
146
141
|
### Mobile
|
|
147
142
|
|
|
@@ -162,7 +157,8 @@ Keep the keystore + passwords out of git (CI secret). `versionCode` must increas
|
|
|
162
157
|
then upload to App Store Connect / TestFlight via Xcode Organizer or **Transporter**. `CFBundleVersion`
|
|
163
158
|
must increase per upload.
|
|
164
159
|
|
|
165
|
-
→ full keystore
|
|
160
|
+
→ full keystore + Play App Signing, provisioning/TestFlight, Windows Authenticode and Linux
|
|
161
|
+
AppImage/Flatpak walkthroughs: [references/mobile-and-desktop.md](references/mobile-and-desktop.md).
|
|
166
162
|
|
|
167
163
|
## Store prep
|
|
168
164
|
|
|
@@ -174,7 +170,8 @@ must increase per upload.
|
|
|
174
170
|
- **itch.io**: `butler push build/ user/game:channel --userversion 1.2.3` — channel name (e.g. `windows`, `html5`) picks the platform.
|
|
175
171
|
- **Mac App Store**: Apple Distribution cert + App Sandbox entitlements (not Developer ID); notarization is handled by App Store submission.
|
|
176
172
|
|
|
177
|
-
→ Steamworks/SteamPipe VDF, butler channels, Play/App Store checklists:
|
|
173
|
+
→ Steamworks/SteamPipe VDF, butler channels, Play/App Store submission checklists:
|
|
174
|
+
[references/stores-and-ci.md](references/stores-and-ci.md).
|
|
178
175
|
|
|
179
176
|
## CI/CD for builds
|
|
180
177
|
|
|
@@ -186,7 +183,7 @@ Headless export in GitHub Actions; version from the run/commit so every artifact
|
|
|
186
183
|
- **Signing in CI**: import the keystore/cert from an encrypted secret at runtime, never commit it. macOS notarization runs on a `macos-latest` runner with `notarytool` + an App Store Connect API key.
|
|
187
184
|
- **Versioning**: semver tag for releases; a monotonic build number from `github.run_number` or the git commit count feeds `versionCode`/`CFBundleVersion`/Steam build description.
|
|
188
185
|
|
|
189
|
-
→ ready workflows
|
|
186
|
+
→ ready per-engine workflows with signing: [references/stores-and-ci.md](references/stores-and-ci.md).
|
|
190
187
|
|
|
191
188
|
## Ship-time optimization
|
|
192
189
|
|
|
@@ -195,26 +192,19 @@ Headless export in GitHub Actions; version from the run/commit so every artifact
|
|
|
195
192
|
- **Startup**: small boot scene, stream/preload heavy assets, compress the `.pck`/data, use Ogg Vorbis over WAV. Web: enable gzip/brotli on `.wasm`/`.pck`.
|
|
196
193
|
- **Budgets**: set a per-platform size budget (web especially — every MB is download latency) and check the final artifact against it before submitting.
|
|
197
194
|
|
|
198
|
-
## Anti-patterns
|
|
195
|
+
## Anti-patterns
|
|
199
196
|
|
|
200
|
-
|
|
|
197
|
+
| Anti-pattern | Do instead |
|
|
201
198
|
| --- | --- |
|
|
202
|
-
|
|
|
203
|
-
|
|
|
204
|
-
|
|
|
205
|
-
|
|
|
206
|
-
|
|
|
207
|
-
|
|
|
208
|
-
|
|
|
209
|
-
|
|
|
210
|
-
|
|
|
211
|
-
|
|
212
|
-
## Related skills
|
|
213
|
-
|
|
214
|
-
- `godot`, `unity`, `unreal` — write the game; this skill exports/ships what they build. Draw the line at the export button.
|
|
215
|
-
- `deployment` — Docker/CI/hosting for **web apps & APIs**; borrow its GitHub Actions + header-setting patterns, but a WebAssembly game is static files, not a container.
|
|
216
|
-
- `gamedev-shaders`, `gamedev-multiplayer`, `gamedev-physics` — runtime subsystems packaged into the ship artifact, not configured here.
|
|
217
|
-
- `secure-coding` — signing-key and secret handling this skill assumes for keystores/certs in CI.
|
|
199
|
+
| Web build works locally, host it later | Set COOP/COEP now; `file://` and simple servers hide the `SharedArrayBuffer` failure. |
|
|
200
|
+
| Planning a Godot C# web export | It doesn't exist in 4.x. GDScript for web, or no web. |
|
|
201
|
+
| Treating notarization as optional | On macOS, no notarize + staple = Gatekeeper blocks the app for every user. |
|
|
202
|
+
| Shipping an APK to the Play Store | Play requires **AAB** for new apps and updates. |
|
|
203
|
+
| Committing the keystore so CI can sign | Keystore/cert live in encrypted CI secrets, never in git. |
|
|
204
|
+
| Shipping the Development/Debug config | Ship Godot release / Unity IL2CPP release / Unreal **Shipping** — debug leaks console + is slow. |
|
|
205
|
+
| Export templates "close enough" (4.5 vs 4.5.1) | Godot templates must match the editor build exactly or export breaks. |
|
|
206
|
+
| Uncompressed textures | Per-platform compression (ASTC/BCn/ETC2) — raw textures blow memory + size. |
|
|
207
|
+
| Reusing an old versionCode/CFBundleVersion | Both must strictly increase or the store rejects the upload. |
|
|
218
208
|
|
|
219
209
|
## Checklist
|
|
220
210
|
|
|
@@ -228,9 +218,3 @@ Headless export in GitHub Actions; version from the run/commit so every artifact
|
|
|
228
218
|
- [ ] Store assets: icons, splash, screenshots, metadata, age rating done.
|
|
229
219
|
- [ ] Version/build number set from CI and traceable.
|
|
230
220
|
- [ ] Textures compressed per platform; build size within budget.
|
|
231
|
-
|
|
232
|
-
## References
|
|
233
|
-
|
|
234
|
-
- `references/web-export-headers.md` — cross-origin isolation deep dive: COOP/COEP per host (Netlify/Vercel/nginx/itch/GitHub Pages), the `coi-serviceworker` shim, COEP subresource fallout, self-test snippet, Godot vs Unity web specifics.
|
|
235
|
-
- `references/mobile-and-desktop.md` — Android keystore + Gradle template + Play App Signing; iOS provisioning/TestFlight; full macOS codesign→notarytool→staple; Windows Authenticode; Linux AppImage/Flatpak.
|
|
236
|
-
- `references/stores-and-ci.md` — Steamworks/SteamPipe VDF upload, itch.io butler channels, Play/App Store submission checklists, and per-engine GitHub Actions headless-build workflows with signing.
|
package/skills/godot/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: godot
|
|
3
|
-
description: "Use when writing, reviewing, or debugging Godot 4.x games in GDScript
|
|
3
|
+
description: "Use when writing, reviewing, or debugging Godot 4.x games in GDScript or C# — scenes, nodes, custom Resources, autoload/EventBus signals, typed GDScript, CharacterBody2D/3D movement, GUT/gdUnit4 — or porting Godot 3 APIs to 4. NOT Unity/Unreal (that is `unity`/`unreal`), NOT `.gdshader` code (`gamedev-shaders`), NOT GDExtension C++ tooling (`cpp`)."
|
|
4
4
|
tags: [godot, gdscript, game-dev, csharp, godot4]
|
|
5
5
|
recommends: [gamedev-shaders, gamedev-multiplayer, gamedev-physics, gamedev-pathing, gamedev-shipping, game-design, cpp]
|
|
6
6
|
profiles: [full]
|
|
@@ -9,9 +9,9 @@ origin: risco
|
|
|
9
9
|
|
|
10
10
|
# Godot 4.x (GDScript + C#)
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
Build 2D and 3D the way the engine is designed: scenes as reusable units, composition over deep node
|
|
13
|
+
trees, signals for decoupling, static typing for speed and safety. GDScript (typed) is primary; C#
|
|
14
|
+
parity snippets sit beside it.
|
|
15
15
|
|
|
16
16
|
## Version contract — read first
|
|
17
17
|
|
|
@@ -111,8 +111,11 @@ Keep gameplay logic in nodes; let the bus carry the *notification*, not the beha
|
|
|
111
111
|
children in `_init`.
|
|
112
112
|
- **Prefer unique names**: mark a node **Unique Name in Owner** (`%`) and access `%HealthBar`
|
|
113
113
|
instead of the fragile, refactor-breaking `get_node("../../UI/HealthBar")`. `$Foo` is fine for a
|
|
114
|
-
direct child.
|
|
114
|
+
direct child — `get_node`/`$` on a missing path returns `null` and errors.
|
|
115
115
|
- Cache node lookups in `@onready` vars; don't call `get_node` every frame.
|
|
116
|
+
- **Freeing**: call `queue_free()` (safe, end of frame), not `free()` mid-signal. Guard reused refs
|
|
117
|
+
with `is_instance_valid(node)`.
|
|
118
|
+
- Never busy-wait; `await get_tree().create_timer(1.0).timeout` or `await` a signal.
|
|
116
119
|
|
|
117
120
|
```gdscript
|
|
118
121
|
extends CharacterBody2D
|
|
@@ -286,34 +289,12 @@ like any other library. That is native-tooling territory → pair with `cpp`.
|
|
|
286
289
|
- Validate a project before shipping: open in the editor once (catches broken `.tscn`/`.tres`),
|
|
287
290
|
then export-check per platform. Details → `references/export-and-testing.md`.
|
|
288
291
|
|
|
289
|
-
##
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
## Related skills
|
|
300
|
-
|
|
301
|
-
- [`game-design`](../game-design/SKILL.md) — mechanics, loops, and feel *before* you script them.
|
|
302
|
-
- [`gamedev-shaders`](../gamedev-shaders/SKILL.md) — `.gdshader` / visual shaders (out of scope here).
|
|
303
|
-
- [`gamedev-physics`](../gamedev-physics/SKILL.md) — joints, RigidBody tuning, deep collision layers.
|
|
304
|
-
- [`gamedev-pathing`](../gamedev-pathing/SKILL.md) — NavigationAgent, A*, steering beyond the basics.
|
|
305
|
-
- [`gamedev-multiplayer`](../gamedev-multiplayer/SKILL.md) — `MultiplayerSynchronizer`/RPC/netcode.
|
|
306
|
-
- [`gamedev-shipping`](../gamedev-shipping/SKILL.md) — store builds, signing, platform export at scale.
|
|
307
|
-
- [`cpp`](../cpp/SKILL.md) — the GDExtension / `godot-cpp` native side and its CMake/build tooling.
|
|
308
|
-
|
|
309
|
-
## Checklist
|
|
310
|
-
|
|
311
|
-
- [ ] Zero Godot 3 APIs — checked every line against the ban-list (`yield`/`onready`/`instance()`/`KinematicBody`/`Spatial`/string `connect`/`File`).
|
|
312
|
-
- [ ] `move_and_slide()` called with **no args**; `velocity` set as a property; not multiplied by `delta` twice.
|
|
313
|
-
- [ ] Overridden lifecycle methods call `super()` where a base defines them.
|
|
314
|
-
- [ ] Signals connected via Callable (`x.sig.connect(_on_x)`), named past-tense, disconnected/one-shot where needed.
|
|
315
|
-
- [ ] Everything typed (`:` / `:=`, typed params/returns, typed Arrays); no stray `Variant`.
|
|
316
|
-
- [ ] Physics in `_physics_process`, visuals in `_process`; rate-based values scaled by `delta`.
|
|
317
|
-
- [ ] Node access via `@onready` + `%UniqueName`, not deep `get_node("../..")` chains.
|
|
318
|
-
- [ ] `.tscn`/`.tres` not hand-corrupted; project opens in-editor before export.
|
|
319
|
-
- [ ] C# snippets use `partial`, `[Export]`/`[Signal]`, `base._Ready()`, PascalCase (if C# requested).
|
|
292
|
+
## Hand off to
|
|
293
|
+
|
|
294
|
+
Mechanics, loops, and feel *before* you script them → [`game-design`](../game-design/SKILL.md).
|
|
295
|
+
`.gdshader` / visual shaders → [`gamedev-shaders`](../gamedev-shaders/SKILL.md). Joints, RigidBody
|
|
296
|
+
tuning, deep collision layers → [`gamedev-physics`](../gamedev-physics/SKILL.md). NavigationAgent,
|
|
297
|
+
A*, steering → [`gamedev-pathing`](../gamedev-pathing/SKILL.md). `MultiplayerSynchronizer`/RPC/netcode
|
|
298
|
+
→ [`gamedev-multiplayer`](../gamedev-multiplayer/SKILL.md). Store builds, signing, platform export at
|
|
299
|
+
scale → [`gamedev-shipping`](../gamedev-shipping/SKILL.md). The GDExtension / `godot-cpp` native side
|
|
300
|
+
and its CMake/build tooling → [`cpp`](../cpp/SKILL.md).
|