REUSE-WP-0017-T01: explicit capability_status on roster + coverage split in report gaps
Some checks failed
ci / validate-registry (push) Has been cancelled

Adds capability_status: has|none|pending to every roster row (10 has /
51 pending currently), a coverage_ratio headline, and splits the gap
report's empty-scaffold section into unclassified vs explicitly-none.
Adds templates/NO_CAPABILITIES.template.md for the no-capability marker.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-06 18:36:05 +02:00
parent 493f23123c
commit 8219a5d253
6 changed files with 154 additions and 11 deletions

View File

@@ -110,6 +110,9 @@ def collect_gap_report(
r for r in repos
if r.get("status") == "established" and r.get("capability_count", 0) == 0
]
unclassified = [r for r in empty_scaffolds if r.get("capability_status", "pending") == "pending"]
explicit_none = [r for r in empty_scaffolds if r.get("capability_status") == "none"]
covered = [r for r in repos if r.get("capability_status") in ("has", "none")]
seeded = [r for r in repos if r.get("seed_from_reuse_surface")]
dedup_pending = [
{
@@ -133,6 +136,11 @@ def collect_gap_report(
],
"empty_scaffold_count": len(empty_scaffolds),
"empty_scaffolds": [r["slug"] for r in empty_scaffolds],
"unclassified_count": len(unclassified),
"unclassified": [r["slug"] for r in unclassified],
"explicit_none_count": len(explicit_none),
"explicit_none": [r["slug"] for r in explicit_none],
"coverage_ratio": f"{len(covered)}/{len(repos)}" if repos else "0/0",
"seeded_repos": [
{
"slug": r["slug"],
@@ -180,11 +188,23 @@ def format_gap_markdown(report: dict[str, Any]) -> str:
lines.append("- none (owner rows migrated to canonical repos)")
lines.append("")
empty_count = report.get("empty_scaffold_count", 0)
lines.append(f"## Empty scaffolds ({empty_count})")
slugs = report.get("empty_scaffolds", [])
if slugs:
for slug in slugs:
lines.append(f"**Capability coverage:** {report.get('coverage_ratio', '?')} "
"(repos with a capability or an explicit no-capability marker)")
lines.append("")
unclassified = report.get("unclassified", [])
lines.append(f"## Unclassified scaffolds ({report.get('unclassified_count', len(unclassified))})")
if unclassified:
for slug in unclassified:
lines.append(f"- `{slug}`")
else:
lines.append("- none")
lines.append("")
explicit_none = report.get("explicit_none", [])
lines.append(f"## Explicitly no-capability ({report.get('explicit_none_count', len(explicit_none))})")
if explicit_none:
for slug in explicit_none:
lines.append(f"- `{slug}`")
else:
lines.append("- none")