Traits
A trait is a named micro-capability: a partial schema contributing zero or more attributes to the entity that declares it. Composition is commutative and associative; the trait vocabulary is closed and canonical, and a name is never renamed or aliased.
Traits marked (marker) contribute no attributes: they declare a capability whose data lives in edges, which are stored once, outgoing direction only.
Base
| Trait | Attributes contributed | Notes |
|---|---|---|
TNamed |
name: string |
Not universal: lambdas, closures, Rust impl blocks, Java constructors have no own name |
TSourceAnchor |
anchor: SourceAnchor |
Evidence for the entity’s declaration |
TComment |
comments: string[] |
Attached documentation/comments |
Containment and attachment
Where an entity is written (lexical containment) and what it semantically belongs to (attachment) are different relations, and both are kept.
| Trait | Attributes contributed | Relation expressed |
|---|---|---|
TWithChildren |
children: EntityId[] (v1 only, see below) |
lexical containment, downward |
TChildOf |
parent: EntityId |
lexical containment, upward — the STORED direction |
TAttachedTo |
attachedTo: EntityId |
semantic attachment. Required by: Go receiver methods, Rust impl blocks, C# extension methods, Clojure extend-type/defmethod |
A Go method with receiver (o *Order) is a child of its file/package and attached to Order.
children is an inverse index, not a fact. It is the exact inverse of parent, and inverse views are derived in memory, never serialized. TWithChildren stays a declared trait: it says an entity is a container. Only the serialized key goes.
Modularity
| Trait | Attributes contributed | Notes |
|---|---|---|
TModule |
definedIn: string[] (CodeFile paths), isStub: boolean |
module↔file cardinality varies by language: 1-1 (JS/TS/Python: module is the file), 1-N (Java package, C#/Go/PHP namespace), N-N (Rust inline mod). A stub module has definedIn: [], which is exactly what makes it external |
Types
| Trait | Attributes contributed | Notes |
|---|---|---|
TType |
isStub: boolean |
any type-like entity: class, interface, struct, enum, protocol, PHP/Rust trait |
TWithInheritances |
(marker) — see inheritance edges |
multiple inheritance = N edges (Python). Absent from the Go and Rust profiles — that absence is profile information, not a gap |
TWithImplements |
(marker) — see interfaceImplementation edges |
|
TTypedEntity |
declaredType?: EntityId |
optional even when the trait is present: absent value in JS/Python/Clojure, C# var, inferred Go/TS/Rust |
Behavior
| Trait | Attributes contributed | Notes |
|---|---|---|
TInvocable |
signature: string |
signature is part of identity (Java/C# overloads, Go receivers) |
TWithParameters |
parameters: EntityId[] |
ordered |
TWithLocalVariables |
localVariables: EntityId[] |
|
TWithInvocations |
(marker) — see invocation edges |
outgoing only; incoming is derived by the analyzer, never stored |
Structure
| Trait | Attributes contributed | Notes |
|---|---|---|
TStructural |
(marker) — value holder | attributes, variables, parameters, Clojure vars. Legal target of access edges |
TWithAccesses |
(marker) — see access edges |
outgoing only |
TWithValue |
value: Literal |
the entity’s declaration-site constant value. Optional wherever licensed — absence means “not constant”, never “empty” |
Measures
| Trait | Attributes contributed | Notes |
|---|---|---|
TMetrics |
metrics: Record<string, number> |
open map of measured finite numbers. Only the extractor writes it |
The composition that motivates the design
A Clojure var holding a function is simultaneously named, a value holder, and invocable: traits: [TNamed, TStructural, TInvocable]. No tree-shaped hierarchy can place it; trait composition expresses it directly. The argument is in Why traits.
The closed vocabulary
Nineteen names, in the order the header dictionary’s enum declares them:
TNamed · TSourceAnchor · TComment · TWithChildren · TChildOf · TAttachedTo · TModule · TType · TWithInheritances · TWithImplements · TTypedEntity · TInvocable · TWithParameters · TWithLocalVariables · TWithInvocations · TStructural · TWithAccesses · TMetrics · TWithValue
The keys each contributes on the wire are listed under model.jsonl.