Skip to content

DX1: a usable C ABI, the CLI, and the names we publish under #12

Description

@tamnd

Lands with M1. The C ABI stops being a skeleton and starts being usable, the CLI exists so there is something to type before any binding ships, and the names everything will publish under get reserved while they are still free.

Scope

  • The six handle types, real, over the M1 engine
  • yo_iter_next_batch with BATCH_MAX of 64, and the _many forms on every single-key read
  • yo_iter_age_us and YO_ERR_EPOCH_STALLED, so a slow iterator is a diagnosable error and not a memory leak
  • yo-c: YO_STR, YO_TRY, cleanup attributes, the things that make the C surface bearable
  • libyo_debug with assertion-heavy builds
  • yo CLI: open, get, set, check, dump
  • The single documented callback shape, used everywhere a callback is needed

Name reservation

New in dx/16-name-reservation.md, and it moves here from DX8 deliberately: a name is first-come, free to take, and unrecoverable once someone else has it. Discovering the problem at M9 is a rename across an engine, eleven repositories, a docs site and every install one-liner anyone ever posted.

  • Register tamnd.dev, point yo.tamnd.dev at the docs host. This is a blocker: dx/01 section 6 requires every error message URL to resolve, CI-checked, and the domain does not currently exist
  • Create tamnd/yo-swift, tamnd/yo-dart, tamnd/homebrew-tap, tamnd/scoop-bucket
  • Register the publishing identity on every registry in dx/16 section 7, 2FA everywhere
  • Take the namespaces, which outlast this project: com.tamnd on Maven Central, Tamnd.* on NuGet, @tamnd and @yodb on npm, tamnd on Docker Hub, the tamnd.com verified publisher on pub.dev
  • names.toml beside clients.toml, and dx/12 section 2's name table generated from it
  • xtask reserve with audit / plan / apply / verify; idempotent, redacting, one registry per invocation by default
  • Publish the 0.0.0 placeholders under the policy in dx/16 section 6 — honest, minimal, buildable, superseded within the milestone track. Not squatting, and the difference is written down
  • Configure trusted publishing (OIDC) at the moment of the first publish, which is the cheapest moment to bind publisher to repository
  • xtask reserve verify weekly in CI and in the release train

Two open questions this closes

  1. npm yodb is a tombstone. The registry returns 200 with an empty versions map: versions 0.0.1-0.0.7 published December 2019 and fully unpublished 2020-07-16, no maintainers, no repository. Probe with a 0.0.0 publish; if refused, file a support request; if that stalls, the name becomes @yodb/core and dx/12 section 2 records the exception rather than quietly keeping the claim.
  2. tamnd.dev is not registered (tamnd.com is, on Cloudflare, since 2026-05-12). Register the .dev and no string in the spec changes; move to yo.tamnd.com and it touches dx/12, 17, every crate's homepage and every URL in the error catalogue.

Credentials live in ~/data/.env at mode 600, at the identity level and not the project level, using each tool's own environment variable name (CARGO_REGISTRY_TOKEN, NPM_TOKEN, GEM_HOST_API_KEY) so no project needs a translation layer. dx/16 section 8.

Exit

The C 60-second snippet in dx/09 section 1 compiles and runs as written, in 24 lines or fewer, and is run by CI as part of the snippet check.

xtask reserve audit shows no row in state free for any primary name. yo.tamnd.dev resolves, so the error-URL check can pass.

Reference: dx/02-c-abi.md, dx/09-c-and-tier3.md, dx/11-cli-and-shell.md, dx/16-name-reservation.md.

Activity

  1. added
    milestoneMilestone tracking issue
    dxDeveloper experience: SDKs, install, ergonomics
    capiC ABI surface and stability
    cliCLI and interactive shell
    cC and C++ developer kit
    on Aug 25, 2026
  2. changed the title [-]DX1: a usable C ABI and the CLI[/-] [+]DX1: a usable C ABI, the CLI, and the names we publish under[/+] on Aug 28, 2026
  3. added
    packagingDistribution, registries, release train
    on Aug 28, 2026
  4. tamnd commented on Aug 28, 2026

    @tamnd
    OwnerAuthor

    Split out as #28 — most of the reservation block is account registration a human has to do, and the automation is blocked on it. The spec is dx/16-name-reservation.md.

  5. tamnd commented on Aug 28, 2026

    @tamnd
    OwnerAuthor

    The name-reservation probe turned up a decision, not just an audit: the binary is renamed yo → yodb (#29). yo on PATH is Yeoman's and is Yeoman's on Homebrew core, Chocolatey and the AUR; yodb is free on all three plus Scoop Main and Snap. One rename resolves every collision and removes the "install yodb, run yo" papercut dx/12 §2 used to document.

    Reservation automation is written and running — names.toml (37 rows, 20 registries) and reserve audit/plan/verify, all credential-free. Last audit 2026-08-28: blocked=7 free=23 released=1 reserved=4 unknown=2, 0 regressed. Staged outside the repo because dx0-abi is mid-rebase. Live checklist is dx/16 §13.

  6. tamnd commented on Sep 9, 2026

    @tamnd
    OwnerAuthor

    cargo xtask reserve verify now asks a registry again when the first request does not come back. PR #505.

    That gate is what stands between a release and publishing under a name somebody else has taken, and it exits 2 rather than 0 when it could not get an answer, which is right and stays. What was missing is that a request which never came back was only tried once. On the 8th one read against search.maven.org timed out, the v0.3.28 release stopped there, and the publish jobs never ran, so 0.3.28 has no crates.io release and no GitHub release, only a tag. Nobody noticed for a day because the failure was in a job there is normally no reason to read.

    The message the tool already prints in that case says what to do about it, which is to retry, so it retries. Three attempts, two seconds then four between them, and only where the request did not come back at all. An HTTP status is a verdict, including a 404 and including a 403, and asking again would only get the same one.

    v0.3.29 went out this morning with all forty three names across eleven registries reading held and none unchecked, so the gate itself is intact and this was only about how it fails.

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

    cC and C++ developer kitcapiC ABI surface and stabilitycliCLI and interactive shelldxDeveloper experience: SDKs, install, ergonomicsmilestoneMilestone tracking issuepackagingDistribution, registries, release train

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions