vms-0425: rejoin — sub-question settled + CM JOIN gate bisected (spec §4(O.24)) - #314
Merged
Merged
Conversation
… §4(O.24)) §4(O.23) relocated the frontier to "reclaim succeeds, CM JOIN does not run" and left one open sub-question: its reclaim was shown with a blatantly-future incarnation pin (1-OCT-2026, for SDA day-resolution visibility). Does a REALISTIC near-now incarnation — what OVMX presents normally — also reclaim, or does the reclaim need a coarse delta (which would move the frontier to "make the member see a new incarnation")? Sub-question SETTLED (same-boot single-factor SDA bracket, vaxlab-1): a realistic return (0425Rr, OVXR40, default live incarnation) reclaims the member's CSB (8796AE80 -> 879DF540, fresh CSB at status_rcvd, non-member) IDENTICALLY to a future-pinned return (0425Fr, OVXF40, 1-OCT-2026: 879DEF00 -> 879DF2C0). Both stall at 02040000 status_rcvd and never reach member,selected; XITDONE=0. Only the SDA-displayed date differs. The reclaim needs no coarse delta — the frontier does NOT relocate; it stays at the CM JOIN transition. §4(O.22)'s "never reclaims" was a SHOW CLUSTER-string artifact. CM JOIN gate BISECTED (Rf-vs-Rr CM-frame wire diff, same identity/pod): on the first join OVMX sends op 0x02 -> coordinator RELAYS (op 0x12) + COMMITS (op 0x03) -> joined. On the return OVMX STILL sends op 0x02 (correctly addressed) but the coordinator sends no op 0x12 relay and no op 0x03 commit; it runs a member<->member cat-0x06 reconcile that excludes OVMX, then a transition ABORT. This bisects the frontier's either/or: NOT an OVMX op02 omission (OVMX drives it), NOT a silent member wait (the coordinator actively runs a different transition). Per Davis p.7-38 the coordinator IGNORES the join request when its admission tests fail and "no state transition occurs"; a first join passes them, a return does not. Relocated frontier: SDA on the COORDINATOR (the member OVMX sends op 0x02 to), across departure+return, to see why it declines an op02-driven ADD for a reclaimed identity it admits when fresh (residual CLUB nodemap / quorum-vote accounting?). Ships (no wire change, guard 8 — first-join path byte-unchanged): - READMITMAP verdict refinement: JOIN-ABANDONED (joiner_cfg2_sent && cm_responses ==0) split out of RECLAIMED-NOJOIN/NO-ENGAGE, naming the member OVMX actually DROVE the join request to (the coordinator) distinctly from one it only reached. Checked before the open latch (OVMX's own VMS$VAXcluster VC ends CONNSTUCK on the return, so the latch under-reports). Log-only, kill-switch OVMX_NO_READMITMAP unchanged. Live pass-post: scsd-0425Rr2.log reads coordinator JOIN-ABANDONED, non-coordinator NO-ENGAGE, SUMMARY join_abandoned=1 (old classifier read both NO-ENGAGE). - fail-pre/pass-post unit case in tests/vmsscs/test_scsd_wire.c. - docs/clean-room/tools/cmdiff.py: CM-frame (category/opcode) decoder. - spec §4(O.24) + design record docs/design-rejoin-cm-state-map.md §8. XITDONE did NOT flip (0->0, as expected): this SETTLES the sub-question and BISECTS the gate; it does not fix rejoin. VAXcluster Principles pp. 7-24/7-25/7-37/7-38/7-39 (page cites only, Rule 8). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
baron-3dl
added a commit
that referenced
this pull request
Aug 11, 2026
…in diagnostics) (#321) * vms-832: bump OVMX_PRODUCT_VERSION to V0.3-3 Third point release off tag 0.3-2, cut through the RE machinery (vms-a84). Payload: conversational boot (#301), DCL Phase 2 facade-kills (ASSIGN->real logical names #316, STOP->real sys$delprc #318, SET PASSWORD->real SYSUAF hash change #319), and rejoin isolation diagnostics (#314/#317/#320). No test hardcodes the version literal -- tests/libvms/test_identity.c and friends all compare against the OVMX_PRODUCT_VERSION macro, so no de-hardcoding was needed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * vms-832: generate V0.3-3 release notes (boot + DCL Phase 2 + rejoin diagnostics) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: alice <alice@workspace.local> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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.
What this settles
vms-944/§4(O.23) relocated the rejoin frontier to "reclaim succeeds, CM JOIN does not run" and left one open sub-question: its reclaim was demonstrated with a blatantly future incarnation pin (1-OCT-2026, chosen for SDA day-resolution visibility). Does a realistic near-now incarnation — what OVMX presents in normal operation — also trigger the reclaim, or is the reclaim an artifact of a coarse delta (which would move the frontier to "make the member see a new incarnation")?Sub-question SETTLED — realistic incarnation reclaims identically to the future pin
Same-boot single-factor SDA bracket on a freshly-booted
vaxlab-1, two brand-new identities, first-join op02 form held constant, VAX1 parked in SDA per arm:0425Rf8796AE80→member,selected0425Rr8796AE80DEALLOC → NEW879DF540,02040000 status_rcvd(non-member)0425Ff879DEF00→member,selected0425Fr879DEF00DEALLOC → NEW879DF2C0, Incarnation11-AUG → 1-OCT,02040000 status_rcvd(non-member)The realistic return (
Rr) and the future-pinned return (Fr) produce byte-identical CSB outcomes: both deallocate the residual CSB and rebuild a fresh one at a new address (Davis pp.7-24/7-25), both reach02040000 status_rcvd— the exact intermediate state a successful first join passes through — and both stall there, never reachingmember,selected. Only the SDA-displayed date differs. The reclaim needs no coarse delta; the frontier does NOT relocate — it stays at the CM JOIN transition. §4(O.22)'s "never reclaims" was aSHOW CLUSTER-string artifact.CM JOIN gate BISECTED on the wire — OVMX DRIVES op 0x02; the coordinator ABANDONS it
Rf-vs-Rr CM-frame wire diff (same identity/pod;
docs/clean-room/tools/cmdiff.py):0425Rf(XITDONE=1)0425Rr(XITDONE=0)cm_responses=0)This bisects the frontier's either/or: it is not that OVMX omits op 0x02 (it drives it, correctly addressed — its own
SCSD-I-CMCONFIG2log confirms), and not that the member waits silently (the coordinator actively runs a different transition). Per Davis p.7-38 the coordinator, on a join request, runs admission/quorum tests and "ignores the request … and no state transition occurs" when they fail; a first join passes them, a return (against a member that just reclaimed OVMX's CSB) does not. The gate is the coordinator ignoring an op02-driven ADD for a returning identity.Relocated frontier (next isolation)
SDA on the COORDINATOR (the member OVMX sends op 0x02 to), across departure+return, to see why it declines an op02-driven ADD for a reclaimed identity it admits when fresh — i.e. whether its CLUB nodemap / quorum-vote accounting still carries residual state for the departed OVMX so its p.7-38 tests fail. (A separate OVMX-side defect surfaced, not the gate: on the return OVMX re-drives its add-member burst with
remote_conid=0x00000000and leaves itsVMS$VAXclusterVCs CONNSTUCK.)What ships (no wire change, guard 8 — the first-join path is byte-unchanged)
JOIN-ABANDONED(joiner_cfg2_sent && cm_responses==0) split out ofRECLAIMED-NOJOIN/NO-ENGAGE, naming the member OVMX actually drove the join request to (the coordinator) distinctly from one it only reached. Checked before the open latch (OVMX's own VC ends CONNSTUCK on the return, sovaxcluster_open_reachedunder-reports). Log-only; kill-switchOVMX_NO_READMITMAPunchanged.scsd-0425Rr2.logreads coordinatorverdict=JOIN-ABANDONED, non-coordinatorNO-ENGAGE, SUMMARYjoin_abandoned=1 no_engage=1(the old latch-first classifier read bothNO-ENGAGE, masking the op02-driven fact).tests/vmsscs/test_scsd_wire.c(test_scsd_wiregreen).docs/clean-room/tools/cmdiff.py— CM-frame (category/opcode) decoder.docs/design-rejoin-cm-state-map.md§8.What this does NOT claim
XITDONEdid not flip (0→0, as expected): this settles the sub-question and bisects the gate; it does not fix rejoin. Still a non-admission (neverADMITTED; INV-6).Clean-room Rule 8: VAXcluster Principles pp.7-24/7-25/7-37/7-38/7-39 cited by page number only.
🤖 Generated with Claude Code