Curate the coculture, reject the monoculture dressed as one (#183, #529) - #530
Open
realmarcin wants to merge 1 commit into
Open
Curate the coculture, reject the monoculture dressed as one (#183, #529)#530realmarcin wants to merge 1 commit into
realmarcin wants to merge 1 commit into
Conversation
Clostridium_Autoethanogenum_Kluyveri_Syngas_Coculture gains its setup: CSTR chemostat, 37 °C, pH and temperature under active control, N2-flushed to anaerobic before inoculation. The coculture is assembled inside the reactor rather than co-inoculated — C. autoethanogenum runs alone on CO for 20 days, then C. kluyveri goes in at 5% v/v. Dilution rate is left unset: the paper varies it per run and reports it in a table the cached text carries only as a caption, so one value would assert a steady state it does not claim. The more useful half is the record NOT curated. Methylacidiphilum_Galdieria_Thermoacidophilic_Coculture was the best remaining candidate by every mechanical measure — 47k of cached full text, LABFORS 3 bioreactor, 2 L working volume, 45 °C, 450 rpm, fed-batch into chemostat. Its cited paper mentions Galdieria zero times and coculture zero times. It is a monoculture study, and curating it would have produced a block where every value is correct, every snippet verbatim, both validators clean, and the claim false. Soil_Corrinoid_B12_Reservoir_Community was the same shape. So the discriminator is now a test: how many of a record's members does the cited source name. It took two tries to make it measure that. The first version flagged five innocent records and missed the guilty one — the five have 3 KB abstract-only caches, where a low ratio means a shallow cache rather than a wrong paper, and the guilty one scores exactly 50% on two members, which a strict `<` lets through. Restricted to full-text caches and boundary inclusive: 5 real pairs checked, all at 100%, and the rejected case correctly below. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Network integrity findingsWarnings only — a member with no interaction yet, or a participant matched by ontology id rather than by name, or one on a community-level interaction that resolves to no member. Reported, but does not fail the build. The full report is attached to the workflow run as an artifact. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The record curated
Clostridium_Autoethanogenum_Kluyveri_Syngas_Coculture— CSTR chemostat, 37 °C, pH and temperature under active control, reactors N2-flushed at 20 mL/min for 3 hours to anaerobic before inoculation.The coculture is assembled inside the reactor rather than co-inoculated: C. autoethanogenum runs alone on CO for 20 days, then C. kluyveri goes in at 5% v/v under the same conditions. That is in
instrument_detailbecause it changes what the record means — this is not two organisms started together.Dilution rate is deliberately unset: the paper varies it per run and reports the conditions in a table the cached text carries only as a caption, so a single value would assert a steady state it does not claim.
The record not curated is the more useful half
Methylacidiphilum_Galdieria_Thermoacidophilic_Coculturewas the strongest remaining #183 candidate by every mechanical measure — 47k characters of cached full text, and a methods section with a LABFORS 3 bioreactor, 2 L working volume, 45 °C, 450 rpm, fed-batch switched to chemostat.Its cited reference mentions Galdieria zero times and "coculture" zero times. It is a Methylacidiphilum monoculture study.
Curating it would have produced a block where every value is individually correct, every snippet verbatim,
just validateandjust validate-referencesboth clean — and the claim false.Soil_Corrinoid_B12_Reservoir_Communityis the same shape: scored 5/5 on conditions belonging to an E. coli reporter strain, in a community that was never cultured.validate-referencesconfirms a snippet is a substring of the cited text. Nothing confirmed the cited text was about this community.The guard, which took two tries to make honest
A test counting how many of a record's members the cited source names. The first version was wrong in both directions at once:
<lets 50% through.Restricted to full-text caches (12 KB, the same bar used to pick candidates worth reading) and with the boundary inclusive, it now checks 5 real pairs, all at 100%, and
test_the_check_can_actually_failruns the same arithmetic on the rejected case and requires it to score below threshold — so the check cannot pass by resolving nothing.The
_ACCEPTEDescape hatch requires a reason per entry: a paper can name every member and still report monoculture conditions, and a legitimate apparatus paper may name none. The point is that the ratio gets looked at once, by someone, rather than never.Checks
just validateon the curated record — no issuesjust validate-references— 0 issues; all three snippets verbatimjust validate-strict,just lint— exit 0uv run pytest tests/— 2379 passed, 16 skippedPart of #183. Closes #529.
🤖 Generated with Claude Code