finding · findings/evolution/shared_data/candidate-intake-standard.md
A single, machine-readable logbook tracks every research idea ("candidate") from the moment someone names it through to a final pass/hold/block verdict — so the same idea is never tested twice and nothing slips through half-checked.
Researchers here are constantly proposing "candidates" — new measurements or signals that might add value to the trading-data pipeline. The problem with any busy research effort is that ideas get re-discovered, re-tested, and re-argued, wasting hours each time. This standard fixes that by giving every candidate a permanent home and a fixed path to walk.
candidate_ledger.jsonl — the "single source of truth" (SSoT), the one authoritative record everyone trusts. (A .jsonl file is just a plain-text list with one record per line, easy for both people and programs to read.)candidate_ledger.py, adds rows, checks for duplicates, and runs the preflight checklist.Every candidate moves through named stages, like a parcel moving through shipping statuses. You can always tell at a glance where any idea stands:
identified → pending → evaluating → evaluated → promoting → promoted
Three of these are terminal — dead ends an idea can land in and never leave:
When a new idea appears (for example, in a fresh crypto-discovery campaign), it walks these eight steps in order. Each step guarantees one specific thing — that guarantee is the whole point of the step.
| Step | What you run / produce | What it guarantees (plain English) |
|---|---|---|
| 1 | candidate_ledger.py --check "<name>" | No double evaluation. Searches every existing name and nickname ("alias") — both exact matches and partial ones ("containment") — so you never re-test something already on file. |
| 2 | --add with a number, name, family, and an --audit-folder | One row at birth. Creates the single ledger row the moment the idea is identified, and points it at the folder where its evidence will live. |
| 3 | one row in candidate_knobs.jsonl | Settings declared up front. "Knobs" are the adjustable settings an idea uses. The "family manifest" (the spec sheet for a group of related ideas) fails closed — i.e. it refuses to proceed — if you under-declare them. Fail-closed means "when in doubt, stop," the safe default. |
| 4 | --preflight "name1,name2,…" | One command replaces a 2–3 hour manual alignment. In a single run it checks for duplicates, confirms the knob row exists, checks the manifest floor, returns the "Axis-2" verdict (the parameterless-design check, explained below), and reports the stage — per candidate. Anything not marked OK/PASS is the exact item to go fix. |
| 5 | the evaluation loop runs → one record per "cell" | Group comparisons are mandatory. When ≥2 candidates are tested together (a "slate"), each must emit a cross_candidate "Finish" file. Without it, the system caps the result at PENDING-SIBLING instead of a full pass — it won't let a group claim victory without comparing members against each other. |
| 6 | campaign_summary_adapter.py --records <dir> --out … | Honest scoring, never optimistic. It reads the list of already-promoted features automatically, takes the worst of the stored vs. freshly-recomputed score (fail-closed), enforces a coverage floor (at least 10 data slices over 7 market eras, else it's marked INCOMPLETE), and treats an empty results folder as a hard error. |
| 7 | three_axis_gate.py with the orthogonality + agnostic inputs | One clear verdict. Produces a single promote / hold / block decision per candidate. |
| 8 | --set-stage cand-XXXX <stage> --note "…" | The outcome is written back. The ledger records what happened, so the next campaign's Step-1 --check can see it and avoid repeating the work. |
The "adapter" (the tool in Step 6) deliberately leans pessimistic — it would rather under-promote than over-promote a fluke. The final verdict is the worst of three things:
"Siblings" are candidates tested side by side. The demotion rule is deliberately asymmetric — it is lenient toward winners and strict toward losers:
The finding is candid about two known gaps:
mfdfa, ordinal, and chaos_embedding. A brand-new family needs its one-block "floor" definition before its verdicts can be trusted — and the preflight step flags this gap for you.