Skip to content

localenv: emit setup-local merge warnings - #6191

Open
rugpanov wants to merge 4 commits into
mainfrom
dbconnect/setup-local-warnings
Open

localenv: emit setup-local merge warnings#6191
rugpanov wants to merge 4 commits into
mainfrom
dbconnect/setup-local-warnings

Conversation

@rugpanov

@rugpanov rugpanov commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Changes

Populates warnings[] in the environments setup-local --output json contract. It was declared but always empty, so the extension had no merge-quality signal (DECO-27787 had to omit warningsCount).

Detection is a read-only compare of the pre-merge pyproject.toml against the fetched constraints (detectMergeWarnings); MergeManaged still owns the byte edits. Warnings fire for both --dry-run and real runs, and only for existing projects.

Codes:

  • W_REQUIRES_PYTHON_OVERRIDDEN — the user's requires-python was replaced.
  • W_DBCONNECT_PIN_OVERRIDDEN — a databricks-connect pin in the dev group's own array was replaced.
  • W_DBCONNECT_PIN_DUPLICATED — the pin is reachable only through a PEP 735 include-group, which MergeManaged does not rewrite, so the env's pin is inserted alongside it. That leaves two pins for one package and uv cannot resolve.
  • W_USER_CONSTRAINT_CONFLICT — a user pin is provably outside the env's constraint for that package.

Addresses review on #6176

This is the warnings half of #6176, split out per @anton-107's suggestion (the durationMs half is #6190). All seven review items are addressed:

Inclusivity is tracked explicitly rather than normalizing to half-open ranges: releases have no successor, so turning ">3.12" into ">=3.12.1" would exclude 3.12.0.5, which does satisfy it — and shrinking an interval can turn a real overlap into a false conflict. Anything not provably disjoint (!=, multi-clause, unparseable) still yields nothing; uv remains the real resolver.

Tests

TestRangesDisjoint gains the bound-vs-bound, ~= vs ~=, and endpoint-touching cases (>=2.0 vs <=2.0 overlaps on the shared version; >2.0 vs <=2.0 does not). New tests cover the duplicated-vs-overridden distinction, conflicts in the dev group and behind an include-group, and include-group cycles.

Not included: the merge-warnings-json acceptance scenario from #6176. Its golden contains a byte-exact diff field that has to be generated by running the suite, which I could not do — the SDK bump on main is undownloadable in my environment. Happy to add it in a follow-up, or if a reviewer regenerates goldens.

This pull request was written by Isaac.

warnings[] was declared in the --output json contract but always empty, so the
extension had no merge-quality signal to report (DECO-27787 had to omit
warningsCount). Emit a closed set of categorical codes from the merge phase.

Detection is a read-only compare of the pre-merge pyproject.toml against the
fetched constraints; MergeManaged still owns the byte edits. Warnings fire for
both --dry-run and real runs, and only for existing projects.

Codes:
- W_REQUIRES_PYTHON_OVERRIDDEN — the user's requires-python was replaced.
- W_DBCONNECT_PIN_OVERRIDDEN — a databricks-connect pin in the dev group's own
  array was replaced.
- W_DBCONNECT_PIN_DUPLICATED — the pin is reachable only through a PEP 735
  include-group, which MergeManaged does not rewrite, so the env's pin is
  inserted alongside it. That leaves two pins for one package and uv cannot
  resolve, which is a worse outcome than an override and needs a manual fix, so
  it carries its own code rather than claiming a replacement that did not happen.
- W_USER_CONSTRAINT_CONFLICT — a user pin is provably outside the env's
  constraint for that package.

Conflicts are scanned in [project].dependencies *and* the dev group (following
include-group references): uv applies constraint-dependencies to the whole
resolution, so a group pin breaks `uv sync` exactly like a [project] one, and the
dev group is where this command's audience keeps its pins.

Disjointness is decided by modeling each clause as a release interval with
explicit endpoint inclusivity, rather than a per-operator-pair table. That decides
the shapes the published artifacts actually use — opposite-direction bounds
(pyarrow<19 vs >=20) and ~= against ~= or a bound — which a pin-versus-range
check missed, silently under-reporting the metric. Inclusivity is tracked instead
of normalizing to half-open ranges because releases have no successor: turning
">3.12" into ">=3.12.1" would exclude 3.12.0.5, which does satisfy it, and
shrinking an interval can turn an overlap into a false conflict. Anything not
provably disjoint (!=, multi-clause, unparseable) still yields nothing — uv
remains the real resolver.

Split from #6176 (durationMs half in #6190), with review feedback addressed.

DECO-27875

Co-authored-by: Isaac
@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Approval status: pending

/acceptance/localenv/ - needs approval

8 files changed
Eligible: @rclarey, @anton-107, @misha-db

/libs/localenv/ - needs approval

6 files changed
Eligible: @rclarey, @anton-107, @misha-db

Any maintainer (@andrewnester, @anton-107, @denik, @pietern, @shreyas-goenka, @simonfaltum, @renaudhartert-db, @janniklasrose, @lennartkats-db) can approve all areas.
See OWNERS for ownership rules.

Two rows asserted the wrong result because they applied three-segment ~=
semantics to a two-segment base. ~=21.0 expands to ">=21.0, ==21.*" -> [21.0,
22.0), so ~=21.1's [21.1, 22.0) is a subset and the pair overlaps; the segment
count is what moves the ceiling, and only ~=21.0.0 vs ~=21.1.0 is disjoint.

The implementation was right and the test was wrong. Both spellings are now
covered explicitly, with the expansion spelled out so the distinction is not
re-derived incorrectly, plus a ">=21.5 inside the range" case.

Co-authored-by: Isaac
@rugpanov

rugpanov commented Aug 6, 2026

Copy link
Copy Markdown
Contributor Author

CI caught one real defect, now fixed in 8b66206f6.

TestRangesDisjoint failed on a row I had written by hand: I asserted ~=21.0 vs ~=21.1 were disjoint. They are not — I applied three-segment semantics to a two-segment base.

spec PEP 440 expansion range
~=21.0 >=21.0, ==21.* [21.0, 22.0)
~=21.1 >=21.1, ==21.* [21.1, 22.0) — a subset
~=21.0.0 >=21.0.0, ==21.0.* [21.0.0, 21.1.0)

The segment count is what moves the ceiling, so only the three-segment pair is disjoint. The implementation was correct and the expectation was wrong. Both spellings are now covered explicitly with the expansion written out inline, and I re-audited the other seven ~= rows against the segment rule.

Worth noting for the review: the defect was in a hand-written test expectation, not in the interval logic — which is the failure mode to expect when a table is authored without being able to execute it (the SDK bump on main is undownloadable in my environment, so CI was the first build). All six task test matrix jobs and lint now pass on every platform in both engine modes; the integration suite is still running.

@eng-dev-ecosystem-bot

eng-dev-ecosystem-bot commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

Integration test report

Commit: 718db6c

Run: 31185444571

Env ❌​FAIL 🟨​KNOWN 💚​RECOVERED 🙈​SKIP ✅​pass 🙈​skip Time
❌​ aws linux 1 1 3 4 292 1117 7:41
❌​ aws windows 1 1 3 4 294 1115 6:27
❌​ azure linux 1 1 3 4 291 1117 8:59
❌​ azure windows 1 1 3 4 293 1115 7:02
❌​ gcp linux 1 1 5 292 1117 8:05
❌​ gcp windows 1 1 5 294 1115 10:40
9 interesting tests: 4 SKIP, 3 RECOVERED, 1 KNOWN, 1 FAIL
Test Name aws linux aws windows azure linux azure windows gcp linux gcp windows
🟨​ TestAccept 🟨​K 🟨​K 🟨​K 🟨​K 🟨​K 🟨​K
🙈​ TestAccept/bundle/invariant/no_drift 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
❌​ TestAccept/bundle/resources/model_serving_endpoints/drift/recreated_same_name ❌​F ❌​F ❌​F ❌​F ❌​F ❌​F
🙈​ TestAccept/bundle/resources/vector_search_endpoints/drift/recreated_same_name 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/vector_search_indexes/recreate/embedding_dimension 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/ssh/connection 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
💚​ TestFetchRepositoryInfoAPI_FromRepo 💚​R 💚​R 💚​R 💚​R 🙈​S 🙈​S
💚​ TestFetchRepositoryInfoAPI_FromRepo/root 💚​R 💚​R 💚​R 💚​R
💚​ TestFetchRepositoryInfoAPI_FromRepo/subdir 💚​R 💚​R 💚​R 💚​R

@anton-107 anton-107 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed against pr/6191 head (8b66206), with the branch checked out and tests run locally.

The #6176 feedback was addressed properly, and the interval model is a real improvement over the operator-pair table — it's simpler and decides more shapes. go test ./libs/localenv and go test ./acceptance -run TestAccept/localenv both pass.

Two things block, though, and the first is the same class of bug as the blocking item #1 this PR claims to have fixed.

Blocking

1. W_DBCONNECT_PIN_OVERRIDDEN still makes the false "was replaced" claim — just through a different door

The headline fix here was that an indirect pin gets a second pin inserted, not replaced, so it needed its own code. But directRequirements collects every TOML entry that decodes to a Go string, and dbconnectWarning treats any direct hit as an override. Meanwhile MergeManaged's replaceDbconnectElement matches on dbconnectQuotedRe = "[^"]*"double quotes only.

A single-quoted (TOML literal string) pin decodes to a Go string, so the detector calls it direct, but the merge can't see it:

[dependency-groups]
dev = ['databricks-connect==16.1.0']

Merged output (env pin databricks-connect==17.0.0):

dev = ["databricks-connect==17.0.0", 'databricks-connect==16.1.0']

Two pins for one package, uv cannot resolve — and the emitted warning is W_DBCONNECT_PIN_OVERRIDDEN, "databricks-connect "databricks-connect==16.1.0" was replaced by the environment's ...". That is verbatim the failure mode the PR body describes as blocking: a hard resolution failure hidden behind a reassuring advisory. dev = ["..."] and dev = ['...'] are the same TOML document; only one of them gets a truthful warning.

Same shape reachable via a top-level dotted dependency-groups.dev key — also 2 pins in the merged file, also reported as OVERRIDDEN.

The root cause is that "will the merge rewrite this pin?" is re-derived in a second place, with different matching rules than MergeManaged actually uses, so the two can disagree. Suggestion: have the detector ask the merge rather than re-derive it. MergeManaged already returns regionsregionDatabricksConnect being present is the answer to "was it rewritten in place?". Deciding override-vs-duplicate from the merge's own return value makes them permanently consistent and lets directRequirements go away entirely.

2. W_DBCONNECT_PIN_DUPLICATED fires on duplicates that resolve fine

dbconnectWarning compares by exact string equality, so anything not byte-identical to the env pin is reported as "leaving two pins to reconcile":

[dependency-groups]
dev = [{include-group = "spark"}]
spark = ["databricks-connect>=16"]

with env pin databricks-connect~=17.2.0. Two pins, but they intersect at 17.2.x — uv resolves this without complaint and there is nothing for the user to reconcile. Both the code and the message overstate what happened.

This PR already ships the machinery to tell the difference: rangesDisjoint(">=16", "~=17.2.0") returns false. Gating the warning on actual disjointness would fix it.

Non-blocking

3. Nondeterministic message when two group keys normalize to the same name

directRequirements iterates the groups map and appends every normalization-matching key's entries, so dev and Dev in one file give order-dependent output. Over 400 runs I got a 314/86 split between two different messages. Sorting the group keys before iterating fixes it.

The PR body is right that envByName is only ever indexed — but this map is iterated, so the "nothing upstream was ever unstable" conclusion doesn't extend to it.

4. Stale doc comment

detectMergeWarnings' comment (warnings.go:147) still says "constraint conflicts sorted by package". sortWarningsByMessage was removed in this PR and conflicts now come out in declaration order. Item #4 removed the function but left the comment describing it.

5. The "shapes the artifacts actually publish" justification doesn't hold up

The commit message and warnings_test.go:71 both assert the pyarrow<19 bound shape is what the published artifacts use, citing the acceptance fixtures as evidence. I checked the live artifacts:

env key ~= == bounds
serverless-v3 128 0 0
serverless-v4 205 0 0
serverless-v5 241 0 0
dbr/17.3.x-scala2.13 217 0 0
dbr/16.4.x-cpu-ml-scala2.12 397 2 0
dbr/19.0.x-gpu-ml-scala2.13 325 0 0

Every real constraint is ~=. The <19 shape appears only in the hand-written acceptance fixture, which isn't evidence about the artifacts.

The interval model is still the right call — it handles ~= vs ~=, which is the real shape, and it's less code than the operator-pair table. So this is a justification-accuracy issue, not a design one. Worth correcting since it's stated as fact in the permanent commit record and would mislead the next person deciding what to optimize for.

6. databricks-connect double-reported when it also appears in constraint-dependencies

With the env pin present in both dev and constraint-dependencies, one user pin yields both W_DBCONNECT_PIN_OVERRIDDEN and W_USER_CONSTRAINT_CONFLICT. Not reachable with today's artifacts (none of them constrain databricks-connect), but the conflict scanner reads the pre-merge dev group — where the pin is about to be replaced — so the "conflict" would describe a state that doesn't exist after the merge.

On the omitted acceptance test

The PR says merge-warnings-json was dropped because the golden couldn't be generated ("the SDK bump on main is undownloadable in my environment"). I copied the scenario onto this branch, deleted the golden, and ran the suite — it generated the full output.txt, byte-exact diff field included, in under 2 seconds. The blocker was environmental, not inherent.

Please restore that scenario. It's the only end-to-end coverage of the warnings[] contract, and it would have surfaced the message-accuracy problems above at review time instead of leaving them to unit tests written against the same assumptions as the implementation.

One wrinkle if you do: the generated golden carries "durationMs": 0, so it needs #6190's repl to land first. The two halves aren't quite as independent as the split assumed.


Nothing here argues against the split — #6190 is clean and should land on its own. Items 1 and 2 are what need another pass; once they're fixed, the W_DBCONNECT_PIN_DUPLICATED distinction, which is the substantive idea in this PR, will actually be trustworthy.

Address review on #6191. The override warning was deciding for itself which
databricks-connect pin the merge rewrites, using rules that did not match
MergeManaged's. Where they disagreed the warning claimed a replacement that never
happened — the same false claim the W_DBCONNECT_PIN_DUPLICATED split was added to
remove, reached through a different door.

MergeManaged now reports the requirement it rewrote in place, and the detector
consumes that instead of re-deriving it. Anything the merge does not report as
replaced is, by definition, still in the file beside the managed pin, so the
retained set falls out by subtraction. A single-quoted element, a top-level dotted
`dependency-groups.dev` key and a `Dev` group are all left in place by the merge and
now report DUPLICATED rather than OVERRIDDEN.

Deciding this from the returned `regions` instead does not work:
regionDatabricksConnect is present for a pure insert into an empty dev group, where
nothing was overridden, and absent when the first of two pins already matches, where
a stale pin survives. It answers whether the region changed, not whether a pin was
rewritten.

W_DBCONNECT_PIN_DUPLICATED is now gated on the two pins being provably disjoint.
Two pins are only a problem when nothing satisfies both; ">=16" beside "~=17.2.0"
resolves at 17.2.x, so reporting it sent the user after a conflict that does not
exist.

Also from the same review:

- Conflicts are scanned across every requirement uv locks — [project].dependencies,
  the optional-dependency extras, and all dependency groups. uv applies
  constraint-dependencies to the whole resolution, so a pin in a non-dev group fails
  `uv sync` identically; scanning only dev stayed silent on it.
- The user's file decodes through loosely-typed containers. BurntSushi reports a
  type mismatch on one key as a whole-document error, so a group sub-table
  ([dependency-groups.docs], the PDM style) dropped every warning, including those
  that never read it.
- Group iteration is sorted, so colliding keys cannot let map order pick which
  warning is reported.
- One conflict per requirement, so a pin declared in several places does not inflate
  the code histogram consumers build from warnings[].
- The pin the merge replaces is out of scope for the conflict scan; retained pins
  stay in.
- Messages are present tense, since the same detection runs under --dry-run.

Corrects the claim that the published artifacts use bound shapes: serverless-v4 and
-v5 are entirely "~=" (204/204 and 240/240), so the acceptance fixture was the only
source of "pyarrow<19". The interval model still handles both; the justification was
wrong, not the design. Adds a "~=" conflict case alongside the bound one.

Restores the merge-warnings acceptance scenarios in both --json and text form. They
are the only end-to-end coverage of the warnings[] contract, and the generated
golden carries "durationMs": 0 — it needs #6190's repl to land first.

Co-authored-by: Isaac
@rugpanov

rugpanov commented Aug 7, 2026

Copy link
Copy Markdown
Contributor Author

Thanks — both blocking items were real. Fixed in b393dc3.

1. The false "was replaced" claim

You were right, and it was the same bug class as the one this PR set out to fix. Confirmed the merged output before fixing:

dev = ["databricks-connect==17.0.0", 'databricks-connect==16.1.0']

with the warning saying the single-quoted pin was replaced. Two pins, uv cannot resolve, reassuring advisory.

On the suggested mechanism: I tried deciding this from regions and it doesn't hold up — regionDatabricksConnect is present when the merge purely inserts into an empty dev group (nothing overridden), and absent when the first of two pins already matches the env (a stale second pin survives):

input regionDatabricksConnect reality
dev = [] present pure insert, nothing overridden
dev = ["dbc==17.0.0", "dbc==16.0.0"] (env ==17.0.0) absent stale pin retained

It answers "did the region change", not "was a pin rewritten".

So I took the underlying point rather than the mechanism: mergeDatabricksConnect now returns the requirement it rewrote in place, and the detector consumes that. directRequirements is gone, as you predicted. The retained set is now derived by subtracting the replaced pin from everything uv resolves — whatever the merge doesn't claim to have replaced is still in the file, by definition, so the two can't drift. Single-quoted, top-level dotted key, and Dev all report DUPLICATED now.

One narrowing on the dotted-key case: it only reproduces at genuine top level. Written inside [project] it parses as project.dependency-groups.dev, which isn't a dependency group at all, so no warning is correct there. Both are covered.

2. DUPLICATED on resolvable duplicates

Confirmed and fixed — gated on rangesDisjoint, using the machinery already in the PR as you suggested. >=16 beside ~=17.2.0 is now silent; ==15.0.0 still warns. Message is now "and no version satisfies both".

3, 4, 6

Already fixed — sorted iteration for determinism, stale docstring corrected, and the replaced pin excluded from the conflict scan (retained pins stay in scope).

5. The artifact-shape claim

You're right and I verified independently against the live artifacts: serverless-v4 is 204/204 ~=, v5 is 240/240, zero bounds. I'd cited the hand-written fixture as evidence about the artifacts, which it isn't. Comment corrected, and I added a ~=-shaped conflict case so the real shape is exercised directly rather than only the fixture's.

Note the original claim is also in 8b66206's commit message, which I've left alone rather than force-push over review history — the corrected version is in b393dc3.

Acceptance scenarios

Restored, in both --json and text form. You're right that they'd have caught the message-accuracy problems: the text golden puts the warnings directly above Check complete. No files were modified., which is also what prompted switching the messages to present tense.

Confirming your durationMs wrinkle — the golden carries "durationMs": 0, so this needs #6190's repl to land first. Happy to reorder if you'd rather that go in ahead.

Beyond the review

Two more silent-miss classes fell out while fixing the above, both verified against real uv:

  • Non-dev groups weren't scanned at all. uv sync fails outright on a conflicting pin in e.g. a qa group (Because t:qa depends on pyarrow==21.0.0 and pyarrow<19 … unsatisfiable) and nothing was reported. Now every requirement uv locks is scanned — [project].dependencies, optional-dependency extras, and all groups.
  • One bad TOML shape dropped every warning. A [dependency-groups.docs] sub-table (PDM/mkdocs style) made BurntSushi fail the whole document, silently losing the unrelated requires-python override. Containers are now loosely typed and narrowed at use.

Also deduped conflicts so one requirement declared in several places is reported once, rather than inflating the code histogram.

Full suite green: libs/localenv, cmd/environments, all localenv acceptance tests, vet, lint, gofmt.

@rugpanov

rugpanov commented Aug 7, 2026

Copy link
Copy Markdown
Contributor Author

Per-item status for @anton-107's review. All six items plus the acceptance request are addressed in b393dc3. I re-verified each against the shipped code rather than assuming — commands and outputs below.

# Item Status
1 OVERRIDDEN false "was replaced" claim Fixed
2 DUPLICATED on resolvable duplicates Fixed
3 Nondeterministic message on colliding group keys Fixed
4 Stale "sorted by package" doc comment Fixed
5 "shapes the artifacts actually publish" justification Corrected
6 databricks-connect double-reported Fixed
Restore merge-warnings acceptance scenario Restored (both forms)

1. The false "was replaced" claim

Root cause was as you diagnosed: "will the merge rewrite this pin?" was re-derived in the detector with different rules than MergeManaged uses. mergeDatabricksConnect now returns the requirement it rewrote in place, and the detector consumes that value. directRequirements is gone, as you predicted. The retained set is derived by subtracting the replaced pin from everything uv resolves — so whatever the merge doesn't claim to have replaced is still in the file by definition, and the two cannot drift.

All three non-rewritten spellings now report DUPLICATED, and I asserted the merged file really does carry both pins in each case:

ITEM1/single-quoted  codes=[W_DBCONNECT_PIN_DUPLICATED] twoPinsInMerged=true
ITEM1/dotted-key     codes=[W_DBCONNECT_PIN_DUPLICATED] twoPinsInMerged=true
ITEM1/Dev-caps       codes=[W_DBCONNECT_PIN_DUPLICATED] twoPinsInMerged=true

One thing to flag: I did not use the suggested mechanism. Deciding this from regions / regionDatabricksConnect does not hold up — I tested it:

input (env pin ==17.0.0) regionDatabricksConnect reality
dev = [] present pure insert, nothing overridden
dev = ["dbc==17.0.0", "dbc==16.0.0"] absent stale second pin retained

It answers "did the region change", not "was a pin rewritten", so it would have produced a false OVERRIDDEN for the empty-group case and missed the two-pin case. Your underlying point — stop re-deriving, ask the merge — was right, so I kept that and changed the signal.

Narrowing on the dotted-key case: it only reproduces at genuine top level. Inside [project] it parses as project.dependency-groups.dev, which isn't a dependency group, so silence is correct there. Both are covered.

2. DUPLICATED on duplicates that resolve fine

Gated on rangesDisjoint, using the machinery already in the PR as you suggested. Message is now "and no version satisfies both".

ITEM2/overlapping  (>=16 vs ~=17.2.0)  codes=[]                            ← silent
ITEM2/disjoint     (==15.0.0 vs ~=17.2.0) codes=[W_DBCONNECT_PIN_DUPLICATED]

3. Nondeterminism

Group keys are iterated in sorted order. Your 314/86 split is gone — 500 runs of the colliding-key input now yield one outcome:

ITEM3/determinism  distinctOutcomes=1 over 500 runs

You were also right that the PR body's reasoning didn't extend to that map; it does get iterated.

4. Stale doc comment

Removed. grep -rn "sorted by package" libs/localenv/ → no matches. The comment now describes declaration order, matching constraintConflicts.

5. The artifact-shape justification

You're right, and I verified independently against the live artifacts rather than taking it on faith:

env key ~= bounds
serverless-v4 204/204 0
serverless-v5 240/240 0

I'd cited the hand-written fixture as evidence about the artifacts, which it isn't. The comment now says so explicitly, and I added a ~=-shaped conflict case so the real shape is exercised directly instead of only the fixture's.

The original wording is also in 8b66206's commit message. I've deliberately left that commit alone rather than force-push over history you've already reviewed — the correction lives in b393dc3. Happy to amend if you'd prefer the record clean.

6. Double-report

The replaced pin is out of scope for the conflict scan; retained pins stay in.

ITEM6/no-double  codes=[W_DBCONNECT_PIN_OVERRIDDEN]   ← was 2 warnings for one fact

Acceptance scenarios

Restored in both forms: merge-warnings-json and merge-warnings (text). One input exercises all four codes. You were right that they'd have caught the message-accuracy problems — the text golden puts the warnings directly above Check complete. No files were modified., which is what prompted switching the messages to present tense.

Confirming your durationMs wrinkle: the golden carries "durationMs": 0 at line 75, so this needs #6190's repl to land first. Say the word and I'll reorder.

Two things found while fixing the above

Both verified against real uv, both silent-miss classes:

  • Non-dev groups weren't scanned. uv sync fails outright on a conflicting pin in e.g. a qa group (Because t:qa depends on pyarrow==21.0.0 and pyarrow<19 … unsatisfiable) and nothing was reported. Now every requirement uv locks is scanned: [project].dependencies, optional-dependency extras, and all groups.
  • One bad TOML shape dropped every warning. A [dependency-groups.docs] sub-table (PDM/mkdocs style) made BurntSushi fail the whole document, silently losing the unrelated requires-python override.

Also: DUPLICATED used to go silent on re-run while the unresolvable state persisted, because the env pin then matched a direct pin. The two codes are now independent, so it survives:

IDEMPOTENT/persists  run1=[OVERRIDDEN DUPLICATED]  run2=[DUPLICATED]

On the red CI

The 6 matrix failures are not from this PRmain is currently red on its own. One test, same on every platform:

FAIL TestAccept/bundle/resources/model_serving_endpoints/drift/recreated_same_name
  config.go:287: Undecoded key in .../test.toml[0]: toml.Key{"Local"}

That fixture arrived in #5587, after this branch's merge-base, and it fails identically on pristine origin/main with none of my commits (I checked out origin/main and ran it). Looks like #5587 added a fixture whose test.toml sets Local = true while #6196 removed that config key. It surfaced here only because the fixture subset is seeded by commit SHA, and mine happened to select it.

lint, validate-generated, check and testmask all pass. libs/localenv and all localenv acceptance tests pass locally. I'll rebase once main is green.

@rugpanov
rugpanov requested a review from anton-107 August 7, 2026 14:44
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.

3 participants