Skip to content

feat(packs): AI SDK (ai) 6 → 7, the first pack built with pack new and pack test - #39

Merged
lucasbraum merged 10 commits into
mainfrom
claude/packs-public-contract-51k71t-ai-pack
Oct 7, 2026
Merged

lucasbraum merged 10 commits into
mainfrom
claude/packs-public-contract-51k71t-ai-pack

Conversation

@lucasbraum

@lucasbraum lucasbraum commented Oct 7, 2026 •

Copy link
Copy Markdown
Collaborator

Pack

ai >=6 <7 → >=7 <8 (most recent breaking major: 7.0.0, 2026-06-25). Scaffolded with uptide pack new ai --from ">=6 <7" --to ">=7 <8" and scored only with uptide pack test ai.

Sources

Rules and behavior notes

  • Rewrites (deprecated, found by detect through imports from ai, so another library's system: or @ai-sdk/react's onFinish is never touched): instructions (system), on-end (onFinish on generateText/streamText/ToolLoopAgent/UI message streams), on-step-end, telemetry (experimental_telemetry), is-step-count (stepCountIs, import and references; an alias keeps its local name).
  • Rewrites of check's own findings: full-stream (deprecated fullStream → stream; a destructured local is renamed only where no other stream is declared), total-usage, and removed-experimental-option (breaking: experimental_activeTools/prepareStep/output, matched on the compiler's message).
  • Assisted (guide to the agent): ui-message-stream (result helpers become standalone functions), telemetry-metadata (breaking: metadata → runtimeContext + includeRuntimeContext), tool-context (breaking: context in tool execute options).
  • Behavior notes, listed for review: telemetry registration (no spans without registerTelemetry), results covering every step, system messages rejected, prepareStep carrying forward, redacted UI stream errors, ESM-only/Node 22.

fix ai upgrades the whole group

ai and the @ai-sdk/* packages pin the same @ai-sdk/provider, so bumping ai alone leaves an install no real upgrade has. check now takes the group list already draws (family, peer link, shared pin) among the installed dependencies and moves each member to the version that agrees with the target (check/companions.ts): the version the target pins, else the installed one when it already accepts the target, else its newest release that pins or accepts it, else one whose exact pins agree. fix bumps and installs them in one step and one commit (the lock guard allows changes inside their subtrees only), and stops before writing anything when a member has no release that agrees. check's plan (↑ upgrades with …), the fix summary (With) and the PR description name each companion and why. npm and pnpm resolve the exact version first, so ^4.0.1 keeps the 4.0.1 that ai pins rather than a second copy at 4.0.24 (found on the end-to-end run below).

Ground-truth entries take with: the packages the repository's own upgrade moved (from its package.json). pack test prints what check moves and fails, and the pack is not verified, when check would leave one behind. For both repositories check moves exactly the packages the maintainers moved.

Tests: check/companions.test.ts (the case where only ai would move today: ai 6 with @ai-sdk/react, @ai-sdk/provider, @ai-sdk/openai installed → all three move, zod doesn't; a member with no agreeing release is a conflict; a member that already accepts the target stays), fix/generic.test.ts (one install with also, both manifests bumped, commit and PR body; a conflict changes nothing), text-lock.test.ts (several targets: the group may move, ai alone may not drag @ai-sdk/react, nothing else may move), format-check.test.ts (the plan line).

Ground-truth repositories

Repository Pinned (before upgrade) Upgrade commit ai Expected
vercel/chatbot 77d362e596e2c624638cad5a35199c0c8785c9fd 2397c783b505997a09968c4619ec42dc450cc705 (vercel/chatbot#1515) 6.0.116 → 7.0.9 27
miurla/morphic 989a05697d973030f2fbb4b805326bb24e68fd0d 0ec2ca733c8cadb589d741097a2766f67e1766a3 (miurla/morphic#972) 6.0.180 → 7.0.66 34

Expected findings were drafted with pnpm packs:truth (the repo's own TypeScript with ai and the companions its upgrade moved, versions from its lockfile; plus the upgrade diff) and read by hand. Each entry's with lists the packages its upgrade moved with ai. Excluded: morphic's experimental_throttle (@ai-sdk/react), comments, and pure insertions.

uptide pack test output

The output for zod, stripe and ai, run on this branch after it was merged with main, is in this comment. ai:

uptide pack test ai · verified
fixtures      6 cases, 19 sites · pass
ground truth
  vercel/chatbot@77d362e596e2                  ai 6.0.116 → 7.0.9  predicted 27, expected 27, false positives 0, false negatives 0
    with @ai-sdk/provider 3.0.3 → 4.0.1, @ai-sdk/react 3.0.118 → 4.0.10
  miurla/morphic@989a05697d97                  ai 6.0.180 → 7.0.66  predicted 20, expected 34, false positives 0, false negatives 14
    with @ai-sdk/anthropic 3.0.77 → 4.0.39, @ai-sdk/gateway 3.0.114 → 4.0.52, @ai-sdk/google 3.0.73 → 4.0.46, @ai-sdk/openai 3.0.63 → 4.0.43, @ai-sdk/openai-compatible 2.0.47 → 3.0.31, @ai-sdk/react 3.0.182 → 4.0.69, ai-sdk-ollama 3.8.4 → 4.2.0
  rule                         precision  recall    tp   fp   fn
  full-stream                       100%    100%    12    0    0
  generic                           100%      0%     0    0    4
  instructions                      100%    100%    12    0    0
  is-step-count                     100%     89%     8    0    1
  on-end                            100%     43%     3    0    4
  on-step-end                       100%      0%     0    0    2
  removed-experimental-option       100%    100%     1    0    0
  telemetry                         100%    100%     3    0    0
  telemetry-metadata                100%    100%     2    0    0
  tool-context                      100%     25%     1    0    3
  total-usage                       100%    100%     2    0    0
  ui-message-stream                 100%    100%     3    0    0
  overall (sites)                   100%     77%    47    0   14
  breaking (sites)                  100%     36%     4    0    7
PASS ai: verified

zod and stripe still pass and stay verified, with nothing moving alongside them (band-sdk's @modelcontextprotocol/sdk already accepts zod 4, so it stays). zod's PATH entry gained 5 sites from the refined one-site-per-change rule.

Extra end-to-end check: uptide fix ai --target 7.0.9 --no-llm --include-deprecated on a copy of vercel/chatbot applied 26 sites by rule. The rewritten files match the maintainers' own upgrade byte for byte (e.g. artifacts/code/server.ts → blob beb7f35, the same blob as their commit). Before the group upgrade, verification failed with 46 → 45 errors. It now passes:

uptide fix · ai 6.0.116 → 7.0.9 (requested) · verification passed · 2m 20s

  Risk      High: manual sites left
  Changes   27 sites in 6 files · 26 auto-fixed · 0 fixed by the agent (LLM) · 1 manual
  Types     ✅ 1 error after the bump → 0
  Behavior  ⚠️ not checked
  Tests     ⚠️ the repository: the run already failing before the change; nothing else ran · lint clean (biome)
  With      @ai-sdk/provider 3.0.3 → 4.0.1, @ai-sdk/react 3.0.118 → 4.0.10

Upgrade commit: chore: upgrade ai to 7.0.9 with @ai-sdk/provider 4.0.1, @ai-sdk/react 4.0.10, with one @ai-sdk/provider (4.0.1) in the lockfile. The PR description opens with:

Upgraded with ai, so the install stays consistent:

- `@ai-sdk/provider` 3.0.3 → 4.0.1 (ai 7.0.9 pins @ai-sdk/provider 4.0.1)
- `@ai-sdk/react` 3.0.118 → 4.0.10 (@ai-sdk/react 4.0.10 pins ai 7.0.9)

Where the tooling or docs got in the way, and what this PR does about it

  1. ground truth install: bun repos (miurla/morphic, bun.lock) cannot be installed; packageManager() knows npm/pnpm/yarn only.
  2. contract: a rule could claim a finding only by change kind + symbol path; a compiler-only finding (TS2353) is claimed by every rule matching the code, whatever the message names. Added message to PackRule.
  3. plan: a contract pack's rule without rewrite never shows under its id in check's plan (sites fall back to the compiler code), so pack test scores them generic. Added MigrationPack.ruleOf, implemented by definePack, used by the plan before the zod/stripe-specific classification.
  4. fixtures: a marker could not carry the compiler message a compiler-only finding has (rules matching on message could not be fixture-tested). Added message:"..." to markers.
  5. fixtures: after.ts had to be written by hand with nothing to show what the rules produce, and a mismatch printed only the first differing line. Added pack test --update-fixtures (writes after.ts from the rules, reviewed in the diff like a snapshot update).
  6. pack test --fixtures-only said "no repository yet: the pack ships as a candidate" for a pack with two ground-truth repositories. Now says the repositories were skipped.
  7. rewrites by line text matched names inside trailing comments (and fixture markers are comments): onlyOnLine now edits the code part of the line, and the stream collision check reads declarations from the AST.
  8. pack new rendered the registry's imports in an order biome's organize-imports rejects when the new pack's directory sorts before contract.ts (ai does), so the scaffold failed pnpm lint; the e2e test used toy-lib, which sorts after. The renderer now sorts every import by path, and the test scaffolds a name that sorts first.
  9. packs:truth linked only the target package: its own dependencies (ai 7 → @ai-sdk/provider-utils 5) resolved to the repository's older copies, and companions the upgrade moved together (@ai-sdk/react 4) stayed old, which produced ~60 compiler errors no real upgrade has. It now assembles the target with its dependencies at the versions it declares, as check does, and --also links companions at the versions the upgrade commit moved them to.
  10. pack test's breaking recall counted every missed site, deprecated ones included (ai showed 22% breaking recall, mostly onFinish/onStepFinish renames that still compile). A miss now counts toward breaking recall by its rule's severity (generic and notes count as breaking).
  11. check's summary named sites found by detect by an internal path (ai:instructions, ai:is-step-count) instead of what the code says. A detected site can carry the name as written (system, stepCountIs), and check shows that.
  12. the CLI's fix kept its own list of packs (status.ts SUPPORTED: zod, stripe): fix ai --no-llm refused with "ai has no migration pack" although the registry has it verified. fix now asks the registry (activePacks); its --only help names the verified packs from it. The no-argument overview still lists zod and stripe only (unchanged).
    (core fix/isolate.ts had the same list: ['zod', 'stripe'].includes(only).)
  13. fix upgraded ai alone: release groups are one scope (@aws-sdk/*), so ai + @ai-sdk/* never formed one, and verification on vercel/chatbot failed with ~45 errors from the install, not the code. Fixed here (see "fix ai upgrades the whole group"); the pack's "companion packages" review note is gone.
  14. A ^ range bumped to a companion's agreeing version (^4.0.1) let pnpm resolve the newest in range (4.0.24), a second provider copy. npm already resolved exact-then-range; pnpm now does too.

Checklist

  • Every rule and note comes from a source in meta.sources
  • Every rule that rewrites or detects has a fixture case, with a site it must leave alone (keep)
  • Ground truth: public repositories at the commit before their upgrade; expected findings from their own upgrade commit and compiler, never from Uptide's output
  • Two public repositories: verified
  • pnpm uptide pack test passes for ai, stripe and zod on this branch merged with main; verification.json written with --write
  • pnpm lint && pnpm typecheck && pnpm test pass (core 874 passed, 15 skipped; CLI 344/344)
  • fix ai upgrades the group; ground truth records what each real upgrade moved (with)
  • Changesets added (.changeset/ai-pack.md, .changeset/companion-upgrades.md, minor)
  • No private code, names or paths

🤖 Generated with Claude Code

https://claude.ai/code/session_01B2T8GmEVnZwfNrugajEMqi

claude added 9 commits October 7, 2026 06:47
…implement it

Pack (meta with sources and maintainer, rules that claim check's findings
and rewrite one site, behavior notes with how they are reported, agent
instructions) on top of MigrationPack. check, fix, list and verify take
their packs from a generated registry, verified ones only. Zod's rules
carry their own rewrite; stripe declares the rules its evidence
classifies. Outputs on the storefront fixture and the corpus unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B2T8GmEVnZwfNrugajEMqi
Signed-off-by: Claude <noreply@anthropic.com>
pack new scaffolds a pack that lints and passes its tests as written and
registers it. pack test runs its fixtures, then check with the pack on
each ground-truth repository (fetched shallow at the pinned commit,
installed with scripts off, cached), and prints precision and recall per
rule, overall and for breaking findings, with every false positive and
false negative. --json for CI. pnpm uptide runs the CLI from source.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B2T8GmEVnZwfNrugajEMqi
Signed-off-by: Claude <noreply@anthropic.com>
… Packs workflow

docs/packs.md with zod as the reference; CONTRIBUTING.md "Write a pack";
a pack pull request template and the pack request issue form; ADR 0015;
packs/queue.json from public npm data (pnpm packs:queue); a Packs
workflow that runs pack test for every pack with the ground-truth cache.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B2T8GmEVnZwfNrugajEMqi
Signed-off-by: Claude <noreply@anthropic.com>
pnpm packs:truth lists, for one public repository, the diagnostics its
own TypeScript reports with the target linked in and not without it
(errors and deprecations), and the lines its upgrade commit changed.
Ground truth can name a project directory inside the repository; an
install whose lockfile was already out of sync falls back to an
unfrozen install, scripts still off.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B2T8GmEVnZwfNrugajEMqi
Signed-off-by: Claude <noreply@anthropic.com>
zod: AwesomeIntune, PATH and band-sdk-typescript at the commit before
their zod 4 upgrade; stripe: unkey and saas-starter before their
stripe-node majors; both also scored on the storefront fixture. No false
positive among breaking findings (zod 57 sites, recall 76%; stripe 18
sites, recall 90%).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B2T8GmEVnZwfNrugajEMqi
Signed-off-by: Claude <noreply@anthropic.com>
- pack new rendered the registry's imports in an order biome rejects
  when the new directory sorts before contract.ts; sorted by path now.
- A rule can match on the compiler's message (a compiler-only finding's
  path is only its code), and the plan files a contract pack's sites
  under the rule that claims them, rewrite or not (ruleOf).
- Fixture markers take message:"..."; pack test --update-fixtures
  writes after.ts from the rules; --fixtures-only says ground truth was
  skipped instead of "no repository yet".
- Breaking recall counts a miss by its rule's severity.
- A site found by detect carries the name the code writes.
- Ground-truth repositories can install with bun (and the Packs job
  sets it up).
- packs:truth links the target with its own dependencies at the
  versions it declares, and --also links what the upgrade moved with it;
  runs of changed lines split where the change does.
- fix took its list of packs from two hard-coded lists (CLI and
  isolate); both ask the registry now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B2T8GmEVnZwfNrugajEMqi
Signed-off-by: Claude <noreply@anthropic.com>
Five more sites in PATH, all changes its upgrade made (a cast to a
removed type, _def.typeName reads zod 4 no longer has). Still no false
positive; recall recorded again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B2T8GmEVnZwfNrugajEMqi
Signed-off-by: Claude <noreply@anthropic.com>
…a/morphic

Built with pack new and pack test only. Rules rewrite the renamed
options (system, onFinish, onStepFinish, experimental_telemetry),
stepCountIs, fullStream, totalUsage and the removed experimental_*
options; telemetry metadata, tool context and the stream result helpers
go to the agent; what the compiler cannot see is listed for review.
Ground truth from each repository's own upgrade commit and compiler: no
false positive, 47 of 61 sites (chatbot 27 of 27).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B2T8GmEVnZwfNrugajEMqi
Signed-off-by: Claude <noreply@anthropic.com>
…h it

`fix ai` bumped ai alone: ai and the @ai-sdk/* packages pin the same
@ai-sdk/provider, so ai 7 next to @ai-sdk/react 3 was an install no real
upgrade has, and verification on vercel/chatbot failed with ~45 errors
that came from the install, not the code.

check now finds the group `list` already draws (family, peer link, shared
pin) among the installed dependencies and moves each member to the
version that agrees with the target: the version the target pins, else
the installed one when it already accepts the target, else its newest
release that pins or accepts it, else one whose exact pins agree. The
report carries `companions` and `companionConflicts`; check's plan, the
fix summary (`With`) and the PR description say which and why. fix bumps
and installs them in one step and one commit; the lock guard allows
changes inside any of their subtrees only. npm and pnpm resolve the exact
version first, so `^4.0.1` keeps the 4.0.1 ai pins. A member with no
release that agrees stops fix before it writes anything.

Ground-truth entries take `with`, the packages the repository's own
upgrade moved; pack test prints what check moves and fails, and the pack
is not verified, when check would leave one behind. The ai pack's ground
truth records them for vercel/chatbot and miurla/morphic, and its
"companion packages" review note is gone. On a copy of vercel/chatbot,
`fix ai --target 7.0.9 --no-llm --include-deprecated` now passes
verification (1 error after the bump -> 0).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B2T8GmEVnZwfNrugajEMqi
Signed-off-by: Claude <noreply@anthropic.com>
Base automatically changed from claude/packs-public-contract-51k71t to main October 7, 2026 18:41
main is this branch's base (#38, squash-merged) plus #40: the result
keeps this branch's tree and applies #40's changes on top.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B2T8GmEVnZwfNrugajEMqi
Signed-off-by: Claude <noreply@anthropic.com>

Copy link
Copy Markdown
Collaborator Author

Retargeted to main after #40 and #38 merged. main was merged in at 6a3f88d. #38 was squash-merged, so this branch keeps its own tree with #40's diff applied on top; the result differs from main by exactly this PR's own changes. On this head, pnpm lint and pnpm typecheck are clean, and pnpm test passes with no failures (core 874 passed, 15 skipped; CLI 344/344).

Final pnpm uptide pack test (all packs) on this head:

uptide pack test ai · verified
fixtures      6 cases, 19 sites · pass
ground truth
  vercel/chatbot@77d362e596e2                  ai 6.0.116 → 7.0.9  predicted 27, expected 27, false positives 0, false negatives 0
    with @ai-sdk/provider 3.0.3 → 4.0.1, @ai-sdk/react 3.0.118 → 4.0.10
  miurla/morphic@989a05697d97                  ai 6.0.180 → 7.0.66  predicted 20, expected 34, false positives 0, false negatives 14
    with @ai-sdk/anthropic 3.0.77 → 4.0.39, @ai-sdk/gateway 3.0.114 → 4.0.52, @ai-sdk/google 3.0.73 → 4.0.46, @ai-sdk/openai 3.0.63 → 4.0.43, @ai-sdk/openai-compatible 2.0.47 → 3.0.31, @ai-sdk/react 3.0.182 → 4.0.69, ai-sdk-ollama 3.8.4 → 4.2.0

  rule                         precision  recall    tp   fp   fn
  full-stream                       100%    100%    12    0    0
  generic                           100%      0%     0    0    4
  instructions                      100%    100%    12    0    0
  is-step-count                     100%     89%     8    0    1
  on-end                            100%     43%     3    0    4
  on-step-end                       100%      0%     0    0    2
  removed-experimental-option       100%    100%     1    0    0
  telemetry                         100%    100%     3    0    0
  telemetry-metadata                100%    100%     2    0    0
  tool-context                      100%     25%     1    0    3
  total-usage                       100%    100%     2    0    0
  ui-message-stream                 100%    100%     3    0    0
  overall (sites)                   100%     77%    47    0   14
  breaking (sites)                  100%     36%     4    0    7

false negatives (14)
  miurla/morphic@989a05697d97  lib/agents/__tests__/researcher.test.ts:10  is-step-count
  miurla/morphic@989a05697d97  lib/agents/researcher.ts:3  generic
  miurla/morphic@989a05697d97  lib/agents/researcher.ts:168  generic
  miurla/morphic@989a05697d97  lib/streaming/__tests__/create-chat-stream-response.test.ts:79  on-end
  miurla/morphic@989a05697d97  lib/streaming/__tests__/create-chat-stream-response.test.ts:94  on-end
  miurla/morphic@989a05697d97  lib/streaming/__tests__/create-ephemeral-chat-stream-response.test.ts:62  on-end
  miurla/morphic@989a05697d97  lib/streaming/__tests__/create-ephemeral-chat-stream-response.test.ts:88  on-end
  miurla/morphic@989a05697d97  lib/streaming/create-chat-stream-response.ts:222  on-step-end
  miurla/morphic@989a05697d97  lib/streaming/create-ephemeral-chat-stream-response.ts:134  on-step-end
  miurla/morphic@989a05697d97  lib/tools/__tests__/fetch-error.test.ts:23  tool-context
  miurla/morphic@989a05697d97  lib/tools/__tests__/fetch-error.test.ts:55  tool-context
  miurla/morphic@989a05697d97  lib/tools/__tests__/fetch-error.test.ts:91  tool-context
  miurla/morphic@989a05697d97  lib/tools/search.ts:214  generic
  miurla/morphic@989a05697d97  lib/types/agent.ts:23  generic

PASS ai: verified
uptide pack test stripe · verified
fixtures      0 cases, 0 sites · pass
ground truth
  fixtures/repos/storefront                    stripe 14.25.0 → 23.0.0  predicted 4, expected 4, false positives 0, false negatives 0
  unkeyed/unkey@37044fc57fe0                   stripe 14.23.0 → 22.2.0  predicted 13, expected 15, false positives 0, false negatives 2
  nextjs/saas-starter@3e5fd2bf626c             stripe 17.7.0 → 18.0.0  predicted 1, expected 1, false positives 0, false negatives 0

  rule                         precision  recall    tp   fp   fn
  api-version                       100%    100%     4    0    0
  fixture-cast                      100%    100%     1    0    0
  generic                             0%    100%     0   10    0
  sdk-surface                       100%      0%     0    0   11
  subscription-period               100%     75%     3    0    1
  overall (sites)                   100%     90%    18    0    2
  breaking (sites)                  100%     90%    18    0    2

false negatives (2)
  unkeyed/unkey@37044fc57fe0  apps/dashboard/lib/stripe/paymentUtils.ts:287  subscription-period
  unkeyed/unkey@37044fc57fe0  apps/dashboard/lib/stripe/subscriptionUtils.ts:118  sdk-surface

reported under another rule (10)
  unkeyed/unkey@37044fc57fe0  apps/dashboard/lib/stripe/paymentUtils.ts:253  generic, expected sdk-surface
  unkeyed/unkey@37044fc57fe0  apps/dashboard/lib/stripe/paymentUtils.ts:258  generic, expected sdk-surface
  unkeyed/unkey@37044fc57fe0  apps/dashboard/lib/stripe/paymentUtils.ts:264  generic, expected sdk-surface
  unkeyed/unkey@37044fc57fe0  apps/dashboard/lib/stripe/paymentUtils.ts:363  generic, expected sdk-surface
  unkeyed/unkey@37044fc57fe0  apps/dashboard/lib/stripe/paymentUtils.ts:365  generic, expected sdk-surface
  unkeyed/unkey@37044fc57fe0  apps/dashboard/lib/stripe/paymentUtils.ts:366  generic, expected sdk-surface
  unkeyed/unkey@37044fc57fe0  apps/dashboard/lib/stripe/paymentUtils.ts:367  generic, expected sdk-surface
  unkeyed/unkey@37044fc57fe0  apps/dashboard/lib/stripe/paymentUtils.ts:450  generic, expected sdk-surface
  unkeyed/unkey@37044fc57fe0  apps/dashboard/lib/trpc/routers/utils/stripe.ts:49  generic, expected sdk-surface
  unkeyed/unkey@37044fc57fe0  tools/migrate/migrate_subscription.ts:3  generic, expected sdk-surface

PASS stripe: verified
uptide pack test zod · verified
fixtures      2 cases, 8 sites · pass
ground truth
  fixtures/repos/storefront                    zod 3.25.76 → 4.6.5  predicted 38, expected 38, false positives 0, false negatives 0
  ugurkocde/AwesomeIntune@dcf38603fd55         zod 3.25.76 → 4.6.5  predicted 12, expected 15, false positives 0, false negatives 3
  howardyang2009/PATH@bb171417d911             zod 3.25.76 → 4.6.5  predicted 39, expected 51, false positives 0, false negatives 12
  band-ai/band-sdk-typescript@5d9a66a1dde4     zod 3.25.76 → 4.6.5  predicted 29, expected 37, false positives 0, false negatives 8

  rule                         precision  recall    tp   fp   fn
  error-params                      100%     89%    24    0    3
  generic                            84%     78%    43    8   12
  ip                                100%    100%     1    0    0
  string-format                     100%    100%    26    0    0
  types                             100%     50%    16    0   16
  overall (sites)                   100%     84%   118    0   23
  breaking (sites)                  100%     71%    57    0   23

false negatives (23)
  ugurkocde/AwesomeIntune@dcf38603fd55  src/app/api/ideas/route.ts:201  generic
  ugurkocde/AwesomeIntune@dcf38603fd55  src/app/api/submit-tool/route.ts:17  generic
  ugurkocde/AwesomeIntune@dcf38603fd55  src/app/api/v1/keys/route.ts:30  generic
  howardyang2009/PATH@bb171417d911  packages/designer/src/open-workflow.ts:149  generic
  howardyang2009/PATH@bb171417d911  packages/engine/step-plugins/person-activity/index.ts:5  generic
  howardyang2009/PATH@bb171417d911  packages/engine/step-plugins/prompt/index.ts:41  generic
  howardyang2009/PATH@bb171417d911  packages/schema/src/nodes.ts:59  types
  howardyang2009/PATH@bb171417d911  packages/schema/src/nodes.ts:206  types
  howardyang2009/PATH@bb171417d911  packages/schema/src/nodes.ts:260  generic
  howardyang2009/PATH@bb171417d911  packages/schema/src/nodes.ts:291  types
  howardyang2009/PATH@bb171417d911  packages/schema/src/wire-step-plugins.ts:1  types
  howardyang2009/PATH@bb171417d911  packages/schema/src/wire-step-plugins.ts:83  generic
  howardyang2009/PATH@bb171417d911  packages/schema/src/wire-step-plugins.ts:86  generic
  howardyang2009/PATH@bb171417d911  packages/schema/src/wire-step-plugins.ts:93  generic
  howardyang2009/PATH@bb171417d911  packages/schema/src/wire-step-plugins.ts:97  generic
  band-ai/band-sdk-typescript@5d9a66a1dde4  packages/sdk/src/mcp/sdk.ts:359  types
  band-ai/band-sdk-typescript@5d9a66a1dde4  packages/sdk/src/mcp/server.ts:311  types
  band-ai/band-sdk-typescript@5d9a66a1dde4  packages/sdk/src/mcp/sse.ts:239  types
  band-ai/band-sdk-typescript@5d9a66a1dde4  packages/sdk/src/mcp/stdio.ts:93  types
  band-ai/band-sdk-typescript@5d9a66a1dde4  packages/sdk/src/mcp/zod.ts:5  types
  band-ai/band-sdk-typescript@5d9a66a1dde4  packages/sdk/src/mcp/zod.ts:6  types
  band-ai/band-sdk-typescript@5d9a66a1dde4  packages/sdk/src/mcp/zod.ts:19  types
  band-ai/band-sdk-typescript@5d9a66a1dde4  packages/sdk/src/runtime/tools/customTools.ts:1  generic

reported under another rule (8)
  ugurkocde/AwesomeIntune@dcf38603fd55  src/lib/schemas/tool-submission.ts:99  generic, expected error-params
  howardyang2009/PATH@bb171417d911  packages/schema/src/nodes.ts:1  generic, expected types
  howardyang2009/PATH@bb171417d911  packages/schema/src/nodes.ts:255  generic, expected error-params
  howardyang2009/PATH@bb171417d911  packages/schema/src/nodes.ts:292  generic, expected error-params
  band-ai/band-sdk-typescript@5d9a66a1dde4  packages/sdk/src/integrations/linear/tools.ts:289  generic, expected types
  band-ai/band-sdk-typescript@5d9a66a1dde4  packages/sdk/src/integrations/linear/tools.ts:290  generic, expected types
  band-ai/band-sdk-typescript@5d9a66a1dde4  packages/sdk/src/runtime/tools/customTools.ts:5  generic, expected types
  band-ai/band-sdk-typescript@5d9a66a1dde4  packages/sdk/src/runtime/tools/customTools.ts:78  generic, expected types

PASS zod: verified

All three are verified with no false positive. zod's PATH entry has 51 expected sites here, against 46 in #38: this PR refines the one-site-per-change rule, so zod's ground truth changed and its verification.json was re-recorded.


Generated by Claude Code

@lucasbraum
lucasbraum merged commit b9f9974 into main Oct 7, 2026
7 checks passed
@lucasbraum
lucasbraum deleted the claude/packs-public-contract-51k71t-ai-pack branch October 7, 2026 18:57
@uptide-release uptide-release Bot mentioned this pull request Oct 7, 2026
lucasbraum pushed a commit that referenced this pull request Oct 8, 2026
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and publish to npm
yourself or [setup this action to publish
automatically](https://github.com/changesets/action#with-publishing). If
you're not ready to do a release yet, that's fine, whenever you add more
changesets to main, this PR will be updated.


# Releases
## uptide@0.5.0

### Minor Changes

- [#39](#39)
[`b9f9974`](b9f9974)
Thanks [@lucasbraum](https://github.com/lucasbraum)! - A verified
migration pack for the AI SDK (`ai`) 6 → 7: the renamed options
(`system` →
`instructions`, `onFinish` → `onEnd`, `onStepFinish` → `onStepEnd`,
`experimental_telemetry`
→ `telemetry`), `stepCountIs` → `isStepCount`, `fullStream` → `stream`,
`totalUsage` → `usage`
and the removed `experimental_*` options are rewritten by rule;
telemetry `metadata`, tool
`context` and the stream result helpers go to the agent with the guide;
what the compiler
cannot see (telemetry registration, results that now cover every step,
rejected system
messages) is listed for review. Scored against vercel/chatbot and
miurla/morphic at the
commit before their own upgrade: no false positive. `uptide pack test`
gains
`--update-fixtures`, fixture markers take the compiler's `message`, and
ground-truth
  repositories can use bun.

- [#39](#39)
[`b9f9974`](b9f9974)
Thanks [@lucasbraum](https://github.com/lucasbraum)! - `check` and `fix`
upgrade a package together with the packages that must move with it,
using the groups `list` already draws (family, peer link, shared pin),
each at the version
that agrees with the target. `fix ai` also bumps `@ai-sdk/react`,
`@ai-sdk/provider` and the
installed `@ai-sdk/*` providers in one install and one commit; check's
plan, the fix summary
and the PR description say which and why, and `fix` stops before
changing anything when a
member has no release that agrees. npm and pnpm installs resolve the
exact version first,
so a `^` range keeps the version the target pins. Ground-truth entries
take `with`, the
packages the real upgrade moved, and `pack test` fails when check would
leave one behind.

- [#38](#38)
[`adaf8f9`](adaf8f9)
Thanks [@lucasbraum](https://github.com/lucasbraum)! - Migration packs
are a public, testable contract (docs/packs.md). `uptide pack new`
scaffolds
a pack (an example rule, a fixture pair, a test, empty ground truth) and
registers it;
`uptide pack test` scores packs against their fixtures and against
public repositories at the
commit before their upgrade, with precision and recall per rule, every
false positive and
false negative, and `--json` for CI. A pack is labeled verified only
with ground truth from at
least two public repositories and no false positive among its breaking
findings; otherwise it
ships as a candidate and `check`, `list` and `fix` treat the dependency
as generic.

### Patch Changes

- [#44](#44)
[`b4cc21f`](b4cc21f)
Thanks [@lucasbraum](https://github.com/lucasbraum)! - `check` no longer
dies with "Manipulation error: A syntax error was inserted." on packages
whose type aliases give their type parameters defaults (`type-fest` 4 →
5, `i18next` 23 → 26):
the alias body is read after the parameter list, not at the first
default's ` = `, so these
aliases are compared by the checker instead of breaking the comparison
program.

- [#40](#40)
[`3e3a5fa`](3e3a5fa)
Thanks [@lucasbraum](https://github.com/lucasbraum)! - `fix` verifies
with the repository's own TypeScript (its `node_modules/typescript`, or
an
ancestor's) or the bundled one, and never with a TypeScript that
`NODE_PATH` or Node's global
folders happen to provide. A machine with a global TypeScript 6 made
verification report
  TS5107 deprecations the repository never sees.

- [#37](#37)
[`3e7f744`](3e7f744)
Thanks [@lucasbraum](https://github.com/lucasbraum)! - Gemini is
labelled experimental: in `fix --help`, in the `LLM:` line `fix` prints,
and in the
docs. Its evaluation runs on the storefront fixture failed on service
errors (HTTP 503/429),
  so its migration quality is not established yet.

Co-authored-by: uptide-release[bot] <338861287+uptide-release[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants