Skip to content

DX0: foundations, the repository split, the API model #166

Description

@tamnd

Milestone DX0 of the developer-experience program (Spec/2064g/dx/00-overview.md). Specs: dx/17 §DX0, dx/18, dx/02, dx/03, dx/14 §10, dx/15 §2. Runs with M0 (#1).

Nothing user-facing. This is the machinery every later SDK depends on, and the part of it that is genuinely irreversible is the repository boundary, so it is settled before any binding exists. The rule dx/18 §1 lands on, after auditing what DuckDB actually does: code that compiles against the engine's internals stays in this repo, code that compiles against the frozen C ABI leaves. That puts the Rust SDK, zu.h, the CLI, and the conformance corpus here, and puts Python, Node, Go, Java, .NET, the C/C++ kit, and the site in their own repositories. tamnd/zu-c deliberately does not contain zu.h, because the header is generated from the API model and is therefore an output of this build.

The second irreversible thing is the pinned toolchain table (dx/14 §10), audited against the registries on 2026-08-15 and recorded in Spec/2064g/AUDIT-2026-08.md. It is one table, referenced everywhere, so "which version do we build against" never has two answers.

repository split (dx/18 §2, §5):

  • create and configure zu-web, zu-c, zu-python, zu-node, zu-go, zu-java, zu-dotnet, zu-kit identically
  • release-artifact contract: libzu-*, zu.h, model.json, gql.json, errors.json, cli.json, conformance-<version>.tar.zst
  • conductor workflow skeleton, every dispatch a no-op (dx/14 §6)
  • issue routing: a binding repo's template asks whether the bug reproduces through the CLI, and sends it here if it does
  • clients/ index in the README and a repository map in the docs

API model and map (dx/03 §2, docs/04 §2, dx/18 §4):

  • model.json generator from the Rust API surface
  • api-map.toml schema, one per binding repository
  • two-way completeness check: a new public symbol with no map entry fails here, an unmapped tier-1 entity fails the release

conformance corpus skeleton (dx/15 §2):

  • YAML case schema and the {type, value} value encoding, strings for int64/decimal/timestamp
  • the Rust runner
  • release packaging as conformance-<version>.tar.zst
  • ~150 type cases

foundations:

  • terminology table zu-web/style/zu/terms.yml, shared by docs, SDKs, CLI, and error messages (docs/03 §5)
  • tier-1 platform matrix building libzu in CI: linux gnu/musl x64+arm64, macOS x64+arm64, windows x64 (dx/14 §2)
  • pinned toolchain table adopted and enforced in CI (dx/14 §10)
  • ADRs: C ABI over Rust-only bindings; PyO3 and napi-rs as the two exceptions; TypeScript bigint for INT64; Panama over JNI; the repository split

done when:

  • a PR adding a public Rust API symbol without a map entry fails CI
  • the corpus runs in Rust
  • a tagged build produces libzu for all seven tier-1 platforms and publishes every artifact in the contract
  • the conductor dispatches to all eight repositories and collects their (empty) results

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    capiC ABI surface and stabilityconformanceConformance measurement, corpus, declarationdxDeveloper experience: SDKs, CLI, install, ergonomicsmilestoneMilestone tracking issuepackagingDistribution, registries, release train

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions