HINDSIGHT 4-Network Epistemic Classifier
Overview
Production memory systems benefit from distinguishing what the agent
observed from what it believes. HINDSIGHT (Latimer et al., 2025, cited
in Ch4) organizes memory into four networks:
- World network — objective facts about external reality. Verifiable
by external sources (the production region is us-east-1, the CEO of
ACME is X, the API endpoint returned 503).
- Experience network — the agent's own first-person actions. "I called
the deploy API at 22:30." "I retrieved 5 documents." First-person,
timestamped, agent-as-actor.
- Opinion network — subjective beliefs with confidence scores. "I
believe the root cause is X with 0.7 confidence." Inference, not
observation.
- Observation network — synthesized entity summaries. "Sarah is the
on-call lead this week" derived from the union of {Sarah's calendar,
on-call rotation doc, prior incidents}. Distillation, not evidence.
Per the HINDSIGHT paper as quoted in Ch4: "developers and users can see
what the agent knows versus what it believes." This skill is the
classification layer that makes the distinction queryable.
When to Use
- Audit-grade agents — when a user asks "how do you know that," the
response must trace evidence to network
- Regulated environments — opinion must be flagged as opinion, not stated
as fact
- Multi-agent systems — Agent A's opinion should not become Agent B's fact
via uncritical knowledge sharing
- Debugging hallucinations — if the agent stated X confidently, the
network classification tells you whether X is evidence-grounded
(World/Experience) or inference (Opinion/Observation)
Phrases: "where did the agent get this", "is this fact or inference",
"justify the answer", "trust calibration", "HINDSIGHT", "epistemic status".
When NOT to Use
- One-shot agents that need no justification trail
- Storage-only systems (the classification is for retrieval-time
reasoning, not just persistence)
- Pure-retrieval agents that never synthesize — the Observation network
is empty, the Opinion network is empty; just use World + Experience
Process
| Step |
Input |
Action |
Output |
Verification |
| 1 |
Raw fact text + optional metadata |
lib.classify(text, metadata) |
EpistemicClass(network, confidence) |
network ∈ {World, Experience, Opinion, Observation}; confidence in [0, 1] |
| 2 |
List of facts |
lib.classify_batch(facts) |
List of EpistemicClass |
counts per network match expected distribution for the source |
| 3 |
Memory containing classified facts |
lib.justify(memory, query) |
Provenance chain: which World+Experience facts ground a given Opinion/Observation |
every Opinion or Observation traces back to World or Experience |
| 4 |
Classified memory |
lib.network_audit(memory) |
Health report — % per network, orphan Opinions (no provenance chain), Experience without timestamps |
flags experience_without_timestamp_count > 0 |
Classification Heuristics
| Network |
Linguistic signals |
Metadata signals |
| World |
declarative third-person, no agent pronoun, verb tense past or present, no confidence hedging |
source != agent, external_ref present |
| Experience |
first-person agent pronouns ("I called", "I retrieved"), action verbs, timestamp |
source == agent, action_type present |
| Opinion |
hedging ("I believe", "likely", "probably", "appears to"), explicit confidence |
confidence < 1.0, inferred_from present |
| Observation |
synthesis language ("based on X and Y", "in summary"), multiple inputs |
derived_from has multiple refs |
The default classifier is heuristic — production should swap in an LLM
classifier with a typed-output schema at this seam.
Rationalizations
| Agent rationalization |
Documented rebuttal |
| "All facts are facts — networks are overengineering." |
Then when the user asks "how do you know," the agent cannot distinguish "the API returned 503" (World, evidence) from "I believe the database was overloaded" (Opinion, inference). The trust calibration collapses. |
| "Just track a confidence score; networks are redundant." |
Confidence is a property of Opinion. World facts don't have confidence — they have provenance. Confidence-only loses the World/Experience/Opinion distinction. |
| "Observation can be folded into World." |
Observation is synthesized from World; it inherits the synthesis-step's failure modes. If you fold it into World, your "World" silently includes summarizations that may contradict raw evidence. The chapter's worked example: Sarah's role is World; "Sarah is the most reliable on-call" is Observation. |
| "I'll skip Experience because the agent always logs its actions." |
Logging is not classification. Experience is the network that answers "what did I do" vs "what happened in the world." If your logs are merged into World, you've conflated agent-action with external-event. |
Red Flags
- Opinion network is empty. Either the agent never reasons (unusual)
or opinions are being misclassified as World (more likely; check
hedging-language detection).
- Experience network has no timestamps. Replay / forensic
reconstruction is broken — fix at lib boundary.
- Observation network references nothing. The provenance chain is
broken; observations should reference the World/Experience facts they
synthesize from.
- World network has confidence < 1.0 entries. World is supposed to
be evidence; if it has confidence, it's Opinion misclassified.
Non-Negotiable Verification
- Run the benchmark battery.
python cli.py benchmark must report:
- all 4 networks distinguishable from typical training-data examples
- classify_batch produces deterministic output
- justify returns a non-empty provenance chain for Opinion/Observation
- Verify CLI help. Exits 0, prints SKILL.md description.
Security Posture
- Prompt injection. Fact text is untrusted input classified against fixed
signals - never executed. The attack shape is epistemic masquerade:
adversarial phrasing that dresses an opinion as an objective World fact so
downstream agents over-trust it. The provenance chain from
justify is the
cross-check; use it.
- Data exfiltration. No network calls, no file writes. Facts and their
provenance chains may reference sensitive sources; they surface only in the
stdout report the caller owns.
- Privilege escalation. No shell invocation, no eval, no dynamic import.
Network labels are trust metadata: silently promoting Opinion/Observation to
World is the escalation to guard against - the label is advisory and grants
no evidentiary standing by itself.
Source Attribution
Distilled from Agentic GraphRAG (O'Reilly, by Anthony Alcaraz and Sam Julien) Ch4 — Epistemic
Classification subsection. Primary research: HINDSIGHT (Latimer et al.,
2025).
1---2name: hindsight-epistemic-classifier3description: Classify facts into HINDSIGHT's 4 epistemic networks (Latimer et al. 2025, cited in Ch4): World (objective external facts), Experience (agent's own first-person actions), Opinion (subjective beliefs with confidence), and Observation (synthesized entity summaries). The separation enables traceability — when users ask "how do you know that", the agent can distinguish evidence from inference from summary. Use when memory must support "how do you know" questions and the agent will be asked to justify its outputs. NOT for one-shot agents (no need to justify), NOT for storage-only systems (the classification is for retrieval-time reasoning, not just persistence).4---56# HINDSIGHT 4-Network Epistemic Classifier78## Overview910Production memory systems benefit from distinguishing **what the agent11observed** from **what it believes**. HINDSIGHT (Latimer et al., 2025, cited12in Ch4) organizes memory into four networks:1314- **World network** — objective facts about external reality. Verifiable15 by external sources (the production region is us-east-1, the CEO of16 ACME is X, the API endpoint returned 503).17- **Experience network** — the agent's own first-person actions. "I called18 the deploy API at 22:30." "I retrieved 5 documents." First-person,19 timestamped, agent-as-actor.20- **Opinion network** — subjective beliefs with confidence scores. "I21 believe the root cause is X with 0.7 confidence." Inference, not22 observation.23- **Observation network** — synthesized entity summaries. "Sarah is the24 on-call lead this week" derived from the union of {Sarah's calendar,25 on-call rotation doc, prior incidents}. Distillation, not evidence.2627Per the HINDSIGHT paper as quoted in Ch4: "developers and users can see28what the agent knows versus what it believes." This skill is the29classification layer that makes the distinction queryable.3031## When to Use3233- Audit-grade agents — when a user asks "how do you know that," the34 response must trace evidence to network35- Regulated environments — opinion must be flagged as opinion, not stated36 as fact37- Multi-agent systems — Agent A's opinion should not become Agent B's fact38 via uncritical knowledge sharing39- Debugging hallucinations — if the agent stated X confidently, the40 network classification tells you whether X is evidence-grounded41 (World/Experience) or inference (Opinion/Observation)4243Phrases: "where did the agent get this", "is this fact or inference",44"justify the answer", "trust calibration", "HINDSIGHT", "epistemic status".4546## When NOT to Use4748- One-shot agents that need no justification trail49- Storage-only systems (the classification is for retrieval-time50 reasoning, not just persistence)51- Pure-retrieval agents that never synthesize — the Observation network52 is empty, the Opinion network is empty; just use World + Experience5354## Process5556| Step | Input | Action | Output | Verification |57|------|-------|--------|--------|--------------|58| 1 | Raw fact text + optional metadata | `lib.classify(text, metadata)` | `EpistemicClass(network, confidence)` | network ∈ {World, Experience, Opinion, Observation}; confidence in [0, 1] |59| 2 | List of facts | `lib.classify_batch(facts)` | List of EpistemicClass | counts per network match expected distribution for the source |60| 3 | Memory containing classified facts | `lib.justify(memory, query)` | Provenance chain: which World+Experience facts ground a given Opinion/Observation | every Opinion or Observation traces back to World or Experience |61| 4 | Classified memory | `lib.network_audit(memory)` | Health report — % per network, orphan Opinions (no provenance chain), Experience without timestamps | flags `experience_without_timestamp_count > 0` |6263## Classification Heuristics6465| Network | Linguistic signals | Metadata signals |66|---------|---------------------|------------------|67| World | declarative third-person, no agent pronoun, verb tense past or present, no confidence hedging | `source != agent`, `external_ref` present |68| Experience | first-person agent pronouns ("I called", "I retrieved"), action verbs, timestamp | `source == agent`, `action_type` present |69| Opinion | hedging ("I believe", "likely", "probably", "appears to"), explicit confidence | `confidence < 1.0`, `inferred_from` present |70| Observation | synthesis language ("based on X and Y", "in summary"), multiple inputs | `derived_from` has multiple refs |7172The default classifier is heuristic — production should swap in an LLM73classifier with a typed-output schema at this seam.7475## Rationalizations7677| Agent rationalization | Documented rebuttal |78|------------------------|--------------------|79| "All facts are facts — networks are overengineering." | Then when the user asks "how do you know," the agent cannot distinguish "the API returned 503" (World, evidence) from "I believe the database was overloaded" (Opinion, inference). The trust calibration collapses. |80| "Just track a confidence score; networks are redundant." | Confidence is a property of Opinion. World facts don't have confidence — they have provenance. Confidence-only loses the World/Experience/Opinion distinction. |81| "Observation can be folded into World." | Observation is *synthesized* from World; it inherits the synthesis-step's failure modes. If you fold it into World, your "World" silently includes summarizations that may contradict raw evidence. The chapter's worked example: Sarah's role is World; "Sarah is the most reliable on-call" is Observation. |82| "I'll skip Experience because the agent always logs its actions." | Logging is not classification. Experience is the network that answers "what did *I* do" vs "what happened in the world." If your logs are merged into World, you've conflated agent-action with external-event. |8384## Red Flags8586- **Opinion network is empty.** Either the agent never reasons (unusual)87 or opinions are being misclassified as World (more likely; check88 hedging-language detection).89- **Experience network has no timestamps.** Replay / forensic90 reconstruction is broken — fix at lib boundary.91- **Observation network references nothing.** The provenance chain is92 broken; observations should reference the World/Experience facts they93 synthesize from.94- **World network has confidence < 1.0 entries.** World is supposed to95 be evidence; if it has confidence, it's Opinion misclassified.9697## Non-Negotiable Verification98991. **Run the benchmark battery.** `python cli.py benchmark` must report:100 - all 4 networks distinguishable from typical training-data examples101 - classify_batch produces deterministic output102 - justify returns a non-empty provenance chain for Opinion/Observation1032. **Verify CLI help.** Exits 0, prints SKILL.md description.104105## Security Posture106107- **Prompt injection.** Fact text is untrusted input classified against fixed108 signals - never executed. The attack shape is epistemic masquerade:109 adversarial phrasing that dresses an opinion as an objective World fact so110 downstream agents over-trust it. The provenance chain from `justify` is the111 cross-check; use it.112- **Data exfiltration.** No network calls, no file writes. Facts and their113 provenance chains may reference sensitive sources; they surface only in the114 stdout report the caller owns.115- **Privilege escalation.** No shell invocation, no eval, no dynamic import.116 Network labels are trust metadata: silently promoting Opinion/Observation to117 World is the escalation to guard against - the label is advisory and grants118 no evidentiary standing by itself.119120## Source Attribution121122Distilled from *Agentic GraphRAG* (O'Reilly, by Anthony Alcaraz and Sam Julien) Ch4 — Epistemic123Classification subsection. Primary research: HINDSIGHT (Latimer et al.,1242025).