clawhub-convex · git:20260709.4119279 · 2026-07-09 · sha256 91fde1bbc53bd428
clawhub-convex git:20260709.4119279A
Immutable. This exact content is served forever at /api/v1/blob/91fde1bbc53bd428.
---
name: clawhub-convex
description: Apply ClawHub-specific Convex conventions and route to the right managed Convex skill. Use for any change under convex/, Convex commands or deployment targeting, query performance, migrations, retention, runtime validation, or skill stat reads and writes in the ClawHub repository.
---
# ClawHub Convex
Use the managed Convex guidance for general framework behavior and this skill
for ClawHub's repository-specific boundaries.
## Start Here
1. Read `convex/_generated/ai/guidelines.md` before editing Convex code.
2. Name the target runtime before running a Convex command: `local`, `dev`, or
`prod`. Include the exact deployment when known and whether the current
function/schema code has already been pushed there.
3. Route to the most specific companion skill:
- Query cost, indexes, read amplification, subscriptions, or OCC:
`convex-performance-audit`
- Production migration, backfill, schema narrowing, or table reshaping:
`convex-migration-helper` and `create-and-cleanup-migration`
- Tables, TTL fields, cleanup crons, retention, auth/session cleanup, metric
dedupe cleanup, or deprecated table removal: `convex-retention`
- Auth, reusable components, or setup: use the matching managed Convex skill.
Do not edit upstream-managed Convex skills to store ClawHub policy.
## Commands And Runtime Validation
- Push new or changed functions before `convex run`:
- dev: `bunx convex dev --once`
- prod: deploy through the workflow described by
`clawhub-production-release`
- For a non-interactive direct production deploy when explicitly required, use
`bunx convex deploy -y`.
- If `bunx convex run --env-file .env.local ...` returns
`401 MissingAccessToken` after login, omit `--env-file` and target the
deployment with `--deployment <name>` or `--prod`.
- Regenerate committed API/types with `bunx convex codegen` after Convex
API/schema changes.
- Import mutations from `convex/functions.ts`, not
`convex/_generated/server`, so ClawHub's trigger wrapper runs. Type imports
can still come from `convex/_generated/server`.
- Do not disable typechecking for an ordinary direct deploy. The production
workflow owns its explicit deploy behavior and exceptions.
Mocked `ctx` tests cover pure business logic only. When behavior depends on
pagination, indexes, validators, auth identity, internal/public boundaries,
schedulers, actions calling functions, HTTP actions, storage, or OCC, also run
a real Convex path such as:
- `bunx convex dev --once`
- `bunx convex run ...`
- an HTTP action smoke
- `bun run test:pw:local-auth`
Tests that invoke a mutation through `._handler` need a mock database with
`normalizeId: vi.fn()` for trigger-wrapper compatibility.
## ClawHub Migration Boundaries
- Default production data changes to `@convex-dev/migrations`; the companion
skills own batching, dry runs, resume/progress, confirmation, validation, and
cleanup.
- Put component-backed table-wide backfills in `convex/migrations.ts`.
- Put custom repairs, admin-gated operations, and incident-specific workflows
in `convex/maintenance.ts`.
- Keep one-off operator migration runs out of `.github/workflows/deploy.yml`.
- Remove temporary migration functions in a follow-up PR after production
apply and verification unless they are intentionally retained as maintenance
tooling.
## Query And Bandwidth Work
Use `convex-performance-audit` for the detailed rules on indexes, bounded reads,
denormalization, digest tables, subscriptions, and function limits. Before
writing or reviewing a performance-sensitive query, check deployment health
when available:
```bash
bunx convex insights --details
bunx convex logs --failure
```
Prefer measured runtime signals over speculative restructuring.
## ClawHub Hot-Path Conventions
Use `convex-performance-audit` for the complete workflow. Preserve these
ClawHub-specific implementations when touching their paths:
- Public listing and browse pages use one-shot `ConvexHttpClient.query()` reads
unless the user needs live updates.
- When a `skillSearchDigest` row exists, resolve owner data with
`digestToOwnerInfo(digest)`. Do not re-read the owner document when the
digest already contains the required owner fields.
- Keep denormalized tables synchronized through the existing
`convex-helpers` triggers and skip writes when derived fields did not change.
- Paginate computed search results client-side after running the scoring
pipeline once; do not rerun the full vector, lexical, and popularity pipeline
for each page.
- Add `delayMs` between backfill batches that update reactively subscribed
tables.
- Split mutations that would read more than the transaction budget through the
existing action-query-mutation pattern.
## Skill Stat Contract
The `skills` table still has a compatibility shape for four migrated stats:
| Legacy nested field | Top-level source of truth |
| ----------------------- | ------------------------- |
| `stats.downloads` | `statsDownloads` |
| `stats.stars` | `statsStars` |
| `stats.installsCurrent` | `statsInstallsCurrent` |
| `stats.installsAllTime` | `statsInstallsAllTime` |
- Read these fields with `readCanonicalStat()` from
`convex/lib/skillStats.ts`. It prefers the top-level field and falls back for
pre-migration documents.
- Write deltas with `applySkillStatDeltas()`. It updates both shapes in one
patch.
- Any direct patch touching these values must update both shapes.
- Nested-only reads remain valid for `stats.comments` and `stats.versions`.
- When adding a migrated stat field, use the same dual-write shape and add a
cursor-based backfill.