Is your feature request related to a problem? Please describe.
Target: canonical schema v2 (epic #69), with the model-composition layer routed through design first — it is new contract surface. From the external v0.3.0/Odoo quality audit, finding CLDK-004 (severity Critical).
Describe the solution you'd like
Not stated in the original issue.
Describe alternatives you've considered
Not stated in the original issue.
Additional context
Audit evidence (Odoo, native export)
- 1,235
_name and 2,663 _inherit class attributes exist as :PyAttribute nodes — with zero captured literal values (no value/initializer property).
- Zero model-composition relationship types exist in the schema (nothing matching ODOO/MODEL/INHERIT).
So _name = 'account.account' is present as a node named _name whose defining string is unrecoverable from the graph, and Odoo's registry-based model composition (multiple classes contributing to one model via _inherit) has no representation at all.
Root cause — two independent gaps
- Class-attribute values are dropped at capture.
PyClassAttribute (codeanalyzer/schema/py_schema.py:293-300) has no value/initializer field, and _class_attributes (symbol_table_builder.py:356-432) extracts only the name and a Jedi-inferred type, never the assignment's RHS. This is an asymmetry: PyVariableDeclaration (module/local variables) does keep initializer.
- No framework-semantics layer exists. The analyzer is fully framework-agnostic; the only inheritance edge is
PY_EXTENDS over lexical base classes, which cannot express registry composition declared through _inherit strings.
Fix direction
Is your feature request related to a problem? Please describe.
Describe the solution you'd like
Not stated in the original issue.
Describe alternatives you've considered
Not stated in the original issue.
Additional context
Audit evidence (Odoo, native export)
_nameand 2,663_inheritclass attributes exist as:PyAttributenodes — with zero captured literal values (novalue/initializerproperty).So
_name = 'account.account'is present as a node named_namewhose defining string is unrecoverable from the graph, and Odoo's registry-based model composition (multiple classes contributing to one model via_inherit) has no representation at all.Root cause — two independent gaps
PyClassAttribute(codeanalyzer/schema/py_schema.py:293-300) has no value/initializer field, and_class_attributes(symbol_table_builder.py:356-432) extracts only the name and a Jedi-inferred type, never the assignment's RHS. This is an asymmetry:PyVariableDeclaration(module/local variables) does keepinitializer.PY_EXTENDSover lexical base classes, which cannot express registry composition declared through_inheritstrings.Fix direction
_name/_inheritbut the drop is universal).designing-cldk-changes): a model identity/composition layer so literal registry lookups can traverse contributor classes — every literal model identity and contributor class represented, including multi-class composition (audit acceptance gate). This is also the second half of Callee inference anchors at call-expression start: attribute calls resolve to receiver type, 99.9% of Odoo env calls bind to enclosing class (CLDK-001 + CLDK-002) #80: after the callee-anchoring fix,env['model'].search(...)dispatch still needs this layer to resolve to the right model implementation.