Skip to content

[1/8] chore: CI on every PR and test fixture cleanup - #249

Merged
eric8810 merged 43 commits into
masterfrom
v4/1-ci-on-every-pr-and-test-fixture-cleanup
Oct 17, 2026
Merged

eric8810 merged 43 commits into
masterfrom
v4/1-ci-on-every-pr-and-test-fixture-cleanup

Conversation

@cunninghamcard-bit

@cunninghamcard-bit cunninghamcard-bit commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Requested by li

Summary

Before: The shared contract fixtures and several hand-written tests record Rust's own pre-alignment output rather than real data. Nothing pins which AI SDK package versions the alignment work compares against, and the alignment document still plans one atomic cutover through an integration branch.

After: The self-generated fixtures and the tests that pin Rust-only behaviour are deleted. Two of the deleted files come back later in a form that compiles against the new types: PR 6 restores the upstream-translated Anthropic and Bedrock remaining cases, and PR 4 ports upstream's stream timeout tests in place of the old timeout matrix. fixtures/aisdk/VERSIONS.json pins every AI SDK package the later PRs compare against, with its npm sha512 integrity, and scripts/fetch-aisdk.sh fetches exactly those sources into target/aisdk, verifying all of them before placing any. The alignment document now says the migration lands on master layer by layer, each layer CI-green, with no release until every layer is in.

This is the first of eight stacked PRs that migrate aimux to the AI SDK V4 types and provider packages. It deletes first, on its own, so the PRs after it show only code changes. It is based on master, which now has #262 (CI runs on every pull request, so every PR in the series gets checks, and a PR's superseded runs are cancelled), #246 and #247.

Type of change

  • Bug fix (non-breaking)
  • New feature (non-breaking)
  • Breaking change
  • New provider
  • New / updated binding
  • Docs / RFC

Checklist

  • cargo fmt --all -- --check passes
  • cargo clippy --workspace --all-targets -- -D warnings passes
  • cargo test --workspace passes (cassette playback — no network/keys)
  • Added or updated cassette tests / contract fixtures for behavior changes
  • Updated relevant docs (README.md, docs/, rfc/, bindings/README.md)
  • Commit messages follow Conventional Commits

Notes for reviewers

Before the series (in this order):

PR Branch Scope
#248 fix/bedrock-sigv4-signing-and-secret-redaction Fixes for the released line (#228); merged
#262 ci/optimize-ci-speed-and-cache CI speed-up, CI on every pull request; merged
#246 refactor/remove-generated-provider-name-types Remove the generated ProviderName union; merged
#247 refactor/generate-web-wire-types-with-ts-rs Web console wire types generated with ts-rs, gated ts-rs exports; merged

Series (each PR targets the one below it; after a merge the next one is retargeted to master):

PR Branch Scope
#249 v4/1-ci-on-every-pr-and-test-fixture-cleanup Delete self-generated fixtures, pin the AI SDK sources
#250 v4/2-tool-calls-follow-the-ai-sdk Tool-call tracker in provider-utils, V4 tool types
#251 v4/3-messages-and-content-follow-the-ai-sdk Messages, content, provider options and prompts as V4 types
#252 v4/4-results-and-streams-follow-the-ai-sdk Results, stream parts and the call pipeline
#253 v4/5-providers-are-ai-sdk-factories Request layer, provider interface and every vendor as a factory
#254 v4/6-vendors-follow-the-upstream-packages Vendor behaviour aligned with the upstream packages
#255 v4/7-remaining-upstream-model-kinds Remaining upstream model kinds; Decision as DecisionModelV4
#256 v4/8-public-json-equals-the-ai-sdk-json Public JSON equals the AI SDK JSON
CI artifact (zip) master a8e3a99 this PR ca19e38 change
ffi-x86_64-unknown-linux-gnu 3.77 MB 3.76 MB −0.5 KiB (-0.01%)
ffi-aarch64-apple-darwin 3.12 MB 3.12 MB −0.1 KiB (-0.00%)
ffi-x86_64-pc-windows-msvc 3.03 MB 3.03 MB −0.4 KiB (-0.02%)
node-x86_64-unknown-linux-gnu 55.30 MB 55.30 MB +5.9 KiB (+0.01%)
node-aarch64-unknown-linux-gnu 53.25 MB 53.25 MB +0.9 KiB (+0.00%)
node-aarch64-apple-darwin 15.06 MB 15.06 MB −6.0 KiB (-0.04%)
node-x86_64-apple-darwin 13.60 MB 13.60 MB +3.0 KiB (+0.02%)
node-x86_64-pc-windows-msvc 10.57 MB 10.57 MB +5.0 KiB (+0.05%)
node-aarch64-pc-windows-msvc 9.87 MB 9.87 MB −2.3 KiB (-0.02%)

cunninghamcard-bit and others added 10 commits October 11, 2026 16:30
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
(cherry picked from commit 758d0bc)
The returned impl Iterator is already must_use, so clippy's
double_must_use rejected it.

(provider.rs part of commit 8397424)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
…e removal

- scripts/gen_providers_doc.py: the `provider_name` module no longer exists;
  the docstrings and the section-header guard now name only `provider`.
  `--check` output is unchanged.
- docs/internal/phase4-audit.md: add a follow-up note (same style as
  RFC-0020) so the historical audit no longer reads as if the generated
  ProviderName types and their drift tests still exist.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
(cherry picked from commit dfcd54f)
The A2 line said Node would keep a generated string-literal union for
completion. It does not: overlay-registered provider names can never be
part of a compile-time union, so keeping one would keep the second name
path this PR removes. Record the actual A2 scope.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
(cherry picked from commit 3e2d9fc)
Pull requests into a branch other than master got no CI, so a stacked PR
could not show it was green against the PR below it. The pull_request
trigger now has no branch filter. A new push to a PR cancels that PR's
run still in progress; pushes to master are never cancelled.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
…that pin Rust-only behaviour

The V4 migration that follows replaces these tests with tests ported from
the AI SDK. They are deleted first, on their own, so the PRs after this one
show only code changes. This commit removes only test files (Rust, the seven
bindings, the shared contract fixtures and their Node runner) and the CI
steps that ran the contract fixtures. No library code changes.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
…ia alias

- Wire*.ts were hand-maintained mirrors of wire.rs and had already drifted
  (WireContentPart lacked provider_executed). Derive TS on the wire structs
  and export them to web/src/types/generated/ through gen_ts_types.py, which
  now handles two targets and checks both in CI.
- Core types resolve through the @aimux/types tsconfig alias instead of
  five-level relative paths into bindings/node.
- gen_ts_types.py sync no longer rewrites files that differ only by ts-rs
  end-of-line spaces.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
(cherry picked from commit 69c1351)
- Drop the redundant #[must_use] on provider_names(); the returned
  impl Iterator is already must_use, so clippy::double_must_use failed CI.
- Gate the wire types' ts-rs export tests behind a ts-export feature that
  only gen_ts_types.py enables. A plain cargo test previously wrote
  Wire*.ts into bindings/node/src/types via the workspace-wide
  TS_RS_EXPORT_DIR, which made gen_ts_types.py --check fail on stale files.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
(cherry picked from commit 8397424)
@cunninghamcard-bit cunninghamcard-bit changed the title [V4 1/8] chore: CI on every PR and test fixture cleanup chore: CI on every PR and test fixture cleanup Oct 12, 2026
@cunninghamcard-bit cunninghamcard-bit changed the title chore: CI on every PR and test fixture cleanup [1/8] chore: CI on every PR and test fixture cleanup Oct 12, 2026
@cunninghamcard-bit
cunninghamcard-bit marked this pull request as ready for review October 12, 2026 11:09
fixtures/aisdk/VERSIONS.json lists the seven AI SDK packages that the
upstream comparison tests are pinned to: ai 7.0.127, @ai-sdk/provider
4.0.21, @ai-sdk/provider-utils 5.0.53, @ai-sdk/anthropic 4.0.71,
@ai-sdk/google 4.0.87, @ai-sdk/openai 4.0.83 and
@ai-sdk/openai-compatible 3.0.62.

Every entry has one shape, {"version": "<x.y.z>", "integrity":
"sha512-<base64>"}, where integrity is the sha512 SRI of the npm tarball
(the registry's dist.integrity). A bare version string is not a valid
entry. The file used to arrive later in the stack, together with the
provider factories, as bare version strings; it comes first now so that
every later change can be checked against the pinned upstream sources.

Ported from fork commit 9d7508c.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
scripts/fetch-aisdk.sh downloads every package pinned in
fixtures/aisdk/VERSIONS.json with npm pack and unpacks it into
target/aisdk/<package>@<version>/, so the upstream sources that the
comparison tests follow can be read locally at exactly the pinned
versions.

- The whole VERSIONS.json is checked before anything is downloaded:
  every entry must be {"version", "integrity": "sha512-..."}, with a
  plain npm package name (it becomes a path) and an exact version.
- Each tarball's sha512 must equal the pinned integrity, and its
  package.json must name the pinned package and version.
- A package is unpacked into a work directory under target/aisdk and
  renamed into place only after its checks pass, so a failure never
  leaves a partial tree. A rerun replaces each tree with identical
  content.

AISDK_VERSIONS and AISDK_DEST override the input file and the
destination. scripts/fetch-aisdk.test.mjs (node --test) runs the script
against an npm registry served from the test process, with a temporary
npm cache and empty npm config files, so it needs no network.

Ported from fork commit 19db928. Unlike the fork, a bare version string
or a missing integrity is an error instead of a fallback to npm view,
because VERSIONS.json has a single format.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
scripts/fetch-aisdk.sh now verifies every package before it places any.
Phase 1 fetches, checks and unpacks all packages into a staging
directory; phase 2 moves the old trees aside, places the new ones and
puts the old ones back if a move fails. A network error, a missing
version or an integrity or version mismatch in any package leaves
target/aisdk exactly as it was. The new test "a failing package leaves
every destination as it was" fails on the per-package version.

scripts/aisdk-fixtures/versions.mjs is what the fixture recorder uses to
read and rewrite fixtures/aisdk/VERSIONS.json:

- readVersions / checkVersions accept only the object form, with the
  same name, version and sha512 checks as fetch-aisdk.sh.
- versionsDocument keeps the pinned integrity when the version is
  unchanged, takes it from package-lock.json when the lock pins the same
  version, and fails when neither has it or when the two disagree. It
  never writes an entry without integrity.

versions.test.mjs (node --test) covers this and checks the committed
VERSIONS.json. Its lockfile comparison is skipped until
scripts/aisdk-fixtures/package-lock.json exists.

Ported from fork commits ed1564b and 1ce4eb6. Unlike the fork,
versionsDocument fails instead of writing a version-only entry, because
VERSIONS.json has a single format. The recorder (record.mjs) is not part
of this change; it switches to versionsDocument when it is added.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
claude and others added 4 commits October 13, 2026 03:04
Replace the integration-branch atomic cutover in the alignment document
(header, section 0.4 Q3, D31, the section 0.7 ABI row, section 9.1 and
appendix I1) with layer-by-layer merges into master. Each layer is
CI-green with all its consumers updated, and nothing is released from
master until every layer is merged and the P2 gates pass; fixes for
released versions ship from a maintenance branch.

The new C ABI, codegen, the full recording schema 3 and the binding
migration come last, before the release. Until then the existing C
constructors keep their signatures and call the new factories, and ts-rs
stays as the interim generator (section 0.5 and the Part 2 generator
note). The Part 2 implementation order moves codegen, the new C ABI and
the full recording schema to the end.

ROADMAP defers the ops protocol schema and L0 passthrough until after
the migration and stops fixing C1 at nine exports.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
Remove designs from the alignment document that were never implemented
and are no longer planned:

- LanguageModelRef, ResolvedModel and RegistryModelReference. Model
  references follow upstream: an operation takes a string model ID,
  resolved through a registry, or a model instance; named methods come
  from the registration's extensions. The recording target keeps the
  string ID, and live replay asks for an explicit target when there is
  none.
- Registered sidecar metadata and its propagation through resolution,
  scope and wrap. Trace metadata comes from an explicit audit family or
  an injected descriptor index, and catalogue joins use explicit
  package/model links.
- The SessionInferer trait and registration API. Session inference keeps
  the existing opt-in prefix implementation in aimux.
- Session affinity middleware. Callers pass session headers per request
  through headers, as RFC-0019 describes.

Section 1.2 rulings and the appendix entry that pointed at these designs
now state what aimux does instead.

The size and performance gates (S1-S3, P, the CLI budget) and the
capability matrix move out of the alignment document to ROADMAP as work
after the migration. Their thresholds wait for the rewrite of #208
(RFC-0038); until then each migration layer's PR lists artifact sizes
before and after.

Section 9.1 gains a known-gaps list of the agreed designs the migration
layers do not implement, one line each.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
Cargo.toml configures [profile.release] with fat LTO (lto = true),
codegen-units = 1, and opt-level = "z" so published FFI binaries stay
small. In CI, 11 test-only jobs (Java, Kotlin, Go, Python, Flutter,
Android example, contract tests, Swift) were running full fat-LTO release
builds from scratch even though they upload no release artifacts, while
writing separate 275 MB cache entries per job and exceeding GitHub's 10 GB
repository cache quota.

- Skip fat LTO and -Oz in test-only jobs via top-level CARGO_PROFILE_*
  overrides, while keeping Cargo.toml's full release profile (lto = true,
  codegen-units = 1, opt-level = "z") on node-binding and ffi-build so
  uploaded release artifacts keep their exact sizes.
- Strip debug symbols from dev/test profiles (CARGO_PROFILE_DEV_DEBUG=0,
  CARGO_PROFILE_TEST_DEBUG=0) to speed up linking the 162 integration
  test binaries.
- Build only the cdylib target (cargo rustc --crate-type cdylib) in jobs
  that only link the shared library, avoiding archiving a redundant
  staticlib.
- Enable cache-all-crates on Swatinem/rust-cache and share a single
  "ffi-test" cache key across the FFI test jobs to reduce cache churn.
- Replace `cargo install cargo-ndk` (source build) with
  taiki-e/install-action@v2 and enable Flutter/Gradle/npm/pip caches.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…caches

Fixes on top of the previous commit:

- node-binding builds with `napi build` without `--release`, so its
  uploaded node-* artifacts are dev-profile builds. The workflow-level
  CARGO_PROFILE_DEV_DEBUG=0 stripped their debug info (Linux artifact
  55.3 MB -> 17.6 MB) and its CARGO_PROFILE_RELEASE_* overrides had no
  effect. Debug info is now dropped in rust-test only, where the test
  binaries are linked, and the dead overrides are gone.
- ffi-build goes back to `cargo build`, as release.yml does. Building
  only the cdylib changes the shipped library (x86_64 Linux .so
  9,446,848 -> 7,637,144 bytes, same 129 exports), so the ffi-*
  artifacts would no longer match the release build or earlier runs.
- rust-cache `cache-all-crates` keeps unused registry crates, it does
  not cache workspace crates; dropped. Caches are saved from master only
  (`save-if`); pull requests restore master's caches instead of each
  writing their own, which is what pushed the repository past 10 GB.
- The two node-binding legs on each runner OS (x64 and arm64 targets)
  shared one cache key: one leg failed to save and the other restored a
  cache built for the wrong target. The key now includes the target.
- CARGO_INCREMENTAL=0 is already set by rust-cache; dropped.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0112xDERMUyD5JALkFhnsdWS
With every stacked pull request running CI, runs wait far longer for a
runner than they spend building: each run had 6 macOS jobs against a
5-job macOS limit and 18 Linux jobs against a 20-job total limit, and
the macOS jobs of one run sat queued for 15 minutes.

- Java (JDK 8, 11, 17, 21) and Kotlin (JDK 17, 21) run in one job
  that builds the FFI library once and runs each JDK in turn: 6 jobs
  and 6 FFI builds become 1.
- The Go binding is tested in the ffi-build legs on Linux and macOS,
  against the static archive that job already builds: the 2 Go jobs
  and their FFI builds go away.
- The x86_64 macOS Node binding is cross-built on Apple Silicon and
  tested with x64 Node under Rosetta instead of on the Intel runner,
  where its build took 371 of the job's 465 seconds.
- scripts/build-ios-xcframework.sh builds both iOS slices in one cargo
  invocation, so they compile in parallel; the output is unchanged.

A run goes from 24 jobs (6 macOS) to 17 (5 macOS).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0112xDERMUyD5JALkFhnsdWS
… and secret redaction (#248), RFC-0033 to RFC-0043

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
The console imports the core types from bindings/node/src/types through
@aimux/types. gen_ts_types.py --check only compares the generated files,
so a renamed or removed Rust type regenerates cleanly and leaves a
dangling import that no pull request check catches. RFC-0036 §13.1 A4
asks for every import to be type-checked.

A new "Web console typecheck" job runs `npm ci && npm run typecheck`
(vue-tsc --noEmit) in tools/aimux-web/web. It runs when the shared code
changes (which includes tools/aimux-web and the Rust crates whose types
are generated) or when bindings/node changes, where the generated types
live; documentation-only changes skip it. "CI result" checks it.
Removing bindings/node/src/types/Recording.ts locally makes it fail on
the two files that import it.

RFC-0029 §9.1 gets a later-change note: the console no longer has its
own copies, and TS_RS_EXPORT_DIR no longer points at the web directory.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
…, Bedrock SigV4 and secret redaction (#248), roadmap status (#205), RFC-0033, RFC-0036 §12-§14, RFC-0039 to RFC-0043

The CI speed-up branch below this one has master merged in, so this brings
in master as well.

ROADMAP.md §4 conflicted: master rewrote it as "近期入口与依赖门" (#205),
and this branch had annotated the old item 2 (S1 + S2) as deferred. The
merge takes master's section as written; the size and performance gates
are reconciled with RFC-0043 in the next commit.

.github/workflows/ci.yml: the contract-tests and swift-contract-tests jobs
keep the "changes" gate and the master-only cache saving from below, with
this branch's steps (generator drift checks only; the Rust, Node and Swift
contract tests were removed here). The comments in the "changes" job now
use the jobs' new names.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
#208 is merged as RFC-0043, which sets the gates without waiting for
the migration, and master's ROADMAP §4 (#205) lists S1 / S2 / P as near
term. This branch had deferred them until the migration was done and
until #208 was rewritten. S1, S2, S3 and P are no longer marked as
deferred in ROADMAP §2 and §3, the alignment doc §0.7 puts them back in
the unaffected row with a pointer to RFC-0043, and the list of the
maintainer's RFC drafts names RFC-0043 instead of RFC-0038. Each
migration layer's PR still lists artifact sizes before and after; the
0.9 capability matrix stays after the migration.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
…rged RFCs

#207 merged RFC-0036 §12-§14 and asks that the alignment doc's matching
section be updated with this first layer and link back to the §12.2
replacement table. §0.7 now links RFC-0036 §12.2 in both places that
cited "#207 §12.2", and links the topic RFCs, all of them now merged
(RFC-0033, RFC-0036 §12-§14, RFC-0039 to RFC-0043).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
scripts/fetch-aisdk.test.mjs and scripts/aisdk-fixtures/versions.test.mjs
ran nowhere. Both are offline: the fetch test serves its own registry on
127.0.0.1, and the versions test reads local JSON. They now run in the
generator drift job, which already runs for every code change. The
lock-file test skips until scripts/aisdk-fixtures/package-lock.json
exists and then holds the lock to VERSIONS.json.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
RFC-0011, RFC-0013, RFC-0016 and RFC-0035 still pointed at
contract-tests/fixtures/wire-format.json, tool-call-repair.json and the
binding contract tests this layer deletes. Each gets a 后续变更 line
saying what no longer applies and what pins wire behaviour now, and
the changelog gets a Removed entry for the retired fixtures.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
aimux-core's #[ts(export)] derives are not feature-gated, and
TS_RS_EXPORT_DIR points at bindings/node/src/types/, so a plain cargo
test rewrites that tracked directory. scripts/gen_ts_types.py is the
source of truth; the debt goes away when ts-rs retires with D8.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
The only conflict was scripts/gen_ts_types.py. It keeps #247's
multi-target structure (TARGETS, per-target sync and check) and drops
the EXCLUDED set and manifest's exclude parameter: #246 deletes
bindings/node/src/types/ProviderName.ts, so nothing is left to exclude.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
aimux-core's #[ts(export)] attributes were ungated, so every plain
cargo test rewrote bindings/node/src/types through the TS_RS_EXPORT_DIR
in .cargo/config.toml. aimux-core now has the same ts-export feature as
tools/aimux-web (tools/aimux-web/Cargo.toml:21-23), and each of its 158
exports is #[cfg_attr(feature = "ts-export", ts(export))].

scripts/gen_ts_types.py enables the feature for the core target, and
--check also fails on any ts(export attribute outside that gate in either
crate's source, printing file:line. The .cargo/config.toml comment and the
web README now say that cargo test writes nothing and the generator is
the only writer. gen_ts_types.py --check passes: 159 node files and 8 web
files are unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
Stacks the series on #247 (which carries #246): aimux-core's ts-rs exports
run only under the ts-export feature that scripts/gen_ts_types.py enables,
and the generated ProviderName types are gone. Each later layer gates the
exports it adds in its own merge, so no layer leaves an ungated export.

Resolution: scripts/local-ci.sh keeps this layer's version without the
retired contract section; CHANGELOG keeps both sides, the ts-rs entry as
a Fixed section before Removed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
Brings in #266 (a blank key on a custom base URL is sent as an empty
key, as the AI SDK does for apiKey: '').

Resolution: no conflicts.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
Brings in #266 (a blank key on a custom base URL is sent as an empty
key, as the AI SDK does for apiKey: '').

Resolution: no conflicts.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
Brings in #266 (a blank key on a custom base URL is sent as an empty
key, as the AI SDK does for apiKey: '').

Resolution: no conflicts.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
@cunninghamcard-bit
cunninghamcard-bit changed the base branch from ci/optimize-ci-speed-and-cache to refactor/generate-web-wire-types-with-ts-rs October 16, 2026 11:03

Copy link
Copy Markdown
Contributor Author

这次更新:本层合入了 #247(含 #246,c5255255),所以 PR 的基改成 #247 的分支。

eric 的意见 我们的处理 位置
[1/8] 到 [6/8] 之间厂商断言有空窗(合并前知悉) 接受。这是先删后补的代价,期间由 cassette 门禁和 35 项强断言兜底 —
和 master 的 CI 架构冲突(合并前知悉) 本层合入 CI 提速分支(含 master 和 #263)时已调和,ci.yml 和 ROADMAP 都解决了(d1005cf3) .github/workflows/ci.yml
pin 脚本的测试没接进 CI Generator drift checks 任务里离线跑这两个测试(b32dc0ae) .github/workflows/ci.yml:657
四个 RFC 还引用已删的 fixture 每个 RFC 加一行"后续变更"注记(710fcd71) rfc/0011-golang-bindings.md:6、rfc/0013-java-bindings.md:6、rfc/0016-align-with-aisdk.md:7、rfc/0035-host-side-tool-call-repair.md:7
CHANGELOG 补一句 contract fixture 体系的去向 Unreleased 的 Removed 里写了删掉什么、改由什么覆盖(710fcd71) CHANGELOG.md:53
Node 绑定的 thought_signature_replay 测试删了,是有意放弃吗 不是有意的,是漏了:原来的两个测试只断言解析方向。回传方向在 [8/8] 补了三条请求体测试(8f1eaf40):签名作为 functionCall 的兄弟字段发回;Gemini 3 之前没签名的调用不带这个字段;Gemini 3 上只补缺失的签名,有签名的保留原值 [8/8] aimux-providers/tests/google_upstream_e2e_test.rs:452、:465、:474

Generated by Claude Code

The fetch test pointed npm's user and global config at the same empty
file. npm refuses that ("double-loading config ... as global, previously
loaded as user") and exits before any request, so on CI every test that
downloads failed with "npm pack failed". It passed in the cloud only
because the environment's NPM_CONFIG_USERCONFIG overrode the test's own
setting.

The test now writes two files, and drops inherited npm_config_* variables
in any case before setting its own, so it runs the same everywhere.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
@eric8810
eric8810 changed the base branch from refactor/generate-web-wire-types-with-ts-rs to master October 17, 2026 01:25
master 带入 #262/#246/#247 的 squash;三个冲突文件取本分支版本
(ci.yml 为已调和 #262 任务表 + web-typecheck + pin 脚本测试的超集),
gen_ts_types.py 自动合并。
@eric8810
eric8810 merged commit 7d07c03 into master Oct 17, 2026
20 checks passed
eric8810 added a commit that referenced this pull request Oct 17, 2026
master 带入 #249 的 squash;两个冲突文件取本分支版本
(对齐文档含本层 §0.7 增量;VERSIONS.json 为本层的 provider-utils 5.0.55 升级)。
eric8810 added a commit that referenced this pull request Oct 17, 2026
master 带入 #249/#250 的 squash;冲突文件取本分支版本
(层分支内容 = master 同内容 + 本层 messages/content 改写,为超集,
合并后净差异与层原始增量一致:268 files +14926/-10765)。
eric8810 added a commit that referenced this pull request Oct 17, 2026
master 带入 #249/#250/#251 的 squash;82 个冲突取本分支版本,
其中 3 个 node 类型文件按本层意图删除(Role/StreamResponse/
StreamTextResultAggregated 为 delete/modify 冲突,git rm)。
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