domain-facts.json
One dossier per corpus type, with every fact the model holds about it pre-joined: annotations with their written arguments, fields joined to their declared types, operations with their invocations, accesses and throw sites. Written by domain-facts.
No dossier is emitted for a stub type. Field names are those of DomainFacts in packages/analyzer/src/domain-facts.ts.
Top level
| Field | Type | Meaning |
|---|---|---|
kind | string | always codegraph.domainFacts/1 |
generatedBy | string | always @codegraph/analyzer |
view | ViewDescriptor | {name, filters} |
langs | string[] | distinct lang values in the union, sorted |
framework | string | the framework profile applied, when one was |
modules | ModuleFact[] | sorted by id |
types | TypeDossier[] | sorted by id |
diagnostics | object | types, operations, invocations, accesses, throwSites, and wiring when a framework was applied |
modules[] — ModuleFact
| Field | Type | Meaning |
|---|---|---|
id | EntityId | |
name | string | |
types | EntityId[] | the dossier types this module contains, sorted |
imports | ModuleImportFact[] | {to, name?, count, external} — count is the base import edges folded into this one |
types[] — TypeDossier
| Field | Type | Meaning |
|---|---|---|
id | EntityId | |
kind | string | |
name | string | |
module | EntityId | the containing module |
anchor | {file, span} | |
loc | number | gross span length, derived from the anchor |
stereotype | string | the framework’s own word for what the type is FOR, when a profile said so |
annotations | AnnotationFact[] | |
supertypes | SupertypeFact[] | |
metrics | Record<string, number> | the extractor’s measures, unmodified; absent means “not measured” |
fields | FieldFact[] | |
operations | OperationFact[] | |
injectionPoints | InjectionPoint[] | where the container hands dependencies in, with the corpus candidates |
AnnotationFact
| Field | Meaning |
|---|---|
annotation | the annotation type — normally a stub, its jar being absent |
name | its simple name, when the model carries one |
module | the declaring module’s name — what a framework table matches on |
arguments | NamedArgument[], the written values |
anchor |
SupertypeFact
{to, name?, relation, external, provenance} — relation is "inheritance" or "interfaceImplementation".
FieldFact
| Field | Meaning |
|---|---|
id, kind, name | |
declaredType, declaredTypeName | |
declaredTypeKind | the declared type’s profile kind (enum, class, …) — carried, not interpreted |
declaredTypeExternal | |
annotations | |
value | the declaration-site constant (Literal), when the model carries one |
anchor |
OperationFact
| Field | Meaning |
|---|---|
id, kind, name, signature, anchor | |
loc | gross span length |
entryPoint | a framework entry-point annotation sits on it (nothing in the corpus calls it) |
annotations | |
metrics | the extractor’s measures; absent means “not measured” |
invocations | InvocationFact[] — includes facts from nested lambdas and blocks, anchored where they occurred |
accesses | AccessFact[] |
throws | ThrowFact[] |
InvocationFact: {to, targetType?, targetTypeName?, targetStereotype?, external, provenance, anchor}.
AccessFact: {to, field?, ownerType?, ownerTypeName?, isRead, isWrite, external, provenance, anchor}.
ThrowFact: {to, name?, external, provenance, anchor}.
InjectionPoint
Present only with --framework. An inference, labelled as one.
| Field | Meaning |
|---|---|
id | the attribute or parameter the container fills |
consumer | the stereotyped type it belongs to |
declaredType | the declared type asked for; absent when the model does not say |
via | "annotation" or "sole-constructor" — how the point was recognized |
qualifier | @Qualifier("x") / @Named("x"), when one narrows this point |
candidates | corpus implementations the container could supply, sorted; possibly empty |
note | why the candidate set is empty or narrowed — stated, never silent |
Excerpt
codegraph domain-facts fixtures/java/expected/model.jsonl — 19 type dossiers, 58 operations — trimmed:
{
"kind": "codegraph.domainFacts/1",
"generatedBy": "@codegraph/analyzer",
"view": { "name": "all", "filters": [] },
"langs": ["java"],
"modules": [
{ "id": "java:com.acme.order", "name": "com.acme.order",
"types": ["java:com.acme.order/AbstractOrder", "java:com.acme.order/Audited"],
"imports": [
{ "to": "java:com.megacorp.ledger", "name": "com.megacorp.ledger", "count": 2, "external": true },
{ "to": "java:java.lang.annotation", "name": "java.lang.annotation", "count": 2, "external": true }
] }
],
"types": [
{ "id": "java:com.acme.order.adapter/LedgerAdapter", "kind": "class", "name": "LedgerAdapter",
"supertypes": [
{ "to": "java:com.megacorp.ledger/LedgerClient", "name": "LedgerClient",
"relation": "inheritance", "external": true, "provenance": "declared" }
],
"fields": [
{ "id": "java:com.acme.order/Order.MAX_LINES", "kind": "attribute", "name": "MAX_LINES",
"annotations": [], "value": { "k": "number", "v": "100" },
"anchor": { "file": "com/acme/order/Order.java", "span": [9, 9] } }
],
"operations": [
{ "id": "java:com.acme.order.adapter/LedgerAdapter.post(java.lang.Object)",
"kind": "method", "name": "post", "signature": "post(java.lang.Object)",
"anchor": { "file": "com/acme/order/adapter/LedgerAdapter.java", "span": [11, 14] },
"loc": 4, "entryPoint": false,
"annotations": [
{ "annotation": "java:java.lang/Override", "name": "Override", "module": "java.lang",
"arguments": [],
"anchor": { "file": "com/acme/order/adapter/LedgerAdapter.java", "span": [10, 10] } }
],
"metrics": { "cyclomatic": 1, "sloc": 4 },
"invocations": [
{ "to": "java:com.acme.order.adapter/AuditTrail",
"targetType": "java:com.acme.order.adapter/AuditTrail", "targetTypeName": "AuditTrail",
"external": true, "provenance": "declared",
"anchor": { "file": "com/acme/order/adapter/LedgerAdapter.java", "span": [12, 12] } }
],
"accesses": [
{ "to": "java:com.acme.order.adapter/LedgerAdapter.trail", "field": "trail",
"ownerType": "java:com.acme.order.adapter/LedgerAdapter", "ownerTypeName": "LedgerAdapter",
"isRead": true, "isWrite": false, "external": false, "provenance": "declared",
"anchor": { "file": "com/acme/order/adapter/LedgerAdapter.java", "span": [12, 12] } }
],
"throws": [] }
],
"injectionPoints": [] }
],
"diagnostics": { "types": 19, "operations": 58, "invocations": 48, "accesses": 33, "throwSites": 2 }
}An annotation with a written argument, from the same run:
{ "annotation": "java:java.lang.annotation/Retention", "name": "Retention",
"module": "java.lang.annotation",
"arguments": [
{ "name": "value",
"value": { "k": "enum", "type": "java:java.lang.annotation/RetentionPolicy", "name": "RUNTIME" } }
],
"anchor": { "file": "com/acme/order/Audited.java", "span": [7, 7] } }Deterministic: two runs over one model are byte-identical.