rename: server → node (full identity rename) - #93
Merged
Conversation
The repo, Cargo package, binary, Docker image, and all Rust modules /
types previously named "server" become "node" — reframing the codebase
to match its actual role: a self-hostable Bitcoin/zkCoins node that
operators run for full transaction privacy ("run your own node"). The
old "server" name collided with DFXServer/server and falsely framed
the project as a centralised service.
Scope:
- Cargo: workspace member + package "server" → "node"
- Directory: server/ → node/ (git rename detection preserved)
- Source files: server.rs → router.rs, server_runtime.rs → runtime.rs,
account_server.rs → account_node.rs (+ *_tests siblings)
- Rust types: AccountServer → AccountNode, LoadAccountServerError →
LoadAccountNodeError, start_rest_server() → start_rest_node()
- Module paths: crate::server → crate::router, crate::server_runtime
→ crate::runtime, crate::account_server → crate::account_node
- Binary: /usr/local/bin/zkcoins-server → zkcoins-node
- API response: /api/info "service" field "zkcoins-server" → "zkcoins-node"
- Dockerfile: -p server → -p node, ENTRYPOINT zkcoins-node
- CI workflows: -p server → -p node, image tags zkcoin/server →
zkcoin/node (beta + latest + buildcache), DEPLOY_CMD updates
- Docs: README, CONTRIBUTING, ROADMAP, SPEC, BRIDGE_MVP, MULTI_ASSET,
ARKADE_INTEGRATION, MIGRATION_RESEARCH — titles, URLs, image refs,
module-path examples
- migrations: header comment "server state-layer" → "node state-layer"
Verification: cargo check, cargo check --tests, cargo fmt, cargo
clippy, cargo clippy --all-features all green locally.
Coordinated changes required on merge (separate PRs/pushes):
- DFXServer/server: bin/deploy.sh case branches, docker-compose service
/ container_name / image / exec, READMEs
- zk-coins/app, zk-coins/docs: markdown link updates
- Docker Hub: deprecation notice on zkcoin/server
TaprootFreak
marked this pull request as ready for review
May 24, 2026 21:17
Previous commit captured the directory + file renames but missed all the content edits because git mv only stages renames, not subsequent file modifications. This commit ships every edit listed in the previous commit message body (Cargo identifiers, Rust types/modules, Dockerfile, CI workflows, docs). cargo check / clippy / fmt all green locally before push.
… runtime.rs The 100% coverage gate was failing on runtime.rs because the hardcoded ignore-regex still listed `server_runtime\.rs` — which no longer matches anything after the file rename, so runtime.rs slipped into the measured scope. Replace with `runtime\.rs`; covers both runtime.rs and scanner_runtime.rs (already in the ignore list, so a double match is a no-op).
TaprootFreak
added a commit
that referenced
this pull request
May 25, 2026
) The rename PR (#93) edited two comment lines in node/migrations/0001_initial.sql ("zkCoins server state-layer" → "zkCoins node state-layer" and "server bootstrap" → "node bootstrap"). sqlx::migrate! hashes the entire file content, so the hash drifted — on startup the server panics with `Migrate(VersionMismatch(1))` because the `_sqlx_migrations` row on PRD/DEV still carries the pre-rename hash. Reverting the two comments restores the original hash and the migration is considered already-applied as intended. Cosmetic prose updates to migration files are out of bounds; the historical accuracy ("server" was the name when the schema landed) is the correct value anyway.
TaprootFreak
added a commit
that referenced
this pull request
May 25, 2026
Coverage Gate audit identified publisher_health_handler (router.rs)
as uncovered by unit tests — only api_remote E2E exercises it, and
api_remote is explicitly excluded from the coverage gate via
`-E 'not binary(api_remote)'`.
Add two unit tests in router_tests.rs mirroring the /health/ready
pattern:
- 200 Ok arm with wiremocked Esplora returning two UTXOs
- 503 Err arm via mint_test_state's unreachable Esplora URL
Refactor publisher_health_handler to derive the Taproot address from
PUBLISHER_KEY once at startup (lazy_static PUBLISHER_ADDRESS in lib.rs),
removing the SecretKey::from_str / Address::p2tr from the request path.
Side benefits:
- Handler is now pure I/O (Ok/Err on get_publisher_utxo only)
- One fewer panic-able branch per request
- Coverage Gate reaches 100% with the two new tests
Also:
- Fix stale "server::create_router" comment in runtime_tests.rs
(introduced by the test-quality commit, before PR #93's rename
sweep landed)
- Update BOOTSTRAP_MINTING_BALANCE doc-comment to describe the
bound semantic (not the strict equality that the second commit
of this branch relaxed)
- Defensive `command -v jq` install in deploy-dev.yaml preflight
TaprootFreak
added a commit
that referenced
this pull request
May 25, 2026
Coverage Gate audit identified publisher_health_handler (router.rs)
as uncovered by unit tests — only api_remote E2E exercises it, and
api_remote is explicitly excluded from the coverage gate via
`-E 'not binary(api_remote)'`.
Add two unit tests in router_tests.rs mirroring the /health/ready
pattern:
- 200 Ok arm with wiremocked Esplora returning two UTXOs
- 503 Err arm via mint_test_state's unreachable Esplora URL
Refactor publisher_health_handler to derive the Taproot address from
PUBLISHER_KEY once at startup (lazy_static PUBLISHER_ADDRESS in lib.rs),
removing the SecretKey::from_str / Address::p2tr from the request path.
Side benefits:
- Handler is now pure I/O (Ok/Err on get_publisher_utxo only)
- One fewer panic-able branch per request
- Coverage Gate reaches 100% with the two new tests
Also:
- Fix stale "server::create_router" comment in runtime_tests.rs
(introduced by the test-quality commit, before PR #93's rename
sweep landed)
- Update BOOTSTRAP_MINTING_BALANCE doc-comment to describe the
bound semantic (not the strict equality that the second commit
of this branch relaxed)
- Defensive `command -v jq` install in deploy-dev.yaml preflight
This was referenced May 25, 2026
TaprootFreak
added a commit
that referenced
this pull request
May 25, 2026
* test: harden suite — remove dev_skip masking + add publisher preflight
The api_remote suite reported "33 passed" while critical paths were
silently skipped via dev_skip!() on 5xx errors and 120-s retry loops
on scanner-lag 422s. The Coverage Gate and the deploy-dev API E2E
became a green stamp instead of a real signal — an empty publisher
wallet caused every mint to 503, every 5xx was masked as "ok", and CI
stayed green on a broken DEV.
Tier 1 — must-fix:
- Remove all dev_skip!() on is_server_error() (4 sites)
- Remove dev_skip!() on /health/ready, balance-not-observed, and
/api/username/claim 503
- Remove SEND_RETRY_DEADLINE retry loops on "Unable to get
merkle/mmr proofs" 422 — scanner is event-driven post-#87, the
stopgaps are obsolete. Replace with poll_until_balance before the
send op (15-s ceiling).
- Add fresh-state assertion to happy-path roundtrips
- feature_skip!() becomes a hard panic when CI=true env is set
- mint_handler_concurrent_mint_during_proof_returns_503 now
synchronizes via a #[cfg(test)] tokio::sync::Notify instead of a
200-ms sleep
- commit_with_valid_signature_fails_broadcast_returns_503 now
wiremocks Esplora and asserts exactly 503 (no more accept-either)
- fetch_capabilities .expect() instead of .unwrap_or(false) — a
missing capabilities field is a contract regression
- New /health/publisher endpoint exposes the publisher wallet's
UTXO count + total sats
- New deploy-dev preflight step probes /health/publisher before
the API E2E job runs — empty wallet -> job fails with a clear
"top up publisher" message
Tier 2 — same-PR quality:
- Value-bearing assertions replace .is_some()/.is_ok() shape checks
in api_remote, server_tests, state_tests
- Hash-byte-length + non-zero assertions on send response payloads
- Concrete bounds on LNURLp min/maxSendable
- tokio::time::sleep(60s) in test handlers replaced with
std::future::pending::<()>().await
- Ad-hoc tempdir cleanup replaced with tempfile::tempdir()
- Delete proof_id_one_returns_200_or_404 — accept-either status
was tautological
Tier 3 — documentation:
- Comment block on lock-poisoning tests' nextest isolation
requirement
The three TODO comments in account_server.rs (lines 147, 170, 416)
are tracked separately and not addressed here.
* test: relax fresh-state assertion to upper-bound (push-trigger safe)
The strict `assert_minting_balance_is_bootstrap` helper would
tripwire CI on every develop push after a manual reset: the
deploy-dev workflow only runs `reset-zkcoins-server` on explicit
workflow_dispatch with reset_state=true, not on the default push
trigger. After this PR's first run, the minting balance drops to
`bootstrap - 2*MINT_AMOUNT` and the strict equality fails forever.
Replace with `assert_minting_balance_in_bounds`: upper-bound on
BOOTSTRAP_MINTING_BALANCE (catches unauthorized re-seed bugs) plus
a non-zero lower bound (catches unexpected wipe). Both happy-path
tests now use the same helper.
Also drops the redundant second `poll_until_balance` call in
`send_commit_roundtrip_moves_balance` (the prior `poll_balance_at_least`
already covered it) and documents the deliberately-deferred B5
proof_id pin in server_tests.rs (proof store ID grows across DB
lifetime, same constraint as the minting balance bound).
* test: cover publisher_health_handler unit tests + polish
Coverage Gate audit identified publisher_health_handler (router.rs)
as uncovered by unit tests — only api_remote E2E exercises it, and
api_remote is explicitly excluded from the coverage gate via
`-E 'not binary(api_remote)'`.
Add two unit tests in router_tests.rs mirroring the /health/ready
pattern:
- 200 Ok arm with wiremocked Esplora returning two UTXOs
- 503 Err arm via mint_test_state's unreachable Esplora URL
Refactor publisher_health_handler to derive the Taproot address from
PUBLISHER_KEY once at startup (lazy_static PUBLISHER_ADDRESS in lib.rs),
removing the SecretKey::from_str / Address::p2tr from the request path.
Side benefits:
- Handler is now pure I/O (Ok/Err on get_publisher_utxo only)
- One fewer panic-able branch per request
- Coverage Gate reaches 100% with the two new tests
Also:
- Fix stale "server::create_router" comment in runtime_tests.rs
(introduced by the test-quality commit, before PR #93's rename
sweep landed)
- Update BOOTSTRAP_MINTING_BALANCE doc-comment to describe the
bound semantic (not the strict equality that the second commit
of this branch relaxed)
- Defensive `command -v jq` install in deploy-dev.yaml preflight
TaprootFreak
added a commit
that referenced
this pull request
May 25, 2026
* docs: fix residual server → node references missed in #93 PR #93 (rename server → node) touched code + most docs, but a handful of identifier-style references in README.md and the CI-runner setup guide slipped through. None were runtime-critical — the build, deploy, and runtime paths were already on the new names — but the docs were out of sync with reality, and the ci-runner bootstrap URLs pointed at the redirect-only legacy repo. Fixes: - README.md - Cargo invocations: -p server → -p node (build, run, coverage) - Type refs: AccountServer:: → AccountNode:: - File refs: server.rs:: → router.rs::, server_runtime.rs → runtime.rs - Path refs: server/src/ → node/src/, server/migrations/ → node/migrations/ - Project tree: server/ branch → node/ branch (plus an explicit runtime.rs entry that was missing entirely) - scripts/ci-runner/README.md - All zk-coins/server URLs → zk-coins/node (curl + gh api) - Runner dir: ~/actions-runner-zkcoins-server → ~/actions-runner-zkcoins-node - LaunchAgent label: actions.runner.zk-coins-server → actions.runner.zk-coins-node - Workspace cache path: _work/server/server → _work/node/node - program-plonky2/src/circuit/main.rs - One inline comment account_server::send_coins → account_node::send_coins * fix: residual server → node references in hooks, CI, and docs (post-audit pass) Second-pass post-audit found more drift than the first pass caught: BREAKING fixes: - .githooks/pre-push lines 28–32: cargo clippy -p server → -p node (would fail on every developer push with "package server not found") - .github/workflows/ci.yaml line 139: the "forbid polling patterns" grep was scanning server/src/{scanner,publisher}.rs paths that no longer exist; combined with `|| true` it would silently pass even if polling was reintroduced into the event-driven hot paths Documentation drift fixes (all flagged by parallel audits): - README.md: `cargo test -p server` examples → -p node; Features-table coverage labels "(server)" → "(router)" (the module is now router.rs) - CONTRIBUTING.md: 7 references to `server/src/...` paths + `cargo test -p server db` invocation - SPEC.md, MIGRATION_RESEARCH.md, ROADMAP.md, BRIDGE_MVP.md, BITVM_BRIDGE.md, MULTI_ASSET.md, LIGHTNING_ATOMIC_SWAP.md: all `server/src/`, `server/migrations/`, `server/tests/` path refs switched to `node/...`; `start_rest_server` symbol → start_rest_node ZERO functional code touched. Verified residuals = 0 via rg -E 'cargo (clippy|build|test) -p server|start_rest_server|server/(src|migrations|tests)/' across hooks/workflows/docs. * fix: more residual server → node refs (third-pass audit) Third-pass audit found three more residuals: BREAKING: - README.md:54,106,243 — `cargo llvm-cov -p server` / `cargo build --release -p server` examples in the contributing/ building/cheatsheet sections. Developers copy-pasting these would hit "package `server` not found" immediately. SEMANTIC DRIFT: - node/src/main.rs:35,120 — constant ACCOUNT_SERVER_ADDR. Local scope, but undermines the rename if left in the codebase. DOCUMENTATION DRIFT: - node/src/lib.rs:5 — doc-comment path reference `server/tests/api_remote.rs` → `node/tests/api_remote.rs`. cargo check -p node green after fix. * fix: more residual server → node refs (fourth-pass audit) Fourth audit pass found three more residuals — all in user-facing documentation that prior passes missed because the search patterns weren't broad enough: BREAKING: - CONTRIBUTING.md:230 — Quick Start `cd server` → `cd node` - CONTRIBUTING.md:231 — Quick Start `cargo run -p server` → -p node - CONTRIBUTING.md:255 — `cd server` in the testing section Developers following the Quick Start would hit "no such directory" and "package server not found" immediately. SEMANTIC DRIFT: - CONTRIBUTING.md:395 — Naming-convention example `ACCOUNT_SERVER_ADDR` → ACCOUNT_NODE_ADDR (matches the actual constant in node/src/main.rs) - CONTRIBUTING.md:532 — Sample log line `Loaded AccountServer from Postgres` → AccountNode (matches the actual log emitted by the current code) - .gitignore:5 — `!server/minting_secret.bin` → `!node/minting_secret.bin` (the binary is gitignored, but this allow-rule referenced the old path) ROADMAP.md and program-plonky2/*.md retain `zk-coins/server` / `-p server` references as HISTORICAL context (commit descriptions dated pre-rename); intentionally not changed.
TaprootFreak
added a commit
that referenced
this pull request
May 25, 2026
The Rust type rename AccountServer → AccountNode (PR #93) left the test files using `let mut server = AccountNode::new(...)` and `server.method()` throughout. Stylistically idiomatic but inconsistent with the rest of the rename — fixed in this commit: - node/src/account_node.rs: 23 occurrences (`fresh_node` helper + tests) - node/src/account_node_tests.rs: 67+ occurrences (every test) + 2 assertion-message strings ("in server and program" → "in node...") - node/src/router_tests.rs: 6 occurrences Plus one missed identifier ref in program-plonky2/CONTRIBUTING.md:185 (`-p server -p shared` → `-p node -p shared`). Verified: cargo check -p node --tests + cargo clippy -p node --tests both pass. No logic change, pure variable rename.
TaprootFreak
added a commit
that referenced
this pull request
May 25, 2026
…101) * docs(program-plonky2): update server → node refs in migration notes These 5 files document the Plonky2-migration sub-package's history. Prior audits flagged them as "historical context, OK to keep as-is" — but that classification was wrong: they're active contributor docs (CONTRIBUTING.md says "Fresh contributor? Read this first"), and the code refs they contain (`account_server.rs`, `server.rs`, `AccountServer::`, etc.) point at files that physically no longer exist after PR #93. A new reader following one of these refs hits "file not found" — that's broken docs, not historical accuracy. Updates applied via perl one-shot: - GitHub URLs: zk-coins/server → zk-coins/node (GitHub redirects worked, but textual consistency was off) - File refs: account_server.rs → account_node.rs, server.rs → router.rs, server_runtime.rs → runtime.rs, account_server_tests.rs → account_node_tests.rs, server_tests.rs → router_tests.rs - Type refs: AccountServer → AccountNode, LoadAccountServerError → LoadAccountNodeError - Module paths: account_server::, server_runtime::, server.rs:: → account_node::, runtime::, router.rs:: - Cargo: -p server → -p node (run/test/build/llvm-cov) - Path refs: server/src/, server/migrations/, server/tests/ → node/... - Function: start_rest_server → start_rest_node Counts: CONTRIBUTING (6 lines), SESSION_STATE (38), STEP7_PREP (36), STAGE_5D_NEXT_4_DESIGN (2), STEP4_REVIEW (2). All swaps preserve historical semantics — the PR-#17 etc. event descriptions stay factually correct since the PR numbers themselves don't change; we just spell the repo by its current canonical name. * fix: final residual sweep — ROADMAP commit-narrative + api_remote.rs reset cmd ROADMAP.md:75 — historical commit-narrative for dac0179. Prior pass caught lines 73/76/77 in the same file (already renamed account_node / router_tests etc.) but missed line 75's '-p server' / 'Plonky2 server'. Renamed for consistency with the rest of the doc. node/tests/api_remote.rs:904/969/1319 — three test-comment refs to the old SSH command 'reset-zkcoins-server'. The actual command on both dfxdev and dfxprd is now 'reset-zkcoins-node' (per the rename in DFXServer/server bin/deploy.sh). Comments updated to match. * fix(tests): rename remaining 'server' local-var refs to 'node' The Rust type rename AccountServer → AccountNode (PR #93) left the test files using `let mut server = AccountNode::new(...)` and `server.method()` throughout. Stylistically idiomatic but inconsistent with the rest of the rename — fixed in this commit: - node/src/account_node.rs: 23 occurrences (`fresh_node` helper + tests) - node/src/account_node_tests.rs: 67+ occurrences (every test) + 2 assertion-message strings ("in server and program" → "in node...") - node/src/router_tests.rs: 6 occurrences Plus one missed identifier ref in program-plonky2/CONTRIBUTING.md:185 (`-p server -p shared` → `-p node -p shared`). Verified: cargo check -p node --tests + cargo clippy -p node --tests both pass. No logic change, pure variable rename. * style: cargo fmt after server -> node var rename Shorter variable name (3 chars vs 6) lets several method chains collapse onto one line per rustfmt default config. Pure formatting.
TaprootFreak
added a commit
that referenced
this pull request
May 25, 2026
Four small follow-ups identified by the pre-CI audit, none blocking but all worth landing: 1. router.rs: switch `&*PUBLISHER_ADDRESS` deref to `.clone()` — eliminates a llvm-cov region-tracking edge case on the new handler's first line (98% safe either way; this is belt-and- braces). Address::clone is cheap. 2. router_tests.rs: wrap both await points of `mint_handler_concurrent_mint_during_proof_returns_503` in `tokio::time::timeout` (30 s + 60 s). Prevents a future regression in `mint_handler` phase 2 from hanging the 120-min CI job budget. 3. api_remote.rs: replace stale `reset-zkcoins-server` comment references with the post-rename `reset-zkcoins-node`. Cosmetic; matches the host-side dispatcher command name updated in DFXServer/server commit f74ec4a. 4. ci.yaml: the polling-pattern lint step (issue #84 guard) targets paths under `server/src/` that no longer exist after PR #93's rename to `node/src/`. The grep returned empty vacuously, which means the lint has been silently dead for 24 h. Update paths. Note: the audit also flagged the stale `server::create_router` comment in runtime_tests.rs, but that fix already landed in 687f412 on chore/test-quality-overhaul. Stacked on top of PR #94 (chore/test-quality-overhaul) per the "no force-push during running CI" project convention.
TaprootFreak
added a commit
that referenced
this pull request
May 25, 2026
Four small follow-ups identified by the pre-CI audit, none blocking but all worth landing: 1. router.rs: switch `&*PUBLISHER_ADDRESS` deref to `.clone()` — eliminates a llvm-cov region-tracking edge case on the new handler's first line (98% safe either way; this is belt-and- braces). Address::clone is cheap. 2. router_tests.rs: wrap both await points of `mint_handler_concurrent_mint_during_proof_returns_503` in `tokio::time::timeout` (30 s + 60 s). Prevents a future regression in `mint_handler` phase 2 from hanging the 120-min CI job budget. 3. api_remote.rs: replace stale `reset-zkcoins-server` comment references with the post-rename `reset-zkcoins-node`. Cosmetic; matches the host-side dispatcher command name updated in DFXServer/server commit f74ec4a. 4. ci.yaml: the polling-pattern lint step (issue #84 guard) targets paths under `server/src/` that no longer exist after PR #93's rename to `node/src/`. The grep returned empty vacuously, which means the lint has been silently dead for 24 h. Update paths. Note: the audit also flagged the stale `server::create_router` comment in runtime_tests.rs, but that fix already landed in 687f412 on chore/test-quality-overhaul. Stacked on top of PR #94 (chore/test-quality-overhaul) per the "no force-push during running CI" project convention.
TaprootFreak
added a commit
that referenced
this pull request
May 25, 2026
Four small follow-ups identified by the pre-CI audit, none blocking but all worth landing: 1. router.rs: switch `&*PUBLISHER_ADDRESS` deref to `.clone()` — eliminates a llvm-cov region-tracking edge case on the new handler's first line (98% safe either way; this is belt-and- braces). Address::clone is cheap. 2. router_tests.rs: wrap both await points of `mint_handler_concurrent_mint_during_proof_returns_503` in `tokio::time::timeout` (30 s + 60 s). Prevents a future regression in `mint_handler` phase 2 from hanging the 120-min CI job budget. 3. api_remote.rs: replace stale `reset-zkcoins-server` comment references with the post-rename `reset-zkcoins-node`. Cosmetic; matches the host-side dispatcher command name updated in DFXServer/server commit f74ec4a. 4. ci.yaml: the polling-pattern lint step (issue #84 guard) targets paths under `server/src/` that no longer exist after PR #93's rename to `node/src/`. The grep returned empty vacuously, which means the lint has been silently dead for 24 h. Update paths. Note: the audit also flagged the stale `server::create_router` comment in runtime_tests.rs, but that fix already landed in 687f412 on chore/test-quality-overhaul. Stacked on top of PR #94 (chore/test-quality-overhaul) per the "no force-push during running CI" project convention.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
Two problems with the old name:
DFXServer/server(the infra monorepo). Every mention of "the server" was ambiguous.serverframed it as a centralised service, contrary to the project's actual model.What changed
zk-coins/server→zk-coins/node(already renamed; redirects in place)zkcoin/server:{beta,latest,buildcache}→zkcoin/node:...server→nodeserver/→node//usr/local/bin/zkcoins-server→zkcoins-nodeserver.rs→router.rs,server_runtime.rs→runtime.rs,account_server.rs→account_node.rs(+*_testssiblings)AccountServer→AccountNode,LoadAccountServerError→LoadAccountNodeError,start_rest_server()→start_rest_node()crate::server→crate::router,crate::server_runtime→crate::runtime,crate::account_server→crate::account_node/api/infoservicefield:"zkcoins-server"→"zkcoins-node"What did NOT change
api.zkcoins.app+dev-api.zkcoins.appstay — no client breakage.zkcoin(singular, matches existingzkcoin/app).zkcoins_postgres-data+zkcoins_server-dataretained for state continuity.Local verification
cargo check -p node✅cargo check -p node --tests✅cargo fmt --check✅cargo clippy -p node --tests✅ (no warnings)cargo clippy -p node --tests --all-features✅ (no warnings)Coordinated follow-ups (separate PRs / direct pushes)
bin/deploy.shcase branches (zkcoins-server)→zkcoins-node),reset-zkcoins-server)→reset-zkcoins-node)), docker-compose service / container_name / image / entrypoint exec, READMEs. Required before this PR's Deploy DEV workflow can succeed — the restricted-shelldeploy.shon the host will rejectzkcoins-nodeuntil updated.zk-coins/server→zk-coins/node— GitHub redirects make this non-urgent but worth aligning).zkcoin/server(last release tag, redirect users tozkcoin/node).