Claims labelled by how well they are known

Project Athena

A README that grades its own claims from shipped to partially unfalsifiable, names personalization as the largest sycophancy amplifier, and cites the paper saying its own mechanism raises agreement by 45%.

Carries 1 of 7 rubric mechanisms. Most systems here carry none or one (41%), and a dash means the mechanism was not found at this commit — not that the system needed it. Each mark is one LLM reviewer's reading of the code at this commit rather than a run of it — known limits.

  • Tombstone
  • Trust state
  • Bi-temporal
  • Scope enforced
  • Mutation audit
  • Human review
  • Negative evals

1. Executive Summary

Project Athena is a local-first personal knowledge and memory layer — plain Markdown on disk, indexed into SQLite, pointed at any model. MIT, roughly 60,000 lines of Python. The README carries a stars badge and a Reddit-views badge; this atlas has a standing rule against treating adoption as evidence, and neither influenced anything below.

What earns the report is the epistemic apparatus, which is the most developed in this corpus.

The README contains a section titled "Validation Status — What's Proven vs. What's Proposed", opening: "Most AI-agent READMEs state every claim in the same confident voice. This one doesn't." It then grades six layers:

Layer Status
Storage & retrieval ✅ Shipped & battle-tested
Portability & ownership ✅ Shipped — "structural — inspect the repo; there's nothing to take on faith"
Compounding personalization 🟡 "Credible architecture, N=1 evidence"
Governed autonomy 🟡 "Designed & used, not adversarially tested"
"The right answer for you" 🔴 "Partially unfalsifiable — by nature"
Independent vantage under personalization 🟡 "Real tension, partial + conditional mitigation"

The third row's own wording is the model: "The honest claim is 'this worked for one person who built it around his own thinking' — you are the replication experiment."

The sixth row is the one this atlas should carry forward. It states that the mechanism the product is built on is the mechanism most likely to make it useless, with citations: user-memory profiles raise agreement sycophancy by +45% on Gemini 2.5 Pro (Jain et al. 2025) atop a ~58% baseline (SycEval 2025) — and then, "Athena is built on that mechanism." The stated defence is two-part, and both parts come with limits: a code-enforced meta-awareness gate that is "Claude-Code-only", and an advisory framing "enforced by disposition + the gate's nudge, not proven under adversarial pressure".

Naming the specific literature that predicts your product's failure mode, in your own README, is not something any other system in this atlas does.

And the reason for publishing it is stated as a design principle. The project's _shared.md defines an Epistemic Status Convention (anti-self-mythologizing) with three labels — code-enforced, agent-discretion, aspirational — and names the failure it prevents: "a protocol describes machinery in the present tense ('the system continuously monitors X and emits Y') that no code implements. An agent reads it at boot, believes the mechanism is running, and either (a) skips the manual step it should have done, or (b) reports 'compliance' with a process that never executed."

That is, almost word for word, the defect this atlas has found in five systems in this pass alone. Athena has written the rule against it.

The finding is that the rule is barely applied. The convention permits a frontmatter epistemic_status: key or an inline note. The frontmatter key appears zero times in the repository — the single grep match is the sentence defining it. The three labels appear inline across about eight files, concentrated in the README, the changelog and the convention document itself, against 569 Markdown files, 408 of them under examples/.

The convention's own rule is "Tag on touch; tag any mechanism you actually rely on for a decision." At this commit the tagging is essentially confined to the documents that argue for tagging.

2. Mental Model

The store is a directory of Markdown that the user owns, version-controls and reads. src/athena/core/schema.sql is four tables — files, tags, file_tags, links — which is the whole index: the filesystem is the memory and SQLite is a rebuildable projection over it, the same position CortexGraph's spec argues for.

Sessions produce logs; generators produce insights and case studies; protocols and workflows are themselves Markdown the agent reads.

Diagram — Markdown on disk indexed into SQLite for hybrid retrieval, with auditors for staleness and coverage, and a boot context whose laws are code-enforced only where a Claude Code hook exists
Diagram source
%% caption: Markdown on disk indexed into SQLite for hybrid retrieval, with auditors for staleness and coverage, and a boot context whose laws are code-enforced only where a Claude Code hook exists
flowchart TD
    S["session"] --> E["/end loop — capture"]
    E --> MD["Markdown on disk: session log, insight, case study"]
    MD --> IDX["SQLite index: files, tags, file_tags, links"]
    IDX --> R["chunk-level hybrid RAG + cross-encoder rerank"]
    R -->|"archive paths excluded from the index"| CTX["boot context, 2K to 20K tokens"]
    MD --> AUD["auditors"]
    AUD --> ST["staleness: reference written before the file it points at was modified"]
    AUD --> SC["session coverage"]
    AUD --> GC["graph coverage"]
    CTX --> GATE{"Claude Code hook present?"}
    GATE -->|yes| K["anti-mirror interpreter kernel injected — code-enforced"]
    GATE -->|"Cursor, Gemini CLI, Antigravity"| AD["agent-discretion: prose laws only"]

The branch at the bottom is the project's own scope caveat, drawn where it puts it: "Portability of memory is structural and travels everywhere; portability of governance does not yet."

3. Architecture

Python over a Markdown corpus with a SQLite index, an MCP server, a CLI, and an optional Supabase tier. src/athena/core/ holds the governance and operational modules — governance.py, gate.py, gate_meta.py, permissions.py, ruin_check.py, ruin_structured.py, sandbox.py, security.py, flight_recorder.py, pulse_check.py, system_pulse.py, diagnostic_relay.py, skill_telemetry.py.

gate_meta.py is the anti-sycophancy classifier and it is a regex engine, not a model call — a list of inbound patterns (why (did|would|does)…, "reading between the lines", "am i missing something", "left (me )?on read", "ghosted") that classify a prompt as one where the user is asking the model to interpret someone else's behaviour. That is precisely the class of question where a personalized model will confirm the user's reading, and catching it deterministically rather than with a model is the right instinct.

4. Essential Implementation Paths

Capture — the /end workflow, with generators under src/athena/generators/.

Indexcore/schema.sql and the memory package, chunked and embedded.

Retrieve — hybrid RAG with a cross-encoder reranker, archive paths excluded.

Gatecore/gate_meta.py classifies, core/gate.py and the committed .claude/settings.json hook inject the interpreter kernel.

Auditsrc/athena/auditors/: audit_staleness.py scans logs and memory files "for references to other Athena files … and flags any where the referenced file has been modified AFTER the reference was written", plus audit_session_coverage.py, audit_graph_coverage.py and audit_runner.py.

5. Memory Data Model

Four index tables over Markdown. There is no status column, no confidence, no supersession pointer and no validity interval — the epistemic machinery lives in prose conventions and in the auditors, not in the schema.

That is a coherent position for a store whose unit is a document a person edits, and it means every property this atlas measures has to be looked for in the tooling rather than the data. The staleness auditor is the closest thing to a freshness mechanism, and it is a good one: it does not ask whether a memory is old, it asks whether a reference is older than the thing it references — catching the case where a session log cites a protocol that has since changed underneath it. That is Kage's idea applied to prose instead of code, using git timestamps instead of hashes.

6. Retrieval Mechanics

Chunk-level hybrid RAG with a cross-encoder reranker, and the reason the reranker defaults on is recorded as an incident: the validation table credits "a silent retrieval regression our own monitoring missed, which is why the reranker is now on by default and archive paths are excluded from the index."

A project that names a regression its own monitoring failed to catch, and cites it as the evidence for a default, is doing the thing the atlas asks for. It is also, precisely, an admission that the monitoring was insufficient — which the table does not soften.

Boot cost is tiered (~2K for chat, ~10K for /start, ~20K for /ultrastart) with the claim that "80–98% of your context window stays free, even after 10,000 sessions".

There is no scope key. The store is one person's, and the README says so.

7. Write Mechanics

Capture is a session-end workflow; correction is curation by the user, with the README's own caveat attached: "compounding needs curation. Keep the /end loop running; unpruned memory decays like any archive."

Nothing is keyed on a rejected value, nothing records a verdict, and a wrong memory is corrected by editing the Markdown. The stated risk is named in the same section: "a stale or wrong memory retrieved with confidence is worse than no memory, which is exactly why the verification machinery above exists."

8. Agent Integration

An MCP server, a CLI, workflows and skills as Markdown, and a committed .claude/settings.json hook. Model-portable by design; governance-portable it is not, and the scope caveat says so — on Cursor, Gemini CLI and Antigravity the gate degrades "from a code-enforced injection to agent-discretion — the model's own disposition plus the prose laws."

9. Reliability, Safety, and Trust

Audit log — awarded, for the auditors and the flight recorder. audit_staleness, audit_session_coverage, audit_graph_coverage and audit_runner produce durable, re-runnable records of the store's condition, and flight_recorder.py records operation. It is a health-and-coverage audit rather than a mutation log — an edit to a Markdown file is caught by git, not by Athena — and it is more instrumentation than most file-backed stores here carry.

Trust state — withheld, and the near-miss is the whole report. The three-label convention is an epistemic vocabulary, it is well-argued, and it is applied to documents rather than to memories, in thirteen of 580 files, with the frontmatter form unused. A convention is not a field. The coverage moved with the corpus rather than ahead of it — five more documents carry a label across a commit that added eleven — so the ratio is the same shape it was: the labels describe the system's own mechanisms in the handful of documents about the system, and nothing in the memory it stores.

Scope, tombstone, bitemporal, human review, negative eval — no.

The most valuable thing here for another builder is the sycophancy row. It should be read alongside NornicDB's Kalman filter, which attacks the same problem numerically, and Recall's Brier calibration, which attacks it by scoring the writer. Athena attacks it with a regex classifier and a prompt injection, and — uniquely — states in its own README that its chosen defence is unproven under adversarial pressure.

10. Tests, Evals, and Benchmarks

No paper, and a docs/REFERENCES.md claiming full APA citations with "every DOI Crossref-verified" for Kelly sizing, ergodicity economics, prospect theory, IFS and the memory-architecture literature (MemGPT, Generative Agents, CoALA). Two sycophancy papers are cited inline with arXiv links.

There is a tests/ directory including test_eval_harness.py. No benchmark result is committed, and the validation table is explicit that this is the state: "what doesn't exist yet is published, systematized validation", with a commitment that "if a claim above ever moves a tier, the change lands in the changelog, not silently in the marketing copy."

The N=1 admission is worth repeating as the finding rather than as a criticism: 1,900+ sessions of longitudinal use by the author, no multi-user study, no controlled benchmark, and the README says so in the row where a different project would have written "battle-tested".

I ran nothing.

11. For Your Own Build

Steal

  • Grade your claims by evidence level, in the README, in a table. Shipped, credible-architecture-N=1, designed-but-not-adversarially-tested, partially unfalsifiable. It costs one section and it is the single highest-integrity artifact in this atlas.
  • Name the literature that predicts your failure mode. Citing the paper that says user-memory profiles raise agreement sycophancy by 45%, in the README of a user-memory product, is how you make a defence claim assessable.
  • Write the anti-self-mythologizing rule down. code-enforced / agent-discretion / aspirational, with the failure spelled out — an agent reads a present-tense description at boot and reports compliance with a process that never ran. Then apply it more widely than this project has.
  • Audit for stale references, not just stale memories. A note that cites a protocol modified after the note was written is wrong in a way no content-freshness check catches, and git timestamps make it a cheap scan.
  • Catch the interpretive question with a regex, not a model. The prompts where personalization does most damage — "why did they…", "reading between the lines", "left me on read" — are lexically recognisable, and a deterministic classifier cannot itself be flattered.
  • Cite the incident that justifies a default. "The reranker is now on by default because of a silent retrieval regression our own monitoring missed" tells a reader more than any benchmark row.
  • State where governance stops travelling. Memory portability and governance portability are different properties, and conflating them is how a safety claim quietly becomes false on a different IDE.

Avoid

  • Do not write a labelling convention and leave it unapplied. The epistemic_status: frontmatter key appears nowhere; the labels appear inline in a handful of files out of 569. The rule says "tag on touch", and at this commit the tagged set is roughly the documents about tagging.
  • Do not rely on a single-IDE hook for the one code-enforced safeguard. The project says this; a reader on Cursor should read the governance claims as prose.
  • Do not read N=1 longitudinal use as validation, and note that the project does not ask you to.

Fit

This suits one person who wants their own context to outlive any model, is willing to curate Markdown, and specifically wants an assistant that will disagree with them. It is not multi-user, not scoped and not benchmarked, and it says all three.

Read the validation table whatever you are building. It is the clearest demonstration in this atlas that the honest thing and the persuasive thing are usually the same paragraph.

12. Open Questions

  • Has the convention been applied since? It is dated and its own rule is "tag on touch", so adoption should rise with edits.
  • What does the meta-awareness gate do when it fires? gate_meta.classify and a REMINDER_TEMPLATE are exposed "for SDK-wide use"; the injected kernel's content and whether it measurably changes the answer were not traced.
  • Does the staleness auditor gate anything? It flags; whether a flagged reference is excluded from boot context or merely reported was not established.
  • Is there a cross-IDE gate yet? Named as roadmap, alongside "code that actually checks 'am I ranking by the user's weights or my own?'".

Appendix: File Index

The validation table and the conventionREADME.md §Validation Status, examples/workflows/_shared.md:67-86 (the Epistemic Status Convention, the failure it prevents, the three labels and the tag-on-touch rule)

Anti-sycophancysrc/athena/core/gate_meta.py (the T1_INBOUND pattern list), src/athena/core/gate.py, the committed root .claude/settings.json

Auditorssrc/athena/auditors/audit_staleness.py (the reference-versus-file comparison :4-9), audit_session_coverage.py, audit_graph_coverage.py, audit_runner.py

Governancesrc/athena/core/governance.py, permissions.py, ruin_check.py, ruin_structured.py, sandbox.py, security.py

Operationssrc/athena/core/flight_recorder.py, pulse_check.py, system_pulse.py, diagnostic_relay.py, skill_telemetry.py, session_efficiency.py

Indexsrc/athena/core/schema.sql (files, tags, file_tags, links), src/athena/memory/

Integrationsrc/athena/mcp_server.py, src/athena/cli/, examples/workflows/, examples/skills/, examples/hooks/, supabase/

Referencesdocs/REFERENCES.md, SAFETY.md, docs/CHANGELOG.md

Appendix: Recorded Searches

Run from the root of the checkout at the pinned commit.

Claim Command Result at this pin
The convention's coverage find . -name '*.md' | wc -l and grep -rl 'code-enforced|agent-discretion|aspirational' --include='*.md' . | wc -l thirteen documents out of 580; individually 6, 7 and 8
The auditors and recorder are live ls src/athena/auditors/; find src -name "flight_recorder*" Ten auditors plus core/flight_recorder.py
Retrieval weights are hand-set grep -n "RRF Weights" -A 10 src/athena/tools/search.py Per-intent tables of literal floats with justifying comments; no measurement beside them
No scope key on a read the scoping matrix row, re-checked The store is one person's; nothing filters by owner

History

2026-09-11b544b880… — re-read, 268 files and 15,759 insertions past the previous pin in a single commit. audit_log re-verified: ten auditors and core/flight_recorder.py, still a health-and-coverage audit rather than a mutation log, which is the limit the report already states. The headline count is refreshed and the shape is unchanged: the three-label convention appears in thirteen of 580 documents, against about eight of 569 at the previous pin — five more labels across eleven more files, so coverage grew with the corpus rather than ahead of it, and the frontmatter form is still unused. Retrieval gained a layer worth naming and worth doubting in the same breath. search.py now classifies a query into an intent and applies a per-intent RRF weight table, so user_profile is boosted to 4.0 for one intent while system_doc is explicitly "Demoted" to 0.8, and protocol moves from 2.0 to 3.5 depending on which table applies. The reasoning is written into the comments beside each number. What is not there is any measurement: these are hand-set constants in exactly the class the project's own convention would label agent-discretion or aspirational, in a file the convention does not reach. Also new: tools/personalisation.py, which frames retrieval results as a synthesis instruction grounding downstream reasoning in the user's stated constraints, and intelligence/gto_engine.py. Screened before reading: ten findings; nothing was installed or run.

2026-08-092e4898e3… — first reading. Screened before reading; the tree was read, never installed, and no test was run.