Skip to content

fix: dms-saas cancel site survives feedback, oxfmt per workspace (UPT-101) - #221

Merged
lucasbraum merged 3 commits into
mainfrom
upt-101-dms-cancel-format
Oct 18, 2026
Merged

lucasbraum merged 3 commits into
mainfrom
upt-101-dms-cancel-format

Conversation

@lucasbraum

Copy link
Copy Markdown
Collaborator

Closes UPT-101.

What and why

On the dms-saas run in the UpgradeBench pilot (#169), Uptide left a subscriptions.cancel type error after 3 feedback rounds. It also left an unformatted file, so fork CI failed. This PR fixes both, plus two more defects the reruns exposed.

1. Why the cancel site survived: the patch was rejected

It wasn't excluded as pre-existing, and the round budget didn't run out. The agent fixed workspaces-admin.ts correctly in every round, and the gate rejected the patch every time.

  • The gate compared against the round start only. dms-saas's test script runs pnpm run build first. At the round's start the build failed on the error being fixed, so no test file failed there. After the patch the build passed and vitest showed the 4 test files that fail at the parent too, which looked new. judge (sdk-agent.ts) now also marks failures against the parent baseline, the way final verification does. It compares test files whatever scope ran them: the gate runs related tests, the parent ran the full suite. A run that names no test file never matches across scopes.
  • The site was never planned. workspaces-admin.ts imports getStripeClient from the ../stripe barrel (export * from "./client"), two hops from stripe. Root selection took one hop (scopedImporters). It now also takes the importers of a barrel among the direct importers, under the same memory cap, which still reports what it drops. check now reports the site.
  • Exposed by the first rerun: the site batch's gate failed the pin assertion. Once every site compiled, the batch failed test/stripe-basil-payloads.test.ts, which asserts the old API version. The pack's follow-up updates that assertion, but only after the agent. The earlier runs only got past this because the build kept failing. The gate now runs the batch's tests with the pack's follow-ups in place, then puts them back. fix still applies and reports them as before.
  • Mechanical rule: request-options (stripe pack, with fixtures). SDK 18–21 have both (id, params?, options?) and (id, options?). SDK 22 drops the second, so cancel(id, { idempotencyKey }) type-checks the options as SubscriptionCancelParams (TS2353). When the literal holds only RequestOptions keys and is the last argument of a method call, the rule passes undefined as params, as the human upgrade did. A literal that mixes params and options stays assisted. No ground-truth repo exercises the rule (dms-saas is held out of ground truth by the bench), so under UPT-48's gate it runs assisted with its guide. verification.json lists it as unexercised, and the docs tables were regenerated.

2. Formatting

dms-saas formats with oxfmt, configured at the root and again in packages/dms-saas. It uses none of prettier, biome or dprint. style.ts now detects oxfmt and dprint as well. It runs each tool from the package that holds the file (nearest package.json), with that package's config and binary, else the root's, as UPT-74's builds do. It runs in the fix clone on the edited files only. A formatter that fails isn't thrown. The lint after it checks the same files, and the PR body reports a FAILED lint. In the after run the style commit touched one file, one the migration had already edited.

Also

fix refused the oversized PR body with "review the full report.json", but the report was written after the body. It's now written first.

Bench: dms-saas, Uptide arm, before / after

Same harness (bench/ from the pilot branch, not committed), claude-sonnet-5-5, effort medium, $1 limit. Checks are the repository's own commands via bench/check.sh.

Before: 195ae10, run 2530720c After: c745ed6, run 0503a533
uptide fix exit 1 0
Type-check ✗ 1 error, TS2353 workspaces-admin.ts:78 ✓
Lint / format ✗ oxfmt, 1 file ✓
Unit tests (local) 1 file fails: private-admission, a 5 s Mongo timeout that fails on every arm, human included same
Fork CI ✗ uptide-bench/AntelopeJS--dms-saas#7 (lint) ✓ uptide-bench/AntelopeJS--dms-saas#8
Cost $0.60 $0.40
Wall time 519 s 310 s
Feedback rounds 3, all rejected 1, no change

For comparison, the Claude Code arm in the #169 rerun: $0.31 / 149 s, clean.

Where the time went (UPT-14 phases)

Phase Before After
analyze 34 s 27 s
baseline 29 s 30 s
install 27 s 22 s
rules 0.1 s 0.1 s
agent 71 s · $0.24 125 s · $0.29
verify 10 s 27 s
feedback 330 s · $0.36 66 s · $0.11

Before, 64% of the run was the three rejected feedback rounds. After, the agent handles all 10 sites in one accepted batch. The remaining 66 s round is waste (see follow-ups).

Runs

There were four runs. The before run. A first after run (6cdcd1e5, at 19dae27) that exited 2: the site batch was rejected (pin assertion, third bullet above), every site went manual, and the required PR-body evidence went over 60 kB. A diagnostic fix --keep-temp in a scratch clone of the same commit, outside the harness, to get the stored report. Then the final after run. Total spend ≈ $2.3: $0.60 + ~$0.65 for 6cdcd1e5 (not recorded, since the run ended before writing its JSON) + $0.65 + $0.40.

How it was verified

Each new test fails without its fix and passes with it:

  • sdk-agent.test.ts: the parent fails the same file with another command while the round-start build fails, so the batch is accepted; a new file or an unnamed failure is still rejected. The batch's tests also run with the pack's follow-ups in place, and the follow-up file is put back.
  • memory.test.ts: the importers of a barrel that re-exports a root are taken; one importing only a non-dependent name isn't.
  • style.test.ts: oxfmt is configured in a workspace and at the root, runs from each package with its files, and an untouched file stays untouched.
  • stripe.test.ts plus fixtures/request-options: 2 sites rewritten, a mixed params-and-options literal kept, and an iterations TS2353 isn't claimed.

pnpm lint, pnpm typecheck, and core and CLI tests pass (core: 2257 passed). pnpm docs:packs regenerated the tables, and public:check is clean.

Not done / follow-ups

  • Stale build fallback. The post-install workspace rebuild of packages/dms-saas fails because its code doesn't compile at the target yet. That failure stays in agentFallback after the migration fixes it. It triggers the wasted 66 s / $0.11 round and puts a false "Agent-led draft" banner on uptide-bench/AntelopeJS--dms-saas#8. The rebuild should be re-run on the migrated tree before it counts as a fallback.
  • A run where every site ends manual still can't publish. The diagnostic report rendered more than 60 kB of rank-0 evidence. The report is kept now, but the body still refuses.
  • request-options stays assisted until a ground-truth repository with that shape is added.

Checklist

  • Tests for the change (a bug fix starts with a failing test)
  • pnpm lint && pnpm typecheck && pnpm test pass
  • README and docs updated if behavior changed
  • Changeset added if a user would notice (pnpm changeset)
  • No new dependency, or it was agreed in an issue
  • No private code, names or paths in fixtures, tests or docs
  • The rules in CONTRIBUTING.md ("Rules that do not bend") still hold

🤖 Generated with Claude Code

lucasbraum and others added 3 commits October 17, 2026 17:00
…ith oxfmt per workspace (UPT-101)

The dms-saas bench run left one subscriptions.cancel type error after 3
feedback rounds. The agent fixed it every round and the gate rejected
the patch: the test script builds first, the build failed at the round's
start on the very error being fixed, so the failing test files the parent
already had looked new. The gate now marks failures against the parent
baseline too, as final verification does.

The site was never planned because its file reached the stripe wrapper
through a barrel (export * from './client'), two hops from stripe; root
selection now takes the importers of a barrel among the direct importers.

Formatting detects oxfmt and dprint and runs per workspace from the
workspace's config, else the root's, on the edited files only.

Stripe pack: request-options rule (SDK 22 dropped the (id, options)
overloads), with fixtures; unexercised, so it runs assisted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Lucas Braum <lucasbraum@gmail.com>
…follow-ups applied (UPT-101)

The rerun after the first fix exposed the same gate flaw in the site batch.
Once every site compiled, the build in dms-saas's test script passed and
vitest ran: the related-tests command differs from the parent's full-suite
command, so markPreexisting found no baseline to match and the round-start
run had no test files. Compare by failing test files across commands
(anyCommand), never by an empty file list.

The batch also failed test/stripe-basil-payloads.test.ts, which asserts the
old API version: the pin follow-up that updates it runs after the agent.
The gate now runs the batch's tests with the pack's follow-ups in place and
puts them back; fix applies them as before.

The overflowing PR body refused with "review the full report.json", but the
report was written after the body: write it first.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Lucas Braum <lucasbraum@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Lucas Braum <lucasbraum@gmail.com>
@lucasbraum
lucasbraum merged commit ff8de8e into main Oct 18, 2026
28 checks passed
@lucasbraum
lucasbraum deleted the upt-101-dms-cancel-format branch October 18, 2026 01:01
@uptide-release uptide-release Bot mentioned this pull request Oct 18, 2026
lucasbraum added a commit that referenced this pull request Oct 18, 2026
… (UPT-104) (#226)

Closes UPT-104.

## What and why

`fix` builds the workspaces whose output a consumer reads
(`prepareWorkspace`) right after the bump, before any edit, so the
agent's type-check sees fresh declarations. Those results were then
reported as the run's build and turned into `Build cannot run (…)`
fallback reasons, and nothing ever built them again. When the edits
fixed the build, the run still:

- forced a feedback round (`round === 1 && fallback.length`) with
nothing left to fix,
- put an **Agent-led draft** banner at the top of the PR body,
- showed `Build after the bump … — failed` / `❌ build` in the PR body.

That's what happened on calmcp (#219) and on dms-saas (#221's final run,
uptide-bench fork PR #8).

## Change (`packages/core/src/fix/run.ts`)

- The consumed builds are judged on the head the edits left. They run
again before the verdict and after each feedback round, and the reported
`verification.build` holds those results.
- Build fallback reasons are recomputed from the latest builds after
each build, so a reason the head no longer shows is dropped. The reasons
that don't depend on the head (planner refusals, agent-led pins, unknown
baseline) stay.
- The consumed builds run again only when the tree changed since their
last result: HEAD's tree plus the diff and untracked names over it,
marked `ponytail:` because an untracked file edited in place goes
unseen. A run whose after-bump build passed and that made no later edits
does not build again.
- When the verification build (generic or `requiresBuild` runs) already
built the same workspaces on the head, its results are used instead of a
separate build.
- New report field `buildRuns: { count, ms }`: every build the run
executed (preparation and verification) and their wall time.

## Tests

`fix.test.ts`, `consumed workspace builds on the final head (UPT-104)`:

1. The after-bump build fails and the fixed head builds: no feedback
round, no `agentFallback`, the agent is never called, the build line
says `passed`, no banner, and 3 builds (baseline, after the bump, edited
head).
2. The after-bump build passes and nothing changes afterwards: no
further build (2 builds).
3. A `requiresBuild` pack: the consumed workspace is built once on the
head, by the verification build.

Tests 2 and 3 each fail with their guard removed. The existing test that
counted 2 builds now expects 3, with the third on the edited head. `pnpm
test`, `pnpm typecheck` and `pnpm lint` pass; the only lint warnings are
the two that predate this change.

## Bench (#169 harness, Uptide arm only)

Same harness, model (`claude-sonnet-5-5`, medium) and $1 cap as #169.
**Before** is origin/main `2dc2162` plus only the `buildRuns` counter (a
local commit, not pushed); **after** is this branch. One run each,
sequential.

| Run | Rounds | Cost | Wall | Builds (count / time) | Fallback banner |
PR body build line | Verdict |
|---|---|---|---|---|---|---|---|
| calmcp before | 1 | $0.117 | 76 s | 1 / 0.5 s | yes: `Build cannot run
(.)`, zodDoc.ts TS2322 | `.` `tsc -p tsconfig.json` — **failed** (`❌
build`) | PASS |
| calmcp after | **0** | **$0.082** | **58 s** | 2 / 0.7 s | **none** |
`.` `tsc -p tsconfig.json` — **passed** (`✅ build`) | PASS |
| dms-saas before | 1 | $0.391 | 300 s | 2 / 8.6 s | yes: `Build cannot
run (packages/dms-saas)`, the stripe errors the agent then fixed |
`packages/dms-saas` — **failed** (`❌ build`) | FAIL |
| dms-saas after | **0** | **$0.294** | **256 s** | 3 / 15.5 s |
**none** | `packages/dms-saas` — **passed** (`✅ build`) | PASS |

Phases:

- calmcp before: analyze 5 s, baseline 3 s, install 6 s, rules 0 s,
agent 33 s ($0.089), verify 2 s, **feedback 16 s ($0.028)**
- calmcp after: analyze 6 s, baseline 3 s, install 6 s, rules 0 s, agent
35 s ($0.082), verify 2 s
- dms-saas before: analyze 23 s, baseline 26 s, install 21 s, rules 0 s,
agent 120 s ($0.271), verify 26 s, **feedback 69 s ($0.120)**
- dms-saas after: analyze 25 s, baseline 30 s, install 24 s, rules 0 s,
agent 128 s ($0.294), verify 35 s

The extra build is the head rebuild: +0.2 s on calmcp and +6.9 s on
dms-saas. It replaces a feedback round of 16 s / $0.028 and 69 s /
$0.120.

How to read the dms-saas rows:

- **The verdicts differ because of the agent's edits, not this change.**
Before, the agent bumped the API version and a basil-payloads test
failed as new. After, 3 failing test files were marked pre-existing and
the run passed. Both runs left 0 new type errors.
- **The first after run on dms-saas failed and is not in the table.** It
exited 2 after 423 s with `Required migration evidence exceeds the PR
body budget`. A run that throws removes its clone, so no report
survived, and its spend went unrecorded (no `--json` output). I reran it
once with `--keep-temp` (no other difference): that's the row above,
with a 31 KB PR body. The overflow is the open "PR body overflow"
follow-up from UPT-101, and I couldn't attribute it to this change:
removing a fallback reason only shortens the body. Nothing here fixes
it.

No fork PRs were opened for these runs, and nothing was pushed outside
this branch.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Signed-off-by: Lucas Braum <lucasbraum@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
lucasbraum added a commit that referenced this pull request Oct 18, 2026
)

Closes UPT-106. Closes UPT-102: enki now delivers an agent-led draft,
uptide-bench/entur--enki#5.

## Problem

`prBody()` threw "Required migration evidence exceeds the PR body
budget" when the rank-0 sections alone were over the budget. That threw
away the whole finished run. It happened on enki (a8ff50ca, after #224)
and on dms-saas (#221).

## Change

- **No section is exempt.** `fitPieces` returns `undefined` instead of
throwing. Required lists that can grow without bound get a compact form,
which is used only when the whole list does not fit. These lists still
go before anything droppable.
- Lockfile churn (outside the upgrade, and parent churn): counts per
kind of change (added, removed, version changed, re-resolved at the same
version), then the first 10 packages.
- Manual sites under "Worth a look": grouped by rule, with a count and
the first 5 locations each.
  - Remaining type errors: the first 10, then a count.
- **Full lists** stay in report.json. The Action's job summary now lists
every breaking site (it was capped at 50). Compact forms link to it
through a new `runUrl` field, set from
`GITHUB_SERVER_URL`/`GITHUB_REPOSITORY`/`GITHUB_RUN_ID` when the run is
in Actions.
- **Minimal body.** If the compact form still does not fit, the body is
a fixed-size summary: the verdict, the checks (types, tests, builds,
lint, clean install), the counts (sites by outcome, lockfile, files,
decisions), the branch and commit, and where the full report is. It
opens with a "Shortened description" notice.
- **The run is kept.** `fix()` and the isolated run's `finish()` write
report.json before the body, and nothing throws for size any more, so a
finished run always keeps its commits and report.json. `uptide pr` sends
the shortened body instead of refusing.
- **Decision lines** (second commit, found by the enki rerun). An agent
decision named every file in its task's scope. The verification-feedback
task was scoped to 317 files, so its 2 decisions came to 46 KB. A
decision now names the files the task changed, five at most, and counts
the rest.

## Fixtures

Written first; both failed on main with the throw.
- 300 manual sites (3 rules) and 100 + 100 churned lockfile entries. At
the 60 k budget every section is present: lockfile sections, risk table,
What changed, Worth a look, Decisions, Verification details, Run
details. Manual sites are compact and the lockfile lists are whole. At 8
k the lockfile lists are compact too: "100 entries: 25 added, 25
removed, 25 re-resolved at the same version, 25 version changed", with
the first 10 packages.
- The same report with an oversized decision renders the minimal body.
- A 317-file task with one changed file: the decision names only that
file. Without diffs it names 5 files and "312 more files".

## enki rerun (#169 harness)

Uptide arm only, claude-sonnet-5-5, default $1 cap, one run: 60949226.

| | |
|---|---|
| Exit | 0, draft delivered (branch `uptide/react-19.2.0`, verified
commit `3f05f25`) |
| PR body | 804 chars: minimal fallback (on 06bab33). With 16b2abe the
same stored report renders whole at 34,718 chars (77,681 before), no
shortening |
| Checks (harness) | install 0 · typecheck 0 · lint 0 · test 0 |
| #220 clean install | `npm ci --ignore-scripts --no-audit --no-fund`
passed |
| Sites | 3 by rule, 8 by the agent, 1 manual; verification PASS, 0 new
type errors |
| Cost / wall time | $0.17 (estimate $0.54) · 160 s |
| Fork CI | uptide-bench/entur--enki#5: npm ci, `npm run check` and
tests passed. The job fails at SonarQube Scan (no `SONAR_TOKEN` in the
fork), so build is skipped. Fork PRs #1–#4 fail the same way |

The run used the build of 06bab33. The fork PR's body is therefore the
minimal form; the 34.7 KB figure is a $0 re-render of the stored
report.json with 16b2abe. The report records `uptideDirty` because the
harness files under `bench/` were copied in untracked, as in earlier
reruns.

## Left as is

- Lockfile churn is not in the job summary. The run-report schema
(`uptide.run/v1`) has no lockfile field, so the full churn list is only
in report.json.
- `ReportedError` and `PR_BODY_TOO_LARGE` stay. Nothing throws
`PR_BODY_TOO_LARGE` any more, but `fix --json` still uses
`ReportedError` for reporting any failure after report.json is written.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Signed-off-by: Lucas Braum <lucasbraum@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
lucasbraum pushed a commit that referenced this pull request Oct 18, 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.15.1

### Patch Changes

- [#220](#220)
[`cf86d65`](cf86d65)
Thanks [@lucasbraum](https://github.com/lucasbraum)! - With an assisting
agent, a root pin Uptide cannot update safely (a nested override such as
`overrides > pkg > peerDependencies > react`) no longer stops `fix` with
exit 2: the run continues as an agent-led draft that leaves the pin as
written and names it, with its exact path and value, at the top of the
PR body. The agent-led peer reason now names each blocker's first
release that accepts the target, or says none does. An agent-led draft
must pass the repository's clean install (`npm ci` or the manager's
frozen install) before delivery; if it does not, the PR says so at the
top. Without an agent, with `--no-llm`, or on a safety refusal, `fix`
still exits 2.

- [#232](#232)
[`e4a2885`](e4a2885)
Thanks [@lucasbraum](https://github.com/lucasbraum)! - `uptide fix`
spends less wall time on test runs and dependency copies:
  
- The agent's own `run_tests` check runs only its runner's related tests
when the `test` script builds first and then runs a script that is just
the runner (`pnpm run build && pnpm run test:unit`). The gate after the
agent's edits and the final verification run exactly what they ran
before.
- The upgrade's install moves the installed `node_modules` out of its
temporary worktree instead of copying it.
- Each phase of the fix report lists the repository's commands it ran
(installs, generators, builds, type-checks, tests, lint, format) with
their count and summed wall time. An agent-led run's clean install has
its own phase.

- [#223](#223)
[`2dc2162`](2dc2162)
Thanks [@lucasbraum](https://github.com/lucasbraum)! - `fix` no longer
stops with "baseline tests modified the working tree" when the test run
only writes new untracked files, such as a junit `test-report.xml` that
is not gitignored. Those files are recorded as test artifacts
(`testArtifacts` in the report), kept out of every commit, the agent's
diff and the pending-changes check, and removed before each later test
run, `uptide verify` included. A change to a tracked file during
baseline tests still refuses the run.

- [#215](#215)
[`abddcb3`](abddcb3)
Thanks [@lucasbraum](https://github.com/lucasbraum)! - `check` no longer
lists possible impact (type changes nothing confirmed as breaking) on
its first screen: each package says it in one line, `+N possible impact
in M files, not counted as breaking`, and `--details` and `--json` still
have every site. A package whose types were partly verified no longer
repeats its coverage line in the heading, and a monorepo's unbuilt
workspace chains are one count on that line.

- [#213](#213)
[`2de3a18`](2de3a18)
Thanks [@lucasbraum](https://github.com/lucasbraum)! - A companion pack
that moves with the lead's fix (react beside next) now gets its own scan
context and inventory, and the PR body carries a section with its review
notes.

- [#212](#212)
[`733cfbe`](733cfbe)
Thanks [@lucasbraum](https://github.com/lucasbraum)! - `pack test
--write` records how many breaking sites a finding landed on at any
severity and as breaking, out of all breaking sites it scored, and the
pack tables show both ("Found, any severity", "Found as breaking") in
place of the single recall column. Packs recorded before it show `—`.

- [#224](#224)
[`09f68df`](09f68df)
Thanks [@lucasbraum](https://github.com/lucasbraum)! - `fix` on npm no
longer stops when the lock-only install hits ERESOLVE from the old
lockfile. It retries without the lockfile entries of the moved packages,
their companions and the packages whose peers they satisfy, and only
then with the whole lockfile re-resolved; the report says which step
worked, and the lockfile check reports the churn as usual. It never uses
`--legacy-peer-deps` or `--force`. When every step fails, `fix` ends
blocked, naming the conflicting packages from npm's ERESOLVE report.
`fix --json` now prints JSON on every exit, a failure included; when the
run already has its report (a PR body over GitHub's size limit), that
report comes with the error.

- [#221](#221)
[`ff8de8e`](ff8de8e)
Thanks [@lucasbraum](https://github.com/lucasbraum)! - `fix` no longer
rejects an agent patch for test files the parent commit already failed,
whichever test scope ran them: when the test script builds first and the
build failed on the error being fixed, the start had no test results to
compare with, so a correct patch was reverted every round. The patch's
tests also run with the pack's follow-ups in place (a test asserting the
old Stripe API version), which `fix` still applies and reports after the
agent. When a PR body cannot fit, the stored report.json the error
points to is now written first. `check` and `fix` now also analyze files
that reach a package's wrapper through a barrel (`import {
getStripeClient } from '../stripe'` with `export * from './client'`).
Edited files are formatted with oxfmt and dprint as well as biome and
prettier, from the workspace that holds them, with its own
configuration, else the root's. The stripe pack adds `request-options`:
request options passed in the params slot (`subscriptions.cancel(id, {
idempotencyKey })`), which SDK 22 rejects, move to the third argument.
It runs assisted until a ground-truth repository exercises it.

- [#226](#226)
[`448c3cb`](448c3cb)
Thanks [@lucasbraum](https://github.com/lucasbraum)! - `uptide fix`
judges consumed workspace builds on the final head, not on the tree
right after the bump. A build that failed after the bump and passes once
the edits land no longer starts a feedback round, adds an "Agent-led
draft" reason or shows "Build failed" in the PR body. The builds run
again only when the tree changed since their last result, and not at all
when the verification build already built those workspaces. The fix
report's `buildRuns` gives the number of builds the run executed and
their wall time.

- [#218](#218)
[`13e343b`](13e343b)
Thanks [@lucasbraum](https://github.com/lucasbraum)! - `check` folds a
compile error into the breaking site it comes from when the compiler
traces its value there (an `errors.map(e => e.message)` under a
`result.error.errors` that zod 4 no longer types, and the narrowing that
depended on it). The rule's line shows `+N downstream errors`,
`--details` lists them under their site, and `--json` carries them as
that finding's `downstream`. They are no longer separate breaking sites.
`fix` still verifies against every error.

- [#214](#214)
[`195ae10`](195ae10)
Thanks [@lucasbraum](https://github.com/lucasbraum)! - A rewrite rule
below 80% precision over at least 5 scored ground-truth sites now runs
as assisted in `fix` (react-router `dom-imports`); smaller samples (next
`middleware-proxy`) stay mechanical and are flagged in the compatibility
table. Pack status is unchanged.

- [#218](#218)
[`13e343b`](13e343b)
Thanks [@lucasbraum](https://github.com/lucasbraum)! - pack test runs a
ground-truth repository's code generators (prisma generate, local
graphql-codegen) after its install, as fix does. It fetches the Prisma
engines the locked version needs itself, so generators stay off the
network. A repository whose generator still fails is incomplete and
fails the pack, unless its ground truth declares `withoutGenerated`

- [#227](#227)
[`ae175a9`](ae175a9)
Thanks [@lucasbraum](https://github.com/lucasbraum)! - A migration whose
evidence is larger than GitHub's PR description limit no longer stops
`fix` with "Required migration evidence exceeds the PR body budget" and
loses the run. Long required lists get a compact form when they do not
fit. Lockfile churn shows counts per kind of change and the first
packages. Manual sites are grouped by rule, with counts and the first
locations. Remaining type errors show the first entries. Every full list
stays in report.json and, in the Uptide Action, in the job summary,
which the description links to. If even the compact form does not fit,
the description is a short summary that says so at the top: the verdict,
the checks, the counts and where the full report is. The branch and
report.json are always kept.
  
An agent's decisions under "Decisions for you" name the files the agent
changed, five at most, and count the rest, instead of every file in the
task's scope. A verification-feedback task scoped to the whole
repository made each of its decisions a list of hundreds of files.

- [#219](#219)
[`12dc612`](12dc612)
Thanks [@lucasbraum](https://github.com/lucasbraum)! - `fix zod`
rewrites `z.string().uuid()` to `z.guid()` by rule without
`--include-deprecated`: zod 4's `uuid()` also checks the RFC version and
variant, so ids zod 3 accepted stop validating, and `check` now counts
the site as breaking. `fix` no longer reports false pre-existing type
errors on a TypeScript 7 repository whose `lib` names a library newer
than its `target` (`lib: ["ES2023"]` under `ES2022`).

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.

1 participant