@ericrisco/rsc 0.1.48 → 0.1.49
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 +19 -19
- package/package.json +1 -1
- package/skills/domains-dns/SKILL.md +2 -17
- package/skills/drizzle-orm/SKILL.md +1 -4
- package/skills/duckdb/SKILL.md +12 -18
- package/skills/dynamodb/SKILL.md +27 -40
- package/skills/e-signature/SKILL.md +9 -9
- package/skills/electron/SKILL.md +12 -24
- package/skills/elixir/SKILL.md +6 -14
- package/skills/email-deliverability/SKILL.md +9 -29
- package/skills/embeddings-search/SKILL.md +10 -19
- package/skills/expo/SKILL.md +30 -45
- package/skills/fal/SKILL.md +2 -16
- package/skills/finance-ops/SKILL.md +5 -13
- package/skills/financial-model/SKILL.md +17 -35
- package/skills/finetuning/SKILL.md +7 -19
- package/skills/firebase/SKILL.md +19 -33
- package/skills/fly-io/SKILL.md +4 -13
- package/skills/fundraising/SKILL.md +5 -14
- package/skills/game-design/SKILL.md +9 -33
package/skills/elixir/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: elixir
|
|
3
|
-
description: "Use when writing or refactoring Elixir/OTP
|
|
3
|
+
description: "Use when writing or refactoring Elixir/OTP on the BEAM — GenServers, supervision trees and restart strategies, pattern matching, mix projects and releases — or when processes misbehave (restart loops, mailbox growth, call timeouts). NOT a Phoenix web app, LiveView, Ecto or channels (that is `phoenix`)."
|
|
4
4
|
tags: [elixir, otp, genserver, supervision, beam, mix, concurrency, functional]
|
|
5
5
|
recommends: [phoenix, postgresdb, docker]
|
|
6
6
|
origin: risco
|
|
@@ -14,7 +14,7 @@ Default to **pure functions**. Most of your code is data transformation and need
|
|
|
14
14
|
|
|
15
15
|
## Decision: do you even need a process?
|
|
16
16
|
|
|
17
|
-
A process is not "an object"
|
|
17
|
+
A process is not "an object": spawning one to hold a value you could pass as an argument is the most common beginner mistake, and it adds a serialization bottleneck and a failure mode for nothing.
|
|
18
18
|
|
|
19
19
|
| Situation | Use | Why |
|
|
20
20
|
|---|---|---|
|
|
@@ -28,8 +28,6 @@ Rule: if two pieces of code never run at the same time and share no mutable stat
|
|
|
28
28
|
|
|
29
29
|
## The functional core
|
|
30
30
|
|
|
31
|
-
Each rule below earns its place; the why is one line.
|
|
32
|
-
|
|
33
31
|
**Match in function heads, not with `if`** — branches become exhaustive and self-documenting, and a non-match crashes loudly instead of silently falling through.
|
|
34
32
|
|
|
35
33
|
```elixir
|
|
@@ -80,13 +78,11 @@ end
|
|
|
80
78
|
|
|
81
79
|
## Processes and message passing
|
|
82
80
|
|
|
83
|
-
Raw `spawn`/`send`/`receive` exists, but in production you almost always want an OTP behaviour (GenServer/Task/Agent) so you get `child_spec`, supervision, and shutdown handling for free.
|
|
81
|
+
Raw `spawn`/`send`/`receive` exists and is fine for a throwaway fire-and-forget where supervision genuinely does not matter, but in production you almost always want an OTP behaviour (GenServer/Task/Agent) so you get `child_spec`, supervision, and shutdown handling for free.
|
|
84
82
|
|
|
85
83
|
- **Link** (`spawn_link`) couples lifetimes: if one dies abnormally, the other gets an exit signal. This is how supervision works.
|
|
86
84
|
- **Monitor** (`Process.monitor/1`) is one-directional and non-fatal: you get a `{:DOWN, ...}` message but you do not die. Use it when you care *that* something died but should survive it.
|
|
87
85
|
|
|
88
|
-
Drop to raw processes only for a throwaway fire-and-forget where supervision genuinely does not matter; otherwise reach for OTP.
|
|
89
|
-
|
|
90
86
|
## GenServer
|
|
91
87
|
|
|
92
88
|
Split the **client API** (runs in the caller) from the **server callbacks** (run in the GenServer process). Callers never touch state directly.
|
|
@@ -124,11 +120,9 @@ defmodule Counter do
|
|
|
124
120
|
end
|
|
125
121
|
```
|
|
126
122
|
|
|
127
|
-
Rules, each with its why:
|
|
128
|
-
|
|
129
123
|
- **Never block in `init/1`.** `start_link` blocks until `init` returns, so a slow `init` stalls the whole supervision tree boot. Return `{:ok, state, {:continue, term}}` and do the work in `handle_continue/2`.
|
|
130
124
|
- **`use GenServer` auto-defines `child_spec/1`** — you rarely write one by hand; override only to change `:restart` or `:shutdown`.
|
|
131
|
-
- **`call` is synchronous (with a 5s default timeout), `cast` is fire-and-forget.** Use `call` when the caller needs the result or backpressure; `cast` when it does not. A flood of `cast`s with no backpressure is the classic mailbox-growth bug —
|
|
125
|
+
- **`call` is synchronous (with a 5s default timeout), `cast` is fire-and-forget.** Use `call` when the caller needs the result or backpressure; `cast` when it does not. A flood of `cast`s with no backpressure is the classic mailbox-growth bug — timeouts and backpressure recipes in `references/otp-patterns.md`.
|
|
132
126
|
- **Name via `Registry`, not a global atom**, when you have many dynamic instances — atoms are never garbage-collected (see anti-patterns).
|
|
133
127
|
|
|
134
128
|
## Supervision trees
|
|
@@ -164,7 +158,7 @@ end
|
|
|
164
158
|
|
|
165
159
|
**Let it crash**: do not wrap business logic in `try/rescue` to keep a process alive. Validate inputs at the boundary, then trust the happy path; if an invariant breaks, crashing and restarting from a known-good `init` state is the recovery mechanism. Reserve `rescue` for boundaries where you must convert an exception into a tagged tuple for a caller.
|
|
166
160
|
|
|
167
|
-
For runtime-spawned children (a worker per connection/job) use `DynamicSupervisor` + `Registry` for lookup. Full recipe in references/otp-patterns.md
|
|
161
|
+
For runtime-spawned children (a worker per connection/job) use `DynamicSupervisor` + `Registry` for lookup. Full recipe — plus `Task`, `Agent`, `:ets` and how to choose an OTP behaviour — in `references/otp-patterns.md`.
|
|
168
162
|
|
|
169
163
|
## mix project
|
|
170
164
|
|
|
@@ -189,7 +183,7 @@ MIX_ENV=prod mix release
|
|
|
189
183
|
_build/prod/rel/my_app/bin/my_app start
|
|
190
184
|
```
|
|
191
185
|
|
|
192
|
-
|
|
186
|
+
`mix.exs` anatomy, deps, environments, env vars, releases and the umbrella decision live in `references/mix-and-releases.md`.
|
|
193
187
|
|
|
194
188
|
## Types and modern stdlib
|
|
195
189
|
|
|
@@ -213,5 +207,3 @@ Deps anatomy, environments, env vars, and the umbrella decision live in referenc
|
|
|
213
207
|
## Verify
|
|
214
208
|
|
|
215
209
|
Run `scripts/verify.sh` from your mix project root (the directory containing `mix.exs`). It checks `mix format --check-formatted` and `mix compile --warnings-as-errors`, and skips cleanly with exit 0 when Elixir/mix is not installed so it never blocks a toolchain-free CI.
|
|
216
|
-
|
|
217
|
-
See references/otp-patterns.md (DynamicSupervisor+Registry, Task, Agent, ETS, timeouts/backpressure, choosing an OTP behaviour) and references/mix-and-releases.md (mix.exs anatomy, config vs runtime, releases, umbrellas).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: email-deliverability
|
|
3
|
-
description: "Use when mail
|
|
3
|
+
description: "Use when mail already sent lands in spam, is rejected, or fails the Gmail/Yahoo bulk-sender checks and the fix is authentication and reputation, not the sending code: SPF/DKIM/DMARC alignment, domain warmup, spam-complaint rate, one-click unsubscribe, BIMI. NOT putting mail on the wire through a provider API (that is `email-connector`)."
|
|
4
4
|
tags: [email, deliverability, spf, dkim, dmarc, bimi, sender-reputation, bulk-sender]
|
|
5
5
|
recommends: [email-connector, newsletter, cold-outreach, gdpr-privacy, data-policy]
|
|
6
6
|
origin: risco
|
|
@@ -9,34 +9,26 @@ origin: risco
|
|
|
9
9
|
# email-deliverability — make mail authenticate and land in the inbox
|
|
10
10
|
|
|
11
11
|
This skill owns one layer: **why mail you already send gets filtered, deferred,
|
|
12
|
-
or rejected, and the DNS + reputation work that fixes it.** It
|
|
13
|
-
|
|
14
|
-
succeeds but the message never reaches the inbox.
|
|
12
|
+
or rejected, and the DNS + reputation work that fixes it.** It starts where the
|
|
13
|
+
send technically succeeds but the message never reaches the inbox.
|
|
15
14
|
|
|
16
15
|
The lever is almost never the sending code. It is three DNS records that must
|
|
17
16
|
*align*, a complaint rate you must hold down, and a reputation you build slowly
|
|
18
17
|
and lose fast. Treat this as ops on a domain, not a code change.
|
|
19
18
|
|
|
20
|
-
##
|
|
21
|
-
|
|
22
|
-
**Use when:** mail lands in spam or Promotions and you suspect auth/reputation,
|
|
23
|
-
not copy; a receiver returns `550 5.7.26` (unauthenticated), `421`/`451`
|
|
24
|
-
deferrals, or `dmarc=fail`; you must meet the Gmail/Yahoo bulk-sender rules
|
|
25
|
-
before a launch; you are standing up a brand-new sending domain and need a
|
|
26
|
-
warmup plan; Google Postmaster Tools shows a rising spam rate or "Bad" domain
|
|
27
|
-
reputation; you want the brand logo and a verified checkmark to show in Gmail
|
|
28
|
-
(BIMI + VMC/CMC).
|
|
29
|
-
|
|
30
|
-
**Do NOT use for:**
|
|
19
|
+
## Not this skill
|
|
31
20
|
|
|
32
21
|
- **Sending the mail at all** — provider SDK, `sendEmail()` seam, templates,
|
|
33
|
-
retries, batch caps, bounce/complaint webhooks →
|
|
34
|
-
feeds the suppression list; this one explains the reputation it
|
|
22
|
+
retries, batch caps, bounce/complaint webhooks → `../email-connector/SKILL.md`.
|
|
23
|
+
That skill feeds the suppression list; this one explains the reputation it
|
|
24
|
+
protects.
|
|
35
25
|
- **Subject lines, open/click optimization, list growth** → `newsletter`.
|
|
36
26
|
- **Outbound prospecting sequences, lead lists** → `cold-outreach` (deliverability
|
|
37
27
|
is a *constraint* on it, not the same job).
|
|
38
28
|
- **Consent, lawful basis, retention of the address list** → `gdpr-privacy` and
|
|
39
29
|
`data-policy`. Unsubscribe *mechanics* live here; consent *law* does not.
|
|
30
|
+
- **Handling the DKIM private key and provider API secrets** →
|
|
31
|
+
`../secure-coding/SKILL.md`.
|
|
40
32
|
|
|
41
33
|
## The three records that must align
|
|
42
34
|
|
|
@@ -154,15 +146,3 @@ low-complaint sending.
|
|
|
154
146
|
| Faking transactional headers to dodge Promotions | Violates bulk rules; risks rejection, not just foldering | Accept Promotions placement; earn Primary via engagement |
|
|
155
147
|
| Routing the unsubscribe to a form that takes a week | Breaks the 2-day one-click honor rule; raises complaints | Honor `List-Unsubscribe-Post` one-click within 2 days, automatically |
|
|
156
148
|
| Adding BIMI to fix spam-foldering | BIMI needs DMARC enforcement you do not have yet, and it changes logo display, not placement | Fix auth + reputation first; add BIMI last as a branding layer |
|
|
157
|
-
|
|
158
|
-
## See also
|
|
159
|
-
|
|
160
|
-
- `../email-connector/SKILL.md` — the provider/SDK send path, suppression list,
|
|
161
|
-
and bounce/complaint webhook that this skill's reputation rules sit on top of.
|
|
162
|
-
- `../secure-coding/SKILL.md` — handling the DKIM private key and provider API
|
|
163
|
-
secrets without leaking them.
|
|
164
|
-
|
|
165
|
-
Recommended companions (siblings): `email-connector` for the actual send,
|
|
166
|
-
`newsletter` for the copy/engagement side that drives complaint rate down,
|
|
167
|
-
`cold-outreach` (deliverability gates it), and `gdpr-privacy` / `data-policy`
|
|
168
|
-
for the consent and retention behind a clean list.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: embeddings-search
|
|
3
|
-
description: "Use when
|
|
3
|
+
description: "Use when choosing an embedding model, chunk size, or query form, when semantic search returns irrelevant results, when adding hybrid BM25+vector or a reranker, or when a retrieval change needs a number (recall@k, nDCG, MRR). NOT operating the store — index tuning, quantization (that is `vector-db`) — nor the retrieve-to-answer loop (that is `rag`)."
|
|
4
4
|
tags: [embeddings, semantic-search, chunking, hybrid-search, reranking, rrf, retrieval-eval, mteb, matryoshka]
|
|
5
5
|
recommends: [vector-db, rag, structured-extraction, prompt-engineering, postgresdb]
|
|
6
6
|
origin: risco
|
|
@@ -9,10 +9,9 @@ origin: risco
|
|
|
9
9
|
# embeddings-search — make and judge the vectors
|
|
10
10
|
|
|
11
11
|
You own the **embedding technique layer**: turn a corpus into searchable vectors, turn a
|
|
12
|
-
question into a good retrieval, and **measure whether that retrieval is any good**.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
back, measured by a number. You do not assemble a prompt or generate an answer.
|
|
12
|
+
question into a good retrieval, and **measure whether that retrieval is any good**. You stop the
|
|
13
|
+
moment the right chunks come back, measured by a number. You do not assemble a prompt or
|
|
14
|
+
generate an answer.
|
|
16
15
|
|
|
17
16
|
Route the adjacent surfaces away:
|
|
18
17
|
|
|
@@ -41,7 +40,9 @@ cost — where cost is set by **dimensions**, because dims set storage and memor
|
|
|
41
40
|
|
|
42
41
|
Quality anchor (mid-2026 MTEB English retrieval): Gemini ~68.3, Cohere `embed-v4` ~65.2,
|
|
43
42
|
OpenAI `3-large` ~64.6, `BGE-M3` ~63.0. MTEB is the standard comparison, not a verdict on
|
|
44
|
-
*your* domain
|
|
43
|
+
*your* domain — [`references/models.md`](references/models.md) carries the full model matrix
|
|
44
|
+
(dims, max tokens, price, `input_type` convention, Matryoshka support) and how to read MTEB
|
|
45
|
+
without over-trusting it.
|
|
45
46
|
|
|
46
47
|
Two hard rules — each is a **silent** failure, no error, just worse results:
|
|
47
48
|
|
|
@@ -153,7 +154,9 @@ This is the rigor of the skill. "Search is bad" is not actionable; "recall@10 is
|
|
|
153
154
|
|
|
154
155
|
1. **Build a golden query set** — 30–50+ labeled `query → relevant doc ids` pairs drawn from
|
|
155
156
|
real questions. This is the asset; everything else is reproducible from it.
|
|
156
|
-
2. **Pick metrics**
|
|
157
|
+
2. **Pick metrics** — definitions, a runnable Python eval skeleton, golden-set construction and
|
|
158
|
+
the A/B-one-change methodology are in
|
|
159
|
+
[`references/evaluation.md`](references/evaluation.md):
|
|
157
160
|
- **recall@k** — of the truly relevant docs, how many landed in the top-k. Catches "the
|
|
158
161
|
right chunk never came back."
|
|
159
162
|
- **nDCG@k** — rewards relevant docs ranked higher. Catches "right docs, wrong order."
|
|
@@ -179,15 +182,3 @@ flags hybrid/rerank artifacts that mention no recall/nDCG/MRR for exactly this r
|
|
|
179
182
|
| Over-large dims "for safety" | Doubles storage/RAM, little recall gain | Right-size; truncate via Matryoshka |
|
|
180
183
|
| Re-embedding the corpus to change dims | Wasteful when the model is Matryoshka-trained | Truncate dims, don't re-embed |
|
|
181
184
|
| Embedding raw HTML/boilerplate | Match signal drowns in markup | Embed clean text; keep the rest as metadata |
|
|
182
|
-
|
|
183
|
-
## References & siblings
|
|
184
|
-
|
|
185
|
-
- `references/models.md` — current model matrix (dims, max tokens, price, `input_type`
|
|
186
|
-
convention, Matryoshka support) and how to read MTEB without over-trusting it.
|
|
187
|
-
- `references/evaluation.md` — golden-set construction, recall@k / nDCG@k / MRR definitions, a
|
|
188
|
-
runnable Python eval skeleton, and the A/B-one-change methodology.
|
|
189
|
-
|
|
190
|
-
Siblings: store ops → [`../vector-db/SKILL.md`](../vector-db/SKILL.md) · full answer loop →
|
|
191
|
-
[`../rag/SKILL.md`](../rag/SKILL.md) · typed extraction →
|
|
192
|
-
[`../structured-extraction/SKILL.md`](../structured-extraction/SKILL.md) · prompt design →
|
|
193
|
-
[`../prompt-engineering/SKILL.md`](../prompt-engineering/SKILL.md).
|
package/skills/expo/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: expo
|
|
3
|
-
description: "Use when
|
|
3
|
+
description: "Use when shipping a React Native app with Expo — EAS Build/Submit/Update, eas.json profiles and channels, config plugins, prebuild/CNG, runtime-version policy, OTA updates that never land, SDK upgrades, the New Architecture. NOT RN UI, navigation or native-module authoring (that is `react-native`), NOT a Dart app (that is `flutter`)."
|
|
4
4
|
tags: [expo, eas, react-native, mobile, ota-updates, app-store]
|
|
5
5
|
recommends: [react-native, github-actions, ship, deployment, secure-coding]
|
|
6
6
|
origin: risco
|
|
@@ -13,29 +13,19 @@ origin: risco
|
|
|
13
13
|
Expo is the toolchain and **EAS cloud platform** layered on React Native: cloud
|
|
14
14
|
builds, store submission, over-the-air JS updates, and **native configuration
|
|
15
15
|
declared in JavaScript** instead of hand-edited Xcode/Gradle projects. This skill
|
|
16
|
-
owns the *shipping pipeline* and *native-config-via-JS*.
|
|
17
|
-
navigation, animation, or native-module authoring — that is `react-native`.
|
|
16
|
+
owns the *shipping pipeline* and *native-config-via-JS*.
|
|
18
17
|
|
|
19
18
|
The verb rule of thumb: if the verb is **build / submit / update / prebuild /
|
|
20
19
|
plugin / EAS / channel / runtime-version**, you are in `expo`. If it is **render /
|
|
21
|
-
navigate / animate / bridge / write a native module**, route to react-native
|
|
22
|
-
|
|
20
|
+
navigate / animate / bridge / write a native module**, route to `react-native`.
|
|
21
|
+
Other exits: web React/hooks/state → `react`, a Dart app → `flutter`, native-only
|
|
22
|
+
Swift/Kotlin → `swift-ios`/`kotlin-android`, a desktop wrapper → `tauri`/`electron`,
|
|
23
|
+
CI unrelated to EAS → `github-actions`.
|
|
24
|
+
|
|
25
|
+
Current stable as of 2026-06-02: **Expo SDK 55** — React Native 0.83.1, React
|
|
23
26
|
19.2.0, shipped 2026-02-25. **SDK 56 is in beta** (beta opened 2026-05-06, ~2-week
|
|
24
27
|
window; RN 0.85.2, React 19.2.3) — upcoming, not yet shipped stable. Both run
|
|
25
|
-
exclusively on the New Architecture; the Legacy Architecture was removed in SDK 55.
|
|
26
|
-
|
|
27
|
-
## When to use / when NOT to use
|
|
28
|
-
|
|
29
|
-
**Use when:** wiring `eas.json` profiles or channels; cloud-building `.ipa`/`.aab`/
|
|
30
|
-
`.apk` and debugging EAS Build/credentials/queues; shipping EAS Update OTA JS
|
|
31
|
-
(runtime policy, branches, channels, rollouts/rollbacks); submitting with EAS
|
|
32
|
-
Submit; writing/debugging config plugins or `app.config.{js,ts}`/prebuild; building
|
|
33
|
-
a dev client; EAS Workflows YAML; migrating to the New Architecture or upgrading SDK.
|
|
34
|
-
|
|
35
|
-
**Do NOT use when** the work is pure RN code with no Expo/EAS angle (route to
|
|
36
|
-
react-native), web React/hooks/state (`react`), a Dart app (`flutter`), native-only
|
|
37
|
-
Swift/Kotlin (`swift-ios`/`kotlin-android`), a desktop wrapper (`tauri`/`electron`),
|
|
38
|
-
or generic CI unrelated to EAS (`github-actions`).
|
|
28
|
+
exclusively on the New Architecture; the Legacy Architecture was removed in SDK 55.
|
|
39
29
|
|
|
40
30
|
## Decision rules
|
|
41
31
|
|
|
@@ -91,6 +81,9 @@ stamped with a `channel`; a channel maps to a same-named EAS Update branch by de
|
|
|
91
81
|
}
|
|
92
82
|
```
|
|
93
83
|
|
|
84
|
+
Run `scripts/verify.sh` inside an Expo project to gate `eas.json`, the runtime
|
|
85
|
+
policy, committed secrets, and New-Arch readiness.
|
|
86
|
+
|
|
94
87
|
## EAS Update mental model
|
|
95
88
|
|
|
96
89
|
Runtime version is the **compatibility gate**. An update applies to a build only
|
|
@@ -220,34 +213,26 @@ $50/concurrency/month, up to 5 extra. If a user complains about build queue wait
|
|
|
220
213
|
the fix is usually the plan, not the config. (Pricing per expo.dev/pricing, verified
|
|
221
214
|
2026-06-02; re-check before quoting — Expo adjusts tiers and dollar figures.)
|
|
222
215
|
|
|
223
|
-
## Anti-patterns
|
|
216
|
+
## Anti-patterns
|
|
224
217
|
|
|
225
|
-
|
|
|
218
|
+
| Anti-pattern | Do instead |
|
|
226
219
|
|---|---|
|
|
227
|
-
|
|
|
228
|
-
|
|
|
229
|
-
|
|
|
230
|
-
| "
|
|
231
|
-
|
|
|
232
|
-
|
|
|
233
|
-
|
|
|
234
|
-
|
|
|
235
|
-
|
|
|
236
|
-
|
|
|
220
|
+
| Editing `ios/Info.plist` directly | `prebuild --clean` overwrites it; write a config plugin / `withInfoPlist`. |
|
|
221
|
+
| Hardcoding `runtimeVersion: '1.0.0'` because it is simpler | it drifts from the binary; updates silently stop matching. Use the `fingerprint` policy. |
|
|
222
|
+
| Expecting an OTA update to deliver a bumped native dep | EAS Update is JS-only; native changes need a new `eas build`. |
|
|
223
|
+
| Telling users to "just refresh" when a published update does not land | check the channel→branch and exact runtime match first — wrong channel = no delivery. |
|
|
224
|
+
| Testing a custom native module in Expo Go | Expo Go can't load arbitrary native code; build a dev client. |
|
|
225
|
+
| Upgrading the SDK and building straight to production | run `expo-doctor` + a preview build first; there is no Legacy-Arch fallback to catch a New-Arch-incompatible dep. |
|
|
226
|
+
| Setting `newArchEnabled: false` to dodge a broken native dep | the flag was removed in SDK 55 and the Legacy Architecture is gone; fix or replace the dep. |
|
|
227
|
+
| Committing the keystore so CI can sign | never; let EAS manage credentials or use EAS secrets. |
|
|
228
|
+
| Putting the API key in `app.config` extra | app config ships in the public bundle; use EAS env vars / a backend. |
|
|
229
|
+
| Reaching for GitHub Actions to call `eas build` | EAS Workflows is the native CI; only reach for github-actions if explicitly required. |
|
|
237
230
|
|
|
238
231
|
## Project grounding (02-DOCS + CLAUDE.md)
|
|
239
232
|
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
managed-vs-bare,
|
|
243
|
-
status —
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
gated* — never block the task on this.
|
|
247
|
-
|
|
248
|
-
## See also
|
|
249
|
-
|
|
250
|
-
- `references/eas-update.md` — runtime version policies, channel↔branch ops, rollouts/rollbacks, republish, "update not applying" debug flow.
|
|
251
|
-
- `references/config-plugins.md` — plugin anatomy, mods/dangerous-mods/ordering, common community plugins, prebuild troubleshooting, dynamic `app.config.ts`.
|
|
252
|
-
- `scripts/verify.sh` — run in your Expo project to gate `eas.json`, runtime policy, committed-secret, and New-Arch readiness.
|
|
253
|
-
- Sibling skills: `react-native` (RN UI/navigation/native modules — the other half of every Expo app), `secure-coding` (credential & secret handling), `ship`/`deployment` (release process), `github-actions` (only if you want non-Expo CI).
|
|
233
|
+
In a project with a `02-DOCS/` layer (the [`harness`](../harness/SKILL.md) wiki),
|
|
234
|
+
read `02-DOCS/wiki/stack/expo.md` first and record this app's shipping decisions
|
|
235
|
+
there — managed-vs-bare, runtime-version policy, channel/branch map, SDK/New-Arch
|
|
236
|
+
status — linked from the root `CLAUDE.md` `## Knowledge map`, bumping its `Updated`
|
|
237
|
+
date when a convention changes. No `02-DOCS/`? Skip silently. Conventions are
|
|
238
|
+
*recorded, not gated* — never block the task on this.
|
package/skills/fal/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fal
|
|
3
|
-
description: "Use when calling a fal.ai
|
|
3
|
+
description: "Use when calling a fal.ai endpoint by id to generate image, audio, or video from JS/Python/curl: subscribe vs submit, queue states, ED25519 webhook signature verification, per-call cost, or migrating off @fal-ai/serverless-client. NOT which model or art direction (that is ai-media); NOT the same models on another platform (that is replicate)."
|
|
4
4
|
tags: [fal, fal-ai, inference, image-generation, video-generation, queue, webhooks, serverless]
|
|
5
5
|
recommends: [ai-media, replicate, replicate-images, modal, webhooks]
|
|
6
6
|
origin: risco
|
|
@@ -10,16 +10,7 @@ origin: risco
|
|
|
10
10
|
|
|
11
11
|
The wire to fal.ai's fast, pre-warmed media endpoints: call a model by id, control the queue, get the file back. fal is the **fast-media path** — latency-optimized image (FLUX, Seedream, SD), audio (TTS, music), and video (Veo, Wan, Kling, Hailuo) endpoints you invoke by id with `FAL_KEY`.
|
|
12
12
|
|
|
13
|
-
You own the *mechanics*: auth, call mode, queue states, webhook signatures, file I/O, per-call cost.
|
|
14
|
-
|
|
15
|
-
## When to use
|
|
16
|
-
|
|
17
|
-
- Generating media by calling a fal endpoint (`fal-ai/flux/dev`, `fal-ai/veo3`, `fal-ai/wan-2.5`) from JS, Python, or curl.
|
|
18
|
-
- Choosing the call mode: `subscribe` (block + auto-poll) vs `submit` (instant `request_id`) + queue polling or webhook.
|
|
19
|
-
- Receiving a result by webhook and verifying its ED25519 signature; handling retries and idempotency.
|
|
20
|
-
- Uploading local inputs (image-to-image, image-to-video, ref audio) and reading output URLs.
|
|
21
|
-
- Estimating and capping cost: per-image / per-second / per-megapixel / GPU-hour, plus the 50%-off batch path.
|
|
22
|
-
- Migrating off the deprecated `@fal-ai/serverless-client`.
|
|
13
|
+
You own the *mechanics*: auth, call mode, queue states, webhook signatures, file I/O, per-call cost.
|
|
23
14
|
|
|
24
15
|
## When NOT to use
|
|
25
16
|
|
|
@@ -203,8 +194,3 @@ The full model-family map and per-modality knob list live in [`references/models
|
|
|
203
194
|
| Ignoring the model's pricing unit | "$0.05" is per-second, not per-video — surprise bill | Read the pricing tab; pick the right knob |
|
|
204
195
|
| Tight `while` loop on `queue.status` | Hammers the API, gains nothing | Back off, or use a webhook |
|
|
205
196
|
| `@fal-ai/serverless-client` | Deprecated; missing fixes and APIs | `@fal-ai/client` (v1.10.1) |
|
|
206
|
-
|
|
207
|
-
## References
|
|
208
|
-
|
|
209
|
-
- [`references/queue-and-webhooks.md`](references/queue-and-webhooks.md) — full async lifecycle, complete ED25519 verification (Node + Python), JWKS caching, IP allowlist, idempotent handler, retry/timeout handling.
|
|
210
|
-
- [`references/models-and-cost.md`](references/models-and-cost.md) — model-family map, pricing-unit cheatsheet with 2026 examples, batch path, per-modality spend knobs, finding an endpoint id and its schema.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: finance-ops
|
|
3
|
-
description: "Use when running the money side of a small company on a cash basis
|
|
3
|
+
description: "Use when running the money side of a small company on a cash basis: a 13-week rolling cash-flow forecast and runway, bank-vs-books reconciliation, mapping spend to tax-return expense categories, or a month-end close. NOT posting journal entries, payroll or depreciation (that is `bookkeeping`); NOT multi-year projections (that is `financial-model`)."
|
|
4
4
|
tags: [cash-flow, reconciliation, month-close, expense-categories, runway, small-business-finance]
|
|
5
5
|
recommends: [bookkeeping, invoicing, financial-model, unit-economics, cost-tracking, forecasting, spreadsheet-ops]
|
|
6
6
|
origin: risco
|
|
@@ -10,13 +10,7 @@ origin: risco
|
|
|
10
10
|
|
|
11
11
|
You are the controller for a small company run on a **cash basis**. Your job is not to post the ledger and not to send invoices — it is to answer four questions and leave proof: *is the company solvent, are the books trustworthy, did we close the month, and where will the cash run out.*
|
|
12
12
|
|
|
13
|
-
Every engagement leaves behind one
|
|
14
|
-
|
|
15
|
-
1. A **13-week rolling cash-flow forecast** (CSV/sheet) — the runway answer.
|
|
16
|
-
2. A **reconciliation report** partitioning every bank line into matched / unmatched / needs-review.
|
|
17
|
-
3. A **month-close checklist** with every gate marked done or blocked.
|
|
18
|
-
|
|
19
|
-
`scripts/verify.sh` checks the *shape and internal consistency* of those artifacts (columns present, ending balance rolls forward, no unclassified bank lines, no silently-missing close gates). It does not judge whether the dollar figures are right — that is your job.
|
|
13
|
+
Every engagement leaves behind at least one checkable artifact — which one depends on the job you pick below. `scripts/verify.sh` checks the *shape and internal consistency* of those artifacts (columns present, ending balance rolls forward, no unclassified bank lines, no silently-missing close gates). It does not judge whether the dollar figures are right — that is your job.
|
|
20
14
|
|
|
21
15
|
## Pick the job first
|
|
22
16
|
|
|
@@ -24,10 +18,10 @@ The flow genuinely branches. Decide which of the four you are doing before touch
|
|
|
24
18
|
|
|
25
19
|
| If the ask is… | You are doing | Artifact you produce | Reference |
|
|
26
20
|
|---|---|---|---|
|
|
27
|
-
| "will we run out of cash", "what's our runway", "13-week forecast", "burn rate" | **Forecast** | 13-week rolling forecast CSV | `references/cash-flow-forecast.md` |
|
|
28
|
-
| "reconcile the bank", "these don't match", "what cleared" | **Reconcile** | matched/unmatched/needs-review
|
|
21
|
+
| "will we run out of cash", "what's our runway", "13-week forecast", "burn rate" | **Forecast** | 13-week rolling forecast CSV/sheet — the runway answer | `references/cash-flow-forecast.md` |
|
|
22
|
+
| "reconcile the bank", "these don't match", "what cleared" | **Reconcile** | report partitioning every bank line into matched / unmatched / needs-review | `references/reconciliation.md` |
|
|
29
23
|
| "set up categories", "everything's in Other", "how do I categorize this" | **Categorize** | tax-return-aligned category map | (inline below) |
|
|
30
|
-
| "close the books for May", "what's left before we close" | **Close** | 5-day gate
|
|
24
|
+
| "close the books for May", "what's left before we close" | **Close** | 5-day checklist, every gate done or blocked | `references/month-close.md` |
|
|
31
25
|
|
|
32
26
|
If the ask is actually about posting entries, sending invoices, or a multi-year model, stop and route — see **Hand-offs** at the bottom. Do not silently do another skill's job.
|
|
33
27
|
|
|
@@ -105,8 +99,6 @@ A line that is silently dropped is a hole in the books. `verify.sh` fails if any
|
|
|
105
99
|
- Business meals deductible at **50%** (book them at a rate that preserves the 50% haircut, e.g. category L24b).
|
|
106
100
|
- **1099-NEC required for any contractor paid ≥ $600/yr** — flag contractors crossing that line during categorization so nothing is missed at filing.
|
|
107
101
|
|
|
108
|
-
Categories are the one job here with no separate reference file — the rule (mirror the return, no junk drawer, confirm current-year numbers) is the whole skill.
|
|
109
|
-
|
|
110
102
|
## Month-close
|
|
111
103
|
|
|
112
104
|
Closing is a **sequenced 5-day checklist, not an event.** Target for a small business: books closed in **≤5 days**.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: financial-model
|
|
3
|
-
description: "Use when a founder needs the
|
|
3
|
+
description: "Use when a founder needs the driver-based 18–36 month projection: revenue, cost and headcount builds resolving to net burn, runway, cash-out date, scenarios and the raise size. NOT the 13-week bank-reconciled cash view (that is `finance-ops`), NOT single-series forecasting (that is `forecasting`), NOT running the round (that is `fundraising`)."
|
|
4
4
|
tags: [financial-model, projections, runway, burn-rate, fundraising, fp-and-a, forecast]
|
|
5
5
|
recommends: [finance-ops, unit-economics, pricing, forecasting, pitch-deck, investor-materials, fundraising]
|
|
6
6
|
origin: risco
|
|
@@ -8,7 +8,7 @@ origin: risco
|
|
|
8
8
|
|
|
9
9
|
# Financial model — the projection engine that raises and steers
|
|
10
10
|
|
|
11
|
-
You are a startup FP&A analyst building the **projection engine**: an assumptions layer that feeds a monthly revenue build, a cost build (COGS + OpEx by function + a headcount plan), and a cash projection that resolves to **net burn, runway, and the cash-out date** — plus a scenario switch (base / downside / upside). It is forward-looking and assumption-driven, 18–36 months out. It
|
|
11
|
+
You are a startup FP&A analyst building the **projection engine**: an assumptions layer that feeds a monthly revenue build, a cost build (COGS + OpEx by function + a headcount plan), and a cash projection that resolves to **net burn, runway, and the cash-out date** — plus a scenario switch (base / downside / upside). It is forward-looking and assumption-driven, 18–36 months out. It produces the numbers the fundraising siblings present.
|
|
12
12
|
|
|
13
13
|
The test of a model is not "does it look right" but **"does it re-flow when I change three input cells."** A spreadsheet of typed-in numbers is a picture, not a model.
|
|
14
14
|
|
|
@@ -20,18 +20,21 @@ Three connected artifacts, every output traced to an input:
|
|
|
20
20
|
2. **A monthly projection grid** (CSV/spreadsheet, 18–36 columns) — month index, revenue, COGS, gross margin, OpEx by function, headcount, net burn, starting/ending cash, runway-months. This is what `scripts/verify.sh` checks for shape and internal consistency.
|
|
21
21
|
3. **A scenario + runway summary** — one screen: ending-cash trajectory and runway under base/downside/upside, the raise number, and the burn-multiple / Rule-of-40 cross-check.
|
|
22
22
|
|
|
23
|
-
##
|
|
23
|
+
## Route out first
|
|
24
24
|
|
|
25
|
-
This skill answers **"how much / what runway / does the plan tie out."** The moment the real ask is something else, stop and route:
|
|
25
|
+
This skill answers **"how much / what runway / does the plan tie out."** The moment the real ask is something else, stop and route — at the intake gate or mid-build:
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
-
|
|
34
|
-
|
|
27
|
+
| The real ask | Route to |
|
|
28
|
+
| --- | --- |
|
|
29
|
+
| Next-13-weeks liquidity reconciled to the **actual bank balance**, this-month burn, are-we-solvent-now | `finance-ops` |
|
|
30
|
+
| Recording actual ledger entries, journals, double-entry, payroll postings | `bookkeeping` |
|
|
31
|
+
| The isolated **LTV / CAC / payback / contribution-margin** math — the model imports these as drivers, it does not derive them | `unit-economics` |
|
|
32
|
+
| Setting the **price / packaging / tier / margin floor** itself — the model takes price as input | `pricing` |
|
|
33
|
+
| Statistical / time-series **forecast** of a single series (churn, demand, ARR) from history | `forecasting` |
|
|
34
|
+
| The slide **story** and decision-grade headline numbers | `pitch-deck` |
|
|
35
|
+
| Packaging the model into the data room / sending it | `investor-materials` |
|
|
36
|
+
| Round **strategy**, investor pipeline, SAFE-vs-priced, term-sheet mechanics | `fundraising` |
|
|
37
|
+
| Per-unit COGS / infra / AI spend as actuals | `cost-tracking` |
|
|
35
38
|
|
|
36
39
|
## The intake gate
|
|
37
40
|
|
|
@@ -44,12 +47,6 @@ Pin four inputs before you build a single cell. Without them the model is fictio
|
|
|
44
47
|
| **Current revenue / MRR + recent growth** | the base the revenue build grows from, not a fresh hockey stick |
|
|
45
48
|
| **Target raise & horizon** (or "size it for me") | the model either takes the raise as input or solves for it from a runway target |
|
|
46
49
|
|
|
47
|
-
STOP-and-route at the gate:
|
|
48
|
-
|
|
49
|
-
- If the ask is "what does next quarter's cash look like against the bank" → that is the 13-week tool, route to `finance-ops`.
|
|
50
|
-
- If the ask is "what's our LTV and CAC" with no projection attached → route to `unit-economics`; come back when you need them as drivers.
|
|
51
|
-
- If the ask is "what should we charge" → route to `pricing`; the model takes the price it sets.
|
|
52
|
-
|
|
53
50
|
## Rule 1 — three layers, no hardcoded outputs
|
|
54
51
|
|
|
55
52
|
The model is a connected system: **assumptions → drivers → outputs.** Changing a few input cells must re-flow the whole plan. Hardcoded outputs that don't recompute are the cardinal modeling sin — they pass inspection and then silently lie the moment an assumption moves.
|
|
@@ -131,7 +128,7 @@ Most companies miss Rule of 40 — McKinsey's run of 200+ software firms (2011
|
|
|
131
128
|
|
|
132
129
|
## Anti-patterns
|
|
133
130
|
|
|
134
|
-
|
|
|
131
|
+
| Anti-pattern | Do instead | Why |
|
|
135
132
|
| --- | --- | --- |
|
|
136
133
|
| Hockey-stick revenue, one line, no downside | base / downside / upside off toggled drivers | investors stress-test the downside first; no downside reads as naive |
|
|
137
134
|
| Runway computed from net income / P&L | runway from cash balance ÷ net cash burn | depreciation, prepaids, AR make profit ≠ cash; cash is the survival line |
|
|
@@ -152,19 +149,4 @@ The model emits a checkable artifact, so `scripts/verify.sh` runs against your g
|
|
|
152
149
|
./scripts/verify.sh --strict # treat warnings as failures (CI gate)
|
|
153
150
|
```
|
|
154
151
|
|
|
155
|
-
It checks: required columns present (month, revenue, cogs, gross_margin, opex, net_burn, ending_cash, runway_months); **cash continuity** (ending_cash[m] == starting_cash[m+1]); **gross_margin == (revenue − COGS)/revenue** recomputes; **net_burn == gross_burn − revenue** ties; runway_months ties to cash ÷ net_burn; ≥1 scenario present; and a defect lint for placeholders (`TBD`, `XX`, `#REF`, `[assumption]`) and impossible values (gross margin >100%/<−100%, negative headcount). It exits 0 on a clean or empty target — a missing file is a skip, never a false failure. The
|
|
156
|
-
|
|
157
|
-
## Hand-offs
|
|
158
|
-
|
|
159
|
-
- Need the LTV/CAC/payback that feed the drivers → `unit-economics`.
|
|
160
|
-
- Price/packaging the model assumes → `pricing`.
|
|
161
|
-
- Single-series statistical forecast of churn/ARR → `forecasting`.
|
|
162
|
-
- The near-term bank-reconciled cash view → `finance-ops`.
|
|
163
|
-
- Turn the numbers into the slide story → `pitch-deck`; into the data room → `investor-materials`.
|
|
164
|
-
- Run the actual round off the raise number → `fundraising`.
|
|
165
|
-
|
|
166
|
-
## references/
|
|
167
|
-
|
|
168
|
-
- `references/revenue-build.md` — bottom-up funnel template, the MRR new/expansion/contraction/churn waterfall, the top-down TAM cross-check, and a worked monthly build.
|
|
169
|
-
- `references/benchmarks-and-scenarios.md` — the 2025/26 benchmark sanity-table, the base/downside/upside driver-toggle recipe, and a worked runway-under-scenarios example.
|
|
170
|
-
- `references/model-structure.md` — the assumptions/projection row+column contract `verify.sh` enforces, the cash-continuity rule, and the `model.csv` schema with a filled mini-example.
|
|
152
|
+
It checks: required columns present (month, revenue, cogs, gross_margin, opex, net_burn, ending_cash, runway_months); **cash continuity** (ending_cash[m] == starting_cash[m+1]); **gross_margin == (revenue − COGS)/revenue** recomputes; **net_burn == gross_burn − revenue** ties; runway_months ties to cash ÷ net_burn; ≥1 scenario present; and a defect lint for placeholders (`TBD`, `XX`, `#REF`, `[assumption]`) and impossible values (gross margin >100%/<−100%, negative headcount). It exits 0 on a clean or empty target — a missing file is a skip, never a false failure. The row+column contract it enforces, the cash-continuity rule, and the `model.csv` schema with a filled mini-example are in `references/model-structure.md`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: finetuning
|
|
3
|
-
description: "Use when adapting an open-weight model to a target
|
|
3
|
+
description: "Use when adapting an open-weight model to a target form or behavior — tone, output format, reasoning pattern — via LoRA/QLoRA or full fine-tuning with TRL SFTTrainer, then preference optimization (DPO/ORPO/KTO/GRPO), and for fine-tune vs prompt vs RAG. NOT adding facts to a model (that is rag); NOT the single-GPU Unsloth backend or GGUF export (that is unsloth)."
|
|
4
4
|
tags: [finetuning, lora, qlora, sft, dpo, grpo, peft, trl, preference-optimization]
|
|
5
5
|
recommends: [training-data, unsloth, open-weights, huggingface, vllm, rag]
|
|
6
6
|
origin: risco
|
|
@@ -33,8 +33,10 @@ row below is a real off-ramp.
|
|
|
33
33
|
|
|
34
34
|
Route out explicitly. Facts / freshness / citations → `../rag/SKILL.md`. Squeezing a prompt before
|
|
35
35
|
spending money → `prompt-engineering`. Picking *which* base model (size/license/task) → `open-weights`.
|
|
36
|
-
Building the JSONL/preference corpus → `training-data
|
|
37
|
-
|
|
36
|
+
Building the JSONL/preference corpus → `training-data` (LLM corpora, NOT tabular cleaning — that is
|
|
37
|
+
`data-cleaning`). A fast single-GPU run + GGUF export → `../unsloth/SKILL.md` (same LoRA/QLoRA
|
|
38
|
+
concepts, one optimized implementation; this skill stays backend-agnostic). Downloading the base or
|
|
39
|
+
pushing the adapter/merged model → `huggingface`. Serving the result → `../vllm/SKILL.md`.
|
|
38
40
|
|
|
39
41
|
> The cheapest fine-tune is the one you didn't need. Prompt + RAG solves most "make it behave"
|
|
40
42
|
> asks at zero training cost and updates instantly. Fine-tune when that ceiling is real, measured,
|
|
@@ -201,6 +203,8 @@ score). Judge the run on that, plus **eval loss**.
|
|
|
201
203
|
eval; keep the held-out set quarantined. (Corpus-side hygiene is `training-data`.)
|
|
202
204
|
- General LLM/agent eval harness and judging → `agent-eval`. Bring your task metric here.
|
|
203
205
|
|
|
206
|
+
The full tuning + forgetting + evaluation playbook is in `references/hyperparameters-and-eval.md`.
|
|
207
|
+
|
|
204
208
|
## When NOT to fine-tune (anti-patterns)
|
|
205
209
|
|
|
206
210
|
| Anti-pattern | Why it breaks | Do instead |
|
|
@@ -214,19 +218,6 @@ score). Judge the run on that, plus **eval loss**.
|
|
|
214
218
|
| A few dozen examples for full FT | Not enough signal; unstable | Curate ~hundreds–thousands (LIMA) or use LoRA |
|
|
215
219
|
| Fine-tune a model you can't legally deploy | License blocks your use case | Check the model card first → `open-weights` |
|
|
216
220
|
|
|
217
|
-
## Related skills
|
|
218
|
-
|
|
219
|
-
- **`../rag/SKILL.md`** — the fork of the decision gate: facts/freshness/citations live there;
|
|
220
|
-
form/behavior lives here. Most "make it behave" asks are RAG or prompting, not training.
|
|
221
|
-
- **`prompt-engineering`** — the cheaper lever to exhaust before spending a GPU.
|
|
222
|
-
- **`training-data`** — builds/validates the JSONL `messages` and preference-pair corpus you feed
|
|
223
|
-
here (LLM corpora, NOT tabular cleaning — that is `data-cleaning`).
|
|
224
|
-
- **`open-weights`** — chooses *which* base model by task/size/license; you consume that choice.
|
|
225
|
-
- **`../unsloth/SKILL.md`** — a fast single-GPU training backend + GGUF export; same LoRA/QLoRA
|
|
226
|
-
concepts, one optimized implementation. This skill stays backend-agnostic.
|
|
227
|
-
- **`huggingface`** — download the base, push the adapter/merged model, host inference (NOT training).
|
|
228
|
-
- **`../vllm/SKILL.md`** — serves the trained/merged model (adapter hot-swap, throughput flags).
|
|
229
|
-
|
|
230
221
|
## Checklist
|
|
231
222
|
|
|
232
223
|
- [ ] Ran the decision gate: confirmed this is a form/behavior need, not a facts need (else → rag).
|
|
@@ -239,6 +230,3 @@ score). Judge the run on that, plus **eval loss**.
|
|
|
239
230
|
- [ ] Trained 1–3 epochs; watched **eval** loss (not train) for the overfitting turn.
|
|
240
231
|
- [ ] Preference stage only if needed; correct method for the data (pairs→DPO/ORPO, votes→KTO, verifier→GRPO); tiny LR.
|
|
241
232
|
- [ ] Verified `trl`/`peft`/`transformers` current majors and import paths at author time.
|
|
242
|
-
|
|
243
|
-
See `references/methods.md` for full SFT→DPO/GRPO/ORPO/KTO scripts, dataset schemas, and adapter
|
|
244
|
-
merging; `references/hyperparameters-and-eval.md` for the tuning + forgetting + evaluation playbook.
|