bioai-evidence-validator 0.4.1__tar.gz → 0.7.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/.gitattributes +1 -0
- bioai_evidence_validator-0.7.0/.github/ISSUE_TEMPLATE/bug_report.yml +53 -0
- bioai_evidence_validator-0.7.0/.github/ISSUE_TEMPLATE/config.yml +8 -0
- bioai_evidence_validator-0.7.0/.github/ISSUE_TEMPLATE/feature_request.yml +28 -0
- bioai_evidence_validator-0.7.0/.github/ISSUE_TEMPLATE/profile_proposal.yml +42 -0
- bioai_evidence_validator-0.7.0/.github/pull_request_template.md +18 -0
- bioai_evidence_validator-0.7.0/.github/workflows/ci.yml +90 -0
- bioai_evidence_validator-0.7.0/.github/workflows/docs.yml +43 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/.gitignore +4 -0
- bioai_evidence_validator-0.7.0/CHANGELOG.md +89 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/CITATION.cff +1 -1
- bioai_evidence_validator-0.7.0/CODE_OF_CONDUCT.md +16 -0
- bioai_evidence_validator-0.7.0/CONTRIBUTING.md +76 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/PKG-INFO +128 -18
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/README.md +120 -16
- bioai_evidence_validator-0.7.0/SECURITY.md +35 -0
- bioai_evidence_validator-0.7.0/action.yml +57 -0
- bioai_evidence_validator-0.7.0/community/profiles/README.md +37 -0
- bioai_evidence_validator-0.7.0/community/profiles/_template/README.md +18 -0
- bioai_evidence_validator-0.7.0/community/profiles/_template/cases/curated_assay.yaml +14 -0
- bioai_evidence_validator-0.7.0/community/profiles/_template/cases/llm_only.yaml +14 -0
- bioai_evidence_validator-0.7.0/community/profiles/_template/cases/network_without_review.yaml +14 -0
- bioai_evidence_validator-0.7.0/community/profiles/_template/cases/synthetic_study.txt +2 -0
- bioai_evidence_validator-0.7.0/community/profiles/_template/expected.yaml +14 -0
- bioai_evidence_validator-0.7.0/community/profiles/_template/profile.yaml +19 -0
- bioai_evidence_validator-0.7.0/docs/DRAFTS.md +99 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/docs/ENGINEERING.md +42 -10
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/docs/GOLD_STANDARD.md +10 -5
- bioai_evidence_validator-0.7.0/docs/STANDARDS.md +79 -0
- bioai_evidence_validator-0.7.0/docs/assets/clinvar_germline_benchmark.svg +4101 -0
- bioai_evidence_validator-0.7.0/docs/index.md +58 -0
- bioai_evidence_validator-0.7.0/evaluation/clinvar_review/README.md +125 -0
- bioai_evidence_validator-0.7.0/evaluation/clinvar_review/RUBRIC.md +74 -0
- bioai_evidence_validator-0.7.0/evaluation/clinvar_review/import_sheets.py +126 -0
- bioai_evidence_validator-0.7.0/evaluation/clinvar_review/prepare_packets.py +221 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/evaluation/gold_standard/README.md +13 -3
- bioai_evidence_validator-0.7.0/examples/clinvar_germline/README.md +178 -0
- bioai_evidence_validator-0.7.0/examples/clinvar_germline/pipeline.py +231 -0
- bioai_evidence_validator-0.7.0/examples/clinvar_germline/plot.py +135 -0
- bioai_evidence_validator-0.7.0/examples/clinvar_germline/prepare_source.py +200 -0
- bioai_evidence_validator-0.7.0/examples/clinvar_germline/profile.yaml +24 -0
- bioai_evidence_validator-0.7.0/examples/clinvar_germline/results/divergences.csv +246 -0
- bioai_evidence_validator-0.7.0/examples/clinvar_germline/results/summary.json +556 -0
- bioai_evidence_validator-0.7.0/examples/clinvar_germline/results/summary.md +48 -0
- bioai_evidence_validator-0.7.0/examples/clinvar_germline/run.py +179 -0
- bioai_evidence_validator-0.7.0/examples/clinvar_germline/sources/README.md +33 -0
- bioai_evidence_validator-0.7.0/examples/clinvar_germline/sources/clinvar-sample.jsonl.gz +0 -0
- bioai_evidence_validator-0.7.0/examples/clinvar_germline/sources/manifest.json +39 -0
- bioai_evidence_validator-0.7.0/examples/clinvar_germline/sources/population_outcomes.json +121 -0
- bioai_evidence_validator-0.7.0/examples/drafts/llm_claim.yaml +28 -0
- bioai_evidence_validator-0.7.0/examples/drafts/reviewed_claim.yaml +35 -0
- bioai_evidence_validator-0.7.0/examples/drafts/synthetic_paper.txt +2 -0
- bioai_evidence_validator-0.7.0/examples/quickstart.ipynb +255 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/examples/vbo_canine/pipeline.py +1 -1
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/examples/vbo_canine/results/summary.json +1 -1
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/examples/vbo_canine/run.py +2 -1
- bioai_evidence_validator-0.7.0/mkdocs.yml +62 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/pyproject.toml +41 -3
- bioai_evidence_validator-0.7.0/src/bioevidence_validator/__init__.py +8 -0
- bioai_evidence_validator-0.7.0/src/bioevidence_validator/cli.py +212 -0
- bioai_evidence_validator-0.7.0/src/bioevidence_validator/draft.py +253 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/src/bioevidence_validator/engine.py +2 -2
- bioai_evidence_validator-0.7.0/src/bioevidence_validator/review.py +388 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/src/bioevidence_validator/schema/bioevidence_core.yaml +18 -4
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/tests/test_cli.py +1 -2
- bioai_evidence_validator-0.7.0/tests/test_clinvar_case.py +121 -0
- bioai_evidence_validator-0.7.0/tests/test_clinvar_review_kit.py +138 -0
- bioai_evidence_validator-0.7.0/tests/test_community_profiles.py +39 -0
- bioai_evidence_validator-0.7.0/tests/test_draft.py +174 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/tests/test_engine.py +2 -1
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/tests/test_evidence_quality.py +3 -1
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/tests/test_fail_closed.py +2 -0
- bioai_evidence_validator-0.7.0/tests/test_github_action.py +43 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/tests/test_profiles.py +2 -2
- bioai_evidence_validator-0.7.0/tests/test_repository_files.py +21 -0
- bioai_evidence_validator-0.7.0/tests/test_review.py +230 -0
- bioai_evidence_validator-0.7.0/tests/test_standards.py +34 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/tests/test_vbo_case.py +3 -1
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/tools/check_distribution.py +18 -2
- bioai_evidence_validator-0.7.0/tools/github_action.py +91 -0
- bioai_evidence_validator-0.7.0/tools/mkdocs_hooks.py +73 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/uv.lock +508 -3
- bioai_evidence_validator-0.4.1/.github/workflows/ci.yml +0 -38
- bioai_evidence_validator-0.4.1/CHANGELOG.md +0 -44
- bioai_evidence_validator-0.4.1/src/bioevidence_validator/__init__.py +0 -3
- bioai_evidence_validator-0.4.1/src/bioevidence_validator/cli.py +0 -114
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/.github/workflows/release.yml +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/LICENSE +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/docs/ADR-001-canine-breed-first.md +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/docs/ADR-002-domain-neutral-main.md +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/docs/CASE_STUDY.md +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/docs/MIGRATION-0.4.md +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/docs/PROFILES.md +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/docs/assets/vbo_canine_benchmark.svg +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/evaluation/gold_standard/adjudications.template.csv +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/evaluation/gold_standard/annotations.template.csv +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/evaluation/gold_standard/manifest.template.json +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/examples/custom_profile/assay.yaml +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/examples/custom_profile/assay_record.json +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/examples/dataset_label/curated_sample_label.json +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/examples/dataset_label/missing_sample_link.json +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/examples/general/curated_assertion.json +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/examples/literature_claim/curated_association.json +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/examples/literature_claim/llm_only.json +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/examples/vbo_canine/README.md +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/examples/vbo_canine/prepare_source.py +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/examples/vbo_canine/profile.yaml +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/examples/vbo_canine/reference_cases.json +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/examples/vbo_canine/results/decisions.jsonl +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/examples/vbo_canine/results/review_queue.csv +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/examples/vbo_canine/results/summary.md +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/examples/vbo_canine/sources/README.md +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/examples/vbo_canine/sources/manifest.json +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/examples/vbo_canine/sources/vbo-dogs.json +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/src/bioevidence_validator/config.py +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/src/bioevidence_validator/profiles/dataset-label.yaml +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/src/bioevidence_validator/profiles/general.yaml +0 -0
- {bioai_evidence_validator-0.4.1 → bioai_evidence_validator-0.7.0}/src/bioevidence_validator/profiles/literature-claim.yaml +0 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: The validator, CLI or GitHub Action does something it should not.
|
|
3
|
+
labels: [bug]
|
|
4
|
+
body:
|
|
5
|
+
- type: markdown
|
|
6
|
+
attributes:
|
|
7
|
+
value: |
|
|
8
|
+
Thanks for reporting. For security problems (for example a record admitted that a
|
|
9
|
+
documented rule should reject), use [private reporting](https://github.com/NingyuSUN/bioai-evidence-validator/security/advisories/new) instead.
|
|
10
|
+
**Do not paste real patient data**; a synthetic record that shows the behavior is enough.
|
|
11
|
+
- type: input
|
|
12
|
+
id: version
|
|
13
|
+
attributes:
|
|
14
|
+
label: Version
|
|
15
|
+
description: Output of `pip show bioai-evidence-validator` or `bioevidence --help` header, or the commit.
|
|
16
|
+
placeholder: "0.7.0"
|
|
17
|
+
validations:
|
|
18
|
+
required: true
|
|
19
|
+
- type: textarea
|
|
20
|
+
id: command
|
|
21
|
+
attributes:
|
|
22
|
+
label: Command or code
|
|
23
|
+
description: The exact command or Python call, including `--profile`.
|
|
24
|
+
render: shell
|
|
25
|
+
validations:
|
|
26
|
+
required: true
|
|
27
|
+
- type: textarea
|
|
28
|
+
id: input
|
|
29
|
+
attributes:
|
|
30
|
+
label: Smallest record, draft or profile that reproduces it
|
|
31
|
+
render: yaml
|
|
32
|
+
validations:
|
|
33
|
+
required: true
|
|
34
|
+
- type: textarea
|
|
35
|
+
id: expected
|
|
36
|
+
attributes:
|
|
37
|
+
label: Expected result
|
|
38
|
+
description: Which status, reason code or exit code did you expect, and which rule says so?
|
|
39
|
+
validations:
|
|
40
|
+
required: true
|
|
41
|
+
- type: textarea
|
|
42
|
+
id: actual
|
|
43
|
+
attributes:
|
|
44
|
+
label: Actual result
|
|
45
|
+
description: The report's `overall_status`, `findings` and exit code, or the error message.
|
|
46
|
+
render: json
|
|
47
|
+
validations:
|
|
48
|
+
required: true
|
|
49
|
+
- type: input
|
|
50
|
+
id: environment
|
|
51
|
+
attributes:
|
|
52
|
+
label: Environment
|
|
53
|
+
placeholder: "Python 3.12, Ubuntu 24.04"
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
blank_issues_enabled: true
|
|
2
|
+
contact_links:
|
|
3
|
+
- name: Security vulnerability
|
|
4
|
+
url: https://github.com/NingyuSUN/bioai-evidence-validator/security/advisories/new
|
|
5
|
+
about: Report privately; please do not open a public issue.
|
|
6
|
+
- name: Documentation
|
|
7
|
+
url: https://github.com/NingyuSUN/bioai-evidence-validator#readme
|
|
8
|
+
about: Usage, draft format, profiles and benchmarks.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
name: Feature request
|
|
2
|
+
description: Propose a change to the engine, CLI, formats or integrations.
|
|
3
|
+
labels: [enhancement]
|
|
4
|
+
body:
|
|
5
|
+
- type: textarea
|
|
6
|
+
id: problem
|
|
7
|
+
attributes:
|
|
8
|
+
label: Problem
|
|
9
|
+
description: What are you trying to do, and what gets in the way today?
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: proposal
|
|
14
|
+
attributes:
|
|
15
|
+
label: Proposal
|
|
16
|
+
description: The behavior you would like. For new rules, describe a record that should pass and one that should not.
|
|
17
|
+
validations:
|
|
18
|
+
required: true
|
|
19
|
+
- type: textarea
|
|
20
|
+
id: failure
|
|
21
|
+
attributes:
|
|
22
|
+
label: Failure mode
|
|
23
|
+
description: If this goes wrong, does it admit too much or block too much? How would a user notice?
|
|
24
|
+
- type: textarea
|
|
25
|
+
id: alternatives
|
|
26
|
+
attributes:
|
|
27
|
+
label: Alternatives considered
|
|
28
|
+
description: For example, doing it in a profile or an importer instead of the engine.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
name: Domain profile proposal
|
|
2
|
+
description: Propose an admission profile for a biological domain.
|
|
3
|
+
labels: [profile]
|
|
4
|
+
body:
|
|
5
|
+
- type: markdown
|
|
6
|
+
attributes:
|
|
7
|
+
value: |
|
|
8
|
+
Profiles decide which evidence each intended use requires; they do not change the engine.
|
|
9
|
+
See [docs/PROFILES.md](https://github.com/NingyuSUN/bioai-evidence-validator/blob/main/docs/PROFILES.md)
|
|
10
|
+
and the [community profile template](https://github.com/NingyuSUN/bioai-evidence-validator/tree/main/community/profiles/_template).
|
|
11
|
+
- type: input
|
|
12
|
+
id: domain
|
|
13
|
+
attributes:
|
|
14
|
+
label: Domain and assertion
|
|
15
|
+
placeholder: "Protein–protein interactions: protein A interacts_with protein B"
|
|
16
|
+
validations:
|
|
17
|
+
required: true
|
|
18
|
+
- type: textarea
|
|
19
|
+
id: uses
|
|
20
|
+
attributes:
|
|
21
|
+
label: Intended uses and their evidence requirements
|
|
22
|
+
description: For each use (e.g. research summary, knowledge-base admission, training data), which evidence types are required, and is human acceptance required?
|
|
23
|
+
validations:
|
|
24
|
+
required: true
|
|
25
|
+
- type: textarea
|
|
26
|
+
id: basis
|
|
27
|
+
attributes:
|
|
28
|
+
label: Basis for the policy
|
|
29
|
+
description: Community guideline, database policy or published standard the requirements follow (with links), or state that it is your own proposal.
|
|
30
|
+
validations:
|
|
31
|
+
required: true
|
|
32
|
+
- type: textarea
|
|
33
|
+
id: cases
|
|
34
|
+
attributes:
|
|
35
|
+
label: Example cases
|
|
36
|
+
description: At least one claim that should be admitted and one that should not, with the reason.
|
|
37
|
+
- type: checkboxes
|
|
38
|
+
id: pr
|
|
39
|
+
attributes:
|
|
40
|
+
label: Contribution
|
|
41
|
+
options:
|
|
42
|
+
- label: I am willing to open a pull request with the profile and example cases.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
## What and why
|
|
2
|
+
|
|
3
|
+
<!-- One purpose per pull request. Link the issue: "Closes #123". -->
|
|
4
|
+
|
|
5
|
+
## Admission boundary
|
|
6
|
+
|
|
7
|
+
<!-- Does this change what gets admitted, sent to review or rejected? If yes, say which
|
|
8
|
+
records move and why, and point to the tests that pin the new boundary. -->
|
|
9
|
+
|
|
10
|
+
- [ ] No change to admission decisions
|
|
11
|
+
- [ ] Changes admission decisions (explained above; tests on both sides of the boundary)
|
|
12
|
+
|
|
13
|
+
## Checklist
|
|
14
|
+
|
|
15
|
+
- [ ] `uv run --frozen ruff check .`, `uv run --frozen mypy` and `uv run --frozen pytest --cov` pass
|
|
16
|
+
- [ ] Committed benchmark results regenerated if report contents changed
|
|
17
|
+
- [ ] `CHANGELOG.md` updated if users will notice
|
|
18
|
+
- [ ] New third-party data has its license, attribution and exact version recorded
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
name: Repository checks
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
branches: [main]
|
|
5
|
+
pull_request:
|
|
6
|
+
permissions:
|
|
7
|
+
contents: read
|
|
8
|
+
jobs:
|
|
9
|
+
lint:
|
|
10
|
+
timeout-minutes: 10
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
- uses: actions/setup-python@v5
|
|
15
|
+
with:
|
|
16
|
+
python-version: '3.12'
|
|
17
|
+
- name: Install locked tooling
|
|
18
|
+
run: python -m pip install uv==0.12.17
|
|
19
|
+
- name: Install locked project
|
|
20
|
+
run: uv sync --frozen --extra dev
|
|
21
|
+
- name: Lint
|
|
22
|
+
run: uv run --frozen ruff check --output-format github .
|
|
23
|
+
- name: Type-check
|
|
24
|
+
run: uv run --frozen mypy
|
|
25
|
+
|
|
26
|
+
verify:
|
|
27
|
+
timeout-minutes: 15
|
|
28
|
+
strategy:
|
|
29
|
+
matrix:
|
|
30
|
+
include:
|
|
31
|
+
- os: ubuntu-latest
|
|
32
|
+
python: '3.11'
|
|
33
|
+
- os: ubuntu-latest
|
|
34
|
+
python: '3.12'
|
|
35
|
+
- os: ubuntu-latest
|
|
36
|
+
python: '3.13'
|
|
37
|
+
- os: windows-latest
|
|
38
|
+
python: '3.13'
|
|
39
|
+
runs-on: ${{ matrix.os }}
|
|
40
|
+
steps:
|
|
41
|
+
- uses: actions/checkout@v4
|
|
42
|
+
- uses: actions/setup-python@v5
|
|
43
|
+
with:
|
|
44
|
+
python-version: ${{ matrix.python }}
|
|
45
|
+
- name: Install locked tooling
|
|
46
|
+
run: python -m pip install uv==0.12.17
|
|
47
|
+
- name: Install locked project
|
|
48
|
+
run: uv sync --frozen --extra dev --python ${{ matrix.python }}
|
|
49
|
+
- name: Run tests with coverage (minimum in pyproject.toml)
|
|
50
|
+
run: uv run --frozen pytest --cov --cov-report=term
|
|
51
|
+
- name: Coverage summary
|
|
52
|
+
if: always()
|
|
53
|
+
shell: bash
|
|
54
|
+
run: uv run --frozen coverage report --format=markdown >> "$GITHUB_STEP_SUMMARY" || true
|
|
55
|
+
- name: Build distributable
|
|
56
|
+
run: uv build
|
|
57
|
+
- name: Verify installed wheel and CLI outside editable source
|
|
58
|
+
shell: bash
|
|
59
|
+
run: uv run --isolated --no-project --python ${{ matrix.python }} --with ./dist/*.whl python tools/check_distribution.py
|
|
60
|
+
|
|
61
|
+
action:
|
|
62
|
+
timeout-minutes: 10
|
|
63
|
+
strategy:
|
|
64
|
+
matrix:
|
|
65
|
+
os: [ubuntu-latest, windows-latest]
|
|
66
|
+
runs-on: ${{ matrix.os }}
|
|
67
|
+
steps:
|
|
68
|
+
- uses: actions/checkout@v4
|
|
69
|
+
- name: Admitted and review-required drafts pass with fail-on rejected
|
|
70
|
+
id: drafts
|
|
71
|
+
uses: ./
|
|
72
|
+
with:
|
|
73
|
+
files: examples/drafts/*.yaml
|
|
74
|
+
profile: literature-claim
|
|
75
|
+
format: draft
|
|
76
|
+
fail-on: rejected
|
|
77
|
+
- name: A rejected record fails the action
|
|
78
|
+
id: rejected
|
|
79
|
+
continue-on-error: true
|
|
80
|
+
uses: ./
|
|
81
|
+
with:
|
|
82
|
+
files: examples/dataset_label/*.json
|
|
83
|
+
profile: dataset-label
|
|
84
|
+
- name: Check action outcomes and outputs
|
|
85
|
+
shell: bash
|
|
86
|
+
run: |
|
|
87
|
+
test "${{ steps.drafts.outputs.admitted }}" = 1
|
|
88
|
+
test "${{ steps.drafts.outputs.review_required }}" = 1
|
|
89
|
+
test "${{ steps.rejected.outcome }}" = failure
|
|
90
|
+
test "${{ steps.rejected.outputs.rejected }}" = 1
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
name: Documentation
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
branches: [main]
|
|
5
|
+
pull_request:
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
concurrency:
|
|
10
|
+
group: docs-${{ github.ref }}
|
|
11
|
+
cancel-in-progress: true
|
|
12
|
+
jobs:
|
|
13
|
+
build:
|
|
14
|
+
timeout-minutes: 10
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v4
|
|
18
|
+
- uses: actions/setup-python@v5
|
|
19
|
+
with:
|
|
20
|
+
python-version: '3.12'
|
|
21
|
+
# Pinned: MkDocs 2.0 drops the plugin and theme system this site uses.
|
|
22
|
+
- name: Install MkDocs
|
|
23
|
+
run: python -m pip install mkdocs==1.6.1 mkdocs-material==9.7.7
|
|
24
|
+
- name: Build with strict link checking
|
|
25
|
+
run: mkdocs build --strict --site-dir _site
|
|
26
|
+
- if: github.event_name != 'pull_request'
|
|
27
|
+
uses: actions/upload-pages-artifact@v3
|
|
28
|
+
with:
|
|
29
|
+
path: _site
|
|
30
|
+
|
|
31
|
+
deploy:
|
|
32
|
+
if: github.event_name != 'pull_request'
|
|
33
|
+
needs: build
|
|
34
|
+
runs-on: ubuntu-latest
|
|
35
|
+
permissions:
|
|
36
|
+
pages: write
|
|
37
|
+
id-token: write
|
|
38
|
+
environment:
|
|
39
|
+
name: github-pages
|
|
40
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
41
|
+
steps:
|
|
42
|
+
- id: deployment
|
|
43
|
+
uses: actions/deploy-pages@v4
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.7.0 — Expert review, quality checks, community and documentation site
|
|
4
|
+
|
|
5
|
+
- Add `bioevidence review` (`check`, `agreement`, `adjudication-sheet`, `score`, `freeze`)
|
|
6
|
+
implementing the gold-standard protocol: strict annotation checks, Krippendorff's α with
|
|
7
|
+
bootstrap interval and Cohen's κ (both cross-checked against reference implementations),
|
|
8
|
+
adjudication of disagreements, scoring on the test split with hash-bound joins, and frozen
|
|
9
|
+
manifests. It never produces labels.
|
|
10
|
+
- Add a blinded ClinVar expert-review kit (`evaluation/clinvar_review/`): all 95 variants where
|
|
11
|
+
the validator and NCBI disagree plus 95 stratum-matched controls, an Excel workbook with
|
|
12
|
+
dropdowns, a reviewer rubric, a private key, and an importer into the protocol format.
|
|
13
|
+
- CI runs ruff and mypy, and enforces a 95% test-coverage minimum (currently 98%).
|
|
14
|
+
- Add CONTRIBUTING, CODE_OF_CONDUCT (Contributor Covenant 2.1), SECURITY, issue forms and a
|
|
15
|
+
pull request template.
|
|
16
|
+
- Add `community/profiles/`: contributed domain profiles whose example cases are built,
|
|
17
|
+
validated and checked against expected outcomes in CI; `_template/` to copy.
|
|
18
|
+
- Add a documentation site (MkDocs, strict link checking) published to GitHub Pages.
|
|
19
|
+
- The canine 0.3 implementation is also preserved at the `canine-0.3` tag.
|
|
20
|
+
- No change to validation decisions or report format; both benchmarks reproduce 0.6.0 exactly
|
|
21
|
+
apart from `validator_version`.
|
|
22
|
+
|
|
23
|
+
## 0.6.0 — ClinVar case and standards alignment
|
|
24
|
+
|
|
25
|
+
- Add a second real-data case: ClinVar germline classifications. 5,026 sampled variants
|
|
26
|
+
from the 2023-09 release are built from per-submission evidence and validated with a
|
|
27
|
+
ClinVar-style profile; decisions are compared with NCBI's own 2023-09 review status and
|
|
28
|
+
with each classification's 2026-09 outcome, plus controlled faults and a trust-boundary
|
|
29
|
+
cohort. Frozen, hash-pinned sample; rebuild script verifies the three upstream files.
|
|
30
|
+
- Add `docs/STANDARDS.md`, mapping the record model to ECO, Biolink 4.4.4, GA4GH VA-Spec
|
|
31
|
+
1.0.1 and PROV-O, with mapping strength and caveats.
|
|
32
|
+
- Annotate `ExtractionMethod` values with ECO meanings in the LinkML schema. The compiled
|
|
33
|
+
JSON Schema, and therefore every report's `schema_sha256`, is unchanged.
|
|
34
|
+
- The VBO benchmark summary changes only `validator_version`.
|
|
35
|
+
|
|
36
|
+
## 0.5.0 — Drafts, LLM draft schema and GitHub Action
|
|
37
|
+
|
|
38
|
+
- Add compact YAML/JSON drafts: `bioevidence build` and `build_record()` derive identifiers,
|
|
39
|
+
group evidence lines and hash named local files, without supplying scope, method, times
|
|
40
|
+
or review decisions. Strict parsing rejects unknown, missing and out-of-choice fields.
|
|
41
|
+
- Add `bioevidence draft-schema` and `draft_json_schema()`: a per-profile JSON Schema for
|
|
42
|
+
drafts, e.g. for LLM structured output.
|
|
43
|
+
- Add a composite GitHub Action that validates records or drafts in pull requests, with a
|
|
44
|
+
job summary, file annotations and count outputs.
|
|
45
|
+
- Add a Colab quickstart notebook and draft examples.
|
|
46
|
+
- Export `build_record`, `load_draft`, `draft_json_schema` and `validate_record` from the package root.
|
|
47
|
+
|
|
48
|
+
## 0.4.1 — Required-evidence quality and real-source evaluation
|
|
49
|
+
|
|
50
|
+
- Apply extraction-method quality gates to each required evidence type independently.
|
|
51
|
+
- Prevent unrelated manual/parser evidence from admitting an LLM-only required result.
|
|
52
|
+
- Add an attributed, frozen VBO canine name-mapping case and source rebuild script.
|
|
53
|
+
- Evaluate 72 real-source names, 160 controlled faults, and 16 explicit trust-boundary cases separately.
|
|
54
|
+
- Preserve generic main and the legacy canine-breed branch.
|
|
55
|
+
- Publish to PyPI from version tags; add package metadata and citation file.
|
|
56
|
+
- Reject CLI input nested deeper than 100 levels (exit 3) on every platform and Python version.
|
|
57
|
+
|
|
58
|
+
## 0.4.0 — Domain-neutral main
|
|
59
|
+
|
|
60
|
+
- Preserve canine 0.3 functionality on the `canine-breed` branch.
|
|
61
|
+
- Replace canine defaults with a generic entity/relation/evidence schema and strict YAML profiles.
|
|
62
|
+
- Add general, literature-claim, dataset-label, and custom assay examples.
|
|
63
|
+
- Bind human adjudications to statements and uses; enforce evidence scope and reference integrity.
|
|
64
|
+
- Replace `--policy` with `--profile`; add profile discovery and generic audit fields.
|
|
65
|
+
- Remove the canine SQLite command from main. See `docs/MIGRATION-0.4.md` for breaking changes.
|
|
66
|
+
|
|
67
|
+
## 0.3.0 — Evidence and snapshot contract hardening
|
|
68
|
+
|
|
69
|
+
- Require resolved supporting evidence, selected-candidate consistency and
|
|
70
|
+
compatible claim predicates; block relationship claims from sample/frequency label use.
|
|
71
|
+
- Enforce scope exclusions from concept scope, use only supporting scope evidence,
|
|
72
|
+
reject blank provenance and unresolved references in unused evidence.
|
|
73
|
+
- Reject incomplete/duplicate/unknown policy configuration; custom schemas cannot
|
|
74
|
+
relax the packaged structural baseline. Snapshot validation context per batch.
|
|
75
|
+
- Reject duplicate database IDs, WAL/SHM/journal sidecars, malformed manifests
|
|
76
|
+
and unrecognized boolean evidence. Include resolution-row provenance,
|
|
77
|
+
limits/accounting and batch hashes; publish the completion summary last.
|
|
78
|
+
- Preserve earlier policy files, synthetic examples and operational CLI exit codes.
|
|
79
|
+
|
|
80
|
+
## 0.2.0 — Evidence admission contracts and reproducible CLI
|
|
81
|
+
|
|
82
|
+
- Version schema/policy 0.2; preserve policy 0.1 and record generated-schema hashes.
|
|
83
|
+
- Prevent withdrawn statements or conflicting human judgments from silently being admitted.
|
|
84
|
+
- Reject missing, empty, malformed, duplicated or unknown requested uses.
|
|
85
|
+
- Make structural and identity errors block the entire record, including unknown uses.
|
|
86
|
+
- Require evidence collections and reject duplicate IDs before dictionary lookup.
|
|
87
|
+
- Return structured operational CLI errors; parse UTF-8 strictly and write reports atomically.
|
|
88
|
+
- Add regression tests, a Linux/Windows CI workflow and an installed-wheel smoke check.
|
|
89
|
+
- Include the Apache-2.0 license already declared in project metadata.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Code of conduct
|
|
2
|
+
|
|
3
|
+
This project adopts the
|
|
4
|
+
[Contributor Covenant, version 2.1](https://www.contributor-covenant.org/version/2/1/code_of_conduct/)
|
|
5
|
+
as its code of conduct. It applies to all project spaces (issues, pull requests,
|
|
6
|
+
discussions and reviews) and to anyone representing the project elsewhere.
|
|
7
|
+
|
|
8
|
+
In short: be respectful and constructive, assume good faith, critique work rather than
|
|
9
|
+
people, and remember that contributors bring expertise from many fields, from biocuration
|
|
10
|
+
to software engineering.
|
|
11
|
+
|
|
12
|
+
## Reporting
|
|
13
|
+
|
|
14
|
+
Report unacceptable behavior to the maintainer, Ningyu Sun, at <woshiwosunny@gmail.com>.
|
|
15
|
+
Reports are handled confidentially, and the enforcement guidelines of the Contributor
|
|
16
|
+
Covenant 2.1 apply.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Thanks for helping make AI-assisted biocuration safer. Contributions of every size are
|
|
4
|
+
welcome: a typo fix, a bug report with a failing record, a new domain profile, or a new
|
|
5
|
+
real-data benchmark.
|
|
6
|
+
|
|
7
|
+
By participating you agree to follow the [code of conduct](CODE_OF_CONDUCT.md).
|
|
8
|
+
|
|
9
|
+
## Ways to contribute
|
|
10
|
+
|
|
11
|
+
| You have… | Start here |
|
|
12
|
+
|---|---|
|
|
13
|
+
| A record the validator judges wrongly | [Bug report](https://github.com/NingyuSUN/bioai-evidence-validator/issues/new?template=bug_report.yml); attach the smallest record or draft that reproduces it |
|
|
14
|
+
| An admission policy for your domain | [Profile proposal](https://github.com/NingyuSUN/bioai-evidence-validator/issues/new?template=profile_proposal.yml), then a pull request to [`community/profiles/`](community/profiles/README.md) |
|
|
15
|
+
| An idea for the engine, CLI or formats | [Feature request](https://github.com/NingyuSUN/bioai-evidence-validator/issues/new?template=feature_request.yml) first, so we can agree on the contract before code |
|
|
16
|
+
| A security problem | Do **not** open an issue; see [SECURITY.md](SECURITY.md) |
|
|
17
|
+
|
|
18
|
+
Issues labelled [`good first issue`](https://github.com/NingyuSUN/bioai-evidence-validator/labels/good%20first%20issue)
|
|
19
|
+
are scoped to be finished in an afternoon.
|
|
20
|
+
|
|
21
|
+
## Development setup
|
|
22
|
+
|
|
23
|
+
Python 3.11+ and [uv](https://docs.astral.sh/uv/):
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
git clone https://github.com/NingyuSUN/bioai-evidence-validator.git
|
|
27
|
+
cd bioai-evidence-validator
|
|
28
|
+
uv sync --frozen --extra dev
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Before opening a pull request, run what CI runs:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
uv run --frozen ruff check .
|
|
35
|
+
uv run --frozen mypy
|
|
36
|
+
uv run --frozen pytest --cov
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
CI also runs the tests on Linux (Python 3.11–3.13) and Windows, builds the wheel and
|
|
40
|
+
smoke-tests it outside the source tree, and runs the GitHub Action. Coverage must stay at
|
|
41
|
+
or above the minimum in `pyproject.toml`.
|
|
42
|
+
|
|
43
|
+
## Ground rules for changes
|
|
44
|
+
|
|
45
|
+
This project's value is that it **fails closed** and **says exactly what it checked**.
|
|
46
|
+
Changes are reviewed against that:
|
|
47
|
+
|
|
48
|
+
- **No silent weakening.** A change that admits something previously rejected needs an
|
|
49
|
+
explicit reason in the pull request and a test that shows the new boundary.
|
|
50
|
+
- **Every rule has a test on both sides**: a record that passes and a minimal one that fails.
|
|
51
|
+
- **Reports stay reproducible.** If a change alters report contents, the committed benchmark
|
|
52
|
+
results must be regenerated in the same pull request, and the diff explained.
|
|
53
|
+
- **Domain logic stays out of the engine.** New domains are profiles and importers, not
|
|
54
|
+
special cases in `engine.py`.
|
|
55
|
+
- **Honest limits.** Benchmarks state what their labels are (source-derived, authored, or
|
|
56
|
+
independently reviewed) and what they do not measure.
|
|
57
|
+
- Match the surrounding style; ruff enforces correctness rules, not formatting.
|
|
58
|
+
|
|
59
|
+
## Contributing a domain profile
|
|
60
|
+
|
|
61
|
+
Community profiles live in [`community/profiles/`](community/profiles/README.md). Each one is
|
|
62
|
+
a folder with a profile, a short README and example cases whose expected outcomes are
|
|
63
|
+
checked by the test suite. Copy `community/profiles/_template/` to get started.
|
|
64
|
+
|
|
65
|
+
## Pull requests
|
|
66
|
+
|
|
67
|
+
- Keep each pull request to one purpose; link the issue it resolves.
|
|
68
|
+
- Update `CHANGELOG.md` under a new heading if users will notice the change.
|
|
69
|
+
- New third-party data needs its license, attribution and exact source version recorded,
|
|
70
|
+
as in `examples/*/sources/README.md`.
|
|
71
|
+
|
|
72
|
+
## Releases
|
|
73
|
+
|
|
74
|
+
Maintainers release by bumping the version in `pyproject.toml` and
|
|
75
|
+
`src/bioevidence_validator/__init__.py`, adding a `CHANGELOG.md` section, and pushing a
|
|
76
|
+
`vX.Y.Z` tag. The release workflow tests, publishes to PyPI and creates the GitHub release.
|