Repository navigation
fix(ci): node infra results, sign-in audit rows, keyed pseudonyms, run identity (D-1198, D-1276, D-1044, D-1103) - #538
Conversation
|
Review fix 0993d8f: |
…mpt lost, and a signed result frame is verified (D-1103)
…dged on the descriptor (D-1198)
…ons, document the two-row remote mutation (D-1276)
…d pseudonyms (D-1276, D-1103, D-1198)
… artifacts sign emits keyed ids (D-1198)
0993d8f to
6b2b2c3
Compare
|
Rebased onto origin/main and resolved the conflict in .github/wiki/guides/ci/Trust-Security-and-Privacy.md by keeping both sides: the expanded audit-row documentation for refused sign-ins and admin mutations, plus the TEAM self_approval clarification. All CI module tests pass with -mod=vendor (exit 0). Force-pushed to dw10-plugins-22 at 6b2b2c3. |
Per row
D-1044 (identity part; the rest was already in main)
DeletePipelinesprunessched_admittedandsched_refusal(store/prune.go), the retryable to queued transition deletes thesched_admittedrow (store/transitions.go),Coordinator.RundefersdispatchRelease(run/coordinator.go:210).Options.User/Team->Session.User/Team->schedJobsetsJob.User/Team.servefills them from the run's intake row: user is the principal id of the storedsubmitterlabel (roles.PrincipalOf), team is the owner part ofowner/repo. Decision: the coordinator has no team table, and the project owner is the organisation the repository belongs to. A run with no submitter (webhook) has no user and still gets the owner as team; empty values keep the old shared bucket.TestSchedJobCarriesUserAndTeam(fails without theschedJobline),TestSubmitterIdentity.D-1103
lostthrough the engine, so the CI-40 retry applies. An infra report counts against the node breaker, a node-chosen cancel does not. A cancel the run asked for still settles as cancelled. (run/remote_infra.go)attest.RunnerVerifier(newattest.VerifyFrame); a refusal makes the attempt lost (infra, counts against the node). Decision on the signing policy: an unsigned frame is still accepted, because the P7-TRUST-20 agent contract lets a node without thesigning-eligiblemarker complete unsigned and the release gate already refuses unsigned remote evidence. Mandatory signatures would exclude those nodes.TestRemoteInfraResultTakesTheLostPath,TestRemoteResultSignatureMustVerifyWhenPresent(fails with the sink hook removed),TestVerifyFrame.D-1198
O_NOFOLLOW|O_NONBLOCK|O_CLOEXECand the mode is read from the descriptor (fstat). The operator trust file keeps following links but gets the same non-blocking open and fstat. Non-unix builds keep the Lstat check.runner-/coordinator-ids are an HMAC-SHA256 under a 32-byte operator key in<home>/pseudonym.key(0600, regular file, created atomically on first attempt, never published). Registered at attempt start; a bad key file fails the attempt instead of falling back to the unkeyed hash. With no key registered aProfilekeeps the unkeyed form (the provenance golden files are unchanged). Decision: provisioning is local and automatic, so no operator action is needed.TestOpenCheckedRefusesASwappedLeaf,TestOpenCheckedRefusesAFifoAtOpenTime,TestKeyedPseudonymsResistADictionary,TestLoadPseudonymKey*,TestAttemptStartRegistersThePseudonymKey.D-1276
ActorFromPeer/ActorFromTokenfailures write asignin.failrow (actortoken:unknown,token:<id>:<principal>,user:<id>orcertificate:unknown; reason key and peer address, never the token). Rate limit: one row per peer and kind per 30 s, 20 rows per 30 s overall, and the next row carriessuppressed=N. The user API passes the peer host viaroles.WithPeer.serve adminmutation (validation or role) writes one<action>.refusedrow with the reason key.authorizerow is the decision and exists even when no mutation follows (a denial); the mutation row is written first and fails closed. Recorded inroles/signin.goand the Trust wiki page, pinned byTestAuthorizeThenMutationLeavesTwoRows.TestSignInFailuresWriteARateLimitedRow,TestSignInFailureBudgetBoundsManyPeers,TestSignInFailureRowsForKnownTokensAndCertificates,TestRefusedAdminMutationsWriteARow.Checks (Go 1.26, darwin/arm64, from
free/ci,-mod=vendor)go vet ./...clean;gofmtclean on touched files.go test -count=1 ./...: all pass exceptcmd/agent TestServeStdioExitsNonZeroWithE663OnAProdStackMarkerandinternal/legacy TestSecretsEnvLiveKeyGateTrackedValueOnly. Both fail the same way on a clean origin/main worktree (pre-existing).TestLoadPseudonymKeyConcurrentFirstUse.