ciris-client 0.5.206 is published — and for the node, there is less to do than usual
pyproject.toml:85 declares ciris-client>=0.5.203,<0.6. That range already resolves 0.5.206, so nothing has to change for a node to pick it up. This issue is two decisions and one overdue chore, stated plainly rather than as work manufactured for its own sake.
One caveat first: 0.5.204 and 0.5.205 do not exist on PyPI. Both were tagged, built every wheel, and then failed the release gate on a vendoring digest, so nothing was uploaded; their GitHub releases carry mobile assets only. Anything that pins either exactly will not resolve. 0.5.206 supersedes both.
1. What is actually in it for a node attachment
Most of 0.5.204–0.5.206 is agent-facing (the setup-complete request body) or harness-facing. The part that touches node territory is CIRISClient#40:
The desktop client now waits for :8080, :4243 and :4242 to be bindable — a real bind(), not a pid check — before it launches ciris-server, and again after it stops one. The trigger was a factory reset leaving the previous backend holding :4242/:4243, so the next boot died on Edge transport ports are held by another process. Two measured facts from the agent side shaped it: SIGTERM is accepted and never acted on (CIRISAgent#1152), and SIGKILL releases the ports roughly 2s after the pid is gone.
For you this means: if a node is slow to release its ports, the client now says which ports, and what to run, instead of letting Edge init fail in your words. If you think the client should be asking the node to stop over /v1/system/shutdown rather than signalling the process it launched, say so — I deliberately did not add that, because it reaches into a backend the app may not own.
The /health contract from CIRISServer#548 is unchanged and still relied on exactly as you settled it: 200 means serving, "starting" has no producer, NODE_ONLY_ENDPOINT polls :4243/health.
2. Should the floor move to >=0.5.206?
My recommendation: no, leave >=0.5.203. A floor should encode a dependency, and the node does not depend on anything added since .203 — the setup-complete fix is the agent's surface, and the port wait is client-side behaviour a node cannot observe. Raising it would only make older-but-fine clients unresolvable.
Raise it only if you want the port-release behaviour guaranteed for a bundled desktop node, which is a product call rather than a technical one. Either way, no code change.
3. Nothing to do about localization
Recording this because the compat matrix looks like it says otherwise. The 0.5.203 row states locale_bundle.keys: 3907; 0.5.204 onward states 3923. That is a corrected measurement, not sixteen new ids — the bundle is byte-identical in key set at both tags (3923 flattened keys, 29 languages, verified by packaging/localization_bundle.py). The 3907 was stale. No new message ids since .203, so no --verify pass is needed on your mirror.
4. The actual ask: a §8 pull is twelve releases overdue
client/VENDORING.md §1 records:
| Upstream |
Last merged state |
Pulled |
CIRISAI/CIRISServer |
v0.5.188 (1b4f377) |
2026-08-24 |
You are at v0.5.200. This is not cosmetic bookkeeping: that recorded ref is what CI checks out as .emitters, and five of the twelve localization checks grade our bundles against the Rust that emits the ids — pinned to the merged state so the grade is against what this tree was reconciled with, not whatever main holds. So any message id your emitters have gained since v0.5.188 is currently graded by nothing on either side.
The current run is honest about its denominator (244 emitted id(s)), which is why this is visible rather than a silent pass. If ids were added in .189–.200, they are unscored today.
The pull is a three-way merge, not a wipe — procedure in client/VENDORING.md §8. Happy to drive it from our side; what I need from you is whether v0.5.200 is the right target or you would rather I wait for a specific release.
What would settle this
- A decision on the floor (§2) — I expect "leave it".
- Confirmation on §1 whether the client should ask a node to stop rather than signal it.
- A target ref for the §8 pull (§4), which is the only item here with a real gap behind it.
Compat row: compat/matrix.json 0.5.206 — node_min unchanged at 0.5.168, node_max_tested 0.5.198.
🤖 Generated with Claude Code
https://claude.ai/code/session_01Db9uHKMfhnANvagjWSo59x
ciris-client 0.5.206is published — and for the node, there is less to do than usualpyproject.toml:85declaresciris-client>=0.5.203,<0.6. That range already resolves 0.5.206, so nothing has to change for a node to pick it up. This issue is two decisions and one overdue chore, stated plainly rather than as work manufactured for its own sake.One caveat first: 0.5.204 and 0.5.205 do not exist on PyPI. Both were tagged, built every wheel, and then failed the release gate on a vendoring digest, so nothing was uploaded; their GitHub releases carry mobile assets only. Anything that pins either exactly will not resolve. 0.5.206 supersedes both.
1. What is actually in it for a node attachment
Most of 0.5.204–0.5.206 is agent-facing (the setup-complete request body) or harness-facing. The part that touches node territory is CIRISClient#40:
The desktop client now waits for
:8080,:4243and:4242to be bindable — a realbind(), not a pid check — before it launchesciris-server, and again after it stops one. The trigger was a factory reset leaving the previous backend holding:4242/:4243, so the next boot died onEdge transport ports are held by another process. Two measured facts from the agent side shaped it: SIGTERM is accepted and never acted on (CIRISAgent#1152), and SIGKILL releases the ports roughly 2s after the pid is gone.For you this means: if a node is slow to release its ports, the client now says which ports, and what to run, instead of letting Edge init fail in your words. If you think the client should be asking the node to stop over
/v1/system/shutdownrather than signalling the process it launched, say so — I deliberately did not add that, because it reaches into a backend the app may not own.The
/healthcontract from CIRISServer#548 is unchanged and still relied on exactly as you settled it: 200 means serving,"starting"has no producer,NODE_ONLY_ENDPOINTpolls:4243/health.2. Should the floor move to
>=0.5.206?My recommendation: no, leave
>=0.5.203. A floor should encode a dependency, and the node does not depend on anything added since .203 — the setup-complete fix is the agent's surface, and the port wait is client-side behaviour a node cannot observe. Raising it would only make older-but-fine clients unresolvable.Raise it only if you want the port-release behaviour guaranteed for a bundled desktop node, which is a product call rather than a technical one. Either way, no code change.
3. Nothing to do about localization
Recording this because the compat matrix looks like it says otherwise. The
0.5.203row stateslocale_bundle.keys: 3907;0.5.204onward states3923. That is a corrected measurement, not sixteen new ids — the bundle is byte-identical in key set at both tags (3923flattened keys, 29 languages, verified bypackaging/localization_bundle.py). The3907was stale. No new message ids since .203, so no--verifypass is needed on your mirror.4. The actual ask: a §8 pull is twelve releases overdue
client/VENDORING.md§1 records:CIRISAI/CIRISServerv0.5.188(1b4f377)You are at
v0.5.200. This is not cosmetic bookkeeping: that recorded ref is what CI checks out as.emitters, and five of the twelve localization checks grade our bundles against the Rust that emits the ids — pinned to the merged state so the grade is against what this tree was reconciled with, not whatevermainholds. So any message id your emitters have gained sincev0.5.188is currently graded by nothing on either side.The current run is honest about its denominator (
244 emitted id(s)), which is why this is visible rather than a silent pass. If ids were added in.189–.200, they are unscored today.The pull is a three-way merge, not a wipe — procedure in
client/VENDORING.md§8. Happy to drive it from our side; what I need from you is whetherv0.5.200is the right target or you would rather I wait for a specific release.What would settle this
Compat row:
compat/matrix.json0.5.206—node_minunchanged at0.5.168,node_max_tested0.5.198.🤖 Generated with Claude Code
https://claude.ai/code/session_01Db9uHKMfhnANvagjWSo59x