Skip to content

Commit 65d5297

Browse files
committed
chore(skills): correct provider matrix and repo-specific claims from review
1 parent 3fab9cc commit 65d5297

15 files changed

Lines changed: 26 additions & 25 deletions

File tree

‎.agents/skills/add-column-type/SKILL.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ argument-hint: <type-name>
88

99
A column type is **one file** in `apps/sim/lib/table/column-types/` plus a registry entry. Everything that varies per type — label, icon, storage cast, coercion, validation, conversion compatibility, formatting, editor, filter operators — lives on that one object, so no consumer needs editing.
1010

11-
A `case 'yourtype':` outside `column-types/` fails **silently** when missed (a wrong `jsonbCast` breaks every filter on the column). The registry exists to make that impossible, so the rule is absolute: **if you find yourself adding a `case 'yourtype':` anywhere outside `column-types/`, the registry is missing a field. Add the field instead.**
11+
A `case 'yourtype':` outside `column-types/` fails **silently** when missed (a wrong `jsonbCast` breaks every filter on the column). The registry exists to make that impossible, so the rule is absolute with one documented exception (`import.ts`'s `coerceValue`, see "Traps" below): **if you find yourself adding a `case 'yourtype':` anywhere else outside `column-types/`, the registry is missing a field. Add the field instead.**
1212

1313
## Hard Rule: the compiler tells you what to do
1414

‎.agents/skills/add-integration/SKILL.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,7 @@ When your integration handles file uploads or downloads, follow these patterns t
437437

438438
### What is a UserFile?
439439

440-
`UserFile` (`apps/sim/executor/types.ts`) is the standard file representation in Sim — id, name, presigned `url`, size, MIME `type`, storage `key`, and optional inline `base64` / provider file handles. Read the interface rather than relying on a copy here.
440+
`UserFile` (`apps/sim/executor/types.ts`) is the standard file representation in Sim — id, name, an access `url` (not guaranteed presigned — `remoteUrl` is the short-lived signed one, set only for providers that fetch by URL), size, MIME `type`, storage `key`, and optional inline `base64` / provider file handles. Read file bytes through the documented upload helpers, never by fetching `url` directly. Read the interface rather than relying on a copy here.
441441

442442
### File Input Pattern (Uploads)
443443

‎.agents/skills/add-model/SKILL.md‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,11 @@ Use a precise WebFetch prompt: *"Extract for {model_id}: exact model id string,
4949
|---|---|---|
5050
| `temperature` | All providers (passed through if set) | Safe but inert on always-reasoning models that reject it |
5151
| `toolUsageControl` | All providers (provider-level, not per-model) | n/a — set on `ProviderDefinition`, not models |
52-
| `reasoningEffort` | `openai/core.ts`, `azure-openai`, `xai/index.ts`, `deepseek/index.ts`, `groq/index.ts` | Not read by anthropic/gemini (they use `thinking`) or by mistral, cerebras, openrouter, fireworks, vertex — re-grep before assuming |
52+
| `reasoningEffort` | `openai/core.ts`, `azure-openai`, `xai`, `deepseek`, `groq`, `zai`, `meta`, `litellm` (each `index.ts`) | Not read by anthropic/gemini (they use `thinking`) or by mistral, cerebras, openrouter, fireworks, vertex — re-grep before assuming |
5353
| `verbosity` | `openai/core.ts`, `azure-openai/index.ts` only | Dead elsewhere |
54-
| `thinking` | `anthropic/core.ts`, `gemini/core.ts`; `deepseek/index.ts` and `groq/index.ts` read the resolved `thinkingLevel` | Dead elsewhere |
54+
| `thinking` | `anthropic/core.ts`, `gemini/core.ts`; `deepseek`, `groq`, `zai`, `kimi` (each `index.ts`) read the resolved `thinkingLevel` | Dead elsewhere |
5555
| `thinking.streamed` | Docs generator + `getThinkingStreamVisibility` (`models.ts`); `anthropic/core.ts` uses `'summary'` to request `display: 'summarized'` on agent-events runs | **Mandatory on Anthropic-family thinking models** (`agent-stream-docs:check` fails without it); other families fall back to provider defaults |
56-
| `nativeStructuredOutputs` | `anthropic/core.ts`, `bedrock/index.ts`, `fireworks/index.ts`, `openrouter/index.ts`, `baseten/index.ts`, `together/index.ts` (via `supportsNativeStructuredOutputs`) | Dead on openai, xai, google, vertex, azure-openai, deepseek, mistral, groq, cerebras |
56+
| `nativeStructuredOutputs` | `anthropic/core.ts`, `bedrock/index.ts` (via `models.ts` `supportsNativeStructuredOutputs`, which reads the flag) | Dead elsewhere — fireworks/baseten/together/openrouter call their own provider-level `supportsNativeStructuredOutputs` that ignores the model flag (always on, always off, or OpenRouter API metadata) |
5757
| `maxOutputTokens` | Read by UI + executor for token estimation | Always meaningful — set if provider documents a cap |
5858
| `computerUse` | `providers/utils.ts` (`getComputerUseModels` → `computerUseModels` routing) | Set only on actual computer-use SKUs |
5959
| `deepResearch` | UI flag for routing to deep-research SKUs | Set only on actual deep-research model IDs |
@@ -114,9 +114,9 @@ Adding the `models.ts` entry is most of the job because nearly every consumer is
114114

115115
### Hosted = auto-billed, by provider
116116

117-
`getHostedModels()` in `apps/sim/providers/models.ts` decides which providers are served with Sim's rotating hosted key and billed to the workspace via `shouldBillModelUsage()` (`providers/utils.ts`). Read the function before inserting — the list changes (it currently includes several non-big-three providers and a static Fireworks catalog). Before you insert:
117+
`getHostedModels()` in `apps/sim/providers/models.ts` returns the model IDs served with Sim's rotating hosted key and billed to the workspace via `shouldBillModelUsage()` (`providers/utils.ts`). It builds that list by expanding whole providers (`getProviderModels('openai')`, `'anthropic'`, `'google'`, and others) plus the static Fireworks catalog, so any model added under one of those providers is hosted automatically. Read the function before inserting — the provider set changes. Before you insert:
118118

119-
- **If the model should be BYOK-only / never-billed**, do not add it under a provider listed in `getHostedModels()` — that silently enrolls it in hosted billing. Confirm hosting/billing intent with the user. (Ollama Cloud is a deliberately separate `isReseller` provider specifically to stay BYOK-only/never-billed.)
119+
- **If the model should be BYOK-only / never-billed**, do not add it under a provider that `getHostedModels()` expands — that silently enrolls it in hosted billing. After inserting, verify with `getHostedModels().includes('<new-model-id>')` (a one-line `bun -e` or the assertion in `providers/utils.test.ts`). Confirm hosting/billing intent with the user. (Ollama Cloud is a deliberately separate `isReseller` provider specifically to stay BYOK-only/never-billed.)
120120
- **If the model should be hosted**, the deployment must actually have a key for it — the provider's `{PREFIX}_COUNT` / `{PREFIX}_1..N` env vars must be set, or hosted runs fail at execution time.
121121
- State the hosted/billing status explicitly in the verification report.
122122

@@ -158,7 +158,7 @@ bun run lint
158158
bun run agent-stream-docs:generate # only when the entry has thinking/reasoningEffort
159159
```
160160

161-
Lint must pass before you report done.
161+
Lint must pass before you report done — fix the entry you wrote, never delete it to make lint pass.
162162

163163
## Step 6: Verification report (mandatory format)
164164

@@ -177,7 +177,7 @@ End with this exact structure:
177177
| `capabilities.temperature` | `{ min: 0, max: 1 }` | matches sibling entries | — pattern-match only |
178178
| `capabilities.reasoningEffort` | NOT SET | provider docs say API rejects it for this model | ✓ correctly omitted |
179179
| `releaseDate` | 2026-04-30 | https://docs.x.ai/... announcement | ✓ verified |
180-
| hosted/billing | hosted (provider is in `getHostedModels`) or BYOK-only | `providers/models.ts` | — confirmed intent |
180+
| hosted/billing | hosted (`getHostedModels().includes(id)`) or BYOK-only | `providers/models.ts` | — confirmed intent |
181181

182182
**Disagreements**
183183
- _none_ OR _OpenRouter says X, provider docs say Y — used Y per provider rule_

‎.agents/skills/add-permission-group-item/SKILL.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ cd apps/sim && bunx vitest run lib/permission-groups
215215

216216
Also `bun run check:api-validation` if you touched a contract or the group routes. `bun run check:audits` runs all of these; it derives its list from the `check:*` scripts in `package.json`, so a new audit is opted *out* deliberately rather than opted in.
217217

218-
Read the success lines, not the exit codes — the operation and capability counts should each have grown by one:
218+
Read the success lines, not the exit codes — compare the counts against the previous run and check they grew by exactly what you added: an operation-declared capability adds one operation and one capability; a raw-route or parameterized capability adds one capability and no operation; an executor-gated or UI-only item adds neither:
219219

220220
```
221221
✓ permission-group enforcement: <N> operations declare a capability, <M> capabilities all enforced

‎.agents/skills/add-tools/SKILL.md‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,9 @@ and leave the field unannotated.
223223
formatter parses it; keep formatter behavior deterministic when a whole-value placeholder is not
224224
valid in the serialized grammar. Do not introduce a second hard-rejection path.
225225
- **Opaque model input owned by an in-process operation** such as inline audio, image, video, or
226-
document bytes: add `privateProvenance` to the operation model-input declaration, or use
227-
`mode: 'private-provenance'` when there is no textual projection. Do not select storage keys,
226+
document bytes: add `privateInputPaths` to the `mode: 'project'` operation model-input
227+
declaration, or use `mode: 'private-provenance'` with `inputPaths` when there is no textual
228+
projection (see the `modelInput` union in `apps/sim/tools/types.ts`). Do not select storage keys,
228229
paths, signed URLs, or ordinary remote URLs as byte provenance; the owning operation must
229230
authorize stored bytes independently at model egress. The operation must call
230231
`validateOpaqueModelInputProvenance` before downloading or sending content to the model and must

‎.agents/skills/cleanup/SKILL.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ User arguments: $ARGUMENTS
1414

1515
## Step 1 — Parallel analysis (read-only)
1616

17-
Parse `$ARGUMENTS` into `scope` and `fix` (defaults: current changes, `true`). `fix` is consumed by Step 3 only — the passes below always run `fix=false`.
17+
Parse `$ARGUMENTS` into `scope` and `fix`: extract the `fix=true|false` token wherever it appears in the string and strip it from `scope`; defaults are the current changes and `fix=true`. `fix` is consumed by Step 3 only — the passes below always run `fix=false`.
1818

1919
Spawn all eight passes concurrently as subagents in a **single message** (multiple Agent tool calls). Each runs its skill on the parsed `scope` with `fix=false` — analysis and proposals ONLY, no edits. Instruct each agent to return its findings as a structured list: for every proposed change, the file path, line range, a one-line description of the change, and the exact before/after so the orchestrator can apply it without re-deriving.
2020

‎.agents/skills/design-taste-frontend/SKILL.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ source: https://github.com/leonxlnx/taste-skill — skills/taste-skill/SKILL.md
44
description: Anti-slop frontend skill for landing pages, portfolios, and redesigns. The agent reads the brief, infers the right design direction, and ships interfaces that do not look templated. Real design systems when applicable, audit-first on redesigns, strict pre-flight check.
55
---
66

7-
> **In this repo:** Tailwind 3.4 (`apps/sim/tailwind.config.ts`), `framer-motion`, icons from `@sim/emcn/icons`, colors through the CSS-variable tokens in `.claude/rules/sim-styling.md` (no hardcoded `text-gray-*`/hex, no paired `dark:` utilities). Where Section 3 or 8 names a different stack, this note wins.
7+
> **In this repo:** Tailwind 3.4 (`apps/sim/tailwind.config.ts`); animation via `import { motion } from 'framer-motion'` (not `motion/react` — rewrite every `motion/react` import in the samples below); icons from `@sim/emcn/icons`; colors through the CSS-variable tokens in `.claude/rules/sim-styling.md` (no hardcoded `text-gray-*`/hex/`zinc` utilities, no paired `dark:` utilities). This note overrides any conflicting guidance or code sample anywhere in this file.
88
99
# tasteskill: Anti-Slop Frontend Skill
1010

@@ -132,7 +132,7 @@ Unless the design read picks a real design system (Section 2.A), these are the d
132132
* **INTERACTIVITY ISOLATION:** Any component using Motion, scroll listeners, or pointer physics MUST be an isolated leaf with `'use client'` at the top. Server Components render static layouts only.
133133
* **Styling:** **Tailwind v4** (default). Tailwind v3 only if the existing project demands it.
134134
* For v4: do NOT use `tailwindcss` plugin in `postcss.config.js`. Use `@tailwindcss/postcss` or the Vite plugin.
135-
* **Animation:** **Motion** (the library formerly known as Framer Motion). Import from `motion/react` (`import { motion } from "motion/react"`). The `framer-motion` package still works as a legacy alias - prefer `motion/react` in new code.
135+
* **Animation:** **Motion** (the library formerly known as Framer Motion). Outside this repo import from `motion/react`; in this repo import from `framer-motion` (see the note at the top).
136136
* **Fonts:** Always use `next/font` (Next.js) or self-host with `@font-face` + `font-display: swap`. Never link Google Fonts via `<link>` in production.
137137

138138
### 3.B State

‎.agents/skills/make-interfaces-feel-better/SKILL.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ Add a subtle 1px low-opacity outline to images (`outline-black/10` light, `outli
6565

6666
### 12. Scale on Press
6767

68-
A subtle scale-down (about 0.96-0.97) on press gives tactile feedback. In this repo it lives in the emcn `Button`/`Chip` chrome, not consumer classes; add a `static` prop to opt out where motion distracts.
68+
A subtle scale-down (about 0.96-0.97) on press gives tactile feedback. In this repo a press affordance belongs in the emcn `Button`/`Chip` chrome (`packages/emcn`), not in consumer classes — neither component implements one today, so propose it there rather than adding per-call-site transforms.
6969

7070
### 13. Skip Animation on Page Load
7171

@@ -89,7 +89,7 @@ Interactive elements need at least 40×40px hit area. Extend with a pseudo-eleme
8989
| --- | --- |
9090
| Same border radius on parent and child | Calculate `outerRadius = innerRadius + padding` |
9191
| Icons look off-center | Adjust optically with padding or fix SVG directly |
92-
| Hard borders between sections | Use layered `box-shadow` with transparency |
92+
| Hard borders between sections | In this repo, the `--border` hairline token; elsewhere, layered `box-shadow` with transparency |
9393
| Jarring enter/exit animations | Split, stagger, and keep exits subtle |
9494
| Numbers cause layout shift | Apply `tabular-nums` |
9595
| Heavy text on macOS | Apply `antialiased` to root |

‎.agents/skills/react-query-best-practices/SKILL.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ Read these before analyzing:
2727

2828
### Query keys and hooks
2929
Enforce CLAUDE.md "React Query" and `.claude/rules/sim-queries.md` (key factory with `all` + plural prefixes, `signal` forwarding, named `staleTime` constants reused by prefetches, `keepPreviousData` only on variable keys, `requestJson` boundary). Additionally:
30-
- Key factories live next to their hooks — except a factory (or standalone fetcher/mapper) that a server module imports, which must live in `hooks/queries/utils/<entity>-keys.ts` / `fetch-*.ts` per `.claude/rules/sim-queries.md` (a `'use client'` export called from the server crashes SSR)
30+
- Key factories live next to their hooks — except a factory, standalone fetcher/mapper, or `staleTime` constant that a server module (a `prefetch.ts`, route, block, trigger) imports, which must live in a non-`'use client'` module under `hooks/queries/utils/` per `.claude/rules/sim-queries.md` (a `'use client'` export called from the server crashes SSR)
3131
- Use `enabled` to prevent queries from running without required params
3232
- Warm data for hover/focus intent with `queryClient.prefetchQuery` and shared `queryOptions`; never temporarily enable a mounted hidden observer, which can remain active after focus restoration and refetch data for closed UI
3333
- When gating a query by view or modal state, move every consumer to the active query too: imperative refresh/pagination, loading and error feedback, and data-derived controls must never read a disabled query or placeholder data from a previous key

‎.agents/skills/v2-api-conventions/SKILL.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,9 @@ Three cursor schemes exist. Two are the shared codecs in `response.ts`, both opa
102102
- **Keyset** (`readSortedCursor` in, `encodeSortedCursor` out) — the default. Requires the page to come from one ordered SQL read. The sort AND the filters are stamped into the cursor and re-checked on replay, so changing `sortBy` or any filter mid-pagination is a 400, not a silently skipped page.
103103
- **Offset** (`decodeOffsetCursor` / `encodeOffsetCursor`) — only when a keyset is impossible. Two lists qualify: `GET /skills` merges a static in-code registry with DB rows and re-sorts in JS, and `GET /knowledge/{id}/documents` sits on a limit/offset query. A bare offset replayed against a re-sorted or re-filtered sequence names a different row, which skips or repeats results.
104104

105-
Both take the same two stamps: `cursorSortKey(sortBy, sortOrder)` for the ordering, and `cursorScopeKey({ ... })` for every param that filters the sequence. **`limit` is never a stamp** — it selects how much of the sequence to return, not what the sequence is, and binding it strands every cursor the moment a caller changes page size. Params that only shape the response body are out for the same reason.
105+
Both take the same two stamps: `cursorSortKey(sortBy, sortOrder)` for the ordering, and `cursorScopeKey(cursorRoute(contract, pathParams), { ... })` for every param that filters the sequence — the route identity is the first argument, the filter parts the second. **`limit` is never a stamp** — it selects how much of the sequence to return, not what the sequence is, and binding it strands every cursor the moment a caller changes page size. Params that only shape the response body are out for the same reason.
106106

107-
The third is **per-domain**: a list whose read predates the shared codecs, or whose page boundary is not expressible as one, mints its own — a bare `encodeCursor({ version })` on `GET /workflows/{id}/versions` and `encodeCursor({ email })` on the workspace member list, the local codecs in `lib/audit-logs/query.ts`, `lib/logs/list-logs.ts`, and `lib/table/rows/cursor.ts`, and a usage-event id passed straight through by `GET /billing/logs`. Those tokens stay opaque and untouched, but a domain-minted cursor on a list a caller can re-filter is wrapped at the surface with `encodeScopedCursor(cursorScopeKey({...}), token)` and unwrapped with `readScopedCursor`, so it carries the same binding as the shared schemes. **A new list picks one of the two shared schemes.** Do not add a fourth.
107+
The third is **per-domain**: a list whose read predates the shared codecs, or whose page boundary is not expressible as one, mints its own — a bare `encodeCursor({ version })` on `GET /workflows/{id}/versions` and `encodeCursor({ email })` on the workspace member list, the local codecs in `lib/audit-logs/query.ts`, `lib/logs/list-logs.ts`, and `lib/table/rows/cursor.ts`, and a usage-event id passed straight through by `GET /billing/logs`. Those tokens stay opaque and untouched, but a domain-minted cursor on a list a caller can re-filter is wrapped at the surface with `encodeScopedCursor(cursorScopeKey(cursorRoute(contract, pathParams), {...}), token)` and unwrapped with `readScopedCursor`, so it carries the same binding as the shared schemes. **A new list picks one of the two shared schemes.** Do not add a fourth.
108108

109109
Every paged list's binding is declared in `lib/api/contracts/v2/__tests__/list-pagination.test.ts` and checked against what the contract actually accepts, in both directions. A new list, or a new filter on an existing one, fails that test until its binding is declared or the param is explicitly recorded as unable to change the sequence.
110110

0 commit comments

Comments
 (0)