Implements the 14-criterion DoI checklist as a runnable gate with API,
MCP tools, CLI script, and dashboard integration.
Core components:
- api/doi_engine.py — async engine evaluating all 14 criteria (asyncio.to_thread
for non-blocking HTTP self-calls), shared by API and CLI
- api/schemas/doi.py — DoICriterion, DoIReport, DoISummaryEntry schemas
- api/routers/repos.py — GET /repos/{slug}/doi + GET /repos/doi/summary
- scripts/check_doi.py — CLI: make check-doi REPO=<slug> / check-doi-all
- mcp_server/server.py — check_repo_doi(), get_doi_summary() tools
Dashboard (repos.md):
- DoI tier badge per repo (None/Core/Standard/Full) colour-coded red→green
- Domain block shows lowest DoI tier across its repos
- DoI KPI card in summary row
- DoI filter in All Repos Table
- Link to Repository DoI policy page
Also fixes: TPSC snapshots 500 error (missing nested selectinload for
catalog_entry relationship in list_snapshots endpoint).
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
30 lines
574 B
Python
30 lines
574 B
Python
from pydantic import BaseModel
|
|
|
|
|
|
class DoICriterion(BaseModel):
|
|
id: str
|
|
label: str
|
|
tier: str
|
|
status: str # pass | fail | warn | skip
|
|
detail: str = ""
|
|
|
|
|
|
class DoIReport(BaseModel):
|
|
repo_slug: str
|
|
tier: str # none | core | standard | full
|
|
core_pass: bool
|
|
standard_pass: bool
|
|
full_pass: bool
|
|
criteria: list[DoICriterion] = []
|
|
checked_at: str
|
|
|
|
|
|
class DoISummaryEntry(BaseModel):
|
|
repo_slug: str
|
|
domain_slug: str | None
|
|
tier: str
|
|
core_pass: bool
|
|
standard_pass: bool
|
|
full_pass: bool
|
|
checked_at: str
|