v0.15.0
Theme: you choose the facts, and the map stops repeating itself.
Added
--featuresselects which fact classes the map carries. A budget decides
how much of the map fits; it could not say what was eligible in the first
place.
Twelve named classes (calls,relations,fields,constants,
decorators,raises,tested,usage,size,private,tests,
support) can now be dropped whole, withtypesmaking thirteen. Gating
happens at each render site before the budget catalog, so a deselected class
never enters the adaptive search and cannot be restored by it. The package
trie, type headers, and public signatures are the map's identity and stay
unselectable;--features noneleaves exactly those. The selection is stamped
in the footer and recalled like--langand--budget, and--interactive
onbuild/initprices a selection against the full map before writing it.--features types. Declared return and parameter types are now a
selectable fact class, closing a gap between the feature catalog and the
structure floor: L8 already stripped them, but nothing named them. They cost
1.0% of this repository's map, 2.8% of a TypeScript corpus and 5.1% of a Java
one — more than seven of the twelve classes that were already selectable.- L8, a structure-only floor below the semantic floor. When even L7 cannot fit a
--budget, Hologram now renders the same facts in project vocabulary alone: return
and parameter types, decorators and route paths,!throws,~N/✓/×0markers,
{field}lists, and: super/←impls/sealed:relations all go, leaving the
source tree, type names, and function names with their parameter names. On this
repository the floor drops from 714 to 460 tokens. Ranked whole facts still compete
for slack above it, and the previous "no complete map fits" fallback now runs only
when L8 overflows too.BudgetStats.skeleton_tokenskeeps meaning the L7 semantic
floor;effective_detailreportsL8orL8-adaptive:n/m.
Changed
- The extension a map repeats is declared once. A title line such as
# hologram ·.pystates the corpus extension, and the file nodes that carry
it render bare; a leaf that states an extension has exactly the one it
states. Worth 1.2–1.5% of a real map (57 tokens on a 4,936-token TypeScript
corpus, 95 on a 6,220-token Java one) and nothing where it would not pay: a
stem another node already owns (extract/besideextract.py), a stem still
holding a dot (shell.component), and corpora too small or too mixed to earn
the declaration all keep their extensions. Grouped landmarks
({ItemId,OrderId}.java(R{value})) keep theirs too, which is what tells a
reader the bare node above them is a directory. - The test index states landmarks and support, never call targets. The
> target +Ncoverage edge is gone: it spent tokens naming one arbitrary
target and counting the rest, and what a test file exercises is already
legible from the case names it carries.? testsnow holds exactly test
classes, test functions and methods, helper classes, helper functions, and
declared fixtures. - Fixtures and shared helper functions are named. A fixture qualifies by
declaration (@pytest.fixture,@BeforeEach,@Rule, …) because the
framework injects it by name rather than calling it; a plain function has to
be used by another test file. Teardown markers earn no name. Both render in
the existing*group, whose legend clause is now*=helper/fixture.