HPPR Repository Admin and Join Conventions
Tags: repo, workflow
© R.A.Sol
This spec defines repository-service operational conventions: repository bootstrap, request/reply workflow, join flows, and ring0-proxy.
Content route conventions live in
100-CONTENT-ROUTES.md. Packet link and chunk
conventions live in 070-LINKS-AND-CHUNKS.md.
Bootstrap
A repository needs only the canonical packet families below to operate. Do not bootstrap convenience scaffolding or workflow placeholders.
Bootstrap sequence:
- Load or generate repo-owned signing secret in local operational storage.
- Derive repo verifier from that local signing secret.
- Write
//repo/admin/identity//root/|— self-signed Seal carryingRepo-Name. - Write Ring1
ring0auth config at://repo/admin/ring1//ring0/auth/|— signed by repo verifier;Ring1-Name: ring0 - Write Ring1
ring0members at://repo/admin/ring1//ring0/members/|/seal/<repo-verifier>— at least one initialMemberverifier (see Initial Token below) - Write Ring1
ring0policy at://repo/admin/ring1//ring0/policy/|— signed by repo verifier;ACL-Ruleheaders defining ring0 access - Write Ring1
anyoneauth config at://repo/admin/ring1//anyone/auth/|— signed by repo verifier;Ring1-Name: anyone - Write Ring1
anyonepolicy at://repo/admin/ring1//anyone/policy/|— signed by repo verifier;ACL-Ruleheaders for public/unauthenticated access
Do not bootstrap:
- Ring1 identities other than
ring0andanyone - packet families for repo signing-secret storage
- combined auth, member, and policy packets
- workflow placeholder packets
- any extra packet family not required for the repository to operate
Default anyone
Policy
ACL-Rule: .w. //repo/admin/request//join/
ACL-Rule: r.l //u/
Initial ring0 Token
The default initial ring0 member derives from token
init:
secret = "init/ring0/<repo-verifier>"
signing_secret = derive_secret_from_text(secret)
Implementations MAY accept an explicit bootstrap token at
repository creation, for example
hpprd --default-password <password> or
HPPRD_DEFAULT_PASSWORD. Packaged services that listen
on public interfaces MUST use a random explicit bootstrap token
instead of init.
Rotate the initial member to durable operator-controlled signing material after first connection.
Request/Reply Convention
Administrative request flows use:
- request queue:
//<scope>/admin/request//<kind>/... - requester reply path:
//<scope>/admin/request//<kind>/<requester>/reply/|
<kind> names the workflow. Join flows use
join.
Reply packets are expected to include:
Request-Status: approved|denied|pending+Link: request <hash>
Clients use Request-Status for state.
+Link gives exact request linkage.
Workflow packets are ordinary stored packets subject to policy. They are not auth or policy state.
Joining a Repository
Standard Ring1 join flow uses
<kind> = join:
- user watches reply path:
//repo/admin/request//join/<name>/reply/| - user writes request to:
//repo/admin/request//join/<name>/| - admin approves or denies in reply packet
- if approved, admin creates Ring1 auth config, members, and policy packets
- user derives signing material and reconnects
Provisional Access
An anyone request gets provisional read/list access
to its matching reply path:
//repo/admin/request//join/<name>/reply/|
<name> must match first segment from request
Key.
This is repository-service runtime code, not a packetized permission.
Joining a Group
Ring2 join flow uses <kind> = join:
- user watches reply path:
//<group>/admin/request//join/<requester-verifier>/reply/| - user writes request to:
//<group>/admin/request//join/|/seal/<requester-verifier> - admin approves or denies in reply packet
A common client flow derives
<requester-verifier> locally from
<group>/<username>/<password> as
defined in 052-RING2.md. This works
before contacting any repo. The password remains local to the
client.
Recommended non-member join ACLs:
ACL-Rule: .w. //<group>/admin/request//join/|/seal/
ACL-Rule: r.l //<group>/admin/request//join/
Request headers:
Request-Tags(optional)
Ring0-Proxy Convention
Ring1 may request a ring0-mediated action.
Request path:
//repo/admin/ring1//<ring1-name>/🖧<COMMAND>/|
Reply path:
//repo/admin/ring1//<ring1-name>/🖧<COMMAND>/reply/|
Supported commands:
🖧LIST🖧HEADERS🖧ADD
🖧GET is excluded. Use 🖧HEADERS to
obtain hash, then fetch blob by hash.