Skip to content

Sync upstream drift through runtime 6fa6b31 / extensions 47b6b06 - #8

Open
jamiewest wants to merge 1 commit into
mainfrom
drift/sync-2026-09-07
Open

jamiewest wants to merge 1 commit into
mainfrom
drift/sync-2026-09-07

Conversation

@jamiewest

Copy link
Copy Markdown
Owner

Weekly incremental /drift sync. Nine new in-scope upstream commits since the previous pins (baeeb465 / cc597aa2): three ported, six recorded as skips. Both upstream-sync pins advanced; extensions bumped to 0.8.1 with a matching CHANGELOG entry. extensions_flutter is untouched, so its version stays at 0.6.0.

⚠️ Public API under lib/src/ai/ changes — affects jamiewest/agents

NumericMetric.interpretScore() keeps its signature but changes what it returns:

Metric value Before After
null (unparseable judge reply) inconclusive, not failed inconclusive, failed, reason "<name> has no score."
> 5.0 exceptional, not failed inconclusive, failed, reason "<name> is outside the valid range."
3.0 – 3.99 average/good, not failed failed (minimum passing score is 4.0, was 3)
4.5 good exceptional
3.5 average good

The first two rows are upstream #7735 proper. The rest is pre-existing drift in the same method that had to be corrected for the out-of-range branch to have any effect at all: the Dart rating bands used >= cut-offs on a 1–5 scale with no inconclusive band, so "outside the valid range" was unreachable. The bands and MinimumPassingScore now match upstream's switch exactly. Anything downstream that gates on EvaluationMetricInterpretation.failed will see more failures — that is the point of the upstream fix (fail closed), but it is a behavior change worth a look before this reaches agents. The downstream ripple is unverified: no ~/Developer/agents checkout exists in this sandbox, so CI's downstream-canary job is the first real check.

Ported

dotnet/extensions #7735 (47b6b06) — fail closed when a quality metric has no valid score. interpretScore marked a metric failed only when its value parsed below the passing score, so a metric with no value at all took the not-failed branch. Now unscored and out-of-scale metrics are failures with a reason. 7 tests added.

dotnet/runtime #132617 (910c55a) — handle transient file system errors during active polling.

  • PollingWildcardChangeToken._getCurrentState returns null on a failed directory scan instead of an empty map, which previously compared as "everything was removed" and fired a spurious change notification whenever a network share went down.
  • Callers keep the last successful scan as the baseline, so a change made during the outage is still detected once the file system recovers.
  • A scan that fails before any baseline exists no longer causes a false notification on the first successful scan.
  • PollingFileChangeToken treats a failed metadata read as no change rather than as a change.
  • Upstream's third strand — isolating each token poll inside PhysicalFilesWatcher.RaiseChangeEvents — is already covered: the Dart tokens each own their timer and contain file-system and callback errors inside it, rather than sharing one watcher-level loop. 5 tests added.

dotnet/runtime #133013 (39b12a6) — paths aren't required to exist. Dartdoc on PhysicalFileProvider's factory and its watch override (which carried none), plus PhysicalFilesWatcher's constructor and createFileChangeToken.

Skipped (each recorded in the drift ledger)

Upstream Why
runtime #131931 (6fa6b31) linked cache entry thread safety Interlocked.CompareExchange / Volatile / Thread.MemoryBarrier plus a copy-on-write CacheEntry.ExpirationTokensList. Dart isolates share no mutable memory, so there is no race to guard. New N/A entry. Its Dispose restructure leaves the _isValueSet gate where it was, so it adds nothing to the existing commit-without-value open item
runtime #133151 (4878f22) MemoryCache OTEL units/tag The Dart MemoryCache publishes no metrics at all. The corrected names (dotnet.cache.request.result, unit 1 for cache size) are recorded on the open meterFactory item so they are used when that lands
extensions #7726, #7724, #7727 Microsoft.Extensions.AI.OpenAI only — N/A by library
extensions #7732 (c4e8764) npm lockfile of the HTML report frontend; no C# library surface
extensions #7728 (d72c810) .github/skills/ only, out of scope

Verification

packages/extensions:         dart analyze --fatal-infos . ✓   dart format ✓   dart test → 1047 pass
packages/extensions_flutter: flutter analyze --fatal-infos ✓  dart format ✓   flutter test → 47 pass

Run on Flutter 3.47.2 / Dart 3.13.2 (stable), matching CI's subosito/flutter-action@v2 channel: stable.

Tooling note

The GitHub REST API was not reachable from the sandbox this run — the egress proxy scopes api.github.com and github.com to this repository and answers 403 for dotnet/* — so Step I1 ran against shallow blobless clones (git clone --filter=blob:none --no-checkout --shallow-since=… + git log --full-history --since=… -- <path>) instead of the commits API. Same commit set, same patches; raw.githubusercontent.com stays reachable for single files. This route is written into the ledger for the next run.

🤖 Generated with Claude Code

https://claude.ai/code/session_01P889JtFvr4ypqnHYQZCPag


Generated by Claude Code

Incremental /drift sync. Nine new in-scope upstream commits reviewed since
the previous pins (runtime baeeb465, extensions cc597aa2); three ported,
six recorded as skips. Bumps extensions to 0.8.1.

Ported:

* dotnet/extensions #7735 (47b6b06) - fail closed when a quality metric has
  no valid score. NumericMetric.interpretScore now fails a metric with no
  value ("<name> has no score.") and one outside the covered scale
  ("<name> is outside the valid range."), so a pipeline gating on
  EvaluationMetricInterpretation.failed no longer treats an unparseable
  judge reply as a pass. Porting the out-of-range branch required fixing
  pre-existing drift in the same method: the rating bands and the minimum
  passing score (4.0, was 3) now match upstream exactly. 7 tests added.

* dotnet/runtime #132617 (910c55a) - handle transient file system errors
  during active polling. PollingWildcardChangeToken returns no change
  instead of an empty state (which compared as "everything was removed")
  when a directory scan fails, keeps the last successful scan as the
  baseline so a change made during an outage is detected on recovery, and
  no longer reports a false change on the first successful scan after a
  failed initial one. PollingFileChangeToken treats a failed metadata read
  as no change rather than as a change. Upstream's third strand - isolating
  each token poll inside PhysicalFilesWatcher.RaiseChangeEvents - is already
  covered: the Dart tokens each own their timer and contain their errors
  inside it. 5 tests added.

* dotnet/runtime #133013 (39b12a6) - document that a watched root and the
  files or directories matched by a filter aren't required to exist.
  Dartdoc on PhysicalFileProvider's factory and its watch override (which
  had none), and on PhysicalFilesWatcher's constructor and
  createFileChangeToken.

Skipped (recorded in the ledger):

* dotnet/runtime #131931 (6fa6b31) - linked cache entry thread safety.
  Interlocked/Volatile/MemoryBarrier plus a copy-on-write
  CacheEntry.ExpirationTokensList; Dart isolates share no mutable memory,
  so there is no race to guard. New N/A entry added.
* dotnet/runtime #133151 (4878f22) - MemoryCache OTEL size units and tag
  name. The Dart MemoryCache publishes no metrics; the corrected names are
  recorded on the open meterFactory item instead.
* dotnet/extensions #7726 (b4b46cc), #7724 (d0caf64), #7727 (2a8df4c) -
  Microsoft.Extensions.AI.OpenAI only, N/A by library.
* dotnet/extensions #7732 (c4e8764) - npm lockfile of the HTML report
  frontend; no C# library surface.
* dotnet/extensions #7728 (d72c810) - .github/skills only, out of scope.

Both upstream-sync pins advanced. Verified with dart analyze --fatal-infos,
dart format and dart test (1047 pass) in packages/extensions, and flutter
analyze --fatal-infos, flutter test (47 pass) and dart format in
packages/extensions_flutter.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P889JtFvr4ypqnHYQZCPag
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