Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Plan and prepare the QVAC agent-stack release cascade across @qvac/sdk, @qvac/cli, @qvac/ai-sdk-provider, @qvac/opencode-plugin, and @qvac/openclaw-plugin. Use for /qv-agent-stack-sync --plan, --prepare-cascade, or --promote; syncing CLI to a newer SDK; or checking OpenCode/OpenClaw/provider compatibility.
.claude/skills/tetherto-qv-agent-stack-sync/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-08 | ✗→✓ | ▲ Improved | 47% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 51% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 54% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 80% | 0% |
| case-20 | ✗→✓ | ▲ Improved | 61% | 0% |
Orchestrate the published dependency cascade:
text@qvac/sdk -> @qvac/cli -> @qvac/ai-sdk-provider -> @qvac/opencode-plugin -> @qvac/openclaw-plugin
Goal: know which packages need a release, prepare draft release + backmerge PRs when asked, never auto-publish. SDK releases still run qv-sdk-lockstep-sync for bare-sdk + sdk-python.
| Mode | Mutates? | When | | --- | --- | --- | | --plan (default) | No | Always run first. Cascade matrix + version recommendations. | | --prepare-cascade | Yes (confirm first) | Open draft release PRs and draft backmerge PRs for needs_release packages. | | --promote <slug> | Yes (confirm first) | Mark a draft release PR ready after lower-layer npm is live; re-verify. Does not publish. |
Invoke: /qv-agent-stack-sync or /qv-agent-stack-sync --plan.
.cursor/rules/sdk/sdk-pod-packages.mdc — pod scope + agent-stack order.cursor/skills/qv-sdk-changelog/SKILL.md.cursor/skills/qv-sdk-pr-create/SKILL.md.cursor/skills/qv-sdk-backmerge/SKILL.md.cursor/skills/qv-sdk-lockstep-sync/SKILL.md (sdk releases only)docs/architecture/AGENT-INTEGRATIONS.mdpackages/cli/test/AGENT_STACK_E2E.md.cursor/skills/_lib/sdk/agent-stack-plan.mjsscripts/sdk/package-paths.cjsRecommend with rationale — never silent-bump. Confirm before --prepare-cascade.
0.x carets do not cross minors (^0.8.0 ≠ 0.9.0).[bc], [api], or feat: commits.fix:).ai@7 while OpenCode still depends on ai@6 / provider ^0.2.x. Hold that plugin release until code + deps align.--promote / publish wait on npm view.git fetch org remote (upstream / tetherto/qvac) tags + main.qv-sdk-pr-create).--plan (mandatory first step)bashnode .cursor/skills/_lib/sdk/agent-stack-plan.mjs node .cursor/skills/_lib/sdk/agent-stack-plan.mjs --json
Show the markdown table to the user. For each package report:
needs_release / blockedDo not create branches or PRs in this mode.
--prepare-cascadeRequires explicit user confirmation of the plan (versions + which packages).
Then for each needs_release package in dependency order, follow references/prepare-cascade.md:
release-<slug>-<version> from main if missing.qv-sdk-changelog --package=<slug>) + NOTICE.release-<slug>-<version>.main ([skiplog], cherry-pick -x) in the same session.SDK releases still chain qv-sdk-lockstep-sync + docs Step 8 from qv-sdk-changelog.
--promote <slug>npm view).packages/cli/package.json — version + dependencies["@qvac/sdk"]qv-sdk-changelog --package=cliqv-notice-generate clipackages/ai-sdk-provider/package.json — version + extend peerDependencies["@qvac/cli"]plugins/opencode/package.json or plugins/openclaw/package.json (+ openclaw.plugin.json version when present)@qvac/cli and @qvac/ai-sdk-provider deps to the planned minorsai / @ai-sdk/openai-compatible majors to match the provider — if not aligned, plan marks blockedqv-sdk-changelog --package=opencode-plugin or --package=openclaw-plugin (path map resolves plugins/*)lint, build, test:unit, test:e2e, node scripts/check-publish-ready.cjslint, build, test:unit (optional QVAC_INTEGRATION_TEST=1 npm run test:integration)lint, build, test:unit (optional integration where available)bashtmp=$(mktemp -d) cd "$tmp" npm init -y npm install --no-fund --no-audit @qvac/opencode-plugin@latest npm ls @qvac/opencode-plugin @qvac/ai-sdk-provider @qvac/cli @qvac/sdk
Repeat with @qvac/openclaw-plugin@latest when promoting OpenClaw.
Always end with:
--json output)--plan run before any mutation--prepare-cascadetetherto/qvac)| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 3,763 | 6,374 | +69% | 1 | 1 | 0% | 405 | 2,234 | +452% | 0 | 0 | — |
case-02 | fail→fail | 5,984 | 4,923 | -18% | 1 | 1 | 0% | 427 | 2,104 | +393% | 0 | 0 | — |
case-03 | fail→fail | 11,689 | 5,775 | -51% | 1 | 1 | 0% | 1,426 | 2,236 | +57% | 0 | 0 | — |
case-04 | fail→fail | 3,951 | 7,050 | +78% | 1 | 1 | 0% | 588 | 2,185 | +272% | 0 | 0 | — |
case-05 | fail→fail | 7,772 | 6,238 | -20% | 1 | 1 | 0% | 1,427 | 2,138 | +50% | 0 | 0 | — |
case-06 | fail→fail | 12,444 | 6,165 | -50% | 1 | 1 | 0% | 2,468 | 2,133 | -14% | 0 | 0 | — |
case-07 | fail→fail | 15,904 | 2,640 | -83% | 1 | 1 | 0% | 938 | 2,300 | +145% | 0 | 0 | — |
case-08 | fail→pass | 12,978 | 9,294 | -28% | 1 | 1 | 0% | 1,902 | 2,799 | +47% | 0 | 0 | — |
case-09 | pass→pass | 9,007 | 4,469 | -50% | 1 | 1 | 0% | 1,317 | 2,575 | +96% | 0 | 0 | — |
case-10 | pass→pass | 6,770 | 3,945 | -42% | 1 | 1 | 0% | 1,139 | 2,521 | +121% | 0 | 0 | — |
case-11 | pass→pass | 6,244 | 4,550 | -27% | 1 | 1 | 0% | 1,111 | 2,527 | +127% | 0 | 0 | — |
case-12 | fail→pass | 8,399 | 2,329 | -72% | 1 | 1 | 0% | 1,430 | 2,159 | +51% | 0 | 0 | — |
case-22 | fail→fail | 6,188 | 1,944 | -69% | 1 | 1 | 0% | 1,059 | 2,109 | +99% | 0 | 0 | — |
case-13 | fail→fail | 7,542 | 2,160 | -71% | 1 | 1 | 0% | 1,194 | 2,182 | +83% | 0 | 0 | — |
case-14 | pass→pass | 6,003 | 2,559 | -57% | 1 | 1 | 0% | 958 | 2,135 | +123% | 0 | 0 | — |
case-15 | fail→fail | 11,551 | 1,833 | -84% | 1 | 1 | 0% | 1,890 | 2,085 | +10% | 0 | 0 | — |
case-16 | fail→fail | 7,328 | 1,606 | -78% | 1 | 1 | 0% | 1,178 | 2,051 | +74% | 0 | 0 | — |
case-17 | pass→pass | 6,104 | 2,023 | -67% | 1 | 1 | 0% | 1,083 | 2,171 | +100% | 0 | 0 | — |
case-18 | fail→pass | 8,655 | 1,807 | -79% | 1 | 1 | 0% | 1,367 | 2,112 | +54% | 0 | 0 | — |
case-19 | fail→pass | 6,921 | 2,162 | -69% | 1 | 1 | 0% | 1,201 | 2,159 | +80% | 0 | 0 | — |
case-20 | fail→pass | 8,401 | 2,712 | -68% | 1 | 1 | 0% | 1,414 | 2,283 | +61% | 0 | 0 | — |
case-21 | pass→pass | 4,411 | 1,837 | -58% | 1 | 1 | 0% | 672 | 2,119 | +215% | 0 | 0 | — |
case-23 | pass→pass | 5,834 | 1,964 | -66% | 1 | 1 | 0% | 791 | 2,150 | +172% | 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. 23 cases were attempted, and 16 counted toward the lift figure. The other 7 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 +22 percentage points is the difference between those two pass rates over the 16 comparable cases. 3 cases got worse with the skill loaded, and they are included in that figure.
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.