Two guideline violations that are repo-wide rather than local to any one change. Raised by CodeRabbit on #71; I skipped both there because fixing them in one command would have made it inconsistent with the other eleven, and said I'd file them.
1. println! vs the rendering system
CLAUDE.md line 219: "No println! for output. All user-facing output through the rendering system."
Every command violates this, and there is no general rendering system to route through — the only renderer is vajra-essence's, which is specific to EssenceData:
| command |
println! calls |
cmd_batch |
23 |
cmd_fingerprint |
20 |
cmd_drift |
19 |
cmd_invariants |
10 |
cmd_separation |
~20 |
| … |
… |
So the guideline currently describes a system that does not exist. Either build a general output abstraction over Format and migrate the commands, or amend the guideline to describe what the CLI actually does. Worth noting the cost is real: format handling is duplicated per command, which is why several commands historically drifted (e.g. --format markdown and --format compact-ai mostly fall through to the text branch).
2. separation is not streaming
CLAUDE.md rule 1: "Every algorithm must work at any scale. 1KB, 1GB, 100GB. If it doesn't stream, it doesn't ship."
separation (#60) accumulates the full labelled corpus: quantile cuts need the value distribution and AUC needs per-class value vectors, so neither is computable in one bounded pass. Memory grows with records × fields. This is documented in cmd-separation.md under Scale rather than left implicit.
invariants/relationships has the identical shape for the same reason and has always shipped, so this is a pre-existing pattern, not a new regression — but two commands now violate an emphatic rule.
A streaming variant is tractable: the crate already carries DDSketch for quantiles, and AUC can be estimated from a rank sketch or computed from a binned contingency table rather than raw vectors. That would let both commands honour the rule. Alternatively the rule could acknowledge a bounded class of two-pass analyses.
Two guideline violations that are repo-wide rather than local to any one change. Raised by CodeRabbit on #71; I skipped both there because fixing them in one command would have made it inconsistent with the other eleven, and said I'd file them.
1.
println!vs the rendering systemCLAUDE.md line 219: "No
println!for output. All user-facing output through the rendering system."Every command violates this, and there is no general rendering system to route through — the only renderer is
vajra-essence's, which is specific toEssenceData:println!callscmd_batchcmd_fingerprintcmd_driftcmd_invariantscmd_separationSo the guideline currently describes a system that does not exist. Either build a general output abstraction over
Formatand migrate the commands, or amend the guideline to describe what the CLI actually does. Worth noting the cost is real: format handling is duplicated per command, which is why several commands historically drifted (e.g.--format markdownand--format compact-aimostly fall through to the text branch).2.
separationis not streamingCLAUDE.md rule 1: "Every algorithm must work at any scale. 1KB, 1GB, 100GB. If it doesn't stream, it doesn't ship."
separation(#60) accumulates the full labelled corpus: quantile cuts need the value distribution and AUC needs per-class value vectors, so neither is computable in one bounded pass. Memory grows with records × fields. This is documented incmd-separation.mdunder Scale rather than left implicit.invariants/relationshipshas the identical shape for the same reason and has always shipped, so this is a pre-existing pattern, not a new regression — but two commands now violate an emphatic rule.A streaming variant is tractable: the crate already carries
DDSketchfor quantiles, and AUC can be estimated from a rank sketch or computed from a binned contingency table rather than raw vectors. That would let both commands honour the rule. Alternatively the rule could acknowledge a bounded class of two-pass analyses.