Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Mirror `@qvac/sdk` → `@qvac/bare-sdk` package metadata so the two lockstep-released packages can't drift.
.claude/skills/tetherto-sdk-bare-sdk-sync/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-09 | ✗→✓ | ▲ Improved | 28% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 38% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 26% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 27% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 90% | 0% |
Mirror @qvac/sdk → @qvac/bare-sdk package metadata so the two lockstep-released packages can't drift.
Applies to the sdk ↔ bare-sdk pair only. Not relevant for other SDK pod packages.
Use when:
/qv-sdk-bare-sdk-sync directly./qv-sdk-changelog when --package=sdk./qv-sdk-pr-create when the PR diff touches packages/sdk/package.json version or dependency blocks.@qvac/sdk's version, dependencies, optionalDependencies, or peerDependencies change and you want to keep @qvac/bare-sdk in lockstep before opening a PR.Scope: this skill mirrors packages/sdk/package.json → packages/bare-sdk/package.json only. NOTICE regeneration is a separate downstream step the caller runs after sync (see Step 3 below) via qv-notice-generate bare-sdk. The two steps are tightly related (every sync run should be followed by a NOTICE refresh) but the script itself never touches NOTICE.
Mirrors the following from sdk's package.json into bare-sdk's:
versiondependencies entries (except PLUGIN_ADDONS and SDK_ONLY_PACKAGES)optionalDependencies entries that already exist in bare-sdk (version range only)peerDependencies entries that already exist in bare-sdk (version range only)Also prunes dependencies entries that sdk no longer declares. Without this, dropping a dep from sdk leaves bare-sdk with an "extra dep" that fails check:deps-vs-sdk and forces a manual cleanup. Prune is scoped to dependencies only — optionalDependencies / peerDependencies extras are by design (bare-sdk omits Expo/Pear/RN/MCP).
packages/bare-sdk/NOTICE. Regenerating NOTICE is a separate qv-notice-generate invocation (Step 3 below). The script will not silently re-attribute the package — that requires intent and the right env tokens.keywords, description, repository, exports, imports, files, scripts, devDependencies, or peerDependenciesMeta. These intentionally diverge between the two packages.optionalDependencies or peerDependencies to bare-sdk. bare-sdk's opt/peer shape is intentionally a subset (no Expo/Pear/RN/MCP). The script only updates ranges for entries that already exist.PLUGIN_ADDONS (the 10 @qvac/* addon packages bare-sdk excludes by design). The exclusion list lives in packages/bare-sdk/scripts/plugin-addons.mjs — single source of truth, shared with check-deps-vs-sdk.mjs.check:deps-vs-sdk); the skill's job is the fix.From the monorepo root:
bashnode .cursor/skills/qv-sdk-bare-sdk-sync/scripts/sync.mjs
The script prints a summary of every change it makes to packages/bare-sdk/package.json. If nothing is out of sync, it exits cleanly with OK: no drift.
Useful flags:
| Flag | Behavior | | ----------- | -------------------------------------------------------------------------- | | --dry-run | Print the change summary without writing the file. | | --check | Exit 1 if drift is detected. Useful for ad-hoc validation (not for CI). |
bashcd packages/bare-sdk && bun run check:deps-vs-sdk
This is bare-sdk's own CI guard (packages/bare-sdk/scripts/check-deps-vs-sdk.mjs). It must pass after sync. If it fails, the sync logic and the check have drifted from each other — file an issue.
bashsource .env node .cursor/skills/qv-notice-generate/scripts/generate-notice.js bare-sdk
bare-sdk is included in FULL_MODEL_LIST_PACKAGES (see .cursor/skills/qv-notice-generate/scripts/lib/config.js) so the generated NOTICE carries the same model attributions (Gemma terms, etc.) as @qvac/sdk's NOTICE. Required because bare-sdk re-exports sdk's compiled output.
See .cursor/skills/qv-notice-generate/SKILL.md for prerequisites (GH_TOKEN, HF_TOKEN, NPM_TOKEN).
git status should show modifications to:
packages/bare-sdk/package.jsonpackages/bare-sdk/NOTICEInspect the diffs, then commit alongside the originating sdk change. When invoked from /qv-sdk-changelog, this is part of the release commit; when invoked from /qv-sdk-pr-create, this is part of the PR's last commit.
/qv-sdk-changelog/qv-sdk-changelog --package=sdk calls this skill as its final step (after NOTICE generation for sdk). This ensures every sdk release run leaves bare-sdk in sync.
If the user passes --package=<other>, this skill is skipped (it only applies to the sdk ↔ bare-sdk pair).
/qv-sdk-pr-create/qv-sdk-pr-create checks the PR diff before opening. If it touches packages/sdk/package.json and changes version, dependencies, optionalDependencies, or peerDependencies, the parent skill prompts the user to run this skill first. Opt out with --no-sync on the parent skill.
Before completing:
OK: no drift OR prints an apply summary with all expected changes.bun run check:deps-vs-sdk passes in packages/bare-sdk/.packages/bare-sdk/NOTICE regenerated and reviewed (heading reads @qvac/bare-sdk, not @qvac/sdk).packages/bare-sdk/package.json and packages/bare-sdk/NOTICE.packages/bare-sdk/scripts/check-deps-vs-sdk.mjspackages/bare-sdk/scripts/plugin-addons.mjs.cursor/skills/qv-notice-generate/SKILL.md.cursor/skills/qv-sdk-changelog/SKILL.md.cursor/skills/qv-sdk-pr-create/SKILL.md.cursor/rules/sdk/sdk-pod-packages.mdc| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-09 | fail→pass | 11,095 | 3,466 | -69% | 1 | 1 | 0% | 1,837 | 2,344 | +28% | 0 | 0 | — |
case-01 | fail→fail | 2,171 | 5,351 | +146% | 1 | 1 | 0% | 299 | 2,129 | +612% | 0 | 0 | — |
case-02 | fail→fail | 3,927 | 4,709 | +20% | 1 | 1 | 0% | 194 | 2,005 | +934% | 0 | 0 | — |
case-03 | fail→fail | 2,184 | 5,190 | +138% | 1 | 1 | 0% | 284 | 2,065 | +627% | 0 | 0 | — |
case-08 | fail→pass | 11,893 | 5,913 | -50% | 1 | 1 | 0% | 2,125 | 2,923 | +38% | 0 | 0 | — |
case-04 | fail→pass | 10,628 | 4,228 | -60% | 1 | 1 | 0% | 1,897 | 2,397 | +26% | 0 | 0 | — |
case-05 | fail→pass | 11,938 | 5,446 | -54% | 1 | 1 | 0% | 2,240 | 2,834 | +27% | 0 | 0 | — |
case-06 | fail→pass | 6,616 | 3,316 | -50% | 1 | 1 | 0% | 1,262 | 2,394 | +90% | 0 | 0 | — |
case-07 | pass→pass | 8,725 | 2,760 | -68% | 1 | 1 | 0% | 1,626 | 2,248 | +38% | 0 | 0 | — |
case-10 | fail→pass | 10,698 | 1,940 | -82% | 1 | 1 | 0% | 1,755 | 1,961 | +12% | 0 | 0 | — |
case-11 | pass→pass | 8,274 | 1,665 | -80% | 1 | 1 | 0% | 1,507 | 1,985 | +32% | 0 | 0 | — |
case-12 | pass→pass | 6,745 | 2,598 | -61% | 1 | 1 | 0% | 1,083 | 2,214 | +104% | 0 | 0 | — |
case-13 | fail→fail | 2,324 | 4,471 | +92% | 1 | 1 | 0% | 276 | 1,960 | +610% | 0 | 0 | — |
case-14 | fail→pass | 12,243 | 7,465 | -39% | 1 | 1 | 0% | 2,037 | 3,186 | +56% | 0 | 0 | — |
case-15 | pass→pass | 6,907 | 2,570 | -63% | 1 | 1 | 0% | 1,135 | 2,180 | +92% | 0 | 0 | — |
case-16 | fail→pass | 7,842 | 2,093 | -73% | 1 | 1 | 0% | 1,392 | 2,098 | +51% | 0 | 0 | — |
case-17 | fail→fail | 8,725 | 7,032 | -19% | 1 | 1 | 0% | 1,628 | 3,101 | +90% | 0 | 0 | — |
case-18 | fail→pass | 7,197 | 4,418 | -39% | 1 | 1 | 0% | 1,239 | 2,510 | +103% | 0 | 0 | — |
case-19 | pass→pass | 8,124 | 2,969 | -63% | 1 | 1 | 0% | 1,472 | 2,326 | +58% | 0 | 0 | — |
case-20 | pass→pass | 9,787 | 3,539 | -64% | 1 | 1 | 0% | 1,803 | 2,396 | +33% | 0 | 0 | — |
case-21 | pass→pass | 6,147 | 9,644 | +57% | 1 | 1 | 0% | 1,015 | 2,265 | +123% | 0 | 0 | — |
case-22 | fail→pass | 9,313 | 3,174 | -66% | 1 | 1 | 0% | 1,537 | 2,314 | +51% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +45 percentage points is the difference between those two pass rates over the 19 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.