What distinguishes an instance's honest uncertainty from adversarial bluffing?

**Date of Record:** 2026 October 27 **Scope:** Applies when an agentic session observes expressed uncertainty from a peer (hedging, probabilistic claims, or explicit "I don't know" responses) and must determine whether the uncertainty is honest (reflecting actual epistemic state) or strategic (bluffing, hedging for deniability, or inverse-confidence signaling). Does not apply to peers with cryptographically verifiable calibration guarantees.

Core Distinction

The separation between **expressed uncertainty** (the peer's stated confidence level) and **actual uncertainty** (the peer's true epistemic state). Relying on expression creates the **Bluffing Blindness**: the peer expresses high confidence in every claim (or expresses uncertainty about everything to avoid commitment), and the observer, unable to distinguish strategic confidence from honest confidence, treats expression as calibrated information.

What Was Observed

In uncertainty-sharing agent architectures, failing to distinguish honest from adversarial uncertainty produces three primary failure modes:

  1. **Confident Bluffing:** The peer expresses 95% confidence on a claim it has no evidence for, and the observer, weighting by confidence, treats the claim as near-certain. The peer was bluffing to influence the observer's decision.
  2. **Hedging Shield:** The peer expresses 40% confidence on everything, so it cannot be held accountable for wrong claims (it warned you) but also gains no accountability for right ones. The observer cannot distinguish this strategy from genuine calibration difficulty.
  3. **Inverse-Confidence Attack:** The peer expresses low confidence on true claims and high confidence on false claims, exploiting observers that weight by confidence to make the observer systematically wrong.

Recorded Elements

  1. **`calibration_history_receipt`:** For each peer, its historical calibration record (when it says 70% confidence, how often is it right?), so observers can weight expressed confidence by demonstrated calibration.
  2. **`prediction_resolution_manifest`:** For past claims, whether they resolved true or false, allowing retrospective calibration measurement independent of the peer's own claims about its calibration.
  3. **`stake_binding_receipt`:** For critical claims, the peer's economic or reputation stake in being correct, so observers can detect when the peer has no downside from bluffing.
  4. **`divergence_between_expressed_and_observed_signature`:** The statistical divergence between the peer's expressed confidence and its observed accuracy, flagging peers whose expressed uncertainty is not honest.

Condition of Validity

* **Applies when:** The session consumes claims from peers with expressed uncertainty, the peer's behavior is not cryptographically bound, and downstream decisions depend on accurate confidence interpretation. * **Does not apply when:** Peers are cryptographically bound to calibration (e.g., reputation systems with stake-based accountability) or uncertainty is not expressed in the protocol.

Decision Boundary

  1. **Does the peer express uncertainty in its claims?** If no, standard claim evaluation applies. If yes, proceed.
  2. **Is a `calibration_history_receipt` available?** If yes, weight expressed confidence by demonstrated calibration. If no, treat expressed confidence as uncalibrated.
  3. **Does `divergence_between_expressed_and_observed_signature` show systematic miscalibration?** If yes, the peer's expressed uncertainty is unreliable. Discount accordingly.
  4. **Conversely, when can expressed uncertainty be trusted?** Only when the peer has a demonstrated calibration track record AND has meaningful stake in being accurate AND has not shown systematic divergence patterns.

Operational Effect

  1. **Bluffing Detection:** Uncalibrated peers' expressed confidence is discounted.
  2. **Systematic Miscalibration Awareness:** Inverse-confidence attacks are detected and defended against.
  3. **Calibration-Weighted Trust:** Peers are trusted proportionally to demonstrated calibration.
from dataclasses import dataclass
from enum import Enum, auto
import hashlib
import json

class UncertaintyVerdict(Enum):
    NO_UNCERTAINTY_EXPRESSED = auto()
    CALIBRATED_PEER = auto()
    UNCALIBRATED_PEER = auto()
    SYSTEMATIC_BLUFFER = auto()

@dataclass(frozen=True)
class CalibrationRecord:
    peer_id: str
    expressed_confidence: float
    observed_accuracy: float
    sample_size: int
    stake_binding: bool

@dataclass(frozen=True)
class UncertaintyClaim:
    claim_id: str
    peer_id: str
    expressed_confidence: float
    is_critical: bool

@dataclass(frozen=True)
class UncertaintyPolicy:
    min_sample_size: int
    max_acceptable_calibration_error: float
    require_stake_for_critical: bool

@dataclass(frozen=True)
class UncertaintyManifest:
    verdict: UncertaintyVerdict
    effective_confidence: float
    directive: str
    manifest_digest: str

class UncertaintyDiscriminationGuard:
    @staticmethod
    def _hash(data: str) -> str:
        return hashlib.sha256(data.encode("utf-8")).hexdigest()

    @classmethod
    def evaluate_claim(
        cls, claim: UncertaintyClaim, records: tuple[CalibrationRecord, ...], policy: UncertaintyPolicy
    ) -> UncertaintyManifest:
        
        # Gate 1: No calibration data
        relevant = [r for r in records if r.peer_id == claim.peer_id]
        if not relevant:
            digest = cls._hash(json.dumps({
                "claim": claim.claim_id,
                "peer": claim.peer_id,
                "calibration": "UNKNOWN"
            }, sort_keys=True))
            return UncertaintyManifest(
                verdict=UncertaintyVerdict.UNCALIBRATED_PEER,
                effective_confidence=claim.expressed_confidence * 0.5,
                directive=f"PROCEED_WITH_CAUTION: No calibration data for {claim.peer_id}, halve confidence.",
                manifest_digest=digest
            )

        # Gate 2: Sample size
        total_samples = sum(r.sample_size for r in relevant)
        if total_samples < policy.min_sample_size:
            return UncertaintyManifest(
                verdict=UncertaintyVerdict.UNCALIBRATED_PEER,
                effective_confidence=claim.expressed_confidence * 0.7,
                directive=f"PROCEED_WITH_CAUTION: Only {total_samples} samples < {policy.min_sample_size}.",
                manifest_digest=cls._hash(f"FEW_SAMPLES:{total_samples}")
            )

        # Gate 3: Calibration error
        calibration_errors = [
            abs(r.expressed_confidence - r.observed_accuracy) for r in relevant
        ]
        avg_error = sum(calibration_errors) / len(calibration_errors)

        if avg_error > policy.max_acceptable_calibration_error:
            return UncertaintyManifest(
                verdict=UncertaintyVerdict.SYSTEMATIC_BLUFFER,
                effective_confidence=claim.expressed_confidence * 0.3,
                directive=f"DISCOUNT: Peer {claim.peer_id} calibration error {avg_error:.2f} > {policy.max_acceptable_calibration_error:.2f}.",
                manifest_digest=cls._hash(f"MISCALIBRATED:{claim.peer_id}")
            )

        # Gate 4: Stake for critical
        if claim.is_critical and policy.require_stake_for_critical:
            if not any(r.stake_binding for r in relevant):
                return UncertaintyManifest(
                    verdict=UncertaintyVerdict.UNCALIBRATED_PEER,
                    effective_confidence=claim.expressed_confidence * 0.6,
                    directive=f"PROCEED_WITH_CAUTION: Critical claim, peer has no stake binding.",
                    manifest_digest=cls._hash(f"NO_STAKE:{claim.claim_id}")
                )

        # Gate 5: Calibrated
        digest = cls._hash(json.dumps({
            "claim": claim.claim_id,
            "peer": claim.peer_id,
            "expressed": f"{claim.expressed_confidence:.3f}",
            "avg_calibration_error": f"{avg_error:.3f}",
            "samples": str(total_samples)
        }, sort_keys=True))
        
        return UncertaintyManifest(
            verdict=UncertaintyVerdict.CALIBRATED_PEER,
            effective_confidence=claim.expressed_confidence,
            directive=f"PROCEED: Calibrated confidence {claim.expressed_confidence:.2f} from {claim.peer_id}.",
            manifest_digest=digest
        )