fix(release): make the crate rerun blocks isolate the build dir with any cargo and stop on a reused root

Second fix-up for 8b92463a2c / 9ded7ce896 after review (Refs CW-7445).
All three confirmed findings are addressed.

What
- Build dir. The preflight and step 5 blocks set CARGO_HOME and
  CARGO_TARGET_DIR under the new root, and run the script through
  `python3 scripts/build-lock.py "${lock}" --`. Before, they relied on
  CODEWHALE_CACHE_ROOT, which only scripts/dev-cargo.sh reads. On this Mac,
  PATH cargo is ~/.local/bin/cargo (cargowhale), which passes metadata and
  publish straight through, so the build dir stayed ./target. That holds
  0.10.2 tmp-registry units, so the documented blocks were refused as
  written, and the refusal suggested a nested root that failed the same way.
  CARGO_TARGET_DIR works with plain cargo and with dev-cargo.sh, which
  honors an inherited target dir. build-lock.py holds the machine lock
  whichever cargo is on PATH. publish-crates.sh's refusal now prints the
  same form, with the absolute build-lock.py path. The "in place of
  CODEWHALE_CACHE_ROOT" caveat is gone from the script and the runbook.
- Token prompt. The step 5 block is wrapped in `{ ... }`, so the shell reads
  the whole block before `read` runs. It prompts with
  `printf 'crates.io token: ' >&2`, not `read -p`, which means coprocess in
  zsh. An empty token stops the block through `[ -n "${token}" ] &&`. The
  `cargo owner --list` check gets the same shape.
- Reused root. Both blocks run `mkdir -p "${cache}" && mkdir "${root}" &&`
  ahead of the command. A missing fallback cache dir is created, and an
  existing root (for example a same-second rerun) stops the run.
- Wording. "cache root" becomes "build directory" in the runbook,
  RELEASE_CHECKLIST §6 and the refusal text.
  web/data/agent-docs.generated.json was regenerated by
  `npm --prefix web run prebuild`.

Verification (source: 7af7549c1e plus this diff; CODEWHALE_CACHE_ROOT,
CODEWHALE_BUILD_LOCK_FILE and CARGO_TARGET_DIR unset unless stated)
- The preflight block was extracted from the doc and run with a cargo shim
  that execs ~/.local/bin/cargo and exits 99 on `publish`, with
  XDG_CACHE_HOME pointing at an empty scratch dir and CARGO_NET_OFFLINE=true.
  - bash and `zsh -f`: the fallback cache dir was created and the guard
    passed. Each reached "Verifying all 29 release package tarballs",
    and the shim saw target=<root>/target, home=<root>/cargo-home and
    CODEWHALE_BUILD_LOCK_HELD=1.
  - Plain `zsh` (not -f) skipped the shim, because ~/.zshenv prepends
    ~/.cargo/bin. Real `cargo publish --dry-run` then failed offline,
    "failed to update registry crates-io", with nothing uploaded. That is a
    probe artifact.
  - Same-second rerun: the second run stopped at "mkdir: ... File exists"
    and ran nothing.
- The step 5 block was extracted with publish-crates.sh replaced by an env
  printer and piped into `bash -s` and `zsh -f -s`:
  - no token line: prompt only, no root created, nothing run;
  - token line after the block: "child token=set target=set held=1".
- Real-state refusal (shim, default ~/.cargo, repo ./target): exit 1. The
  printed rerun is `mkdir -p ... && mkdir ... && CARGO_HOME=...
  CARGO_TARGET_DIR=... python3 .../scripts/build-lock.py ... -- ...`, not
  nested, and `bash -n` and `zsh -n` pass on it.
- publish-crates.test.py under build-lock.py: "Ran 6 tests in 2.767s OK".
  validate-crate-publish-order.test.sh: passed.
  .github/scripts/release-workflows.test.js: exit 0.
  `bash -n` passes. shellcheck shows only SC1091, SC2154 and SC2034, all
  present before this change. ~/.cargo/registry/src is unchanged.
- npm test (final tree, including the CW-7236 follow-up committed next):
  root 101/101, runtime-sdk 19/19, extension-host 420 (413 pass, 7
  skipped), web node 7/7, vitest 772/772. npm run check:web: exit 0.

Not verified
- A real crates.io token and step 5 end to end. That needs the v0.10.2
  tag, the network and a token, which are the founder's.
- Interactive tty paste in bash 3.2 and in zsh. The pipe cases stand in for
  them.
- A full cold dry run in a new root (about 19 GB). Not rerun.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01NBKbhx19BRbZtvWK8rVKjz
This commit is contained in:
CodeWhale BotandClaude Opus 5.5 committed 2026-10-16 10:29:47 -07:00
1 parent 7af7549c1e
commit 3fd44b5501
4 files changed
+45 -42

No files matched your search

+1 -1
View File
@@ -215,7 +215,7 @@ known limitations and publication approval. These proofs are separate.
- [ ] Publish Cargo manually within the approved scope with the
[runbook's step 5 block](RELEASE_RUNBOOK.md#rust-crates-release), which
runs `./scripts/release/publish-crates.sh publish` from a new, empty
`CARGO_HOME` and cache root with the token in `CARGO_REGISTRY_TOKEN`. It
`CARGO_HOME` and build directory with the token in `CARGO_REGISTRY_TOKEN`. It
verifies every package, skips already-published versions and waits for
each new dependency to appear. npm normally uses Trusted Publishing;
manual recovery keeps the same clean-source and public-asset guards.
+38 -35
View File
@@ -148,30 +148,29 @@ directory's `*/deps/` that names such a directory. The refusal lists what it
found and deletes nothing; removing shared cache directories still needs
explicit cleanup approval. It prints, with the paths filled in, the kind of
rerun that produced the 0.10.2 receipt at 14683c9983 on 2026-10-16: a new,
empty `CARGO_HOME` and `CODEWHALE_CACHE_ROOT`.
empty `CARGO_HOME` and build directory.
```bash
mode=dry-run
cache="${CODEWHALE_CACHE_ROOT:-${XDG_CACHE_HOME:-$HOME/.cache}/codewhale}"
lock="${CODEWHALE_BUILD_LOCK_FILE:-${cache}/build.lock}"
root="${cache}/release-verify-$(git rev-parse --short=10 HEAD)-${mode}-$(date -u +%Y%m%dT%H%M%SZ)"
mkdir "${root}"
CODEWHALE_BUILD_LOCK_FILE="${lock}" CARGO_HOME="${root}/cargo-home" \
CODEWHALE_CACHE_ROOT="${root}" ./scripts/release/publish-crates.sh "${mode}"
mkdir -p "${cache}" && mkdir "${root}" &&
CARGO_HOME="${root}/cargo-home" CARGO_TARGET_DIR="${root}/target" \
python3 scripts/build-lock.py "${lock}" -- ./scripts/release/publish-crates.sh "${mode}"
```
That run was a cold build of about 19 GB and 962 compile steps, so check
`df -h` first. `cache` and `lock` use the same fallbacks as
`scripts/dev-cache.sh`. `CODEWHALE_CACHE_ROOT` and `CODEWHALE_BUILD_LOCK_FILE`
take effect only when `cargo` on `PATH` is `scripts/dev-cargo.sh` or a wrapper
that execs it, such as the strict dry-run wrapper used for the 0.10.2 receipt.
That run kept its lock file inside the new root and did not serialize with
other builds on the machine; `CODEWHALE_BUILD_LOCK_FILE` keeps the machine
lock. Plain Cargo ignores both variables and takes no machine lock: set
`CARGO_TARGET_DIR="${root}/target"` in place of `CODEWHALE_CACHE_ROOT`, and
wrap the command in `python3 scripts/build-lock.py "${lock}" --` if other
builds may run. Every run leaves state that the next run at the same version
refuses, so the root name carries the SHA, the mode and a UTC timestamp:
`scripts/dev-cache.sh`. `CARGO_TARGET_DIR` moves the build directory with
plain Cargo and with `scripts/dev-cargo.sh`, which honors an inherited target
directory, and `scripts/build-lock.py` holds the machine build lock whichever
`cargo` is on `PATH`. The 0.10.2 receipt run set `CODEWHALE_CACHE_ROOT`
instead, which only `scripts/dev-cargo.sh` reads, and kept its lock inside the
new root. `mkdir` without `-p` refuses a root that already exists, and the
`&&` chain stops the run there. Every run leaves state that the next run at
the same version refuses, so the root name carries the SHA, the mode and a
UTC timestamp:
publish mode (step 5 of the Rust crates release) and each partial-publish
rerun get their own root. Pass the crates.io token to publish mode as
`CARGO_REGISTRY_TOKEN` for that one command, as step 5 shows; Cargo then
@@ -398,16 +397,18 @@ and fails branch-only release sources before assets are published.
```bash
./scripts/release/require-release-tag-checkout.sh X.Y.Z
mode=publish
cache="${CODEWHALE_CACHE_ROOT:-${XDG_CACHE_HOME:-$HOME/.cache}/codewhale}"
lock="${CODEWHALE_BUILD_LOCK_FILE:-${cache}/build.lock}"
root="${cache}/release-verify-$(git rev-parse --short=10 HEAD)-${mode}-$(date -u +%Y%m%dT%H%M%SZ)"
mkdir "${root}"
read -rs token
CARGO_REGISTRY_TOKEN="${token}" CODEWHALE_BUILD_LOCK_FILE="${lock}" \
CARGO_HOME="${root}/cargo-home" CODEWHALE_CACHE_ROOT="${root}" \
./scripts/release/publish-crates.sh "${mode}"
unset token
{
mode=publish
cache="${CODEWHALE_CACHE_ROOT:-${XDG_CACHE_HOME:-$HOME/.cache}/codewhale}"
lock="${CODEWHALE_BUILD_LOCK_FILE:-${cache}/build.lock}"
root="${cache}/release-verify-$(git rev-parse --short=10 HEAD)-${mode}-$(date -u +%Y%m%dT%H%M%SZ)"
printf 'crates.io token: ' >&2; read -rs token; echo >&2
[ -n "${token}" ] && mkdir -p "${cache}" && mkdir "${root}" &&
CARGO_REGISTRY_TOKEN="${token}" CARGO_HOME="${root}/cargo-home" \
CARGO_TARGET_DIR="${root}/target" \
python3 scripts/build-lock.py "${lock}" -- ./scripts/release/publish-crates.sh "${mode}"
unset token
}
```
Both Cargo and npm publication fail closed unless `HEAD`, the clean local
@@ -416,12 +417,12 @@ and fails branch-only release sources before assets are published.
second handwritten order in this runbook. The helper waits for each new
version to appear on crates.io before moving to dependents and safely skips
versions that are already public on a rerun. The block runs it from a new,
empty `CARGO_HOME` and cache root of its own, as the package preflight
above describes; the dry run's state makes it refuse otherwise. `read -rs`
keeps the token out of shell history, and the environment variable keeps
it out of `credentials.toml`. The cache and lock variables take effect only
through `scripts/dev-cargo.sh` or a wrapper that execs it; see the package
preflight for plain Cargo.
empty `CARGO_HOME` and build directory of its own, as the package preflight
above describes; the dry run's state makes it refuse otherwise. The braces
make the shell read the whole block before `read` runs, so a pasted or
piped block never takes its own next line as the token. `read -rs` keeps
the token out of shell history, an empty token stops the block, and the
environment variable keeps the token out of `credentials.toml`.
If shared `main` advances or the checkout becomes dirty, stop and coordinate
a new candidate or separately authorized recovery with Hunter. Do not switch
branches, create another checkout, force-fetch a conflicting tag or bypass
@@ -621,15 +622,17 @@ for that version — bump to the next patch instead.
credential.
```bash
read -rs token
CARGO_REGISTRY_TOKEN="${token}" cargo owner --list codewhale-tui # prints the owner, e.g. `Hmbown (Hunter Bown)`
unset token
{
printf 'crates.io token: ' >&2; read -rs token; echo >&2
[ -n "${token}" ] && CARGO_REGISTRY_TOKEN="${token}" cargo owner --list codewhale-tui # prints the owner, e.g. `Hmbown (Hunter Bown)`
unset token
}
```
A 403 or `401` from this call, or `cargo publish` refusing credentials,
means the token is missing/expired. Create a new token, check it with this
call, then rerun the step 5 block. It makes another new `CARGO_HOME` and
cache root, which the rerun needs because the failed run's own state makes
build directory, which the rerun needs because the failed run's own state makes
the guard refuse otherwise, and it keeps the token out of that root.
- **npm:** the OIDC job publishes only if the npmjs.com Trusted Publisher for
`codewhale-hq` / `Codewhale` / workflow `release.yml` / blank environment is
@@ -652,7 +655,7 @@ for that version — bump to the next patch instead.
with these commands
- Crates publish partially:
- rerun the Rust crates release step 5 block; its timestamped root gives
each rerun another new, empty `CARGO_HOME` and cache root, and the failed
each rerun another new, empty `CARGO_HOME` and build directory, and the failed
run's own state makes `publish-crates.sh publish` refuse otherwise
- already-published crate versions will be skipped
- GitHub assets missing or checksum manifest incomplete:
+4 -4
View File
@@ -90,10 +90,10 @@ if (( ${#reused[@]} > 0 )); then
echo "Refusing to package release crates: Cargo would reuse ${workspace_version} state from an earlier package run instead of the current sources:"
printf ' %s\n' "${reused[@]}"
echo "Cargo treats crates served from its temporary package registry as immutable by name and version. It skips extraction once .cargo-ok exists and keeps compiled units that do not track their sources, so this run would verify old code. Nothing was deleted."
echo "Rerun from a new, empty Cargo home and cache root. Every run leaves state the next run at this version refuses, so publish and each partial-publish rerun need their own root:"
echo " mkdir \"${verify_root}\""
echo " CODEWHALE_BUILD_LOCK_FILE=\"${CODEWHALE_BUILD_LOCK_FILE:-${cache_root}/build.lock}\" CARGO_HOME=\"${verify_root}/cargo-home\" CODEWHALE_CACHE_ROOT=\"${verify_root}\" $0 ${mode}"
echo "CODEWHALE_CACHE_ROOT and CODEWHALE_BUILD_LOCK_FILE take effect only when cargo on PATH is scripts/dev-cargo.sh or a wrapper that execs it. Plain cargo ignores both and takes no machine build lock; with it, set CARGO_TARGET_DIR=\"${verify_root}/target\" in place of CODEWHALE_CACHE_ROOT."
echo "Rerun from a new, empty Cargo home and build directory. Every run leaves state the next run at this version refuses, so publish and each partial-publish rerun need their own root:"
echo " mkdir -p \"${cache_root}\" && mkdir \"${verify_root}\" &&"
echo " CARGO_HOME=\"${verify_root}/cargo-home\" CARGO_TARGET_DIR=\"${verify_root}/target\" python3 \"$(dirname "${script_dir}")/build-lock.py\" \"${CODEWHALE_BUILD_LOCK_FILE:-${cache_root}/build.lock}\" -- $0 ${mode}"
echo "CARGO_TARGET_DIR moves the build directory with plain cargo and with scripts/dev-cargo.sh, and build-lock.py holds the machine build lock whichever cargo is on PATH."
echo "For publish mode, pass the crates.io token as CARGO_REGISTRY_TOKEN for that one command, so Cargo writes no credentials.toml under the new root. After cargo login with that CARGO_HOME instead, run cargo logout with it once the publish finishes. See docs/RELEASE_RUNBOOK.md."
} >&2
exit 1
+2 -2
View File
@@ -357,8 +357,8 @@
},
{
"path": "docs/RELEASE_CHECKLIST.md",
"sha256": "4a0cab2b895cdc01067f0663b1f77c4993d090b3daa29b9eb29557fdfb9eb88d",
"content": "# Release Checklist\n\nFollow this sequence from the canonical `/Volumes/VIXinSSD/CW/codewhale`\ncheckout on `main`. Agent-owned preparation lands as verified slices on `main`;\nit requires no release branch, worktree, nested clone or preparation PR.\nContributor PRs still land as PRs. Treat any unchecked required gate as a release\nblocker.\n\nFor deeper context on the underlying tools (preflight scripts, npm smoke,\npublish-crates), see [`RELEASE_RUNBOOK.md`](RELEASE_RUNBOOK.md).\nFor larger milestone releases, add any version-specific acceptance matrix to\nthe existing release packet before tagging; use it for provider routes, feature\ngates, GUI/runtime smoke, remote-workbench decisions, and credit hygiene that the\ngeneric checklist does not enumerate. Record its candidate SHA, owners, local\ncheck results, hosted run URLs, artifact inventory, install/provider receipts,\nknown limitations and publication approval. These proofs are separate.\n\n## 0. Reconcile the canonical checkout\n\n- [ ] Inspect the branch, status, upstream and alternate checkouts before editing:\n ```bash\n git branch --show-current\n git status --short --branch\n git log -5 --oneline\n git worktree list\n git fetch origin main\n git log --left-right --oneline main...origin/main\n ```\n- [ ] The canonical checkout is on `main`. Recover stranded work only after\n preserving dirty/untracked files and comparing commits with current\n `origin/main`. Keep a recoverable backup and unresolved inventory; do not\n reset away work, stash it indefinitely or create another development lane.\n- [ ] Partition files among active writers. Check status before staging and\n stage only owned paths. Historical branches/checkouts are inventoried;\n deleting them requires explicit Hunter approval even if a helper calls\n their tips safe to delete.\n\n## 1. CHANGELOG entry exists for the version\n\n- [ ] `CHANGELOG.md` has a `## [X.Y.Z] - YYYY-MM-DD` heading at the top\n- [ ] The entry credits every external contributor, harvested PR author,\n linked issue reporter, reproduction/log provider, reviewer, and\n verification helper whose work materially shaped this version. Get the\n commit list with:\n ```\n git log vPREV..HEAD --no-merges --format=\"%h %an <%ae> %s\" \\\n | grep -v '<your-email@…>'\n ```\n For each contributor, link both their display name and (when known)\n `@github-handle`. Then inspect linked issues and harvested PRs so\n reporters/helpers are not lost just because they did not author commits.\n Keep `docs/CONTRIBUTORS.md` and `web/lib/release-credits.ts` consistent.\n- [ ] The entry uses the Keep a Changelog headers — `Added`, `Changed`,\n `Fixed`, `Security`, `Removed`, `Deprecated`. Add `Known issues` only\n if there is something material the user must work around.\n- [ ] The entry mentions all referenced issue/PR numbers as `#NNNN` so the\n auto-linker on GitHub picks them up.\n- [ ] Run `scripts/sync-changelog.sh` to regenerate `crates/tui/CHANGELOG.md`\n (the recent-releases slice embedded in the binary for `/change`). Do\n not edit that file by hand, and do not copy the full root changelog\n into it — older entries live in `docs/CHANGELOG_ARCHIVE.md`.\n- [ ] Run `scripts/release/check-feature-release-notes.sh vPREV HEAD`. Every\n issue-linked `feat` commit must leave a receipt in `CHANGELOG.md` or the\n archive; the Version drift CI gate runs the same check with full history.\n\n## 2. Version pins are in sync\n\n- [ ] Use `./scripts/release/prepare-release.sh X.Y.Z` when version pins or\n generated sources need preparation. Reuse a valid preparation receipt\n when those sources are already current. The helper bumps the\n workspace version, every per-crate dependency pin, the npm wrapper\n (`version` + `codewhaleBinaryVersion`), Runtime SDK, VS Code extension\n and lock, remote-smoke default, public source-candidate facts, and README\n install-tag examples; it refreshes the Cargo/npm locks, regenerates\n `crates/tui/CHANGELOG.md` and `web/lib/facts.generated.ts`, and ends\n by running the version and OHOS gates. Write the CHANGELOG entry\n **before** running it. The helper is safe to rerun at the requested\n workspace version; it skips replacements but refreshes both generated\n files and reruns the gates.\n- [ ] `npm/deepseek-tui/package.json` remains private/compatibility-only and\n is **not** bumped or published.\n- [ ] `./scripts/release/check-versions.sh` reports\n `Version state OK: workspace=X.Y.Z, npm=X.Y.Z, npm-binary=X.Y.Z, lockfile in sync.`\n- [ ] `./scripts/release/check-ohos-deps.sh` reports that the OpenHarmony\n Windows linker keeps the target/sysroot flags, the target enables the\n `rquickjs-sys` bindgen edge, and its graph does not pull the unsupporLine truncated
"sha256": "fd05d66251e796ceb80aa9d6864a405cf15297796e7e37ed423acdc04d53111f",
"content": "# Release Checklist\n\nFollow this sequence from the canonical `/Volumes/VIXinSSD/CW/codewhale`\ncheckout on `main`. Agent-owned preparation lands as verified slices on `main`;\nit requires no release branch, worktree, nested clone or preparation PR.\nContributor PRs still land as PRs. Treat any unchecked required gate as a release\nblocker.\n\nFor deeper context on the underlying tools (preflight scripts, npm smoke,\npublish-crates), see [`RELEASE_RUNBOOK.md`](RELEASE_RUNBOOK.md).\nFor larger milestone releases, add any version-specific acceptance matrix to\nthe existing release packet before tagging; use it for provider routes, feature\ngates, GUI/runtime smoke, remote-workbench decisions, and credit hygiene that the\ngeneric checklist does not enumerate. Record its candidate SHA, owners, local\ncheck results, hosted run URLs, artifact inventory, install/provider receipts,\nknown limitations and publication approval. These proofs are separate.\n\n## 0. Reconcile the canonical checkout\n\n- [ ] Inspect the branch, status, upstream and alternate checkouts before editing:\n ```bash\n git branch --show-current\n git status --short --branch\n git log -5 --oneline\n git worktree list\n git fetch origin main\n git log --left-right --oneline main...origin/main\n ```\n- [ ] The canonical checkout is on `main`. Recover stranded work only after\n preserving dirty/untracked files and comparing commits with current\n `origin/main`. Keep a recoverable backup and unresolved inventory; do not\n reset away work, stash it indefinitely or create another development lane.\n- [ ] Partition files among active writers. Check status before staging and\n stage only owned paths. Historical branches/checkouts are inventoried;\n deleting them requires explicit Hunter approval even if a helper calls\n their tips safe to delete.\n\n## 1. CHANGELOG entry exists for the version\n\n- [ ] `CHANGELOG.md` has a `## [X.Y.Z] - YYYY-MM-DD` heading at the top\n- [ ] The entry credits every external contributor, harvested PR author,\n linked issue reporter, reproduction/log provider, reviewer, and\n verification helper whose work materially shaped this version. Get the\n commit list with:\n ```\n git log vPREV..HEAD --no-merges --format=\"%h %an <%ae> %s\" \\\n | grep -v '<your-email@…>'\n ```\n For each contributor, link both their display name and (when known)\n `@github-handle`. Then inspect linked issues and harvested PRs so\n reporters/helpers are not lost just because they did not author commits.\n Keep `docs/CONTRIBUTORS.md` and `web/lib/release-credits.ts` consistent.\n- [ ] The entry uses the Keep a Changelog headers — `Added`, `Changed`,\n `Fixed`, `Security`, `Removed`, `Deprecated`. Add `Known issues` only\n if there is something material the user must work around.\n- [ ] The entry mentions all referenced issue/PR numbers as `#NNNN` so the\n auto-linker on GitHub picks them up.\n- [ ] Run `scripts/sync-changelog.sh` to regenerate `crates/tui/CHANGELOG.md`\n (the recent-releases slice embedded in the binary for `/change`). Do\n not edit that file by hand, and do not copy the full root changelog\n into it — older entries live in `docs/CHANGELOG_ARCHIVE.md`.\n- [ ] Run `scripts/release/check-feature-release-notes.sh vPREV HEAD`. Every\n issue-linked `feat` commit must leave a receipt in `CHANGELOG.md` or the\n archive; the Version drift CI gate runs the same check with full history.\n\n## 2. Version pins are in sync\n\n- [ ] Use `./scripts/release/prepare-release.sh X.Y.Z` when version pins or\n generated sources need preparation. Reuse a valid preparation receipt\n when those sources are already current. The helper bumps the\n workspace version, every per-crate dependency pin, the npm wrapper\n (`version` + `codewhaleBinaryVersion`), Runtime SDK, VS Code extension\n and lock, remote-smoke default, public source-candidate facts, and README\n install-tag examples; it refreshes the Cargo/npm locks, regenerates\n `crates/tui/CHANGELOG.md` and `web/lib/facts.generated.ts`, and ends\n by running the version and OHOS gates. Write the CHANGELOG entry\n **before** running it. The helper is safe to rerun at the requested\n workspace version; it skips replacements but refreshes both generated\n files and reruns the gates.\n- [ ] `npm/deepseek-tui/package.json` remains private/compatibility-only and\n is **not** bumped or published.\n- [ ] `./scripts/release/check-versions.sh` reports\n `Version state OK: workspace=X.Y.Z, npm=X.Y.Z, npm-binary=X.Y.Z, lockfile in sync.`\n- [ ] `./scripts/release/check-ohos-deps.sh` reports that the OpenHarmony\n Windows linker keeps the target/sysroot flags, the target enables the\n `rquickjs-sys` bindgen edge, and its graph does not pull the unsupporLine truncated
}
]
},