Skip to main content

Delegation and Access Control

Access in Genesis X-1 is not assumed. It is declared, signed, and recorded.

No party can read or write to a ledger scope unless they are a direct constitutional party to it, or hold a delegation grant signed by a party with authority over that scope. Every grant is an actor-signed event. Every grant is part of the immutable ledger record. Every grant can be independently audited.

There is no implicit access. There is no ambient authorization. Access boundaries are the protocol's definition of trust.

Direct Party Access​

Direct parties to a ledger always have access to their own boundary.

For launch ledger types this means:

  • ORDER: buyer and supplier actors
  • FACILITY_ROOT: the founding organization actor
  • ENTITY_ROOT: the entity actor
  • ENGAGEMENT: the primary actor and the counterparty actor

Delegated Access​

Genesis X-1 supports delegated access at three public scope levels:

  • organization delegation
  • ledger delegation
  • traceledger master execution access

Read vs Write​

Read and write permissions are explicit on traceledger master execution access:

  • read: can read the master and master-scoped events
  • write: can append events to the master and read the resulting chain

Organization and ledger delegations use role-bearing grants. Traceledger master execution access uses direct read or write.

How Access Is Granted​

Organization delegation​

  • POST /delegation/organization

Ledger delegation​

  • POST /delegation/ledger

Master execution access​

  • POST /delegation/master

How Access Is Revoked​

Organization delegation​

  • PATCH /delegation/organization

Ledger delegation​

  • PATCH /delegation/ledger

Master execution access​

  • PATCH /delegation/master

Revocation deactivates the grant. Historical visibility remains through list and event surfaces.

How Expiry Works​

Expiry is available on traceledger master execution access.

Organization and ledger delegations do not expose a public expiry field at launch.

If a master access grant carries expires_at, the server enforces expiry at read and write time.

Owners and Delegates​

Owners can:

  • grant organization delegation
  • revoke organization delegation
  • grant ledger delegation when they are direct parties or active ledger owners
  • grant master access when they are direct parties to the parent ledger
  • list active master access grants

Delegates can:

  • use the granted scope
  • read their own master access grant through the master access listing endpoint

Delegates cannot:

  • revoke someone else’s grant unless they are also an authorized owner in that scope
  • append to a master when the grant is read
  • continue access after revocation
  • continue access after expiry

Expired Access Behavior​

When a master access grant is expired:

  • reads fail with access denial for that expired scope
  • writes fail with access_expired
  • the historical grant record remains visible to owners

Revoked Access Behavior​

When a grant is revoked:

  • new reads under that grant stop
  • new writes under that grant stop
  • historical records remain queryable where the caller still has another valid access path

Listing Behavior​

Organization and ledger grant lists​

  • GET /delegation/supplier
  • GET /delegation/buyer
  • GET /delegation/ledger

These are authenticated scope reads.

Point-in-time delegation snapshot​

  • GET /delegation/snapshot

This returns active delegations for one scope at a requested time.

Master execution access list​

  • GET /traceledger/master/{uuid}/access

Visibility:

  • direct owners see the full active grant list
  • a delegated actor sees only its own active grant

Owner Example​

Grant organization delegation:

curl -sS "$BASE_URL/delegation/supplier" \
-X POST \
-H "Authorization: Bearer $SUPPLIER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"organization_id": "'"$SUPPLIER_ORG_ID"'",
"delegate_actor_id": "'"$OPS_ACTOR_ID"'",
"role": "OPS",
"permissions": {
"orders": true,
"shipments": true
}
}'

Read Delegate Example​

Grant master read access:

curl -sS "$BASE_URL/traceledger/master/$MASTER_ID/access" \
-X POST \
-H "Authorization: Bearer $BUYER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"actor_id": "'"$AUDITOR_ACTOR_ID"'",
"access": "read",
"expires_at": "2026-05-01T00:00:00Z"
}'

Write Delegate Example​

Grant master write access:

curl -sS "$BASE_URL/traceledger/master/$MASTER_ID/access" \
-X POST \
-H "Authorization: Bearer $BUYER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"actor_id": "'"$ERP_ACTOR_ID"'",
"access": "write"
}'

Expired Access Example​

If the read delegate above calls:

curl -sS "$BASE_URL/traceledger/master/$MASTER_ID/events" \
-H "Authorization: Bearer $AUDITOR_API_KEY"

after 2026-05-01T00:00:00Z, the request is denied because the grant is expired.

If the same actor attempts:

curl -sS "$BASE_URL/traceledger/master/$MASTER_ID/events" \
-X POST \
-H "Authorization: Bearer $AUDITOR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"event_type":"AUDIT_NOTE","payload":{"summary":"late write"}}'

the request fails with an expiry-related access error.

Revoked Access Example​

Revoke a master execution grant:

curl -sS "$BASE_URL/traceledger/master/$MASTER_ID/access/$LINK_ID" \
-X DELETE \
-H "Authorization: Bearer $BUYER_API_KEY"

Revoke an organization delegation:

curl -sS "$BASE_URL/delegation/supplier" \
-X PATCH \
-H "Authorization: Bearer $SUPPLIER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"organization_id": "'"$SUPPLIER_ORG_ID"'",
"delegate_actor_id": "'"$OPS_ACTOR_ID"'"
}'