Citadel epistemic report
Type: agentic-system-analyses/types/agentic-system-epistemic-report.md
Source-and-claim boundary
Question: which Citadel routes acquire or produce truth-apt engineering material, what checks license reliance, and which consumers actually receive their results? The frozen whole-system scope, exclusions and SRC-1 identity are those of the boundary and Source register. All direct source reads below are at that revision (checkout HEAD checked). No target execution occurred. No observed-run or causal-experiment evidence was supplied.
The assessment distinguishes source capture, operational admission, searchable projection, shared-scope promotion and semantic acceptance. The first four can operate without the fifth. The target's own untrusted-context contract is a countercase to treating every use of “knowledge,” “learning” or “verify” as a factual warranty. Public/design claims are EPI-CLM-context-links, EPI-CLM-promotion-gate, EPI-CLM-preserve-source, EPI-CLM-benchmark-score and RT-CLM-explicit-approval.
Coverage
“Supplied” means the runtime's inspected findings, not an independent read here. “Direct” means source inspected for this member. Available but uninspected operations remain limits; no system-complete negative follows.
| Entry point or operation | SRC-1 source path | Coverage and conclusion limit |
|---|---|---|
| Python CLI dispatch: ingest/search/local, capture, promotion, feedback, verify, bench, improve/cognify/reindex/learn/sync | kb/cli.py |
Direct dispatch inventory, verify and maintenance handlers; supplied RT-RTE-local-access, RT-RTE-ingest-admission. User improve/cognify and applying reindex are scheduled-only refusals, not hidden user model evaluators. |
| Registered MCP tools and prompts | kb/mcp_server.py |
Direct registry/handler inventory, improve refusal and promotion review; supplied RT-RTE-task-search, RT-RTE-promotion-review. Share-session/contribute, reconciliation, backup and connector internals not fully traced here; prevents an exhaustive admission/warrant conclusion for all tools. |
| UserPromptSubmit / SessionEnd | kb/hooks/search_inject.py, kb/hooks/sync_session.py, kb/session_trace_distill.py |
Supplied RT-RTE-task-search, RT-RTE-session-capture; direct EPI-RTE-note-distill. Full shared trace refinement and git pre-push path not independently inspected; prevents a universal capture-fidelity judgment. |
| HTTP ingest / service / scheduled projection | kb/server.py, kb/service.py, kb/learning.py, kb/lifecycle_worker.py |
Supplied RT-RTE-ingest-admission, RT-RTE-source-projection; direct enrichment, feedback, improvement, tombstone/filter, conflict call sites and cleanup. Provider graph extraction not inspectable as repository implementation. |
| Optional enrichment and optimization | kb/llm_enrichment.py, kb/self_improve.py |
Direct EPI-RTE-source-enrichment; supplied RT-RTE-index-curation. Source preservation is requested but not parser-enforced. |
| Promotion classification, approve/reject | kb/promotion.py, kb/mcp_server.py |
Supplied RT-RTE-promotion-review; direct MCP approve/reject contracts. Review can veto pending items but does not cover all automatic promotions. |
| Feedback and automated improvement | kb/service.py, kb/improvement_policy.py |
Direct EPI-RTE-feedback-record, EPI-RTE-automation-receipt; receipt fields inspected, issuer measurements uninspected. |
| LearningAgent organization updates | kb/learning_agent.py, kb/organization_digest.py |
Direct EPI-RTE-digest-build; source-sync result and vault-context inputs, preview and gateway post. External source truth and delivered notifications unobserved. |
| Verify / prepare-pr-context | kb/agent_workflows.py, kb/cli.py |
Direct verify shaping EPI-RTE-verify-report; prepare-pr-context handler inventoried but shaping not fully assessed. Prevents a complete assertion about every source-ranking rule. |
| Conflict warning/resolution | kb/conflicts.py, kb/learning.py |
Direct EPI-RTE-conflict-record; title/hash differences and status-only resolution, not semantic contradiction adjudication. Other UI conflict consumers unassessed. |
| Cleanup, source withdrawal and corpus repair | kb/service.py, kb/server.py |
Direct EPI-RTE-garbage-cleanup, EPI-RTE-source-withdrawal; repair previews/guards inventoried, full repair transactions uninspected. Prevents universal rollback/erasure guarantee. |
| Retrieval benchmark run/score/enforce | kb/retrieval_eval.py |
Direct scoring, comparison, release gate and command exit excerpts: EPI-RTE-benchmark-gate. No supplied benchmark run; no independently authenticated result. |
| Browser, Obsidian, connector imports, skills | web/src/pages/app/search.tsx, plugins/obsidian-citadel/src/sync/syncEngine.ts, skills/citadel/SKILL.md |
Boundary/supplied coverage only. Detailed client transformations and all sync reconciliation not independently checked here; prevents whole-system fidelity and host-compliance claims. |
Missing private corpus and paired source/output instances prevent testing factual fidelity of generated notes and digests. Missing provider internals prevent classifying graph extraction/improve semantics and parameter changes beyond the supplied component bounds. Missing receipt-issuer evidence prevents treating its five Boolean assertions as verified measurements. Missing consumer traces prevent establishing activation; missing interventions prevent benefit or component-effect attribution. These are different gaps, not one negative verdict.
Epistemic-object inventory
| Object ID | Candidate truth-apt content or none | Claimed role | Evidence source and local anchor | Gap/limit |
|---|---|---|---|---|
| EPI-OBJ-node-note | see record | see record | SRC-1 kb/session_trace_distill.py |
selected transcript assertions, not confirmed outcomes |
| EPI-OBJ-enriched-chunk | see record | see record | SRC-1 kb/llm_enrichment.py |
semantic preservation unknown |
| EPI-OBJ-organization-digest | see record | see record | SRC-1 kb/organization_digest.py |
source-linked intent does not validate generated interpretation |
| EPI-OBJ-conflict-record | see record | see record | SRC-1 kb/conflicts.py |
hash difference is not contradiction |
| EPI-OBJ-evaluation-gate | see record | see record | SRC-1 kb/improvement_policy.py |
issuer's proof not loaded |
| EPI-OBJ-benchmark-run | see record | see record | SRC-1 kb/retrieval_eval.py |
expected body spans are an oracle for return, not world truth |
| RT-OBJ-ingest-result | none beyond operational receipt assertions; see record | see record | SRC-1 kb/service.py |
admission/searchability is not truth acceptance |
| RT-OBJ-optimize-prompt | policy input, not output evidence; see record | see record | SRC-1 kb/self_improve.py |
requests no invention; output fidelity unobserved |
Other material parts are located by routes rather than given duplicate objects: imported source bytes and projections (RT-RTE-source-projection), classified promotion candidate (RT-RTE-promotion-review), optimization notes (RT-RTE-index-curation), retrieval page (RT-RTE-task-search) and ratings (EPI-RTE-feedback-record). Chat, decision, embedding and Cognee numerical model state stay separate: see RT-CMP-openrouter-chat, RT-CMP-promotion-decision, RT-CMP-embedding-profile, RT-CMP-cognee-models. No weight-training conclusion follows from retained note updates.
Authority-route ledger
Each row is one function; repeated citations split checks from disposition or retention. Architectural status is implementation status, not evidence of exercise. Other canonical fields are in the cited records. No supplied record requires supersession: new declarations name distinct routes or explicit parts.
| route ID | route function | architectural status | object/candidate ID | content/update relation | transition or check target | evaluator/condition and domain | activation and timing | possible or observed result | implemented force | epistemic authority and scope | operational authority | behavioral-authority path | evidence source ID and local anchor | claim IDs or none | mismatch marker or none | gap/limit |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| RT-RTE-ingest-admission | content transformation | implemented | caller source | truth-apt transformation: acquisition/import | source enters store | authenticated routing/content guards | see RT-RTE-ingest-admission | see RT-RTE-ingest-admission | permissive | source warrant unknown; no truth attestation | capture permitted | learning/store; request; permissive; later searches | SRC-1 kb/service.py |
none | none | receipt means operational admission |
| RT-RTE-ingest-admission | disposition/acceptance | implemented | RT-OBJ-ingest-result | no content change | write eligibility | scope, scanner, chunk guards | see RT-RTE-ingest-admission | see RT-RTE-ingest-admission | enforcing | not evidence-consuming semantic acceptance | reject or retain source | server to store; enforcing; this write | SRC-1 kb/learning.py |
RT-CLM-explicit-approval | approval policy not universal | direct/local and automatic routes differ |
| RT-RTE-source-projection | retention | implemented | source bytes/projections | no content change | retain/reload accepted source | store/worker | see RT-RTE-source-projection | see RT-RTE-source-projection | enforcing | retention not endorsement | source available later | store to worker/search; later requests | SRC-1 kb/lifecycle_worker.py |
none | none | graph semantic transformation is separately opaque |
| RT-RTE-source-projection | check/evidence production | implemented | projection receipts | no content change | backend visibility/chunk presence | worker read checks in backend domain | see RT-RTE-source-projection | see RT-RTE-source-projection | enforcing | projection availability only | mark/search current binding | worker receipt to retrieval filter; enforcing; revision lifetime | SRC-1 kb/lifecycle_worker.py |
none | none | not factual or complete-recall test |
| RT-RTE-task-search | operational admission/selection/consumption | implemented | retrieval page | no content change | selected source context | scope/ranking/current binding and caps | see RT-RTE-task-search | see RT-RTE-task-search | ranking | untrusted/reference context | deliver bounded descriptions | see RT-BAP-context-delivery | SRC-1 kb/hooks/search_inject.py |
EPI-CLM-context-links | none | delivery not compliance |
| EPI-RTE-note-distill | content transformation | implemented | EPI-OBJ-node-note | truth-apt transformation: indeterminate | transcript to Outcome/Files changed | deterministic selection, no result-success validation | see EPI-RTE-note-distill | see EPI-RTE-note-distill | permissive | retains attributed assertions with weakened context | note offered for automatic capture | hook note to ingest; permissive; later personal search | SRC-1 kb/session_trace_distill.py |
none | outcome/effect labels exceed checked evidence | could reshape or strengthen claims; concrete deduction below |
| EPI-RTE-source-enrichment | content transformation | implemented | EPI-OBJ-enriched-chunk | truth-apt transformation: indeterminate | source to generated chunks/summary | model prompt, optional path | see EPI-RTE-source-enrichment | see EPI-RTE-source-enrichment | permissive | preservation requested, not established | generated text can replace ingest input | model → learning chunks → source store; later search | SRC-1 kb/llm_enrichment.py |
EPI-CLM-preserve-source | semantic-fidelity gap | passthrough/paragraph fallback are non-ampliative reshaping |
| EPI-RTE-source-enrichment | check/evidence production | implemented | EPI-OBJ-enriched-chunk | no content change | model JSON shape | parser types, nonempty text and caps | see EPI-RTE-source-enrichment | see EPI-RTE-source-enrichment | enforcing | syntax/shape only | malformed entries skipped; empty result falls back | parser → learning; enforcing; one call | SRC-1 kb/llm_enrichment.py |
EPI-CLM-preserve-source | no preservation comparison | valid JSON may omit/rewrite source |
| RT-RTE-promotion-review | check/evidence production | implemented | seat candidate | no content change | org relevance/sensitivity | typed model or chat plus org reference | see RT-RTE-promotion-review | see RT-RTE-promotion-review | advisory | bounded classifier judgment, no truth oracle | supply score/reason to engine | model → threshold code; one candidate | SRC-1 kb/promotion.py |
EPI-CLM-promotion-gate | none | accuracy unobserved |
| RT-RTE-promotion-review | disposition/acceptance | implemented | seat candidate | no content change | shared-scope eligibility | fixed score/rules or pending reviewer | see RT-RTE-promotion-review | see RT-RTE-promotion-review | enforcing | intended org sharing eligibility, not factual acceptance | known-work auto-share; new-project queue/reject | engine/reviewer → Central writes; permissive; future shared reads | SRC-1 kb/promotion.py |
EPI-CLM-promotion-gate | universal explicit-step reading too strong | rejected hash veto is bounded to candidate |
| RT-RTE-index-curation | content transformation | implemented | optimization note | truth-apt transformation: indeterminate | labels/tags to summaries/tags | chat proposer and known-label parser | see RT-RTE-index-curation | see RT-RTE-index-curation | permissive | no checked source-body entailment | admit notes after guards, not semantic acceptance | see RT-BAP-curation-guidance | SRC-1 kb/self_improve.py |
none | name does not establish improvement | improve dependency separate and opaque |
| EPI-RTE-feedback-record | retention | implemented | rating/event/note | truth-apt transformation: acquisition/import | caller rating | caller judgment, cache/fallback | see EPI-RTE-feedback-record | see EPI-RTE-feedback-record | permissive | attributed judgment only; source warrant unknown | retain searchable rating; optional gated improve | caller → feedback store/cache/note; later consumers | SRC-1 kb/service.py |
none | none | no raw feedback-to-optimization-prompt link established |
| EPI-RTE-automation-receipt | check/evidence production | implemented | EPI-OBJ-evaluation-gate | no content change | receipt completeness/currency | JSON/timestamps/five booleans | see EPI-RTE-automation-receipt | see EPI-RTE-automation-receipt | enforcing | asserted measurement status only | gate computes allow/deny | receipt reader → require function; current call | SRC-1 kb/improvement_policy.py |
none | measurement vs attestation gap | issuer evidence uninspected |
| EPI-RTE-automation-receipt | operational admission/selection/consumption | implemented | EPI-OBJ-evaluation-gate | no content change | automated improve permission | require + Central scope | see EPI-RTE-automation-receipt | see EPI-RTE-automation-receipt | enforcing | no claim-level license | exception blocks or permits Cognee call | service → gateway; enforcing; until receipt expires | SRC-1 kb/improvement_policy.py |
none | none | direct nonautomation service call differs |
| EPI-RTE-digest-build | content transformation | implemented | EPI-OBJ-organization-digest | truth-apt transformation: indeterminate | source packet to interpretation | optional model or deterministic rules | see EPI-RTE-digest-build | see EPI-RTE-digest-build | advisory | not accepted factual analysis | produce preview text | builder → LearningAgent; advisory; one report | SRC-1 kb/organization_digest.py |
none | none | need paired output to resolve entailment or conjecture |
| EPI-RTE-digest-build | operational admission/selection/consumption | implemented | EPI-OBJ-organization-digest | no content change | notification eligibility | post flag, dry_run, enabled/meaningful predicates | see EPI-RTE-digest-build | see EPI-RTE-digest-build | permissive | notification not acceptance | post formatted text or preview only | LearningAgent → gateway/recipient; advisory; notification | SRC-1 kb/learning_agent.py |
none | none | no recipient reliance trace |
| EPI-RTE-conflict-record | check/evidence production | implemented | EPI-OBJ-conflict-record | no content change | same title/path, different hash | two local caches; deterministic | see EPI-RTE-conflict-record | see EPI-RTE-conflict-record | advisory | content difference only | warn after source accepted | detector → store/mesh; advisory; later review | SRC-1 kb/conflicts.py |
none | disagreement language stronger than hash test | cannot locate proposition contradiction |
| EPI-RTE-conflict-record | retention | implemented | EPI-OBJ-conflict-record | no content change | warning/status record | store record/resolve/prune | see EPI-RTE-conflict-record | see EPI-RTE-conflict-record | permissive | retains allegation, no truth settlement | open or resolved warning state | JSON → list/get; advisory; across invocations | SRC-1 kb/conflicts.py |
none | none | resolve does not revise source here |
| EPI-RTE-verify-report | check/evidence production | implemented | local file and hits | no content change | lexical overlap/doc shape | cue matching and doc_type rules | see EPI-RTE-verify-report | see EPI-RTE-verify-report | advisory | pointers only | emit report, including incomplete searches | CLI → stdout human/agent; advisory; current task | SRC-1 kb/agent_workflows.py |
none | verify is not truth validation | ok/exit zero can coexist with timeout |
| EPI-RTE-benchmark-gate | check/evidence production | implemented | EPI-OBJ-benchmark-run | truth-apt transformation: entailed derivation | served body spans/identity | fixed matching/scoring over supplied inputs | see EPI-RTE-benchmark-gate | see EPI-RTE-benchmark-gate | advisory | conditional on artifact/oracle fidelity; retrieval domain | produce bounded metrics | scorer → run artifact/comparator; one benchmark | SRC-1 kb/retrieval_eval.py |
EPI-CLM-benchmark-score | none | not correctness of matched assertions |
| EPI-RTE-benchmark-gate | disposition/acceptance | implemented | EPI-OBJ-benchmark-run | no content change | candidate benchmark comparison | fingerprints, required evidence, nonregression; release extras | see EPI-RTE-benchmark-gate | see EPI-RTE-benchmark-gate | enforcing | bounded evidence-consuming benchmark decision | exit pass/fail; no automatic vault deployment shown | comparator → CLI exit → invoking shell; enforcing for command only | SRC-1 kb/retrieval_eval.py |
EPI-CLM-benchmark-score | none | no authenticated supplied run or causal design |
| EPI-RTE-garbage-cleanup | check/evidence production | implemented | legacy candidate IDs | no content change | known scaffolds/fossils | deterministic classifier and bounded probes | see EPI-RTE-garbage-cleanup | see EPI-RTE-garbage-cleanup | advisory | shape-class membership, not falsity | preview candidate IDs/counts | service → admin preview; advisory; maintenance request | SRC-1 kb/service.py |
none | none | probe coverage and false positives not measured |
| EPI-RTE-garbage-cleanup | disposition/acceptance | implemented | legacy candidate IDs | no content change | deletion eligibility | admin sources:sync and non-dry-run | see EPI-RTE-garbage-cleanup | see EPI-RTE-garbage-cleanup | enforcing | no semantic rejection claim | invoke gateway delete | admin/code → gateway; enforcing; later availability | SRC-1 kb/server.py |
none | none | physical purge/rollback unestablished |
| EPI-RTE-source-withdrawal | lineage/freshness/recovery | implemented | source revision/binding | no content change | current-head eligibility | tombstone admission/filter | see EPI-RTE-source-withdrawal | see EPI-RTE-source-withdrawal | enforcing | withdrawn not necessarily false | exclude old/tombstone lifecycle-bound hits | store → retrieval filter; enforcing; future lifecycle reads | SRC-1 kb/service.py |
none | none | does not retract already emitted context or cover all branches |
System-claim versus route comparison
| Claim ID | Claimed operation/warrant | Source/anchor and layer | Doctrine/design support | Implemented routes | Observed-run support | Causal support/design limits | Supported conclusion | Mismatch/unknown |
|---|---|---|---|---|---|---|---|---|
| EPI-CLM-context-links | see record | SRC-1 README.md; doctrine/design |
see record | RT-RTE-task-search, EPI-RTE-verify-report | none supplied | no recipient trace or intervention | source pointers and explicit untrusted-use policy, not source attestation | complete client/provenance fidelity not audited |
| EPI-CLM-promotion-gate | see record | SRC-1 README.md; doctrine/design |
see record | RT-RTE-promotion-review | none supplied | no classifier accuracy or reviewer trace | deliberate eligibility gate implemented | not every Central write waits for human explicit step |
| EPI-CLM-preserve-source | see record | SRC-1 kb/llm_enrichment.py; doctrine/design prompt |
see record | EPI-RTE-source-enrichment | none supplied | no source/output pair | shape validated; complete source preservation only requested | cap/nonempty parsing does not compare source text |
| EPI-CLM-benchmark-score | see record | SRC-1 README.md; reported operation |
bounded metric and explicit corpus limitations | EPI-RTE-benchmark-gate | attributed README only, not inspectable run | no intervention or component variation | implemented metric is meaningful for body-span return within declared corpus/question scope | reported value not reproduced or authenticated |
| RT-CLM-explicit-approval | see record | SRC-1 kb/mcp_server.py; doctrine/design |
see record | RT-RTE-session-capture, RT-RTE-promotion-review | none supplied | no host compliance evidence | policy for named tool invocation | automatic writes refute universal approval invariant |
Bounded conclusion
Citadel acquires engineering source content and caller ratings, retains them, projects selected content and returns bounded context. Operational admission and backend receipt checks authorize storage/searchability, not belief in the content. Source warrant remains unknown: commit/document pointers help a recipient check a source but do not attest source truth. Lifecycle binding can exclude obsolete content; it is not endorsement. See RT-RTE-ingest-admission, RT-RTE-source-projection, RT-RTE-task-search, EPI-RTE-source-withdrawal.
The deterministic session note needs special care. A source-supported counterexample to “it simply preserves known outcomes” is an assistant block saying “Deployment succeeded” followed by a Write tool_use for config.py whose tool_result reports an error. Inspected code keeps last assistant text as “Outcome” and collects the file path from tool_use without inspecting tool_result in distill_node_note. Thus it can emit “Outcome: Deployment succeeded” and list config.py under “Files changed” even with a failed tool result. This is a deduction from implementation, not an executed fixture. It establishes neither deployment nor file mutation. More generally the note is an indeterminate transformation: some inputs merely lose detail; others strengthen an action attempt into an apparent effect. This countercase does not show all notes are false. See EPI-RTE-note-distill.
Optional generated chunks, summaries, optimization notes and digest interpretations are candidates, not established accepted ampliative claims. The parsers check output shape, count or known labels, not semantic entailment. “Never invent” is model guidance. Without input/output instances, non-entailment is not established either, so these routes remain indeterminate rather than automatically “ampliative.” Passthrough/paragraph fallback is non-ampliative reshaping within its text domain. The digest notification path is distinct from retained optimization notes: it can publish interpretation without any claim-level acceptance step in the inspected driver. See EPI-RTE-source-enrichment, RT-RTE-index-curation, EPI-RTE-digest-build.
There are real bounded evaluators. Promotion judges organizational relevance/sensitivity for sharing; the engine threshold or authorized pending-item reviewer can admit/reject shared copies. Conflict detection finds title/hash differences after admission; a resolved conflict record does not revise the content. CLI verify provides lexical/source-shape pointers and explicitly delegates live-source confirmation. Garbage cleanup classifies known scaffolds and permits deletion, not epistemic refutation. Each has a different target, intended use and authority horizon. None licenses arbitrary factual reliance. See RT-RTE-promotion-review, EPI-RTE-conflict-record, EPI-RTE-verify-report, EPI-RTE-garbage-cleanup.
The benchmark is an evidence-producing retrieval evaluator with a separate evidence-consuming acceptance command. Its formal derivations warrant only what follows from the supplied hits, expected spans/identities and comparison artifacts under those algorithms. A body-span match does not establish that the span is true; an unexpected document can quote it. Enforcement can fail the invoking command, including for missing/noncomparable artifacts and regressions, but a downstream release/deployment gate was not established by this inspection. The automation receipt reader is a different enforcement path: it licenses an automated Central improve call until expiry on asserted check fields, without replaying those checks. Neither is a per-proposition factual acceptance gate. See EPI-RTE-benchmark-gate, EPI-RTE-automation-receipt.
No inspected route establishes lifecycle integration after semantic acceptance of a produced ampliative claim. This is not a system-complete absence: the coverage table's unassessed paths and opaque Cognee processing limit it. Retention, promotion and use can occur before any such acceptance. Feedback and optimization notes can affect later material, but learning as improved capacity, formulated content-directed theory criticism, reflection, autonomy and self-improvement require independent evidence. Here actual later exercise and benefit are unobserved; raw feedback retention does not by itself establish any of them. The direct opaque improve call is not evidence of absent learning, nor does its name establish it. Distributed model mutability remains exactly as bounded by the four supplied component records. There is no single epistemic score or whole-system verdict.
Shared records
Components
none declared in this member
Operative objects
EPI-OBJ-node-note
Label: Dev session note
Natural-language Markdown string, assembled in Python and subsequently stored as source content after capture admission. Candidate propositions concern task, claimed outcome, decisions and files. Distinct from the symbolic receipt RT-OBJ-ingest-result; no supplied object counterpart. Route: EPI-RTE-note-distill. SRC-1 kb/session_trace_distill.py.
lines: list[str] = ["# Dev session note"]
---
kb/session_trace_distill.py
EPI-OBJ-enriched-chunk
Label: EnrichedChunk
Natural-language text/summary and symbolic tag tuple, first in Python/model JSON then source ingestion input. Distinct from RT-OBJ-optimize-prompt: source enrichment output rather than static curation guidance. Truth-apt content includes source assertions and generated summary. Route: EPI-RTE-source-enrichment. SRC-1 kb/llm_enrichment.py.
summary=_clean_summary(entry.get("summary")), tags=_clean_tags(entry.get("tags")), ---
kb/llm_enrichment.py
EPI-OBJ-organization-digest
Label: Organization update digest
Natural-language formatted text plus symbolic summary/source-label fields in Python return payload, optionally notification transport. Contains source update assertions and interpretation. Distinct from optimization note in RT-RTE-index-curation; no supplied object counterpart. SRC-1 kb/organization_digest.py.
payload["_text"] = text
---
kb/organization_digest.py
EPI-OBJ-conflict-record
Label: KnowledgeConflictStore record
Mixed natural-language summary/excerpts and symbolic IDs/status/hash-derived deduplication keys in persistent JSON. Candidate disagreement allegation and preferred-source instruction must be distinguished from measured hash difference. No supplied counterpart after comparison with RT-OBJ-ingest-result. SRC-1 kb/conflicts.py.
"status": RESOLVED, "resolution_note": clip_excerpt(resolution_note), ---
kb/conflicts.py
EPI-OBJ-evaluation-gate
Label: Central evaluation receipt
Symbolic local JSON fields interpreted by fixed code; natural-language run_id is an identifier, not proof. Status/check assertions are truth-apt about a purported evaluation, while their operative role is permission. Distinct from projection acceptance receipt RT-OBJ-ingest-result. SRC-1 kb/improvement_policy.py.
path = Path(getattr(config, "evaluation_gate_path", ".citadel/evaluation_gate.json")) ---
kb/improvement_policy.py
EPI-OBJ-benchmark-run
Label: Retrieval benchmark artifact
Symbolic question/hit/score/run/fingerprint JSON consumed by Python comparator, with natural-language answer spans and source text. Metrics assert bounded retrieval outcomes. No counterpart after comparison with projection receipt RT-OBJ-ingest-result; this is a saved benchmark-run object, not a captured observed run supplied to this analysis. SRC-1 kb/retrieval_eval.py.
baseline = json.loads(Path(args.run_a).read_text(encoding="utf-8")) candidate = json.loads(Path(args.run_b).read_text(encoding="utf-8")) ---
kb/retrieval_eval.py
Routes
EPI-RTE-note-distill
Label: Node note extraction
Part of: RT-RTE-session-capture This is its deterministic content-producing subroute, not the transport/admission container.
Endpoints/progression: transcript entries → distill_node_note → note string → SessionEnd capture. Owner/proposer/decider: deterministic code chooses assistant text, tool paths and decision-marker matches. Context: transcript only; effect: creates a candidate recap. No human or model check is performed here. SRC-1 kb/session_trace_distill.py.
- implementation conclusion status: wired
- operation conclusion status: uninspected
- Immediate return: note text or empty string
- Later read-back: admitted note can be retrieved in later sessions through the parent route
- Delegated visibility: capture server sees selected note, not complete transcript
- Selection predicate: first prompt, last assistant text, assistant decision-marker matches and edit/write tool paths, with count/length caps
- Invalidation or expiry: inapplicable — extraction has no retained state; retained note follows downstream revision rules
- Activation or effect: labels assistant text as Outcome and tool-use paths as Files changed; these are not checked against successful results
- Evidence limits: deduced from implementation, no supplied transcript instance or successful file-effect trace
recap_bits.append(f"Outcome: {_truncate(last_assistant_text, 280)}") ---
kb/session_trace_distill.py
EPI-RTE-source-enrichment
Label: Optional source enrichment
Distinct from RT-RTE-ingest-admission: this is the optional direct-learning generative transformation, which the inspected HTTP admission suppresses.
Endpoints/progression: enrich_source_material → chat with source text → parse_enriched_chunks → LearningProcess._chunk_inputs → ingest. Owner: learning code; model proposes text, summary and tags; parser rejects malformed entries, ingestion guards can veto individual writes. Mode: optional source processing, not an answer-key experiment. Oracle: none. Guidance requests unchanged wording and complete coverage; implementation validates shape, not those semantic properties. Proposed change: searchable chunk text and metadata, not model weights. Failure selects passthrough or paragraph fallback; no semantic rollback after valid but inaccurate JSON is established. SRC-1 kb/llm_enrichment.py.
- implementation conclusion status: wired
- operation conclusion status: uninspected
- Immediate return: EnrichmentOutcome with chunks, used_llm and reason
- Later read-back: accepted generated chunk text and summaries can reach later searches
- Delegated visibility: remote chat receives source text when enabled, above threshold, unflagged and keyed; HTTP/light/shared paths suppress this
- Selection predicate: enrichment enablement, size threshold, scanner, API key; parser accepts nonempty text entries up to MAX_CHUNKS
- Invalidation or expiry: uninspected — no semantic expiry of accepted chunks established; source-key revision rules apply
- Activation or effect: model text becomes ingestion input; no equality or source-coverage check in inspected parser
- Evidence limits: indeterminate semantic relation without concrete input/output; dependency graph extraction remains opaque
text = entry.get("text") if not isinstance(text, str) or not text.strip(): continue ---
kb/llm_enrichment.py
EPI-RTE-digest-build
Label: Organization digest read
No counterpart after comparison with RT-RTE-index-curation: digest output is a separate notification product, not the optimization-note write. Uses the same provider family as RT-CMP-openrouter-chat, with its own request helper and route configuration.
Endpoints/progression: LearningAgent source-sync results plus recent vault context → capped source packet → optional llm_agent_read or deterministic_agent_read → formatted digest → preview/notification routing. Owner: LearningAgent and digest code. Model proposes up to three interpretation lines; code accepts nonempty lines, with no source-entailment validator. Mode: source-update report. Oracle: none. Private-source policy can block model use; disabled/unusable model falls back. Output is not shown ingested as an accepted knowledge claim by this driver. SRC-1 kb/organization_digest.py.
- implementation conclusion status: wired
- operation conclusion status: uninspected
- Immediate return: digest preview, source label, summary and internal formatted text
- Later read-back: inapplicable — inspected driver returns/posts this digest rather than storing it for Citadel read-back
- Delegated visibility: model receives selected source packet; gateway receives formatted digest, not whole source corpus
- Selection predicate: enabled digest, meaningful change predicate; allow_llm, private metadata policy and key; response capped at three lines
- Invalidation or expiry: inapplicable — no persisted digest lifecycle in this inspected driver
- Activation or effect: preview delivery and optional gateway post are wired; actual notification and reliance unobserved
- Evidence limits: no model response or recipient trace; deterministic and generative interpretation cannot be given one entailment classification
for raw_line in message.splitlines(): line = raw_line.strip().lstrip("-* ").strip() if line: lines.append(line) return lines[:3] or None
---
kb/organization_digest.py
EPI-RTE-conflict-record
Label: Contribution conflict detection
Distinct post-admission check adjacent to RT-RTE-ingest-admission; it neither replaces that gate nor evaluates proposition truth.
Endpoints/progression: accepted contribution → title extraction/hash comparison against local GitHub digest or Obsidian sync state → ConflictCandidate → KnowledgeConflictStore JSON → optional mesh record. Owner: code; no human judgment in detection. Target/domain: title/path correspondence and byte-hash difference in those two caches. Mode: automatic after accepted_any when detect_conflicts is set. No answer oracle. Store resolve changes conflict status/note, not source content in inspected implementation. Guidance prefers newer repository material in one generated message, although hash difference alone cannot warrant that preference. SRC-1 kb/learning.py.
- implementation conclusion status: wired
- operation conclusion status: uninspected
- Immediate return: conflict record or None in LearningOutcome
- Later read-back: JSON conflict list/get and mesh record expose retained warning; bounded max_records pruning prefers retaining open records
- Delegated visibility: stored excerpts, hashes and summary, not necessarily full compared sources
- Selection predicate: nontrivial first-line title; case-folded title/path match and different hashes in two local sync caches
- Invalidation or expiry: resolved conflicts pruned before open ones; resolve records note and actor without retracting either source here
- Activation or effect: warning is recorded after admission; no ingestion veto or automatic source-truth correction in inspected sequence
- Evidence limits: hash inequality is not contradiction; full consumer/UI conflict resolution outside inspected methods remains unassessed
conflict = None if detect_conflicts and accepted_any: conflict = self._detect_conflict(data) if conflict and self.mesh: await self.mesh.record_conflict(self.config, conflict=conflict) ---
kb/learning.py
EPI-RTE-verify-report
Label: CLI verify pointers
No counterpart after comparison with RT-RTE-task-search: this consumer adds a local file cue comparison and advisory verification report, rather than hook context.
Endpoints/progression: CLI verify local file → supplied or built query → HTTP search → shape_verify_report → doc-shaped source list, lexical overlaps and warnings → JSON stdout. Owner: CLI and shaping code. Target/domain: token overlap and documentation shape, not correctness of local API claims. Proposer: local caller file; code selects pointers; human/host must perform any substantive external confirmation. Mode: explicit operator command. Oracle: none. Timeout can return ok-shaped report with timed_out flag and zero exit; not a semantic pass. SRC-1 kb/agent_workflows.py.
- implementation conclusion status: wired
- operation conclusion status: uninspected
- Immediate return: JSON report, including timeout/truncation/warnings
- Later read-back: inapplicable — report is current-command output, not a retained verification verdict
- Delegated visibility: search sees generated query, report consumer sees selected snippets/URLs and overlaps
- Selection predicate: query/top_k and doc_type; shared lexical cues capped per hit
- Invalidation or expiry: inapplicable — no acceptance or retained attestation created
- Activation or effect: advisory pointers and live-source confirmation instruction; no write admission blocked by this report
- Evidence limits: search_format internals not independently audited here; no observed user confirmation
"note": "lexical overlap only — open canonical URL / live OpenAPI to confirm", ---
kb/agent_workflows.py
EPI-RTE-benchmark-gate
Label: Retrieval benchmark scoring and enforcement
No counterpart after comparison with RT-RTE-source-projection: offline benchmark artifacts and their comparator assess served retrieval, not worker projection receipts.
Endpoints/progression: question answer_spans/expect_any and served hits → score_question → run artifacts → enforce_acceptance baseline/candidate → cmd_enforce stdout/stderr and exit status. Owner/evaluator: deterministic scorer/comparator. Target/domain: retrieval body-span return, document identity, corpus/chunk and run-comparability criteria, with optional release attempt/latency checks. Oracle: question-authored spans and expected paths, optionally cached-body shingles; their factual correctness is not adjudicated. Proposer: candidate run supplier; decider/veto: comparator refuses missing/noncomparable or regressing evidence. Intended use: bounded benchmark/release comparison, not claim truth or mechanism attribution. Mode: paired benchmark, not online per-content acceptance. Command writes no vault change; shell exit consumer can gate continuation, but no deployment caller is established here. SRC-1 kb/retrieval_eval.py.
- implementation conclusion status: wired
- operation conclusion status: uninspected
- Immediate return: metrics, comparator verdicts/failures, command exit
- Later read-back: saved run JSON can be read for later comparison/report; source does not establish a passing actual run
- Delegated visibility: comparator receives saved artifacts, no new node contact
- Selection predicate: valid JSON run objects; fingerprint and evidence validation; default or release criteria
- Invalidation or expiry: comparability and ground-truth fingerprints can invalidate comparison; no live truth attestation
- Activation or effect: failure returns exit 1; unreadable input returns 2; pass returns 0, without changing vault
- Evidence limits: span can occur in an unexpected document; metric checks do not establish semantic correctness, causal improvement, or whole-corpus coverage
if failures: print("ENFORCE FAILED:", file=sys.stderr) for failure in failures: print(f" {failure}", file=sys.stderr) return 1 ---
kb/retrieval_eval.py
EPI-RTE-automation-receipt
Label: Automated improvement receipt gate
Part of: RT-RTE-index-curation This is the local receipt/scope prerequisite to its automated Cognee-improve call, not the opaque improvement implementation.
Endpoints/progression: service improve(automation=True) / learning automation → require_automation_evaluation → local JSON receipt validation → raise ImprovementEvaluationError or permit Central-only improve. Owner/decider/veto: code; receipt supplier's measurement procedure is uninspected. Target/domain: receipt status/scope, run ID, timezone-aware timestamps and five named Boolean checks. Mode: automated Central maintenance. Oracle: asserted receipt fields, not independently replayed outcomes. Intended use: permission to call improvement until expiry, not acceptance of any generated proposition. Rejection precedes improvement; no content rollback follows merely from gate expiry. SRC-1 kb/improvement_policy.py.
- implementation conclusion status: wired
- operation conclusion status: uninspected
- Immediate return: Boolean internally or exception from require_automation_evaluation
- Later read-back: local receipt is re-read for later automation decisions until expiry/replacement
- Delegated visibility: improvement caller receives exception or permission; source measurement evidence is not loaded by this gate
- Selection predicate: status passed, scope central, nonempty run_id, all five required checks true, nonfuture evaluated_at and future expires_at
- Invalidation or expiry: expires_at makes receipt unusable; invalid or missing JSON fails closed
- Activation or effect: enforcing precondition on automated improvement call; not proof that the five measurements occurred
- Evidence limits: no supplied receipt, issuer execution, authenticated measurement lineage or intervention comparison
if not isinstance(checks, dict) or any( checks.get(name) is not True for name in _REQUIRED_AUTOMATION_CHECKS ): return False ---
kb/improvement_policy.py
EPI-RTE-garbage-cleanup
Label: Legacy garbage cleanup
Distinct from RT-RTE-source-projection: admin-requested classifier/deletion route, not successful projection receipt production.
Endpoints/progression: admin sources:sync /api/admin/graph/cleanup → graph scan plus bounded search probes → _legacy_garbage_kind candidates → dry-run preview or gateway delete_graph_nodes → counts/audit. Owner: operator chooses request and dry_run; deterministic classifier selects candidates; gateway performs deletion. Target/domain: canary/scaffold/cache and timestamped fossil shapes, not truth of ordinary notes. Mode: explicit maintenance; no answer oracle. Admission: admin and dry_run=false permit delete; preview offers human inspection but no bound per-candidate approval evidence. Recovery/rollback of mistaken deletion not established in this method. SRC-1 kb/service.py.
- implementation conclusion status: wired
- operation conclusion status: uninspected
- Immediate return: dry_run, counts_by_kind, candidates and deleted
- Later read-back: inapplicable — candidate list is a request result; deletion changes later retrieval availability rather than supplying retained evidence
- Delegated visibility: operator sees candidate IDs/previews and counts; gateway receives IDs
- Selection predicate: matched graph nodes and hits from five bounded probes; failed probe skipped
- Invalidation or expiry: inapplicable — no acceptance expiry; gateway deletion durability unobserved
- Activation or effect: non-dry-run candidates are passed to delete_graph_nodes; complete physical purge is not established at this call site
- Evidence limits: bounded searches can miss orphaned vectors; classifier safety claim is stronger than absence of real-world false matches established here
deleted = 0 if not dry_run and candidates: deleted = await self.cognee.delete_graph_nodes([c["id"] for c in candidates])
---
kb/service.py
EPI-RTE-source-withdrawal
Label: Lifecycle source withdrawal
Distinct from RT-RTE-source-projection: source-revision tombstone admission and retrieval exclusion, whereas that record describes worker receipt progression.
Endpoints/progression: source key deletion/replacement → tombstone_source → current exact/chunk revision selection → accept_tombstone with replacement identity → current-head retrieval filtering. Owner: service/store code; initiating sync/operator decides deletion, not an epistemic evaluator. Context/effect: changes source lineage and eligibility. Current revision binding rejects obsolete or tombstoned provider hits. It does not erase already-emitted host context. Proposed change: withdraw source from subsequent lifecycle retrieval; no semantic verdict or human truth oracle. Guard is deliberately independent of model-route drift. SRC-1 kb/service.py.
- implementation conclusion status: wired
- operation conclusion status: uninspected
- Immediate return: tuple of acceptance receipts; unsupported without lifecycle store
- Later read-back: later lifecycle retrieval consumes revised current-head/tombstone state; previous source may remain retained for lineage
- Delegated visibility: retrieval filter consumes binding/receipt metadata, not a justification for source falsity
- Selection predicate: dataset/source_key and include_chunks; only non-tombstone current revisions create tombstones
- Invalidation or expiry: obsolete/tombstoned hits are excluded in lifecycle filter; legacy mode is outside this guarantee
- Activation or effect: operational withdrawal, not epistemic refutation; provider physical deletion and every alternate search branch not proven
- Evidence limits: no observed deletion; exact/lexical fallback branches and provider internals prevent a universal erasure claim
if not binding.current or binding.source_revision.tombstone or receipt is None: continue ---
kb/service.py
EPI-RTE-feedback-record
Label: Explicit feedback retention
No counterpart after comparison with RT-RTE-index-curation: rating storage and optional improvement trigger are distinct from optimization proposals.
Endpoints/progression: MCP/CLI /feedback or local service → durable explicit event attempt → Cognee QA cache → on cache miss feedback note ingest → optional allow_llm and auto_improve Central automation. Owner: caller provides rating/text, code selects retention/fallback. Target/domain: caller's usefulness judgment, not an independently known answer. No answer oracle. Mode: explicit rating, not controlled experiment. Fixed guards admit note; receipt gate may veto optional improvement. Default user path is LLM-free. Retained feedback is not evidence that the rated claim was checked against the world. SRC-1 kb/service.py.
- implementation conclusion status: wired
- operation conclusion status: uninspected
- Immediate return: FeedbackResult recorded, improved, ok, reason
- Later read-back: QA cache or searchable feedback note; telemetry event stores text presence rather than full free text
- Delegated visibility: provider cache can receive QA rating and text; fallback note enters configured dataset
- Selection predicate: request identity and rating; cache success vs miss; recorded and allow_llm and auto_improve for improvement
- Invalidation or expiry: uninspected — no feedback semantic expiry in this method
- Activation or effect: recorded/improved flags and retained rating; downstream Cognee improvement effect opaque
- Evidence limits: self-improve proposal prompt does not consume raw rating text in supplied runtime; no demonstrated benefit or weight update
if recorded and allow_llm and self.config.auto_improve: ---
kb/service.py
Claims
EPI-CLM-context-links
Label: Linked untrusted context
Claimed operation: answers carry source pointers and retrieved text is marked untrusted. SRC-1 README.md, doctrine/design. Distinct from RT-CLM-explicit-approval, which governs write consent rather than read warrant.
You ask from wherever you already are: the CLI, the web interface, or MCP. Answers carry a link back to the commit, issue, or document behind them, and retrieved text is marked as untrusted context worth checking before you act on it. ---
README.md
EPI-CLM-promotion-gate
Label: Deliberate promotion gate
Claimed operation: own-space capture crosses a deliberate explicit step into shared memory, keeping it worth reading. SRC-1 README.md, doctrine/design. Related but not identical to RT-CLM-explicit-approval: a public shared-layer quality claim, not only the ingest tool's consent instruction. The runtime's automatic known-work promotion is a countercase to a universal per-item-human reading.
Promotion is the deliberate part. Captured work lands in your own space, and reaching shared org memory takes an explicit step. That gate is what keeps the shared layer worth reading instead of turning it into everyone's scratch notes. ---
README.md
EPI-CLM-preserve-source
Label: Preserve source wording
Claimed operation: enrichment keeps original wording and all source content and does not invent. SRC-1 kb/llm_enrichment.py, doctrine/design prompt; this is a request to the model, not a guaranteed implementation property. Distinct from RT-OBJ-optimize-prompt, which instructs a different curation operation; no supplied claim counterpart.
"Each chunk keeps the original wording (no rewriting), carries a one-line " "summary, and 3-6 short lowercase tags. Preserve all of the source text " "across the chunks. Never invent content and never include secrets." ---
kb/llm_enrichment.py
EPI-CLM-benchmark-score
Label: Reported body-span recall
Claimed operation: bounded 69-question harness body-span retrieval result, explicitly not whole-corpus recall. SRC-1 README.md, reported operation. No counterpart after comparison with RT-CLM-explicit-approval; it is a performance claim, not a consent rule. No supplied execution artifact independently establishes this number.
A 2026-08-03 69-question golden harness scored
answer_recall@5at 0.8974 over the 39 questions carrying validated answer spans. ---README.md
Evidenced absences
none declared in this member
Behavioral-authority paths
none declared in this member