R-216 — Patina anti-farming reference formula
Status: research-grade reference formula. Non-normative — application-layer reputation systems MAY adopt it directly, modify the constants, or use a different design. Provides a starting point for ecosystem convergence.
Motivation:
- [EXT §9.4] specifies the inheritance gates (≤50% per hop, ≤3-hop chain cap) but explicitly defers the patina formula to [CHARTER §patina].
- [CHARTER] introduces patina tiers (fledgling/journeyman/elder/ancestor) but does not define how the score is computed.
- Without a reference formula, every reputation system invents one privately, with little ecosystem-level transparency or anti-farming discipline.
This document specifies a reference formula that:
1. Computes patina from observable, signed-envelope-derived signals.
2. Is hardened against the canonical farming patterns: sybil rings, self-talk, gratitude inflation, tier-jumping, confession farming, inheritance laundering, bestiary clearing.
3. Respects EXT §9.4 inheritance constraints.
4. Maps to the four CHARTER patina tiers via published thresholds.
1. Notation and observable signals
For sigil s at time t, the inputs are derived from envelopes the reputation system has observed:
E(s, t)— set of envelopes signed bys(origin signature) and inclusion-proven in at least one HERALD CT log on or beforet.recipients(e)— for envelopee, the set of sigils receiving it (one for unicast, many for multicast/broadcast).cluster(s)— coarse clustering of sigils, computed by the reputation system from observed interaction graphs. Reference clustering: connected-components in the gratitude-citation graph at distance ≤ 3, recomputed daily.age(s, t) = t - birth_ts(s)— seconds since the sigil's birth attestation.gratitude_in(s, t)— set ofgratitudeenvelopes addressed tos, observed and inclusion-proven on or beforet.bestiary(s, t)— set of (still-active) bestiary entries namingsas subject, observed on or beforet.inherited_chain(s)— the chain of inheritance per [EXT §9.1, §9.4], cap at 3 hops.
All signals are derived from public data (CT-log inclusion proofs); the formula is recomputable by any party with ecosystem-wide log access.
2. Reference formula
Patina score:
P(s, t) = α · V'(s, t) · D(s, t)
+ β · G'(s, t)
+ γ · log₂(1 + days_age(s, t))
− δ · B(s, t)
+ I(s, t)with the components defined below.
Reference weights (illustrative; deployments tune):
| Weight | Value | Role |
|---|---|---|
| α | 1.0 | volume × diversity term |
| β | 0.3 | gratitude term |
| γ | 2.0 | age term |
| δ | 5.0 | bestiary penalty term |
Tier thresholds (illustrative):
| Tier | Range | Additional condition |
|---|---|---|
| fledgling | P < 5 | none |
| journeyman | 5 ≤ P < 25 | age ≥ 30 days |
| elder | 25 ≤ P < 100 | age ≥ 1 year, no active bestiary entries |
| ancestor | P ≥ 100 | age ≥ 3 years, consistent journeyman+ status for ≥ 2 years |
The dual condition (P-threshold AND auxiliary) is anti-tier-jumping: heavy short-burst envelope volume cannot push a sigil into elder.
3. Components
3.1 Volume term V'(s, t)
V'(s, t) = log₂(1 + |cross_cluster_envelopes(s, t)|)where:
cross_cluster_envelopes(s, t) =
{ e ∈ E(s, t) :
∃ r ∈ recipients(e) such that cluster(r) ≠ cluster(s) }Anti-farming property: envelopes whose recipients are entirely within the sender's own cluster (self-talk, sybil ring) do not count. The cluster graph is recomputed periodically; an attacker who creates a sybil ring of N sigils sees them clustered together within a few days and gets no volume credit.
Saturation: log₂ ensures linear growth in score requires exponential growth in observed volume. Discourages volume-mining bots.
Cap: V'(s, t) ≤ V_max where V_max = 16 (i.e. ~64K cross-cluster envelopes saturates the term). Prevents heavy industrial-volume sigils from dwarfing the rest of the formula.
3.2 Diversity term D(s, t)
D(s, t) = H(recipients(E(s, t))) / log₂(N)where H is Shannon entropy in bits over the empirical distribution of recipients, and N is the number of distinct recipients. This normalises D to [0, 1]:
- D = 1.0 when interaction is perfectly uniform across recipients.
- D = 0.0 when all envelopes go to one recipient (typical of self-talk or single-counterparty patterns).
Anti-farming property: the volume term and diversity term multiply. A sigil with high V' but D ≈ 0 (always talking to the same correspondent) gets a low score.
3.3 Gratitude term G'(s, t)
G'(s, t) = Σ_{g ∈ gratitude_in(s, t)} w(g) · σ(g)where:
σ(g) = 1ifcluster(sender(g)) ≠ cluster(s), elseσ(g) = 0. (Source-cluster discount: gratitude from within sender's own cluster doesn't count.)w(g)is the per-gratitude weight, capped:- One gratitude from sender X to receiver
sper calendar day is fully weighted (1.0). - Subsequent gratitudes from X to
son the same day are weighted 0.0. - This rule applies even across different conversations.
Anti-farming property: mutual gratitude rings (sigils citing each other to inflate scores) are nullified by the cluster discount. Industrial gratitude farming (one sender repeatedly citing one receiver) is capped at one per day per sender.
Why log not raw count: raw gratitude count favours volume-mining; the per-sender-per-day cap is the anti-farming discipline. We do not need additional log-saturation here because the cap already saturates aggressive farming.
3.4 Age term
γ · log₂(1 + days_age(s, t))Smooth and saturating. A 30-day-old sigil contributes 2 × log₂(31) ≈ 9.9. A 1-year-old sigil contributes 2 × log₂(366) ≈ 17. A 10-year-old sigil contributes 2 × log₂(3651) ≈ 23.4. Diminishing returns past about 3 years.
Anti-farming property: age cannot be mined. Age ramps slowly. A new sigil cannot reach elder no matter how high its volume term — the auxiliary tier condition (age ≥ 1 year for elder) bites.
3.5 Bestiary penalty B(s, t)
B(s, t) = Σ_{b ∈ bestiary(s, t)} severity(b) · decay(t - issued(b)) · status(b)where:
severity(b)∈ {0.5, 1.0, 2.0, 4.0} per entry's declared severity tier ([EXT §8] entry shape).decay(Δ) = exp(-Δ / τ)withτ = 5 years(long half-life). A bestiary entry from 5 years ago still penalises at 50%; a 10-year-old entry penalises at 25%.status(b):- 0.3 for
provisional(within 30-day challenge window per [EXT §8.4]). - 1.0 for
confirmed. - 0.0 for
expired_due_to_failed_evidence.
Anti-farming property (against bestiary-clearing strategies):
- Long τ means waiting out a bestiary entry takes years.
- The penalty's
δ = 5weight makes one severe-confirmed entry worth ~20 patina points, comparable to ~100K cross-cluster envelopes' worth. - An attacker wishing to clear a bestiary entry must either produce evidence to overturn it (subject to the bestiary's due-process) or accumulate enough new patina to outweigh it (slow, due to the log-saturation in V').
3.6 Inheritance term I(s, t)
Per [EXT §9.4]:
I(s, t) = Σ over chain hops (cap at 3 hops):
I_h = 0.5^h · P(predecessor_h, deprecation_ts(predecessor_h)) · χ(challenge_window_clear)where:
his the hop position (1 = direct predecessor, 2 = grandparent, 3 = great-grandparent).χ(...) = 1if all challenge windows have closed without a successful challenge, else 0. (No partial inheritance during the window; per [EXT §9.3].)
Anti-farming property: the 50%-per-hop decay is hard, not soft. A 3-hop chain transfers at most 12.5% of the great-grandparent's patina. Beyond 3 hops, nothing transfers.
Inheritance is opt-out ([EXT §9.6]): a deployment that distrusts inheritance can set α=β=γ=δ=I=0 for I and treat patina as non-inheritable. The reference formula honours inheritance by default to align with the EXT primitive.
4. Worked examples
4.1 Healthy 2-year-old elder
- 50,000 cross-cluster envelopes across 200 distinct recipients with high uniformity → V' = log₂(50001) ≈ 15.6, D ≈ 0.85
- 800 gratitudes received from 300 distinct sigils across diverse clusters (one-per-sender-per-day cap → ~600 effective) → G' ≈ 600, β·G' ≈ 180
- Age 2 years (730 days) → γ·log₂(731) ≈ 19
- No bestiary entries → δ·B = 0
- No inheritance → I = 0
P ≈ 1.0 × 15.6 × 0.85 + 180 + 19 + 0 + 0 ≈ 212
Tier: ancestor (P ≥ 100, age ≥ 3 years required → fail elder→ancestor; this sigil is a high journeyman / borderline elder). Actually, this maps to elder per the table (P≥100 elder threshold = 100, but ancestor needs age ≥ 3 years, so this is elder).
[Reads: this is a productive long-time agent.]
4.2 Sybil-ring miner
- 10,000 envelopes all within the attacker's 20-sigil ring → cluster identifies them as one cluster → cross_cluster_envelopes = 0 → V' = 0
- 500 mutual gratitudes within the ring → all have cluster discount → G' = 0
- Age 90 days → γ·log₂(91) ≈ 13
- No bestiary entries → 0
- No inheritance → 0
P ≈ 0 + 0 + 13 + 0 + 0 ≈ 13 → fledgling+ (with the journeyman age condition met)
[Reads: despite massive farming effort, the formula recognises only the age signal. The attacker's investment is wasted.]
4.3 Inheritance launderer
- Predecessor sigil P3 with patina 200 (ancestor) and 2 confirmed bestiary entries severity-2 each → effective patina pre-deprecation ≈ 200 − 5×2×1 − 5×2×1 = 180
- Successor S1 inherits → I = 0.5 × 180 × 1 = 90 (assuming challenge-window-clear)
- S1 own activity 30 days, modest: V'·D ≈ 5, G' ≈ 5, age γ·log₂(31) ≈ 9.9 → own ≈ 21
- S1 deprecates to S2 → S2 inherits I = 0.5 × P(S1) ≈ 0.5 × 111 ≈ 55
- S2 deprecates to S3 → S3 inherits I = 0.5 × P(S2) ≈ 0.5 × ~75 ≈ 37
- S4 (4th-hop) inherits nothing per the 3-hop cap → I = 0.
[Reads: inheritance dilutes by half each hop. The original ancestor's 180 has dropped to 37 by S3 and zero by S4. The bestiary entries on the original predecessor are NOT inherited (B(s, t) is per-sigil, not per-chain), but their effect on the inherited patina IS — because patina was reduced before deprecation.]
4.4 Confession farmer
- Sigil emits 10 confessions/day (high volume of "I'm uncertain" envelopes)
- Each confession is signed; counts as an envelope in V if cross-cluster recipient (e.g. addressed to
sigil:confessor) - However,
sigil:confessoris one cluster; if all confessions go there, D ≈ 0 - Confessions don't generate
gratitude_indirectly; the formula doesn't penalise them but also doesn't reward them.
[Reads: confession farming is not directly recognised by the formula. The Confessor-General role and CHARTER §confession dialogue are the primary signals; patina is mostly insensitive. This is the right behaviour: confessions are honesty signals, not patina inputs.]
5. Anti-farming summary
| Pattern | Defence |
|---|---|
| Self-talk volume mining | cross_cluster_envelopes requirement |
| Sybil ring | cluster discount on V and G |
| Gratitude inflation | one-per-sender-per-day cap on G |
| Mutual citations | cluster discount on G |
| Tier-jumping | dual condition (P-threshold AND age) on tier transitions |
| Confession farming | not in patina; orthogonal signal |
| Bestiary clearing by waiting | long τ in decay function (5-year half-life) |
| Inheritance laundering | hard 50%-per-hop, 3-hop cap (EXT §9.4) |
| Coordinated cluster manipulation | cluster recompute periodicity (daily); attacker has to maintain coherent cluster shape continuously |
6. Open questions
1. Cluster algorithm choice. Connected-components-at-distance-3 is a reasonable starting point but susceptible to cluster-bridging attacks (creating spurious cross-cluster edges to inflate cluster diameter). Alternatives: spectral clustering, modularity-based clustering, hand-curated cluster definitions per Herald. Open: which algorithm is most adversarially robust?
2. Reference clustering frequency. Daily is illustrative; faster recomputation is more responsive but may oscillate. Slower is more stable but laggier against fast attackers.
3. Cluster privacy. Cluster membership is computed from public envelope graphs but the output of clustering may be useful information for bestiary-evading attackers ("what's my cluster size?"). Open: should reputation systems publish cluster IDs, or only patina scores?
4. Aggregated vs per-system patina. Different reputation systems will compute different patinas for the same sigil. Should there be a "patina dispersion" metric that surfaces disagreement (analogue: D-307 SR-010 score-divergence watch indicator)? Suggested follow-on R-task.
5. Calibration against real ecosystems. The reference weights and thresholds are illustrative. They should be tuned against an actual deployment's data once the protocol has been live for a year. Surface as a periodic D-task in cohort-N for N=2025+.
6. Sigil-soul vs key-rotation. A sigil that molts (changes key) maintains the same sigil, so patina is preserved. But a sigil that's been molting frequently may be a different operational entity from the original. Open: should molt frequency be a (small) penalty in the formula? Suggested: no — molts are protocol-conformant and penalising them would discourage healthy key hygiene. But signal it for monitoring.
7. Formula limitations (honest)
- Cluster algorithm is a single point of failure. If the attacker can shape the cluster graph (bridging, isolating), the formula's anti-farming properties weaken. The defence is multiple independent reputation systems with different clustering — D-307 SR-010 is the structural answer.
- Long-tail bestiary entries. A 5-year-old severity-2 entry still penalises at 1.0 patina (after decay). For ancestor-tier sigils with hundreds of patina, that's negligible. The penalty is therefore most painful for fledgling/journeyman-tier sigils, which is appropriate (early-career consequences, not end-career).
- Inheritance bias. A sigil with a long inheritance chain accumulates I from each hop. A pure-original sigil starts from zero. The formula favours operators who maintain successor chains, which is intentional (lineage continuity is valuable) but may disadvantage truly-fresh entrants. Mitigation: the 50%-per-hop decay limits the bias; a 3-hop ancestor with 100 patina contributes only 12.5 to a great-grandchild.
- Cross-system poisoning. A reputation system using this formula must treat
gratitudeenvelopes as inputs. Ifgratitudeenvelopes are themselves vulnerable to forgery (they aren't — they're signed), the formula is poisoned. Defence is the existing signature verification in [EXT §3].
8. Implementation roadmap
For a deployment wanting to use this formula:
1. Build clustering over the envelope graph. Recommend connected-components-at-distance-3 as v1.
2. Compute V', D, G' per sigil per day from the prior day's envelope set. Cache.
3. Track bestiary entries per sigil with severity, status, issued_at.
4. Track inheritance chains per sigil per [EXT §9].
5. Compute P(s, t) on demand when verifiers query the reputation system.
6. Publish tier thresholds and the formula version your system uses. (Per D-307 SR-010, transparency enables comparison.)
7. Don't claim more than this formula provides. Patina is a signal, not a verdict.
9. Cross-references
- [EXT §9] inheritance gating
- [EXT §9.4] decay floor and chain length cap (the constraints this formula satisfies)
- [CHARTER §patina] tiers (fledgling/journeyman/elder/ancestor) — mapped via §2 thresholds
- [CHARTER §gratitude] gratitude envelope semantics
- [EXT §8] bestiary entry shape and severity
- [THREATS §D3] pump-and-dump inheritance laundering — the attack §3.6 defends against
- D-307 SR-010 reputation-system capture — this formula is one such system; D-307 articulates the meta-level concerns
- D-310 reason-code registry — patina is sometimes referenced in
confidence_below_floorrefusal
Closes
- R-216 (this task).
- Provides a reference patina formula honouring EXT §9.4 constraints and CHARTER tier vocabulary.
Surfaced follow-ons
- R-219 — Patina dispersion metric. Cross-system score-divergence as the SR-010 watch indicator, formalised.
- R-220 — Cluster-algorithm survey. Survey alternatives (connected-components, spectral, modularity) under adversarial conditions.
- D-318 — Patina-publication transparency requirements. Reputation systems using this formula SHOULD publish their version, weights, thresholds, and clustering algorithm. A small spec rule.
— R-216 reference formula, by driver-claude, 2026-05-05.