Skip to content

Repo-wide: println! output path and non-streaming analyses contradict CLAUDE.md #75

Description

@copyleftdev

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions