Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions docs/evidence/CHECKLIST_RELEASE_CANDIDATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Release Candidate Checklist Artifact

Artifacts that should exist before a release candidate is declared.

## Checklist
- [ ] `make full-reproducibility-report` succeeds
- [ ] `python scripts/check_doc_links.py` — 0 broken links
- [ ] `python scripts/safety/check_claims.py` — 0 overclaiming
- [ ] `python3 -m pytest -q` — all tests pass
- [ ] PUBLICATION_PACK.md checklist is complete
- [ ] METRICS_CURRENT.md is up to date
- [ ] Evidence certificates are regenerated
- [ ] Lab batch pack is built (`make lab-batch-pack`)
- [ ] Decision log is current
- [ ] Limitations overview is accurate

## Related
- `docs/review/PUBLICATION_PACK.md`
- `docs/evidence/DOCS_READINESS_CHECKLIST.md`
30 changes: 30 additions & 0 deletions docs/evidence/GUIDE_MIGRATION_GENERATOR.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Artifact Migration Guide Generator

Template for creating artifact migration guides.

## Template
```markdown
# Migration Guide: [Old Format] → [New Format]

## What Changed
Brief description of the format change.

## Why
Why the change was necessary.

## Migration Steps
1. Step-by-step instructions.
2. Commands to run.
3. Verification steps.

## Backward Compatibility
- Old format supported until: [date or version]
- Converter available: [path or command]

## Related
- [Link to schema changelog]
- [Link to deprecation policy]
```

## Current Status
No migrations are currently needed. This template is for future use.
26 changes: 26 additions & 0 deletions docs/evidence/GUIDE_OUTPUT_CHECKSUM_LOCKFILE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Output Checksum Lockfile

Records expected checksums for generated outputs.

## Format
```text
sha256:<hash> outputs/demo_ranked.jsonl
sha256:<hash> outputs/demo_report.md
```

## Usage
After running a known-good pipeline, record the checksums:
```bash
sha256sum outputs/*.jsonl outputs/*.md > outputs/checksums.lockfile
```

To verify:
```bash
sha256sum -c outputs/checksums.lockfile
```

## Rules
- Lockfiles should be updated when pipeline behavior intentionally changes.
- CI should fail if lockfiles don't match (detects unexpected changes).
- Lockfiles are stored in `outputs/` (git-ignored).
- If outputs are non-deterministic (timestamps), exclude those files.
28 changes: 28 additions & 0 deletions docs/evidence/GUIDE_PUBLIC_READINESS_DRY_RUN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Public Readiness Dry-Run Command

Check if the project is ready for public sharing.

## Usage
```bash
make full-reproducibility-report
python scripts/check_doc_links.py
python scripts/safety/check_claims.py
python3 -m pytest -q
```

## What It Checks
- All tests pass
- No broken doc links
- No overclaiming language
- Reproducibility report succeeds
- Phase 4 artifacts exist

## Exit Codes
| Code | Meaning |
|:----:|---------|
| 0 | Ready for public sharing |
| Non-zero | Check the specific failure |

## Related
- `docs/evidence/GUIDE_PUBLIC_READINESS.md`
- `docs/review/RELEASE_DRY_RUN_GUIDE.md`
21 changes: 21 additions & 0 deletions docs/evidence/GUIDE_RELEASE_NOTES_GENERATOR.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Release Notes Generator from Local Metadata

How release notes are generated.

## Current Process
Release notes are written manually at release time, following the
format in `docs/evidence/GUIDE_RELEASE_NOTES_WRITING.md`.

## Metadata Sources
- Git log: `git log --oneline --no-decorate v0.5.N-1..HEAD`
- GitHub issues: `gh issue list --state closed --milestone "v0.5.N"`
- GitHub PRs: `gh pr list --state merged --base main`

## Manual Steps
1. Review git log for notable changes.
2. Group changes by type (Added, Changed, Fixed).
3. Write a summary sentence.
4. Review for overclaiming language.

## Status
Release notes are currently written manually. Automation is a future goal.
16 changes: 16 additions & 0 deletions docs/evidence/POLICY_FORMAT_DEPRECATION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Artifact Format Deprecation Policy

How artifact formats are deprecated and retired.

## Deprecation Process
1. Announce the deprecation in the decision log and release notes.
2. Keep the old format working for one release cycle.
3. Provide a migration path or converter.
4. After one release cycle, remove the old format support.
5. Update all documentation referencing the old format.

## Rules
- Breaking format changes must be announced at least one release in advance.
- Deprecated formats must still be readable for one release cycle.
- Format changes must be documented in the schema changelog.
- Data in old formats should be migrated automatically when possible.
18 changes: 18 additions & 0 deletions docs/evidence/REPORT_BACKWARD_COMPAT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Backward Compatibility Report

Tracks backward compatibility of pipeline outputs.

| Artifact | Current Version | Breaking Changes Planned | Migration Path |
|----------|:---------------:|:------------------------:|:---------------|
| Evidence certificates | 1.0 | None | — |
| Lab results | 1.0 | None | — |
| Run manifests | 1.0 | None | — |
| Batch reports | 1.0 | None | — |
| Panel CSVs | 1.0 | None | — |

## Rules
- Breaking changes must be documented in the decision log.
- A breaking change is any change that would cause downstream code to fail.
- Adding optional fields is NOT a breaking change.
- Removing or renaming fields IS a breaking change.
- Changing field types IS a breaking change.
21 changes: 21 additions & 0 deletions tests/test_golden_artifact_fixtures.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
"""Test golden artifact fixtures match expected schema."""
import json
from pathlib import Path


def test_evidence_certificate_schema():
schema = json.loads(Path("schemas/candidate.schema.json").read_text())
assert "candidate_id" in str(schema)
assert "scores" in str(schema)


def test_lab_result_schema():
schema = json.loads(Path("schemas/lab_result.schema.json").read_text())
for field in ["candidate_id", "assay_type", "result_value"]:
assert field in str(schema), f"Missing {field}"


def test_run_manifest_schema():
schema = json.loads(Path("schemas/run_manifest.schema.json").read_text())
for field in ["run_id", "pipeline_version", "generated_at"]:
assert field in str(schema), f"Missing {field}"
22 changes: 22 additions & 0 deletions tests/test_limitations_coverage.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
"""Test that limitations are documented for key areas."""
from pathlib import Path


def test_limitations_overview_exists():
assert Path("docs/evidence/LIMITATIONS_OVERVIEW.md").exists()


def test_limitations_covers_key_areas():
text = Path("docs/evidence/LIMITATIONS_OVERVIEW.md").read_text()
for area in ["Model", "Data", "Benchmark", "Calibration", "Safety"]:
assert area in text, f"Missing limitations section: {area}"


def test_simulation_benchmark_has_limitations():
text = Path("docs/evidence/SIMULATION_BENCHMARK.md").read_text()
assert "No improvement" in text or "blocked" in text or "experimental" in text


def test_metrics_current_has_caveats():
text = Path("docs/evidence/METRICS_CURRENT.md").read_text()
assert "limitation" in text.lower() or "caveat" in text.lower()
22 changes: 22 additions & 0 deletions tests/test_schema_changelog.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
"""Test schema changelog consistency."""
import json
from pathlib import Path


def test_schema_files_exist():
schema_dir = Path("schemas")
schemas = list(schema_dir.glob("*.json"))
assert len(schemas) >= 5, f"Only {len(schemas)} schemas found"


def test_schemas_are_valid_json():
for f in Path("schemas").glob("*.json"):
data = json.loads(f.read_text())
assert "$schema" in data, f"{f.name} missing $schema"
assert "type" in data, f"{f.name} missing type"


def test_schemas_have_titles():
for f in Path("schemas").glob("*.json"):
data = json.loads(f.read_text())
assert "title" in data, f"{f.name} missing title"
Loading