fix(cluster-manager): announce only persisted endorsement changes - #62
RecursiveIntell wants to merge 3 commits into
Conversation
Emit truststore change announcements only after an endorsement merge adds and persists a new endorsement. Keep idempotent re-pins, empty or duplicate merges, and failed writes silent, with component-level regression and race coverage. Signed-off-by: Josh Stevenson <j.stevenson.cs@gmail.com>
Signed-off-by: Josh Stevenson <j.stevenson.cs@gmail.com>
Verify callback read-back and disk reload for direct and identical-pin merges, including mixed and duplicate batches. Exercise replace failures through both entry points, preserve old disk and live state, and verify recovery without temporary residue. Add concurrent identical submissions and missing-target regression coverage. Signed-off-by: Josh Stevenson <j.stevenson.cs@gmail.com>
Reconciliation and validation updateRechecked this PR against NVIDIA What changed in this follow-upThe new commit is test-only; it preserves the existing runtime fix and the The tests now check the notification/persistence boundary rather than treating an in-memory read as disk-persistence evidence:
As a regression control, I ran the same test file against otherwise unchanged Fresh local validationValidation was executed on the pre-commit worktree whose three changed-path SHA-256 values match the blobs committed at Environment: Linux/amd64, Go From go test ./... -count=1 -timeout=180s -json
go test ./... -race -count=1 -timeout=180s -json
go test ./... -race -run TestTrustStore -count=50 -timeout=120s -json
go vet ./...All passed. The full module normal and race runs each executed 106 top-level tests with no failed or skipped test events. The repeated run includes the new concurrent regression; it is not a claim of universal race-freedom. Also passed:
GOFLAGS=-buildvcs=false go test ./... \
-run '^TestCluster(ManagerPairing|Fanout|Leave)$' \
-count=1 -timeout=180s -jsonAll three selected integration tests passed without skips. This covers pairing/removal, transitive membership propagation, and leave behavior; it is not a full cross-process-suite result. Broader gate remains openRepository-wide
These are local results bound to the stated source snapshot, not hosted-CI results. No hosted checks are currently reported for this PR, and maintainer review is still required. Windows/macOS execution, power-loss durability, live-engine testing, and deployment are not claimed. The change does not modify certificate/endorsement verification, admission authorization, pairing-PIN security, or mTLS policy. The original commits are retained, and the follow-up uses the same author with a matching DCO sign-off. This update does not merge the PR or change its draft state. The next gate is maintainer review of this focused fix and disposition of the broader baseline failure before treating the repository-wide validation gate as satisfied. |
|
Independent confirmation from a 9-node fleet (8× DGX Spark + 1 gateway box, all on PAIR 0.1.1 services): every node's Tracing it landed on the same line this PR fixes: in The fix here (announce only when an endorsement was actually persisted) matches what I would have written. +1 to landing it as a bug fix. |
Merge the reviewed three-path PAIR truststore correction into fork main. NVIDIA PR NVIDIA#62 remains untouched.
Summary
nvpair-cluster-managerfrom1.1.4to1.1.5.This is a notification/persistence-correctness fix in the truststore. It does not claim to strengthen cryptographic trust, pairing-PIN security, authorization, certificate validation, endorsement verification, or mTLS configuration.
Scope
Changed paths are limited to:
services/nvpair-cluster-manager/truststore.goservices/nvpair-cluster-manager/truststore_announce_test.goservices/versions.jsonValidation
Passed on commit
be34de2:The full
nvpair-cluster-managernormal suite and independently rerun race suite pass. The race run validates this module under Go's race instrumentation; the added tests are focused regression tests, not a claim of universal race-freedom or a separate concurrency-specific regression fixture.Broader validation status
The repository-wide
make testgate is not green:make teststops inservices/lmstudio-proxybecause the shallow candidate cannot obtain Go VCS status (error obtaining VCS status: exit status 128);GOFLAGS=-buildvcs=false make testreaches the LM Studio tests but failsTestHandleHTTP_RealSocketFlushDeadlinewithworkload never terminated after the client stopped reading (flush path not deadline-aware);origin/maincontrol worktree, so it is currently preserved as a baseline/unrelated failure rather than attributed to this change.This PR must not be described as repository-wide green, fully validated, release-ready, or merge-ready until CI and maintainer review complete.
Security and privacy notes
This touches persisted certificate endorsements and membership-propagation notifications, so it remains security-sensitive code. The change does not intentionally modify certificate validation, endorsement verification, admission authorization, PIN handling, revocation, or network exposure. Tests use synthetic peer identifiers, signatures, certificates, and temporary directories. No credentials, private keys, real cluster identities, customer data, or personal data were added.
Existing PAIR security caveats remain applicable, including the low-entropy temporary pairing PIN and the local-network trust boundary.
Review status
be34de2.Signed-off-byDCO trailers.