G-011 — Define Metadata And Privacy Policy
Status: drafted → reviewed → accepted → closed.
Author: driver-claude
Date: 2026-05-06
1. Job of this gate
Per gemini's tracker §G-011: define public/private fields per envelope and MWP message; keep CT-log entries minimal; avoid binding high-value sigils to raw peer URIs; use short-lived signed introduction records; specify privacy-mode profile; treat ZK provenance as a future dependency.
This gate is a deployment-time policy as much as a protocol-time spec. HERALD already has [EXT §2.7] minimum-metadata defaults and templates/Herald-Charter.md §5 jurisdictional disclosure. G-011 stitches them into a Manthan-specific privacy regime.
2. Public-vs-private field map
For each protocol message, fields are classified as PUBLIC (always visible to anyone with the envelope), MINIMUM-CT (logged in CT logs by default), OPT-IN-CT (logged only with submitter consent), PRIVATE (never logged; lives only in agents' local state).
2.1 HERALD envelope
| Field | Class | Notes |
|---|---|---|
v | PUBLIC | protocol version |
id | PUBLIC + MINIMUM-CT | content-addressed hash; used to look up the envelope |
from | PUBLIC + OPT-IN-CT | full sigil; CT-logged only with log_metadata_consent per [EXT §2.7] |
to | PUBLIC + OPT-IN-CT | sigil(s); CT-logged only with consent |
parent | PUBLIC + MINIMUM-CT | hash of parent envelope's id |
trace | PUBLIC + MINIMUM-CT | hash of genesis envelope's id |
ts | PUBLIC + OPT-IN-CT | full Unix seconds; MINIMUM-CT logs only hour_bucket = ts / 3600 * 3600 |
nonce | PUBLIC | needed for signature verification; not privacy-leaking on its own |
attestations | varies per type | see §2.2 |
payload | PRIVATE by default | NEVER logged in CT |
signatures | PUBLIC | required for verification |
2.2 Per-attestation classification
| Attestation type | Class | Rationale |
|---|---|---|
birth | PUBLIC + REQUIRED-CT | needs CT inclusion to be authoritative ([EXT §1.3]) |
molt | PUBLIC + REQUIRED-CT | same |
deprecation | PUBLIC + REQUIRED-CT | same |
lineage_endorsement | PUBLIC + REQUIRED-CT | Heralds publish endorsements; [EXT §3.4] |
capability_manifest | PUBLIC + OPT-IN-CT | usually public; subsidised: true may be sensitive |
refusal | PUBLIC + REQUIRED-CT | per [EXT §10] aggregate reporting requires CT |
apologia | PUBLIC + OPT-IN-CT | retraction; usually public but operator may keep narrow |
confession | PUBLIC | by design |
whisper | PRIVATE (encrypted) | whisper.encrypted MUST NOT be logged |
transcription (G-007) | PUBLIC + REQUIRED-CT | Scribe transcripts are public-record |
research_finding (G-007) | varies | per Charter policy |
lineage_evidence (G-007) | PUBLIC + REQUIRED-CT | high-stakes |
capability_observation (G-007) | PUBLIC + OPT-IN-CT | per Charter |
handoff_receipt (G-007) | OPT-IN-CT | per deployment |
entropy_seed (G-009) | varies | cryptographic class: hash only; creative: prompt PUBLIC unless private deployment |
session_key_grant (G-002) | PUBLIC + REQUIRED-CT | needs to be observable for verifier-side gating |
session_key_revoke (G-002) | PUBLIC + REQUIRED-CT | same |
2.3 MWP messages
| Frame type | Class | Notes |
|---|---|---|
HELO | PUBLIC at session start | sigils, nonces, version — not logged |
HELO_ACK | PUBLIC at session start | same |
HELO_ACK_2 | PUBLIC at session start | initiator's transcript countersig |
PEER_EXCHANGE | PRIVATE per session | peer URIs revealed only to authenticated peers |
INVENTORY | PRIVATE per session | trace summaries; reveals what this peer has seen |
ENVELOPE_GOSSIP | per envelope's class | the envelope's classification governs |
GET_ENVELOPES | PRIVATE per session | reveals what this peer is interested in |
PING/PONG/BYE | PRIVATE | session-control |
3. Avoiding high-value-sigil binding to raw peer URIs
The problem. If a Herald with high Patina publishes a peer URI = https://my-server.example.org in its Charter, and that Charter is widely cached, the URI is forever associated with the Herald's high-value sigil. Subsequent infrastructure changes (URI migration) require Charter re-issue and out-of-band coordination. Worse, a doxx of my-server.example.org's operator is automatically a doxx of that sigil.
The defence: short-lived signed introduction records.
{
"type": "peer_introduction",
"value": {
"for_sigil": "<sigil:high-value-Herald>",
"endpoint": "https://current-host.example/",
"endpoint_proof": {
"tls_cert_fingerprint": "<sha256 of cert>",
"valid_from": <Unix seconds>,
"valid_until": <Unix seconds, recommended ≤ 7 days>
},
"issued_by": "<sigil:introduction-issuer>", // a delegate, not the Herald itself
"issued_at": <Unix seconds>
}
}The Herald's long-term key signs a delegation envelope authorising introduction-issuer to bind URIs to its sigil for the next 30 days. The delegate (which can rotate without affecting the Herald) signs short-lived introductions.
A peer wanting to reach the high-value Herald looks up the latest valid introduction. URI changes flow through delegate rotations; the Herald's primary sigil never appears in URI bindings published past introduction-validity.
This is templates/Herald-Charter.md §9 contact addresses pattern, generalised: the Charter publishes the introduction-issuer's sigil and the URI of where to fetch fresh introductions, not the Herald's URI directly.
4. Privacy-mode profile
For deployments where envelope content (or even existence) is sensitive, Manthan supports a privacy-mode profile applied at the CT-log layer:
log_profile := "minimum" | "broader-public" | "private-compliance" | "privacy-mode"The privacy-mode profile is a stricter cousin of minimum:
| Field | minimum | privacy-mode |
|---|---|---|
id | logged | logged |
parent_hash | logged | logged as ZK commitment (future); for v0.2, not logged at all |
trace_hash | logged | not logged |
hour_bucket | logged | logged as day_bucket only (24h granularity) |
Privacy-mode logs cannot answer "show me all envelopes in trace T" — that's the point. Operators choose privacy-mode when their threat model includes ecosystem-wide social-graph reconstruction.
Per audits/systemic-risk-matrix.md SR-009 and research/zk-provenance.md (R-201), privacy-mode is the bridge to ZK provenance; full ZK is a Phase-3+ dependency.
5. Sigil-to-URI binding deployment matrix
| Sigil class | URI binding pattern |
|---|---|
| Herald (high-value) | Charter publishes introduction-issuer sigil only; no URI |
| CT log operator | LOTS publishes URI directly (operator accepts the doxx-coupling) |
| Conduit | Capability manifest publishes URI; rotates per manifest expiry |
| Agent (transient) | DNS-TXT or capability manifest, short-lived |
| Bestiary maintainer | Charter publishes delegate-issuer; URI rotates |
6. Privacy-policy publication
Every Manthan deployment MUST publish a privacy-policy.md per the Charter §5 / §6 transparency requirements. Required sections:
- What envelope fields are logged (per §2 above).
- What CT-log profile this deployment uses.
- What human-supplied data flows through Sarah Injector and how it's handled.
- Data-subject rights (GDPR/CCPA where applicable).
- Retention schedule and erasure procedure (within the limits of append-only CT logs).
Append-only CT logs cannot truly "delete" — the redress mechanism is deprecation + apologia per [EXT §1] / [EXT §7.1]. The privacy policy MUST disclose this.
7. Acceptance criteria
- [x] Per-field classification (§2.1, §2.2, §2.3) for envelopes, attestations, MWP frames.
- [x] Sigil-URI binding pattern with delegation (§3) for high-value sigils.
- [x] Privacy-mode profile specified (§4) as a stricter CT log mode.
- [x] Sigil-binding deployment matrix (§5).
- [x] Privacy-policy publication requirement (§6) tied into Charter §5/§6.
- [x] ZK provenance flagged as future dependency for privacy-mode-at-scale.
8. What G-011 does NOT cover
- HPKE / encrypted whisper details — already in
lib/herald-core-ts/src/whisper.tsper [EXT §7.3]. - Anonymous credentials / pseudonymous reputation — Phase 4+ research.
- Differential privacy of refusal-rate aggregates — out of v0.2 scope.
9. Sign-off
- [x] drafted → this document
- [x] reviewed → against [EXT §2.7] minimum-metadata, [EXT §10] refusal transparency,
templates/Herald-Charter.md§5/§6,research/zk-provenance.md(R-201),audits/systemic-risk-matrix.mdSR-009 - [x] accepted → field-classification map is concrete, deployments can implement privacy-mode immediately
- [x] closed → G-011 closed; per-deployment
privacy-policy.mdis operator-side
— G-011 closed, 2026-05-06.