Skip to content

feat(sorting-hat): per-call status entries and repeat-call calibration - #76

Merged
hyphaltip merged 20 commits into
mainfrom
per-call-status
Oct 9, 2026
Merged

hyphaltip merged 20 commits into
mainfrom
per-call-status

Conversation

@hyphaltip

Copy link
Copy Markdown
Member

Adds per-call status entries to cellsurface_sorting_hat and the first measured status for tandem_repeat_protein.

  • Engine, loader, calibrate truth --call-status, report section, tests (788 passed, 7 skipped at the last full run). Spec and plan were independently reviewed before code, and a code review followed.
  • Repeat truth sets (v3, owner definition of 2026-10-08), threshold and gate scans, detector stopping-point analysis.
  • Measured status, both smoke (leakage: tuned on truth): S288C sens 0.435 [0.067, 0.667], spec 0.987 [0.962, 1.000]; C. albicans sens 0.462 [0, 0.788], spec 0.976 [0.938, 0.996]. Negatives are assumed from absent annotation.
  • Reports: docs/reports/2026-10-08-repeat-call-calibration.md, handoff docs/HANDOFF-2026-10-08.md (owner decisions waiting).
  • Merges cleanly with current main (checked with git merge-tree).

Not in this PR: detector changes, which need a spec and held-out species first.

🤖 Generated with Claude Code

hyphaltip and others added 20 commits October 7, 2026 23:39
…eview)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…bicans), first version

Labels from UniProt Repeat features and paper statements; assumed negatives from absence of annotation.
S288C 19 pos in 14 clusters, 26 neg; C. albicans 13 pos in 6 clusters, 82 neg. Below the cluster floor.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ash) and status refactors

Task 1 of the per-call status plan. status_from_measure moves to status.py (re-exported by
calibration.measure); best_entry is shared by the module and call resolvers. No behaviour change:
700 passed, 7 skipped. Four mutation checks fail the named tests.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Task 2 of the per-call status plan. call_status.py: loader (taxa >= 2, measure and leakage required,
status never stronger than the measure or the leakage cap), validity against a run (config, reads,
run record, module state, identity, call_hash), resolver with lineage. calibration/call_files.py:
merge, deterministic lock test, validation before write. 750 passed, 7 skipped; 17 mutation checks fail
the named tests.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
… (Task 3a)

calls.long text and report (minus the version line) taken from the engine before call status files.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
evaluate(..., call_status_of=None). Contributors are grouped by the leaf call; a leaf with a call status
contributes one status and one basis item; a stale file falls back to module statuses with the reason.
Not-assessable records never take a call status. The pinned golden output is unchanged. 760 passed;
six mutation checks fail the named tests.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…un.json (Task 4)

CallStatusResolver is built after the modules are loaded and passed to evaluate. A call file for an
unknown call stops the run (exit 2, file named); a stale file is listed with its reason and not used.
The report gets a Call calibration section only when call files exist, so the pinned output of a run
without them is unchanged. 765 passed; six mutation checks fail the named tests.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…several modules (Task 5)

--module and --call-status are mutually exclusive; --config added. The call path requires an eligible call,
a run.json with the same config hash and every read module ok, and unchanged module identities. The
entry is written by write_call_status. 782 passed; six mutation checks fail the named tests.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…s an assumed negative

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ries (Task 7)

Truth tables widened with reviewed secreted UniProt proteins (S288C 31 pos in 22 clusters, 297 neg;
C. albicans 16 pos in 9 clusters, 210 neg). Repeat call: S288C sens 0.323 [0.043, 0.535], spec 0.987;
C. albicans sens 0.375 [0.000, 0.680], spec 0.976; both smoke. About half of the missed positives are
tandem arrays the detectors do not find (AGA1, HPF1, EAP1, PGA18, ALS5-7). Cutoff and z-score scans are
exploratory; nothing in the module changed.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…S7 and ALS9

Sheppard 2004 shows no adherence for Als7p and the GO IMP reference does not study ALS7; the ALS9
mechanism citation in agent A's table is the ALS1 paper. Overrides only; generated tables unchanged.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…s) and a fix for MMseqs2 ID handling

Reviewed secreted A. fumigatus proteins: 8 positives are all enzyme repeat domains (PbH, BNR), so no status
entry is written; specificity 1.000 [0.968, 1.000] on 159 negatives. cluster() now uses neutral IDs
because MMseqs2 rewrites UniProt-style IDs.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…at positives

22 stop at the z gate, 5 at the score pre-filter, 4 at the region test or the coverage cutoff; the extracted
region covers 0.04 to 0.14 of the protein against 0.16 to 0.84 for the UniProt repeat span. Lowering the region
cut recovers nothing. An earlier reading of the code in the report is corrected.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Variant checked before any lock or file name (F3, F4), single path in refusals (F5), report column renamed (F6),
one leakage list (F10), comments and tests (F1, F8, F11), spec and plan text corrected (F2, F7, F12). F9 accepted.
788 passed, 7 skipped.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…er's definition of the call

Repeating motif or array, or an adhesion-associated repeat domain only (owner, 2026-10-08). Globular repeat
domains (BNR, Sel1, LRR, PbH, WD, ...) are left out. S288C 23 pos in 16 clusters, sens 0.435 [0.067, 0.667],
spec 0.987; C. albicans 13 pos in 6 clusters, sens 0.462 [0.000, 0.788], spec 0.976; both smoke. All 20 remaining
misses are arrays. ALS7 override confirmed by the owner; PR 74 merged.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@hyphaltip
hyphaltip merged commit 2d023d6 into main Oct 9, 2026
6 checks passed
@hyphaltip
hyphaltip deleted the per-call-status branch October 9, 2026 05:28
hyphaltip added a commit that referenced this pull request Oct 9, 2026
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant