Rust left sdks.yaml because it needs a reqwest/api.mustache override and a
template is a FILE that has to sit beside the flags it goes with, or the pair
drifts apart. That was right about the risk and wrong about the address —
nothing requires the file to live in the SDK repo. `templates:` names a
directory under this checkout, so both halves land in one commit and one review.
The departure is what drifted, in exactly the direction it was meant to prevent:
hanzo-rs/sdk's own script defaulted to SPEC_REPO=hanzoai/openapi, hanzo.yaml, at
the branch `main`, while the .spec-lock beside it named hanzoai/cloud,
openapi.yaml, at a commit. One repo, two answers to which document the client is
a projection of, and only one of them reachable by a hand run. That script also
re-derived the jar fetch, the YAML-to-JSON conversion, --skip-validate-spec and
the drift check — the same four copies of this driver's logic that retired go's.
The row reproduces it exactly: regenerated at the ref that lock named,
`generate.py rust --check` reports clean, byte-for-byte the tree the 250-line
script produced. templates/rust/reqwest/api.mustache is a 7-line delta over the
generator's stock copy, wrapping .body() in `if let Some(..)` for the 16
operations whose binary body is optional, where reqwest::Body has no
From<Option<_>> and no type mapping reaches the Option.
Templates also stop being a reason cpp cannot be a row; its generator-version
floor still is.