Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-23 16:20 UTC

specfuse / loop

Local-first executor for the Specfuse Plan + Work Unit gate-cycle methodology.

PythonApache-2.0★ 0 estrellas⑂ 0 forksdesde may 2026Ver en GitHub ↗

specfuse/loop tiene un índice de salud de 58 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (76/100) y la más baja, Community & Adoption (43/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

58
global / 100
Moderado

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

58
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

specfuseOrganización
0 seguidores4 repositorios públicosdesde abr 2026

Este repositorio está respaldado por una organización: una custodia compartida y responsable que puede sobrevivir a cualquier mantenedor individual.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
PyPIspecfuse-loop0.3.24-26hace 0 díasspecfuseagentsplanningralphgate-cycle

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

76Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
5.5/36Cadencia de commits — 8/52 semanas con commits
18/18Volumen de commits — 201 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year201
human_commit_share0,95
days_since_last_push0
active_weeks_last_year8
Cómo se puntúa
27/27Publica versiones — 15 versiones publicadas
36/36Recencia de las versiones — última versión hace 13 días
27/27Cadencia de publicación — una versión cada ~1,8 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count15
latest_release_tagv0.3.12
releases_from_tagsno
days_since_latest_release13
mean_days_between_releases1,8
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

43En riesgo · 18% del índice global
Cómo se puntúa
0/60Estrellas — 0 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (Apache-2.0)
18/18Guía CONTRIBUTING
13.5/13.5Código de conducta
0/7.2Plantilla de issues
6.3/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conduct
has_pull_request_template

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

53Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
45.3/46.8Resolución de issues — 97% de issues cerradas
38/38.3Aceptación de PR — 156/157 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/29 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs156
open_issues2
closed_issues65
issue_closed_ratio0,97
closed_unmerged_prs1
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
0/25Alcance del propietario — 0 seguidores de specfuse
5.6/25Trayectoria — 4 repos públicos, cuenta de ~0 años
Datos de entrada utilizados
followers0
owner_typeOrganization
is_verified
owner_loginspecfuse
public_repos4
account_age_days97
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en pypi
35/35Recencia de publicación — última publicación hace 0 días
20/20Historial de versiones — 26 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesspecfuse-loop
ecosystemspypi
any_deprecatedno
min_days_since_publish0

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

67Moderado · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 3 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentación

65Moderado
Cómo se puntúa
30/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
0/10Topics
0/10Wiki
Datos de entrada utilizados
topics
has_wikino
homepage
has_readme
has_docs_dir
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

49En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — sin datos
2.5/2.5CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/29 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
2/5Security-Policy — security policy file detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4,9
Excluidos de la puntuación (sin datos o no aplicable): branch_protection, signed_releases. Los pesos restantes se han renormalizado.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

59Moderado · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — .claude/CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 95 de 95 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share1
agent_instruction_files.claude/CLAUDE.md
agent_instruction_max_bytes454
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
0/11Configuración de lint / formato
0/11Verificación estática de tipos
0/10Entorno reproducible
10/10Práctica demostrada con agentes — 93 de los últimos 100 commits con autoría o crédito de agente
8/8Mantenimiento automatizado — 5 de los últimos 100 commits son actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfiles
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,93
toolchain_manifests
dependency_bot_commit_share0,05
Cómo se puntúa
0/45Código verificable por tipos — Python sin configuración de verificación de tipos
54.6/55Tamaños de archivo manejables — 1/148 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languagePython
largest_source_bytes246.031
source_files_sampled148
oversized_source_files1

Datos clave

0estrellas de GitHub
1contribuidores
201commits en los últimos 12 meses
0días desde el último push
15versiones publicadas
1factor bus
2issues abiertas
PyPIecosistemas de paquetes

Advertencias de recopilación de datos

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index pypi:specfuse-loop@0.3.24; advisories assessed against the repository dependency graph instead

Más detalle

OpenSSF Scorecard 4.9 / 10
4.9agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-23 16:19 UTC

10Binary-Artifactsno binaries found in the repo
n/dBranch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
10CI-Tests30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/29 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
4Security-Policysecurity policy file detected
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 2901,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "Shell": 35281,
        "Python": 1562824,
        "Vim Snippet": 924
      },
      "pushed_at": "2026-07-23T16:01:39Z",
      "created_at": "2026-05-30T17:39:19Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-23T15:47:04Z",
      "description": "Local-first executor for the Specfuse Plan + Work Unit gate-cycle methodology.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Python",
      "significant_languages": [
        "Python"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "Organization",
      "login": "specfuse",
      "company": null,
      "location": null,
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/276717733?v=4",
      "created_at": "2026-04-16T20:05:25Z",
      "is_verified": null,
      "public_repos": 4,
      "account_age_days": 97
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.3.12",
          "kind": "patch",
          "published_at": "2026-07-10T15:10:05Z"
        },
        {
          "tag": "v0.3.11",
          "kind": "patch",
          "published_at": "2026-07-10T15:10:04Z"
        },
        {
          "tag": "v0.3.10",
          "kind": "patch",
          "published_at": "2026-07-10T15:10:03Z"
        },
        {
          "tag": "v0.3.9",
          "kind": "patch",
          "published_at": "2026-07-10T15:10:02Z"
        },
        {
          "tag": "v0.3.8",
          "kind": "patch",
          "published_at": "2026-07-10T15:10:01Z"
        },
        {
          "tag": "v0.3.7",
          "kind": "patch",
          "published_at": "2026-07-04T19:26:34Z"
        },
        {
          "tag": "v0.3.6",
          "kind": "patch",
          "published_at": "2026-07-03T12:22:34Z"
        },
        {
          "tag": "v0.3.5",
          "kind": "patch",
          "published_at": "2026-06-25T02:21:29Z"
        },
        {
          "tag": "v0.3.4",
          "kind": "patch",
          "published_at": "2026-06-24T14:50:22Z"
        },
        {
          "tag": "v0.3.3",
          "kind": "patch",
          "published_at": "2026-06-24T13:15:54Z"
        },
        {
          "tag": "v0.3.2",
          "kind": "patch",
          "published_at": "2026-06-23T16:09:15Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2026-06-22T15:00:09Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-06-22T13:08:12Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-07-10T15:10:00Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-06-07T12:18:32Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "4d4854a1efe8374a5337b43ff28c594836b5ed94",
          "body": "* chore(loop): sync scaffold to 0.2.0\n\n* chore(release): bump specfuse-loop to 0.3.24\n\nShips the `blocked` roadmap feature status + /block-feature skill (#224):\nnew status distinct from `deferred`, driver non-dispatch handling, and the\nauto-archive orphan-anchor fix.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.24 (#225)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-23T15:46:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b0979394ab547c87be967a1e021a009f676a4e6f",
          "body": "…224)\n\n* feat(roadmap): add `blocked` feature status + /block-feature skill\n\nSupport a `blocked` roadmap feature status distinct from `deferred`. A\nblocked feature names an unmet dependency — an ADR awaiting approval or\nan upstream FEAT-ID — and links to it from a `**Blocked by.**` block in\nits deta\n[…]\nrphaned).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(roadmap): add `blocked` feature status + /block-feature skill (#…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-23T15:41:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2081b5d41ad2e91300dea87dd954eed93c0f10bb",
          "body": "* chore(loop): sync scaffold to 0.2.0\n\n* chore(release): bump specfuse-loop to 0.3.23\n\nShips the FEAT-2026-0049 follow-through set: planning-discipline\nsection-presence lint (#216), manifest-scoped upgrade prune + clobber\nwarnings (#217), close-discipline rule with the three substantive-close\nobliga\n[…]\nctions/setup-python 7 CI bump (#174).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.23 (#222)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-23T01:37:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2c8f44ada4e914670ab87861ccfb043816882024",
          "body": "…) (#221)\n\ngate_spent_usd summed cost only for done WUs, so a WU sitting\nblocked_human across re-arms contributed $0 to the per-gate brake no\nmatter how much it had burned — FEAT-2026-0049/WU-06 accumulated $30.29\nacross 9 attempts while blocked/re-armed, invisible to cost_budget_usd;\nmost of the fe\n[…]\n— is fully visible to the brake while still\nblocked. Full suite 1282 tests OK; ruff clean.\n\nCloses #219.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): budget brake counts recorded cost on every WU status (#219…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-23T01:35:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b82d3de21617182450301f5e563214e4c00a6d99",
          "body": "…d arm-gate (#209 item 6) (#220)\n\nThe lint checks (#216) verify artifacts after the fact; these lines put\nthe discipline at the decision points themselves:\n\n- draft-feature §4: run the existing-mechanism search before drafting any\n  WU that designs enforcement or measurement (planning-discipline §1)\n[…]\n confirm flag-introducing drafts carry their flag-scope table (§3).\n\nCanonical + vendored copies synced.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(skills): planning-discipline flow references in draft-feature an…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-23T01:34:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6741c424eda871dd4b6d4e107fcedc18eec02a7e",
          "body": "…se obligations (#218)\n\n* chore(loop): sync scaffold to 0.2.0\n\n* feat(scaffold): close-discipline rule — the three generic substantive-close obligations (#215)\n\nFEAT-2026-0049's substantive-close contract surfaced three checks that are\ngeneric — every project's close should do them — but that no shi\n[…]\n; bats 5/5; ruff clean.\n\nCloses #215.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(scaffold): close-discipline rule — three generic substantive-clo…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-23T01:32:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9f047c53f945a2af9c673921271c725dabc1ef71",
          "body": "…g unknown files (#214) (#217)\n\nupgrade_specfuse deleted ANY file under a versioned dir that the shipped\nseed didn't carry, and silently overwrote name collisions — a project-\nauthored rule dropped into .specfuse/rules/ was destroyed on the next\nupgrade with no trace. Layer 1 (rules-local/, 0.3.22) \n[…]\nkeeps\nunknown files and suppresses clobber warnings. Full suite 1284 tests OK;\nruff clean.\n\nCloses #214.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(scaffold): prune only manifest-owned files; warn before clobberin…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-23T01:30:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e5cccbe04b832b38ccc3860d6fe0ed44ce559685",
          "body": "Second half of #201, unblocked by the FEAT-2026-0049 planning-discipline\ndrop (#211) which made the section names canonical. check_planning_sections\nWARNs when:\n\n- PLAN.md lacks an 'Existing-mechanism search' or 'Escalation-predicate\n  satisfiability' section (presence only — the template's explicit\n[…]\n satisfies, passed\ngates and sealed features exempt. Full suite 1287 tests OK; ruff clean.\n\nCloses #201.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(lint): planning-discipline section-presence WARNs (#201) (#216)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-23T01:27:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1382ea6b909773916d62d51d0b029ce83e5ae9aa",
          "body": "Bumps [actions/setup-python](https://github.com/actions/setup-python) from 6 to 7.\n- [Release notes](https://github.com/actions/setup-python/releases)\n- [Commits](https://github.com/actions/setup-python/compare/v6...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-python\n  dependency-\n[…]\nd-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: Christian Labonté <clabonte@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/setup-python from 6 to 7 (#174)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-23T01:25:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b65d5e3e2397d910d4f7fe425678202734755d87",
          "body": "* chore(loop): sync scaffold to 0.2.0\n\n* chore(release): bump specfuse-loop to 0.3.22\n\nShips the FEAT-2026-0049 planning-discipline scaffold drop (#211):\nplanning-discipline rule, result-contract closing obligations,\n'observe behavior, not source' verification bullet, PLAN/WU/GATE\ntemplate sections,\n[…]\n it on their next\n`specfuse upgrade`.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.22 (#213)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-23T00:31:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "919ef945d6d2ca01fa02ec3e0aedd26cbe6b4972",
          "body": "…ligations (#211)\n\n* feat(scaffold): planning-discipline rule + result-contract closing obligations\n\nEncode the FEAT-2026-0049 retrospective into the scaffold for loop-agent review.\n\n- rules/planning-discipline.md (NEW): 5 planning-time checks — existing-mechanism\n  search, escalation-predicate sati\n[…]\ncal python suite skips.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(scaffold): planning-discipline rule + result-contract closing ob…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-23T00:25:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2b5191d59f35f0cd73625e9fdeec0116bbfacbeb",
          "body": "* chore(loop): sync scaffold to 0.2.0\n\n* chore(release): bump specfuse-loop to 0.3.21\n\nFEAT-2026-0049 retrospective fixes: verdict-first terminal flips (#195),\nproduces-vs-squash-diff cross-check (#198), lifetime attempts/cost\naccounting + task_completed telemetry (#199), spinning re-arm\nreproductio\n[…]\nefire failing-test extraction (#207).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.21 (#210)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-22T23:19:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "21e0e2658245f18c61babca59c40126cc0141574",
          "body": "…erpt (#207) (#208)\n\nThe tests-class signature pattern matched only pytest/unittest\n('FAIL: test_*'). Maven surefire failures ('[ERROR] ClassTest.method:123\n...') fell through to the first-informative-line heuristic and collapsed\nonto a generic Maven line identical across distinct failing-test sets;\n[…]\n0 boilerplate lines,\nno-surefire order preservation. Full suite 1249 tests OK; ruff clean.\n\nCloses #207.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): extract surefire failing-test names into signature and exc…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-22T23:12:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "60e5253e766e0d5fde12525bae5cce82171a2b24",
          "body": "close/close-intermediate/plan-next WUs ran 2.8-5.2x over their $2-3\nplanned_cost_usd estimates across FEAT-2026-0049 (clabonte/generator),\npoisoning every calibration built on those plans. check_planned_cost now\nWARNs when a non-sealed ceremony-type WU declares a positive\nplanned_cost_usd below CERE\n[…]\nent at/above floor, ceremony-types-\nonly, sealed skip. Full suite 1248 tests OK; ruff clean.\n\nRefs #201.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(lint): planned-cost floor WARN for ceremony WU types (#201) (#206)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-22T23:10:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "599eefdf65254e993271328b2ef0817047515ba7",
          "body": "…d WUs (#200) (#205)\n\nAfter a spinning_signature_repeat escalation the driver re-dispatched a\nre-armed WU with no evidence the escalated failure was ever reproduced in\nfull. FEAT-2026-0049 (clabonte/generator): WU-06 was re-armed twice on\ntest-subset diagnoses; the third re-arm — the first to reprod\n[…]\n dispatch; reproduced re-arm dispatches and passes).\nFull suite 1254 tests OK; ruff clean.\n\nCloses #200.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(loop): reproduction gate before re-dispatch of spinning-escalate…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-22T23:08:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7f20bd842a1bbb0bd7b25fe6da59fd494f3c0088",
          "body": "…204)\n\nWU frontmatter attempts/cost_usd are per-dispatch-cycle values that reset\non re-arm, but every consumer read them as lifetime totals. FEAT-2026-0049\n(clabonte/generator): WU-06 frontmatter recorded attempts: 1 / $2.75 while\nevents.jsonl recorded 9 attempts / $30.29 across its re-arms — GATE-0\n[…]\nration run asserting every new\ntask_completed field. Full suite 1250 tests OK; ruff clean.\n\nCloses #199.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): lifetime attempts/cost accounting across re-arms (#199) (#…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-22T23:07:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e5201f8477a74906aea4c61a3402cc2ebe066c74",
          "body": "…ting done (#198) (#203)\n\nThe deliverable-presence gate (FEAT-2026-0022/T02, reused by auto-close\nsince #192) is presence-only: path exists and is non-empty. A WU whose\nproduces: paths are pre-existing files it was supposed to MODIFY passes it\nwithout touching them — the FEAT-2026-0049/T06 shape, wh\n[…]\n modify of a\npre-existing deliverable still passes). Full suite 1251 tests OK; ruff\nclean.\n\nCloses #198.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): cross-check produces: against the squash diff before accep…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-22T23:05:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fc44b4dd24dab2f9fcf2c4e949610f432c665824",
          "body": "…#195) (#202)\n\nA terminal close passing with a hedged verdict (met_locally/partially_met/\nnot_met) previously ended in a split state: the driver reverted PLAN.md to\nactive but left the roadmap row done when the agent's close ceremony had\nflipped both. The two surfaces then disagreed about feature co\n[…]\n — a blocked WU's\ngit reset would revert the roadmap anyway and mask a broken revert path.\n\nCloses #195.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): evaluate close verdict before any terminal surface write (…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-22T23:03:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d2042c619bceb96aa11c58a067673a4b0a8376b4",
          "body": "Move the FEAT-2026-0032 (Non-WSL Windows execution) detail section from\nroadmap.md to roadmap-archive.md now that the feature is done, per the\nroadmap-archive convention: anchor `<a id=\"feat-2026-0032\"></a>` +\nheading in the archive (inserted newest-first, before 0031), Detail cell\nin roadmap.md rep\n[…]\nt-2026-0032)`.\nStale \"Status: planned.\" in the moved section corrected to \"Status: done.\".\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(roadmap): archive FEAT-2026-0032 detail (done) (#197)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-22T12:26:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "99523f7deb4a7a88eff9279d0b3ff7b0f332f944",
          "body": "…ct (#196)\n\nClose-out bookkeeping for FEAT-2026-0032 (Non-WSL Windows execution).\nThe feature's code merged to main via #155; all 11 WUs are done and the\nterminal close ran (verdict: partially_met), but the terminal flips never\nfired because the verdict was not `met` — so gate 2 stayed\nawaiting_revi\n[…]\nerged (#155); the stale\npre-squash branch feat/FEAT-2026-0032-windows-native is redundant.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(FEAT-2026-0032): finalize — accept partially_met terminal verdi…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-22T12:21:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "17fbedb489feadaf9174a159a6a740fd467b3149",
          "body": "…d) (#194)\n\nParks the multi-components-in-one-repo evolution: an optional per-feature\n`component:` selector + per-gate cwd/component tags so one repo can host\nN deliverables without splitting the tree, keeping .specfuse/ at repo root\n(one lock, one roadmap). Backward-compatible (selector defaults to\n[…]\nmigration. Records the rejected\nmultiple-.specfuse/-dirs approach and the promote-trigger.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(roadmap): add FEAT-2026-0033 sub-repo component scoping (deferre…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-22T01:21:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c32aa15109d1a42ca4647c99df207b51cfc9ab35",
          "body": "Ships two auto-close hollow-pass fixes landed since 0.3.19:\n- #189 (#191): per-WU auto_close_disabled opt-out for substantive closes.\n- #190 (#192): auto-close verifies declared deliverables exist, not just\n  that a WU reported done.\n\nBumps the five version surfaces in step.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.20 (#193)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-21T23:27:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cf2bd68b3efc813997fc0e674560e84afffd0b40",
          "body": "…done (#192)\n\nCloses #190. The auto-close predicate keyed on cost, plan-conformance,\nand no escalations, trusting each implementation WU's `done` status — it\nnever verified the WU produced what it declared. So a WU that reported\n`done` with its `produces:` paths absent from the tree still read as a\n\n[…]\n suite (1244 tests) passes; ruff clean; bandit 0 medium+;\n  coverage 93%; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): auto-close verifies declared deliverables exist, not just …",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-21T23:25:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3c019e6a0ff6420407c60b48bbc8318cbd99d163",
          "body": "… (#191)\n\nCloses #189. The auto-close predicate keys on the implementation WUs'\ncost and plan-conformance; it has no signal for what the CLOSE WU itself\nis contracted to verify. A close whose acceptance criteria assert on the\nsource tree, reconcile prior gates, or observe runtime behaviour is, to\nth\n[…]\nruff clean; bandit 0 medium+;\n  coverage 93%; leak-scan clean; scaffold drift guard green.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(loop): per-WU auto_close_disabled opt-out for substantive closes…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-21T22:58:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b1fb38a8dbcc036d2f41efab16dfa34bcc850afd",
          "body": "Ships four fixes landed since 0.3.18:\n- #182 (#184): files_changed_mismatch — (no diff)/(missing) labels,\n  populated failure_class/signature/excerpt, actionable retry guidance.\n- #183 (#186): honour deferred feature status — refuse explicit dispatch.\n- #185 (#187): linter validates feature/gate sta\n[…]\nSION,\nspecfuse/loop/data/VERSION, pyproject.toml, the plugin manifest, and\nDRIVER_VERSION.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.19 (#188)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-21T19:45:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "46becf781f6b4d0b9472e27bcca670de8afb93a7",
          "body": "…abulary (#187)\n\nCloses #185. The linter already validated WU type and WU status against\nfixed enums, but not FEATURE status (PLAN.md) or GATE status — so a value\nthe driver does not recognize passed lint clean and then behaved\ndifferently at dispatch. That is the class #183 exposed: `status:\ndeferr\n[…]\n suite (1237 tests) passes; ruff clean; bandit 0 medium+;\n  coverage 93%; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(lint): validate feature and gate status against the driver's voc…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-21T19:43:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0045601266d11b7bf36a19253952f6298835f816",
          "body": "…(#186)\n\nCloses #183. The gate-status skill, the PLAN template, methodology.md,\nand the roadmap template all document `deferred` as a parked,\nnon-dispatchable status. The driver dispatched it anyway: find_feature's\nexplicit `--feature` branch returned any dir with a PLAN.md with no\nstatus check, so \n[…]\n suite (1234 tests) passes; ruff clean; bandit 0 medium+;\n  coverage 93%; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): honour deferred feature status — refuse explicit dispatch …",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-21T19:27:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "428e75c2f3c803be4d46c0afe617f47bc3771a91",
          "body": "… (#184)\n\nCloses #182. The files_changed guard is correct to reject an attempt that\nclaims to have edited a file it did not touch, but three things around a\nlegitimate rejection made it hard to act on and cost a WU three attempts\n(~$11) before escalating.\n\nP1 — accurate path labels. The rejection no\n[…]\n suite (1232 tests) passes; ruff clean; bandit 0 medium+;\n  coverage 93%; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): diagnosable, convergable files_changed_mismatch rejections…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-21T19:17:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2af72fd62116615211555a51b61db0c4efb3114d",
          "body": "Ships seven fixes landed since 0.3.17:\n- #167 (#169): non-informative failure signatures no longer false-fire\n  spinning_signature_repeat.\n- #168 (#171): rejected-attempt verify output + diff persisted before reset.\n- #166 (#170): fixture disables commit signing (trustworthy local gates).\n- #165 (#1\n[…]\nSION,\nspecfuse/loop/data/VERSION, pyproject.toml, the plugin manifest, and\nDRIVER_VERSION.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.18 (#181)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-21T14:48:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ca7ecaa5bca0c7ea4e7871505ca632ec7e4c3b22",
          "body": "…s #176) (#180)\n\n* fix(loop): accept explicit YAML null and diagnose bad frontmatter by path\n\nCloses #177. `key: null` (and `~`/`Null`/`NULL`) is valid YAML, but\n_miniyaml raised on it, and the error surfaced as an unhandled traceback\ninside find_feature — so a malformed marker in one (possibly comp\n[…]\nrd green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(lint): warn when a WU omits an opt-in must-reference gate (close…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-21T13:28:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4668b86b7a59c833178f470f21d20eab3cddba4e",
          "body": "…path (#179)\n\nCloses #177. `key: null` (and `~`/`Null`/`NULL`) is valid YAML, but\n_miniyaml raised on it, and the error surfaced as an unhandled traceback\ninside find_feature — so a malformed marker in one (possibly completed,\nunrelated) feature's PLAN.md crashed dispatch of a DIFFERENT feature,\nwit\n[…]\n\n  _miniyaml 100% coverage; ruff clean; bandit 0 medium+; coverage 93%;\n  leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): accept explicit YAML null and diagnose bad frontmatter by …",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-21T12:22:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "82c267f0ff5020a8444e6bf7c8d383e424acfcf0",
          "body": "Closes #175. When a gate's remediation is a command over the attempt's\nown output (formatters, linters), the retry cycle could not converge:\nthe driver discards the failed attempt's work, then re-dispatches with\nthe raw gate output attached — output that names files the reset already\nremoved and rea\n[…]\n suite (1218 tests) passes; ruff clean; bandit 0 medium+;\n  coverage 93%; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): make mechanical gate failures learnable across retries (#178)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-21T12:13:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "92fa9bacb7f430aa8a40264376aaf64e0c21763e",
          "body": "Ships four fixes landed since 0.3.16:\n- #167 (PR #169): non-informative failure signatures (bare fences,\n  whitespace, ANSI) no longer false-fire spinning_signature_repeat.\n- #168 (PR #171): rejected-attempt verify output + working-tree diff are\n  persisted to work/<wu>/attempt-N.md before git reset\n[…]\nSION,\nspecfuse/loop/data/VERSION, pyproject.toml, the plugin manifest, and\nDRIVER_VERSION.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.17 (#173)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-20T19:47:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "83990e3301026e228ab89c779241c61c9c40ca58",
          "body": "…grade (closes #165) (#172)\n\n* fix(loop): persist rejected-attempt evidence before git reset on block\n\nCloses #168. Only the exhausted-attempts `for-else` path wrote\nper-attempt notes to work/<wu>/attempt-N.md; the earlier\n`spinning_signature_repeat` halt reset the tree and committed\nbookkeeping WIT\n[…]\nan clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(scaffold): warn on unmanaged legacy scripts/ or skills/ during up…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-20T19:37:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e2afaffe02a27f8f539667a504c09d492725dbd8",
          "body": "…k (#171)\n\nCloses #168. Only the exhausted-attempts `for-else` path wrote\nper-attempt notes to work/<wu>/attempt-N.md; the earlier\n`spinning_signature_repeat` halt reset the tree and committed\nbookkeeping WITHOUT persisting anything. And neither path captured the\nrejected working-tree diff — only a \n[…]\n8 tests) passes; ruff clean; bandit 0 medium+;\n  coverage 93% (floor 90); leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): persist rejected-attempt evidence before git reset on bloc…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-20T19:24:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "39e7079ab686e0a9890327fec6963e499168e811",
          "body": "…e (#170)\n\nCloses #166. TestUntrackedPathsHelper.setUp created a git repo and\ncommitted without disabling commit signing. When the operator's global\nconfig enables SSH commit signing (commit.gpgsign=true, gpg.format=ssh)\nand no SSH agent socket is available — e.g. a sandboxed session — the\nfixture's\n[…]\nover -s tests` now passes with no\n  errors under SSH signing enabled; previously 3 errors.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(loop): disable commit signing in TestUntrackedPathsHelper fixtur…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-20T19:16:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "05175075d8adc9d0e409cb1b018fea2b9030b575",
          "body": "…(#169)\n\nCloses #167. `parse_gate_failure_signature`'s per-gate `_SIG_PATTERNS`\nare Python-toolchain-specific (unittest `FAIL: test_*`, ruff codes,\nbandit `B\\d+`, `.py` coverage rows). A non-Python gate — e.g. a\nTypeScript `tests` gate — matches none, so extraction fell through to\n\"first non-empty l\n[…]\n6 tests in the touched file pass; ruff clean; bandit 0 medium+;\n  coverage 93% (floor 90).\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): don't spin-escalate on non-informative failure signatures …",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-20T19:09:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "459679b384756a39203c8f397813b81137529f75",
          "body": "Ships the #162 fix (PR #163): `reset_preserving_events` now clears the\nfailed attempt's untracked output, closing the path where attempt N+1\ncould pass on attempt N's leftovers without writing anything.\n\nBumps the five version surfaces in step: .specfuse/VERSION,\nspecfuse/loop/data/VERSION, pyproject.toml, the plugin manifest, and\nDRIVER_VERSION.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.16 (#164)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-19T18:07:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cb132138a5498d60d6bcdd5b00b48651cfcdaac9",
          "body": "Closes #162. `reset_preserving_events` performed a bare `git reset --hard\nhead_before`, which rolls back tracked content but leaves untracked files\non disk. Because `untracked_before` is snapshotted once per WU (loop.py\n:3767) while the attempt loop runs beneath it (:3827), a failed attempt's\nnewly-\n[…]\nxtures omit git user.email, so `git commit` exits 128\n  locally where CI has an identity).\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): clear the attempt's untracked output on reset (#163)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-19T17:55:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b02726d090de91918624455494a1be00215e15f3",
          "body": "* chore(loop): sync scaffold to 0.2.0\n\n* chore(release): bump specfuse-loop to 0.3.15\n\nSince 0.3.14:\n- FEAT-2026-0032: native Windows execution (no WSL) via Git-Bash (#155)\n- fix: core.hooksPath conflict — consolidate git hooks (#154, closes #153)\n- fix(loop): internal driver commits use --no-verify\n[…]\nat break.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.15 (#160)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-17T21:34:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f53e42eacba311986c60da93d8e171bba6809f76",
          "body": "… (#159)\n\nCloses #157. When the auto-close predicate fires, the driver marks the\nclose/close-intermediate WU done and writes a short stub retrospective WITHOUT\ndispatching the WU body — so the mandatory `## What the loop did NOT verify`\ndeferral list (the methodology's artifact-vs-real-state honesty\n[…]\nproof: both fail on HEAD.\n\nVerification: full suite OK; coverage 93%; ruff + bandit clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): auto-close stubs flag the deferred-verification gap (#157)…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-17T21:32:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eee5c94b169cb99315e3be1224e3c017ced8f430",
          "body": "Closes #156. The driver's squash_commit, commit_bookkeeping, and the --prepare\nscaffold commit ran `git commit` WITHOUT --no-verify, so the active\ncore.hooksPath pre-commit hook (leak_scan.py --staged, which includes the\nstructural regexes) ran on every internal driver commit. An agent-authored WU\nd\n[…]\nage 93%; ruff + bandit clean. Red proof: the\ntwo bypass tests fail on HEAD before the fix.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): commit internal driver commits with --no-verify (#156) (#158)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-17T21:24:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "91c1d53f5c13417d2a975d930351a73b2c1bc9ac",
          "body": "…(#155)\n\n* chore: scaffold feature FEAT-2026-0032 (native Windows execution)\n\nGate-cycle scaffold for FEAT-2026-0032 — PLAN, gates, gate-1 WUs, and the\ngate-2 terminal close placeholder. Roadmap row flipped to active.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n* feat: Mak\n[…]\nrunnable.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "FEAT-2026-0032: Non-WSL Windows execution (native driver + Git-Bash) …",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-17T19:54:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7949f7360f80928183d9f5c0107ac0fdd7dfd638",
          "body": "Closes #153. core.hooksPath is single-valued, but scripts/install-hooks.sh\nset it to .githooks (pre-push / smoke-test) while scripts/setup.sh set it to\n.specfuse/hooks (pre-commit / leak-scan). The two dirs held disjoint hook\ntypes, so whichever installer ran last silently disabled the other's hook \n[…]\n prose in CONTRIBUTING that leak_scan.py --all\n  (the CI backstop) allows; --all is clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hooks): consolidate git hooks under one core.hooksPath dir (#154)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-17T15:31:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6e1b78dec42dc77b08a5b7ae05b00b69d1cc885c",
          "body": "One feature and two driver fixes since 0.3.13.\n\nFEAT-2026-0031 — configurable integration branch (#148). A feature can declare\n`base:` once in PLAN.md frontmatter; branch creation, the staleness guard, and\nPR creation all resolve it. Unblocks teams working off a long-lived integration\nor release bra\n[…]\n tool covers four of the five). MIN_SCAFFOLD_VERSION untouched — no\nscaffold-format break.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.14 (#152)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-17T14:29:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "77fa8602a9623351fb7e4714ab7f1b9e3b0e96bf",
          "body": "…es (#151)\n\nCloses #150. `squash_commit` staged the whole tree with `git add -A`, while\nthe dirty-tree guard (`_tracked_dirty_paths`) deliberately ignores untracked\nfiles on the premise — stated in its own docstring — that they \"carry\nharmlessly\". They did not: `add -A` committed them. Any untracked\n[…]\n before the fix, 14 exposed after)\n- ruff clean; bandit no issues; coverage 93% (floor 90)\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): squash_commit no longer absorbs pre-existing untracked fil…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-17T14:19:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5b02b6c2349a859b4ff066fc0c66a99653bfdd91",
          "body": "…l config) (#149)\n\nBoth are operator WIP for a different agent harness, not part of this repo's\nscaffold. Neither should ever be committed here.\n\nPreventive: untracked files are invisible to the driver's dirty-tree guard\n(`_expected_flip_paths` / `_tracked_dirty_paths` inspect TRACKED paths only),\nb\n[…]\ner than guard\ninspection — remains unfiled and will still absorb any other untracked file.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(gitignore): ignore AGENTS.md and .codex/ (other harnesses' loca…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-17T13:39:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f0af2e5f16c65c96e9c31b1650a3e25a11ed16f5",
          "body": "… frontmatter) (#148)\n\n* chore: scaffold feature FEAT-2026-0031\n\n* feat: Add the `base` frontmatter key and the base resolver\n\nFeature: FEAT-2026-0031/T01\n\n* feat: Cut the feature branch from the resolved base and re-anchor the staleness guard\n\nFeature: FEAT-2026-0031/T02\n\n* feat: Target the PR at t\n[…]\n finding.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "FEAT-2026-0031: configurable integration branch (base: key in PLAN.md…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-17T13:37:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "66210049e88a117ae0f03a6d7e49a2099a952dea",
          "body": "* chore(loop): sync scaffold to 0.2.0\n\n* chore(release): bump specfuse-loop to 0.3.13\n\nShips #146 (closes #145): a close WU's own failed attempt no longer arms the\nfailure-class-breakdown guard against the RETROSPECTIVE it authors, so a gate\nwhose substantive WUs all passed no longer spins to blocke\n[…]\ned table.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.13 (#147)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-12T13:29:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3b719a844c1e938664633c953eb12ec55ac448bd",
          "body": "…d against it (closes #145) (#146)\n\nCloses #145. `assert_failure_class_breakdown_when_failures_present` counted ALL\nnon-passing attempts in the gate — including the close WU's own. Because the\nclose WU is the one authoring the RETROSPECTIVE the guard inspects, its malformed\nfirst attempt retroactive\n[…]\nfication:\n- 1124 tests pass; ruff clean; bandit -ll exit 0; coverage 93%; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): a close WU's own failure no longer arms the breakdown guar…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-12T13:24:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "078965d03230606e50c3362ce5d467600f3e3b80",
          "body": "* chore(loop): sync scaffold to 0.2.0\n\n* chore(release): bump specfuse-loop to 0.3.12\n\nShips #143: auto_sync's scaffold upgrade no longer poisons the same run's\n--prepare. The overlay is committed on a non-default branch (clean tree) or\ncarried onto the feature branch on the default branch; --prepar\n[…]\nraceback.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.12 (#144)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-09T16:17:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dcc3046a639f7a8d534a9e2bd503fac1dc9e38e9",
          "body": "…n's --prepare (#143)\n\n`specfuse-loop --prepare` crashed with a FeatureBranchError traceback whenever\nthe installed scaffold was newer than the project's: auto_sync overlays the new\nscaffold (dirtying .specfuse/VERSION, .scaffold-manifest, docs/, templates/) and\nleft it uncommitted, then ensure_feat\n[…]\nfication:\n- 1119 tests pass; ruff clean; bandit -ll exit 0; coverage 93%; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): auto_sync's scaffold upgrade no longer poisons the same ru…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-09T16:15:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a1fb775b6c821a20cb0bbea11da7fed3e0b1e330",
          "body": "Ships #141 (closes #140): resolves two vendored-scaffold doc defects that\ntrip IntelliJ Markdown inspections — broken `../methodology.md` relative\nlinks in docs/concepts/, and a \"Bad character\" em-dash in WU.template.md.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.11 (#142)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-09T15:19:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4d9ea924a2cd3ccc70e6e254d17383e4ae428384",
          "body": "…nspections (closes #140) (#141)\n\nCloses #140. Vendored scaffold docs carried two genuine defects that\nIntelliJ Markdown inspections flag after `init`. (1) Three links to\n`methodology.md` from `docs/concepts/*.md` used a same-directory path,\nbut `methodology.md` lives one level up in `docs/` — the l\n[…]\nfication:\n- 1112 tests pass; ruff clean; bandit -ll exit 0; coverage 93%; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(docs): resolve scaffold doc/template defects that trip Markdown i…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-09T15:17:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5151173c10bb4ca703efdeb1ea183250d50641ae",
          "body": "Ships two loop-driver changes merged since 0.3.9:\n- fix(loop): verify() fails a gate whose oracle silently degraded — a\n  green gate whose analyzer measured a subset of the real check (e.g.\n  flutter analyze dropping custom_lint when the plugin can't load in the\n  sandbox) is now an honest FAIL, not\n[…]\n WU title as a summary line\n  so the log says what each unit does, not just its id (#138).\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.10 (#139)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-06T11:33:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ca841b36fade906060fd3fbd907f5310071ec2b2",
          "body": "The dispatch header showed only the WU id, type, model, and effort:\n  [07:13:49] -- FEAT-2026-0055/G3-CLOSE [close] model=opus effort=high\nso the log said which unit ran but not what it does. Print the WU's\ntitle beneath it:\n  [07:13:49] -- FEAT-2026-0055/G3-CLOSE [close] model=opus effort=high\n    \n[…]\ne id (the parse default for a WU\nwith no `# Title` heading), so no redundant line appears.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(loop): print the WU title as a dispatch summary line (#138)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-06T11:30:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7948c526ff42a836de05e157d9de096bf78c9202",
          "body": "…34) (#137)\n\nCloses #134. A gate command could exit 0 while its analyzer measured a\nstrict subset of the real check, so verify() — which trusts only the exit\ncode — certified a hollow pass. Observed: `flutter analyze --fatal-warnings`\ncannot build a custom_lint plugin in the loop sandbox (pub.dev bl\n[…]\nVerification:\n- 1110 tests pass; ruff clean; bandit -ll exit 0; coverage 93% (>=90 floor).\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): fail the gate when its oracle silently degraded (closes #1…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-06T11:29:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "17baaef54a7992f5e187315e2f8c8ba969fcd63e",
          "body": "Ships the #16 fix — roadmap-add/draft-feature next-ID scan now includes source (d):\nGitHub issue/PR-reserved FEAT IDs (#135), so a plugin release carries it to the\nmarketplace. The notify-marketplace dispatch wiring (#133) also becomes active.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.9 (#136)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-06T03:10:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "69166a0d5dadce90c445f2ffe465a3b6d03f6f1b",
          "body": "…rce d) (#135)\n\nFixes specfuse/specfuse#16. roadmap-add's next-ID scan (reused by draft-feature)\ncomputed the next FEAT-YYYY-NNNN from three LOCAL sources only — roadmap table,\nPLAN.md, LEARNINGS/RETROSPECTIVE — and never inspected GitHub. Teams also reserve\nFEAT IDs directly on issue/PR titles that\n[…]\n% (floor 90);\n  leak-scan + all bats green. Canonical skill == vendored copy (diff clean).\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(skills): next-ID scan adds GitHub issue/PR-reserved FEAT IDs (sou…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-05T18:52:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d7ca095b25e97c72435dc2e3ed5162fda14e8a66",
          "body": "…133)\n\nAdd a notify-marketplace job mirroring the orchestrator's: after a successful\nPyPI publish on a v* tag, fire a plugin-release repository_dispatch to\nspecfuse/specfuse with {plugin: specfuse, version}. Completes the auto-publish\ntrigger for this plugin. No-ops if MARKETPLACE_DISPATCH_TOKEN is unset.\n\nRefs #23.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci(release): dispatch marketplace publish after PyPI release (#23) (#…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-05T15:39:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fd0c8096979aad4d11e7372e2ac4df145b7f942b",
          "body": "* chore(release): bump specfuse-loop to 0.3.8\n\nRelease capturing the canonical plugins/specfuse/ layout (loop restructure #131):\nthe gate-cycle plugin now lives at plugins/specfuse/ as the single source, with\n.specfuse/skills/ vendored from it. Cutting this release publishes plugins/specfuse/\nunder \n[…]\nee; the initial commit only bumped pyproject. Re-sync via\nthe canonical helper.\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump specfuse-loop to 0.3.8 (#132)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-05T14:41:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e40908405dcf2268ee9e700bcfbcbcff426f8795",
          "body": "…fuse/skills/ from it (#131)\n\nAligns the loop with the marketplace's uniform plugins/<name>/ sourcing model\n(specfuse/specfuse docs/plan-unify-plugin-sourcing.md). Previously the loop was\nthe odd one out: its gate-cycle skills lived only in .specfuse/skills/ and were\npushed OUTBOUND to the umbrella \n[…]\nce (only canonical + vendored;\n  .agents/skills is the unrelated external caveman plugin).\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(loop): make plugins/specfuse/ the canonical plugin; vendor .spec…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-05T14:35:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "45725f8584d1e8d16da17894d31024c236eea790",
          "body": "…-repo path dep (#130)\n\n* feat(loop): vendor shared substrate from methodology core; drop cross-repo path dep\n\nRepoints the loop to a single source of truth for the shared Specfuse substrate.\n\nvalidate_event.py previously resolved the event schema from an absolute\ncross-repo path (orchestrator/share\n[…]\nng links.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(loop): vendor shared substrate from methodology core; drop cross…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-05T00:24:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9375f57b6cefff0c8b89378ed341c93713e1f0ef",
          "body": "…x (#129)\n\nFollow-up to #127. When the terminal-close invariant finds no roadmap row for\nthe feature, the message now points at the recovery — restore the row and\nre-commit, and dispatch via `specfuse-loop --prepare` so the row is folded into\nthe scaffold commit and survives the per-attempt reset — \n[…]\nnd names --prepare.\n\nVerification:\n- 1095 tests pass; ruff clean; coverage 93% (floor 90).\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(loop): terminal-close roadmap_row_not_done message names the fi…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T23:36:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3f8e9d40f703a573a5089eb9b14c7fee4fabb456",
          "body": "…old commit (#128)\n\nCloses #127. /draft-feature writes the feature folder AND a roadmap row but\nruns no git, so at dispatch time the roadmap edit is an uncommitted working-tree\nchange. prepare_feature staged only the feature folder in its `chore: scaffold`\ncommit, leaving the roadmap row dirty. The \n[…]\n% (floor 90);\n  leak-scan clean; leak-scan-hook / sync-scaffold / init-sh-shim bats green.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): --prepare folds the uncommitted roadmap row into the scaff…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T21:13:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "65945dd905cb19c48286ce2ea2c8491c0ba9b78e",
          "body": "…on (#125)\n\nBumps all four version sources to 0.3.7 (via scripts/bump_version.py).\n\nShipped driver change since v0.3.6:\n- feat(loop): `_redact_home_paths` at the `flush_events` chokepoint redacts\n  absolute home-directory paths (macOS /Users/<x>/, Linux /home/<x>/) from\n  every event-payload string \n[…]\nship via the plugin / repo-internal scripts;\ntest + CI hardening (#120, #121) is dev-only.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): 0.3.7 — driver-side events.jsonl home-path sanitizati…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T19:24:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "92c395b5ad1e2ee16a7471441b5beae587859985",
          "body": "…e (#124)\n\nA multi-gate feature drafted with every later gate's `work_units` empty\nfails `lint_plan.py`: the linter treats the last NON-EMPTY gate as\nterminal, so with gates 2..N empty, gate 1 is misread as terminal and its\n`close-intermediate → plan-next` sequence is rejected\n(\"terminal gate must u\n[…]\n (skill markdown); lower-risk than relaxing the\nlinter's terminal detection.\n\nCloses #120.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(#120): draft-feature — pre-declare the final gate's terminal clos…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T19:09:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ba6c35a8b7ff5dfbefa7106c581e2f62655fcf17",
          "body": "…I (#123)\n\ntests/init_skills_idempotent.bats tests 1 & 2 asserted `init.sh` deploys\n`.specfuse/skills/` into a target. That has been false — and the tests\nsilently red — since FEAT-2026-0026 made init.sh a thin shim to\n`specfuse init` and skill delivery moved to the Claude Code plugin\n(docs/getting-\n[…]\niver gate set\n  (.specfuse/verification.yml) so it can't rot silently again.\n\nCloses #121.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(#121): retire stale init-skills bats tests + wire the file into C…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T19:08:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8d952566eb645c2f5c3c360603322b925dccce94",
          "body": "* feat: LEARNINGS entry parser + stdlib BM25 ranker\n\nFeature: FEAT-2026-0025/T01\n\n* feat: CLI wrapper + load-whole threshold fallback\n\nFeature: FEAT-2026-0025/T02\n\n* chore(loop): FEAT-2026-0025/G1-CLOSE-INTERMEDIATE auto-closed (predicate=v1)\n\nFeature: FEAT-2026-0025\n\n* feat: Gate 1 plan-next — draf\n[…]\n\n* chore(loop): FEAT-2026-0025/G2-CLOSE terminal flips\n\nFeature: FEAT-2026-0025\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(FEAT-2026-0025): LEARNINGS indexed retrieval (#122)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T19:01:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0ef64229b8c19d393eb3553a026f6ce2aecdd3c4",
          "body": "Dispatchable 2-gate feature folder for goal (4) of roadmap FEAT-2026-0025\n(active): indexed retrieval over LEARNINGS.md so planning consumers load\nonly the relevant slice, not the whole ~1700-line file. Autonomy review.\n\nScope pinned in PLAN: goals 1-3 (the /learnings-curate skill + rule\npromotion) \n[…]\nno-verify\n(WU prose references path-shaped examples the structural pre-commit hook flags).\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(feature): draft FEAT-2026-0025 — LEARNINGS indexed retrieval (#119)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T16:57:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eb0be9d51463de0a14408e212acfef074455e93c",
          "body": "…al (#118)\n\nFlip status planned -> active via /pick-feature. Roadmap row only (no\nfolder) — /draft-feature next. Sole remaining planned item. Draft-time\nnote: a /learnings-curate skill already exists; scope-check built vs\nstill-needed (archive file + curation moves + rule promotion) first.\n\nCo-authored-by: Test <test@example.com>",
          "is_bot": false,
          "headline": "chore(roadmap): activate FEAT-2026-0025 — LEARNINGS curation + archiv…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T16:33:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d9c33089b5eb19ca13178cda7b51e5a6bdd0280",
          "body": "… (#117)\n\n* feat: Redact absolute home paths from event payloads at the flush chokepoint\n\nFeature: FEAT-2026-0030/T01\n\n* chore(loop): FEAT-2026-0030/G1-CLOSE auto-closed (predicate=v1)\n\nFeature: FEAT-2026-0030\n\n* chore(loop): gate 1 awaiting_review\n\nFeature: FEAT-2026-0030\n\n* chore(loop): FEAT-2026-\n[…]\noad scan.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(FEAT-2026-0030): driver-side events.jsonl home-path sanitization…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T16:31:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "769f5d6e6d23d311b891f3acba65c415aa3ca8e0",
          "body": "T01 as originally drafted would halt the gate on its own commit: the driver\ncommits WU work through the pre-commit structural leak-scan (no --no-verify),\nwhich flags /Users/<seg>/ anywhere in the staged diff. A naive redaction regex\n(r\"/Users/[^/\\s]+/\" self-matches) or a literal home-path test fixtu\n[…]\nt example de-literalised.\n\nCommitted --no-verify (WU prose documents the flagged pattern).\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(FEAT-2026-0030): add commit-safe-source constraint to T01 (#116)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T15:34:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "05e8bf6bdd7d8acbf1c585109b687e2fdd4206a5",
          "body": "…tion (#115)\n\nDispatchable feature folder for the driver-side events.jsonl sanitize fix\n(roadmap FEAT-2026-0030, active). Single gate, terminal close, autonomy auto.\n\nGate 1:\n- T01: add driver-local `_redact_home_paths` applied at `flush_events`\n  (loop.py) — recursively redact absolute home paths f\n[…]\nylist) + payload\nscan, both of which pass. Lint clean; dry-run dispatches T01 -> G1-CLOSE.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(feature): draft FEAT-2026-0030 — events.jsonl home-path sanitiza…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T14:14:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7088631635cd69f51779f766701635d659e4e028",
          "body": "…ation (#114)\n\nFlip status planned -> active via /pick-feature. Roadmap row only (no\nfolder yet) — /draft-feature next. Directly de-risks the loop halts hit\nrepeatedly during FEAT-2026-0029 (agent-authored paths in blocked-reason\nnotes tripping the pre-commit leak-scan).\n\nCo-authored-by: Test <test@example.com>",
          "is_bot": false,
          "headline": "chore(roadmap): activate FEAT-2026-0030 — driver events.jsonl sanitiz…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T13:21:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e8eea81a03df04efbddd25554a536b0284a183a",
          "body": "* chore(loop): bookkeeping for FEAT-2026-0029/T01 attempt (blocked)\n\nDriver-staged gate/WU status flips + events.jsonl audit for the T01\nattempt that escalated blocked_human. Absolute local paths in the\nagent's blocked_reason were redacted before commit so the repo leak-scan\npasses (issue #76 patter\n[…]\n\n* chore(loop): FEAT-2026-0029/G1-CLOSE terminal flips\n\nFeature: FEAT-2026-0029\n\n---------\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(FEAT-2026-0029): one-command scaffold-upgrade skill (#113)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T12:47:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "73555d3f0573977036b8d96d8eba88691e63dcc9",
          "body": "…tion (#112)\n\nPlanned driver-hardening feature. The loop writes agent-authored free-text\n(blocked reasons, failure notes) into events.jsonl then stages/commits it;\nwhen that text contains a token the structural leak-scan flags (e.g. an\nabsolute home-directory path the agent mentioned), the pre-commi\n[…]\nptured FINDINGS. Fix: one driver-side sanitization chokepoint\nbefore events.jsonl staging.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(roadmap): add FEAT-2026-0030 — driver-side events.jsonl sanitiza…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T01:13:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "31e57181b388f941fdc60cd21c63d22b9408efe5",
          "body": "Flip status planned -> active on the roadmap row and PLAN.md frontmatter.\nPick-feature selection; the feature's gate-1 folder is already drafted and\nlint-clean, so it is dispatchable via loop.py.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(roadmap): activate FEAT-2026-0029 — scaffold-upgrade skill (#111)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-04T00:33:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c04f62159fb729c71f7dbb2c24e36eb6e3599be5",
          "body": "Dispatchable feature folder for the one-command scaffold-upgrade skill\n(roadmap FEAT-2026-0029). Single gate, terminal close, autonomy review,\nstatus planned.\n\nGate 1 work units:\n- T01: merge-safety gate helper (.specfuse/scripts/upgrade_merge_gate.py)\n  — decide(ci, health_report) -> merge/halt; re\n[…]\nepo is operator-verified).\n\nLint clean (0 warns); dry-run dispatches T01→T02→T03→G1-CLOSE.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(feature): draft FEAT-2026-0029 — scaffold-upgrade skill (#110)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-03T23:49:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "caf58c533311fc55cc94ce1c69497814b0aaf150",
          "body": "…l (#109)\n\nPlanned feature: a Claude Code skill that wraps the existing\n`specfuse upgrade [--dry-run]` CLI in the git choreography humans repeat\nby hand — dry-run reports what would change; live mode branches off fresh\norigin/main, runs the upgrade, commits, pushes, opens a PR, and merges.\n\nMerge is\n[…]\nnversion rather than landing a broken scaffold. Orchestration\nonly — no new upgrade logic.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(roadmap): add FEAT-2026-0029 — one-command scaffold upgrade skil…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-03T22:49:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "af6c79da73c73e046561ade75ebc6cdc12cef728",
          "body": "…tus (#108)\n\nBumps all four version sources to 0.3.6 (via scripts/bump_version.py).\n\nSince v0.3.5:\n- fix(loop): terminal-close invariant parses the roadmap row's status by\n  header name, not column position — no more false roadmap_row_not_done\n  escalation on tables with a Priority column (#104 / #1\n[…]\neckout v7, setup-python v6,\n  download-artifact v8, upload-artifact v7 (#91–#94). CI-only.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): 0.3.6 — roadmap-parser fix + first-class deferred sta…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-03T12:20:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2fab2aeea3aea318c48f4faac7f2d5ea193cd059",
          "body": "Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 7.\n- [Release notes](https://github.com/actions/upload-artifact/releases)\n- [Commits](https://github.com/actions/upload-artifact/compare/v5...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/upload-artifac\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/upload-artifact from 5 to 7 (#94)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-03T11:59:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fd0d5a81eedb9113d466873f2a88b5bd01c849f7",
          "body": "Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 5 to 8.\n- [Release notes](https://github.com/actions/download-artifact/releases)\n- [Commits](https://github.com/actions/download-artifact/compare/v5...v8)\n\n---\nupdated-dependencies:\n- dependency-name: actions/downlo\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/download-artifact from 5 to 8 (#92)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-03T11:55:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "27b44552e98b6de77b9e13ac3d56ea4fc5f86e8c",
          "body": "Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 6.\n- [Release notes](https://github.com/actions/setup-python/releases)\n- [Commits](https://github.com/actions/setup-python/compare/v5...v6)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-python\n  dependency-\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/setup-python from 5 to 6 (#91)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-03T11:53:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "42983dadde27c833dc845803b80e56a81a606b9b",
          "body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 7.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v4...v7)\n\n---\nupdated-dependenc\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/checkout from 4 to 7 (#93)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-03T11:51:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fed659873a55a2dc9ad2019d06a240a9fd0e1a36",
          "body": "`deferred` was being used as a roadmap status in practice (two dogfood\nfeatures parked on external dependencies) but wasn't a recognized part\nof the status model — accepted as free text on the roadmap, disallowed\nin the PLAN.template legend, and unmodeled by pick-feature / gate-status.\n\nThe driver a\n[…]\nted, does not count as a second active, and is\nstill selectable by explicit --feature arg.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(status): first-class `deferred` roadmap/PLAN status (#106) (#107)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-03T10:53:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "385dee48a90ceaf487a203f792d0231f4fe8b06f",
          "body": "…(#104) (#105)\n\nassert_terminal_flips_fired read the roadmap row's status by column\nposition (regex group(2) == 3rd column), assuming the canonical shape\n`| ID | Title | Status | ... |`. A project whose roadmap table has an\nextra column before Status (e.g. `Priority`) shifted Status to column 4,\nso \n[…]\nrity column present, and\nfail-still-reports-the-real-Status-cell (not the Priority token).\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): header-name roadmap-row parse in terminal-close invariant …",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-07-02T12:01:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4978397c8c8e68d4c1a5013f9ef8afd27c597b80",
          "body": "…== '—' (#103)\n\nCloses #102. `/roadmap-archive --auto` collected only `done`/`abandoned` rows\nwhose `Detail` cell was exactly `—`. A done feature whose `Detail` holds a\nfolder path (e.g. `features/FEAT-…/`, an older convention) was silently\nskipped even when it still carried an inline `## FEAT-… —` \n[…]\nder-path rows.\n\nThe skill is synced to the specfuse/specfuse plugin in a companion commit.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(roadmap-archive): --auto eligibility by inline prose, not Detail …",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-26T19:56:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "90ab67be48854e0c9ec6ad838e7e972a78016d3f",
          "body": "…(#101)\n\nCloses #100. The plan-next hook imported lint_plan_next_draft with a flat\ntop-level import that only resolved when the scripts were copied side-by-side\n(pre-pip). In the installed package it raised `No module named 'lint_plan'`, so\nthe plan-next gate logged `WARN (plan-next-draft lint): … N\n[…]\nr from outside the repo root.\n\nVerification: 1050 tests pass; ruff clean; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): package-relative import for the plan-next-draft lint hook …",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-25T02:19:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "38e227a51f9bbc7cb15383ea1813c9b9913bc9a8",
          "body": "- `--prepare-only`: like --prepare (create the feature branch + commit the\n  folder) but STOPS afterwards without dispatching, so you can review the\n  commit before the loop runs. `--prepare` still prepares-then-runs.\n- ensure_feature_branch's diverged-branch refusal now prints the three concrete\n  \n[…]\nonly.\n\nBumped 0.3.3 -> 0.3.4.\n\nVerification: 1048 tests pass; ruff clean; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(loop): --prepare-only + actionable diverged-branch message (#99)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-24T14:49:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c4c57987a80291c18a3efcfc8ec7e89ce8ca0bd8",
          "body": "… (#98)\n\nAfter /draft-feature (which writes the feature folder but neither commits nor\nswitches branches), running specfuse-loop refused to start (#71/#74 guards) and\nthe suggested fix was incomplete: it said `git add && commit` but, on the\ndefault branch, you must FIRST create the feature's branch \n[…]\nxisting projects on next run.\n\nVerification: 1047 tests pass; ruff clean; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(loop): --prepare creates the feature branch + commits the folder…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-24T13:12:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "50825de22d39a1178a524660545e32725404440f",
          "body": "…er fix (#97)\n\nCarries two changes since 0.3.1:\n- #96 — the driver stamps resolved model / effort / gate_set / driver_version /\n  started_at into each WU's frontmatter at dispatch, so what a WU ran with is\n  visible in the .md (not only console / events.jsonl).\n- #95 — the feature templates (WU/PLAN\n[…]\nN_SCAFFOLD_VERSION stays 0.2.0.\n\nVerification: 1044 tests pass; version-consistency green.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): 0.3.2 — WU execution metadata + feature-template head…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-23T16:05:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "55fce1f75c241f8e5f101013419814cb36fd4a48",
          "body": "…dispatch (#96)\n\nA WU's `.md` showed what it cost (cost_usd, duration, tokens) but not what it\nran with: model/effort default-resolved at load and were never written, so you\nhad to know the type→default mapping (or read the console / events.jsonl) to\nsee them.\n\nThe driver now stamps five resolved fi\n[…]\neffort\noverride is preserved.\n\nVerification: 1044 tests pass; ruff clean; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(loop): stamp resolved execution metadata into WU frontmatter at …",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-23T16:03:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "622621ddd6bdfcd2138332e95fb03bf5bef5db00",
          "body": "…mplates (#95)\n\nThe WU/PLAN/GATE templates carried a `<!-- Copyright 2026 Specfuse\nContributors / Licensed under the Apache License 2.0 -->` block after the\nfrontmatter, so every feature file `draft-feature` (or by-hand authoring)\ngenerated inherited it. Inside this repo that's fine, but in a downst\n[…]\nfuse, Apache-licensed); only newly-generated files change.\n\nVerification: 1042 tests pass.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(templates): drop hardcoded Specfuse/Apache header from feature te…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-23T15:34:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1d9c31f5990518910693f6da8460680a4a0c7ab7",
          "body": "Patch release carrying the new-project install/use fixes (PR #89): the shipped\nverification.yml plan-next gate now calls `specfuse-lint` (was a missing\n`.specfuse/scripts/lint_plan.py`); driver/lint/skills run-command hints use the\nconsole scripts; the roadmap seed ships the 5-column header `/roadma\n[…]\nN_SCAFFOLD_VERSION stays 0.2.0.\n\nVerification: 1042 tests pass; version-consistency green.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): 0.3.1 — fresh-project install/run fixes (#90)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-22T14:30:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "81dd55150b8b05b393c8da414479343af24f22ad",
          "body": "Four bugs hit when scaffolding a brand-new project from the published\npackages (none surfaced in-repo because this dogfood repo still carries the\nlegacy .specfuse/scripts/ shims):\n\n1. The shipped verification.yml `plannext` gate ran\n   `python .specfuse/scripts/lint_plan.py {feature_dir}` — a script\n[…]\nrows.\n\nVerification:\n- 1038 tests pass (4 new); ruff clean; bandit clean; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: make a fresh pip/pipx-installed project actually runnable (#89)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-22T14:23:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ca6a670943cf34a0f0a863c007b27a640d80476e",
          "body": "…fuse-loop) (#88)\n\nThe user-facing docs still described the pre-pip flow — `./init.sh /path` to\ncopy a scaffold in, and `python .specfuse/scripts/loop.py` to run — which is\nwrong for anyone installing from PyPI: a `specfuse init`-scaffolded project has\nno `.specfuse/scripts/loop.py` (the driver is t\n[…]\nords.\n\nVerification:\n- 1038 tests pass (scaffold docs/data parity green); leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: update install/run flow to pip + umbrella (specfuse init / spec…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-22T13:47:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b2c46f957195c0607aac23a8d8c6f147c434576f",
          "body": "The package version lives in four sources that must agree: pyproject\n[project] version, DRIVER_VERSION (loop.py), the canonical .specfuse/VERSION,\nand the synced specfuse/loop/data/VERSION seed. The 0.3.0 release required\nediting all four by hand; release.yml's tag/version-agreement check covers\nonl\n[…]\n a temp tree.\n\nVerification:\n- 1038 tests pass; ruff clean; bandit clean; leak-scan clean.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: guard version-source agreement + add bump helper (#87)",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-22T13:02:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c88f41c55e5542b6e2718a52e3fe75fe9f416cb6",
          "body": "…2.0 (#86)\n\nMinor bump: v0.2.0..HEAD added new functionality, not just fixes.\n\nFeatures:\n- FEAT-2026-0026 — pip package ships the full scaffold (specfuse/loop/data/);\n  `specfuse init/upgrade`.\n- FEAT-2026-0027 — self-provisioning driver: auto-syncs .specfuse/ + plugin\n  config on run.\n- FEAT-2026-0\n[…]\n entry quotes a\n'@test.com' example token by design. CI leak-scan gate (scan_repo) passes.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): prep 0.3.0 — three features + six bug fixes since v0.…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-22T12:24:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "153255d93bb47fa93ee741a43979577f62806b1b",
          "body": "…patch (#84)\n\nCloses #74. arm-gate (and any manual WU-body revision at a gate boundary)\nwrites UNCOMMITTED working-tree changes: WU status flips (draft → pending),\nthe completed gate's flip (awaiting_review → passed), and edited acceptance\ncriteria. If the operator then runs loop.py and the first di\n[…]\nrefuses); the complementary\narm-gate-commits change (option 1) is a separate skill update.\n\nCo-authored-by: Test <test@example.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(loop): refuse uncommitted arm-gate / WU-revision edits before dis…",
          "author_name": "Christian Labonté",
          "author_login": "clabonte",
          "committed_at": "2026-06-20T21:23:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 15,
      "commits_last_year": 201,
      "latest_release_at": "2026-07-10T15:10:05Z",
      "latest_release_tag": "v0.3.12",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 8,
      "days_since_latest_release": 13,
      "mean_days_between_releases": 1.8
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 87,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "specfuse-loop",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [
            "specfuse",
            "agents",
            "planning",
            "ralph",
            "gate-cycle",
            "Intended Audience :: Developers",
            "License :: OSI Approved :: Apache Software License",
            "Programming Language :: Python :: 3",
            "Programming Language :: Python :: 3 :: Only",
            "Programming Language :: Python :: 3.10",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.12",
            "Topic :: Software Development"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/specfuse-loop/",
          "is_deprecated": false,
          "latest_version": "0.3.24",
          "repository_url": "https://github.com/specfuse/loop",
          "versions_count": 26,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2026-06-19T00:29:56.272452Z",
          "latest_published_at": "2026-07-23T16:03:16.477415Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 2
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 246031,
      "source_files_sampled": 148,
      "oversized_source_files": 1,
      "agent_instruction_files": [
        ".claude/CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 454
    },
    "dependencies": {
      "manifests": [
        "pyproject.toml",
        "requirements.txt"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "pypi"
      ],
      "dependencies": [],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 156,
        "open_issues": 2,
        "closed_ratio": 0.97,
        "closed_issues": 65,
        "closed_unmerged_prs": 1
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "clabonte",
          "commits": 206,
          "avatar_url": "https://avatars.githubusercontent.com/u/3989686?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "leak-scan-content.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/29 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 4,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "4d4854a1efe8374a5337b43ff28c594836b5ed94",
        "ran_at": "2026-07-23T16:19:47Z",
        "aggregate_score": 4.9,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-23T16:03:25Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-23T15:46:29Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 209,
          "created_at": "2026-07-22T23:00:52Z",
          "last_comment_at": "2026-07-23T01:24:01Z",
          "last_comment_author": "clabonte"
        },
        {
          "number": 223,
          "created_at": "2026-07-23T12:12:07Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/specfuse/loop",
    "host": "github.com",
    "name": "loop",
    "owner": "specfuse"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 58,
      "inputs": {
        "security": 49,
        "vitality": 76,
        "community": 43,
        "governance": 53,
        "engineering": 67
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 76,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "commits_last_year": 201,
              "human_commit_share": 0.95,
              "days_since_last_push": 0,
              "active_weeks_last_year": 8
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "8/52 weeks with commits",
                "points": 5.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "201 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 201
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 15,
              "latest_release_tag": "v0.3.12",
              "releases_from_tags": false,
              "days_since_latest_release": 13,
              "mean_days_between_releases": 1.8
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "15 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 15
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 13 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 13
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~1.8 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1.8
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 43,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 53,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 83,
            "inputs": {
              "merged_prs": 156,
              "open_issues": 2,
              "closed_issues": 65,
              "issue_closed_ratio": 0.97,
              "closed_unmerged_prs": 1
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "97% of issues closed",
                "points": 45.3,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 97
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "156/157 decided PRs merged",
                "points": 38,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 156,
                      "decided": 157
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/29 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 36,
            "inputs": {
              "followers": 0,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "specfuse",
              "public_repos": 4,
              "account_age_days": 97
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "0 followers of specfuse",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "specfuse"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "4 public repos, account ~0 yr old",
                "points": 5.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 4
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "specfuse-loop"
              ],
              "ecosystems": "pypi",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on pypi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "26 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 26
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 67,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 49,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 49,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 4.9
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/29 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 59,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                ".claude/CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 454
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": ".claude/CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".claude/CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "95 of 95 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 95,
                      "sampled": 95
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.93,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0.05
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "93 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 93,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "5 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 5,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 246031,
              "source_files_sampled": 148,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/148 source files over 60KB",
                "points": 54.6,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 148,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index pypi:specfuse-loop@0.3.24; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T16:20:05.705541Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/specfuse/loop.svg",
  "full_name": "specfuse/loop",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasPyPI.