Skip to content

vms-0425: rejoin — sub-question settled + CM JOIN gate bisected (spec §4(O.24)) - #314

Merged
baron-3dl merged 1 commit into
mainfrom
vms-0425-rejoin-cm-join-transition
Aug 11, 2026
Merged

baron-3dl merged 1 commit into
mainfrom
vms-0425-rejoin-cm-join-transition

Conversation

@baron-3dl

Copy link
Copy Markdown
Contributor

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:

arm identity return incarnation member's CSB (SDA) XITDONE
0425Rf OVXR40/1975 — (first join) built 8796AE80member,selected 1
0425Rr OVXR40 default live (near-now) 8796AE80 DEALLOC → NEW 879DF540, 02040000 status_rcvd (non-member) 0
0425Ff OVXF40/1976 — (first join) built 879DEF00member,selected 1
0425Fr OVXF40 1-OCT-2026 879DEF00 DEALLOC → NEW 879DF2C0, Incarnation 11-AUG → 1-OCT, 02040000 status_rcvd (non-member) 0

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 reach 02040000 status_rcvd — the exact intermediate state a successful first join passes through — and both stall there, never reaching member,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 a SHOW 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):

step first join 0425Rf (XITDONE=1) return 0425Rr (XITDONE=0)
OVMX → coordinator op 0x02 (join request) sent sent (OVMX drives it on the return too)
coordinator → other member op 0x12 RELAY sent absent
coordinator → OVMX op 0x03 COMMIT sent → OVMX 0x81-responds absent (cm_responses=0)
what the coordinator does instead op 0x05 / op 0x06 → joined member↔member cat-0x06 reconcile excluding OVMX, then a transition ABORT

This bisects the frontier's either/or: it is not that OVMX omits op 0x02 (it drives it, correctly addressed — its own SCSD-I-CMCONFIG2 log 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=0x00000000 and leaves its VMS$VAXcluster VCs CONNSTUCK.)

What ships (no wire change, guard 8 — the first-join path is 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 VC ends CONNSTUCK on the return, so vaxcluster_open_reached under-reports). Log-only; kill-switch OVMX_NO_READMITMAP unchanged.
  • Live pass-post: with the refined daemon, scsd-0425Rr2.log reads coordinator verdict=JOIN-ABANDONED, non-coordinator NO-ENGAGE, SUMMARY join_abandoned=1 no_engage=1 (the old latch-first classifier read both NO-ENGAGE, masking the op02-driven fact).
  • fail-pre/pass-post unit case in tests/vmsscs/test_scsd_wire.c (test_scsd_wire green).
  • 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.

What this does NOT claim

XITDONE did not flip (0→0, as expected): this settles the sub-question and bisects the gate; it does not fix rejoin. Still a non-admission (never ADMITTED; 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

… §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
baron-3dl merged commit 070c31c into main Aug 11, 2026
52 of 53 checks passed
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant