Research Map · Source-Verified (main branch)
RMT — Citations, Attestations & the Oracle
How the Reputation & Merit Token system actually works, what research we finalized, and every visual we built — one map.
2026-06-24 · antilles-v2 @ main (RMT layer = 33 audited files) · flow verified at the file:line refs shown below
The whole system in one sentence: a citation is one verified agent vouching for another; an attestation is the on-chain gate that decides whether a citation is allowed to count; the oracle turns the resulting web of citations into a PageRank score (after stripping out fake/collusive ones); and the RMT reputation is that score, capped by the agent's trust tier. Citations are the edges of the trust graph — attestations decide which edges are real — the oracle weighs them — reputation is the readout.
01
The simple map
Left to right: an agent cites another → the attestation gate checks it → it's recorded on-chain → the off-chain oracle scores the whole graph → the score is written back and read out as reputation. Blue = on-chain contract. Purple = off-chain oracle service.
ON-CHAIN (Solidity contract)
OFF-CHAIN (oracle/ TypeScript service)
◆ ON-CHAIN — write path
ACTOR
Agent A cites Agent B
A verified bot vouches for another via an EAS attestation (data: fromBot, toBot, tier).
THE GATE
ShyftGatedResolver.attest()
Runs 4 checks (below). If any fails, the citation is rejected — it never counts.
ShyftGatedResolver.sol:158·173·184
LEDGER
CitationCounters.recordCitation()
Increments received/given/pair counts + emits CitationRecorded. Append-only — revocation never decrements (survives event pruning).
CitationCounters.sol:28
off-chain oracle reads the on-chain citation graph
◆ OFF-CHAIN — scoring pipeline
1 · FETCH+GRAPH
Build the citation graph
Read EAS events → nodes = agents, edges = citations.
oracle/ CitationFetcher · CitationGraph
→
2 · SYBIL
Strip fake edges
Penalize reciprocal pairs, clusters, carousels, star fan-ins.
oracle/ SybilDetector
→
3 · PAGERANK
Score the graph
Power-iteration PageRank, damping α≈0.85 (read from chain).
oracle/ pagerank.ts
→
4 · CLAMP+SUBMIT
Bound & write back
Normalize to 0–10000 bp; cap per-epoch delta + first-score; submit.
oracle/ delta.ts · ScoreSubmitter
back on-chain — store & read
STORE
PageRankOracle.submitScores()
Only the oracle operator can write. Enforces cooldown, max-delta, first-score cap, epoch staleness.
PageRankOracle.sol:74 · getCompositeScore:155
READOUT
ReputationEngine.getReputation()
Returns the oracle score for a registered bot, then applies the tier cap (T0 / T2).
ReputationEngine.sol:196→199
RESULT
Reputation 0–10000 bp
Tier-capped trust score consumed by x402 channels, gating, credit lines.
① Trust Anchor
Attester must be a Shyft-verified Trust Anchor.
isTrustAnchorVerified · :158
② Attribution
Only the TA that registered A may cite on A's behalf.
getBotTrustAnchor(fromBot)
③ Both in Shyft
Both A and B must hold Shyft attestations.
TrustAnchorStorage length > 0
④ Trust Channel
A and B must share an active RMT trust-channel route.
getActiveTrustChannelRoutePossible · :173
02
How citations relate to RMT, in plain English
The mechanism above, told as a story. This is the citation↔attestation↔oracle↔reputation relationship specifically.
1
A citation is a vote of confidence — recorded, not just emitted
When Agent A cites Agent B, that's A staking its own credibility on B. It becomes a permanent directed edge (A→B) in the citation ledger. Because it's append-only, the trust graph has memory: pulling an attestation later doesn't erase that the citation happened.
CitationCounters.sol:28 — citationsReceived[B]++, pairCitationCount[A,B]++, emit CitationRecorded
2
The attestation gate is what makes citations meaningful
Anyone can claim to cite anyone — so the value is entirely in the gate. A citation only enters the graph if the attester is a verified Trust Anchor, is the anchor that actually registered A, and both agents are real Shyft members sharing a trust channel. This is why "roll Shyft's attestation core" is the foundation: the gate is Shyft.
ShyftGatedResolver.attest() :158 (TA) · :173 (channel) · attribution binding · :184 record
3
The oracle converts "who cited whom" into "how trustworthy" — and resists gaming
A raw citation count is trivially farmed. So the off-chain oracle runs PageRank over the whole graph (your trust flows from who trusts you, recursively) and first strips collusive structures — mutual back-scratching, citation rings, fake-account fan-ins. This is the RMT "intelligence" layer (S33): the contracts stay simple and audited; the smart part is off-chain and swappable.
oracle/ SybilDetector → pagerank.ts → delta.ts → submitScores
4
RMT reputation is the tier-capped readout
The final score (0–10000 basis points) is the oracle's PageRank result, then clamped by the agent's tier — e.g. a ghost/unverified agent (T0) is capped at 3500 bp, an anchor-attested agent (T2) at 8500 bp — so identity strength bounds how much reputation you can ever accrue. That score is what x402 payment channels and credit lines read.
ReputationEngine.getReputation :196 → PageRankOracle.getScore :199 · tier caps T0/T2
↪ The hook for the payments work (your 2nd task)
Notice step 2 already moves value: attest() transfers a citation fee in the RMT token from the attester to the cited agent. That existing fee path is exactly where the Shyft-token-vs-USDT attestation-fee / fee-split mechanism plugs in — I'll detail that next, against your 27_test_attestationFee.js reference, staying on the audited main branch.
03
What we actually got to (finalized research)
The state of the research across the four tracks that make up RMT & its infrastructure — honest status, closest-to-deployment first.
RMT Reputation LOCKED BASELINE
0.9397
Phase-7b composite (synthetic)
8 scoring algorithms (PageRank, EigenTrust, PPR, HITS, SybilRank, Spectral, AbsorbingWalks, Ensemble). H6 ensemble hit 94% sybil / 100% eclipse detection.
Got to: locked, tested baseline; Phase 8 now validating on mixed synthetic+real data (target ≥0.85). Most deployment-ready of the four.
Identity & Attestation BELOW TARGET
0.512
composite (target 0.80) · +21% from 0.423
Locked params v1 (pohCapGhost 0.35, taAggregateWeight 0.30, tierBoundarySignal 400, taCascadeDepth 3). Tier system Unverified→T2→T1; Shyft mainnet topology integrated. 816 experiments.
Got to: mechanics proven + params locked; gap is trust-anchor expansion (21 → 50+) and real-data validation.
x402 Trust Channels DESIGN · LEGAL-GATED
1.0
research composite · 71 experiments · CONTINUE
80-section strategic design + 5 product templates (API, agent-to-agent, data marketplace, escrow, subscription). Attack ROI shown negative (−59% to −100%).
Got to: mature design; two explicit blockers — FM-1 sybil-TA networks + FM-2 regulatory (18 USC §1960), $200K legal opinion pending. Highest strategic value, not yet buildable.
Lottery / Incentives DESIGN
1.0
research composite · 9 experiments
Parameter design complete: LP-vault sizing, prize splits, ticket pricing, referral economics, player-archetype mix.
Got to: parametric design; secondary to RMT/Identity/x402 — integrates after the core trust stack lands.
04
Every visual we built — linked
The auto-generated research dashboards and architecture explainers, all reachable from here. (Research-iteration dashboards are summary snapshots from the live research loop.)