From aa4743b635d6168543a83d48ddb08d13a31fc4d6 Mon Sep 17 00:00:00 2001 From: s28ale-maker Date: Fri, 18 Sep 2026 18:54:33 -0400 Subject: [PATCH 1/4] chore: refresh marker_validation.md from latest sheet sync Sheet re-sync (2026-09-18) now populates the Subset/Abbreviation column for the 26 previously-flagged invalid marker cells; same 26 errors, no new or resolved ones. Auto-generated by soulcap-sync, no manual edits. Co-Authored-By: Claude Sonnet 5 --- reports/marker_validation.md | 52 ++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/reports/marker_validation.md b/reports/marker_validation.md index 8b37dbd..94fffd7 100644 --- a/reports/marker_validation.md +++ b/reports/marker_validation.md @@ -11,31 +11,31 @@ | Sheet row | Subset | Column | Error | Value | |-----------|--------|--------|-------|-------| -| 18 | | Required exclusion | unexpected ')' in group | `CD56- CD19- ([CD123hi]- CD303-) ([CD123hi\|CD193-)` | -| 19 | | Required exclusion | unexpected ')' in group | `CD56- CD19- ([CD123hi]- CD303-) ([CD123hi\|CD193-)` | -| 20 | | Required exclusion | unexpected ')' in group | `CD56- CD19- ([CD123hi]- CD303-) ([CD123hi\|CD193-)` | -| 21 | | Required exclusion | unexpected ')' in group | `CD56- CD19- ([CD123hi]- CD303-) ([CD123hi\|CD193-)` | -| 60 | | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) (TCRVa24-Ja18+\|TCRVa24+\|CD1d-a-GalCer Tetramer+) TCR Vb11+` | -| 75 | | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) (TCRVa7.2+\|MR1 Tetramer+) CD161+` | -| 76 | | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) [(TCRVa7.2+\|MR1 Tetramer+) CD161+]- [(TCRVa24-Ja18+\|TCRVa24+\|CD1d-a-GalCer Tetramer+) TCR Vb11+]-` | -| 77 | | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) [(TCRVa7.2+\|MR1 Tetramer+) CD161+]- [(TCRVa24-Ja18+\|TCRva24+\|CD1d-a-GalCer Tetramer+) TCR VB11+]- CD4+ CD8-` | -| 78 | | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) [(TCRVa7.2+\|MR1 Tetramer+) CD161+]- [(TCRVa24-Ja18+\|TCRVa24+\|CD1d-a-GalCer Tetramer+) TCR Vb11+]- CD4- CD8+` | -| 79 | | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) [(TCRVa7.2+\|MR1 Tetramer+) CD161+]- [(TCRVa24-Ja18+\|TCRva24+\|CD1d-a-GalCer Tetramer+) TCR VB11+]- CD4+ CD8+` | -| 80 | | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) [(TCRVa7.2+\|MR1 Tetramer+) CD161+]- [(TCRVa24-Ja18+\|TCRVa24+\|CD1d-a-GalCer Tetramer+) TCR Vb11+]- CD4- CD8-` | -| 108 | | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) (TCRVa24-Ja18\|TCRVa24\|CD1d-a-GalCer Tetramer) TCRVb11 (TCRVa7.2\|MR1 Tetramer) CD161 CD4 CD8 (CD183\|CXCR3) (CD185\|CXCR5) (CD194\|CCR4) (CD196\|CCR6)` | -| 110 | | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) [(TCRVa24-Ja18+\|TCRVa24+\|CD1d-a-GalCer Tetramer+) TCRVb11+]- [(TCRVa7.2+\|MR1 Tetramer+) CD161+]- CD4+ CD25+ CD127lo/-` | -| 111 | | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) [(TCRVa24-Ja18+\|TCRVa24+\|CD1d-a-GalCer Tetramer+) TCRVb11+]- [(TCRVa7.2+\|MR1 Tetramer+) CD161+]- CD4+ [CD25+ CD127lo/-]- CD185+` | -| 112 | | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) [(TCRVa24-Ja18+\|TCRVa24+\|CD1d-a-GalCer Tetramer+) TCRVb11+]- [(TCRVa7.2+\|MR1 Tetramer+) CD161+]- CD4+ [CD25+ CD127lo/-]- CD185- CD183+ CD196- CD194-` | -| 113 | | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) [(TCRVa24-Ja18+\|TCRVa24+\|CD1d-a-GalCer Tetramer+) TCRVb11+]- [(TCRVa7.2+\|MR1 Tetramer+) CD161+]- CD4+ [CD25+ CD127lo/-]- CD185- CD183- CD196- CD194+ CD294+` | -| 114 | | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) [(TCRVa24-Ja18+\|TCRVa24+\|CD1d-a-GalCer Tetramer+) TCRVb11+]- [(TCRVa7.2+\|MR1 Tetramer+) CD161+]- CD4+ [CD25+ CD127lo/-]- CD185- CD183- CD196- CD194+` | -| 115 | | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) [(TCRVa24-Ja18+\|TCRVa24+\|CD1d-a-GalCer Tetramer+) TCRVb11+]- [(TCRVa7.2+\|MR1 Tetramer+) CD161+]- CD4+ [CD25+ CD127lo/-]- CD185- CD183- CD196+ CD194+/-` | -| 124 | | Required phenotypic markers | invalid marker token '2+' | `CD45+ CD3+ (TCRab-\|TCRgd+) TCR V delta 2+ TCR V gamma 9- TCR Vd1-` | -| 125 | | Required phenotypic markers | invalid marker token '1-' | `CD45+ CD3+ (TCRab-\|TCRgd+) TCR V delta 1- TCR V delta 2- TCR V gamma 9-` | -| 125 | | Ideal phenotypic markers | invalid marker token '9+/-' | `TCR V gamma 9+/-` | -| 126 | | Required phenotypic markers | invalid marker token '1+' | `CD45+ CD3+ (TCRab-\|TCRgd+) TCR V delta 1+ TCR V delta 2- TCR V gamma 9+` | -| 127 | | Required phenotypic markers | invalid marker token '1+' | `CD45+ CD3+ (TCRab-\|TCRgd+) TCR V delta 1+ TCR V delta 2- TCR V gamma 9+/-` | -| 127 | | Ideal phenotypic markers | invalid marker token '2-' | `TCR V delta 2- TCR V gamma 9+/-` | -| 128 | | Required phenotypic markers | invalid marker token '1-' | `CD45+ CD3+ (TCRab-\|TCRgd+) TCR V delta 1- TCR V delta 2- TCR V gamma 9+` | -| 128 | | Ideal phenotypic markers | invalid marker token '1-' | `TCR V delta 1- TCR V delta 2-` | +| 18 | Mono | Required exclusion | unexpected ')' in group | `CD56- CD19- ([CD123hi]- CD303-) ([CD123hi\|CD193-)` | +| 19 | CMo | Required exclusion | unexpected ')' in group | `CD56- CD19- ([CD123hi]- CD303-) ([CD123hi\|CD193-)` | +| 20 | NCMo | Required exclusion | unexpected ')' in group | `CD56- CD19- ([CD123hi]- CD303-) ([CD123hi\|CD193-)` | +| 21 | IntMo | Required exclusion | unexpected ')' in group | `CD56- CD19- ([CD123hi]- CD303-) ([CD123hi\|CD193-)` | +| 60 | iNKT | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) (TCRVa24-Ja18+\|TCRVa24+\|CD1d-a-GalCer Tetramer+) TCR Vb11+` | +| 75 | MAIT | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) (TCRVa7.2+\|MR1 Tetramer+) CD161+` | +| 76 | Conv TCRab | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) [(TCRVa7.2+\|MR1 Tetramer+) CD161+]- [(TCRVa24-Ja18+\|TCRVa24+\|CD1d-a-GalCer Tetramer+) TCR Vb11+]-` | +| 77 | CD4+ Conv TCRab | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) [(TCRVa7.2+\|MR1 Tetramer+) CD161+]- [(TCRVa24-Ja18+\|TCRva24+\|CD1d-a-GalCer Tetramer+) TCR VB11+]- CD4+ CD8-` | +| 78 | CD8+ Conv TCRab | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) [(TCRVa7.2+\|MR1 Tetramer+) CD161+]- [(TCRVa24-Ja18+\|TCRVa24+\|CD1d-a-GalCer Tetramer+) TCR Vb11+]- CD4- CD8+` | +| 79 | CD4+/CD8+ Conv TCRab | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) [(TCRVa7.2+\|MR1 Tetramer+) CD161+]- [(TCRVa24-Ja18+\|TCRva24+\|CD1d-a-GalCer Tetramer+) TCR VB11+]- CD4+ CD8+` | +| 80 | CD4-/CD8- Conv TCRab | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) [(TCRVa7.2+\|MR1 Tetramer+) CD161+]- [(TCRVa24-Ja18+\|TCRVa24+\|CD1d-a-GalCer Tetramer+) TCR Vb11+]- CD4- CD8-` | +| 108 | T helper | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) (TCRVa24-Ja18\|TCRVa24\|CD1d-a-GalCer Tetramer) TCRVb11 (TCRVa7.2\|MR1 Tetramer) CD161 CD4 CD8 (CD183\|CXCR3) (CD185\|CXCR5) (CD194\|CCR4) (CD196\|CCR6)` | +| 110 | ConT Treg-like | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) [(TCRVa24-Ja18+\|TCRVa24+\|CD1d-a-GalCer Tetramer+) TCRVb11+]- [(TCRVa7.2+\|MR1 Tetramer+) CD161+]- CD4+ CD25+ CD127lo/-` | +| 111 | ConT Tfh-like | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) [(TCRVa24-Ja18+\|TCRVa24+\|CD1d-a-GalCer Tetramer+) TCRVb11+]- [(TCRVa7.2+\|MR1 Tetramer+) CD161+]- CD4+ [CD25+ CD127lo/-]- CD185+` | +| 112 | Th1-like | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) [(TCRVa24-Ja18+\|TCRVa24+\|CD1d-a-GalCer Tetramer+) TCRVb11+]- [(TCRVa7.2+\|MR1 Tetramer+) CD161+]- CD4+ [CD25+ CD127lo/-]- CD185- CD183+ CD196- CD194-` | +| 113 | Th2-like | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) [(TCRVa24-Ja18+\|TCRVa24+\|CD1d-a-GalCer Tetramer+) TCRVb11+]- [(TCRVa7.2+\|MR1 Tetramer+) CD161+]- CD4+ [CD25+ CD127lo/-]- CD185- CD183- CD196- CD194+ CD294+` | +| 114 | Th9-like | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) [(TCRVa24-Ja18+\|TCRVa24+\|CD1d-a-GalCer Tetramer+) TCRVb11+]- [(TCRVa7.2+\|MR1 Tetramer+) CD161+]- CD4+ [CD25+ CD127lo/-]- CD185- CD183- CD196- CD194+` | +| 115 | Th17-like | Required phenotypic markers | mixed '\|' and space in a group | `CD45+ CD3+ (TCRab+\|TCRgd-) [(TCRVa24-Ja18+\|TCRVa24+\|CD1d-a-GalCer Tetramer+) TCRVb11+]- [(TCRVa7.2+\|MR1 Tetramer+) CD161+]- CD4+ [CD25+ CD127lo/-]- CD185- CD183- CD196+ CD194+/-` | +| 124 | Vd2 | Required phenotypic markers | invalid marker token '2+' | `CD45+ CD3+ (TCRab-\|TCRgd+) TCR V delta 2+ TCR V gamma 9- TCR Vd1-` | +| 125 | Vd3 | Required phenotypic markers | invalid marker token '1-' | `CD45+ CD3+ (TCRab-\|TCRgd+) TCR V delta 1- TCR V delta 2- TCR V gamma 9-` | +| 125 | Vd3 | Ideal phenotypic markers | invalid marker token '9+/-' | `TCR V gamma 9+/-` | +| 126 | Vg9 Vd1 | Required phenotypic markers | invalid marker token '1+' | `CD45+ CD3+ (TCRab-\|TCRgd+) TCR V delta 1+ TCR V delta 2- TCR V gamma 9+` | +| 127 | Vd1 | Required phenotypic markers | invalid marker token '1+' | `CD45+ CD3+ (TCRab-\|TCRgd+) TCR V delta 1+ TCR V delta 2- TCR V gamma 9+/-` | +| 127 | Vd1 | Ideal phenotypic markers | invalid marker token '2-' | `TCR V delta 2- TCR V gamma 9+/-` | +| 128 | Vg9 | Required phenotypic markers | invalid marker token '1-' | `CD45+ CD3+ (TCRab-\|TCRgd+) TCR V delta 1- TCR V delta 2- TCR V gamma 9+` | +| 128 | Vg9 | Ideal phenotypic markers | invalid marker token '1-' | `TCR V delta 1- TCR V delta 2-` | See [marker_string_issues.md](marker_string_issues.md) for the broader (non-syntactic) data-quality review. From 42c2f8675c78bd43274d5337a5fd84e33ed1e1ea Mon Sep 17 00:00:00 2001 From: s28ale-maker Date: Fri, 25 Sep 2026 12:12:20 -0400 Subject: [PATCH 2/4] feat: add keyless PubMed search CLI and Fall semester plan draft soulcap-pubmed wraps NCBI E-utilities as an alternative to soulcap-europepmc when a task needs NCBI's own index/query syntax; keyless by default, reads an optional PUBMED_API_KEY from .env for a higher rate limit. reports/fall_2026_semester_plan.{md,pdf,html} is the Sept 21 discussion draft for Dr. Diehl expanding the sprint backlog into a plain-language plan, recent-work summary, weekly schedule, and agent task instructions - proposed for approval, not a confirmed commitment. Co-Authored-By: Claude Sonnet 5 --- CLAUDE.md | 8 +- README.md | 22 + pyproject.toml | 1 + reports/fall_2026_semester_plan.html | 317 +++++++++++++ reports/fall_2026_semester_plan.md | 583 ++++++++++++++++++++++++ reports/fall_2026_semester_plan.pdf | Bin 0 -> 191569 bytes src/soulcap_cl_mapping/pubmed_search.py | 119 +++++ tests/test_pubmed_search.py | 156 +++++++ 8 files changed, 1205 insertions(+), 1 deletion(-) create mode 100644 reports/fall_2026_semester_plan.html create mode 100644 reports/fall_2026_semester_plan.md create mode 100644 reports/fall_2026_semester_plan.pdf create mode 100644 src/soulcap_cl_mapping/pubmed_search.py create mode 100644 tests/test_pubmed_search.py diff --git a/CLAUDE.md b/CLAUDE.md index 9a57800..631e3ae 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -61,7 +61,7 @@ AST in `marker_syntax.py`, compiled/evaluated by `phenotype.py`. | [Notes.md](Notes.md) | Scratch notes on data sources + a marker-syntax quick reference. | | [MARKER_SYNTAX.md](MARKER_SYNTAX.md) | **Canonical spec** of the marker expression language (human-readable guide + EBNF). Cite this for anything parsing/validating marker strings. | | [reports/](reports/) | Analysis reports. `marker_string_issues.md` is the curated review; `marker_validation.md` is **auto-generated** by the EBNF validator on each sync. `cl_pro_relationships.md`/`.tsv` are **auto-generated** by `soulcap-cl-pro` from Ubergraph. `cl_term_issues.md` tracks proposed CL corrections found during mapping work. `candidate_cl_mappings.md` is the Milestone 4 deliverable — proposed SOULCAP→CL mappings with rationale and evidence. `candidate_cl_mappings_batch.tsv`/`candidate_cl_mappings_agreement.tsv` are **auto-generated** by `soulcap-match --batch [--lexical]` (issue #6) — a marker-axiom-only pass and a marker/lexical agreement pass across every SOULCAP cell type; treat as an unreviewed draft shortlist (conflicts must be checked), not curated output. `candidate_cl_mappings.sssom.tsv` is **auto-generated** by `soulcap-sssom` from the curated `CURATED_MAPPINGS` table in `sssom_export.py` (kept in sync by hand with `candidate_cl_mappings.md`) — standard SSSOM format, with `confidence`/`comment` derived from whether the match is backed by a directly-asserted CL marker axiom, an inferred-only one, or none at all (lexical/name match only). `gaps.tsv` is a curated, hand-maintained log of cases where SOULCAP has no reasonable CL match, CL conflicts with a marker panel, CL has an axiom gap, or the sheet itself has a data problem — separate from the mapping table; matching GitHub issues use the `gap` label (`.github/ISSUE_TEMPLATE/mapping_gap.yml`). `pro_marker_species_support.tsv` is the issue #11 deliverable — for each (CL cell type, general PRO marker) pair SOULCAP's mappings actually touch, whether literature supports the marker as human, mouse, or both, or `insufficient_evidence`; built by the `pro-marker-species-support` skill, every quote verified verbatim against its source before writing. `fall_2026_sprint_backlog.md` is the sprint-level breakdown of [ROADMAP.md](ROADMAP.md)'s Fall 2026 (Oct–Dec) working plan, prepared for Dr. Diehl — hand-maintained, not regenerable; update it as items complete or scope is renegotiated, don't treat it as a generated report. New reports go here. `reports/citation_traversal/` holds gitignored, regenerable snippet caches + summaries from the `citation-traversal` skill. | -| `src/soulcap_cl_mapping/` | All Python code. `sync_sheets.py` → `soulcap-sync`; `marker_syntax.py` → `soulcap-validate` (EBNF validator); `snippet_cache.py` → `soulcap-cache`; `report_validator.py` → `soulcap-validate-report`; `cl_pro.py` → `soulcap-cl-pro` (CL→PR relationships via Ubergraph SPARQL); `cl_match.py` → `soulcap-match` (marker-axiom + lexical CL candidate scoring, single-profile or `--batch`); `oak_match.py` → `soulcap-oak-match` (OAK sqlite-backed lexical/synonym CL search — downloads/caches a local CL database on first use, ~100MB); `sssom_export.py` → `soulcap-sssom` (curated mappings → SSSOM TSV, with confidence derived from CL marker-axiom assertion status); `pro_species_support.py` (scopes CL PRO markers needing species-specificity literature support — no CLI, called as a library from the `pro-marker-species-support` skill); `europepmc_search.py` → `soulcap-europepmc` (free, keyless Europe PMC search — fallback literature source when the Asta MCP server isn't reachable). | +| `src/soulcap_cl_mapping/` | All Python code. `sync_sheets.py` → `soulcap-sync`; `marker_syntax.py` → `soulcap-validate` (EBNF validator); `snippet_cache.py` → `soulcap-cache`; `report_validator.py` → `soulcap-validate-report`; `cl_pro.py` → `soulcap-cl-pro` (CL→PR relationships via Ubergraph SPARQL); `cl_match.py` → `soulcap-match` (marker-axiom + lexical CL candidate scoring, single-profile or `--batch`); `oak_match.py` → `soulcap-oak-match` (OAK sqlite-backed lexical/synonym CL search — downloads/caches a local CL database on first use, ~100MB); `sssom_export.py` → `soulcap-sssom` (curated mappings → SSSOM TSV, with confidence derived from CL marker-axiom assertion status); `pro_species_support.py` (scopes CL PRO markers needing species-specificity literature support — no CLI, called as a library from the `pro-marker-species-support` skill); `europepmc_search.py` → `soulcap-europepmc` (free, keyless Europe PMC search — fallback literature source when the Asta MCP server isn't reachable); `pubmed_search.py` → `soulcap-pubmed` (NCBI E-utilities search — reads `PUBMED_API_KEY` from `.env` if set for the higher rate limit, otherwise works keyless; use when a task specifically needs NCBI's own index/query syntax rather than Europe PMC's mirror of it). | | `tests/` | Unit tests (mirror `src/` layout). | | `.claude/skills/` | Project skills — see [citation-traversal](.claude/skills/citation-traversal/SKILL.md), `ontology-term-lookup`, [pro-marker-species-support](.claude/skills/pro-marker-species-support/SKILL.md), [gap-issue-filing](.claude/skills/gap-issue-filing/SKILL.md), [roadmap-status-sync](.claude/skills/roadmap-status-sync/SKILL.md), and [mapping-audit](.claude/skills/mapping-audit/SKILL.md). | | `.claude/hooks/` | Claude Code hooks. `validate_report_quotes.py` is a PreToolUse guard that blocks writing a citation-traversal report whose quotes aren't verbatim in the snippet cache. | @@ -74,6 +74,12 @@ When you create a new artifact, put it in the established location and link it from here and the README so locations stay consistent. Do not scatter documents at the repo root. +The September 21 Fall 2026 planning draft for Dr. Diehl is +`reports/fall_2026_semester_plan.md`, with matching `.pdf` and `.html` versions. +It summarizes recent work and proposes weekly deliverables and agent task +instructions. It does not replace the existing sprint backlog or establish +new scientific approvals or collaborator commitments without agreement. + ## Conventions & requirements - **All code lives under `src/`** (package `soulcap_cl_mapping`). diff --git a/README.md b/README.md index bd114d2..125ab49 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,13 @@ semester's sprint-level breakdown (sub-tasks, acceptance criteria, and what's blocked on someone outside the repo) is [reports/fall_2026_sprint_backlog.md](reports/fall_2026_sprint_backlog.md). +The September 21 discussion draft for Dr. Diehl expands this into a +plain-language October–December plan, recent-work summary, weekly schedule, +and agent task instructions: [PDF](reports/fall_2026_semester_plan.pdf), +[editable Markdown](reports/fall_2026_semester_plan.md), or +[browser version](reports/fall_2026_semester_plan.html). +Its workload and review targets are proposed for approval, not confirmed commitments. + ## Setup ### 1. Clone this repo @@ -84,6 +91,21 @@ startup and expands `${ASTA_API_KEY}` into the `x-api-key` header in it is the only place the secret lives. Restart Claude Code after editing it so the key is picked up. +### Optional: PubMed (NCBI E-utilities) + +`soulcap-pubmed` (`src/soulcap_cl_mapping/pubmed_search.py`) works keyless, +same as `soulcap-europepmc`. An NCBI API key just raises the rate limit from +3 to 10 requests/second. If you want one, generate it from your +[NCBI account settings](https://www.ncbi.nlm.nih.gov/account/settings/) under +**API Key Management**, then add it to the **local, gitignored** `.env`: + +``` +PUBMED_API_KEY={token} +``` + +Unlike `ASTA_API_KEY`, this is read directly by Python (via `python-dotenv`), +not through Claude Code's MCP `env` substitution — it isn't an MCP server key. + ## Unified audit dashboard Generate an offline dashboard from the local data and mapping registries: diff --git a/pyproject.toml b/pyproject.toml index ca27b39..b6551d0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,6 +39,7 @@ soulcap-map = "soulcap_cl_mapping.marker_map:main" soulcap-oak-match = "soulcap_cl_mapping.oak_match:main" soulcap-sssom = "soulcap_cl_mapping.sssom_export:main" soulcap-europepmc = "soulcap_cl_mapping.europepmc_search:main" +soulcap-pubmed = "soulcap_cl_mapping.pubmed_search:main" [project.optional-dependencies] dev = [ diff --git a/reports/fall_2026_semester_plan.html b/reports/fall_2026_semester_plan.html new file mode 100644 index 0000000..bd2e16d --- /dev/null +++ b/reports/fall_2026_semester_plan.html @@ -0,0 +1,317 @@ +SOULCAP–CL | Fall 2026 Semester Plan
SOULCAP × Cell Ontology · Fall 2026 · Proposed working plan

SOULCAP ↔ Cell Ontology

+

Fall 2026 semester working plan

+

October • November • December 2026

+

Prepared for discussion with Dr. Alexander Diehl
University at Buffalo • Prepared September 21, 2026

+

The project in one sentence

+

Help people decide whether a SOULCAP cell description and a Cell Ontology description mean the same thing, mean related but different things, or cannot yet be connected reliably.

+

The proposed semester goal

+

Turn a useful collection of suggested matches into a clearer, evidence-backed review system: every cell has a visible status, important decisions have a scientific explanation, and software improvements are tested fairly.

+

The three-month story

+ + + + +
MonthPlain-language purposeMain result
OctoberMake the information trustworthy and agree on the review rules.A checked starting point, clearer marker rules, and the first reviewed examples.
NovemberReview the existing suggestions and investigate missing matches.Review packets for the existing proposals and a documented outcome for the remaining cells.
DecemberTest fairly, explain the results, and hand over the work.A reproducible project package, a clear report, and a spring priority list.
+

Important distinction: a suggested match is not a confirmed match. A computer can organize evidence and suggest candidates; a qualified reviewer must approve scientific conclusions.

+

How to use this document

+

Pages 1–6 explain the project, recent progress, goals, and schedule. Pages 7–11 give the work packages. Pages 12–16 describe the review process, testing, responsibilities, and agent instructions. Pages 17–18 provide meeting language and source references.

+

Approval status: proposed plan, not an approved commitment from Dr. Diehl or any other collaborator. Workload estimates, review targets, and expanded tasks require agreement. Creating this document does not authorize public issue filing, source-sheet changes, or scientific sign-off.

SOULCAP × Cell Ontology · Fall 2026 · Proposed working plan

1. Where the project stands today

+

The local repository was checked on September 21. The table distinguishes facts verified in the files from previously recorded results. No live source-sheet update or public issue-status check was performed for this document.

+ + + + + + + + + +
Starting pointWhat it means in plain language
127 registered SOULCAP entitiesThere are 127 cell descriptions with stable local identifiers.
80 proposals covering 80 entitiesSomeone has suggested a CL connection for these cells. Every proposal still says it needs review.
47 entities without proposalsThese require investigation, not an automatic promise of 47 new matches.
0 reviewed mapping benchmark casesThere is not yet an independently approved answer set for measuring scientific matching quality.
5 reserved, unlabelled entitiesFive cases are set aside for possible future testing. They are not already a validated test set.
75 marker-registry rows, grouped into 73 normalized marker groupsDifferent spellings and repeated entries need careful handling; they do not necessarily represent different proteins.
826 CL terms in the recorded marker-only comparisonThe marker-only search can consider this subset of CL, not every CL term.
3,327 active terms in the local name-search cacheThe optional local name search can look more widely, but names alone do not prove equivalence.
+

The current performance result must be explained carefully

+

In the recorded September comparison, the older matcher placed a provisional expected target in its first five suggestions for 19 of 80 cases. The corrected strict marker-policy mode did so for 16 of 80 cases. Neither number measures confirmed biological accuracy because the expected answers remain unreviewed. The stricter mode is still optional, not the default.

+

The same comparison reports six invalid source profiles and 13 cases whose targets are absent from the index. These are counts within that 80-case evaluation, not counts of all source-sheet problems. All cases remain in the reported denominator.

+

What needs attention first

+

Fix the interpretation and review process before chasing a higher score. The immediate priorities are ambiguous marker names, three flagged T-cell mapping decisions, source expressions that cannot be read reliably, and the absence of a reviewed answer set.

+

Evidence: local registries and evaluation files [R1–R5]. The most recent recorded software check was 537 passing tests with 96.53% coverage on September 18; this is a historical result, not a fresh September 21 test run.

SOULCAP × Cell Ontology · Fall 2026 · Proposed working plan

2. Recent improvements already delivered

+

These are the main September improvements supported by the repository and its change history. They are completed software and reporting work, not claims that the biology has been approved.

+

A. One consistent way to read marker descriptions

+

Validation, marker extraction, and matching now share the same interpretation of marker expressions. Positive and negative markers, expression levels, and grouped alternatives are kept distinct. Invalid descriptions are flagged rather than quietly ranked as if they were valid.

+

Why it matters: two parts of the program should not read the same cell description differently. This reduces avoidable disagreement inside the software.

+

B. Stable cell identifiers and one mapping register

+

Each registered SOULCAP entity has a permanent local identifier. Proposed mapping decisions live in one table instead of being maintained separately in multiple reports. Existing proposals were preserved.

+

Why it matters: a renamed cell should not become a new, unconnected record. One decision table makes it easier to see what changed and prevents conflicting copies of the same decision.

+

C. Evidence attached to each proposed match

+

Reports now distinguish marker evidence, name-based evidence, literature evidence, and curator statements. They show which markers agree, disagree, or have no available information. Exported tables can be traced to the input files used to produce them.

+

Why it matters: the reader can ask “Why is this suggested?” and inspect the answer. The project avoids attaching a made-up confidence percentage to an unreviewed conclusion.

+

D. A unified audit dashboard

+

An offline dashboard brings together the cell list, proposed mappings, missing coverage, marker information, review findings, and report freshness. Users can search, filter, and open the details without running a web server.

+

Why it matters: Dr. Diehl and the student can work from the same review list instead of searching through many separate files.

+

E. A repeatable matcher evaluation

+

The evaluation harness checks whether an expected target appears near the top of the suggestions. It separates provisional expectations from reviewed cases and exposes ties, missing candidates, and invalid inputs.

+

Why it matters: future changes can be compared with an earlier version. However, software testing and agreement with old proposals are not substitutes for scientific review.

+

Where to inspect: README.md, the mappings/ directory, reports/audit_dashboard.html, and the recorded matcher evaluations [R1–R4]. The major implementation commits are identified on page 18.

SOULCAP × Cell Ontology · Fall 2026 · Proposed working plan

3. More recent improvements—and what they did not solve

+

F. Marker aliases and protein-aware matching

+

The optional enhanced mode recognizes approved alternative marker names and compatible protein identifiers. It avoids counting the same marker condition twice. Conflicting aliases remain unresolved rather than being guessed.

+

Why it matters: different names for the same approved marker should not cause a missed match or an unfair extra score.

+

G. Broader candidate search

+

An optional offline name-and-synonym search can find CL candidates outside the marker-only index. Its evidence is kept separate from marker evidence.

+

Why it matters: a suitable CL term should not be invisible merely because its marker information is incomplete. A name match remains only a candidate.

+

H. More honest status information

+

The roadmap was corrected to show 80 proposals for 80 of 127 entities, rather than the misleading older count of 87/127. Marker reports distinguish ordinary protein mappings from complexes, families, reagents, possible source artifacts, and unresolved entries.

+

Why it matters: a blank gene field is not automatically an error. Some measurements do not refer to a single protein or gene.

+

I. A controlled investigation of the regression

+

Eight diagnostic combinations separated three changes: added alias/protein evidence, removed evidence under stricter rules, and removal of duplicate conditions. In that snapshot, the changed target rankings came from removed evidence, not from the other two factors.

+

Why it matters: the project has a documented explanation for the regression instead of an unexplained lower score. This finding applies to that comparison, not every possible future dataset.

+

J. A narrow CD8 correction and protected test preparation

+

The resolver now retains a specific whole-CD8 surface assertion that had been discarded. It does not treat CD8 alpha as automatically equivalent to the whole coreceptor. The correction restores that evidence for 39 CL terms, but top-five agreement remains 16/80. Five evidence-constraint examples and additional tests protect this behavior.

+

Three proposed mappings were reviewed by the agent: two relations lacked sufficient support, and one remained plausible but unconfirmed. No proposal was promoted to confirmed truth. Five unlabelled entities were reserved for later independent review.

+

Still unfinished: curator decisions, scientifically reviewed benchmark answers, a fair final test, and proof that any new default matcher is better. The old default remains in place [R4–R6].

SOULCAP × Cell Ontology · Fall 2026 · Proposed working plan

4. What success should look like by December

+

The semester should be judged by useful, reviewable outputs—not by a promise that every cell can be matched or that a particular accuracy percentage will be achieved.

+ + + + + + + + + +
DeliverableProposed completion check
An honest project inventoryAll 127 entities have a status and a next step. No record disappears because it is difficult.
Existing-proposal review packetsAll 80 proposals receive an automated evidence check and a readable packet. Aim for 30 completed human scientific reviews, subject to reviewer capacity.
Missing-coverage investigationEach of the 47 has a recorded disposition. Investigate the 42 non-reserved cases; keep five reserved cases outside tuning and mark their review route separately.
Important ambiguity decisionsThree flagged mapping cases and five marker holds each receive a signed decision or an explicit unanswered question with an owner.
A reviewed development answer setAim for 20 human-reviewed cases drawn from the reviewed proposals, spanning several cell groups and relation types. Do not manufacture examples to reach a quota.
Literature evidenceRecheck the eight historically covered categories; prepare evidence packets for the six remaining categories, within agreed reviewer availability.
Independent validation pilotIndependently label the five reserved cases if feasible, preserve separation from development, and report per-case results and limitations.
A reproducible handoffAnother person can produce the dashboard and reports from the documented inputs and commands.
+

Workload assumptions to approve

+

Plan around 10–12 student hours per active week, with a proposed total of roughly 90–110 hours through December 7, including meeting preparation and troubleshooting. The agent supports drafting, coding, checks, and evidence organization within that supervised work; it does not replace review time.

+

Ask for a 30-minute weekly meeting plus approximately 60 minutes of scientific review per week, shared with another qualified reviewer if available. Review speed will vary. Check actual throughput after two weeks and reduce the target if necessary.

+

Minimum, target, and stretch

+

Minimum: an accurate inventory, packets for all 80 proposals, a documented route for all 47 uncovered entities, at least 10 completed human reviews if review support is available, and a reproducible report. Missing review support must be reported, not hidden.

+

Target: the deliverables above, including 30 scientific reviews and 20 usable development cases. The five-case validation pilot is conditional on independent annotation.

+

Stretch: expand independent testing toward 15–20 genuinely separate cases, or finish more scientific reviews. This requires additional review capacity and a redesigned split before selection or tuning; it is not a silent expansion of the current five-case reserve.

SOULCAP × Cell Ontology · Fall 2026 · Proposed working plan

5. Calendar and weekly delivery plan

+

The main handoff is December 7, with no essential task dependent on the examination period. UB lists fall break on October 12–13, Thanksgiving break on November 25–28, the last day of classes on December 7, and final exams on December 9–16 [U1]. These are the standard-session dates; confirm the student's individual obligations.

+ + + + + + + + + + + + + + + + +
Work windowMain focusVisible output
Oct. 1–2Kickoff; confirm hours, reviewer, and approvalsAgreed scope and baseline checklist
Oct. 5–9Inventory, review form, source-sheet requestsBaseline report; first review packet
Oct. 12–16Light week around fall break; track responsesDecision log and approved correction requests
Oct. 19–23Three flagged cases; five marker holdsFirst signed decisions or named blockers
Oct. 26–30Fair evaluation setup; first development casesOctober demonstration and review gate
Nov. 2–6Candidate coverage; first missing-category evidenceCandidate report and literature packets
Nov. 9–13Review batches; test one matching change at a timeExplained before/after experiment
Nov. 16–20Complete proposal packets; review uncovered cellsCoverage inventory; no silent omissions
Nov. 23–24Freeze the version to be tested; prepare handoffFrozen input list and test protocol
Nov. 25–28Thanksgiving breakNo required delivery
Nov. 30–Dec. 4Independent pilot; reproduce reportsValidation results or explicit limitation
Dec. 7Present and hand overPDF report, repository package, spring priorities
Dec. 8–16Reading day and examsNo required development or review work
Dec. 17–23Optional, only if agreedSmall documentation corrections or archival work
Dec. 24–31Buffer, not a hidden deadlineNo required semester deliverable
+

Three decision gates

+

October 30: confirm that the review form works, source problems are tracked, review ownership is real, and the first answer-set cases are reliable. If not, reduce November feature work and focus on these foundations.

+

November 20: approve the version and datasets for final testing. Unresolved scientific questions stay visibly unresolved. Candidate-search changes that fail the review checks remain experimental.

+

December 7: accept the handoff based on reproducibility, evidence quality, clear status counts, and honest limitations—not a predetermined score.

SOULCAP × Cell Ontology · Fall 2026 · Proposed working plan

6. October work packages: establish the foundation

+

A01 — Save and check the starting point

+

Owner: student with agent support. Target: October 9. Planning allowance: 4–6 hours.

+

Recount the entity, proposal, marker, and review tables. Record the exact source snapshot and software version. Run the software checks and preserve a baseline evaluation in a new output folder. Compare the roadmap, dashboard, and reports for conflicting claims.

+

Deliver: a dated baseline report and an input list. Done when: counts agree across outputs, missing inputs are identified, historical results are labelled, and no old baseline is overwritten. A failing test is a reported problem, not permission to weaken the test.

+

A02 — Agree on what a mapping decision means

+

Owner: Dr. Diehl or a delegated curator decides; student and agent prepare. Target: October 9. Allowance: 4–6 hours plus review.

+

Prepare one short form that asks whether the two descriptions mean the same population, whether one is broader, or whether they are only related. Include tissue, species, specimen, marker requirements, exclusions, source references, reviewer name, date, and unanswered questions.

+

Deliver: a review template and three example packets. Done when: the reviewer can use the form consistently and the direction of Broad/Narrow is explicit. No agent-generated text may impersonate a human review.

+

A03 — Request source-sheet and marker-string corrections

+

Owner: student drafts; authorized sheet owner edits. Target: request by October 9; follow up October 16. Allowance: 3–5 hours.

+

Check the historical request for a dedicated mapping-relation field. Confirm whether existing fields can support the needed information before asking for duplicate columns. Do not confuse the existing assay-type field with the CL mapping relation. Reuse the prior marker-fix proposal where appropriate; include the source expressions that currently cannot be parsed.

+

Deliver: a precise request, a change checklist, and a decision log. Done when: an authorized owner accepts or declines each request, or a dated blocker names the person and next follow-up. After approved edits, synchronize and verify; never repair the downloaded cache by hand.

+

A04 — Tidy the issue and licensing backlog safely

+

Owner: student and agent prepare; authorized owner approves external changes. Target: October 23. Allowance: 3–4 hours.

+

Recheck the existing gap log and issue history before proposing new issues. Draft duplicate-free issue descriptions and a licensing decision request. Verify who owns the code and data before applying a license. Do not assume an old issue is still open or already satisfied.

+

Deliver: an approved-action queue. Done when: each item is filed with permission, closed with permission, or has a documented reason to remain pending. No public messages or license changes are authorized by this plan alone.

SOULCAP × Cell Ontology · Fall 2026 · Proposed working plan

7. October work packages: resolve the high-risk questions

+

A05 — Review the three flagged mapping proposals

+

Owner: scientific reviewer; student and agent prepare evidence. Target: October 23. Allowance: 3–4 preparation hours plus review.

+

For SC000063, ask whether a description containing both alpha/beta and gamma/delta cells can point to a target restricted to alpha-beta cells, and in which direction. For SC000067, ask whether the operational marker gate establishes the proposed equivalence. For SC000073, ask whether there is evidence for the target's required intraepithelial location.

+

Deliver: three decision records. Done when: each has an accepted, rejected, revised, or insufficient-evidence outcome with reviewer, date, and reason. Insufficient evidence is a valid completed review, not a reason to invent a mapping.

+

A06 — Review the five important marker holds

+

Owner: scientific reviewer defines the meaning; agent implements approved rules. Target: October 30. Allowance: 5–7 hours plus review.

+

Review CD3, CD8, CD15, CD16, and MR1 individually. Ask what the source actually measures: a single protein, a larger complex, a family, or a reagent-defined signal. Identify when assay details are missing. Preserve the narrow whole-CD8 correction unless new evidence warrants a separately reviewed change.

+

Deliver: a policy table and tests for approved changes. Done when: every hold has a reasoned decision or a named evidence gap, and each implemented rule has both an example it should accept and a similar example it must reject. Do not merely change fingerprints to make stale policies pass.

+

A07 — Make the evaluation ready for fair review

+

Owner: agent implements; student verifies; reviewer approves answers. Target: October 30. Allowance: 6–8 hours.

+

Prepare the first 5–10 reviewed development examples. Keep them separate from unreviewed proposals. Add and test an explicit way to evaluate only a selected dataset, because the present evaluator automatically includes proposal-derived cases. Support a recorded no-supported-match outcome rather than forcing every reviewed case to name a target.

+

Deliver: separate development/final-test input handling and a small reviewed development set. Done when: tests prove that reserve cases cannot silently enter development results; missing answers are not treated as correct; invalid inputs and missing candidates remain visible. Do not score or inspect reserve rankings during tuning.

+

October gate: review these deliverables with Dr. Diehl. If source-sheet decisions are delayed, local evidence review can continue with its limitations stated. Missing curator intent must not be replaced by an agent's guess.

SOULCAP × Cell Ontology · Fall 2026 · Proposed working plan

8. November work packages: improve evidence and coverage

+

A08 — Check the literature coverage and fill the gaps

+

Owner: confirm the scientific lead with Dr. Diehl; agent assists with retrieval and organization. Target: November 20. Allowance: 8–10 student hours plus scientific review.

+

The older roadmap records eight of fourteen cell categories covered. Treat that as a starting claim, not a current quality certificate. Check that those reports contain accessible sources and support the actual statements made. Prepare packets for monocyte, neutrophil, basophil, mast cell, granulocyte, and myeloid-derived suppressor cell categories.

+

Use primary sources when available. Record the exact claim, where it appears, organism and assay context, and limitations. Verify any short quotation against the source text and obey reuse limits. If the paper cannot be accessed or does not support the claim, say so.

+

Deliver: an evidence register and six missing-category packets. Done when: each category has source-checked support or a documented gap. A file existing is not the same as the category being scientifically complete.

+

A09 — Measure whether the right candidate can be found

+

Owner: agent and student; reviewer checks examples. Target: November 13. Allowance: 4–6 hours.

+

Compare the marker-only search with the wider offline name search using the same reviewed development cases. Separate two questions: “Was an acceptable term available at all?” and “Was it ranked well?” Keep the ontology snapshot fixed for the comparison.

+

Deliver: a candidate-coverage report listing missing targets, newly found targets, and misleading name matches. Done when: absent-target failures are separated from ranking failures, and broader coverage is not advertised as greater scientific accuracy without reviewed evidence.

+

A10 — Test small, explained matching improvements

+

Owner: agent implements; student checks; reviewer approves scientific assumptions. Target: November 20. Allowance: 6–8 hours.

+

Use the reviewed development examples to investigate failures one cause at a time. Prioritize alias conflicts, missing evidence, contradictions, and clearly different cell families. Explore tissue or lineage checks only when the source supplies that information; absence of tissue data is not a contradiction.

+

Deliver: a short experiment note per change: problem, evidence, code change, results, worse cases, and keep/reject decision. Done when: the same input set was used before and after, negative tests pass, and improvements are not caused by editing the expected answers. Any change without sufficient benefit or with unresolved harmful behavior stays optional.

SOULCAP × Cell Ontology · Fall 2026 · Proposed working plan

9. November work packages: work through the cells

+

A11 — Prepare all existing proposals for scientific review

+

Owner: agent prepares; student checks; curator signs decisions. Target: packets by November 20. Allowance: 6–8 student hours, with scientific review distributed across the semester.

+

Create one consistent review packet for each of the 80 proposals. Show the source definition, target definition, relation direction, marker agreement, contradictions, missing information, literature, and unresolved questions. Triage high-risk cases first: the three flagged cases, invalid profiles, apparent contradictions, and exact-match claims needing more context.

+

Deliver: 80 packets and a review queue. Done when: every proposal is accounted for, automated checks and human decisions are distinguishable, and the number actually reviewed is reported separately. Aim for 30 human decisions, including valid rejections and insufficient-evidence findings—not 30 forced approvals.

+

A12 — Investigate the 47 entities without proposals

+

Owner: agent and student; curator decides proposed connections. Target: November 20. Allowance: 6–8 hours.

+

Protect the five reserved entities from routine candidate generation and tuning. For the other 42, prioritize valid source descriptions and use both marker and name evidence. Where the source is broken, record a source-correction dependency. Where CL lacks a suitable term, write a gap explanation rather than selecting the nearest-looking name.

+

Deliver: an entity-level coverage table. Done when: all 47 have a disposition: candidate awaiting review, source clarification needed, likely ontology gap, no supported candidate, or reserved for independent review. Do not equate this accounting with 127 successful mappings. Link family-level gap reports to affected entity IDs so coverage is not double-counted.

+

A13 — Turn genuine ontology gaps into useful drafts

+

Owner: student and agent draft; Dr. Diehl or delegate approves public submission. Target: November 24. Allowance: 2–3 hours.

+

For each prioritized gap, state the affected terms, the exact problem, the evidence, and the smallest proposed correction. Search existing local and upstream issues for duplicates. Separate a missing source detail from an actual ontology problem. Verify old issue statuses rather than copying September notes as current facts.

+

Deliver: submission-ready issue drafts and a tracking table. Done when: each approved submission has a real issue link, while unsubmitted drafts are labelled as drafts. Acceptance by CL maintainers is outside the semester team's control and is not a promised deliverable.

+

November gate: freeze the candidate-search version, evidence rules, development answers, and independent-test protocol. Keep an unchanged copy of the September comparison for context, but use like-for-like current data to evaluate individual changes.

SOULCAP × Cell Ontology · Fall 2026 · Proposed working plan

10. December work packages: test and hand over

+

A14 — Run the independent validation pilot

+

Owner: independent annotator labels; student runs the frozen evaluation. Target: December 4. Allowance: 3–4 student hours plus independent review.

+

Use the five reserved entities only after the software version and protocol are frozen. The annotator should not see the matcher's rankings. Record acceptable targets, relation type, supporting evidence, uncertainty, and valid no-match outcomes. A second reviewer resolves disagreements where possible.

+

The reserve is not proven historically unseen and may contain source-quality problems. If approved source corrections change its profiles, stop and document a new version; do not silently update the recorded hashes. If independence cannot be maintained, describe the result as a reviewed pilot, not a blind final test.

+

Deliver: a separate per-case validation report. Done when: final-test cases are absent from development inputs, all outcomes are shown, and failures remain in the accounting. Five cases are a small demonstration, not a reliable estimate of performance across all cell types. No tuning on these results before reporting the frozen run.

+

A15 — Rebuild the dashboard and handoff package

+

Owner: agent generates; student verifies. Target: December 4. Allowance: 4–5 hours.

+

Run the selected evaluation first, then refresh the dashboard so it displays the new results. Keep default and experimental modes visibly separate. Produce the mapping export from the decision register, not by editing a generated report. Include the input versions, environment instructions, commands, and known limitations.

+

Deliver: an offline dashboard, mapping export, evidence reports, and a reproduction guide. Done when: another person can follow the guide on an approved snapshot; figures agree across the package; absent caches fail with a useful explanation rather than silently producing incomplete results. Do not redistribute source material without the required rights.

+

A16 — Present the semester results and next steps

+

Owner: student presents; Dr. Diehl agrees spring priorities. Target: December 7. Allowance: 3–4 hours.

+

Report what changed, how many decisions were actually reviewed, which questions remain unanswered, and what the evaluation can and cannot establish. Demonstrate one strong match, one broader/narrower relation, and one case where declining to match is the right outcome.

+

Deliver: a plain-language PDF, a short demonstration, and 3–5 spring tasks with owners. Done when: Dr. Diehl can identify the scientific progress separately from the software progress, and the next person can resume work without reconstructing the semester from chat history.

SOULCAP × Cell Ontology · Fall 2026 · Proposed working plan

11. How a scientific review should work

+

The central question is not “Do the names look similar?” It is “Do the descriptions cover the same cells?” Use the following review process for every important decision.

+

Step 1 — Read the SOULCAP description literally

+

List required markers, exclusions, allowed alternatives, and any tissue, species, or specimen information. If an expression is broken or ambiguous, ask for clarification. Do not silently repair it into the meaning the reviewer expects.

+

Step 2 — Read the CL definition, not just its name

+

Check the definition and relevant parent terms in the recorded ontology version. Note requirements not supplied by the SOULCAP description. A shared marker does not establish that two populations are identical.

+

Step 3 — Check both directions

+

Ask whether every cell described by SOULCAP belongs to the CL population, then whether every cell in that CL population meets the SOULCAP definition. If only one direction is supported, an exact match is not justified.

+ + + + + + +
DecisionPlain meaning in this repository
ExactThe two descriptions refer to the same population at the intended level of detail.
BroadThe CL target is broader than the SOULCAP description.
NarrowThe CL target is narrower than the SOULCAP description.
RelatedThere is a useful relationship, but equivalence or containment is not established.
No supported match / unresolvedAvailable evidence does not justify one of the above yet. Record why.
+

Step 4 — Inspect the actual evidence

+

Record which statements are directly present in CL, which are inherited through its structure, and which come from a publication or an assay description. Keep a measurement reagent separate from the molecule it detects unless that relationship is established for the intended use.

+

Step 5 — Record the decision and its limits

+

Every completed review needs the source and target IDs, relation or no-match outcome, short reason, evidence location, relevant versions, reviewer identity, and date. Record alternative interpretations and unresolved disagreements. A decision can later change when the source or ontology changes; preserve its history.

+

Example of careful wording: “This is a plausible candidate, but the source does not state the tissue required by the CL definition. Keep it unconfirmed until the source owner clarifies the intended population.” This is more informative than either forcing an exact match or rejecting the candidate without explanation.

SOULCAP × Cell Ontology · Fall 2026 · Proposed working plan

12. How we will know whether the matcher improves

+

Keep three different kinds of checking separate

+

Software tests ask whether the program follows its rules. They catch broken parsing, unsafe alias expansion, stale inputs, and accidental changes. Passing them does not certify a biological mapping.

+

Development evaluation uses reviewed examples to diagnose and improve the program. Once an example influences a change, it belongs in development and cannot later be presented as independent validation.

+

Independent evaluation uses separately labelled cases after the version is frozen. It checks whether the approach works beyond the examples used to develop it. The existing five-case reserve is only a pilot opportunity, with stated limitations.

+

Report simple, interpretable measures

+ + + + + + + +
MeasureQuestion it answers
Candidate availabilityWas any acceptable CL target available to the search?
First-choice successWas the first suggestion acceptable?
First-five successWas an acceptable target among the first five suggestions?
Unsafe suggestion countHow often did a high-ranked suggestion contradict a reviewed requirement?
Unresolved/no-match outcomesDid the system acknowledge that no supported answer was available?
Review completionHow many cases received real scientific decisions, rather than only automated checks?
+

For each measure, state the number of cases and exactly which dataset was used. Show invalid profiles, missing targets, ties, and rejected candidates. Report target retrieval separately from the correctness of the relationship label. A retrieved target is not automatically an exact match.

+

Rules for a fair comparison

+

Use the same source snapshot, ontology version, candidate pool, reviewed answers, and scoring settings unless the changed component is the explicit subject of the experiment. If several inputs change together, call the result descriptive and do not attribute the gain to one code change.

+

Before testing a change, state what failure it should fix and what it must not break. Inspect every worsened reviewed case, not just the average. Do not quietly remove difficult examples or edit expected answers to make a score rise. Scientifically justified answer corrections need their own dated review and comparison reset.

+

Default-change gate: keep the current default until development evidence supports the new behavior and scientific reviewers accept the important trade-offs. Final pilot results should be reported before any further tuning. No numerical accuracy promise is a semester requirement.

SOULCAP × Cell Ontology · Fall 2026 · Proposed working plan

13. Responsibilities, risks, and fallback decisions

+

Who does what

+

Student/project lead: manages the weekly queue, checks agent outputs, prepares meetings, coordinates permissions, and owns the final report. Agent: drafts local artifacts, checks consistency, prepares evidence, implements approved software work, and runs tests. Scientific reviewer: decides biological meaning and approves mapping conclusions. Sheet owner: authorizes and applies source changes. Independent annotator: labels final-test cases without seeing rankings. Roles may be shared only where independence is preserved.

+

The existing backlog assigns some literature work to Dr. Diehl. Confirm this rather than assuming extra time has been committed. No person receives a new obligation merely because their name appears in this plan.

+ + + + + + + + + +
Risk or delayResponse and decision point
No reviewer available by Oct. 9Ask Dr. Diehl to nominate a delegate. Continue packets and tests; do not claim completed scientific review.
Sheet corrections are delayedKeep affected cells marked as blocked. Continue local evidence review; do not hand-edit the downloaded source cache.
Review targets exceed available timeRe-estimate after two weeks. Reduce optional feature work first, then state a smaller review target openly.
Stricter rules lower scoresInspect why; keep them experimental if trade-offs are unresolved. A higher provisional score does not settle the science.
Paper or service cannot be accessedUse approved alternatives and record the missing evidence. Never invent a supporting quotation.
Independent cases leak into tuningStop calling them held out. Record the exposure and select a new set only with an agreed protocol.
Ontology or source changes mid-comparisonPreserve the old snapshot; review the change and start a new clearly labelled comparison.
Finals reduce availabilityComplete the essential package by Dec. 7. Late-December work is optional.
+

Weekly meeting, in 30 minutes

+

Use five minutes for changed counts and completed work; ten for the two or three scientific decisions that most affect progress; ten for the demonstration or evidence review; and five for next week's owners and blockers. Circulate a short packet in advance rather than asking the reviewer to discover the issue live.

+

Permission boundaries

+

Drafting is not sending. Prepare public issues, emails, source-sheet edits, licensing changes, and release announcements locally, then obtain explicit permission before publishing or applying them. Do not close old issues simply because code now exists; verify their acceptance conditions first.

SOULCAP × Cell Ontology · Fall 2026 · Proposed working plan

14. Copy-and-paste master instructions for an agent

+

The following is a reusable task brief. Give the agent the repository and this plan, then name one approved work package. Do not issue the entire semester as an unattended instruction to “finish everything.”

+

Work in the SOULCAP_CL_Mapping repository on Fall 2026 package [A01–A16]. Read the current repository instructions and the approved version of reports/fall_2026_semester_plan.md. This is a scientific mapping project: suggestions, software checks, and human-reviewed conclusions must remain separate.

+

First inspect the existing work, current source versions, and uncommitted changes. Summarize the requested deliverable, dependencies, files you expect to change, and how you will check the result. Do not duplicate a tool or report that already exists. Ask before materially expanding the approved package.

+

Use stable SOULCAP IDs and the mapping register as the decision record. Do not hand-edit downloaded source caches or generated mapping reports. Preserve historical comparison outputs. Source-sheet corrections require the authorized owner; do not infer permission to edit or publish external data.

+

Follow the selected package's scope. Work in small reviewable steps. For a software change, add focused tests including cases that should be rejected. Run the relevant checks and the full project checks before handing off a merge-ready change. Explain any failure; do not bypass a check to make the result look complete.

+

For scientific evidence, retrieve and inspect the actual source. Record the claim, reference, location, context, and uncertainty. Verify any short quotation. Do not fabricate evidence, a reviewer identity, a review date, or human approval. If a question needs a curator, prepare a decision packet and label it pending.

+

Never assume a part is the whole protein complex, a gene is a protein measurement, or a name match proves cell-type equivalence. Preserve positive/negative markers, expression levels, alternatives, tissue, and species distinctions. Use the repository's explicit Broad/Narrow direction.

+

Keep the reserved validation cases out of candidate tuning and development reports. Do not reveal their rankings to independent annotators. If a source change invalidates the reserve, stop and request a documented re-freeze rather than updating hashes silently.

+

Do not send messages, file or close public issues, change licenses, update the master sheet, or publish a release without specific approval. Prepare drafts instead. Do not commit or push unless instructed.

+

At handoff, state what changed, the artifacts produced, checks run and results, scientific decisions still needed, before/after counts where relevant, and the next safe step. Use plain language first. Mark the package complete only when its stated completion checks are actually met; otherwise describe the blocker and owner.

+

Optional research or implementation expansion: requires a separate decision. This brief authorizes neither new collaborators nor unlimited compute, paid services, or a wider project scope.

SOULCAP × Cell Ontology · Fall 2026 · Proposed working plan

15. Agent task cards and the weekly evidence record

+

Example task card: review the three flagged proposals

+

Package: A05. Inputs: the current entity and proposal tables, reports/regression-followup/mapping_review.tsv, relevant source profiles, CL definitions, and verified primary evidence. Output: three readable review packets and a proposed decision table in a new reports subfolder.

+

Boundaries: do not change accepted mapping status, assign a human reviewer, or rewrite the source. Do not run candidate generation on reserved cases. If the evidence is missing, specify the exact question for Dr. Diehl.

+

Completion check: each packet states the proposal, evidence for and against, relation direction, unknowns, and the decision requested. The student can explain each in two minutes. Human approval is a separate step.

+

Example task card: isolate evaluation datasets

+

Package: A07. Inputs: evaluation.py, benchmark schema, reserve manifest, evaluation tests, and the recorded baseline. Output: a reviewed change that can evaluate a selected dataset without automatically adding proposal cases, plus tests and usage notes.

+

Boundaries: preserve existing command behavior unless an explicit new option is selected. Do not populate final-test answers or assume no-match cases have target IDs. Agree on how no-match outcomes are represented before adding them.

+

Completion check: synthetic tests prove the selected cases are the only cases scored, the reserve is excluded from development, unsupported answers stay visible, and old behavior still passes its tests. Check the code and schema before proposing exact new command-line flags; do not document nonexistent options as working commands.

+

Existing commands the agent should understand

+

uv run pytest — run the project tests.
uv run ruff check . — check code quality.
uv run mypy src — check consistency of declared data types.
uv run soulcap-evaluate --out-dir reports/<new-run> — save an evaluation separately.
uv run soulcap-audit --out-dir reports/<new-audit> — create a separate audit report.

+

These are examples, not an instruction to overwrite established outputs. The agent must check environment setup and mode flags; optional marker-policy mode must be enabled consistently when comparing matching and mapping evidence.

+

Weekly report template

+

Week and package IDs: … Completed artifacts: … Source/software versions: … Tests run: … Human reviews completed: … Proposals still pending: … New evidence or contradictions: … Validation reserve untouched: yes/no, explanation … Decision needed from Dr. Diehl: … Next week's deliverable and owner: …

+

Keep a dated decision log. When a task is blocked, record what is missing and what work can safely continue. Do not present another planned task as completed progress.

SOULCAP × Cell Ontology · Fall 2026 · Proposed working plan

16. What to say to Dr. Diehl

+

A one-minute explanation

+

“The repository is much easier to inspect now. We have stable cell identifiers, one place for the proposed mappings, a dashboard, and repeatable tests. We also added more careful handling of marker aliases and protein information. That work exposed an important issue: we have 80 proposed mappings, but they are not yet a reviewed answer set.

+

“My semester plan is to spend October agreeing on the review rules and resolving the most important source and marker questions. In November, I want to review the existing suggestions, investigate the missing coverage, and test improvements against examples that have actually been checked. By December 7, I want to deliver a reproducible package and a clear report separating what is confirmed, what is only proposed, and what remains unresolved.

+

“I need help choosing the scientific reviewer, confirming the time commitment, and agreeing on what would count as a successful semester. I am not promising that every SOULCAP cell has an exact CL match.”

+

Decisions to request at the meeting

+
    +
  1. Is the proposed scope right: trustworthy review and measurable progress before more ambitious ranking features?
  2. +
  3. Can we plan for 10–12 student hours in an active week and a short weekly check-in?
  4. +
  5. Who can provide scientific decisions, and is the target of 30 reviews realistic?
  6. +
  7. Who owns the source sheet and can approve the required clarifications or edits?
  8. +
  9. Who can independently annotate the five reserved cases without seeing rankings?
  10. +
  11. Which cell categories should lead if review capacity is limited?
  12. +
  13. May issue drafts be submitted after approval, and who decides licensing questions?
  14. +
  15. Is December 7 the right main handoff date, with later December work optional?
  16. +
+

Short email you can adapt

+

Subject: Proposed October–December plan for SOULCAP–CL mapping

+

Dear Dr. Diehl,

+

I have prepared a semester plan that summarizes the recent repository improvements and sets out the next steps for October, November, and December. The focus is on turning the existing suggestions into a clearer, evidence-backed review process, improving missing coverage, and testing changes fairly.

+

The plan separates software work that an agent can carry out from biological decisions that need a qualified reviewer. It proposes a main handoff by December 7 and includes weekly deliverables, completion checks, and questions about review support and priorities.

+

Could we review the scope and agree on the reviewer, time commitment, and first priorities? I have attached the detailed plan for discussion.

+

Best,
[Your name]

SOULCAP × Cell Ontology · Fall 2026 · Proposed working plan

17. Sources, relationship to the older plan, and limits

+

Repository evidence used for this document

+

[R1] README.md, ROADMAP.md, and mappings/README.md. Project purpose, commands, decision conventions, current local status, and historical milestones.

+

[R2] mappings/soulcap_entities.tsv, mappings/curated_mappings.tsv, and mappings/matcher_benchmark.tsv. Directly counted on September 21: 127 entities, 80 proposals all needing review, and zero reviewed benchmark rows.

+

[R3] reports/cl_lexical_cache.json and reports/marker_resolution_audit.md. Local candidate-cache size and documented marker-resolution behavior. A cached source is not a claim about the latest online ontology release.

+

[R4] reports/regression-followup/README.md and its legacy/ and corrected/ evaluation JSON files. September comparison, the three flagged mapping cases, the scoped CD8 correction, and recorded software verification.

+

[R5] mappings/benchmark_reserve.json and mappings/marker_assertion_benchmark.json. Five unlabelled reserved entities and five development constraint examples. The current local source-profile hash matches the reserve's recorded source hash.

+

[R6] reports/regression-triage/README.md and reports/resolver-refinement/README.md. Earlier comparisons and the diagnostic investigation of lost rankings.

+

[R7] reports/fall_2026_sprint_backlog.md. Existing September 18 backlog. Used as the starting plan, not overwritten. Its issue states and third-party commitments were not reverified in this planning task.

+

[R8] Git history. f1e0772 (September 11): registry-backed mapping, dashboard, and evaluation; 4dfc726 (September 18): resolution policies, regression triage, and follow-up; 8a1094e: semester backlog; c6343c1: missing-cache handling in reserve tests; aa4743b: refreshed validation report. This summarizes recorded repository work, not exclusive authorship of every change.

+

[U1] University at Buffalo, Office of the Registrar: Current Academic Calendar, Fall Semester 2026, standard session. Checked September 21, 2026. Official calendar. Dates may change; reconfirm before scheduling meetings.

+

How this proposal builds on the older backlog

+

Old October O1–O6 map to A01–A06; old November N1–N4 map to A08–A13; old December D1–D4 map to A14–A16. A07 adds explicit separation of evaluation datasets. A09–A10 make coverage and matching experiments more measurable. Routine tests, weekly meetings, and truthful claims continue across all packages.

+

This draft deliberately qualifies four older expectations: review can progress locally without pretending sheet intent is known; the five reserved cases must not be consumed by the remaining-47 matching work; five cases cannot establish general accuracy; and human-dependent outcomes cannot be promised as agent-only deliverables. These are proposed refinements for approval, not a claim that the earlier plan has been formally replaced.

+

Document scope: planning and a record of recent work. No new biological decisions, live issue updates, license decisions, or performance gains are asserted. Only planning documents and PDF-generation artifacts are created for this request; the matching software and source data are unchanged.

\ No newline at end of file diff --git a/reports/fall_2026_semester_plan.md b/reports/fall_2026_semester_plan.md new file mode 100644 index 0000000..3f4d3ab --- /dev/null +++ b/reports/fall_2026_semester_plan.md @@ -0,0 +1,583 @@ +# SOULCAP ↔ Cell Ontology +## Fall 2026 semester working plan + +**October • November • December 2026** + +Prepared for discussion with **Dr. Alexander Diehl** +University at Buffalo • Prepared September 21, 2026 + +### The project in one sentence + +Help people decide whether a SOULCAP cell description and a Cell Ontology description mean the same thing, mean related but different things, or cannot yet be connected reliably. + +### The proposed semester goal + +Turn a useful collection of suggested matches into a clearer, evidence-backed review system: every cell has a visible status, important decisions have a scientific explanation, and software improvements are tested fairly. + +### The three-month story + +| Month | Plain-language purpose | Main result | +|---|---|---| +| October | Make the information trustworthy and agree on the review rules. | A checked starting point, clearer marker rules, and the first reviewed examples. | +| November | Review the existing suggestions and investigate missing matches. | Review packets for the existing proposals and a documented outcome for the remaining cells. | +| December | Test fairly, explain the results, and hand over the work. | A reproducible project package, a clear report, and a spring priority list. | + +**Important distinction:** a suggested match is not a confirmed match. A computer can organize evidence and suggest candidates; a qualified reviewer must approve scientific conclusions. + +### How to use this document + +Pages 1–6 explain the project, recent progress, goals, and schedule. Pages 7–11 give the work packages. Pages 12–16 describe the review process, testing, responsibilities, and agent instructions. Pages 17–18 provide meeting language and source references. + +**Approval status:** proposed plan, not an approved commitment from Dr. Diehl or any other collaborator. Workload estimates, review targets, and expanded tasks require agreement. Creating this document does not authorize public issue filing, source-sheet changes, or scientific sign-off. + + + +## 1. Where the project stands today + +The local repository was checked on September 21. The table distinguishes facts verified in the files from previously recorded results. No live source-sheet update or public issue-status check was performed for this document. + +| Starting point | What it means in plain language | +|---|---| +| 127 registered SOULCAP entities | There are 127 cell descriptions with stable local identifiers. | +| 80 proposals covering 80 entities | Someone has suggested a CL connection for these cells. Every proposal still says it needs review. | +| 47 entities without proposals | These require investigation, not an automatic promise of 47 new matches. | +| 0 reviewed mapping benchmark cases | There is not yet an independently approved answer set for measuring scientific matching quality. | +| 5 reserved, unlabelled entities | Five cases are set aside for possible future testing. They are not already a validated test set. | +| 75 marker-registry rows, grouped into 73 normalized marker groups | Different spellings and repeated entries need careful handling; they do not necessarily represent different proteins. | +| 826 CL terms in the recorded marker-only comparison | The marker-only search can consider this subset of CL, not every CL term. | +| 3,327 active terms in the local name-search cache | The optional local name search can look more widely, but names alone do not prove equivalence. | + +### The current performance result must be explained carefully + +In the recorded September comparison, the older matcher placed a provisional expected target in its first five suggestions for **19 of 80 cases**. The corrected strict marker-policy mode did so for **16 of 80 cases**. Neither number measures confirmed biological accuracy because the expected answers remain unreviewed. The stricter mode is still optional, not the default. + +The same comparison reports six invalid source profiles and 13 cases whose targets are absent from the index. These are counts within that 80-case evaluation, not counts of all source-sheet problems. All cases remain in the reported denominator. + +### What needs attention first + +Fix the interpretation and review process before chasing a higher score. The immediate priorities are ambiguous marker names, three flagged T-cell mapping decisions, source expressions that cannot be read reliably, and the absence of a reviewed answer set. + +**Evidence:** local registries and evaluation files [R1–R5]. The most recent recorded software check was 537 passing tests with 96.53% coverage on September 18; this is a historical result, not a fresh September 21 test run. + + + +## 2. Recent improvements already delivered + +These are the main September improvements supported by the repository and its change history. They are completed software and reporting work, not claims that the biology has been approved. + +### A. One consistent way to read marker descriptions + +Validation, marker extraction, and matching now share the same interpretation of marker expressions. Positive and negative markers, expression levels, and grouped alternatives are kept distinct. Invalid descriptions are flagged rather than quietly ranked as if they were valid. + +**Why it matters:** two parts of the program should not read the same cell description differently. This reduces avoidable disagreement inside the software. + +### B. Stable cell identifiers and one mapping register + +Each registered SOULCAP entity has a permanent local identifier. Proposed mapping decisions live in one table instead of being maintained separately in multiple reports. Existing proposals were preserved. + +**Why it matters:** a renamed cell should not become a new, unconnected record. One decision table makes it easier to see what changed and prevents conflicting copies of the same decision. + +### C. Evidence attached to each proposed match + +Reports now distinguish marker evidence, name-based evidence, literature evidence, and curator statements. They show which markers agree, disagree, or have no available information. Exported tables can be traced to the input files used to produce them. + +**Why it matters:** the reader can ask “Why is this suggested?” and inspect the answer. The project avoids attaching a made-up confidence percentage to an unreviewed conclusion. + +### D. A unified audit dashboard + +An offline dashboard brings together the cell list, proposed mappings, missing coverage, marker information, review findings, and report freshness. Users can search, filter, and open the details without running a web server. + +**Why it matters:** Dr. Diehl and the student can work from the same review list instead of searching through many separate files. + +### E. A repeatable matcher evaluation + +The evaluation harness checks whether an expected target appears near the top of the suggestions. It separates provisional expectations from reviewed cases and exposes ties, missing candidates, and invalid inputs. + +**Why it matters:** future changes can be compared with an earlier version. However, software testing and agreement with old proposals are not substitutes for scientific review. + +**Where to inspect:** `README.md`, the `mappings/` directory, `reports/audit_dashboard.html`, and the recorded matcher evaluations [R1–R4]. The major implementation commits are identified on page 18. + + + +## 3. More recent improvements—and what they did not solve + +### F. Marker aliases and protein-aware matching + +The optional enhanced mode recognizes approved alternative marker names and compatible protein identifiers. It avoids counting the same marker condition twice. Conflicting aliases remain unresolved rather than being guessed. + +**Why it matters:** different names for the same approved marker should not cause a missed match or an unfair extra score. + +### G. Broader candidate search + +An optional offline name-and-synonym search can find CL candidates outside the marker-only index. Its evidence is kept separate from marker evidence. + +**Why it matters:** a suitable CL term should not be invisible merely because its marker information is incomplete. A name match remains only a candidate. + +### H. More honest status information + +The roadmap was corrected to show 80 proposals for 80 of 127 entities, rather than the misleading older count of 87/127. Marker reports distinguish ordinary protein mappings from complexes, families, reagents, possible source artifacts, and unresolved entries. + +**Why it matters:** a blank gene field is not automatically an error. Some measurements do not refer to a single protein or gene. + +### I. A controlled investigation of the regression + +Eight diagnostic combinations separated three changes: added alias/protein evidence, removed evidence under stricter rules, and removal of duplicate conditions. In that snapshot, the changed target rankings came from removed evidence, not from the other two factors. + +**Why it matters:** the project has a documented explanation for the regression instead of an unexplained lower score. This finding applies to that comparison, not every possible future dataset. + +### J. A narrow CD8 correction and protected test preparation + +The resolver now retains a specific whole-CD8 surface assertion that had been discarded. It does not treat CD8 alpha as automatically equivalent to the whole coreceptor. The correction restores that evidence for 39 CL terms, but top-five agreement remains 16/80. Five evidence-constraint examples and additional tests protect this behavior. + +Three proposed mappings were reviewed by the agent: two relations lacked sufficient support, and one remained plausible but unconfirmed. No proposal was promoted to confirmed truth. Five unlabelled entities were reserved for later independent review. + +**Still unfinished:** curator decisions, scientifically reviewed benchmark answers, a fair final test, and proof that any new default matcher is better. The old default remains in place [R4–R6]. + + + +## 4. What success should look like by December + +The semester should be judged by useful, reviewable outputs—not by a promise that every cell can be matched or that a particular accuracy percentage will be achieved. + +| Deliverable | Proposed completion check | +|---|---| +| An honest project inventory | All 127 entities have a status and a next step. No record disappears because it is difficult. | +| Existing-proposal review packets | All 80 proposals receive an automated evidence check and a readable packet. Aim for 30 completed human scientific reviews, subject to reviewer capacity. | +| Missing-coverage investigation | Each of the 47 has a recorded disposition. Investigate the 42 non-reserved cases; keep five reserved cases outside tuning and mark their review route separately. | +| Important ambiguity decisions | Three flagged mapping cases and five marker holds each receive a signed decision or an explicit unanswered question with an owner. | +| A reviewed development answer set | Aim for 20 human-reviewed cases drawn from the reviewed proposals, spanning several cell groups and relation types. Do not manufacture examples to reach a quota. | +| Literature evidence | Recheck the eight historically covered categories; prepare evidence packets for the six remaining categories, within agreed reviewer availability. | +| Independent validation pilot | Independently label the five reserved cases if feasible, preserve separation from development, and report per-case results and limitations. | +| A reproducible handoff | Another person can produce the dashboard and reports from the documented inputs and commands. | + +### Workload assumptions to approve + +Plan around **10–12 student hours per active week**, with a proposed total of roughly **90–110 hours through December 7**, including meeting preparation and troubleshooting. The agent supports drafting, coding, checks, and evidence organization within that supervised work; it does not replace review time. + +Ask for a **30-minute weekly meeting** plus approximately **60 minutes of scientific review per week**, shared with another qualified reviewer if available. Review speed will vary. Check actual throughput after two weeks and reduce the target if necessary. + +### Minimum, target, and stretch + +**Minimum:** an accurate inventory, packets for all 80 proposals, a documented route for all 47 uncovered entities, at least 10 completed human reviews if review support is available, and a reproducible report. Missing review support must be reported, not hidden. + +**Target:** the deliverables above, including 30 scientific reviews and 20 usable development cases. The five-case validation pilot is conditional on independent annotation. + +**Stretch:** expand independent testing toward 15–20 genuinely separate cases, or finish more scientific reviews. This requires additional review capacity and a redesigned split before selection or tuning; it is not a silent expansion of the current five-case reserve. + + + +## 5. Calendar and weekly delivery plan + +The main handoff is **December 7**, with no essential task dependent on the examination period. UB lists fall break on October 12–13, Thanksgiving break on November 25–28, the last day of classes on December 7, and final exams on December 9–16 [U1]. These are the standard-session dates; confirm the student's individual obligations. + +| Work window | Main focus | Visible output | +|---|---|---| +| Oct. 1–2 | Kickoff; confirm hours, reviewer, and approvals | Agreed scope and baseline checklist | +| Oct. 5–9 | Inventory, review form, source-sheet requests | Baseline report; first review packet | +| Oct. 12–16 | Light week around fall break; track responses | Decision log and approved correction requests | +| Oct. 19–23 | Three flagged cases; five marker holds | First signed decisions or named blockers | +| Oct. 26–30 | Fair evaluation setup; first development cases | October demonstration and review gate | +| Nov. 2–6 | Candidate coverage; first missing-category evidence | Candidate report and literature packets | +| Nov. 9–13 | Review batches; test one matching change at a time | Explained before/after experiment | +| Nov. 16–20 | Complete proposal packets; review uncovered cells | Coverage inventory; no silent omissions | +| Nov. 23–24 | Freeze the version to be tested; prepare handoff | Frozen input list and test protocol | +| Nov. 25–28 | Thanksgiving break | No required delivery | +| Nov. 30–Dec. 4 | Independent pilot; reproduce reports | Validation results or explicit limitation | +| Dec. 7 | Present and hand over | PDF report, repository package, spring priorities | +| Dec. 8–16 | Reading day and exams | No required development or review work | +| Dec. 17–23 | Optional, only if agreed | Small documentation corrections or archival work | +| Dec. 24–31 | Buffer, not a hidden deadline | No required semester deliverable | + +### Three decision gates + +**October 30:** confirm that the review form works, source problems are tracked, review ownership is real, and the first answer-set cases are reliable. If not, reduce November feature work and focus on these foundations. + +**November 20:** approve the version and datasets for final testing. Unresolved scientific questions stay visibly unresolved. Candidate-search changes that fail the review checks remain experimental. + +**December 7:** accept the handoff based on reproducibility, evidence quality, clear status counts, and honest limitations—not a predetermined score. + + + +## 6. October work packages: establish the foundation + +### A01 — Save and check the starting point + +**Owner:** student with agent support. **Target:** October 9. **Planning allowance:** 4–6 hours. + +Recount the entity, proposal, marker, and review tables. Record the exact source snapshot and software version. Run the software checks and preserve a baseline evaluation in a new output folder. Compare the roadmap, dashboard, and reports for conflicting claims. + +**Deliver:** a dated baseline report and an input list. **Done when:** counts agree across outputs, missing inputs are identified, historical results are labelled, and no old baseline is overwritten. A failing test is a reported problem, not permission to weaken the test. + +### A02 — Agree on what a mapping decision means + +**Owner:** Dr. Diehl or a delegated curator decides; student and agent prepare. **Target:** October 9. **Allowance:** 4–6 hours plus review. + +Prepare one short form that asks whether the two descriptions mean the same population, whether one is broader, or whether they are only related. Include tissue, species, specimen, marker requirements, exclusions, source references, reviewer name, date, and unanswered questions. + +**Deliver:** a review template and three example packets. **Done when:** the reviewer can use the form consistently and the direction of Broad/Narrow is explicit. No agent-generated text may impersonate a human review. + +### A03 — Request source-sheet and marker-string corrections + +**Owner:** student drafts; authorized sheet owner edits. **Target:** request by October 9; follow up October 16. **Allowance:** 3–5 hours. + +Check the historical request for a dedicated mapping-relation field. Confirm whether existing fields can support the needed information before asking for duplicate columns. Do not confuse the existing assay-type field with the CL mapping relation. Reuse the prior marker-fix proposal where appropriate; include the source expressions that currently cannot be parsed. + +**Deliver:** a precise request, a change checklist, and a decision log. **Done when:** an authorized owner accepts or declines each request, or a dated blocker names the person and next follow-up. After approved edits, synchronize and verify; never repair the downloaded cache by hand. + +### A04 — Tidy the issue and licensing backlog safely + +**Owner:** student and agent prepare; authorized owner approves external changes. **Target:** October 23. **Allowance:** 3–4 hours. + +Recheck the existing gap log and issue history before proposing new issues. Draft duplicate-free issue descriptions and a licensing decision request. Verify who owns the code and data before applying a license. Do not assume an old issue is still open or already satisfied. + +**Deliver:** an approved-action queue. **Done when:** each item is filed with permission, closed with permission, or has a documented reason to remain pending. No public messages or license changes are authorized by this plan alone. + + + +## 7. October work packages: resolve the high-risk questions + +### A05 — Review the three flagged mapping proposals + +**Owner:** scientific reviewer; student and agent prepare evidence. **Target:** October 23. **Allowance:** 3–4 preparation hours plus review. + +For SC000063, ask whether a description containing both alpha/beta and gamma/delta cells can point to a target restricted to alpha-beta cells, and in which direction. For SC000067, ask whether the operational marker gate establishes the proposed equivalence. For SC000073, ask whether there is evidence for the target's required intraepithelial location. + +**Deliver:** three decision records. **Done when:** each has an accepted, rejected, revised, or insufficient-evidence outcome with reviewer, date, and reason. Insufficient evidence is a valid completed review, not a reason to invent a mapping. + +### A06 — Review the five important marker holds + +**Owner:** scientific reviewer defines the meaning; agent implements approved rules. **Target:** October 30. **Allowance:** 5–7 hours plus review. + +Review CD3, CD8, CD15, CD16, and MR1 individually. Ask what the source actually measures: a single protein, a larger complex, a family, or a reagent-defined signal. Identify when assay details are missing. Preserve the narrow whole-CD8 correction unless new evidence warrants a separately reviewed change. + +**Deliver:** a policy table and tests for approved changes. **Done when:** every hold has a reasoned decision or a named evidence gap, and each implemented rule has both an example it should accept and a similar example it must reject. Do not merely change fingerprints to make stale policies pass. + +### A07 — Make the evaluation ready for fair review + +**Owner:** agent implements; student verifies; reviewer approves answers. **Target:** October 30. **Allowance:** 6–8 hours. + +Prepare the first 5–10 reviewed development examples. Keep them separate from unreviewed proposals. Add and test an explicit way to evaluate only a selected dataset, because the present evaluator automatically includes proposal-derived cases. Support a recorded no-supported-match outcome rather than forcing every reviewed case to name a target. + +**Deliver:** separate development/final-test input handling and a small reviewed development set. **Done when:** tests prove that reserve cases cannot silently enter development results; missing answers are not treated as correct; invalid inputs and missing candidates remain visible. Do not score or inspect reserve rankings during tuning. + +**October gate:** review these deliverables with Dr. Diehl. If source-sheet decisions are delayed, local evidence review can continue with its limitations stated. Missing curator intent must not be replaced by an agent's guess. + + + +## 8. November work packages: improve evidence and coverage + +### A08 — Check the literature coverage and fill the gaps + +**Owner:** confirm the scientific lead with Dr. Diehl; agent assists with retrieval and organization. **Target:** November 20. **Allowance:** 8–10 student hours plus scientific review. + +The older roadmap records eight of fourteen cell categories covered. Treat that as a starting claim, not a current quality certificate. Check that those reports contain accessible sources and support the actual statements made. Prepare packets for monocyte, neutrophil, basophil, mast cell, granulocyte, and myeloid-derived suppressor cell categories. + +Use primary sources when available. Record the exact claim, where it appears, organism and assay context, and limitations. Verify any short quotation against the source text and obey reuse limits. If the paper cannot be accessed or does not support the claim, say so. + +**Deliver:** an evidence register and six missing-category packets. **Done when:** each category has source-checked support or a documented gap. A file existing is not the same as the category being scientifically complete. + +### A09 — Measure whether the right candidate can be found + +**Owner:** agent and student; reviewer checks examples. **Target:** November 13. **Allowance:** 4–6 hours. + +Compare the marker-only search with the wider offline name search using the same reviewed development cases. Separate two questions: “Was an acceptable term available at all?” and “Was it ranked well?” Keep the ontology snapshot fixed for the comparison. + +**Deliver:** a candidate-coverage report listing missing targets, newly found targets, and misleading name matches. **Done when:** absent-target failures are separated from ranking failures, and broader coverage is not advertised as greater scientific accuracy without reviewed evidence. + +### A10 — Test small, explained matching improvements + +**Owner:** agent implements; student checks; reviewer approves scientific assumptions. **Target:** November 20. **Allowance:** 6–8 hours. + +Use the reviewed development examples to investigate failures one cause at a time. Prioritize alias conflicts, missing evidence, contradictions, and clearly different cell families. Explore tissue or lineage checks only when the source supplies that information; absence of tissue data is not a contradiction. + +**Deliver:** a short experiment note per change: problem, evidence, code change, results, worse cases, and keep/reject decision. **Done when:** the same input set was used before and after, negative tests pass, and improvements are not caused by editing the expected answers. Any change without sufficient benefit or with unresolved harmful behavior stays optional. + + + +## 9. November work packages: work through the cells + +### A11 — Prepare all existing proposals for scientific review + +**Owner:** agent prepares; student checks; curator signs decisions. **Target:** packets by November 20. **Allowance:** 6–8 student hours, with scientific review distributed across the semester. + +Create one consistent review packet for each of the 80 proposals. Show the source definition, target definition, relation direction, marker agreement, contradictions, missing information, literature, and unresolved questions. Triage high-risk cases first: the three flagged cases, invalid profiles, apparent contradictions, and exact-match claims needing more context. + +**Deliver:** 80 packets and a review queue. **Done when:** every proposal is accounted for, automated checks and human decisions are distinguishable, and the number actually reviewed is reported separately. Aim for 30 human decisions, including valid rejections and insufficient-evidence findings—not 30 forced approvals. + +### A12 — Investigate the 47 entities without proposals + +**Owner:** agent and student; curator decides proposed connections. **Target:** November 20. **Allowance:** 6–8 hours. + +Protect the five reserved entities from routine candidate generation and tuning. For the other 42, prioritize valid source descriptions and use both marker and name evidence. Where the source is broken, record a source-correction dependency. Where CL lacks a suitable term, write a gap explanation rather than selecting the nearest-looking name. + +**Deliver:** an entity-level coverage table. **Done when:** all 47 have a disposition: candidate awaiting review, source clarification needed, likely ontology gap, no supported candidate, or reserved for independent review. Do not equate this accounting with 127 successful mappings. Link family-level gap reports to affected entity IDs so coverage is not double-counted. + +### A13 — Turn genuine ontology gaps into useful drafts + +**Owner:** student and agent draft; Dr. Diehl or delegate approves public submission. **Target:** November 24. **Allowance:** 2–3 hours. + +For each prioritized gap, state the affected terms, the exact problem, the evidence, and the smallest proposed correction. Search existing local and upstream issues for duplicates. Separate a missing source detail from an actual ontology problem. Verify old issue statuses rather than copying September notes as current facts. + +**Deliver:** submission-ready issue drafts and a tracking table. **Done when:** each approved submission has a real issue link, while unsubmitted drafts are labelled as drafts. Acceptance by CL maintainers is outside the semester team's control and is not a promised deliverable. + +**November gate:** freeze the candidate-search version, evidence rules, development answers, and independent-test protocol. Keep an unchanged copy of the September comparison for context, but use like-for-like current data to evaluate individual changes. + + + +## 10. December work packages: test and hand over + +### A14 — Run the independent validation pilot + +**Owner:** independent annotator labels; student runs the frozen evaluation. **Target:** December 4. **Allowance:** 3–4 student hours plus independent review. + +Use the five reserved entities only after the software version and protocol are frozen. The annotator should not see the matcher's rankings. Record acceptable targets, relation type, supporting evidence, uncertainty, and valid no-match outcomes. A second reviewer resolves disagreements where possible. + +The reserve is not proven historically unseen and may contain source-quality problems. If approved source corrections change its profiles, stop and document a new version; do not silently update the recorded hashes. If independence cannot be maintained, describe the result as a reviewed pilot, not a blind final test. + +**Deliver:** a separate per-case validation report. **Done when:** final-test cases are absent from development inputs, all outcomes are shown, and failures remain in the accounting. Five cases are a small demonstration, not a reliable estimate of performance across all cell types. No tuning on these results before reporting the frozen run. + +### A15 — Rebuild the dashboard and handoff package + +**Owner:** agent generates; student verifies. **Target:** December 4. **Allowance:** 4–5 hours. + +Run the selected evaluation first, then refresh the dashboard so it displays the new results. Keep default and experimental modes visibly separate. Produce the mapping export from the decision register, not by editing a generated report. Include the input versions, environment instructions, commands, and known limitations. + +**Deliver:** an offline dashboard, mapping export, evidence reports, and a reproduction guide. **Done when:** another person can follow the guide on an approved snapshot; figures agree across the package; absent caches fail with a useful explanation rather than silently producing incomplete results. Do not redistribute source material without the required rights. + +### A16 — Present the semester results and next steps + +**Owner:** student presents; Dr. Diehl agrees spring priorities. **Target:** December 7. **Allowance:** 3–4 hours. + +Report what changed, how many decisions were actually reviewed, which questions remain unanswered, and what the evaluation can and cannot establish. Demonstrate one strong match, one broader/narrower relation, and one case where declining to match is the right outcome. + +**Deliver:** a plain-language PDF, a short demonstration, and 3–5 spring tasks with owners. **Done when:** Dr. Diehl can identify the scientific progress separately from the software progress, and the next person can resume work without reconstructing the semester from chat history. + + + +## 11. How a scientific review should work + +The central question is not “Do the names look similar?” It is “Do the descriptions cover the same cells?” Use the following review process for every important decision. + +### Step 1 — Read the SOULCAP description literally + +List required markers, exclusions, allowed alternatives, and any tissue, species, or specimen information. If an expression is broken or ambiguous, ask for clarification. Do not silently repair it into the meaning the reviewer expects. + +### Step 2 — Read the CL definition, not just its name + +Check the definition and relevant parent terms in the recorded ontology version. Note requirements not supplied by the SOULCAP description. A shared marker does not establish that two populations are identical. + +### Step 3 — Check both directions + +Ask whether every cell described by SOULCAP belongs to the CL population, then whether every cell in that CL population meets the SOULCAP definition. If only one direction is supported, an exact match is not justified. + +| Decision | Plain meaning in this repository | +|---|---| +| Exact | The two descriptions refer to the same population at the intended level of detail. | +| Broad | The CL target is broader than the SOULCAP description. | +| Narrow | The CL target is narrower than the SOULCAP description. | +| Related | There is a useful relationship, but equivalence or containment is not established. | +| No supported match / unresolved | Available evidence does not justify one of the above yet. Record why. | + +### Step 4 — Inspect the actual evidence + +Record which statements are directly present in CL, which are inherited through its structure, and which come from a publication or an assay description. Keep a measurement reagent separate from the molecule it detects unless that relationship is established for the intended use. + +### Step 5 — Record the decision and its limits + +Every completed review needs the source and target IDs, relation or no-match outcome, short reason, evidence location, relevant versions, reviewer identity, and date. Record alternative interpretations and unresolved disagreements. A decision can later change when the source or ontology changes; preserve its history. + +**Example of careful wording:** “This is a plausible candidate, but the source does not state the tissue required by the CL definition. Keep it unconfirmed until the source owner clarifies the intended population.” This is more informative than either forcing an exact match or rejecting the candidate without explanation. + + + +## 12. How we will know whether the matcher improves + +### Keep three different kinds of checking separate + +**Software tests** ask whether the program follows its rules. They catch broken parsing, unsafe alias expansion, stale inputs, and accidental changes. Passing them does not certify a biological mapping. + +**Development evaluation** uses reviewed examples to diagnose and improve the program. Once an example influences a change, it belongs in development and cannot later be presented as independent validation. + +**Independent evaluation** uses separately labelled cases after the version is frozen. It checks whether the approach works beyond the examples used to develop it. The existing five-case reserve is only a pilot opportunity, with stated limitations. + +### Report simple, interpretable measures + +| Measure | Question it answers | +|---|---| +| Candidate availability | Was any acceptable CL target available to the search? | +| First-choice success | Was the first suggestion acceptable? | +| First-five success | Was an acceptable target among the first five suggestions? | +| Unsafe suggestion count | How often did a high-ranked suggestion contradict a reviewed requirement? | +| Unresolved/no-match outcomes | Did the system acknowledge that no supported answer was available? | +| Review completion | How many cases received real scientific decisions, rather than only automated checks? | + +For each measure, state the number of cases and exactly which dataset was used. Show invalid profiles, missing targets, ties, and rejected candidates. Report target retrieval separately from the correctness of the relationship label. A retrieved target is not automatically an exact match. + +### Rules for a fair comparison + +Use the same source snapshot, ontology version, candidate pool, reviewed answers, and scoring settings unless the changed component is the explicit subject of the experiment. If several inputs change together, call the result descriptive and do not attribute the gain to one code change. + +Before testing a change, state what failure it should fix and what it must not break. Inspect every worsened reviewed case, not just the average. Do not quietly remove difficult examples or edit expected answers to make a score rise. Scientifically justified answer corrections need their own dated review and comparison reset. + +**Default-change gate:** keep the current default until development evidence supports the new behavior and scientific reviewers accept the important trade-offs. Final pilot results should be reported before any further tuning. No numerical accuracy promise is a semester requirement. + + + +## 13. Responsibilities, risks, and fallback decisions + +### Who does what + +**Student/project lead:** manages the weekly queue, checks agent outputs, prepares meetings, coordinates permissions, and owns the final report. **Agent:** drafts local artifacts, checks consistency, prepares evidence, implements approved software work, and runs tests. **Scientific reviewer:** decides biological meaning and approves mapping conclusions. **Sheet owner:** authorizes and applies source changes. **Independent annotator:** labels final-test cases without seeing rankings. Roles may be shared only where independence is preserved. + +The existing backlog assigns some literature work to Dr. Diehl. Confirm this rather than assuming extra time has been committed. No person receives a new obligation merely because their name appears in this plan. + +| Risk or delay | Response and decision point | +|---|---| +| No reviewer available by Oct. 9 | Ask Dr. Diehl to nominate a delegate. Continue packets and tests; do not claim completed scientific review. | +| Sheet corrections are delayed | Keep affected cells marked as blocked. Continue local evidence review; do not hand-edit the downloaded source cache. | +| Review targets exceed available time | Re-estimate after two weeks. Reduce optional feature work first, then state a smaller review target openly. | +| Stricter rules lower scores | Inspect why; keep them experimental if trade-offs are unresolved. A higher provisional score does not settle the science. | +| Paper or service cannot be accessed | Use approved alternatives and record the missing evidence. Never invent a supporting quotation. | +| Independent cases leak into tuning | Stop calling them held out. Record the exposure and select a new set only with an agreed protocol. | +| Ontology or source changes mid-comparison | Preserve the old snapshot; review the change and start a new clearly labelled comparison. | +| Finals reduce availability | Complete the essential package by Dec. 7. Late-December work is optional. | + +### Weekly meeting, in 30 minutes + +Use five minutes for changed counts and completed work; ten for the two or three scientific decisions that most affect progress; ten for the demonstration or evidence review; and five for next week's owners and blockers. Circulate a short packet in advance rather than asking the reviewer to discover the issue live. + +### Permission boundaries + +Drafting is not sending. Prepare public issues, emails, source-sheet edits, licensing changes, and release announcements locally, then obtain explicit permission before publishing or applying them. Do not close old issues simply because code now exists; verify their acceptance conditions first. + + + +## 14. Copy-and-paste master instructions for an agent + +The following is a reusable task brief. Give the agent the repository and this plan, then name one approved work package. Do not issue the entire semester as an unattended instruction to “finish everything.” + +> Work in the SOULCAP_CL_Mapping repository on Fall 2026 package [A01–A16]. Read the current repository instructions and the approved version of reports/fall_2026_semester_plan.md. This is a scientific mapping project: suggestions, software checks, and human-reviewed conclusions must remain separate. +> +> First inspect the existing work, current source versions, and uncommitted changes. Summarize the requested deliverable, dependencies, files you expect to change, and how you will check the result. Do not duplicate a tool or report that already exists. Ask before materially expanding the approved package. +> +> Use stable SOULCAP IDs and the mapping register as the decision record. Do not hand-edit downloaded source caches or generated mapping reports. Preserve historical comparison outputs. Source-sheet corrections require the authorized owner; do not infer permission to edit or publish external data. +> +> Follow the selected package's scope. Work in small reviewable steps. For a software change, add focused tests including cases that should be rejected. Run the relevant checks and the full project checks before handing off a merge-ready change. Explain any failure; do not bypass a check to make the result look complete. +> +> For scientific evidence, retrieve and inspect the actual source. Record the claim, reference, location, context, and uncertainty. Verify any short quotation. Do not fabricate evidence, a reviewer identity, a review date, or human approval. If a question needs a curator, prepare a decision packet and label it pending. +> +> Never assume a part is the whole protein complex, a gene is a protein measurement, or a name match proves cell-type equivalence. Preserve positive/negative markers, expression levels, alternatives, tissue, and species distinctions. Use the repository's explicit Broad/Narrow direction. +> +> Keep the reserved validation cases out of candidate tuning and development reports. Do not reveal their rankings to independent annotators. If a source change invalidates the reserve, stop and request a documented re-freeze rather than updating hashes silently. +> +> Do not send messages, file or close public issues, change licenses, update the master sheet, or publish a release without specific approval. Prepare drafts instead. Do not commit or push unless instructed. +> +> At handoff, state what changed, the artifacts produced, checks run and results, scientific decisions still needed, before/after counts where relevant, and the next safe step. Use plain language first. Mark the package complete only when its stated completion checks are actually met; otherwise describe the blocker and owner. + +**Optional research or implementation expansion:** requires a separate decision. This brief authorizes neither new collaborators nor unlimited compute, paid services, or a wider project scope. + + + +## 15. Agent task cards and the weekly evidence record + +### Example task card: review the three flagged proposals + +**Package:** A05. **Inputs:** the current entity and proposal tables, `reports/regression-followup/mapping_review.tsv`, relevant source profiles, CL definitions, and verified primary evidence. **Output:** three readable review packets and a proposed decision table in a new reports subfolder. + +**Boundaries:** do not change accepted mapping status, assign a human reviewer, or rewrite the source. Do not run candidate generation on reserved cases. If the evidence is missing, specify the exact question for Dr. Diehl. + +**Completion check:** each packet states the proposal, evidence for and against, relation direction, unknowns, and the decision requested. The student can explain each in two minutes. Human approval is a separate step. + +### Example task card: isolate evaluation datasets + +**Package:** A07. **Inputs:** `evaluation.py`, benchmark schema, reserve manifest, evaluation tests, and the recorded baseline. **Output:** a reviewed change that can evaluate a selected dataset without automatically adding proposal cases, plus tests and usage notes. + +**Boundaries:** preserve existing command behavior unless an explicit new option is selected. Do not populate final-test answers or assume no-match cases have target IDs. Agree on how no-match outcomes are represented before adding them. + +**Completion check:** synthetic tests prove the selected cases are the only cases scored, the reserve is excluded from development, unsupported answers stay visible, and old behavior still passes its tests. Check the code and schema before proposing exact new command-line flags; do not document nonexistent options as working commands. + +### Existing commands the agent should understand + +`uv run pytest` — run the project tests. +`uv run ruff check .` — check code quality. +`uv run mypy src` — check consistency of declared data types. +`uv run soulcap-evaluate --out-dir reports/` — save an evaluation separately. +`uv run soulcap-audit --out-dir reports/` — create a separate audit report. + +These are examples, not an instruction to overwrite established outputs. The agent must check environment setup and mode flags; optional marker-policy mode must be enabled consistently when comparing matching and mapping evidence. + +### Weekly report template + +**Week and package IDs:** … **Completed artifacts:** … **Source/software versions:** … **Tests run:** … **Human reviews completed:** … **Proposals still pending:** … **New evidence or contradictions:** … **Validation reserve untouched:** yes/no, explanation … **Decision needed from Dr. Diehl:** … **Next week's deliverable and owner:** … + +Keep a dated decision log. When a task is blocked, record what is missing and what work can safely continue. Do not present another planned task as completed progress. + + + +## 16. What to say to Dr. Diehl + +### A one-minute explanation + +“The repository is much easier to inspect now. We have stable cell identifiers, one place for the proposed mappings, a dashboard, and repeatable tests. We also added more careful handling of marker aliases and protein information. That work exposed an important issue: we have 80 proposed mappings, but they are not yet a reviewed answer set. + +“My semester plan is to spend October agreeing on the review rules and resolving the most important source and marker questions. In November, I want to review the existing suggestions, investigate the missing coverage, and test improvements against examples that have actually been checked. By December 7, I want to deliver a reproducible package and a clear report separating what is confirmed, what is only proposed, and what remains unresolved. + +“I need help choosing the scientific reviewer, confirming the time commitment, and agreeing on what would count as a successful semester. I am not promising that every SOULCAP cell has an exact CL match.” + +### Decisions to request at the meeting + +1. Is the proposed scope right: trustworthy review and measurable progress before more ambitious ranking features? +2. Can we plan for 10–12 student hours in an active week and a short weekly check-in? +3. Who can provide scientific decisions, and is the target of 30 reviews realistic? +4. Who owns the source sheet and can approve the required clarifications or edits? +5. Who can independently annotate the five reserved cases without seeing rankings? +6. Which cell categories should lead if review capacity is limited? +7. May issue drafts be submitted after approval, and who decides licensing questions? +8. Is December 7 the right main handoff date, with later December work optional? + +### Short email you can adapt + +**Subject: Proposed October–December plan for SOULCAP–CL mapping** + +Dear Dr. Diehl, + +I have prepared a semester plan that summarizes the recent repository improvements and sets out the next steps for October, November, and December. The focus is on turning the existing suggestions into a clearer, evidence-backed review process, improving missing coverage, and testing changes fairly. + +The plan separates software work that an agent can carry out from biological decisions that need a qualified reviewer. It proposes a main handoff by December 7 and includes weekly deliverables, completion checks, and questions about review support and priorities. + +Could we review the scope and agree on the reviewer, time commitment, and first priorities? I have attached the detailed plan for discussion. + +Best, +[Your name] + + + +## 17. Sources, relationship to the older plan, and limits + +### Repository evidence used for this document + +**[R1] `README.md`, `ROADMAP.md`, and `mappings/README.md`.** Project purpose, commands, decision conventions, current local status, and historical milestones. + +**[R2] `mappings/soulcap_entities.tsv`, `mappings/curated_mappings.tsv`, and `mappings/matcher_benchmark.tsv`.** Directly counted on September 21: 127 entities, 80 proposals all needing review, and zero reviewed benchmark rows. + +**[R3] `reports/cl_lexical_cache.json` and `reports/marker_resolution_audit.md`.** Local candidate-cache size and documented marker-resolution behavior. A cached source is not a claim about the latest online ontology release. + +**[R4] `reports/regression-followup/README.md` and its `legacy/` and `corrected/` evaluation JSON files.** September comparison, the three flagged mapping cases, the scoped CD8 correction, and recorded software verification. + +**[R5] `mappings/benchmark_reserve.json` and `mappings/marker_assertion_benchmark.json`.** Five unlabelled reserved entities and five development constraint examples. The current local source-profile hash matches the reserve's recorded source hash. + +**[R6] `reports/regression-triage/README.md` and `reports/resolver-refinement/README.md`.** Earlier comparisons and the diagnostic investigation of lost rankings. + +**[R7] `reports/fall_2026_sprint_backlog.md`.** Existing September 18 backlog. Used as the starting plan, not overwritten. Its issue states and third-party commitments were not reverified in this planning task. + +**[R8] Git history.** `f1e0772` (September 11): registry-backed mapping, dashboard, and evaluation; `4dfc726` (September 18): resolution policies, regression triage, and follow-up; `8a1094e`: semester backlog; `c6343c1`: missing-cache handling in reserve tests; `aa4743b`: refreshed validation report. This summarizes recorded repository work, not exclusive authorship of every change. + +**[U1] University at Buffalo, Office of the Registrar: Current Academic Calendar, Fall Semester 2026, standard session.** Checked September 21, 2026. [Official calendar](https://www.buffalo.edu/registrar/calendars/current-academic-calendar.html). Dates may change; reconfirm before scheduling meetings. + +### How this proposal builds on the older backlog + +Old October O1–O6 map to A01–A06; old November N1–N4 map to A08–A13; old December D1–D4 map to A14–A16. A07 adds explicit separation of evaluation datasets. A09–A10 make coverage and matching experiments more measurable. Routine tests, weekly meetings, and truthful claims continue across all packages. + +This draft deliberately qualifies four older expectations: review can progress locally without pretending sheet intent is known; the five reserved cases must not be consumed by the remaining-47 matching work; five cases cannot establish general accuracy; and human-dependent outcomes cannot be promised as agent-only deliverables. These are proposed refinements for approval, not a claim that the earlier plan has been formally replaced. + +**Document scope:** planning and a record of recent work. No new biological decisions, live issue updates, license decisions, or performance gains are asserted. Only planning documents and PDF-generation artifacts are created for this request; the matching software and source data are unchanged. diff --git a/reports/fall_2026_semester_plan.pdf b/reports/fall_2026_semester_plan.pdf new file mode 100644 index 0000000000000000000000000000000000000000..821c74f169d29359828016039058b77cec54a681 GIT binary patch literal 191569 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

N0-Nei4JtOj$chzYM1y_bO|}($XLT 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 z z-cW!U%nO8U%E#Z7@nSHrcZgv7Ik2SxL&SL#?76S>RGB*rtBuNq?t5F zz7ppc)1=Utpv-Y;BC1}GrG<7V5FVm)PP3J6NPSTAnl@OhTMX7hb9Y*?X$s+c+8W*K zlqcWlYbM_pvAFcAWYWu`0cN)axQ`(M^k7$R^<^~YQ$2_ol5EsF+$;i(y+K%?JjP+S z=%oj~T%-!m*(T8!1`ZC0gmjX-REZlGryBfV9Wz4e?OTjc;Ehe?@aQF}7ED?}33s}Z zyS(BW9OW8x>a7axrjeI@;NF_r(X2!(C9T;$k9odac|f7Jg()kXdQajt5Log&;#oFG z3;Yf?U<9QKQI}*MkyOJgFO5zH9wIQkRW=<+FaZmDl=&9lSW+nj1A&1iJFWijadvz)Wfyt?vudzfeQcJfPGiY za`H>hsNgFyqIRlAyPwFC+Q%WcW?Eg1#rffW&u2{yk6h8r%+xL3Mwm!GzI|kUCJru| zl2-TkGC}-(25BraVRMhh_3c}3cGF+ze5<==0DR=jj-pW`+$#hN^u%qSnj(66eV;Co z)J6Z(3NCg2mYy##SxmX!gIvo`FkDmG-V)DpWE%N=jGd-WuY$y$&_G8SE8<^0@(_3t zeQ2p^rz8z6QhUfp z8ui@WZT3p2)3V;>_W`~qY+7IMWo@KJ@D05x40Lh%^vLA@G8YX9yd6}tjmm+xRYdfc zYnn-^STWAEz00t5a8^NEAkX^IUU8@By%1B;Jc=moRKdpKm+7MIQ|=MhzN$rJz@T4M z!^-5u7>7*dkLg2pC2^v$;2rE;c~Aan)R8cYqw(wLiK+{ycjmVVADu@NwOLjA95^b+ zOlV^H-|#bqCXlq+B#N^QLKIJhhik0tdmSAj`c#e5r0Sy`8f6!8SzoCoU;3an1nIbR z991|?U%ucJMQq97{1zfC1QRo$@Jt-=Y1)_qIBp{#2wwJ8Np&y}lj{@ka$W|JX9@q3 z>nO{ZCk!-UWg3gb)>>_JztO90cN0{SFi~L)us<{snLdKw#r?=K(DcQEMWigTL)Zc7 zLwHb8o^$Y^D(u7)Rmr;lY|eKLgWE;K@v|&T0ngj!jklo`4O_;VZ9m8RzR>$rBCigQ z-Q4-oI0B>G<=dA}-F}CI8vw|CEDaX#Wvd=YxCc>E4jYUw;**KVip1^md)}g*vt7T# zjwCC;O$k|av_5_5p}7@<4t$85HAeXz0F#esiRWn&T0do2 z33qECw>t>@(XCYShA8riAM(T%K_V`7&)gMkDgfwf-dU5Ljdm*D`!HGm>0vL&kIq*& z<}p1c%*UiVf$}Im;TfFdKD6%G^80LG#gU1XZ~Q`S{*AB5yW#ZZ)m9XYX|Nc-ruYE| zg~Wg;E*;U#RT5r1f4iUT7f+Gv;AnqEpZ5lXwU?d1+SsBlms3my`;MoI;poZ)k2!vB zRQPx-!Pi|20;Eeph3ag1w(7PXYPZpwI=Gc4ogwSA$tL)Ww~eS~Ns2e^{o| z(r*xx{?ZgcVHJS-Rpbj;Lh%qHDTYll7>-c$a7~n^XR~1THKVtq|F{lj7=(iB3r^NT zapxm^jZv<^!6W+YI_U4a-f<_ok3O+3Z(b5TFDqU-u1GYxNFOci_U9B3%CH3ga z;)N?~v*vbf{3>EwX2)5R_Hw#TS^bJ^1Ao7r6gQ2MrQ&z3w+1i&onUk#OK%ZB8Q+er z$f4?6!5U<)rzzcP!Ln-@EB~3_bB^mDJroa+=ic(+?|;=*x{MEm#n3j^oBBqmQK}C* z{;ucb4J;}b^DewDJdog$Fo?U7XrlDex~ZntLGNUWDi9Qk7KR0I1(OgDe9vklj)QX- zh0KSO-WaIvb)*`#?Xjx>X18@%%VAc?gg`FJl~JfZ@_i(Hlm8fCmMAByYHiG%8n+LT zIQ9AE@-td?T$@f6Wq~Q?f+d+6j~Ug%pAgnLFuQniO4Bj2BTj;nToQ)W%_@i zeOsHX!}aI*DBEZdx^Y7H&D?#G#?R?`{!MP<=LP}UL6WuQneObz)i|$TOU;F!vuhHe zQJ470;}zyQ5iMD8H`xY)2_MLlbG;Dmspg?Gs1dJ-S(0+61Y-20IKh?CvRHKu?vO_+@i6uDqsAU#qw^u7G9BDQzjA4Idhsc8-B1l}2mf=x#(C zjJ*O0mlmhFnpBsZdf{$Ut+K$9w``hC38Z302%H&22-IPcof77bxAR-%RR$?}knr)z zGo~Ay6iw8PYI{z>r8x(1?WWefj;r%U+;^lTjBXHr^OgeoXp6hLtP8#`uZvOOMTb^I zykeu#{uI?F9Ik0vQruuhl{-5*`dAaR43|uaO^)#E`(WE~7=CR|_TvFIQLdn`%=H1* z+D)+8BIRwA8dnWcxXwBnqCjQ%R9W<|ch$9;~>iqlp$T6(x`daFfvqv|^O zWni6<6ns2NYfth%tA1KW@GcLEqa4fVm1_o`!{%)ckE|&kALa7$z*n$oK_^0H zBPwk~(mI=KsNn>E(^zXRpLT48#b>8#sNAaRIHU&X;B&$OE;ge%@h~OF(wV!CCg`zD z^TP(QeftcmX!7RPRGtfwm^MCh_U> z>VAkh?o1eq7=kY6BZ7G>Bw+^`3TbyBe)mENo+a9a5Z}GQ*fS3{pm64(rAy zWM|O_CiycInekqq;4mi7(ZGHr*Zn~$Uyc$yV;EygyOY`F5>1++p)sQtXTbD_DZ4?Z zmxir?G)sAz@5KUWbdO=ds+`c62zi*AVhLhoIP=#4b zy`9&eG}vm#hc#7}5D+zZx8LRv92%?%EDQFar!%u0prC%M7mX*>!|DxE8|6j_*XAjo z?!$5ZNKVfXZ32tTW9j62dqR(&=1LJBYqFkTC0MkL4!b=^~!N#_g2B2A@{`B4eUUFgY;Pe3YWKh(rahwM$~a zXe6I}XIQ;5CS$HV(qY01BV3)5d|6ek#Y1CD#Vg(+ELwcu@)M4KGD!p1r9;`R0-asG zls7VuYQdaWxQ#Q|-&?@nWoJM>!8Uu@s!T3lsUpqAuz??YBJtTsP@9%9kud-}Uu~QA zP}>o)16q$tpH7dgHvD*&a6+#yXM1fv1oKCy6n~1GuW52#WdT7mAyr8gOMB<1wR0_~x(=?&2K;1V%0f?S5F=Nhya7;MfOl+GQ?SW@h%9`v?fn!&rF>o9y6w5c`;*Yb= zO68=TpNJW-IVA4u=T1zTmg zig{VpZ$^(Vaha}E5kOu)wJk_w_*;J{@Sr6Qb)WfX#AX6Vgt<(ak8X>*J6 z`X;un`*4l(Sm)DCa?JBgvaJm0vzhcQ4TcSvbZPwZHmq!0-^Yj(@h~e<*{u=13TF*l zp-ThopYbk{E=l%@Y?Qx$@lElU`#F5Z_GU=Di~I>Lw5eZtba8hr zNqC8$lD@W7eY?TFjM)%@9(aTAX|2ky7L*4S@JwSCXkfN~rOc#%z>bZs9aFj>1D>xq0z%=7t8GFJ`D| zSKgTjKa1ep73d)(ibomY*mu68iE}XgNHK$<;8Defi%(I{4@XUt0ZM!hp&m##bIftU;kpfk5%n0X}jz0 z*R;=HKY(_(>{mbEnAtAi0hr&Tt6?a|+V5gGDO2GBmgb6E*sTYl9Q{jHvKd7?+>st^_m{WZeO!3=CLx6U9*o*~Wa|0wx!Ze!*LV|ZivwHP-)MHv6OJ?}w2t3Z(i@**$@|2Fu zn*qL`nX#Q9q*3B>FCxF?SqFz&@!%{skNw0+mvBzFILBo5$MHv`I9uE@J;=(E2p35| z2hZhmTIyM+accQ5E90FG^{iefds`V=S*CQ-*3r5W`Zs^har3=+nmPTsw%B>s8TdU2 zd2~ZHmnE;|GxSFCJIYHXr?DRjJw?T-kl50AwOJn+1*%1?O3W{Wp@`IXbVeGRH1Avb=Q ztGfPS^ED^$lHa1l9ZGin8t5(#b=@I<(k1#l)n7jzX&Z$Y%B2W{*jiffW^hD0gD-bu zvBetd%Xos)f}+KxJ{(1OIy(GV)xlXNj!u6bg%x8)+!Ta2Hp|5G!&*e|_3v^>?kaOo zF;#^TJpC+1f7%b9+tfit%dP3<;_WV9b2@b>TI~BvglF7__#4La*EZiys&`CIFU~HW zDDRGgJr1S*1T$xj$k?+X9Q;+=H~YEe!Nw&|utup?NQKN9wx#+bo??$t7Y9=tn}%*; z`kIVf`|tJLjUHPn<|e#;^-6=Bar{0D)m-|qj32M&W7$#}`xK z=dw9V&!;3eY^W=BYo}>f(H*9IIgZ*KqeVW9{@QL8jc^^l5vnGTHM z7GE0&%;vyd5c!dFsA^K}12m$zr0#ou4Sp{|-W2XQG8M2zYgCqhX@9_{Hmt7iM{p~E z`z((~+nH3`=z=1bVoE;d3|#;Wf!z*;o~3fqK-7OLf_5BV>=2tMuVO4Du|$X}=($uV zbO8Xsk?0d5K3CtBAqD0xY5YFEf#8+I6D+#SyP*s8VGF?r%SL8|py&yJjTDeXydJ|) z&*MJYq2$RV^QhzcR1r3!owh=BeY&2T*eb2}^&mRq=~~~$J6<{ao6l$qr6!Xx*HO7m)YcDJ5(me9?{8U0}%vMUk$m# zjklDbq8m|K$56^dWq-ABEH7Q-g}0evA_W=l@#0>&wFMJlwDT%|mADze{1kPaaV`0_ z*Kn-fFStG(@$$M9=O6VCN9PWkYPOYc;S> zYt0iLNW$u8z3LRv8XmtB!wg-cXF#jfZ=@2Kj-swRjh9%mhvBS|iB}|=t08^P;V5Qg zF|M=~JwS_zvn2K2tG7S4j|;ZX4)%9gz?4S_Q$yNU7XXCz2riBz>sh)8uWEx%EtQ-K zJn@2R%jN) z?+6d_h{Xt-Aj^z4`Uq7e!~#Ph41xtkfQe5&8!=E%RPl6HC?5K9ySX}WJVYnt8B!u3 zkfxVNPsJNSbegYT{*{(m7S$UCQUJk)IEWe#_aW@lU9zmJi)pPVth>c9*^JI_+`|=z zIIX!wy#*|nip{IQKrrr2ujNz_p4*~8+yyk(`=W!->^XDa8K;X9Y2YhJ=kxl*CWmRKq6RD>OSC4 zvJ<%cwZ1a|9#$BHWpW)&Ko_MCL%vnA4WacW|&#! z=q)=kW`|qg<>0DK5{s6&dpA$RhCiV<&$xy&pcY$}v6LFNH=rVLmi+B%Zy@qTxL1#} ztM)(-Q@fkrbdQsD^>MIsPF40c9M#XH(z8jQK%< z9|cNy(^E-EXj5ExHxPIc1p3Y?a{w4W@VS9M9wl7Ned3~H;+h|aY1!$dFoB`AZfE6j zfV&sY_a<0L@t?)Vb~CU-hA6%;=89VcH)I$UfTR>1M9ut)pW`aqkRm&_^Uv5S zz6ip=X{PS8;6fWZ>KMlzw1Mz2Qx@_gafJ=n2Y_?;pc28H(@BR6_nPRNQV63KT^{Vj zgb&xRCbzuB-Hi^5yjgC@3jecQB8NeOgRSj2(f2&@$0>t)iIH#BUQ-@61R=-5E(*b` z|APad+P6b3q;4v{g_&VSvG@g3e9KHemAR1ZOa)hAUp~M#rDr2?--Z6m&PD-064XD+ z;5(F}5Vfh7tOTGgop=i>S7RKQ!9+Xb+CRggau8Uf-ChnMs^P`}>DsZ+tr%EA9W_P= zKRi}dUKT}4-BEzkaP`gw7q!1{R>4KRl z@t9@DSz`kRAyhtSf}v}c*yAEGUuvrfLEx3RLFyfNq#z$<)&2#FT>5 ziL_{o5%_;wte+A5$))nYLm&J#(1Y|h3odHU7Av(9ns^~XUph`tOR(@ScqlPLe0iX0 zV7?u66=WUAO%EXKD}In(F>0>HX=j*(a$yoGyV)drv{E~e@T!N=Ks@)Q9#8} z-SEx;fN2~M(LkMPhC(z987M@JQJ0ed053sz1_xrmhJY^sg**t*(@Tsp3#{OS7{x9R zOhwt76H0P`uY017LC^!kU!!a%X+8P*@^BXa&%~5Xkd^3&`2x9#2?dZ&B>#?(^k^Kc zIN~JITSgX`Ks4M^yxoyvSZ31vdfRI67g{Y~+MS?I;tS=5!b&#~2 z#v6uxX?G5bl1Y9k?w?!c`Ox zAxB$Sh}5jmhJq`t;Y|U6WVZrb@{7!!9v$)(iPA2|nvyuCZq5?R4UQlUWGeqIHj;ZFjTtMcYlSVa16gwq39 z$ZzM>*RxaAu+rAGDX*xhY1xrb>mb33k9}5^p9y&2c1^T%OA~l&;TtCPe9<9(HT++s zfI*C3(fgwuy(6VUX+R*&17>u2(C=0(N$jflM zd0d!PD@8VQw5UYQCi&t3T+O_pf(BI~=2wg|ZZSNc1Tir};mn3!M3s?R|O- zQGRGY0J1Mos02h2rb3@S>F9h?vCsiDnYRDp)e!<6=!_%GfP(`8tia^*NmKBQ7^5F} zJTKoI?SRSFawW<;A5$(}=Q5;QGBUQ%t9Uu&*$LhkB?WQ*!K+YEgTrA6zmKzm(yB?x zBjbLpgcN*Lbip<4EjOQ8Utd`G=wz({+r*W(%F#^d+T7~ed><$c3|Z;`pPam%ocy|P zK3>u4b$L*5`*nX}*Ol^LTn?p9yux|^`X_e=L;gdi&LChhWbW_vWkXMhfdiXA-#h9IpuLmL%BhgQV7IT9I(=0zz za_0P4o#Fm(7O9J{rDBwc>DE2gY$E&*U?UA5ue9_TCo+0!%E5r@=+SOpQ2YIl091MW zCPSkt`%@8t$$U@d69Tvs+&o-6yDmMW9+OTpV7$DPpIry|_=3JJZsHOW66SEAn-DV0 z>u75a`O;EZ3i%MECff}=`{WX%>ivhI{R)xo@0XXB*nk1)$d@HXo0zT)J?fJIZa$UG z=e|FBy-(RQK@+_{l?AsymCfnC?`a6F??NC8rc%uAVe-g=y%X>03AMtT*_*n!I-42U{gE7ut>HPC zfy}@^0zW^Ks;8qFkV(S9-c`)Z#l+dl(bd5j{$I!PMs}c@|6(^fVP`8NTRBxwjjfS| z3y>Y2N!Z22%-$8q!_2|R%EiVG()?-QkBXIrg^`DaotYD!NyXL7P94b3!N|?S&CbRR z&m?N(C}n14Vd)CwV&P*2c6N~>Bw~Cvw>%T%JDlPWsj6ZQ>1>unvQ+1G(7Lzk_1TsmRg5X=Z zdj3nT;^_hcFKut`00f0u+04QUGzgwRYGKe2n9;y9DL9*&Ia}FV0IC1S45U1VZ-D3u_a&a+ov#~O>=>fTcI^5hmj4Yg>*A9UYvhXm2Le9m* z1!QAmV`K&ejOB0ApW*(u?cel&>HaP0ftmucasxRyKre^pU}a+mvho1g{$b7z)cLEH z8OX`W$;iXQ3Nrgk;$me5b?r}g{*wNx_!j%frsb$j#2h`6r}*Y5$J?Z?Ycf6d)(h-$KR30`mFy zV>Y19UvU0{@R!8;?@s(%(gSkwfXx0~@o&7KL1zJig7%j+HwRGX-{TFc=K4R~>4D}b zD2M*1LC^@Z{juXD;p>SIk?#v|241m zfUF!K!@t$DbFlw8;eWD74>U=|G(gkrPgegA3$cQt{NF4Dn!K)N&LAGLHF7l*Gc$28 zHG^l8HM6&HwFI(pa(?^>{BH*H$kt1mwhv}T7&`ZiB3Kd?N6SAY4^f>Xby_Bly#=#m zMzBJpmP7V^rs1?JB?3O-{_-(6k<$1+hLj6>WS5=8V;!-@&5?*{3Lq#Vs7Z34XeyT)6C-7p!w=FOJ2WAN$YxbV^ktc5hIr%-gw zX{d3Rb&+Ax*G1X$NjQ%Xv+)Y3V;FxuBG=cEhc5XZ%m#7}bK5O`4rpByZ^H}}kzIbe z@rDW9<-5c0+2e6Jk5&XF!#vX=ilmZ1QHrHxNCqjCs}kol3Ivn_zrYp{qAnDxwrU;l zt9;eUw-as>`Kgk&#+!hFRt~xgTx%!Un8r<{V)wmjlHu41Sw|MVNV|H}Ad>vBRVI0I zR|0gs3`Ijxax6V!o~@jqUAjvxZNJ`MUvOpIQZQ2;LnAdA6%ypdDU{S-*QdP3)vKEg zaqM*M_+)ez9Qy1mzk^ZHcMXF%&{O{ZE*g!91=f8u(pt~fh9<6*s*W#wrP9~Ea5ITHe+!$z2YLq(^+ zV}wG64G~oW(@PwOSo-Bgpj}g?FyD1T_fZrU&|lTm^My1a^ksJO@eN(HV^2 zdHDTn_xtq6$sa0ux2hTf8(v4{74q&7;61_sFdTs{gIRj_dDs9kFm|~rLM=fhTYYdy zUcdo^3RA`^|0_!iaegGACac{rw?y!L*(%^WTteoQL)T_fwbqndfEVW7|W+wcy)YMsrUQT+fI!TZx|Y;o|)Xs^Nu00K4bV&FH+})yE4gp;U0{EEba| z(oWDabwe}&FMwvYxjsqt^g>#Pl1fS3;CJ_8!`HjxPT&G_^!pGX3>}Iqw$v*GV2$XC zq+JC^rzZFv9vPr|@Pb83jl+GYHN@c`3JXMxi|tc{@q4)(7Dvi;&h7!`lCDtgmD)Y+ z^LsC}IwwuIoc+>CvA$3k2m#$+c`20!aixnw-Kk-C!q84gYI@07j{_Wanp*F9{6P`@ zgB0!u(1<3kg-sq^0%;*%_`^EsSyU{=;GE$c7AM9c7>UZNH4uUc5al7QKmg|f+*AgD zarYR8h0!DQXmP{Dwjoq|$X;9e2DRcWZFzc@ZFwep=JMs1o(r6%S16ozl)60ShQDKG z_ zP4jV&%63*5(FlKsk<6e9H)CM4Ow52Zz zAh9`tnHv&mKdiVmId)+yZs?NuS86P&^h^^KLgW_)S z9#?kI3>fnago4L3;b7SAumnb~SPq(X-CuV!>BIk2f`d=*wm2BxJ7;RL9fY&Q`aJ?1 zsAWdSydTc_y#nl2BK-Xf9ITH#H8W&RI(5G8v736vL;UfW4h)R)vhJdcU1IjnUg6KM z?n-?IMwRPs6}~qjC3(TX-!j9_ae3qXyMGut2L7E%9~qn2eL~njD0PWAZUa~0TAlMO zyKg!ws~VisX;T{)b8%q&s0vFEL`-5v#Vmw?C^5-mtA2Z&%s3k=3Xm&I0V*sNhN$nF zYnOY#&;zNOwgvJb21H;be$o%4X*5 zrPYMF>aH#AdGPbyF1zMKl*0Pd>st1v_vyO&qOS}CIDpTj{{B(7fzZ>8k?u>2B_(f)^HK2IFs z>Pd>gpntDrRZ)})m|JSqk76-zjXYZf9|dQ?WU^3Kviio?Fk(!AgTu3tl^Z5!J~lnA z2=FH$`B1#2*d>(p41NiNUlt=?ySWV&2g_eIN+?pSo(Y5=!{YGLHXUDnF=`&^H5B#N z4~EOe$v_ddlmg|9i8Cc@pfbb9NOj@ZmE^;#+hpGGsOw?68Oo^CxM^Fi?n~bzbF}xC z^{3-rhgp+;h`*u)2uw^xwS_J+3UY9!SL38|sj$jxRBP9W^9(K$X5zB-g@%IOy572= zC$Kh~tUby2o;#4Az1;SizeIIZSg;Ip7JH3~Lg<@07VOk@TvyrixEQH8? zY0*#(e2)RP1p;h`-kTDvzex@CM6_4R&AH6T*>02qQ9Y)!il4fQ96vWHw{>JE`bQ^q z?cas?rC3%~FD%C}RpdM%QF-CgHYJ{4p|B z86}IWBWPI=tlpS7_@W_h;c zOU%R_8DW+c!@*(3#)12HSp4h-ThK%|e>PpvWDCUT1-?M1uQTNt82jrpS-M`GSYoN% z+y*8To1E?);*^lJ60bA15{qO;XT=tBZ?eW@6-&B!M{$M(K6@!#K}2zqSUh|*^7>vF zu|kT4UkaKk#2qfhATGr4ck1J|RFp%lb-)Z|58Tpv-+CJ(KTdn6%K8|yrC)#Hm>(7C z8|@Ws;vln-h=fMq-Zw$x>JTartzLx}T8Z)5GC>7>w#cd`#!;g!AmS8ry|!yA(31Xe zjuRyGTz__|ZmcnOLnRTRsLphJs8IX2cM}>G%2}<=&Q}C)u+U`ftZKkRUc@a@*)kn= zBwCpf#*TkJUG~S#&Dr$H4IWu?4vvLL&;fNIUXHlI_^gCUi}~a1g&sjjhdKXG3<^(^ zl~jL;YlE@vI|e-Tt*UhqPQ+k@c~)NRd`zW7AxoOVCJJQgjqY#CtJ`uVupA0PIZ_}_ z@im)dSAnd)5*C_Dp$H$Pud4Rn`7%5O9h|hui-c5W_7f)OmOzwW7K0;>IHHvEgf zzyqD5`_j2k=dKYSm~rkpiA=cZu)>`{VI!VUmw(#`-C6B>2}jUh9(@^o*!{z3=JO;1 z)CB|abSbNlJ!lnnDQrn8{3--ct&W1!*fatpw}NEZw*C2Jz!L#H!N}0NBy|1wWD(uL zQI50(LeZL5q_{K!Kek0c+IX?z}O2NJtWd4r5qu_BF*6yMlmzs%Dff=HlK%#X(X^n63AgYz`+;earK?& zn)y23)EP2e#Gb@Jg*IElqi(B_a#;rqncz1fu_+PM?G+Kn-jpXkZ@3hjveaNa?1-&1 z@AHr2BIFl{clr2`t)GH0ddB8etPe>7GM^X`(A%7v!Q^c)kA?UO+l-#L279=86bQ<~ z=J7t#!LEsnWg@TBGfnB65`;x@^-5}6!kAGYl4~}nuBW;-VPAPZ%L*2`F90-wl$z9TVKJUyYgaTM(LLMzuDeLr@!wz)=@J1nBaX_F5{Zq&WGvaba;ZsM3B1FX zBYyi%HwF1WQY;BG05(USJn8bKOVbB;-Y?*Of%e6<(;i3m-oO0E-snKiS^@4nyqVek z=JnjR1Uln2Mx6DT%ib+P=fgOzcQNa-%2Eh0NaxGwlyZR(R<8W_(179Z z-^#^);d2tFRT1q)MEM3;W00~+1tv_HGc(GetV>9%Xoi1tC0Genz9C5kQnA{fcof9E zrMUl`niKZSWJ@61A?5)1ra;yU4})+zvh7JlufVGdP>(m@_Dyb>1O~<1&|2f8q+mJX ze|$xoPE1ZB_l$a3_H>4?xO*)VLUZQf4%ZrwstmT`dK9cJk|zI%3;$k^;(zu8=f z^qP`rH#)PiII^NR&R5+2WH3d6lcEHDZ8)t)tUOm1Z|J$(M6R1Pd@S+vi4mqWfBLn6 z5_m;$Cc_j$ThTJnBJ{7U0unqCu@=;-=#EaX~6!!-tj?rByd@`Q$NWWJD zf0@FOxG4VM9dw%Y7mo9~B0K!3E!4#z(lm^O{~W;bOmd z97V~#^X?M?1fz9LPq#?o!k&j`dc?mw-#g48dcCw#iT(MYf4QxLe!ml?lF0XmCO@hr z6rp}O-O7Xe>WouK)_=g$C>8_+$t0g_8Ge(wuVqF$cv&hF3He}$%vb)z2~sNmL|wqj z`$RQTJ^mDfhdhR21`oOq!W!+@Ry~DchBJC63N4fn44?Dl0u#Njb>y+WXLN!LJvJyn z=)Y&Y#wCaaS-qrTh0NVEGUHer85qNz+%Ym^xV>Ovg>4-{F%gj7{{a3{dikC;(jS3U zNcdL^tCCQNfAH8K@B7|8qaz36R4@2DtZbjyy9?Vc-MdTHSpThJZ9psq+fl9&%jBY9 zKU!8{KxjE%R;a`~tL#wwiv<_q;qm8R2)?Y}6z?i~lWiZ=3?S8a72RN~m(oFgm#*g|K6X5KZGt!DqC^wZHk}Z^leg~;J1$TA29!J9ltZo2=os{Vk+wl9=%-F`9~!oQwcl$!(QLk$SlVBN>taFhuf%$7z%OWm zX~Dk~1T8zl?|w}t*&hNqe??z>JQKq*ufsnGa{9dA`Nism0}yqt%038Mc9r}%TXvYg z$exoQXO4te0A|4c4(oDJPZUDa@#U^o)9K|dH(!2F)ZumT2ZH`z^LPBN@X|YvE0ls4 zUeENffIf_OyRN|Mmo-oHwY%19oSen2zFe;-o{zGgke+SqcltA-un!FPU9ETeuHT1u zdY-6Lr=4}Mj7JW;^j&2=5v^WN2>P>IpiWP%0MyRw$PbFm{>qn3Pr}+0hwUF-B|X1; zcBfu&pO9)#d9OJME_xCCD0%8twj$!LLjRx!3}wC`oE_{4oXvV{n{*Xl{-yMk-1_~_ z_l9SSlOFxrd?*g22Kc)pv;? z$Ny(#SC=)!jR{I6L8tM_;t!=MJF9nBspx1L93&W!cqqFTqW3}5eymO5{~5~U)1=pc z9#VKVSAp=@m$(2d2(iyEdHI z2B@`tW1pBXe&|3ZA0*!8py`z$!|COq6$E zJ6j75VCCfEUu(kx(Hq~my36yzxqYtF^H$4BcGvoWT?qNLR3~Y@rEE-?-p{_0MlEPz zv#1riB4IO?6}rs@m1VYNPu~7>cgdMq9H>f2qlNLPKZ;uLxB1XCm1f_`TedT=2#gVO9 zv^aihaZs_ffQQ(^aK5NfnN~7|R`=Pq`~)o1RGC#8f-TFSHKgPn4PoS`(}QqYkZe{+ z?A13pI)g|L>;O{?t9^-@#ySZn%Y$G<-cYbjv@jB5C~La*45`cZa#R)m8O?@lHs8g8 z6E=^O7!#X=&TTYa=Mf_kzyEOzXy37Y;pa+R8VVEwa?GjeVtyoz&aQS@7fF~|t;ee& zz0hn}{Sxz-X^pwy__*nRw&8!fC-_L?TH-yLe9Fsn!0BqF2=Rvtygdrj1PDSFuN~b| z1Rnc-+|Z!!K{v!V(H4e-?oUF(6PTx2PBkIz?cn z-ym-d9<@|qW}@tu%-R}CG=WPNj8j=ok__Z+2*v<%e~$zaB=mronzaPpWVTr_+pdY(mcH@ydJ7N9im0>ZU3pJ zk%W=|4o``h<+FBsi+rWiG%k@by&k-X#@qr`n1n__e2o~e=Bu^bAV(E9?>ghfbXTA$ zbC{nplyStzc8hhy$K~yUc%#X#7dqpr)tX(CA5|a9(2LW7W^<&5R2Rz7hvUt?I89p@ zs{b{9zz9A&j@^|QE92OhZI0Zs1TZrWV4D-SEJ-U&*Z*y4$(E%>! zN}b^uLD2y%cjwGDLpu!uV4d3)+|Gai(fLu#U%6m)pqY3^FuNiTPLDB%>i=f$0%7qW znjHB??~wPoGWWT{^tn>^b%_BPM1cCSOx<8c`XuWyD!@reU>a3Xl#*0hUOa<1F{6?c zW`4YWtcW+nPp=3O9>fq=fuCM5F$|#+X+nj7{A&~(J@6QPgc$wrF=^8sK0<}JU%Xg* zSNx45o{kx}tN%|LVN>vSXPca-v;O34u%Z#SQeMB{i%!~C{m0t>f4@j#SO>W;b}hp% zPTJSGy9YHVVXmzFUk)D11mc2(XJ+7aBsp#IH|pH38vdiM{fl2LD8{wk2^#?(&lM?7 z+XVY%l8riX&xrp^x=YN4)3$n}uGzhRaTL(>MOWc<{$q8C(Q>XoTON?hZ&E3AeAQWz zK8513@@(2I`BUKS!1Ba%$};E~U32L9pe^H8oa)e*n1wqRG3M4w(QLLPbC!pW@YhPlt z(t{QZ{~4;WR{WZR`g@SvuTvINWfL$1IZ#GPs}qxGXQvfnoh-K2AW^AwqpGur)+|As znP65GIh-_o1X*TklG&jUlQ^_{HpAhTi9?RqT25}A%+_LtUZ&(Mud{e+9TSrUqs9~| zf3&lg@0>l4i%KPikc@=N9=(fcgO8st@e=P8%Z;g*L(?zcKG zBdRTtI&%#Q_TA(|ra7$A+bHpG4w;7~vsFSY(-8%g*R&LP^DKrJh)WRnP;6JIpJz%CY9lADo>g}mtdU{IynxVH~~hdoE%#xn>Lk~ znu&R#hE=AO8?ghb=UZ@}3P}7nZr;uz!Kfmaa!OOnxUrS`2dC)bP%OA4d8n!rCKE!X zeiX;gOUfiElgFJU;yVZ0rc5-@Wts|?u$U^SUcw#XTn>22zTI;r83u#J@s=UaK1I1E z52INS?V7ta*}owvV;%z|JE*nyubvc>fkQd?$fBZBAhoa#7*P`Rb~hzyLQLwZ>L@9b z$?`3+VR-n2$aQEvWOAS)A$dna6WxlZsw--5!)a3MulORfB~CV?nbtg>`c?L2E$*%d zjlhx|rbi1IK8_5W_G)`yKT|(z(W2q-qjGq+gvw|r=~hMFX86ht5mdNE#h$NM*~1rr zwQGKROMX5>LtK<_;a9-xR-!RO_uIYX)pZDbmK+ z*4na!;M(Onn~jHXEvhm(qzjJ*@>6&($~g<9RJ(KgL)B@MTU zTGJ)0l?4es_W!L5JJ$M3b?KoSaphZNCQ|*=(oUQ5^yW*`FD3hi{YbfmUUf#(I*^d4 zn3N9aLIk1Yt;ELg@Da-*qMqvha{e(1GSb=e9Rc%`uw~ef9_IzBe`ze+_uQz+-ghyZSf{tD)uXw9;5v++hh{> z7g(O=?QANYDodedOd-tz7)&RVZdmb@9Ac6OetE255E^_(_!?-lNU~f5JstjTrQA~Cy%0g zFCC4eybdNOUz4`>IvIxS+?b6bv7S~9g8i!{I2b&0!5)D|okCAhIbhEnk$&@))qr23b`Fno|Eb&E!&ksIvUJ%+{gatd`_?s7 z+gR`!>sD@5JeWb7To?{UjWwkD)hdok)5eGbHCNo}(ZTc$Z<(t`Zw2Ks6-j+EiVp9! zNh7vJ_ZIz=5htE(`LK=iWLx>prDJC-#z`K0|Bub;>rf6(=@t7lvdn$m zzMSn|s^`RGw!#1fS4ZzYVD-4FU|hoIq+z8X@Spm~N!b^cq6j%T_EM7y)4Z>5y*C(o zG~7M)r1f*x4&6Gt>_rh-;gG||cASBF3|j8P-_ynp8o0(8O1GR)Sc{*7$??l6iS7bI zmGiA4y8Wh%ROupjPl^eu-voNLPNi=~y!ZubM?IKA<6PSH?9&F$IWqPB zp|!4^x3tsQTO^*6nUA7+q%fR=2Y*b(hZ-^+3+^lxrflUNJ$ixp52PGP-&1-eq4??d zTw=ZPF~p7SUQsM|$aQI9J_iSA%Txq{=s@5KYGM#r- zVmSByGo9q$S$Ng0m)y~d;FSwo0RF9HX*mD@00TZ(_0c3mMGr)g1xU*SM!@3#3i9qD zKK=Lz7W!*_ufq!VTj=kO0`yam|L1=eTZ$7f`QO7r1qA_-zxn4dXh9Pf%DdbGOfjf8 zFC(!=>ql=g9KD_#VnumI#@GS}8e$Q+GT1{hS|z>VguJx0v=jM?N}|Z`B2^Ge?%BUzljA~CGPp=QCrPeh;3Vn+vj5@1Q5wJI~BPAD2P2KJNARg)#{* zDxAHh8r@J%)iCU(wqGIbnE zfrX-!?4s1t*ij}!A^pqc9rGhcUc4`Hvfun%oShp)p1Bd|Ddz<#1!)B-X_J%GCckcY zNkm)9B}@b%>>m|OhzN1dKZNpU?bZLIJG;OC>CW<7C<6V-xer3&+M&C}o$?fTyn&`B zaI3XwI$LSEwV{rzr-(_glc@*t7vdn{4eN{f-Ne=X`Kh~ETjk5c`5I^Z&S|Dn#?1ez zV7bBR|8zK`IKQCwjUU(fBCtzZ-$9=7-j*FOHaZ&l6EfM$W%Oso7$h1z6)g=FEsH*r zLLjr`KHAqphK}ah&Aplb-=OqzZfOX=N@tc&m4hLb?O<}3lmDsG4NK79(P8VBcwgcA z71o=YJV!-KO-)T-SLJ}Qj7FfkqNJ;&qN}LFw`pfQW~wSLuPv{QsJLzUlJP26Nmp05 z3cU#J5mz}r;0vqCNkfb2<3Dp`BS@lvKRx#`AtT9y1RLls8g!`$gTrPiGX}*AUB^cz zh)TfWFq)DF0m7t|Jdn2z9h zSOX`Ce*YrHIpspZxJG5m@AqW0L|GHFM`{%TZP#6DU-KqpfNlpMNP>o;kr9>Zs1o`y z_SSfleNAz=*_b`PqQveEGpNS#DN1M6jE;VUm|oy<(!zVM$Q2ir{jwvOyzGhdGt&+5 zw}thJ$1*T4_g7A!r)WeYx7snC+bHTY=9nT+SMI>4VM7xUO1uw*;7{9Ha{F7ht%&KQ z-e)zxgW%0ik(8{au1?SqOLj0W*!eb&>JDA`VLR7}SMd#tPPY`8xZ&MRg|wy*{41jU%NvTcu3bLRIO zDrqoL?_~h3VM+Q>llqYzJycnL9`4k5cK zQ__@`kZCTdbX$7s-t_Q~LcB0Z0wFgww*}{VqDPq_*mqcRWm&9tOO3Mrg) zSL91eGefES?GUMJXEbCPsTh|x3kiXn%9{<`_z~J9a%==$!;a4~C`%(83!78&=SFF@ zpg#!4Cl@nd$Y6eao%GVZdQs#E1L9@}X7ZBe6!hM&v$#uizOUKKaW)u#^!NtTv{^d1CPA^hIpNuuHmkn4+}Ty6 zkG6l#3E5E@A_k1>E&9I_6v@*THbRbse^~|)sDN1N3B;ab(!Qn*E(*LUWiDx4{AJt;mBoLrJ6!(6AS&}6jWHv>46J2)~ z&}{Hw>wb_<1ojaopS}O?PNRmMt`G~U${0#n+U==}5|tCGg{+6BE31vw$zpc$7ayCK z<>>T$gme$4y__y%6(B+GJN!z?&0lCE%iZas{O{cS%>2~+e|^*Y#J(o#Zj5-8u4i`$ znE6$liByoP0nT$fi0(7y*~>4BM$097p7=HsRZr?xRp5V=ghGUN!jE~H4<678CvUFF zM=aR$ePAh9zgNv$-(|aH>!`ZF`kJyqgH`yonh?v$@UH$2^F&lvi*dyha?`lT@>@{T zYmafM$f}XqrJJ;4BPbEB*qr%S#kM+aen^+KU4~{VSxm)C3$dbw9gtdVlr-`bt+QM} zMoB(r%E|nvYTs3jM=vD?KGbYJraAy;#G6w2PQK_Q8yy`T-c;VigwzRgO!wfcB8$n> z^93lV3+cMsh7a$*8n%Xs;HL?6lBbvfS7`Tn7JuWS*+jNOm#R-{oTVG6g%%nx() zV$X&u_gWS?yzhNuDgu7@jYFj^3gz5v6mv(#2`~P{T4zEAU6>5o7k&c(Mg^^Gk)?V` zP#9n4in>$d;X4R1$uu`i_p)7&VQ zlc++k{S7UUKeTf~)|hHg_8=oBON z6|x!Idg(fCyA~=hK0L#~Fy`M%m4+r9G(h4IJN%Yx4)ZmMhL}&~K)!nHz;Bi4O3I(X zo`qinFk>CLi<)OyQIfzOtUH30Gm`64-a@0d3%$4ShIR%M!f>Ad*0|$UoLE<}5V@*3 z!|A1jMxocZb{V#=#bwz4af^2=x_3JbQ%80xv=cM2pT?#mADA?D7?#coX1MSM>R%81 zo2U<}k0Co{>iisT-x}B~wAx<-LVzD0y@n_|;VVawu4~9oR~^(C)yySbG;Jg~cAmb2 z4;;9522RG?qyvJ5Y|Sed{yFm$HnE=p>by`;Y#ADdfHwWXF~l~|{F_}lyNfBdjS|Nz zMw!+Z7A5BWNE4@gq1Re`e^4e=j$nL%lrkK_{PLwIM~8Xucnh&J2>+PG@Fn!@JNbp{ zczKF9c;Cs+C_jE>Ad&ahjkUzvZo!}oYTL3=j5O)#3|sNr&oWK=eZ7>uK#pk$7xZ{x zxGp|+%}%kb2zGrbv6xb|-Of7vlZuV&!WN1&vNSh>jmnE_08z*b*Emr`;Obt=LTbQEq>&+_bhe_fD#Ho?VR%j%p{d@!? zq?A_C~c$u6*2Z{P?T2#uoS*L?nJ39B&KCE zc5b0>r3636Lgd)s(V=oLvcNSV3^`Oa2AAJJOk!__XpJ@6w{9dn{W?zoNrIiu5{zo6 zJxcAQ{#CL12)VG?Sn^J_fN9l|A|(?!l47TsuzQn&W**jP<(|BW)Y5Ld;3x5z?-xDm7oGe|TGfLV*2N>P z1=S~y%8FA5SihDw|C!eK-9VpR-Gluf&l6v~Pabnxzxi9+`Q11;a1NLWU||ISM!icE z`Y&Pg1+*j*U$Ib)hd?9YfD-?%)0lTm4ti~rQ}0KGv5z{#F|WcQwroyoTNOj2el3?n zc3r0IXV?on@9k_40!GYn_wrvdJ zq>1_d{?k(v`31o_NsW+%Z{lgG&jLO&m7VSh-uu|VeYL$QE_LgEMjyH#$#SvpVI#AT)*l~%uqD9^1KW8 z40c;O?jIVVs6{+pg%uZ!QXqWuEm0a7T#n64Y=$he|Mz^axquvmGGH7#nK{X@s}N0| zNm>;R9Bk#}5elg|sUIWdYO0%oJX*}kTT=;Lxr|P&tRbaDG%u+?k^+T!#Q9>rP^Ye_ zKgI=teNy@ihuzluoU*K@!dX>KBZhC=RqdhjWOU*nv*JMGPhA($jA3G7h4nKmBk1sh zG8tt+Jy6$Vwl+%h%Y!)kp9c{_Hm-Rj(5sRlsEBaI6y=E@&SV3};2tuFZa9$a$XwQ! z;$f&*FOxB%vws2BWjHz*;39yG z02_#MM^kdvWf(eD>@DeImGAN8Na@Z|%!NzSS>(e8XXCD1X_^<4b6e5Etp-`sy`uvn z*kx*Appb7>;u!@J}wk?!R#pKmCP@wG#-)7^{pvcINQmRnc3zME(yFv%qG0x@ zqlzJL6QoEoMF|3F>8k3RduCOQBe_8O$g_yH&ae_})xDjq9O`wJTyH{HfCOS!q#j)2 z4&MG%b+F!SYAWbfw~G#jG5V;jXYd?P-ZFTyaoW5lS}9D`kEnW5KLE?J+_cZrBbS@W z-OG*b@Yqe2W9$FrR$XFFp?eVj^5`q9QB(I;e_7l`m>V0_IinwIl^s!Rs9tILlk?}# z^RDlKwo>YP;@0KE>+2UL2C>Y_Zuai^DD9bel%|{ns>~p_5RVg5@?}d_1bJ4b9eH?S zWB&)pS6CjJvP}l%WU>*pKR>KHg8YGM1mV%?AT#~FGC1Pt=bQ5HKD5N$3G0+_J>_DN z2x%p6J)fK1>u%aArP#s#82+db(XW>6!vW5EI2+EZvau~tED32AZV7e%O(4K`X4@5O zQnHNVB!2nS0Q7;QBaD%NV(jCot#lUjHwgA3;9Q{^c5!as1>qxTU22k|ak$!MDh4js zXTqYM&?MK-DRT$c{yS)7SDh=*Sh|f%XPhJVUoL}eYb5uF%qO%#kVB|K)m<7nqrxAR zt_hL~`F^^M8n{kT`O#HN*$<~owx*w*X^;^Zba1nIbH&0gXgp>8bt2~))pbkY@brgB z{n2j%xnr7mIFeNMVnO9boLcGmI+iCYavI{9H)B(T&ui3(uID5xg!)PXyImC(Ul?ru z%Ig`4&$_ms203qbr}G_nYMvKTR)IFVQKw4|0$VAD%fr>b92M7p!Y&3wjT8`#U{j>g zB#Jl{N{K5Oi9nLiSD9)O0ZMozB!Nc6slUu=n?mfyDX4ImTei_cB^FKCckwmZZxk2u zD-5vJ3pQs`wW%fUi|xKo`V*+jx~i&O`$%mXPFkuQ*~XT6b?$urQIkb4GSpK~meF!!2szGHhGm6N`qOP~4BSW6n- zCC>vdie{uVtAvgwylTbZ&uElgzz8QbgUR3a6N%1bRNL6*b)L zYU?}K-=$=Nt^ua42cR~$OXZiKXY9xAg1S0@wO^Q2tRqTp)%!3$?Z658Rw zrUoaS-^HFnE2llKOj6HjWKQ>umUC}S+(^@{{O8lcO;j!4o7-9GvO;N^EyRwCI6~{x zYd>}*Q3kf!ICh{7DQR>sS!A-JbSizkxEAaA_SnV3j)2h`mQGR(`&#O1nNdY`3qq!0 zVXCKv2i9X$Tl=J-|F=p0^<|eSphCJD!sg++K6a}HMlK}W1LK4DJehagniNMh`AYqU z-r7L5-qdskVc1+{M>PMC+cz(f^`D_DzIaWTDaqlX{m^EP1T_y&0HV+V=3V7_6*RSa zX@vTDbhCS1o|8Jw$JrT!tOR-Qd48h7!Z&O)>2 zxv~35<%fCF8I+qF%R77A3vu22l^V+84vSk{akDg7my()3PLM58%pI?S%gwEAJ?2R) zKKSq(^T|ct#cb}QRvC)WiDR?NX}Ejb@~xp~z~(Q72loKmy_J|s%Iy2TBBsmGsAZZA zLy=SjL|>t!X)sPL+%I>mF};yWjKBuaHA;T{pAo{Gluj+%0+dapf=*V{q-!99RpP0Z z!y}eFZmI+9+DAXE4k%G_+*?#iu|SF$`{JCiN0Mon3GTW+)9&2h`n-wxe+EmMl9KRN z>|+9v)dw`x6lgLA)cXovD(#%rVVq+Q&_fr)l33)lMsao!R4S2>dBBfx=KA|e`;3$n z3%o6Sp4(6cn8NOEoXD|Dg#US+X}eQ)s3Uw$Z=x~4z)fX;o}r-O(e1fUgY(S60S6xN zEf{KGh}c+>i%EjTR?`rh#8engDj7ejyZkfN1mAJIt~f!DpJH4x?GceI(>*fo)Ahw8 zG_4zki9ABbs5rtXD#UCw9fN}DOB1toi7a`bDtIi-zL~R~9Vq3WGUM7Z!V%I56Fw=7 z(VV>F=A3fKc#+l!Gkn4-FX@bVtii{lA^$?|ly|Q#7N0iQjkjBaj*=q}SUOC1N)ibuOrd4h-@(B;4_Cd!GJE zh{s!i3cXF&ngQ2Rirj4_Dj%?AFrM$nY95Z(g7}Ix*;pXekRgOp09v$vD^=C8g77dn zWEJEAS|zIo>w!b(&S?f-J;9JuDaV-c);F)gA)axu z9SYgk6rKPi)rdxB*h_8X)re+hQZiqQ3rFi6Vx0nF;<}y;dCd=J8v#ynwOe3Xm+Pi8 z(e%=!loyxI3A{s0xFUg0QEr=JEy%11!w<{9m&5A2>wCVQDY6EI06YfW_c`M|s6gIt z%%)W|!v=jYKUqhl#~EQ6(i`mm8b#Cgf8tu>@@295i@?w(n#Pfh$d;%YM+%jbjL0&v zVZgFlrPut0YvD{Snb)$Ja(gog{Jf{O+s^9j4NL;mU@4ycl$a%{DCrn zQ%B~YI90i3IZsG9f=@tEk%Wbi*4T&w&SGqz-MMm|;?kr9a~a{;FWsstSGNyxwD4f7 zzS)^}jY@KvwSoLk2m=Fs{*LjVkPEoA7xWax31~8fa9n4+p&>J7$sA$lz~9UjpR zRc&H^8M#4S&c{Q{{NCDL^#!y7t5V`nV@RPo0S^Eu*P#q>zL+%pg#ud zj2D6UBW;Yn|IT;MZ}1m+QNYusU>fvf#$~!xwT==oco^^XX{(Yov}@%w|7jmfL%Zq#%MmKzBx=94lTrQy^3}qf05=cQimL7C(>Ai^YNl@HcC)g!sgMTn z17%e3wW^5*x71+0at)Sp8lIjvi?O$e*#Ofai#DVt5TY@N=Ims6LGXFrqVG9Ub(=2f!qswa6f)|{b0<^vaz@5CIL>r&=# zNONxQ!;ga4Tv)t8mjl&!VIezkNo@m-ur2IbI0f28lDV`s!YY^<8YbjkEi4%Y)+V6!xRr!DN7{` zh?^mud>*eC519;Zy2l1(dNzMJj6zI8EX*2gWz<-}MsidYn5g$iK1qgeg>Z_nXNzae zevi#E%&AM$X4C#yvi6Yi(6V;6j|C&MQCeTD={(ufY71`XamY$&-4!K59Mht@@;M2%@BUZsmh zSKhq4fdwuyFHz7mJ4|j@EGaxwMHY^m@l97_Zd`**C8Ls4+m@%85AUC15fd@eo;yIc`a;+p*;!fAiqkv|(K; zKh?q}ueL2iU`gA$Dx)RCj6IuOk6pIupC^0;wSt@UG-(RJ4MjYX(5JG;f&L3-LK3Pw zT|1tiIbI#={P)?f%+@wzi0OnW-f@%SlEx8LmI1hYE1|@e(HU{xpD0orKv{O{yWvyb z+FV0ws0+VE|G_^$-22Mwus1gq%^uBIBp=RS@8(LY#slBZUSG_kpG=5)H#0&W|JrP$ zw5?p!5kB2_b84dc`&IhAjOXc5fe#H35Q@{q>_0Ki`Vm1JZzsE146-h`Q2SJSR*M1O zYC!%6KlBZ`B&NCLu&UW;CkRqiyc~pJJi$&Z&6+G4EJB>12a&ohwgh}LI^1I}aU@c+7WbP0Q zx0bVH4)BGlTC;lbo!J^(hOBGTolqLWcSi?MI|P6kL#l7AD@^ zL+VAXw;h)GyRG8mX|JL;a(CGYg?Wmv%0k%eD-1Q|xZ1x#mk67pfj{K+4;AG7>Zvuf z8yHExFo}SaluXkm3~VD8bzk*e&g(5QN69WyC&{;1Q0cV-s;qWd0_`q(M6@l1b})vQ zv9HLkwwKbb`E%-%#Ph{dVIRSBeOoT3XLS{p28OV069!qbatMixo5j{5e9t zBB3@oNr-4F+GMh%p{eIDFcl&gER}wxB&6W#I`~c4PD4&UaPB9A<)0R+aMxEj0(WM@ zVI2oca@`?v`j4uU?siZ(#0HhJop7ze8z5`Se)n6 zkh2&Oz0QHfQrO%y7Qsl*Hx_?f2!`V0iMZ6UXgNW+DD-`*ULsxG*JW3px{jV&twOG; zax zFJmpg|BK8;`#bi4`S5z>IFbs_ImJ>c;Y&I=(fOQi)}!~faCs10iL;B{*x-JB&uG{2 zzIRGQ_P`GJ&3C%Igs~N+*%!a2Q0Ljqmok8HiX~nm1t>zd?Wu>j$4-VC*iZl4sIU$p zzMpPn9zb1fiG3pWND>Wae^tJ#m(KplZ5lJe-j4SW;X79(jv9wiD4z5K4w_l+gy{;^ zhv%c5|3{DW$-I?w^1rE{@2(IVP;ic|?4bvmIcon8b9WgO>9Q>d8+UhicZbFu3U_VX z-QC?9x5nM2fyUik8*AL%X%#}qJkwC>8@8hPhN9~gA z^`PRP+b+Lxxq-S~aiNTC835-$oNX$uokSvRTauSPSpG%@@W=@kE#~}%RgfmZOHPAV z5#uU>B;g2ANE38FbIJ(=B||5!H=E0z z(iAbDb&+ID4l+4I78IT)v=9Y?1cIsB{X2Xmww_fK!Zu8yB+8uMF`RQL4XYjM0B0+D zKybX_H=hDaSetT%Q}k1qFaTTIOgbv9^t}iwNx$}j2n^x_|Maf7V2)7YOqm$C#h>?} zEA!VQ=M^y@b?%srk%>bBxZuv@e%=CvVk5kL6DD4X-ECM;(oR&SAQR}%h)ceAUEjWz zsX={hkl*qU-2K4^vZ_{8bW1TfEJ}_2Ci0~%vu)h`OQ2d}Ch>EvIc*)U<_pM&hD;4mrLS%JKiGtUw>h5 zv*!k&eJ1&7@bc(+7t`?$hz?3uOMxok=(p@V@iZGO_ zV>M78=YS+s`NFHz#p*g|$!b=DgL^qM%G1pqA{=Hd^!X+ae1$^aeA)K9uKMtQrF-}_ zu%++zUCZuQH(XfuW47g@=}E@4?vl}jmlUy*cDTp^MzMl0-W5ciFwEMM!N)NJC+~OW z?s;K-N;<{kSk46>bVM3c`uBI&t%?!k`HoKnlMI-WYF zGGhzlLRER5&vTMLovfVe>nYlpyz*{-UKj0zBrXp)h*N|ohTxf4(w6dmXV)lnJ61L) z{)0!}W$RyF_$ykOylY?|j$WX@x^7q9Jj^U5QOEkD{^N>#JWa}r*Lbne3~-Cs3Y zRyLx~+mMzhd7BL4aJU-Hfy-QC!FCcZY)Xr{-HO>KJLp_q{iFgn%% zX1p>=p*f{F*5+*05;{()m5^^rn@JmHkvVG%j*7J3C?mWC5Y2^~YV z;J_z&>}QT9A~|Md>a0dct5}Sb@g7CZNBar|bL5a>zHxtPnJLKf`)(Q6T1pv-UwF4X zMAy*2-&gkQBm)+fO^nzDrK=$Ht%6^cW%yTCQMzN~<0A~BvjQiJ8Tw`c&+CRGhP*HL zhi`f|=?pqjkBCG)TbC_8_3>-OdTDE6*8ZF>E0@%dpSz?DdxuzYI}Aj~2-g*yHr>=m z6IRQft9}=&r?XST?u~lh@_vkW)c5bRN0UeEM;|jGWjLQWpWnARwm53Oq$ICWx>x^D zwn0#)KS|BKzvG>e++*D$y2y9v8K#d5law2RO#oG`NFSq@%%H_~Dp-eRMVXaPo1q7z z$6yUQfd8KVp$}t3912pDRb4(UdQ0~$NGF3o(S#kdJe1s)!7%j5z*E5|HBT@>kTroS zMd8D8^*}Ygbl#q5g|)cdc@aOBV<3A`Zzu6#E2YZ3`G>xX-q|h*Lb2l8>(RqjKG*fQ z#qm{<`OM1gplk<|uFmV3rXiZ~X#cnX#PSp^!GI>l#i71UEAz;HX!cA~8sRzk8*Q$E z#*%jUuu3ThmnGhOdDO4QZSg(OTx6a@GPJ6Cj6`*Q5HOJ+8v7I!X}dRp*XG82tkX0( zTdogqu%E&V!%?pGse>Y#=!d$_eDh3=uU~D9Zrik~3p|6mUzFRqp=P)-eZ%}-`j4;( z>J-<0+^xgLiWpoB>el|Qb01qg^UzBRp&b>0#Cs&apKPFJ>fX_eCwLmNm%4F5D7*GV z0inE3hYr%=G2@KMfPR8Lusb!mBie!dfNbNQbOPmplsC@|%P@-{d(C*?Sq|eaehfn{ zRy|*C__|9AtCOh0Zb_>@kM8^B$vgp$cS$MDO;Tb8%4bfIajfV`CzT75mXugT>@_wL z_RJ57(g4q`;@Pu_uQZ~=qn-VKPZdj%|{TPtZf{!AGz6ntp4$+59_ChK2wEi4=_ ze=II~-dhQwHgN+5&1VZQJ9i5qX{{GKi8(k$JOLLWJ-=HHSoRH9{Wtur?n`N}BU-96 zSau|LxkW+pdwyMkAl~T|Nt$Sd6j?814djq!4lqY3Dg7x7RQyBdkF10#^reKW*M$g` z2?L%CZ7dcA=lI^TE?*>8ZerA^d1P#*`6IA**`h7uE4`GHx^<050k)S9X|w52o_J7L zzARrcY3y$Z=8VjOAH0#PdMDQHMOM5gVPBFRcoVtff|Z(SWo6Kx<4VsByUE$3vk_Fk ziG6rO1LA&ZkI+LzU2-4Fhq{{)Y1N+&?}y%Cb9BBpZ}h-Z>n_*i=-pIiW-K~CO@dli z{(QX9Zk-wbk(W!z`{3ZHt}X0P%zqG=SpDXlVUAWk-<-7y}5QaNb|51>GsNkqUT+a4~4X$pPr z;vQ&n9KFn%)K$12r_Ol^C9T%JCq2IbT*PID_Np(OR9aZ` zl2lAv&kNmCS0bq4d7Iwmw=sUpT!fucA|3)Cv&{Ym^UU&bm+Q>pUQlbERE(OR^1Xa)sG|wKZO((48eT*fSI` zHh}ZB+@&J5Cb_#RX{$oZ-Pn1)w=7J(-BwwQ(z_v z!BEQI%UgQ=iCuF&@=?q-?~4E;wPFB-(vFc2mhZxIs7M`9+pY(2RmPh?y114h(aMDw z3TsfNetuB*iHdcn@4PHx-?^F(Tt7^$%YoP2h^gS^slzQXXh52xEzU;H^ z$T|Lqr<8t*uOa~DM>{G==d5zb8*&9W!6v;AA=9*u9RjzuOv#&Ew811leJ4X_->1lv zG>W;Z9R|=?-)2P`VGAk{i=}Il*p8LKh*i$O|g3iY2G5vM+|z7}7ewp7Ne(dV}}w>Nov z+)pg#sj)9=v<^;cv}kzn1^|AtPKL_@c+OFOe@Dk;t@7@wkOlzQD201H7m8V}#sMI;j8_#yT0+&WLKLp-Tji%M9$3Use+@o(rotiL zFZmF8YQEc(QWvH%TH{v!$pm*-ugp;0?++uv5RWHFFY}xu5+&2^&N8?xU9rfUE`Kj``-?m=tbgndGJMKxx)vG$^V!pV904|=V(5B<$@I!4?M^o=J8IJj*~ zDM85l`trw*kS90SZ<2x`T%IYaN6$xAZL{u;AuD}$>E6$evw0`+&yU6a?Rj6Qs(f07 z@;?XO(tP9#H68IYng|Zus+AVT&>&gxN9%T)M;l97JJ+pl zieRB2B|LmDov{NYd$$@J|Fio@>4ALt;$XSj^ZM%duCGkyZt^Kzq#N^k;J9t z{U!a=?$h0Fr#?^UL2J2ogou2(W9)-;Gj0SNGbIqZ2G!(E^=;Hb1^3GyH#vGm#jV=s z;3zk0uHhpozkAXCp~zVLTF=EVDaOF$@Hs$6^+V>gQw=G-<;OL3WQ<=>~F>50-(~QF~RIZSR;~ zjpo{?5%Mba1#;FAlD`7s`s==!&m+Ga%Wty>x9K)8_`l*s7#sCf~ecU z-bOTg?Jo=m!R;AEF8w99`~eCxVMnQgbo@Hb(L%HVgbAI(Q3(>g#!9JsO4*`5jR*c5IL$!wFl za<=$I#7<|M__9dMh(B)@W4LR(cB5a~u(QAG_yU>&m{h{ittZfwjZq8i}eujE) zwQ$|6U!ttA%Es6Qrs`vMZ9Ba68Lt^->D0rt%-h|5Dg!*PDNA7P0`VEPjEg(K{a_ZE$Oti zp{eT>sQhH(pG;Kn3bQ?9(c(r}LJAoeH+G{_J2OJSFiEaz!EUfOrK%((@2X5^c+PO; zy;z`#5nMPiAxX3Z!8jR!f)a(YX2B&Uw27Mv`tol5yEZQrYylN%WVd{rS+<<66Gd$O zD`j)IQR~W#IW(XO6O>BK;5iP4lfq{Q6eBZ}wKLgAlW3o=*7Zp(CV_ z`KQ-izn|0nr$W0>bml?B;cuM2jZ#{sp|Uo4Z~Tg|aErknKGP5@sz}cKX|Jx4#XCmF z@7<=lIrOq#hxvm=!00y~Q>gOIF5&p{v&0M1EnzXZQ5&BdcG2h@7JeZwFYj%wLTlkQ zUktXNwqok>#IQGfz!tMbabOCmq7Oy?i~mjbcTkBhW|y|im?tj^l&Y8&##^f%$GX3| z?~)F`ixebl@itgL@&^6%d0#J$Y2|!WFWRs`(7l z&8K8Xa0ZizTZ!bqzJZp%DuIO4kil?oC-!XORmaX0~y(cJ~bfG*#kiz2mh$Ljs zIVG1!lNr!2fGNRa^GixjJ7~1h2`|pRf=gLu16}pH&zB0WkEsl943~A3JK(qmTSw!>r}hzU@tbj^kJA3PXMf zw~>b~l^igcf@U?PN!)_~AoP>mDjNwh4E8zRxG95mh3%zj;Bi6<$AB6}rshj>^l3Q> zY{xK^f|!jx_lWCrvqJEj27)w*7i7{lB&8`rfMG%AO2M#^p*$f}MCleJ(W$0P_fR zuXoBP^;C&K%n=m8V2PR~!BF7>MZjeLpyn5_otF&Q1~Q{}ChaH8z_N;&eWzW(Fo$jm zaqe1rh&dH5mhzMn>|DleZUNR4EB9AFk|p$2T=0NitZ{n|}*|s%Y#E!=0`N zt-7E7ME#AyGpZrAMk~B!H%q+7Gn5SL&qb4ZC0Y1pgXQ5RhlA zc)JBdU9z)fk@-wEPp}U=FJ~^6%{GwS;Z9WcrYGvd~hV&n_umD>-6hkH3E7 zKEk{%&muYc%3#I2vt%R1?f4B*RHrCZxTTjk8z0+#dkn9ql;!qgvJi`;GK+q)<1n!_x^`dov)@$FC? zu59+-bakVw91x!)o|^I-LsI^Lt?xBDax@zjTKWp3||s5k=Li|=DirFcw8naY%oPL%6Y zFu%riP=xtR&KA17whUN}v6SZ7O_vL-Ws8WDpTvIF6d7i}l=(Bo2YMtBs(0A0YjMg_94uia2LfviN4T1+NWL1IBu#T+WCluk^Wbl~eA4V?;Bd^T=y zI-r&xLqcU427bJtk>nK0o~z9ZcUVnNv!lGM*7F&TqmR zhDy;q(Cgt+Bg<5fKr4D1{ott1W6|lTzqXgUEg|d`hSM{1J31?g803gR|IyS(dGu%4 z`c7UIfa(ipSD*lnn$iv9=_&9WCE&OqIGj-1RU0`d!iXvl9j)g5PJ?LY^^&HW=l`;# zn=5&>`EtkJvVMD~3W7D=OMR{4ik~lRo9APz!K`C<0}^Is$V070sQw9OU4{+{`Q-$D z4}S;Up+_D8Q?L*8h;L%r?+7%|ay#4h0OLJ-zNr(jo&-92ixd4V`=Zny1Qn&ZI6?6y zfsH{5o}gUdtIP*YxxHb^j8)*_`gFy{}f)>xk%W* z{KMGc050{nnez{4=l^K@{3XQvqtf4V|FUoXk^Ohp&)>1Xn45q2J%88xciF$pAE4*M zM#9DM5ATNSpM(v`-(~)O(*G{@_qP6>{k!$o2LEHz|E~9U_AlM(f3ZJ*m-r9%=P&%} z@5%pe;lHzg@6q3}zgoao`@f+;|CE6Kr{D8059l9&&%cA8)zb{k;SOR z<|0gX&!g~igV6FEbrwtLExQ4FGXfqvQrs@@J+QCcG=2rUjL8;@6$+?41UCwh9q=oM z-8C{>k+!A4N69f#-DDDmgVcOlU^O9Yw4tceG-%qbLdk3=}Ok4gpNA%zO{?8NZue0aBAw2)~ zsQQ1Ec>Z-h{%;b`zh3x%9--WSKcW96@vs3;;{S`p!^+0Z!ud~$=OP>4S5;#3@zaH= z&0wuj9)BEw_Y2HQdTln%QP#TzrNC}gG#Jw73!?;BO-f9pv~rb}S}%MwwxOO`SHBf1 z;-)t061@J>T6;%zL-pAu987Hk9ETsfg)?3GD}UaRU!LEi*H%3B#q-B>cE;G`o5csa z#V;rnkmG!4OUuey7i_sJq%Oq3OQ^uorJ*Uk#SR54&{=K}$9%UTwzC`AO)W&>PpH5e z+bf;AR`0JD%OEH6AglH8nH?P@=;t7g1Rx0TWL2x!{!gPOAl+XWQi1oD#|=%?`hHxMZh*9BfvWYyxi)is+8v#MgUHZ>;A^k@nxz*o z?dgE`7i%!uI>ERq7O3KjoaHvh%%cG zhDj0PYYB4~sCp@pY=~72@7abJhv1NkuVkUw8k3?VNKm2|N&*KpBdX z4EIJ@Ev350IwFuk)L&P^e2{RIC26#@(FL@n(8bP4CgwSdaQ<~Vh{d+IlF`;+jqiKN zpvQaFkS*W7gY}@70;=h$z`;OFLojg?f-r9l`8|!;E%dVP$*ahFFkpNr=t+MJ>ZhW??sGVK3?ssDd%a2eo)8z@}yqMJz)g>%MmCyo7Yb z2V%mJAj9ROR0}1Mk2%n~Mje@JrO^!W)QQ51lYnVx!ND7Wy7saiWBpjo*JZeYvjis^ z-qA>sI^NaVd(32lxtK-ttAlj!f0Yj6x1@3vV?Gbmt0UGAQI!s7o1^?}L;Uy?(j<)5 zJ3ID!wZKKp<6P|oV|pQG60V@^ zuO$72rHa(ba&ng2mTzrBaI#wrdt^A0bN!)5nc)}TT0S9DgnOhg_E)4>7UV;4=7$UV zeEhUNI4wxcK5H#-SwqU|aGPzNRwVnt`$9@hs>|9iH%G#C816o(R$TiaT_f`95Ss#Q z`_TJ3QdDR3buj#)R-SnMRuQ>550T6%M?Tx24kP+?@W+0t-v}*z7mm>Du)5o|JJ+w< z{;Y>XJCE-XH!Xeczd?mUptnVS!y*q9)zPCq=#83O^PGqK|As=2B<v9HBUpwA1uf7G<1b61$am3hy5!A$I`vbIuL&x( zA!q1}b^5j;S328V^=}>nT=idD1~ls5iqD0x2c+NqwfKA=3wB=IsRU3HKN}i{FlSM4Rp( zxyJPcmD;B9g$oGp={<5JQ0T{Ygi{#6t-o(RwgGzwTm^62;bEmq&P8(XsHYJy@Zb*Z z#cp_jzkht?XTu4b2-WEH_{apLmmI1}XSJucmC|O>n+m6dTdYng@P3nTcQ4#Mxk^F> z{(pMzUQWxFKW&)hZv%Fk^nCqlYnDE=xq*+zhRbgsRs+SKs6Vg<XUS6laK#-ePv~Bu77y*mU-a#~=?rlU z?Y>4M!4F*B2My1E@R)P(kvJEYA#H3bEiN*=0EWYNl~zFV2zV0?|E&euWNP_41sWzg z*LatMxM}xq4Hi!3$#eP3mFhBKUx(Q^!bn>B^;b+W8?qp%*7Vg6`j;Qfs}eSRMTCnT4{E!8Yt;qyabfNcdd8bAJXYD#P=nsdX^VSS@QEqt{mbt1V(KcibA7i9Mbx1in4$<~K z-Hnuq-L~%GsC&V~WdVdyUIEeJC<|W<4E}dlH^EC}~4NsE(#98x*DF_raSOu}pMQwul{@UNlXo)(nUR1}l_(vtWef z8S??N6_k6i82V+ZyM^%4CQKa$@NEyi0kFl;t4@jyfK{)DcQN0s?08l6W zht*lZYXrYvLYvkrdqFoS!v`oT6QW=_dUM#jYml{L{qRer?lz;w=x;`#oDmlV%`DAH z8zkSJ2aN}$coL(X)O?wnF>sf^UMgvcrGz1w*uZ`p(4l2P@;NaTxnzN1bB@9a(;uBXrLG$)}mh>XQtVf$Y_WHqjG+|aaL(%L~~%MLxSY8NOg^I*Mb}_K%tS+PQ?kWv22D@ zGC^EfJ2&!)P`_Rdb=+{&jd?&^SOITx5i4v$?<)Q%q<0PgYeVbBDktvFA3qfnEtx0F zQ18s8(nmJX@Vk0&J>k-V?p5T2(0;f(L_|*-?r^?nE%x*C6`Dm_Z)1Fy#;{!puT#1} zSPR1{+X$Dv9KX;E9M;%UI~ih#&K_;5%A@8u|3ZL5?%;pMRnoJjy!1=s-! z4K!MUA014JpS4h-DV~U#13l)#g9^drz>Xjq)4-0iPeq_gBK>mohND4p*H9|`C?RPb z3EPWhb_pjhhZ=DMVRJUj8bn5sa>AFxaEKCiTi`8@5rUlL272U!Ct2l>t?Y&m0>e=h z=sn~d5aFYD5Fj&5+VfpG;Ks#~g4dO4OZ&)C@I-5{bX!-LWD3d_jnTdPMSn+aaWt|p z#2JQws6RvnGi2?LneTBsN4zGTLl*KSeSt{blSC*n2?uc_MKeZCY2`8cCG8yB%d2w{ zJUO>&O6gb3WGX91Oa~8ZRfPyE=brUc)j(knR*Q9^WTPJJoJ}&~Wn4oP(S>rB5HV1E zy}KA21rz+s2xS3DB*RZcl?n|8E+XGuZo~}LG!7p!6~|3zx|9n}Faz*J5U zyu{k2eQZT~vKTyWlt)6TVc1fxuT1{Q&G$D z#%$!;jPk<{4QGU>p%Uf0?YWH@*N$@x3M^klkztJ1Yc2z52tBgpG|$;R@On1%s1*O34OY{!4;( zfU`X|wkRX;v~EG4Jd(II85^IU>V`jWvP1gJ;q?@JT=4bPTJ|{Ivc5O}T9wj)J~FSU zTkD^)1OBA0C5<&p(pvVFEeUp-<}L4IXhqaBSInGVzzcx?K>(3+KRc%a9sm{;RhFmb zF&p9dM!el{ip~c~kuuP6(%~RXQ^ppb{B3(3C^u#E05bZ)uQgy0VxqAa5(J7`Uw1Id z8)3m9oDP&7?WJ#3Il2Y9#^|0xNV6czn&H&^XpD$h-(9m8$Z)?=6#b%#bdfgpz2}>K z$%H>Dl_V8F>0BVouY=DYlzB(^x`1Q}LVOQG;tAk)=-FPExB!8$_bt5y$97}pPE1?090E9*JNdbcttTa(BNj&sX4wN^s6d$Bf>`6~LXa<1YtE49t zv@%L388idw-C_y_>D^We!Sul`iW^P9n*>@OV0R|zNewL^X^<80ri>;E5Opu7pE&`%$< zN%B-j>q#0U1rVeR(kJndM5R;S$O6vO2W68ymC=}`cfA1o)KM0cH{U280AzGgWt2B5 z6b~}H0Kj?TU?9Z{C8@M=3q@|i;9ioa99q20E-HYZA<977xQv1*X)q+oQy5Jsc@PO; zn?CrS)T)T~D6>lhuuUD@NNSZu)1`1Kqqs~Myhv)5N6VtD2cY3oI#p5FCyM7$*e4Bo z1J-Gx@G0i#qs}OuawwJn#x)eRiGz56uZ&TPNm`Uq^py1~X!I2Ia%dY#T69qg0EWat zV}LkCy);_7tZ@MaFGamD+C`FOG6Zv!2B1;8P#aA?sZ|c`4<)N2T5M9Q8k!Lxl!8?X z?I-0NNt8DLcqt-%6dpiL);NvAT*f$@qExm}1+65BCNb0iO%NcLI7k8Tq+}IA8%m-{ z5-*?_mhC5x0t4*Jk}0Cu1HP?=NB~&fz^~PqIY5-U0?W?=%W5N_JhR&Mvv+DE6i&T= z%j?B|N~X7S2|nha&Dfvn00ZzC=cP+g?7O_eYRK0MtDdKL){J*bHaA;rsy2O!HDOHF zjI#@wpxwo!GJ5PvY=aj?8mgMe*V)|^>Fs#F3yZS=Jw%T4(%SI&imIVTP4M7}@~Ul< zQ@Z?ZHfu~@xf(FI?)+K^h^#@EGEc5;_9ie-Yf6s5ARSl@>ym&kO&F<;Ij*oRp>#V~ z?Ywwct*iK}Uwy@@s!9sl@+J ztrP2n)H|E_!*9faCEP9uT*ZF08|Ln080 zP0B?XPCTD97^jb<&nwskoILw0Mh@ju+BSZ007^FLQ|5LRXiQd2VGp`5z%g?hqYoQ` z8dd>?fchzW+W{hg@(I4r0wRFwDP>y`Vg%-cCxJC6rmzSi55-sR8akL9qKEp4u+ITj zkn9PuF9L!XrBm^msILS3B)OI5g|m+j!U4Tg;+m?@D3}{YpV~8aTRqqSm4J*#`Wmhe zG&mjBA5fRKO&N?0t54#YyZt5D0ydZQw-gE?OS+@-9Y>!kgb!>k#cwed;aNozlyj=z z64wxYdl2!c{4&=teFG3ZB);`fH#J?8Y@FA3+7@jdkrCQwOr zibV1WVhQrwBsda=)T3l|s9Mn9!ftLxP`^=(60oF~^=I1t!X1vbNg%?0RIbl{+` z#M^?v={>+o2KS(s%)o4hVDGy&Fbpgu1PrtK1-=#u_7VcSiojAPz-|bzI|tpmbq2nE z1q`(SCnW+W0T&bmmPH1J{PYrh6tVX=7a`jW&VtwZ+DRUpnMS)x;GG>#gV&9KSuyN= z{bk6uWml0)b-jewRHjkFUyyAfz=6@g<}74ex|_&ldOJyr0rvizM^7=lGc#}|JTTwM zG%8RA?>qzSvIFzLWeS1OMqm_J-Um1fpqH>#1n&&qPO|*NZU@2+zD0Mf|KeA(qoSp5 z>qryhy2&curLrCTV`OufkJeiMyC^Wd(Cmn8rP~S(OwRy6z*n&@EmpDYBbvk3YVCHK zfvHzu*bf-iw}ZznS$bV-;<_Y~r*2W7AKR!o*}wed>a5F=v!0WwaET;O?a@)1+#x?d zX1C<(oCOR^0z*~p@f{KyBOBG1dkDDY^hMMmr!rT7vUT&kwpBS7t4j_8yej7Wx$ayaao*L2~5nKyT>i@L6fNv@iP!{BkgDHhpO}(2~9J zRO`twpgA!pOVG9k5cH?REwtRGh4X|1RRq1Zgz>}xCqe{^p9YPe28-{8B=Q62e}TR} zMz}t<*`CwvE$RV}?}i}Cfg;KQBk}{~=Y{3x1%5{2eVoF?#`e4euEy6})Dk4+02;puoDN0Q1&TG5o~YKMsE>ypj13~JP|mN035$Jgy$X0^)YsDQBH3Wa1ms%cp?y@cLdKyaL-0U zPgkMqW5MmYuHGV_Kq=iIDG%`YOE4lkP@)Z3{&sLrSHA0GuI)MV?K!ILImzw0n%*Ma zKq3W*2_tWn#>0!0ld#tz1?rB_n({%%^SH|pV#17W9)7URg>}lxXv{*~6SHkaV*v0EM zG1{vO+Al7(s_O##ak@>kz%jcTIm9ieovrHldm3FF_H&Nwg$1n=M}v&KeD-tUtrBN@ zO9;a?+W0Nz^6Qz4PBzogx-RDH(ZIXNWfQgNo2?s{IK`w6G9Je3PGYw#rL>k%4b|+& z>RO4e%M3ZuV-D4*;k5jEYE9(_b_Q!wh+9l}twsgdv4R*!qd9$oFsXab$d2 z`dE1VY{Ji(+Ql7W3n!_i*mad~pP)Wjo=P3Ak*Sk9FVRQ+_K%^Z5X+G9x-N@;bb4?I z&Fm_&T3*HBAQZ9xYLR5KT+u^q7Z<{_*w&Pkd`10989d&5?qc3~;yZujJD;)d#`ouT zVAPU5x`&F;EPc&|A2MujMA_Y^pv;gW3{FMW(Q}EX((z3#dM+nVBmxT8I=igPLew(O8ovMnDQ@HaCKuaM}cp;V<^hwBSjK@i&$cWdEkg36{_+=jJ2v(@B z*h=ck?51Nu%~#Ao8I-m56{(Thtf1*OQgUIUd=L|qD!n<3M@aZsSaZUK>69q4{o)|O zty-qe(i&#qR`oA2ASQf?71H}rypK?mU}MVWmZV%ot6Z@F6NI-WU_=#fSS{aq}G+!_x_y1s@GelRV`8=s6=Gp&;USPTIUXZ$#zE>XJ8c%yxYP`XB zYLqxd$Gy1-m}M9>1H_A1pY9b!WeTas-@&!2gkw*VWSJce$%R(-7<&TjpYf7Dza9!GX#%VuW;Ap3ZLI z`D!fPU7eZ4cpkZE>V4)Y?-QZ$>-7Xjs}FH`FH^(CQTUhux>0a3ACc?Jpb`DU7(vE2o(8h`GDqKL0a+^MY#9^obmQU+ZC<(|j-*=* z49s~Xs;AM;6-{-%xQ~yEk_mhwxE1T8W{j`iy1H|h<((FigR1*3r>nQ<_F7xn?eA|SzG!K4(1UM0f{P%QXcf)zm++cpl3M<-`mBFtS zg-t}vTb^TMzh}SU=bmIX`CE_0s+-Xt#a;CT=v=8uN%9tUYd=qP3tPWTGfdAfa3584 zY0y7Rw0bmj8G_++L}SgBJ1whesT5kqZ^3B8G1>^)z*O3(yR9$VB3{OsUIPS_T|B=9B3yf~=be4=j98)~fjQ6^KwE4pR>M&0*@OGxl*>i8BG>!e(#rDG z7@^jJinmYA&jFV+ch|-S7>RiSd4(n{ zXv4i|UtkES5EMr5p#~!Z<|Ze zU+MU)oXFeKGH5@IGSs$+rEe*%`sNFb_>i4NiYwWfs)KJ2Z|_~a-N3(#*_b}0nGMZy#GWFI>d6gIDKG#xKjt+ODr?ouvL3QFWf zM^(-66SM%$xXgi+Wb16W(59vJ6#R*A7uGBqQbU5snwF&_BsHg{9&qlZ7EW~BdbnOT zSwG3%f7oYyx;Vu*XYNvsA7C)~rbTW7+)-GjAgU*r^p7vI1%f!>?8=|>&-v3Of2ik_ z7p|74aZ`mX$JeyeRuKqkmq=^_ib_-~(SxF$Ms;)%nuEkN$kfo2#M^mSx!<>>x z-ptb4c=A?`y~;uTIRv{FQFZRtab$$k6^<^6tPi&1@54bmb>`j?>q#f{J>`&-fHN{C zmNk5QU#qxM1=UwTw1L`7G5b#6)YwgV?<}z}6SdoejNBZ3EGc8LqUx-a`QGs1}?FL7sQwdFWt%#k@w zU#2QW&jwFBZ<>ZO&`zEoyd-`uae6b9qC$Rk2Q4XVc>7b9rsrj)tT1G@c_Pc7sXX1; zm?W*QQ){8Z6<49M?!C!VV`|zx!(~QRB}aJX`s=Iy6vY21?k%I@=(es=+%-4^m*CLQ z4KxgDk)RSA6Pk0*Y5HJVZd z;bhhPq~*#Y>!vpr*JKKs3=i2gNL$gb`IH|%vbz)OZ#bt4x-ycqUn@u$+0ii3FsvyL zF5`CS`A>0neYs6?G-1JCejDDh|It<4mFQUERQwj#HUF7B8$jRKmz2EAII587_}Tqe z;be}k%-GcQOVz}@V z?#OV8wY1ck!IO0!3PlGgb6q_Wm& z;^PXrke(;*@_VtnDaJ=EXxKiZ%e|+u7+|wgX!;;$uj^esL0ggRYYy${aS1} ziQ3a;+;By0A}j6)m;+_R^&7xQiI4OlvV0WIuo*63wY0{K7%z-3+V};m_RQ7yw6s^e z&iat8ARST4U#!LQt)H$ogAZfhqu{Q`YvGb2Yjtk;)0D*Uk~w`rv_bADYbnh%EzjO1 z*I;1bZAp?aWLk=rJn3XUw(P^pR*y~tCmse}w`+R=UjmZvd#~aut9cVxZW99XeMf{= zYq*KR<&m`2Iq);AP89Zzw6JQ*5_*rT$CNv}@DjFGl0+kcOUJ||^uwfSkP$u7_g6ae zC0R@|RhrABQ)71TNd3Lf(}zhb^5Z2E$)+SfGOir#@p%uYLmaz|XU^KR^T|G79d338 zXj{j7$bFgUGQ7P)9@dTp36qm|z13^oMdLcYl(BosKlc8Zm`)t)VN3?T30Z;j#o1Mr zM)7>_;_^zbN$8f)WzvyQz>ikk08G1Qh5;lF|IK3dYy&)p++^pp*vi|lAuKcr)wi-Q ziQUF_8+7yL?akPuQ_YH2t}}QiSUc}ZLF4yMnYu0Kr6)%YnMe6^fqSt&yfGhH7IXvx z(&Ix=Uz$st%~pOu`y8#YN>vl3hQDU7IQ*_qO1;{?u2&v%L934GN;#xVD{DHR?JOZa zY#b(Gadsj1?J7xkZ(x!6obh#w0b9{DQcaMn$)?5k&T~y<3Wsj*_H3{Aqjd7r-H11a zZz|_LlCF|b7+r=AeT~_d%}|X>r>b&f{-V2pJ@!uIDKM04Rf2>7O{Qis*R0g>Z3Y^V z2YvtzRu!1YB+?H;9Cu4#@I#}$TjncMt)tbTa@hILEQNO`wx{!O-+bT#{I`nAmaz3vbux2l#ZuPUbIbF%iP4@%d*$giFAamF1!8cCk2jNPd&<#OXDtFSEx;3dU) zGG6W?Ou^MQ|sK-&geeu$@Dht%Zh-%LZ8nb(eG3 z=Rdk~zYEmlHrZ%h-W4S~*Mo=FDKOr6L}StuEM>%!RmgLl$xJie>*j*Z*cg-#{GW9K zTeR)kmQ(E;I@!`c1I#8!Hb3Dw;%&`j+*W;n>K4d0rHjUNYgfv#YnOZ>ux#I4|J*cv01X-@bI25H(yor&ZqHE<@_@a*LY4qGEBUpJ`17sw^q>ZSzF6q93!`dIP2$Q$S6mRd@mJDuCzIZwH_hD!YfyON?+q|7(^cYxHHwRa()IfrBg*( zm~+KRv1wN<*p|K(l`0OgWR$DrB~BJ8x5zY4iLb9TBL0C8D_#&Bc#JoL5wNSQP6qTX zh9ucFyOtK|G1Qi-I3(*>79jURf2E_}`^@#O9|3%0Wp`_$nzqd7ICcvsI)c(0v&?fx zNiQC#y4FKm{bfq8qM5qSHYT%LFe7lN&GIZQsWKe7IJ@WJz~6MA7+n1DUi(@E6* zlI5g3d@YWRi)o2Y?<2;^(A`XS@}#k%TG7J7ZEWiC%qu^2bp_exPmD!RzG?sQ6 zYfSye9`Xh9V3ms**{|e4)MV<62~SqZPzsoXyQ)jp5DBk^1R?!%5efQuNrQ-sYD6Zh zC46nE2s^p-0IoxGAd}f=d_ThW(FSFb4A|gAxNgbm@{TJncSt8Tu;`u|@mJ^w^tK0a zFK$t>%q*p-F@thtix`Eth=Mwz7Sa9pq1^eK*eOYL}e{M9N?ib{N@%f;>ro%_m2#;!4s!GT}1S zZ~AZ*IazQkORezOET`{pKVA_?dt#Bw?gj30mX;N|>>802=lCyfRuKvZYJN%8RIVPt z*YUj+e`-ta7`UF&HAAM91cIbqPf^}(%YRL0dp>rm3FK_C8|QtRT*MyApI~krUK@_| zzninWciJwqEUM1`!K7Qde1?p`3pZ2Hz@w5xUM9p9=68=C*qmFoNV zNUIoYz1(P=&1y@G4Y%-2MEUvHrprOz-i}M83TwU6G8%Od%eNBIA4BBi!pi3MRdpDq zsjKK*YPB4TmGhp#XiFXnKnwiIe1q1_b)Z?$bZ#8^=4^A-iLy%7g*d36MPEF>3tYO& z&EPSe{krF1$@!ht*^jkpXCaE0{IWr#9q&-iX}%FhJKorBAljU(+BkZxG3ueJHmw%e zXb=)*Vw1#pl@~TO)eptb7u%N)w=nmp*(&YyL>j7@1|d4l?yjDN77y=WBGnhQyanDA zM%5FSQy%b_K`s%hw@Xj|iaYhdW>rnoebm9ZkwVraB5>8Dq9Gt1U^ z(NQE(+NNAxpD|USp`mWRI;v>TsJD`ut{k>cr<2Ov<#L2%_FG zo!=d4mI0gDq8u~C@msmI4XI9+R@Gy&DhrHtdr|md|EmCV_oBXI(R27VZ9+N*n$KLa zT-AiBZ=~22%qW!hSveuX(w|E>Bq)lJsmW5Fullx;K6%{j=~zv~U{ULznwhW5@fK_; zoss1t;eVjuAKP|%-y~|X8_h{e^h_JZ%p^;{2BeqQO!cFoJu_uVOl7K#X{-<1DU7NcPBHyD_=lMT% zXK3!fb8u^AQYO)*GmB=sf`epp-F7SG} ze~YrHD^&f9#YCkWFIN>spOHWPX1Il65jIEYlR4JQIG(q#4Kvk&nh`wQgNY`iD*cVe zKBJ-0$KYN?&HM_F03)5ufetAv!b6)IhWIJDtoMrz@zd&h0bA{N?yVXAeJT3^L&qQn zpUHE)Xd&x{g^~Ez_0dP83xplQ36C;mO!3pSOw}JQ#4?^~!2%rKe6#|dtE+RsL}HuW zW4rd-LQyD+i?o3sV*8S>-5qc?Wawz!rn}bD9S%GQ}|scLXcJ zWdY5}=Xl1B$%0(|%>V=5yLZFZsk+#@dI#keUAL=c8SdYUF9>A(wh8lodP`W{l8sQr zZsQZ46h@V5GQ1{Fx*DW(^X)ykNR5@{E8pFXX&snFRQ@^yy}5n+hO8hqZ?)NbvEyhd zm6>=eRIyrL4_!|Cd_RY>qd`y$xYGcc%~H>nBVP=0mG@kP`#MNu_UgyU1;tj255@T* zIoS!vMoZV{-YaG6R5Ly4)zq>ERetXC8+13=ens)}V>Shxm5*yE#5|Cm74ca{lpgre zfZM2tEZ!dAPps`DDzKPM)MkTsUG!SL_vPMq`SbFT3uItFG{OuX0 zFtc>6@Y2q;WFk$e`mO*m@NphWvsoRJ*y^!aUZ@jhPcy<9a_}?aD8}V~BckyAoA~i> zCdz;33X1=eD=6;d=;mZ^;s&J=+M8IpQ3267MBU6R9NnqF05Fuv2jJsF&|8G1&AU78~fQt_d zfbs-6x!9rf6izS|50sns&rbkO0Dzr~n-j?USF+%5X3KvvUBLe>;D1sg{~b0J=yzWJ zLKgg6^#3C3{C`gr5O1@K29JH7#gmGHr0Qyx_CJM9io(ty}N}g)$gftw~(+f zb27I;qqGmh>jJ8Hn`sM^?5)uu&f^P0cj!nT=k* zH_4}KRToR9-ibE~C`_&;I83)m{-PQ$$dlqIy-x(fjj*9Ub5(lftL9dQ<9o&0~wq2HIp~Ve%q_;aetA_f|=%mfB6J-C1dmM#84S_Wn%=Lo$${)c6GSX;ddfK)c$l zzZ1Zqw9bDq@BY2+po_%A)ZNF~f{Np}5z4+2GjX%{&10qF_*?z`-?G1c7yMt@U;ikO z|5y_|fPW9>U+gbV9$qf!viM)>=l6>H3or0D`wLHV?XtkllHuMwxk+)Z>`XysUTrS1 zr7*+Uro2^!ot~|9WeJUmjX)<+EQayzwy7j8$A=6}cLKxZ^%{Q6Q6yD~q4BC+i|*b| zBOMRz1>Ye_yKZc}uK2rvvQFc=a8lfQPq zc(ty>%y_`ye9>E4wPU2b2f*;d!SH(KZEzq}#eIj#E{ADTQNG9;|G4gY51Tmwqj!^) z7tp;8!wch&0dvTmk-zTt{Zqm@BI6nsRa6Y2r{|ta0UQhjM&wJ8B)UMeZY(*BB2sX! z#QZZ3Y`^-=DI>GOx_>uLUQlWR2CxYP-|O$-xd<-x9>X@vWL z1M>zm*z%tJ;zT(%bOc6)A^O6wy^i#b0O3b)_Q>5!76`A)x{_k(w3^t$1EesQ zqw4S`r5CPRDth&%#*KC7XEjlP`v>a>LdP6mN~#$cB}dX^RoE z|0>Jl?#I9&euo1o#IJmZMfwica?t-c+--+qHdh8Fn1e(g9TP{(RKVmwhLwHLB6>th z>6Rom1i?%S;Li%;VCs(&K)z+(M{-Y`%US?Q7kwq&r6}hDH6eW8k|>$9#~tlg^oQa?2SMX`gF-Bi24kxJji{?`ZD-v+s7M*LSvUA^40cO zim4~_{bwQHYsdJjlwdv3A_o6LYH?iACw9h9UCGYN;%W}LL=Wj0YGC?V&Vv!Ry(sxh$xJz4z zyGG3YAbaV#-*&zEnHS3s8h-B=`6{;}K#`N)H?zAg0fItbeQ|%ivpzI`n&FSLK5LuW z4D;F%dO#75pngCw(p2lIKE9~Eg!RX8%6&I`k019$fYl#a432W_4dzJGK;D@i)1bSE zt`OFoBai6q-`Zh(8OjG2h8x3I62cLUjWwt(cZ&Of{4%_DhZsZr1k*|CmVq{@8{~|JI+uH(B#{b1dsMR+8 zA&O2rEDRGcXp@AzytTEtWx^(ZV}Uq-k<)GX*5;eKxJNT+QB%!gD0M7_0cm_(PX2K( z0MX1%2z(BBOS@=#80VX(RjlR08j6d*&@PUvIu$o+U(?yMDgAh^q&jsbNKHi(lUMYT z9~{Rjm1@2_##E}LdJd*9l~9)}W=hh{#YhQ2G|kgb#a`$bBDQt1^@zE)Xg=prrBM5f z3CWq%6dcy`${9ak!5QKoDbiDw!mU@r%ImgvGb~xs4o3RcLFzRrmRAddlD{fO8 z=32)KDm9}Yf{#q0&+CE{IxOSJ!kynS<=9?d(Ok3i#kHBqM5Q>DzRK3TSuMRSa}*;3 z5{mef$0<6?MD(NGv8R`pXVWJItDIV6ZuM558-~^0w404)*I(K9FMHm0gu8}xwkX|o z*aaYRTPAG6jOC7;67mKiazWZ6g@wT-+$2TUnZ0nkbeb@o>C zW=UK%IGCnw%;)#YW8`j6LNts)5g>B(TwYS^p0r6T)vH%Z=TGsdCS$!_Za?9t<$|y> z*jn4BJ)IkY7Y!BhCai44#!3^l2N>P<*U)L zqZ`Kyi;DWRg}7rqn=O*ba}vd~YB{@C)#g*O!lZA6Ni*EX+ANi-US9J{uW4KD^m;xt*Ao)2y8?c}#)!wX`xrEGH`N2rx|FQ@9t$sypg85|m09A*z?$iC8{-KR}eB~-mF zv4BOQRzfUKci7Z{#TU6|(C}%Vx=Qe@x?yRZ;Zv?v$AoWLva*DhPuVB34*uwuGjnp+ zl|u6!Yvz;IAq}6n6_NJ>YArnrF>9N78ZlpK>F?P!CY#<%G8o{ z4~o^}tR*HV9g&+8i@Xs-;bdKLB$R-L*e9TdqOIelLJG-ruFfvjeR~Za)|-$VL6Rtw zw{E<_2o5>Qn2E~wKhS{X5u|C`lR2Par)d$Wc1QfRdu_s5i0-SY>=g=QW#?%NKdQTc zM%ET&f2iI&#Y(FCn@e#^>(}JZPUQC3tY&`OYAwh}D-@YycOuy9#bMJ55l$9<#-Mfh zWx9=&GwspilcYMIUyqaOg)+W zr1`OR0Lh>-2m*Fr zgwx}C@72Z6;b$xg7)^_?Sesphoj&fv`05d2s(^tn86j&@$g9@ zB3&1S@0IU$JVkA!SQiD2w-BedVN+)%eZ+Kv7JXP{`-9-|upI&Qk{GoSIZTNR@He+v!+VHSlekLJdqK+$4>kzRnB;PC2(p@`|U&Hq#M(`M6SESxX zs6k`}@F+Zt%ili{j1m-JZg@A-jM$2(L}?EScj>iH+j8zLLXVrS#m%CcR+oE)ZneW~ zQtzZXp4F3|9^P}F&c5|FeQH-G2Iorp@^ROPO}nXh*z?v#fUA|LMS3l(y(c|AfX!Nb z9G%TOzPA0~yCofOF-vw*dwVO%o7q^Ju*LvIwzwW=dAisz&dP6#O&UKd^-73^St<|2 zJFnCp8?Ec9hAyW)t-sIo2(?|1i6>q{$R#bPnIg0$xD5-5^Kl6_#4wc0Go@5130%X8 z^W|`h-p5!Tp#u!$RmD{mRVAraHPkdz6bdsH0MVv2l8HsRMX^PxMPa6JlEFopMNvhG z1Ihs5Y)!h4bqPhm1M+})ngUZ+NeW5!@JO1-0YyN>fF!jV3jQj-E`HYR#0%<(Jm{mx zzu;q`353Vd#L=YDgb&D>6mqIx;xnMphKGnL7Z%T`Su-x+Go!`7Ej4E3L@a_qWE90M zCobcYx&jTULV{FY7Cs0JZ87!~@hM!<4?!nQ-Cyd8Y3LQcI6kGizr+>w5H$pw@t52c z5#*j}v)G&WYcAc#nF1y(wJz~1o*{jFC$-1u-30t+*(;=>6Z~4$F1ahTp>cc;)yI%s zNeB^Rez|x2F3eCP{S z<+LnH^)cU+Xy^%FfXP!uf(ePq9P+b>1SE#BA@71cbio)X@4`D|i0`HLS=2>f$cfRh z_yIIjjo+$bU*49r%K&+!`dP*WeuxKh!cA8*Pw<~o!JXQUlyiXirfC5vBArgFY{Brds^(NIOwOlDcMp3w_60rIt=hw0VAg3t02$22t zSJ`tolcg$9LS1m{wl_<)>OSWeZ>TB%5D?-Eslca(@I&+<+3!n_bAD<6t}G@uP7PUA zQ9!sU*AN{f8ebIR3gLpNL0&*m@nIpR5E_UW+Up^2G)hU>@C?(JlEOne5J89m8nz@> zc#bJXc#K#H4r2pT10xqx?*CIw(avuY&;40eOi;Gcb@UCjNhUVx$V1{Ki1J1JHT4dq zzYO0%WLWPF^^TLj%mV})HS&AnB|YVfo^A1gBd8@78?^xHhbK&jaYemjCQRr5F)|GM zd!lm`HY(*M^-e9+2c7c8=8^b-pTCTE1~zKYq4NbwGxG9E}VkQZU)^QP=UF!Y9Pa92jUUtGkS4 zVij~iLw`0wLs!lk7)XJd!k{KcH1wZ}COZJA^8!901t1*p%SJ#M^NxvnTHP|#z!e^j ztY~7A0ChD+L+?~Hp|(Ur@8t~-H!Q1j?qy;<1%`){m(}5b!ox+)BB{s(!hXh*4|ES> z?NFFSUJ5{)zFDMmYrS~e_zLxBn^T-~PEV9psM{8?K-fCewKk4?pc?8{(l3tE&py%yEYlLk))&aaJtd7)YRvUXtU@5HNUc2PCD}++<*cmbE705x5I#}&%UpG z*S}Zb$t#uPB@qQ+LG*9gmx^v4}qe)$Mb@vjcmKKrx>AK0JXSht)knJ=|^r2Xz zxn-Y!DM^mZhxRs!=xX56PccD`OTLNeql_EW{Dbc~-+w+t`lM$(%tcdg(q%dmv6n03N1y7`pS`9kJ}`LX-Q6p$DT;R<$Tfcp) z&0aprTVC${Bww@t_D9##X3sCpfX)5c-pbmo^{r*>&1X#HA71E}PJ(?WrPXW8(!x(q zPbH-U8D358(QLO#;wG=_F|yy+Cg?zt1+tb;JYeefpYU>~z#*`pC{9>@3Irlw;x1!} zGl5A<#Ry*xeoW4iqM>)NBGt*ELnNU}X%%&x%l@IWqm_>4m9DE~s+byBueHJEsM(Pp zM4#ObTO$&mCktC6CI*#t-u^1gh=iae4OyrPS1_Dvb!LgU*o=i;t(>u=;#-+TgvFC2 z$TMgd?^?|#q;dA|w6_U4t?e=|S`PZmS2i*W*uAx232JP6h@uymwj|4Os5eh&UcGK$ z%e^`NnR|0W|KZ?7`AXb^9MlevqMbnW>4vdVEJJ|TEbhDaD} z*asHHD>EB#Cl1BR1gnMn<4RxIwn!e>>7kN*_B z_2LrwF%8yk#tAbWnTs?6!ls3LE*DR!tEFm^6XODK+!u>- z0W_ZM9n51F$GsES}h-&nGpFmcPd+WZD~PIkE?kA6 zt-}#&XR~~d1~3f<4dEc?PJ!Pbn~+ ze&t&-my>N?(y7!*8;vT{*+m?)H`TD6_ySh4;yJEz-@i+PEk!-+zrMZ}v4E;}^4$?# zaI_$V2KLg6D68RaB(N*jqe@M-WeG;Ol((s!S}@h%GwjZ2Ic~JnD>(S6ina7KG`J-- zqV>jH=R=m?Mdm|#h3t=Vuf~o1Usk{VA#8j}hgGj>fO|JAmD>FNef;Gdm?(>EU^iq3&O&~>YH*Q`;nG|kMHz3gK(TlQ+*XDp+K8?lrx-6&J zRf#hMFS}wtlzE-v){9HZBvGMj*i)r+u7o_bNt0AElmzo51$3nxP~X(e;bCqinScDc zL3lsr`6fiy?o3kIu83E37Hqmi-7#JUxaO zmyFI1cupU(>2znMxE$d#a z-1F8C4*T$8zp< z8n<0-KD2VU2#aX(39=8UuJ2H4ikdf)k_x>>>H;GXeYybl83^6nNl7NWuVY-PmUCl3 z3XYDRN-0myo_h}_vLL^YiOe?0El829a^slY23*VS=EQon6>pap?2h z?Qln*?jpR|+r860tNX~W%T0vJV^yrq`+gMTpT13X8=qgg-$t1kWT~ivy5lnsOQV%n zSg#cWMoF3t0+uK~XtOR;C@z+as3esfkTp;40;0((WDii&JIUsHg~p-|;>RW%5m;^Y znAmltW8yq}K3rP-)M5>KXd3KjsG73h;_Bst#d@>Y1|dk(WkbX}THZIFPq*ULZ0Bmf zdzdOOo2sVtwjRuFwCdv?%w#7bzf|WVHaW+ zi9E9|n2gK>n;D+hycktAy08JOmtOEm{cS^v5aUJ~XPtOCWB#OLN=LyVs{P+`B<18_+HD2;JZ*;nm*}`33*>al2 z#z)?0f=-PJ!!fkdJe@`R5A3B#pWp^DypE=ISQUFuZoA?~-(Ee{V>UP2A!o34cYE#P z(xoesExWW(C@VX;FW)X4tZ-8->MMTzihft4|8ru=c@o?zpR&$inZGO_6oB?2r4uVR z5o}v*Sq+GYOHNx3Njqw6s9r1fhxBiAg3VB#C^AjP03!<$1qg$+Sh^oXgE&R3+eRI|~psz`~ll;)Q{aNnfRt?q=_sv!70~up&!^P71*Ts<9 zEi11qwbLO?i`Fx8$04utjh5SpnkzzafAa5=XA|DYCnlJjh@{kTL9#7Ig~Bt0;_AM{@f?-vhes(j|0UB3c{@Raq-@>1^)6EBZ{CXsOqZkrrl$F?NVn05uA7H~E9~hylz)Q<^x8SLzAoLtN z*QIhKalhYyN|IGQWX6z2C?FU!$Od2jv-!tyeP79Stjocwl5z)bV+Hv9@_%Vb)&GWt94X;9_mCB%ck=2GX znA34cWL2slcqEc&pINo+7d^ZG%uXJkr z;7%UUazdh(_Lt-%m6CM68E>)e)PDA{qVm0xdpiSRNjZ^1?8!ZapXr4WSN4Z^FU}n3 zh%m2B#$}!)1WD`@BYb4-WM%8EC-?ZU)25mD>O)=h63QY#01cPkrPRc>_K^_@Nxc|Q z)T1(jG;`bDh}A3Xe)CqwF)hM*^DtR(=`V#hlN~?PTa2_*!OevLr|-H~tdAoLxQMZg zban@Z&rC!5s^yBc;J?eJq7BsSvTWdNZI+Dd8X8`FeR(DX8;fo$H8$8Tk+SvQlS3hbz;%G1IFZWX{At^IS!&lQ0CXNYI$VWc@#GpkUkow*q(CEiE7P-RWq>sHah*J7~iI$}}L z2g8WaK6l&tgxb@?!zg@Owc%LXDmkx+40>%O(#6B?#~f=RNx|}S#=7Jrw2}gSsUaRn zCK=8gF=pW&z8TWVA9q|33}$%CQ?ERi&H7Dma7#Md_(79Hw+u;|P~vAAI8BXdxz}I< z^-NccRC(2El59G+Nv}w~!al;M-sFkR&DV=(YJL7?R)OBq2GDHCUHSX4Ag9~P3NGo)&zs(DMk=A~i=c*+Qg4mOuvE)M75_$kret*!!l zZ$@>eUq6!z>KN#zMdh;^b}|gcdvyY4_s^?u0YiU-S)$DGeo633P^F5F6veXS;?DO8!`0^Q+WL6ws|C^ z&yVj*Y1mTnr(V>xNv8)9Hq{hC?=N*kFJhKwOzMGH62M$tCG8eF23=Q~Qo1{chYt1w zUhp(q$5vL{(jxFIDa!l!%@O@HaPjkBV+{zQzu{>+A^cc23m91NG|93Rb7(_S;cEEt6m1~uujL0W^T3LRU4jzRc#I1_D#(fG_XP1i&%`&+Z*x;Q z^5(y2L>-ADGOOr+AZ?!Q<7BFka$v0&`h@?LLZ%DLf7hcy&aCM}|GNe~;8)H_ky05P znNQo=cVgr4Tb<4P54Gu)3-M#>-0Tb@l`0IA+4Q|fAr`+t>n z7zx3Z%$x zZykEgzE4rlj&4&Lu-s8N&(OPFdC<{}e&mKIO|P->2Yv_`r*q*YLZcb>K7XQvG&GC^t^Rr={;*{ zp0Lbd2bYNNldy{0muR2h*O^9fbfQg5~UmX1jTt8=f`w~ zc{!jD?NIyqP~Bh1D?6UN8XIJu&2x@?KhbVr}fIqclGwi zx9i>e-qB3g!g?v=Q2d&gofST{^D8hTGuepIUFYOUV-|9V9T*x-Tn?VgeoHZ z7og$4k*@zlzW!4TMB=Xi-+$6}rd4XJ9RBTX9 z5O!`pC=8K`my?qn00wabsK8MCFfZsY2;YC87ylE@_*)+2e?$%b6I%I)9LPTs^B08g ze-Hm(h|K>VV7^>{{|)B*A2Kih8%&d%3yKYD{Bt@Bi2G6qgZykS?ohH)3yE_DVn@M-@Yj0%Noqzqz zt6&U&P{LXf5mNWH)T{OhA+@wgv8o>l&oRes@rg;;3G2NA>r7lWh_yz0+fM-QpXv?s zKt6A7tPkAF!X@SG_pd``Kf;75p0O;!x2%C zAPyP#w-+(&MkbpZo?qDOiVGi6-mxTV-2D!l9bUNc_XP(05Af`NmfOGT=5I*e|6XVR zmvCO5e~8~e7l4M7rlZYoJoj(KlfOXRy`**H0YTu>zZf7$@td?3z0Z9E`OC>Z}Qe$X#Kp1=12)v@{0 z4+H@GX#?|dazX?BOTWB)eB97T|I@|^;N<;te4JoDE-onO|F3=^UhtpegPx$EiZ_4t zm^ILJ~FE%b7zTXq^7aN$5kLS;QxdC9lzx4~|zb1Yz} z;?JLX0djHwZOmXWi1W`p19^eGf7-xcs6NvlV+L{Y0{+Yu7z~DM6Abtx2T%)?k@CmB(6s!Sd+1m|;6KI; zwebS}=;OETzxY85@Na!UtM?BZHxC%_XCK_qF8&-JHyfKWv_EsQ>@~ literal 0 HcmV?d00001 diff --git a/src/soulcap_cl_mapping/pubmed_search.py b/src/soulcap_cl_mapping/pubmed_search.py new file mode 100644 index 0000000..4146805 --- /dev/null +++ b/src/soulcap_cl_mapping/pubmed_search.py @@ -0,0 +1,119 @@ +"""Search PubMed via NCBI E-utilities for literature evidence. + +Uses the ``PUBMED_API_KEY`` in ``.env`` (raises NCBI's rate limit from 3 to +10 requests/second per https://www.ncbi.nlm.nih.gov/books/NBK25497/) but +still works keyless at the lower rate if the variable is unset. + +This is a citation-search source alongside Asta (primary) and Europe PMC +(keyless fallback, see ``europepmc_search.py``) — PubMed indexes MEDLINE +directly, which Europe PMC mirrors, so prefer this module only when a task +specifically needs NCBI's own service (e.g. its query-field syntax). + +Usage:: + + from soulcap_cl_mapping.pubmed_search import search + hits = search("CD56 natural killer cell human") +""" + +from __future__ import annotations + +import argparse +import os +import sys +import xml.etree.ElementTree as ET + +import requests +from dotenv import load_dotenv + +load_dotenv() + +ESEARCH_URL = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi" +EFETCH_URL = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi" +DEFAULT_PAGE_SIZE = 5 + + +def search( + query: str, + page_size: int = DEFAULT_PAGE_SIZE, + timeout: int = 15, + api_key: str | None = None, +) -> list[dict]: + """Search PubMed for *query*. + + Returns a list of normalised result dicts with keys: ``pmid``, ``doi``, + ``title``, ``abstract`` (``""`` if none indexed). Two E-utilities calls: + ``esearch`` for matching PMIDs, then ``efetch`` for their MEDLINE XML. + """ + api_key = api_key or os.environ.get("PUBMED_API_KEY") + + search_params: dict[str, str | int] = { + "db": "pubmed", + "term": query, + "retmode": "json", + "retmax": page_size, + } + if api_key: + search_params["api_key"] = api_key + search_resp = requests.get(ESEARCH_URL, params=search_params, timeout=timeout) + search_resp.raise_for_status() + pmids = search_resp.json().get("esearchresult", {}).get("idlist", []) + if not pmids: + return [] + + fetch_params: dict[str, str] = { + "db": "pubmed", + "id": ",".join(pmids), + "retmode": "xml", + "rettype": "abstract", + } + if api_key: + fetch_params["api_key"] = api_key + fetch_resp = requests.get(EFETCH_URL, params=fetch_params, timeout=timeout) + fetch_resp.raise_for_status() + return _parse_efetch(fetch_resp.text) + + +def _parse_efetch(xml_text: str) -> list[dict]: + root = ET.fromstring(xml_text) + return [_normalise_article(article) for article in root.findall(".//PubmedArticle")] + + +def _normalise_article(article: ET.Element) -> dict: + pmid = article.findtext(".//PMID", default="") + title = article.findtext(".//ArticleTitle", default="") + abstract_parts = [t.text or "" for t in article.findall(".//Abstract/AbstractText")] + abstract = " ".join(part.strip() for part in abstract_parts if part.strip()) + doi = "" + for article_id in article.findall(".//ArticleId"): + if article_id.get("IdType") == "doi": + doi = article_id.text or "" + break + return {"pmid": pmid, "doi": doi, "title": title, "abstract": abstract} + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser( + description="Search PubMed via NCBI E-utilities (uses PUBMED_API_KEY if set)." + ) + parser.add_argument("query", help="Free-text search query.") + parser.add_argument( + "--rows", type=int, default=DEFAULT_PAGE_SIZE, help="Max results." + ) + args = parser.parse_args(argv) + + hits = search(args.query, page_size=args.rows) + if not hits: + print(f"No results for: {args.query}") + return 1 + + for h in hits: + print(f"PMID:{h['pmid']} DOI:{h['doi']}") + print(f" {h['title']}") + if h["abstract"]: + print(f" {h['abstract'][:300]}...") + print() + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tests/test_pubmed_search.py b/tests/test_pubmed_search.py new file mode 100644 index 0000000..87d54c1 --- /dev/null +++ b/tests/test_pubmed_search.py @@ -0,0 +1,156 @@ +"""Tests for soulcap_cl_mapping.pubmed_search. + +Network is always mocked — these tests never hit NCBI E-utilities. +""" + +from __future__ import annotations + +from unittest.mock import patch + +from soulcap_cl_mapping import pubmed_search as ps + +_EFETCH_XML = """ + + + + 28791027 +

+ + + + 28791027 + 10.3389/fimmu.2017.00892 + + + + +""" + +_EFETCH_XML_NO_DOI_NO_ABSTRACT = """ + + + + 11111111 +
+ Untitled findings +
+
+
+
+""" + + +class _FakeResp: + def __init__(self, *, json_data: dict | None = None, text: str = ""): + self._json_data = json_data + self.text = text + + def raise_for_status(self) -> None: + pass + + def json(self) -> dict: + assert self._json_data is not None + return self._json_data + + +def _esearch_payload(*pmids: str) -> dict: + return {"esearchresult": {"idlist": list(pmids)}} + + +# --------------------------------------------------------------------------- # +# search +# --------------------------------------------------------------------------- # +def test_search_normalises_results(): + responses = [ + _FakeResp(json_data=_esearch_payload("28791027")), + _FakeResp(text=_EFETCH_XML), + ] + with patch.object(ps.requests, "get", side_effect=responses): + hits = ps.search("CD56 NK cell") + assert hits == [ + { + "pmid": "28791027", + "doi": "10.3389/fimmu.2017.00892", + "title": "NK cell markers", + "abstract": "NK cells express CD56 in humans.", + } + ] + + +def test_search_no_results_returns_empty_list_without_efetch(): + with patch.object( + ps.requests, "get", return_value=_FakeResp(json_data=_esearch_payload()) + ) as mock_get: + hits = ps.search("nonsense query") + assert hits == [] + mock_get.assert_called_once() + + +def test_search_missing_doi_and_abstract_default_to_empty_string(): + responses = [ + _FakeResp(json_data=_esearch_payload("11111111")), + _FakeResp(text=_EFETCH_XML_NO_DOI_NO_ABSTRACT), + ] + with patch.object(ps.requests, "get", side_effect=responses): + hits = ps.search("x") + assert hits == [ + { + "pmid": "11111111", + "doi": "", + "title": "Untitled findings", + "abstract": "", + } + ] + + +def test_search_includes_api_key_when_set(): + responses = [ + _FakeResp(json_data=_esearch_payload("28791027")), + _FakeResp(text=_EFETCH_XML), + ] + with patch.object(ps.requests, "get", side_effect=responses) as mock_get: + ps.search("CD56 NK cell", api_key="test-key") + esearch_call, efetch_call = mock_get.call_args_list + assert esearch_call.kwargs["params"]["api_key"] == "test-key" + assert efetch_call.kwargs["params"]["api_key"] == "test-key" + + +def test_search_omits_api_key_when_unset(monkeypatch): + monkeypatch.delenv("PUBMED_API_KEY", raising=False) + with patch.object( + ps.requests, "get", return_value=_FakeResp(json_data=_esearch_payload()) + ) as mock_get: + ps.search("x") + assert "api_key" not in mock_get.call_args.kwargs["params"] + + +# --------------------------------------------------------------------------- # +# CLI +# --------------------------------------------------------------------------- # +def test_main_prints_results_and_returns_zero(capsys): + responses = [ + _FakeResp(json_data=_esearch_payload("28791027")), + _FakeResp(text=_EFETCH_XML), + ] + with patch.object(ps.requests, "get", side_effect=responses): + rc = ps.main(["CD56 NK cell"]) + out = capsys.readouterr().out + assert rc == 0 + assert "28791027" in out + assert "NK cell markers" in out + + +def test_main_no_results_returns_one(capsys): + with patch.object( + ps.requests, "get", return_value=_FakeResp(json_data=_esearch_payload()) + ): + rc = ps.main(["nonsense query"]) + out = capsys.readouterr().out + assert rc == 1 + assert "No results" in out From fa7bb054a4d4436a8562dec762d93d7677362905 Mon Sep 17 00:00:00 2001 From: s28ale-maker Date: Fri, 25 Sep 2026 15:08:21 -0400 Subject: [PATCH 3/4] feat: scaffold cell_type_reviews/, per-cell-type evidence and verdict files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Recovered from a cloud Claude session (patch 0001, commit 5b169aa) that built this folder but couldn't push it — no GitHub App write access on the Cellular-Semantics org. Applied by hand rather than git am since CLAUDE.md/README.md had diverged from that session's main base. One review file per SOULCAP cell type: definition, marker->protein/gene, verbatim literature support, CL axiom comparison, proposed verdict, and uncertainty triggers that route a review to Dr. Diehl for expert sign-off. _template.md and the folder README (workflow, statuses, index) are in; no individual reviews written yet. Deliberately NOT included here: the original patch's ROADMAP.md edits, which redefine Milestone 2's deliverable from reports/literature/ to this folder and assert "decided with Dr. Diehl" -- that framing isn't confirmed anywhere in the source conversation, and reports/literature/ already holds 7 real completed category reports plus a sprint-backlog item pointing at it. Flagging for confirmation before touching ROADMAP. Co-Authored-By: Claude Opus 5.5 Co-Authored-By: Claude Sonnet 5 --- CLAUDE.md | 1 + README.md | 13 ++++++ cell_type_reviews/README.md | 80 ++++++++++++++++++++++++++++++++ cell_type_reviews/_template.md | 85 ++++++++++++++++++++++++++++++++++ 4 files changed, 179 insertions(+) create mode 100644 cell_type_reviews/README.md create mode 100644 cell_type_reviews/_template.md diff --git a/CLAUDE.md b/CLAUDE.md index 631e3ae..d2553f9 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -61,6 +61,7 @@ AST in `marker_syntax.py`, compiled/evaluated by `phenotype.py`. | [Notes.md](Notes.md) | Scratch notes on data sources + a marker-syntax quick reference. | | [MARKER_SYNTAX.md](MARKER_SYNTAX.md) | **Canonical spec** of the marker expression language (human-readable guide + EBNF). Cite this for anything parsing/validating marker strings. | | [reports/](reports/) | Analysis reports. `marker_string_issues.md` is the curated review; `marker_validation.md` is **auto-generated** by the EBNF validator on each sync. `cl_pro_relationships.md`/`.tsv` are **auto-generated** by `soulcap-cl-pro` from Ubergraph. `cl_term_issues.md` tracks proposed CL corrections found during mapping work. `candidate_cl_mappings.md` is the Milestone 4 deliverable — proposed SOULCAP→CL mappings with rationale and evidence. `candidate_cl_mappings_batch.tsv`/`candidate_cl_mappings_agreement.tsv` are **auto-generated** by `soulcap-match --batch [--lexical]` (issue #6) — a marker-axiom-only pass and a marker/lexical agreement pass across every SOULCAP cell type; treat as an unreviewed draft shortlist (conflicts must be checked), not curated output. `candidate_cl_mappings.sssom.tsv` is **auto-generated** by `soulcap-sssom` from the curated `CURATED_MAPPINGS` table in `sssom_export.py` (kept in sync by hand with `candidate_cl_mappings.md`) — standard SSSOM format, with `confidence`/`comment` derived from whether the match is backed by a directly-asserted CL marker axiom, an inferred-only one, or none at all (lexical/name match only). `gaps.tsv` is a curated, hand-maintained log of cases where SOULCAP has no reasonable CL match, CL conflicts with a marker panel, CL has an axiom gap, or the sheet itself has a data problem — separate from the mapping table; matching GitHub issues use the `gap` label (`.github/ISSUE_TEMPLATE/mapping_gap.yml`). `pro_marker_species_support.tsv` is the issue #11 deliverable — for each (CL cell type, general PRO marker) pair SOULCAP's mappings actually touch, whether literature supports the marker as human, mouse, or both, or `insufficient_evidence`; built by the `pro-marker-species-support` skill, every quote verified verbatim against its source before writing. `fall_2026_sprint_backlog.md` is the sprint-level breakdown of [ROADMAP.md](ROADMAP.md)'s Fall 2026 (Oct–Dec) working plan, prepared for Dr. Diehl — hand-maintained, not regenerable; update it as items complete or scope is renegotiated, don't treat it as a generated report. New reports go here. `reports/citation_traversal/` holds gitignored, regenerable snippet caches + summaries from the `citation-traversal` skill. | +| [cell_type_reviews/](cell_type_reviews/README.md) | **One review file per SOULCAP cell type** (tracked, curated — not a regenerable cache): definition, marker→protein, verbatim literature support, CL comparison, proposed verdict, uncertainty flags. Start from `_template.md` and keep the folder README's index in sync. Only reviews flagged **uncertain** go to Dr. Diehl for expert review. Scaffolded 2026-09-23, no reviews written yet; its relationship to the existing `reports/literature/` Milestone 2 output is still being confirmed with Dr. Diehl — see ROADMAP.md before assuming one supersedes the other. | | `src/soulcap_cl_mapping/` | All Python code. `sync_sheets.py` → `soulcap-sync`; `marker_syntax.py` → `soulcap-validate` (EBNF validator); `snippet_cache.py` → `soulcap-cache`; `report_validator.py` → `soulcap-validate-report`; `cl_pro.py` → `soulcap-cl-pro` (CL→PR relationships via Ubergraph SPARQL); `cl_match.py` → `soulcap-match` (marker-axiom + lexical CL candidate scoring, single-profile or `--batch`); `oak_match.py` → `soulcap-oak-match` (OAK sqlite-backed lexical/synonym CL search — downloads/caches a local CL database on first use, ~100MB); `sssom_export.py` → `soulcap-sssom` (curated mappings → SSSOM TSV, with confidence derived from CL marker-axiom assertion status); `pro_species_support.py` (scopes CL PRO markers needing species-specificity literature support — no CLI, called as a library from the `pro-marker-species-support` skill); `europepmc_search.py` → `soulcap-europepmc` (free, keyless Europe PMC search — fallback literature source when the Asta MCP server isn't reachable); `pubmed_search.py` → `soulcap-pubmed` (NCBI E-utilities search — reads `PUBMED_API_KEY` from `.env` if set for the higher rate limit, otherwise works keyless; use when a task specifically needs NCBI's own index/query syntax rather than Europe PMC's mirror of it). | | `tests/` | Unit tests (mirror `src/` layout). | | `.claude/skills/` | Project skills — see [citation-traversal](.claude/skills/citation-traversal/SKILL.md), `ontology-term-lookup`, [pro-marker-species-support](.claude/skills/pro-marker-species-support/SKILL.md), [gap-issue-filing](.claude/skills/gap-issue-filing/SKILL.md), [roadmap-status-sync](.claude/skills/roadmap-status-sync/SKILL.md), and [mapping-audit](.claude/skills/mapping-audit/SKILL.md). | diff --git a/README.md b/README.md index 125ab49..a41d79a 100644 --- a/README.md +++ b/README.md @@ -442,6 +442,19 @@ own candidate mappings — those stay as SSSOM, a proposal for human review, not something this repo should unilaterally convert into OWL axioms and merge into CL as if already accepted. +## Cell-type reviews + +[`cell_type_reviews/`](cell_type_reviews/README.md) holds one review file per +SOULCAP cell type. Each file gathers the marker definition, marker → protein/gene +mappings, verbatim literature support, a comparison against Cell Ontology terms +and their marker axioms, and a proposed CL mapping. Reviews that meet an +uncertainty trigger (weak literature, a conflict with CL axioms, no exact CL term, +etc.) are sent for expert review; confident mappings go straight into the Google +Sheet. See the folder README for the workflow, statuses, and template. Scaffolded +2026-09-23 — no reviews written yet, and how it relates to the existing +`reports/literature/` Milestone 2 reports is still being confirmed with Dr. Diehl +(see [ROADMAP.md](ROADMAP.md)). + ## Skills & literature workflows This repo ships Claude Code skills under `.claude/skills/`: diff --git a/cell_type_reviews/README.md b/cell_type_reviews/README.md new file mode 100644 index 0000000..dac9c2d --- /dev/null +++ b/cell_type_reviews/README.md @@ -0,0 +1,80 @@ +# Cell-type reviews + +One review file per SOULCAP cell type (one per `Subset name` row in the +`Marker Combinations` sheet). Each file collects the evidence for that cell +type's marker definition and CL mapping, and proposes a verdict: + +1. SOULCAP definition (markers, current mapping) +2. Markers → protein / gene (Milestone 1) +3. Literature support: verbatim, cited quotes (Milestone 2) +4. Comparison with Cell Ontology terms and their PR marker axioms +5. Proposed CL term, match type, and rationale (Milestones 3–4) +6. Uncertainty flags +7. Reviewer notes + +These files are **tracked, curated artifacts**. They are not a regenerable cache. +The Google Sheet stays the source of truth: a verdict only takes effect once +it has been entered in the sheet and re-synced. + +## Workflow + +Start a review by copying [`_template.md`](_template.md) to `.md`. The slug +is the `Subset name` in lowercase with hyphens, e.g. `MAIT` → `mait.md`, +`CD4 Con T` → `cd4-con-t.md`. Then add a row to the [index](#index). + +``` +draft ──▶ evidence-complete ──▶ verdict-proposed ──┬──▶ synced-to-sheet (confident) + └──▶ needs-expert-review + ──▶ expert-reviewed ──▶ synced-to-sheet +``` + +| Status | Meaning | +|--------|---------| +| `draft` | File created; sections still being filled in. | +| `evidence-complete` | Sections 1–4 done. Every marker has a literature verdict, even if that verdict is "no evidence found". | +| `verdict-proposed` | Section 5 filled in and section 6 assessed. | +| `needs-expert-review` | At least one uncertainty trigger applies. Waiting for the expert (Dr. Diehl). | +| `expert-reviewed` | Expert decision recorded in section 7; `reviewer` and `reviewed_on` set. | +| `synced-to-sheet` | Verdict entered in the Google Sheet (`OLS CL identifier`, `Type of Match`, `CL Mapping Notes`) and confirmed after `soulcap-sync`. | + +**Expert review happens only for uncertain cell types.** Confident mappings go +straight from `verdict-proposed` to `synced-to-sheet`. The expert's queue is +every row in the index with status `needs-expert-review`. + +## When a review is uncertain + +Set `uncertain: true` and move the review to `needs-expert-review` if **any** of +these apply. List the matching trigger IDs in `uncertainty_triggers`: + +| Trigger ID | Applies when | +|------------|--------------| +| `weak-literature` | A **required** marker has no supporting quote, or is supported only indirectly (e.g. by a different tissue, species, or population). | +| `conflicting-literature` | Sources disagree about a marker for this cell type. | +| `cl-axiom-conflict` | The candidate CL term's PR marker axioms contradict the SOULCAP markers (e.g. CL says `CD27+`, SOULCAP says `CD27-`). | +| `no-exact-cl-term` | Only a broad CL match exists. The cell type may be missing from CL (a candidate new-term request). | +| `multiple-cl-candidates` | More than one CL term fits, and the markers don't decide between them. | +| `ambiguous-definition` | The marker string is invalid or ambiguous (see `reports/marker_validation.md`), or it contains free text or placeholders. | +| `mapping-change` | The proposed verdict would change an existing `OLS CL identifier` or `Type of Match` in the sheet. | + +If none apply, write "None" in section 6 and continue without expert review. + +## Evidence rules + +- Quotes must be **verbatim** from the snippet cache or retrieved full text, and + must cite a DOI or PMID and the citation-traversal run ID. Use the + [`citation-traversal`](../.claude/skills/citation-traversal/SKILL.md) skill to + gather them. Check quotes with `uv run soulcap-validate-report` before setting + `evidence-complete`. +- Record "no evidence found" explicitly. Never invent support. +- Look up CL terms with OLS4 or the `ontology-term-lookup` skill. Take CL marker + axioms from [`reports/cl_pro_relationships.tsv`](../reports/cl_pro_relationships.tsv). +- Report data errors found during a review in the review and in + `reports/marker_string_issues.md`. Fix them in the sheet, not in `data/`. + +## Index + +Keep this table in sync with each file's front matter. + +| Cell type | File | Status | Uncertain | Proposed CL | Match | +|-----------|------|--------|-----------|-------------|-------| +| _none yet_ | | | | | | diff --git a/cell_type_reviews/_template.md b/cell_type_reviews/_template.md new file mode 100644 index 0000000..4fa07b0 --- /dev/null +++ b/cell_type_reviews/_template.md @@ -0,0 +1,85 @@ +--- +# Copy this file to .md (lowercase Subset name, hyphens, e.g. `cd4-con-t.md`). +subset_name: "" # exactly as in the sheet's `Subset name` column +sheet_row: null # 1-based row in `Marker Combinations` at time of review +sheet_synced: "" # date of the `soulcap-sync` snapshot used (YYYY-MM-DD) +status: draft # draft | evidence-complete | verdict-proposed | needs-expert-review | expert-reviewed | synced-to-sheet +uncertain: false # true if any uncertainty trigger applies (see README) +uncertainty_triggers: [] # e.g. [weak-literature, cl-axiom-conflict, no-exact-cl-term] +proposed_cl_id: "" # CL:NNNNNNN +proposed_cl_label: "" +match_type: "" # exact | broad | none +reviewer: "" # set only when status is expert-reviewed +reviewed_on: "" # YYYY-MM-DD +--- + +# + +## 1. SOULCAP definition + +Copied from the synced `Marker Combinations` row. Don't edit these here. If a +value is wrong, fix it in the Google Sheet and re-sync. + +| Column | Value | +|--------|-------| +| Required exclusion | `` | +| Ideal exclusion | `` | +| Required phenotypic markers | `` | +| Ideal phenotypic markers | `` | +| Current `Type of Match` | | +| Current `OLS CL identifier` | | +| Current `CL Mapping Notes` | | + +Marker-string problems (from `reports/marker_validation.md` / +`reports/marker_string_issues.md`): _none_ / list them. + +## 2. Markers → protein / gene + +One row per distinct marker in the definition. Once Milestone 1 exists, take +these from `marker_mappings/marker_protein_gene.csv`. + +| Marker | Sense | PR ID | UniProt (human) | Gene | +|--------|-------|-------|-----------------|------| +| | + / − / lo / hi | | | | + +## 3. Literature support + +Every quote must be **verbatim** from a cached snippet or retrieved full text, +with its source and citation-traversal run ID. Never paraphrase something into a +quote. Record "no evidence found" explicitly rather than leaving it blank. + +Seed papers (from `Citation Mgr`): + +| Marker / combination | Verdict | Quote | Source | Run | +|----------------------|---------|-------|--------|-----| +| | supported / contradicted / no evidence found | "…" | DOI / PMID | `reports/citation_traversal/` | + +## 4. Cell Ontology comparison + +Candidate CL term(s) (checked via OLS4 / `ontology-term-lookup`), plus their +marker axioms from `reports/cl_pro_relationships.tsv`. + +| CL term | Label | CL marker axioms | Agreement with SOULCAP markers | +|---------|-------|------------------|--------------------------------| +| CL: | | | agrees / conflicts / not in CL | + +Gaps or problems in CL itself (missing term, wrong or missing axiom): _none_ / describe. + +## 5. Proposed verdict + +- **Proposed CL term:** CL:NNNNNNN (label) +- **Match type:** exact / broad / none +- **Rationale:** +- **Proposed text for `CL Mapping Notes`:** +- **Proposed changes upstream:** SOULCAP sheet / CL new-term or edit request / none + +## 6. Uncertainty + +List each trigger that applies (see [README](README.md#when-a-review-is-uncertain)) +and what an expert would need to decide. If none applies, write "None: confident +mapping, no expert review needed." + +## 7. Reviewer notes + +_Filled in by the expert reviewer, and only for uncertain reviews._ Record the +decision, any correction, and the reason. From fae3bd98c33d8f725221e231d61ff2139da09dbe Mon Sep 17 00:00:00 2001 From: s28ale-maker Date: Mon, 28 Sep 2026 12:10:30 -0400 Subject: [PATCH 4/4] docs: refine CD4/CD8 T cell gap with CD8alpha-alpha / gamma-delta note SOULCAP's bare "CD8" (PR:000001084, alpha chain) can't separate CD8ab from CD8aa. This doesn't affect the CD8+ alpha-beta exactMatches, but it sharpens the CD8+ TCRgd gap: CL models CD8aa+ gamma-delta T cells only in the intraepithelial branch (CL:0000802), with no tissue-unrestricted term. Co-Authored-By: Claude Opus 5.5 --- reports/gaps.tsv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reports/gaps.tsv b/reports/gaps.tsv index f5878ba..aa5656c 100644 --- a/reports/gaps.tsv +++ b/reports/gaps.tsv @@ -11,7 +11,7 @@ Mono / CMo / NCMo / IntMo Monocyte family sheet_data_issue Required exclusion co B cell B cell cl_axiom_gap CL:0000236 (plain "B cell") has zero marker axiom rows in cl_pro_relationships.tsv — same parent-class axiom-gap pattern as NK/ILC/cDC/monocyte. Match is lexical-only (OAK-verified after OLS4 REST search returned zero hits for this exact query), not marker-confirmed. CL:0000236 reports/candidate_cl_mappings_narrative.md#b-cell-parent; reports/cl_pro_relationships.tsv open (not yet filed) 2026-07-24 BDN1 / BDN2 / BDN3 / BDN4 Double Negative B cell 1-4 cl_axiom_gap SOULCAP defines four "double negative" B cell subsets (DN1-4, the atypical/age-associated B cell scheme from the autoimmunity/aging literature) via CD21/CD11c/CD185/IgE combinations. CL has only the general parent CL:0000981 "double negative memory B cell" with no DN1-4 subtyping; direct searches for "DN1 B cell" through "DN4 B cell" and "atypical memory B cell" returned zero CL hits. All four SOULCAP rows currently collapse to the same Broad match. CL:0000981 reports/candidate_cl_mappings_narrative.md#b-cell-maturation-tree--transitional--mature--naive--double-negative open (not yet filed) 2026-07-24 IgD only IgD only Memory B cell cl_axiom_gap SOULCAP distinguishes IgD+IgM- ("IgD only") from IgD+IgM+ ("Unswitched") memory B cells as two separate populations. No CL term exists for the IgD+IgM- subset — direct searches for "IgD-positive memory B cell" and "IgD only memory B cell" returned zero hits; the only IgD-related term found, CL:0001053 "IgD-negative memory B cell," is the opposite polarity. Left unmapped rather than forced onto a wrong-polarity term. CL:0001053 (wrong polarity, not used) reports/candidate_cl_mappings_narrative.md#memory-b-cell-tree open (not yet filed) 2026-07-24 -CD4+ T cell / CD8+ T cell / CD4+/CD8+ T cell / CD4-/CD8- T cell / CD4+/CD8+ TCRab T cell / CD4-/CD8- TCRab T cell / CD4+ TCRgd T cell / CD8+ TCRgd T cell / CD4+/CD8+ TCRgd various cl_axiom_gap CL organizes CD4/CD8 status primarily under the alpha-beta T cell lineage: no combined alpha-beta+gamma-delta CD4/CD8 terms exist, no clean double-positive alpha-beta term exists, and the only double-negative term found (CL:0002489) is a thymocyte-stage term (wrong tissue for a blood/PBMC panel). All 9 rows Broad-matched to the nearest alpha-beta or gamma-delta parent with this gap noted. CL:0000624; CL:0000625; CL:0000789; CL:0000084; CL:0000798 reports/candidate_cl_mappings_narrative.md#combined-lineage-b-and-double-positivedouble-negative-gaps open (not yet filed) 2026-07-24 +CD4+ T cell / CD8+ T cell / CD4+/CD8+ T cell / CD4-/CD8- T cell / CD4+/CD8+ TCRab T cell / CD4-/CD8- TCRab T cell / CD4+ TCRgd T cell / CD8+ TCRgd T cell / CD4+/CD8+ TCRgd various cl_axiom_gap CL organizes CD4/CD8 status primarily under the alpha-beta T cell lineage: no combined alpha-beta+gamma-delta CD4/CD8 terms exist, no clean double-positive alpha-beta term exists, and the only double-negative term found (CL:0002489) is a thymocyte-stage term (wrong tissue for a blood/PBMC panel). All 9 rows Broad-matched to the nearest alpha-beta or gamma-delta parent with this gap noted. Refinement (2026-09-25): SOULCAP's bare "CD8" marker (mapped to the CD8 alpha chain, PR:000001084) can't distinguish the conventional CD8-alpha-beta heterodimer (typical of alpha-beta T cells) from the CD8-alpha-alpha homodimer (typical of gamma-delta T cells, some intraepithelial/innate-like T cells, and NK cells) — but this doesn't affect the CD8+ alpha-beta exactMatches, since CL:0000625 and its subtypes only assert the alpha chain and never require the beta chain. It does sharpen the CD8+ TCRgd gap though: CL does model CD8-alpha-alpha-positive gamma-delta T cells, just only in the intraepithelial-restricted branch (CL:0000802, CL:0002513, CL:0002514) — there is no generic, tissue-unrestricted CD8-positive gamma-delta T cell term for a blood/PBMC panel like SOULCAP's to map to. CL:0000624; CL:0000625; CL:0000789; CL:0000084; CL:0000798; CL:0000802 reports/candidate_cl_mappings_narrative.md#combined-lineage-b-and-double-positivedouble-negative-gaps open (not yet filed) 2026-09-25 CD56+ T cell family (13 rows) various CD56+ T cell subsets cl_axiom_gap SOULCAP crosses CD56 positivity with CD4/CD8/DP/DN status and TCRab/TCRgd lineage (13 variants); CL has only one term at this level (CL:4052055, pending rename to "CD56-positive T cell, human" per issue #13) with no further subdivision. All 13 rows Broad-match to CL:4052055. CL:4052055 reports/candidate_cl_mappings_narrative.md#cd56-t-cell-family; https://github.com/Cellular-Semantics/SOULCAP_CL_Mapping/issues/13 open (not yet filed) 2026-07-24 Tcm / Tem / Temra (general, no CD4/CD8 split) and all TCRgd-specific Tnaive/Tcm/Tem/Temra rows various cl_axiom_gap CL has no generic central/effector memory T cell term spanning both CD4 and CD8 (only CD4-specific and CD8-specific versions exist), and no gamma-delta-specific differentiation-state terms at all. ~13 rows Broad-matched to the nearest available parent (CL:0000084 T cell, or CL:0000798 gamma-delta T cell) with this gap noted. CL:0000084; CL:0000798 reports/candidate_cl_mappings_narrative.md#naive--central-memory--effector-memory--temra-tree open (not yet filed) 2026-07-24 CD8+ Temra / CD8+ TCRab Temra CD8+ CD45RA+ effector memory T cell cl_axiom_gap CL:4030002 (effector memory CD45RA-positive, alpha-beta T cell, terminally differentiated) appears to be CD4-specific only; no CD8+ counterpart with the same "terminally differentiated" qualifier was found — only the non-TEMRA-specific CL:0000913 (effector memory CD8-positive, alpha-beta T cell). Possible asymmetry in CL's own hierarchy; needs a second look before concluding it's a genuine omission rather than differently-named. CL:4030002; CL:0000913 reports/candidate_cl_mappings_narrative.md#naive--central-memory--effector-memory--temra-tree open (not yet filed) 2026-07-24