mark
open override fun mark(candidates: List<Proposition>, repository: PropositionRepository, ctx: CollectorRunContext): List<PropositionMark>
Runs one full mark pass over candidates and returns the duplicate marks it produced. Never writes to repository — the run is entirely read-and-report, same contract as com.embabel.dice.projection.memory.CollectorStrategy.
A blank CollectorRunContext.runId (the mark-only collect() path, or the legacy SAM bridge) means this run isn't queryable anywhere, so trace rows are skipped entirely — marks are still computed and returned as normal.