HierarchicalBoxing
Issue 29 — hierarchical boxing. Synthesises compound (box) layers above the Activity → Class → Function → Instruction chain that issue 24 #12 already wires in Enrichment.applyClassNesting / Enrichment.applyElementNesting.
v1 (this increment): the FILE layer only. It slots a CodeFile box between the Activity and the per-qualifier Class / orphan Function boxes:
Activity → File → Class → Function → InstructionA box's file is the most common sourceFile among its descendant instructions — exact for the common single-file class/function, a representative pick for the rare file-spanning case (C++ classes/namespaces legitimately span translation units). Files are keyed by (repoName, relativePath) so identical relative paths in different repos render as distinct boxes. Each CodeFile is bound to a deterministic analyzer-derived reference built from that key.
Deferred to follow-ups (need design / renderer support):
Namespace: the existing Class box already derives from the demangled qualifier (= the
functionDeclContextnamespace+class string), so a separate Namespace layer would double-box — needs reconciliation (rename Class→Namespace for v1, or the namespace/class split) rather than stacking.Segment: data-flow segments are many-to-many overlays on IR instructions (one IR can be in several segments), so they cannot be a normal compound-parent layer like File / Function / SourceLine.
Functions
Inserts a CodeSourceLine compound between each com.stigway.metamodels.highway.CodeFunction box and its child instructions, grouping them by (repo, path, line):