Schema
Noumenon stores everything it knows in one Datomic database per repo. The picture below is the entity graph; the table beneath it is every attribute, parsed from the upstream EDN files at build time.
Entity Diagram
How the codebase-knowledge entities connect. Auth, settings, ask sessions, benchmark/introspect runs, and the artifact tables sit in the same database but are intentionally omitted here so the graph reads cleanly. The full attribute list follows.
erDiagram
REPO {
string repo_uri
string repo_head_sha
}
COMMIT {
string git_sha PK
string commit_message
long commit_timestamp
long commit_additions
long commit_deletions
}
AUTHOR {
string author_name
string author_email
}
DIR {
string dir_path PK
}
FILE {
string file_path PK
keyword file_lang
long file_lines
long file_size
}
CODE {
string code_name
keyword code_kind
long code_line_start
long code_line_end
keyword code_complexity
}
COMPONENT {
string component_name
keyword arch_layer
}
CHUNK {
long chunk_index
string chunk_text
}
REPO ||--o{ COMMIT : "commits"
REPO ||--|| DIR : "root"
DIR ||--o{ DIR : "children"
DIR ||--o{ FILE : "contains"
COMMIT }o--|| AUTHOR : "by"
COMMIT ||--o{ COMMIT : "parents"
COMMIT }o--o{ FILE : "changed-files"
FILE }o--o{ FILE : "imports"
FILE ||--o{ CODE : "segments"
CODE }o--o{ CODE : "calls"
COMPONENT }o--o{ FILE : "files"
COMPONENT }o--o{ COMPONENT : "depends-on"
CHUNK }o--|| FILE : "of file"
CHUNK }o--|| COMPONENT : "of component"Two Databases per Instance
Every Noumenon instance hosts two kinds of database. Per-repo databases hold facts derived from a specific repository: commits, files, code segments, components, the import graph, the TF-IDF index. One per imported repo. Identity is derived from the repo path or URL. Schema files: core.edn, architecture.edn, synthesis.edn, provenance.edn.
The noumenon-internal meta database holds cross-cutting facts about Noumenon itself: introspect runs, ask sessions and feedback, named-query artifacts, prompts, auth tokens, settings. One per instance, fixed name. A prompt change affects every repo, so its history belongs in one place rather than fragmented per-repo. Schema files: ask.edn, benchmark.edn, introspect.edn, artifacts.edn, auth.edn, settings.edn.
Both run on the same Datomic Local storage and share the same schema-attribute namespace. The split is conceptual: facts about your code versus facts about how Noumenon answered questions about your code.
Traversing in Both Directions
Datomic refs are stored once but queried both ways. Forward, you name the attribute. Backward, you prefix the name with an underscore.
;; Forward: which files does this file import?
[?file :file/imports ?dep]
;; Backward: which files import this file?
[?file :file/_imports ?dependent]
;; Forward: which segments does this code segment call?
[?caller :code/calls ?callee]
;; Backward: which segments call this one?
[?callee :code/_calls ?caller]Every :db.type/ref in the schema below is a candidate for backward traversal. The Ask agent and the named-query catalog use both directions extensively.
Attribute Reference
249 attributes across 28 namespaces, parsed from resources/schema/ in the noumenon repo. Filter by name or by description text.
:git/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:git/sha | :string | one | yes | Content-addressed SHA hash of a git object |
:git/type | :keyword | one | Git object type — :commit, :tree, :blob, :tag |
:repo/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:repo/uri | :string | one | yes | Repository URI |
:repo/head-sha | :string | one | Git HEAD SHA at last sync — used for staleness detection | |
:repo/commits | :ref | many | Commits belonging to this repository |
:commit/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:commit/tree | :ref | one | Tree object for this commit | |
:commit/parents | :ref | many | Parent commits | |
:commit/message | :string | one | Commit message, truncated to 4096 chars | |
:commit/author | :ref | one | Person who authored the commit | |
:commit/authored-at | :instant | one | Timestamp when the commit was authored | |
:commit/committer | :ref | one | Person who committed | |
:commit/committed-at | :instant | one | Timestamp when the commit was committed | |
:commit/changed-files | :ref | many | Files changed in this commit, derived from git log --numstat | |
:commit/kind | :keyword | one | Commit classification — :fix, :feat, :refactor, :chore, :docs, :test, :style, :perf, :revert, :merge, :other | |
:commit/additions | :long | one | Total lines added across all files in this commit | |
:commit/deletions | :long | one | Total lines deleted across all files in this commit | |
:commit/issue-refs | :string | many | Issue references extracted from commit message — keys (#123, PROJ-456) and URLs |
:person/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:person/email | :string | one | yes | Git author/committer email |
:person/name | :string | one | Git author/committer display name |
:file/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:file/path | :string | one | yes | File path relative to repo root |
:file/ext | :string | one | File extension | |
:file/lang | :keyword | one | Detected programming language | |
:file/lines | :long | one | Line count | |
:file/size | :long | one | File size in bytes | |
:file/directory | :ref | one | Parent directory | |
:file/blob-sha | :string | one | Git blob SHA of the file's content at the imported revision — enables content-addressed analysis promotion across branches | |
:file/deleted? | :boolean | one | Tombstone marker for delta DBs — true means this file is deleted relative to the parent (trunk) DB. Never set in trunk DBs; trunk deletions hard-retract the entity instead. | |
:file/imports | :ref | many | Deterministically resolved file-to-file import edges — refs to other :file/path entities |
:dir/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:dir/path | :string | one | yes | Directory path relative to repo root |
:dir/parent | :ref | one | Parent directory | |
:dir/repo | :ref | one | Repository this directory belongs to (set on root dir only) |
:tree/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:tree/nodes | :ref | many | Tree node children (component) |
:node/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:node/filename | :string | one | Node filename within tree | |
:node/object | :ref | one | Git object this node references | |
:node/paths | :ref | many | File entities this node maps to |
:tx/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:tx/op | :keyword | one | Transaction operation — :import, :analyze, :llm-analyze, :promote | |
:tx/source | :keyword | one | Data source — :deterministic, :llm, or :promoted | |
:tx/analyzer | :string | one | Analyzer name and version | |
:tx/model | :string | one | LLM model identifier for LLM-sourced transactions | |
:tx/model-source | :keyword | one | Source of tx/model — :resolved-model, :requested-model, or :unknown | |
:tx/provider | :string | one | LLM provider identifier for LLM-sourced transactions | |
:tx/input-tokens | :long | one | Input tokens consumed by this transaction's LLM call | |
:tx/output-tokens | :long | one | Output tokens produced by this transaction's LLM call | |
:tx/cost-usd | :double | one | Estimated USD cost of this transaction's LLM call | |
:tx/artifact-source | :keyword | one | Source of artifact change: :bootstrap, :reseed, :introspect, :manual-cli, :manual-mcp |
:code/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:code/name | :string | one | Function/struct/type name | |
:code/file | :ref | one | File containing this code segment | |
:code/file+name | :tuple | one | yes | Composite identity for code segments — file ref + name |
:code/text | :string | one | Source text, up to 4096 chars; longer code chunked via :chunk/ | |
:code/kind | :keyword | one | Segment kind — :function :method :class :interface :trait :protocol :macro :multimethod :record :type :struct :enum :union :typedef :constant :property :module :namespace :global :include | |
:code/line-start | :long | one | Starting line number | |
:code/line-end | :long | one | Ending line number | |
:code/args | :string | one | Parameter list — e.g. "[x y]" (Clojure), "(int x, String y)" (Java) | |
:code/returns | :string | one | Return type — e.g. "void", "int", "Promise<string>". Omit for languages without explicit return types. | |
:code/visibility | :keyword | one | Access level — :public, :private, :protected, :internal, :package | |
:code/docstring | :string | one | Documentation comment text, max 4096 chars | |
:code/deprecated? | :boolean | one | Whether this segment is marked as deprecated | |
:code/complexity | :keyword | one | Per-segment complexity — :trivial, :simple, :moderate, :complex, :very-complex | |
:code/smells | :keyword | many | Code smell indicators — :deep-nesting, :too-many-params, :long-method, :god-function, :feature-envy, :magic-numbers, :mutation-heavy, :global-state, :duplication, :poor-naming, :dead-code, :complex-conditional | |
:code/purpose | :string | one | One-line plain-English description of what this segment does | |
:code/safety-concerns | :keyword | many | Security/safety flags — :sql-injection, :xss, :race-condition, :unsafe-cast, :path-traversal, :command-injection, :buffer-overflow, :deserialization, :hardcoded-secret, :insecure-random, :unvalidated-redirect | |
:code/error-handling | :keyword | one | Error handling quality — :none, :basic, :robust | |
:code/calls | :ref | many | Outbound call references to other code segments (use :code/_calls for reverse) | |
:code/call-names | :string | many | Unresolved function/method names this segment calls — enables dead-code detection and rough call-graph queries | |
:code/pure? | :boolean | one | Whether segment is side-effect-free (no I/O, mutation, or global state) | |
:code/ai-likelihood | :keyword | one | AI-authorship likelihood — :likely-ai, :possibly-ai, :likely-human, :unknown |
:arch/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:arch/layer | :keyword | one | Architectural layer — :core, :subsystem, :driver, :api, :util | |
:arch/subsystem | :string | one | Subsystem identifier, e.g. scheduler, vfs, ext4 | |
:arch/component | :ref | one | Component this entity belongs to |
:component/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:component/name | :string | one | yes | Logical component name |
:component/depends-on | :ref | many | Component dependencies | |
:component/files | :ref | many | Files belonging to this component | |
:component/summary | :string | one | Plain-English summary of what this component does | |
:component/purpose | :string | one | Why this component exists — its role in the system | |
:component/layer | :keyword | one | Architectural layer — :core, :subsystem, :driver, :api, :util | |
:component/category | :keyword | one | Domain role — :backend, :frontend, :infrastructure, :configuration, :data, :testing, :documentation, :tooling, :shared | |
:component/patterns | :keyword | many | Architectural patterns spanning this component — :pipeline, :state-machine, :producer-consumer, etc. | |
:component/complexity | :keyword | one | Aggregate complexity — :trivial, :simple, :moderate, :complex, :very-complex | |
:component/subsystem | :string | one | Subsystem grouping — coarser than component, e.g. 'analysis-pipeline', 'query-engine' |
:sem/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:sem/dependencies | :string | many | DEPRECATED — use :file/imports instead. Raw import/require/use names from LLM first-pass, superseded by deterministic extraction. | |
:sem/summary | :string | one | Plain-English summary, max 4096 chars | |
:sem/purpose | :string | one | Purpose/rationale for code existence | |
:sem/tags | :keyword | many | Semantic tags — :error-handling, :locking, :allocation, :io, :parsing, etc. | |
:sem/complexity | :keyword | one | Complexity rating — :trivial, :simple, :moderate, :complex, :very-complex | |
:sem/patterns | :keyword | many | Design patterns — :callback, :state-machine, :producer-consumer, :ref-counting | |
:sem/category | :keyword | one | Domain role — :backend, :frontend, :infrastructure, :configuration, :data, :testing, :documentation, :tooling, :shared | |
:sem/synthesis-hints | :string | one | EDN blob of architectural hints from file-level analysis — layer-guess, category-guess, patterns-observed, purpose-guess, architectural-notes |
:chunk/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:chunk/parent | :ref | one | Parent entity (File or CodeSegment) | |
:chunk/index | :long | one | Sequence number within parent | |
:chunk/text | :string | one | Text content of this chunk, up to 4096 chars |
:artifact.query/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:artifact.query/name | :string | one | yes | Unique query identifier (e.g. "hotspots") |
:artifact.query/description | :string | one | Human-readable description of what the query finds | |
:artifact.query/query-edn | :string | one | Datalog query vector as pr-str EDN | |
:artifact.query/inputs | :string | one | Parameter names as pr-str EDN vector (e.g. "[:file-path]") | |
:artifact.query/uses-rules | :boolean | one | True if query requires Datalog rules passed as % | |
:artifact.query/active | :boolean | one | Whether this query is available for execution (replaces index.edn allowlist) | |
:artifact.query/federation-safe? | :boolean | one | DEPRECATED — derived from :artifact.query/federation-mode. Kept for response shape (the launcher's banner toggles on this). Set automatically when federation-mode is non-nil; not read from query EDN anymore. | |
:artifact.query/federation-mode | :keyword | one | Federation merge mode declared by the query. :tombstone-only — trunk minus tombstoned paths; never include delta rows (the safe default). :added-files-merge — current trunk-plus-delta-rows behavior; opt-in for queries that join only on :stable attrs (validated at seed time). Absent — query is not federation-safe; trunk-only response. |
:artifact.rules/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:artifact.rules/id | :string | one | yes | Rules identifier (always "default") |
:artifact.rules/edn | :string | one | Datalog rules vector as pr-str EDN |
:artifact.prompt/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:artifact.prompt/name | :string | one | yes | Prompt identifier (e.g. "agent-system", "analyze-file") |
:artifact.prompt/template | :string | one | Prompt template string — for templates under 4KB | |
:artifact.prompt/chunks | :ref | many | Ordered chunks for templates exceeding 4KB string limit | |
:artifact.prompt/version | :string | one | Prompt version string (e.g. "0.6.0") |
:artifact.chunk/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:artifact.chunk/ordinal | :long | one | Zero-based ordering of chunk within parent | |
:artifact.chunk/content | :string | one | Chunk content string (up to 4KB) |
:ask.session/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:ask.session/id | :string | one | yes | Unique session identifier (UUID) |
:ask.session/question | :string | one | The original question text | |
:ask.session/answer | :string | one | Final answer text returned to the user | |
:ask.session/status | :keyword | one | Outcome: :answered, :budget-exhausted, :error | |
:ask.session/channel | :keyword | one | How the question was asked: :cli, :ui, :mcp | |
:ask.session/caller | :keyword | one | Who asked: :human or :ai-agent | |
:ask.session/repo | :string | one | Database name the question was asked against | |
:ask.session/started-at | :instant | one | When the session began | |
:ask.session/duration-ms | :long | one | Total wall-clock time in milliseconds | |
:ask.session/input-tokens | :long | one | Total LLM input tokens consumed | |
:ask.session/output-tokens | :long | one | Total LLM output tokens consumed | |
:ask.session/iterations | :long | one | Number of agent loop iterations | |
:ask.session/feedback | :keyword | one | User feedback: :positive, :negative, or nil (no feedback yet) | |
:ask.session/feedback-comment | :string | one | Optional free-text comment from the user about the answer quality | |
:ask.session/steps | :ref | many | Ordered step entities for this session | |
:ask.session/missing-attributes | :string | one | EDN vector of attributes/relationships the agent needed but couldn't find | |
:ask.session/quality-issues | :string | one | EDN vector of data quality problems the agent observed | |
:ask.session/suggested-queries | :string | one | EDN vector of named query descriptions the agent wished existed | |
:ask.session/agent-notes | :string | one | Free-text observations from the agent about the data | |
:ask.session/seed-results | :string | one | EDN vector of TF-IDF seed results [{:kind :path/:name :score}] |
:ask.step/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:ask.step/ordinal | :long | one | Zero-based step index within the session | |
:ask.step/type | :keyword | one | Step type: :query, :schema, :rules, :answer, :error | |
:ask.step/query-edn | :string | one | Datalog query as pr-str EDN (when type is :query) | |
:ask.step/result-count | :long | one | Number of result rows returned | |
:ask.step/result-sample | :string | one | First few result rows as pr-str EDN (up to 4KB) | |
:ask.step/reasoning | :string | one | LLM reasoning text before the tool call | |
:ask.step/elapsed-ms | :long | one | Wall-clock time for this step in milliseconds |
:bench.run/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:bench.run/id | :string | one | yes | Benchmark run identifier (timestamp-uuid) |
:bench.run/repo-path | :string | one | Repository path benchmarked | |
:bench.run/commit-sha | :string | one | Git HEAD SHA at time of benchmark | |
:bench.run/started-at | :instant | one | When the benchmark run started | |
:bench.run/completed-at | :instant | one | When the benchmark run completed | |
:bench.run/duration-ms | :long | one | Wall-clock duration in milliseconds | |
:bench.run/model-config | :string | one | Model configuration as EDN string {:provider :model :judge-model} | |
:bench.run/resolved-model | :string | one | Actual model ID resolved from alias (e.g. claude-sonnet-4-6-20250514) | |
:bench.run/resolved-judge-model | :string | one | Actual judge model ID resolved from alias | |
:bench.run/concurrency | :long | one | Parallel workers used | |
:bench.run/noumenon-version | :string | one | Noumenon version at benchmark time | |
:bench.run/layers | :string | one | EDN vector of conditions run, e.g. [:raw :full] | |
:bench.run/status | :keyword | one | Run outcome — :completed, :stopped, :error | |
:bench.run/stop-reason | :keyword | one | Why the run stopped early — :max-questions, :max-cost, :stop-after | |
:bench.run/error-message | :string | one | Error details when status is :error | |
:bench.run/canonical? | :boolean | one | True if full mode with all layers and no skip flags — only canonical runs are comparable | |
:bench.run/completed-count | :long | one | Questions actually completed | |
:bench.run/expected-count | :long | one | Questions expected to complete | |
:bench.run/empty-context-count | :long | one | Questions where KG query returned no data — indicates pipeline gaps | |
:bench.run/mode | :string | one | EDN mode flags, e.g. {:skip-raw true :deterministic-only true} | |
:bench.run/tags | :keyword | many | Free-form labels — :baseline, :pre-refactor, :after-import-fix, etc. | |
:bench.run/notes | :string | one | Free-text annotation about the run | |
:bench.run/question-set-hash | :string | one | SHA-256 of questions EDN — detects question changes between runs | |
:bench.run/rubric-hash | :string | one | SHA-256 of judge template | |
:bench.run/answer-prompt-hash | :string | one | SHA-256 of answer prompt template | |
:bench.run/db-basis-t | :long | one | Datomic (d/basis-t db) — exact KG state at benchmark time | |
:bench.run/question-count | :long | one | Number of scored questions | |
:bench.run/raw-mean | :double | one | Mean score for :raw condition (0.0-1.0) | |
:bench.run/import-mean | :double | one | Mean score for :import condition (absent if not run) | |
:bench.run/enrich-mean | :double | one | Mean score for :enrich condition (absent if not run) | |
:bench.run/full-mean | :double | one | Mean score for :full condition (0.0-1.0) | |
:bench.run/weighted-raw-mean | :double | one | Category-weighted mean score for :raw condition | |
:bench.run/weighted-import-mean | :double | one | Category-weighted mean score for :import condition | |
:bench.run/weighted-enrich-mean | :double | one | Category-weighted mean score for :enrich condition | |
:bench.run/weighted-full-mean | :double | one | Category-weighted mean score for :full condition | |
:bench.run/embedded-mean | :double | one | Mean score for :embedded (TF-IDF) condition (absent if not run) | |
:bench.run/weighted-embedded-mean | :double | one | Category-weighted mean score for :embedded condition | |
:bench.run/deterministic-count | :long | one | Number of deterministically scored questions | |
:bench.run/deterministic-mean | :double | one | Mean score for deterministically scored questions | |
:bench.run/llm-judged-count | :long | one | Number of LLM-judged questions | |
:bench.run/llm-judged-mean | :double | one | Mean score for LLM-judged questions | |
:bench.run/input-tokens | :long | one | Total input tokens consumed | |
:bench.run/output-tokens | :long | one | Total output tokens produced | |
:bench.run/cost-usd | :double | one | Total estimated cost in USD | |
:bench.run/results | :ref | many | Per-question result entities (component — retracted with run) | |
:bench.run/checkpoint-path | :string | one | Path to the EDN checkpoint file with full answer text | |
:bench.run/report-path | :string | one | Path to generated Markdown report |
:bench.result/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:bench.result/question-id | :keyword | one | Question identifier — :q01, :q02, etc. | |
:bench.result/category | :keyword | one | Question category — :single-hop, :multi-hop, :architectural | |
:bench.result/scoring | :keyword | one | Scoring method — :deterministic or :llm | |
:bench.result/query-name | :string | one | Named Datalog query used for context | |
:bench.result/question-text | :string | one | Resolved question text (with substituted parameters) | |
:bench.result/min-layer | :keyword | one | Minimum layer needed to answer — :import, :enrich, or :full | |
:bench.result/raw-score | :keyword | one | Score for raw condition — :correct, :partial, :wrong | |
:bench.result/raw-reasoning | :string | one | Judge reasoning for raw condition score | |
:bench.result/raw-tokens | :long | one | Input + output tokens for raw condition | |
:bench.result/import-score | :keyword | one | Score for import condition — :correct, :partial, :wrong | |
:bench.result/import-reasoning | :string | one | Judge reasoning for import condition score | |
:bench.result/import-tokens | :long | one | Input + output tokens for import condition | |
:bench.result/enrich-score | :keyword | one | Score for enrich condition — :correct, :partial, :wrong | |
:bench.result/enrich-reasoning | :string | one | Judge reasoning for enrich condition score | |
:bench.result/enrich-tokens | :long | one | Input + output tokens for enrich condition | |
:bench.result/full-score | :keyword | one | Score for full KG condition — :correct, :partial, :wrong | |
:bench.result/full-reasoning | :string | one | Judge reasoning for full KG condition score | |
:bench.result/full-tokens | :long | one | Input + output tokens for full KG condition | |
:bench.result/embedded-score | :keyword | one | Score for TF-IDF embedded condition — :correct, :partial, :wrong | |
:bench.result/embedded-reasoning | :string | one | Judge reasoning for TF-IDF embedded condition score | |
:bench.result/embedded-tokens | :long | one | Input + output tokens for TF-IDF embedded condition |
:introspect.run/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:introspect.run/id | :string | one | yes | Introspect run identifier (timestamp-uuid) |
:introspect.run/repo-path | :string | one | Repository path used for evaluation | |
:introspect.run/commit-sha | :string | one | Git HEAD SHA at time of run | |
:introspect.run/started-at | :instant | one | When the introspect run started | |
:introspect.run/completed-at | :instant | one | When the introspect run completed | |
:introspect.run/duration-ms | :long | one | Wall-clock duration in milliseconds | |
:introspect.run/model-config | :string | one | Model configuration as EDN string {:provider :model} | |
:introspect.run/max-iterations | :long | one | Maximum iterations configured for this run | |
:introspect.run/noumenon-version | :string | one | Noumenon version at run time | |
:introspect.run/prompt-hash | :string | one | SHA-256 of agent system prompt at run start | |
:introspect.run/examples-hash | :string | one | SHA-256 of agent examples at run start | |
:introspect.run/rules-hash | :string | one | SHA-256 of Datalog rules at run start | |
:introspect.run/db-basis-t | :long | one | Datomic basis-t of the target repo database at evaluation time | |
:introspect.run/baseline-mean | :double | one | Baseline mean score at run start (0.0-1.0) | |
:introspect.run/final-mean | :double | one | Final mean score at run end (0.0-1.0) | |
:introspect.run/improvement-count | :long | one | Number of iterations that improved the score | |
:introspect.run/iteration-count | :long | one | Total iterations completed | |
:introspect.run/cost-usd | :double | one | Total estimated cost in USD | |
:introspect.run/iterations | :ref | many | Per-iteration result entities (component — retracted with run) |
:introspect.iter/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:introspect.iter/index | :long | one | 1-indexed iteration number within the run | |
:introspect.iter/target | :keyword | one | Optimization target — :examples, :system-prompt, :rules, :code, :train | |
:introspect.iter/goal | :string | one | Self-described improvement goal | |
:introspect.iter/rationale | :string | one | Optimizer's reasoning for the proposed change | |
:introspect.iter/outcome | :keyword | one | Iteration outcome — :improved, :reverted, :skipped, :gate-failed, :error | |
:introspect.iter/baseline-mean | :double | one | Score before this iteration | |
:introspect.iter/result-mean | :double | one | Score after this iteration (before keep/revert decision) | |
:introspect.iter/delta | :double | one | Score change (result-mean - baseline-mean) | |
:introspect.iter/timestamp | :instant | one | When this iteration completed | |
:introspect.iter/modification | :string | one | EDN string of the modification applied (only for :improved outcomes) | |
:introspect.iter/error | :string | one | Error message when outcome is :error |
:prov/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:prov/confidence | :double | one | LLM confidence score, 0.0–1.0 — asserted on entity (file/code-segment), not on tx | |
:prov/model-version | :string | one | Specific LLM model version identifier | |
:prov/prompt-hash | :string | one | SHA hash of prompt template used | |
:prov/analyzed-at | :instant | one | Timestamp when LLM analysis was performed | |
:prov/promoted-from | :ref | one | Donor transaction this analysis was promoted from — set on tx entities when content-addressed promotion copies an analysis from another tx instead of re-running the LLM. Same-DB lookup: the ref points within the recipient's DB. Cross-DB lookup: the donor tx-id is opaque from the recipient's perspective; pair this with :prov/promoted-from-db-name for the breadcrumb | |
:prov/promoted-from-db-name | :string | one | Database name of the donor when promotion crossed databases (e.g. trunk DB name when a delta promoted from trunk). Nil for same-DB promotions |
:token/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:token/id | :uuid | one | yes | Token UUID (public identifier for list/revoke) |
:token/hash | :string | one | yes | SHA-256 hash of the token value (never store raw tokens) |
:token/role | :keyword | one | Access role — :reader or :admin | |
:token/label | :string | one | Human-readable label (e.g. alice, CI bot) | |
:token/created-at | :instant | one | When the token was created | |
:token/revoked? | :boolean | one | True if token has been revoked |
:managed-repo/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:managed-repo/db-name | :string | one | yes | Database name for this managed repo (identity) |
:managed-repo/url | :string | one | Git remote URL | |
:managed-repo/branch | :string | one | Branch to track (default: main) | |
:managed-repo/registered-at | :instant | one | When this repo was registered |
:setting/
| Attribute | Type | Card. | Unique | What it means |
|---|---|---|---|---|
:setting/key | :string | one | yes | Setting identifier (e.g. "theme", "sidebar-collapsed") |
:setting/value | :string | one | Setting value as pr-str EDN |
For the live schema as the running daemon sees it (including any attributes added since this site last built), run noum show-schema <repo> or call noumenon_get_schema over MCP.