~ knotless Search/
↑↓ move↵ open⇧↵ all results
0
0
main
610 lines · 30.8 KB Raw History

lexicons-market: one row per lexicon

  • reference rows for every lexicon under lexicons/com/publicdomainrelay/temp/ except cluster.* (infra.md) and badgeBlueKeys (identity.md), plus the two NSIDs here that have no lexicon file
  • the flows: market.md (rfp to release), guest-events.md (events under a receipt); steps S3 to S9: README.md
  • headings drop the prefix com.publicdomainrelay.temp.; file paths are under lexicons/com/publicdomainrelay/temp/
  • the Go types are generated from these files into internal/atproto/market/zz_generated.lexicons.go (go generate in internal/atproto/market/nsid.go)
  • "defined, not written": the lexicon and its NSID constant exist, but no Go code in this repo writes the record

Columns

columnmeaning
typelexicon defs.main.type: record, procedure, query, subscription
key fieldsrequired fields first (*), then the fields the code reads
rkeywhat the code writes, not only the lexicon key
written by / read byrole and the Go function
stepthe README step it belongs to

Coverage

filesectiondone
market/rfp.jsonmarket.rfpx
market/bid.jsonmarket.bidx
market/bids/free.jsonmarket.bids.freex
market/bids/x402.jsonmarket.bids.x402x
market/accept.jsonmarket.acceptx
market/accepts/free.jsonmarket.accepts.freex
market/accepts/x402.jsonmarket.accepts.x402x
market/receipt.jsonmarket.receiptx
market/receipts/free.jsonmarket.receipts.freex
market/receipts/x402.jsonmarket.receipts.x402x
market/event.jsonmarket.eventx
market/offering.jsonmarket.offeringx
market/heartbeat.jsonmarket.heartbeatx
market/relays.jsonmarket.relaysx
market/association.jsonmarket.associationx
market/associationRequest.jsonmarket.associationRequestx
market/submitRfp.jsonmarket.submitRfpx
market/submitBid.jsonmarket.submitBidx
market/submitAccept.jsonmarket.submitAcceptx
market/submitEvent.jsonmarket.submitEventx
compute/vm.jsoncompute.vmx
compute/events/vm/delete.jsoncompute.events.vm.deletex
compute/events/vm/hostKeys.jsoncompute.events.vm.hostKeysx
compute/events/vm/onNetwork.jsoncompute.events.vm.onNetworkx
compute/events/vm/registerIdentity.jsoncompute.events.vm.registerIdentityx
compute/events/vm/sandbox.jsoncompute.events.vm.sandboxx
compute/events/vm/started.jsoncompute.events.vm.startedx
compute/events/vm/terminated.jsoncompute.events.vm.terminatedx
compute/events/guest/publicKey.jsoncompute.events.guest.publicKeyx
compute/events/guest/signalWebRTC.jsoncompute.events.guest.signalWebRTCx
compute/events/guest/secrets.jsoncompute.events.guest.secretsx
compute/events/guest/secretsRequested.jsoncompute.events.guest.secretsRequestedx
compute/events/guest/secretsApplied.jsoncompute.events.guest.secretsAppliedx
compute/events/guest/secretsUpdated.jsoncompute.events.guest.secretsUpdatedx
compute/events/guest/agentStart.jsoncompute.events.guest.agentStartx
compute/events/guest/requesterDid.jsoncompute.events.guest.requesterDidx
compute/events/guest/r2Start.jsoncompute.events.guest.r2Startx
compute/events/guest/r2Release.jsoncompute.events.guest.r2Releasex
compute/events/guest/r2Released.jsoncompute.events.guest.r2Releasedx
compute/guest/subscribeEvents.jsoncompute.guest.subscribeEventsx
ingress/webRTC.jsoningress.webRTCx
no file (SecretsNSID)compute.secrets.getSecretsx
no file (WIFSimpleNSID)compute.config.wif.simplex

Summary

NSID tailtyperkey writtenwritten bystep
market.rfprecordTIDrequesterS3
market.bidrecordmarket.BidRKeybidderS4
market.bids.freerecord<bid rkey>-payloadbidderS4
market.bids.x402recordnonedefined, not writtenS4
market.acceptrecordSessionRKey("accept", ...)requesterS5
market.accepts.free, market.accepts.x402recordnonedefined, not writtenS5
market.receiptrecordmarket.ReceiptRKeybidderS6
market.receipts.free, market.receipts.x402recordnonedefined, not writtenS6
market.eventrecordper kindbothS7-S9
market.offeringrecordselfbidderS3 (discovery)
market.heartbeatrecordself (literal)bidderS3 (discovery)
market.relaysrecordselfno Go writer hereS3 (discovery)
market.associationrecordmarket.ContractScopedRKeyrequesterS5, S8
market.associationRequestrecordmarket.ContractScopedRKeyguest requesterS8
market.submitRfpprocedure-served by bidderS3
market.submitBidprocedure-served by requesterS4
market.submitAcceptprocedure-served by bidderS5
market.submitEventprocedure-served by bothS7-S9
compute.vmrecordTIDrequesterS3
compute.events.vm.*recordper kindbidder (vm.delete: requester)S7, S9
compute.events.guest.*recordper kindrequester or bidder for the guestS8
compute.guest.subscribeEventssubscription-served by bidder GuestControlPlaneS8
ingress.webRTCrecordwebrtc (listen), TID (offer, answer)requester, bidderS3-S6
compute.secrets.getSecretsquery (route, no file)-served by requesterS8
compute.config.wif.simplerecord (no file)<bid rkey>-configbidderS4

market.rfp

itemvalue
filemarket/rfp.json
typerecord, key any
key fieldspayload* (strongRef -> compute.vm), signatures*, domain (compute), submitBid, ingress[], policies[], createdAt
rkeyTID (market.CreateRFP passes no rkey)
written byrequester: contractRunner in internal/market/requester/runner.go via market.CreateRFP (internal/atproto/market/records.go)
read bybidder: stream or submitRfp, then getRecord (internal/market/bidder/submit.go SubmitRFP, acceptContract in internal/market/bidder/adapters.go); bid window from createdAt (internal/atproto/market/rfpwindow.go)
stepS3

market.bid

itemvalue
filemarket/bid.json
typerecord, key any
key fieldsrfp, payload (-> market.bids.free), signatures*, config (-> compute.config.wif.simple), submitAccept, ingress[], createdAt
rkeymarket.BidRKey(bidderDID, rfpURI, rfpCID) = bid-<20 hex>; also the Bid object name
written bybidder: writeBidRecord in internal/market/bidder/bids.go (market.BuildBid, market.SignRecord)
read byrequester: submitBid (Requester.SubmitBid in internal/market/requester/callbacks.go), stream, catch-up getRecord at BidRKey (internal/market/requester/bidcatchup.go); bidder at accept time
stepS4

market.bids.free

itemvalue
filemarket/bids/free.json
typerecord, key any
key fieldsreason* (free), signatures*, cost (0), createdAt
rkey<bid rkey>-payload
written bybidder: writeBidRecord
read byrequester: free detection for firstFree (internal/market/requester/accept.go, internal/market/requester/inbox.go)
stepS4

market.bids.x402

itemvalue
filemarket/bids/x402.json
typerecord, key any
key fieldscost, currency, frequency, prepay, url, signatures
rkeynone: defined, not written
written byno Go writer
read byrequester reads cost when a bid names one (internal/market/requester/accept.go, internal/market/requester/inbox.go)
stepS4

market.accept

itemvalue
filemarket/accept.json
typerecord, key any
key fieldsrfp, bid, signatures*, payload (unset by the code), submitEvent, ingress[], createdAt
rkeyacceptRKeyFor -> market.SessionRKey("accept", repoDID, contract, rfpURI, rfpCID, bidURI, bidCID) (internal/market/requester/secrets.go)
written byrequester: market.CreateAcceptAt from runner.go
read bybidder: submitAccept or stream -> provisioning StateSync (SubmitAccept in internal/market/bidder/submit.go, acceptContract); the receipt cid binds it
stepS5

market.accepts.free

itemvalue
filemarket/accepts/free.json
typerecord, key any
key fieldsbid, signatures, payload, createdAt
rkeynone: defined, not written
written byno Go writer (AcceptsFreeNSID constant only)
read bynone
stepS5

market.accepts.x402

itemvalue
filemarket/accepts/x402.json
typerecord, key any
key fieldsbid, signatures, payload (the payment), createdAt
rkeynone: defined, not written
written byno Go writer (AcceptsX402NSID constant only)
read bynone
stepS5

market.receipt

itemvalue
filemarket/receipt.json
typerecord, key any
key fieldsrfp, bid, accept, cid, signatures*, payload (-> the RFP's compute.vm; null when none), submitEvent (copied from the accept when the bidder serves inbound XRPC), ingress[]
rkeymarket.ReceiptRKey(acceptURI, acceptCID) = receipt-<32 hex>
written bybidder: createReceipt in internal/market/bidder/submit.go -> market.CreateReceiptRecordAt (internal/atproto/market/attest.go)
read byrequester: FindReceipt (one getRecord, internal/market/requester/market.go), market.VerifyReceipt in acceptReceipt; policy trust (internal/policyengine/trust/association.go)
stepS6

market.receipts.free

itemvalue
filemarket/receipts/free.json
typerecord, key any
key fieldsaccept, cid, signatures*, createdAt
rkeynone: defined, not written
written byno Go writer (ReceiptsFreeNSID constant; named in OAuth scopes, internal/atproto/oauth/scope.go)
read bynone
stepS6

market.receipts.x402

itemvalue
filemarket/receipts/x402.json
typerecord, key any
key fieldsaccept, cid, signatures*, createdAt
rkeynone: defined, not written
written byno Go writer (ReceiptsX402NSID constant; named in OAuth scopes)
read bynone
stepS6

market.event

itemvalue
filemarket/event.json
typerecord, key any
key fieldsreceipt, payload (-> a compute.events.* record in the same repo), signatures*, createdAt
rkeybidder: market.EventRKeys(key) second value <prefix>-event-<32 hex>; requester: SessionRKey("event", receiptURI) for vm.delete, SessionRKey("contract-event-envelope", uid) for ContractEvents
written bybidder event adapter (writeMarketEvent in internal/market/bidder/adapters.go); requester destroyEnvelope (runner.go), publishContractEvent (internal/market/requester/contractevents.go); both via market.PutEvent
read bythe other party: submitEvent or stream; requester FindTermination
stepS7, S8, S9

market.offering

itemvalue
filemarket/offering.json
typerecord, key any (writers use self)
key fieldsappliesTo* (holds compute.vm), createdAt*, endpointUrl, ingress[], refreshedAt, withdrawnAt
rkeyself (market.OfferingRKey)
written bybidder: putOffering, withdraw in internal/market/bidder/offering.go
read byrequester: market.ReadOffering (self, else the rkey the heartbeat names), market.OfferingApplies; relays list its repos by listReposByCollection
stepS3 (discovery)

market.heartbeat

itemvalue
filemarket/heartbeat.json
typerecord, key literal:self
key fieldsoffering* (at-uri of the offering in the same repo), createdAt*
rkeyself
written bybidder: beat in internal/market/bidder/offering.go, every HeartbeatInterval (60 s)
read byrequester: market.HeartbeatCache.FreshDIDs (fresh = at most HeartbeatTTL 300 s old); internal/marketpresence
stepS3 (discovery)

market.relays

itemvalue
filemarket/relays.json
typerecord, key any (writers use self, readers read only self)
key fieldsrelays* (HTTP(S) relay base URLs), createdAt*
rkeyself (market.RelaysRKey)
written byno Go writer in this repo
read byrequester discovery: market.RelayURLsOf from relaySources in internal/market/requester/discovery.go
stepS3 (discovery)

market.association

itemvalue
filemarket/association.json
typerecord, key any
key fieldssubject, service (requester_associate, bidder_associate), createdAt*, contract (-> market.accept, needs expiresAt), expiresAt, parent, note
rkeystanding: <service>-<subject with : replaced by ->; contract-scoped: market.ContractScopedRKey(service, subject, acceptURI) = <service>-<32 hex of sha256(subject)>-<accept rkey> (ContractAssociationRKey in internal/market/requester/association.go)
written byrequester (contract-scoped, association.go); standing ones: identity.md
read bybidder (internal/market/bidder/association.go, ComputeVM spec.associationExpiresAt), policy trust (internal/policyengine/trust/association.go)
stepS5, S8; release deletes only its own

market.associationRequest

itemvalue
filemarket/associationRequest.json
typerecord, key any
key fieldsauthority, service, contract* (the authority's accept uri), nonce, createdAt
rkeymarket.ContractScopedRKey(service, authority, acceptURI)
written bythe guest requester: an AtprotoRecord object from internal/app/compose/records.go
read bythe authority requester: one getRecord in the DID the guest reported (internal/market/requester/association.go); cmd/socialweb-computer/requestassociation.go
stepS8; flow: identity.md

market.submitRfp

itemvalue
filemarket/submitRfp.json
typeprocedure, service auth lxm = the NSID, issuer = requester
input{rfpUri, rfpCid, ingress?} (ingress = ingress.webRTC offers)
output{ok, name, phase, ingress?}; errors InvalidRequest, Unauthorized, Forbidden, Unavailable; the code also answers 409 RFPClosed
served bybidder: handleSubmitRFP in internal/services/bidder/routes.go -> Bidder.SubmitRFP
called byrequester: solicitBids -> HTTPMarket.SubmitRFP (internal/market/requester/runner.go, market.go)
stepS3

market.submitBid

itemvalue
filemarket/submitBid.json
typeprocedure, issuer = bidder
input{uri, cid, record} of the market.bid, ingress?
output{ok, ingress?}; errors InvalidRequest, Unauthorized, Forbidden, Unavailable
served byrequester ingress: internal/services/requester/routes.go -> Requester.SubmitBid; the bidder route only parses it
called bybidder: submitBid in internal/market/bidder/submit.go to the RFP's submitBid
stepS4

market.submitAccept

itemvalue
filemarket/submitAccept.json
typeprocedure, issuer = requester
input{acceptUri, acceptCid, ingress?}
output202 {ok, id, acceptUri, acceptCid}; lexicon also has uri, cid, submitEvent, ingress; errors add InternalError
served bybidder: handleSubmitAccept -> Bidder.SubmitAccept (provisioning StateSync)
called byrequester: submitAcceptAndWait (internal/market/requester/accept.go)
stepS5

market.submitEvent

itemvalue
filemarket/submitEvent.json
typeprocedure, issuer = the accept author (to a bidder) or the receipt author (to a requester)
input{uri, cid, record} of the market.event, ingress?
output{ok, ingress?}; 403 Forbidden "not the accept author"
served bybidder handleSubmitEvent -> Bidder.SubmitEvent; requester Requester.SubmitEvent (callbacks.go)
called byrequester releaseContract, publishContractEvent; bidder event adapter (internal/market/bidder/adapters.go)
stepS7, S8, S9

compute.vm

itemvalue
filecompute/vm.json
typerecord, key any
key fieldsrole* (VM name in the contract), kind (vm default, deno), cpus (2), mem (4G), disk (50G), network, location, user_data, createdAt
rkeyTID (CreateRecord)
written byrequester: runner.go with DefaultComputeCPUs, DefaultComputeMem, DefaultComputeDisk (internal/market/requester/requester.go); user_data from cloudinit.BuildUserData (internal/atproto/cloudinit)
read bybidder through rfp.payload: kind check (rfpKind in submit.go), boot (acceptContract, internal/guestseed adds the binaries unit)
stepS3

compute.events.vm.delete

itemvalue
filecompute/events/vm/delete.json
typerecord, key any
key fieldsreason* (released), createdAt*, signatures
rkeymarket.ReleasePayloadRKey(receiptURI) = SessionRKey("delete", receiptURI)
written byrequester: destroyEnvelope in internal/market/requester/runner.go
read bybidder: verifyInboundDelete, applyRelease (internal/market/bidder/adapters.go); policy trust
stepS9

compute.events.vm.hostKeys

itemvalue
filecompute/events/vm/hostKeys.json
typerecord, key any; def hostKey {type*, publicKey*, fingerprint*}
key fieldskeys[], observedAt, createdAt*
rkeyEventRKeys("hostKeys:<receipt>") -> hostkeys-payload-<32 hex>
written bybidder: report in internal/market/bidder/report.go from the host key bound at login (RecordBoundHostKey in internal/guestidentity/service.go)
read byrequester: waitGuest -> status.contract.hostKeys
stepS7

compute.events.vm.onNetwork

itemvalue
filecompute/events/vm/onNetwork.json
typerecord, key any
key fieldscreatedAt*, kind (iroh, https, webrtc, sandbox), address, tag
rkeyEventRKeys("onNetwork:<receipt>") or EventRKeys("onNetwork:<tag>:<receipt>")
written bybidder: report (internal/market/bidder/report.go) from the guest POST (Guest.onNetwork in internal/guestidentity/service.go); sandbox: internal/market/bidder/sandbox.go
read byrequester: waitGuest -> status.contract.vmAddress, status.contract.networks
stepS7

compute.events.vm.registerIdentity

itemvalue
filecompute/events/vm/registerIdentity.json
typerecord, key any
key fieldscreatedAt*
rkeynone: defined, not written
written byno Go writer (ComputeEventsVMRegisterIdentityNSID constant only)
read bynone
stepS7

compute.events.vm.sandbox

itemvalue
filecompute/events/vm/sandbox.json
typerecord, key any
key fieldsexitCode* (-1 = killed), createdAt*, timedOut, stdout, stderr (capped)
rkeyEventRKeys("<nsid>:<receipt>")
written bybidder: internal/market/bidder/sandbox.go (compute.vm.kind: deno)
read byrequester: status.contract.sandbox (internal/market/requester/events.go, runner.go)
stepS7

compute.events.vm.started

itemvalue
filecompute/events/vm/started.json
typerecord, key any
key fieldscreatedAt*, observedAt
rkeynone: defined, not written
written byno Go writer (ComputeEventsVMStartedNSID constant only)
read bynone
stepS7

compute.events.vm.terminated

itemvalue
filecompute/events/vm/terminated.json
typerecord, key any
key fieldsreason* (market.VMTerminatedReasons), observedAt, createdAt, exitCode, request (-> the vm.delete)
rkeyEventRKeys(TerminationKey(receiptURI)) -> termination-payload-<32 hex>
written bybidder: termination StateSync (internal/computevm/termination.go, internal/controllers/computevm/controller.go), adapter atproto.market.event
read byrequester FindTermination (market.go); atirc via the token lease (contractLease in internal/market/requester/atirc.go); policy trust
stepS9

compute.events.guest.publicKey

itemvalue
filecompute/events/guest/publicKey.json
typerecord, key any
key fieldskind* (age-x25519), tag, key (age1...), createdAt*
rkeyrequester: SessionRKey("contract-event", uid); bidder: EventRKeys("guest:...")
written byrequester (outbound ContractEvent, contractevents.go); bidder for the guest (PublishGuestEvent in internal/market/bidder/guestevents.go)
read byguest agent (internal/guestagent/subscribe.go); requester (inbound ContractEvent)
stepS8

compute.events.guest.signalWebRTC

itemvalue
filecompute/events/guest/signalWebRTC.json
typerecord, key any
key fieldskind* (offer, answer), tag, ciphertext (age armored {sdp, replyTo}), createdAt*
rkeyas guest.publicKey
written byrequester (CLI / browser ContractEvent, internal/stack/request/webrtc.go); bidder for the guest
read byguest agent (internal/guestagent/session.go, subscribe.go); requester (inbound ContractEvent)
stepS8

compute.events.guest.secrets

itemvalue
filecompute/events/guest/secrets.json
typerecord, key any
key fieldsciphertext* (age armored bundle, at most 65536 bytes), createdAt*
rkeySessionRKey("contract-event", uid) of ContractEvent secrets-<contract>
written byrequester only, on demand: sealGuestSecrets in internal/market/requester/guestsecrets.go
read byguest agent (internal/guestagent/secrets.go); the bidder forwards it unopened
stepS8

compute.events.guest.secretsRequested

itemvalue
filecompute/events/guest/secretsRequested.json
typerecord, key any
key fieldscreatedAt*
rkeybidder EventRKeys("guest:...")
written bybidder for the guest agent (secretsFallback: Sealed only)
read byrequester: status.contract.secretsRequested, then sealGuestSecrets
stepS8

compute.events.guest.secretsApplied

itemvalue
filecompute/events/guest/secretsApplied.json
typerecord, key any
key fieldsvia* (getSecrets, sealed), createdAt*, count
rkeybidder EventRKeys("guest:...")
written bybidder for the guest agent
read byrequester: status.contract.secretsApplied, condition SecretsApplied
stepS8

compute.events.guest.secretsUpdated

itemvalue
filecompute/events/guest/secretsUpdated.json
typerecord, key any
key fieldscreatedAt*
rkeySessionRKey("contract-event", uid) of ContractEvent secrets-updated-<SessionRKey("secretsUpdated", contract, ref)>
written byrequester only: notifySecretsUpdated (internal/market/requester/association.go), every fresh atirc mint
read byguest agent: fetch the bundle again
stepS8

compute.events.guest.agentStart

itemvalue
filecompute/events/guest/agentStart.json
typerecord, key any
key fieldscreatedAt*
rkeySessionRKey("contract-event", uid)
written byrequester only (run request agent <name> -> ContractEvent; needs spec.agent)
read byguest agent: systemctl start --no-block atirc-agent.service (internal/guestagent/agentstart.go)
stepS8

compute.events.guest.requesterDid

itemvalue
filecompute/events/guest/requesterDid.json
typerecord, key any
key fieldsdid* (did:plc only), createdAt*
rkeybidder EventRKeys("guest:...")
written bybidder for the guest agent (internal/guestagent/association.go)
read byrequester: status.contract.guestRequester (internal/market/requester/association.go, market.ValidGuestRequesterDID)
stepS8

compute.events.guest.r2Start

itemvalue
filecompute/events/guest/r2Start.json
typerecord, key any
key fieldsname* (DNS label), createdAt*, agent, hold
rkeySessionRKey("contract-event", uid)
written byrequester only (run request r2 <name>; needs spec.association.fromGuest)
read byguest agent: starts socialweb-r2.service (internal/guestagent/association.go)
stepS8

compute.events.guest.r2Release

itemvalue
filecompute/events/guest/r2Release.json
typerecord, key any
key fieldscreatedAt*
rkeySessionRKey("contract-event", uid)
written byrequester only: releaseGuestRequester (internal/market/requester/guestrequester.go)
read byguest agent: socialweb-r2-release.service
stepS9

compute.events.guest.r2Released

itemvalue
filecompute/events/guest/r2Released.json
typerecord, key any
key fieldsok, createdAt, message
rkeybidder EventRKeys("guest:...")
written bybidder for the guest agent
read byrequester: status.contract.r2Release, condition GuestRequesterReleased
stepS9

compute.guest.subscribeEvents

itemvalue
filecompute/guest/subscribeEvents.json
typesubscription; param cursor; message #event {seq*, uri*, cid*, record*}; error FutureCursor
served bybidder GuestControlPlane: handleSubscribeEvents in internal/services/guestcontrolplane/subscribe.go, queue internal/guestcp/queue
called byguest agent: internal/guestagent/subscribe.go (bearer = workload identity token)
carriesrequester-authored compute.events.guest.* payloads, in order; keepalive every 25 s
stepS8

ingress.webRTC

itemvalue
fileingress/webRTC.json
typerecord, key any
key fieldskind* (webrtc), mode* (listen, offer, answer), id* (hex sha256 of the requester repo DID), createdAt*, peer, session, descriptor (-> the listen record), sdp, stunUrls
rkeyrequester listen: webrtc (ingressDescriptor in internal/market/requester/requester.go); offer: TID (createIngressOffer in internal/market/requester/market.go); bidder answer: TID (AnswerIngressRecords in internal/market/bidder/submit.go)
written byrequester (listen, offer), bidder (answer)
read bythe other side through ingress[] on rfp, bid, accept, receipt, offering and the submit calls; only refs to this NSID are allowed (validateIngressList in internal/atproto/market/records.go)
stepS3 to S6

compute.secrets.getSecrets

itemvalue
filenone. SecretsNSID = com.publicdomainrelay.temp.compute.secrets, SecretsRoute in internal/market/requester/secrets.go
typequery-shaped HTTP route: GET /xrpc/com.publicdomainrelay.temp.compute.secrets.getSecrets/<contract>
authAuthorization: Bearer <workload identity token>; audience api://ATProto?actx=<requester DID>; subject claim must match the contract's grant
outputJSON array [{path, value, mode?}]; 401 AuthenticationRequired, InvalidToken; 503 NotReady
served byrequester ingress: internal/services/requester/routes.go -> Requester.Secrets
called byguest setup-secrets.service (internal/atproto/cloudinit)
stepS8; fallback: guest-events.md

compute.config.wif.simple

itemvalue
filenone. WIFSimpleNSID in internal/guestidentity/bidconfig.go
typerecord (bid config)
key fieldsaccept_path, issuer_uri, to_issue (openbao-identity-oidc), actx, token_path, url_path, url_route (/v1/identity/oidc/token), subject (actx:{actx}:plc:{did-plc-key}:role:{role}), createdAt
rkey<bid rkey>-config
written bybidder: writeBidRecord via guests.BidConfig (internal/services/bidder/guests.go, guestidentity.BidConfigFor)
read byrequester: resolveBidConfig and prepareWorkloadGrant (internal/market/requester/secrets.go) to build the workload identity grant; bidder at accept time
stepS4