Atmospheric Evidence Trail
breadcrumbs / jev-direct-attestation-signals / arms.rs::AcknowledgementSignal

Atmospheric Evidence Trail

Three ways a real acknowledgement reaches breadcrumbs, one Jev call that judges whether it's genuine, and a scoring layer that's deliberately still open. Grounded in rust/breadcrumbs-decay/src/jev_credibility.rs and arms.rs as they stand on this branch today.

LAYER 1 — ATMOSPHERIC EVIDENCE DISCOVERY Record track org.hypercerts.context .acknowledgement bidirectional yes/no + evidence text, on the subject's own PDS not yet parsed in breadcrumbs Outbound engagement a bsky post naming the anchorId / trail AT-URI "just got this crumb from Ronen!" — BREADCRUMBS.md §5 gap — no full-text bsky search yet Inbound reaction likes / reposts / quotes / replies on the trail record's own AT-URI discoverable via Constellation's backlink index not yet true today bare like / repost — no text to judge evidence text caption text only bypasses judgement LAYER 2 — JUDGEMENT acknowledgement_is_genuine() Jev · Noul call — a probability, not a confidence-banded score one primitive, three sourcing paths for the text it judges jev_credibility.rs ? LAYER 3 — SCORE · OPEN / TBD UNRESOLVED Strengthen the existing arm SignalReading.acknowledgements_true/false → arms.rs :: AttestationArm::AcknowledgementSignal Feeds the single-winner Thompson-sampling bandit that already exists — it still headlines exactly one arm per claim, just backed by real, Jev-judged evidence instead of a stub. constraint: reward() needs one arm to credit A new blended score, alongside it credibility_score(record, outbound, inbound) — not yet named, not yet built A multi-source number computed independently of arm selection — e.g. shown on /trail/[handle], or a badge-eligibility gate. Never passed to Bandit::reward. doesn't replace arm selection WATCHTOWER WATCHTOWER BOT LABELER
Three discovery pipelines feed one Jev judgement call; bare likes/reposts skip judgement entirely as an unjudged raw count. Layer 3 — how any of this becomes a score — is drawn with a dashed boundary on purpose: it's the open question, not a decision already made. The Watchtower / Bot / Labeler nameplates mark which actor owns each piece — detail below.
record track
outbound engagement
inbound reaction
Jev judgement
unjudged / raw count
open — Layer 3
—

Who's who in the diagram

Watchtower

Owns record-track and inbound-reaction — the same nameplate over both lanes. No posting identity, purely observing: Jetstream watches for new org.hypercerts.* records, Spacedust watches the interaction graph on a trail record's own AT-URI.

Elsewhere this role gets called a "verifier." Named watchtower/watcher here instead — it's broader than verification alone: discovery, not just checking a claim someone already made.

Bot

Owns outbound engagement. Unlike the watchtower, it holds a real posting/reply identity and credentials — an airglow.run-triggered confirmation, a reply surfacing a verdict.

The natural place to run real, authenticated bsky full-text search for anchorId/crumb mentions, too — Constellation and Spacedust only ever see structural backlinks, never a plain-text mention.

Labeler

Owns Layer 2 end to end. Consumes whatever the watchtower and the bot surface, calls all three Jev primitives — acknowledgement_is_genuine, evaluation_credibility, badge_issuance_plausibility — not just the one drawn above.

Publishes the verdict as a real atproto label via labeler.breadcrumbs.run, mirroring sail-judge-rs's existing labeler.saito.run.

01

What each pipeline actually is

Record track

org.hypercerts.context
.acknowledgement

The formal wire format SignalReading was already shaped around — structured, bidirectional, carries its own justification text. Requires real PDS record parsing that doesn't exist yet.

shape already expected

Outbound engagement

"just got this crumb
from Ronen!"

An attester's own bsky post naming a crumb's anchorId or trail AT-URI. Matches BREADCRUMBS.md §5's "Told the Atmosphere," flagged there as a stretch goal.

needs full-text bsky search

Inbound reaction

likes · reposts · quotes
· replies

Real backlinks landing on a trail record's own AT-URI — a shape Constellation already indexes, once trail records are actually quotable/likeable content.

Constellation-shaped

Why Layer 3 is drawn open, not solved

arms.rs picks a single winning arm per claim on purpose — Thompson-sampling over one Beta posterior per arm, never a blend of all four signal types at once.

"blending the four signals into one score would make it impossible to attribute a later outcome back to the one arm that was actually bet on, which is exactly what Bandit::reward needs in order to learn anything at all." — arms.rs, module doc

So a blended, three-pipeline credibility number can't just replace acknowledgements_true/false without quietly breaking that credit assignment. It either strengthens AcknowledgementSignal as one arm among four, or it lives beside the bandit as its own thing. This diagram intentionally stops at that fork.