Registro público
Informe de salud del softwareesquema 0.31.0 · métricas 2.5.0 · 2026-08-05 09:22 UTC

re-cinq / wave

Multi-agent pipelines for AI-assisted development

GoMIT★ 20 estrellas⑂ 3 forksdesde feb 2026Ver en GitHub ↗
TipoHerramienta de línea de comandosInterfaz de terminalcómo se determina

re-cinq/wave tiene un índice de salud de 54 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Engineering Quality (86/100) y la más baja, Security (27/100). Se actualizó por última vez hace 93 días. Una sola persona concentra la mayor parte del trabajo reciente.

54
global / 100
Moderado

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala estandarizada de 1 a 100. El resultado global parte de su media ponderada, calibrada contra la distribución del registro público para que las bandas tengan significado percentil; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe un límite «En riesgo» de 34.

54
Excepcional93-100El nivel más alto del registro (≈ el 5% superior); cumple prácticamente todos los criterios evaluados
Excelente80-92Sólido en todos los frentes; carencias menores
Bueno65-79Saludable; carencias limitadas y manejables
Moderado50-64Aceptable con carencias notables; se recomienda revisión
Débil35-49Debilidades sustanciales en varias áreas
En riesgo20-34Debilidades significativas; su adopción exige cautela
Crítico1-19Problemas 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.

El resultado global ponderado 53 se calibra a 54 en la escala publicada del índice (calibración del registro 2026-08-02).

Titularidad

re:cinqOrganización
16 seguidores43 repositorios públicosdesde ago 2023

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

Métricas por categoría

Vitalidad

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

55Moderado · 21% del índice global
Cómo se puntúa
9.9/36Recencia de push — último push hace 93 días
9.7/36Cadencia de commits — 14/52 semanas con commits
18/18Volumen de commits — 2470 commits en el último año
0/10OpenSSF Scorecard: Maintained — 0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Datos de entrada utilizados
commits_last_year2470
human_commit_share1
days_since_last_push93
active_weeks_last_year14
Cómo se puntúa
27/27Publica versiones — 100 versiones publicadas
27/36Recencia de las versiones — última versión hace 96 días
27/27Cadencia de publicación — una versión cada ~0 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count100
latest_release_tagv0.273.1
releases_from_tagsno
days_since_latest_release96
mean_days_between_releases0

Comunidad y Adopción

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

45Débil · 17% del índice global
Cómo se puntúa
20.7/60Estrellas — 20 estrellas
2.5/25Forks — 3 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks3
stars20
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 (MIT)
18/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
readme_badges2
has_contributing
has_issue_templateno
has_code_of_conductno
readme_badge_servicesshields.io
has_pull_request_templateno

Sostenibilidad y Gobernanza

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

43Débil · 23% 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
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
31.7/42Resolución de issues — 76% de issues cerradas
24.9/30Aceptación de PR — 521/627 PR decididos fusionados
0/13Newcomer PR acceptance — ningún PR de un contribuyente primerizo decidido en 30 d
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs521
open_issues248
closed_issues764
prs_merged_7d0
prs_decided_7d0
prs_merged_30d0
prs_decided_30d0
issue_closed_ratio0,755
closed_unmerged_prs106
first_time_authors_30d0
first_time_prs_merged_30d0
first_time_prs_decided_30d0
Excluidos de la puntuación (sin datos o no aplicable): newcomer_pr_acceptance. Los pesos restantes se han renormalizado.
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
8.8/25Alcance del propietario — 16 seguidores de re-cinq
18/25Trayectoria — 43 repos públicos, cuenta de ~3 años
Datos de entrada utilizados
followers16
owner_typeOrganization
is_verified
owner_loginre-cinq
public_repos43
account_age_days1098

Calidad de Ingeniería

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

86Excelente · 19% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 3 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter — .golangci.yml
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_config
has_precommit_configno

Documentación

90Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://re-cinq.github.io/wave/
10/10Descripción del repositorio
10/10Topics — 3 topics
0/10Wiki
Datos de entrada utilizados
topicsai-as-code, agentic-workflow, multi-agent-systems
has_wikino
homepagehttps://re-cinq.github.io/wave/
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?

27En 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 — branch protection not enabled on development/release branches
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/30 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
0/7.5Maintained — 0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
5/5Packaging — packaging workflow detected
0.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 35 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate2,7

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Tiene un peso deliberadamente pequeño (4%): las herramientas para agentes son una señal real de mantenimiento, pero un repositorio sin ninguna puede alcanzar igualmente 100/100.

76Bueno · 4% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md, CLAUDE.md, GEMINI.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 100 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share1
agent_instruction_filesAGENTS.md, CLAUDE.md, GEMINI.md
agent_instruction_max_bytes20.451
Cómo se puntúa
18/18Arranque con un solo comando — Makefile
22/22Pruebas automatizadas
11/11Configuración de lint / formato — .golangci.yml
11/11Verificación estática de tipos — Go (tipado estático)
10/10Entorno reproducible — Nix, lockfile
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 100
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
1/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
Datos de entrada utilizados
has_nix
has_tests
lockfilesgo.sum, package-lock.json
has_dockerfileno
typed_language
bootstrap_filesMakefile
has_devcontainerno
has_linter_config
typecheck_configs
agent_commit_share0
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
54.6/55Tamaños de archivo manejables — 6/872 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes232.035
source_files_sampled872
oversized_source_files6
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

20estrellas de GitHub
1contribuidores
2470commits en los últimos 12 meses
93días desde el último push
100versiones publicadas
1factor bus
248issues abiertas
Go, npmecosistemas de paquetes

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • Could not fetch go package 'github.com/recinq/wave' from its registry
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Más detalle

Historial de estrellas y forks 0 ★ / 3 ⇿
0Estrellas
3Forks
100Versiones

Cuándo se añadió cada estrella y fork, recopilado de GitHub y agrupado por día. El crecimiento acumulado se sitúa justo encima de las adiciones diarias que lo componen, de modo que ambos se leen en conjunto: la acumulación orgánica sostenida no se parece en nada a un pico abrupto y efímero. Cuando esa diferencia es medible, se informa como autenticidad del crecimiento.

12233312026-032026-052026-07
Mayor 0Menor 36Parche 64
OpenSSF Scorecard 2.7 / 10
2.7agregado

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-08-05 09:22 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
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/30 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintained0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
10Packagingpackaging workflow detected
1Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 1
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities35 existing vulnerabilities detected
Dependencias directas 15
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/charmbracelet/bubblesv1.0.0go.mod
Gogithub.com/charmbracelet/bubbleteav1.3.10go.mod
Gogithub.com/charmbracelet/huhv0.8.0go.mod
Gogithub.com/charmbracelet/lipglossv1.1.0go.mod
Gogithub.com/charmbracelet/x/exp/teatestv0.0.0-20260316093931-f2fb44ab3145go.mod
Gogithub.com/chromedp/cdprotov0.0.0-20250803210736-d308e07a266dgo.mod
Gogithub.com/chromedp/chromedpv0.14.2go.mod
Gogithub.com/santhosh-tekuri/jsonschema/v6v6.0.2go.mod
Gogithub.com/spf13/cobrav1.8.0go.mod
Gogithub.com/stretchr/testifyv1.11.1go.mod
Gogolang.org/x/syncv0.19.0go.mod
Gogolang.org/x/termv0.39.0go.mod
Gogolang.org/x/textv0.28.0go.mod
Gogopkg.in/yaml.v3v3.0.1go.mod
Gomodernc.org/sqlitev1.44.3go.mod
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": {
    "icon": {
      "bytes": 394,
      "width": 32,
      "height": 32,
      "rejected": [],
      "collected": true,
      "media_type": "image/svg+xml",
      "source_url": "https://re-cinq.github.io/wave/favicon.svg",
      "source_type": "homepage",
      "content_hash": "9cdc08ed38bba6c56d0fd239d020848fc378cef4ea00d71b4368c18552770353",
      "candidates_considered": 1
    },
    "repo": {
      "topics": [
        "ai-as-code",
        "agentic-workflow",
        "multi-agent-systems"
      ],
      "is_fork": false,
      "size_kb": 17482,
      "has_wiki": false,
      "homepage": "https://re-cinq.github.io/wave/",
      "languages": {
        "Go": 7486071,
        "CSS": 187781,
        "Nix": 11676,
        "Vue": 9269,
        "HTML": 365402,
        "Shell": 78254,
        "Makefile": 2902,
        "JavaScript": 126990,
        "TypeScript": 9788
      },
      "pushed_at": "2026-05-03T20:03:21Z",
      "created_at": "2026-02-02T14:54:11Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-23T14:28:53Z",
      "description": "Multi-agent pipelines for AI-assisted development",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": "https://re-cinq.com",
      "name": "re:cinq",
      "type": "Organization",
      "login": "re-cinq",
      "company": null,
      "location": "Denmark",
      "followers": 16,
      "avatar_url": "https://avatars.githubusercontent.com/u/141229953?v=4",
      "created_at": "2023-08-02T10:07:31Z",
      "is_verified": null,
      "public_repos": 43,
      "account_age_days": 1098
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.273.1",
          "kind": "patch",
          "published_at": "2026-04-30T11:36:18Z"
        },
        {
          "tag": "v0.273.0",
          "kind": "minor",
          "published_at": "2026-04-30T11:35:33Z"
        },
        {
          "tag": "v0.272.0",
          "kind": "minor",
          "published_at": "2026-04-30T11:14:49Z"
        },
        {
          "tag": "v0.271.0",
          "kind": "minor",
          "published_at": "2026-04-30T11:13:08Z"
        },
        {
          "tag": "v0.270.0",
          "kind": "minor",
          "published_at": "2026-04-30T10:48:15Z"
        },
        {
          "tag": "v0.269.0",
          "kind": "minor",
          "published_at": "2026-04-30T09:33:41Z"
        },
        {
          "tag": "v0.268.0",
          "kind": "minor",
          "published_at": "2026-04-30T09:24:55Z"
        },
        {
          "tag": "v0.267.0",
          "kind": "minor",
          "published_at": "2026-04-30T09:24:08Z"
        },
        {
          "tag": "v0.266.0",
          "kind": "minor",
          "published_at": "2026-04-30T08:18:56Z"
        },
        {
          "tag": "v0.265.1",
          "kind": "patch",
          "published_at": "2026-04-30T07:40:12Z"
        },
        {
          "tag": "v0.265.0",
          "kind": "minor",
          "published_at": "2026-04-30T01:40:50Z"
        },
        {
          "tag": "v0.264.0",
          "kind": "minor",
          "published_at": "2026-04-30T01:37:58Z"
        },
        {
          "tag": "v0.263.0",
          "kind": "minor",
          "published_at": "2026-04-30T01:16:42Z"
        },
        {
          "tag": "v0.262.0",
          "kind": "minor",
          "published_at": "2026-04-30T00:51:59Z"
        },
        {
          "tag": "v0.261.0",
          "kind": "minor",
          "published_at": "2026-04-30T00:43:40Z"
        },
        {
          "tag": "v0.260.1",
          "kind": "patch",
          "published_at": "2026-04-30T00:37:03Z"
        },
        {
          "tag": "v0.260.0",
          "kind": "minor",
          "published_at": "2026-04-30T00:13:24Z"
        },
        {
          "tag": "v0.259.0",
          "kind": "minor",
          "published_at": "2026-04-30T00:13:09Z"
        },
        {
          "tag": "v0.258.2",
          "kind": "patch",
          "published_at": "2026-04-30T00:05:10Z"
        },
        {
          "tag": "v0.258.1",
          "kind": "patch",
          "published_at": "2026-04-29T23:52:05Z"
        },
        {
          "tag": "v0.258.0",
          "kind": "minor",
          "published_at": "2026-04-29T23:52:36Z"
        },
        {
          "tag": "v0.257.1",
          "kind": "patch",
          "published_at": "2026-04-29T23:06:58Z"
        },
        {
          "tag": "v0.257.0",
          "kind": "minor",
          "published_at": "2026-04-29T21:55:55Z"
        },
        {
          "tag": "v0.256.0",
          "kind": "minor",
          "published_at": "2026-04-29T21:55:46Z"
        },
        {
          "tag": "v0.255.0",
          "kind": "minor",
          "published_at": "2026-04-29T20:20:07Z"
        },
        {
          "tag": "v0.254.0",
          "kind": "minor",
          "published_at": "2026-04-29T19:55:38Z"
        },
        {
          "tag": "v0.253.0",
          "kind": "minor",
          "published_at": "2026-04-29T19:47:59Z"
        },
        {
          "tag": "v0.252.0",
          "kind": "minor",
          "published_at": "2026-04-29T19:38:42Z"
        },
        {
          "tag": "v0.251.6",
          "kind": "patch",
          "published_at": "2026-04-29T19:22:40Z"
        },
        {
          "tag": "v0.251.5",
          "kind": "patch",
          "published_at": "2026-04-29T18:46:44Z"
        },
        {
          "tag": "v0.251.4",
          "kind": "patch",
          "published_at": "2026-04-29T18:16:54Z"
        },
        {
          "tag": "v0.251.3",
          "kind": "patch",
          "published_at": "2026-04-29T17:02:35Z"
        },
        {
          "tag": "v0.251.2",
          "kind": "patch",
          "published_at": "2026-04-29T16:42:57Z"
        },
        {
          "tag": "v0.251.1",
          "kind": "patch",
          "published_at": "2026-04-29T16:20:38Z"
        },
        {
          "tag": "v0.251.0",
          "kind": "minor",
          "published_at": "2026-04-29T15:20:26Z"
        },
        {
          "tag": "v0.250.1",
          "kind": "patch",
          "published_at": "2026-04-29T15:18:38Z"
        },
        {
          "tag": "v0.250.0",
          "kind": "minor",
          "published_at": "2026-04-29T15:10:19Z"
        },
        {
          "tag": "v0.249.0",
          "kind": "minor",
          "published_at": "2026-04-29T15:09:46Z"
        },
        {
          "tag": "v0.248.0",
          "kind": "minor",
          "published_at": "2026-04-29T15:04:43Z"
        },
        {
          "tag": "v0.247.3",
          "kind": "patch",
          "published_at": "2026-04-29T14:31:09Z"
        },
        {
          "tag": "v0.247.2",
          "kind": "patch",
          "published_at": "2026-04-29T14:24:22Z"
        },
        {
          "tag": "v0.247.1",
          "kind": "patch",
          "published_at": "2026-04-29T14:18:06Z"
        },
        {
          "tag": "v0.247.0",
          "kind": "minor",
          "published_at": "2026-04-29T14:14:33Z"
        },
        {
          "tag": "v0.246.2",
          "kind": "patch",
          "published_at": "2026-04-29T13:29:27Z"
        },
        {
          "tag": "v0.246.1",
          "kind": "patch",
          "published_at": "2026-04-29T13:12:47Z"
        },
        {
          "tag": "v0.246.0",
          "kind": "minor",
          "published_at": "2026-04-29T13:12:34Z"
        },
        {
          "tag": "v0.245.42",
          "kind": "patch",
          "published_at": "2026-04-29T12:56:26Z"
        },
        {
          "tag": "v0.245.41",
          "kind": "patch",
          "published_at": "2026-04-29T12:50:27Z"
        },
        {
          "tag": "v0.245.40",
          "kind": "patch",
          "published_at": "2026-04-29T12:50:32Z"
        },
        {
          "tag": "v0.245.39",
          "kind": "patch",
          "published_at": "2026-04-29T10:34:24Z"
        },
        {
          "tag": "v0.245.38",
          "kind": "patch",
          "published_at": "2026-04-29T10:18:40Z"
        },
        {
          "tag": "v0.245.37",
          "kind": "patch",
          "published_at": "2026-04-29T09:54:30Z"
        },
        {
          "tag": "v0.245.36",
          "kind": "patch",
          "published_at": "2026-04-29T09:50:33Z"
        },
        {
          "tag": "v0.245.35",
          "kind": "patch",
          "published_at": "2026-04-29T09:46:48Z"
        },
        {
          "tag": "v0.245.34",
          "kind": "patch",
          "published_at": "2026-04-29T09:16:13Z"
        },
        {
          "tag": "v0.245.33",
          "kind": "patch",
          "published_at": "2026-04-29T01:08:01Z"
        },
        {
          "tag": "v0.245.32",
          "kind": "patch",
          "published_at": "2026-04-29T00:56:03Z"
        },
        {
          "tag": "v0.245.31",
          "kind": "patch",
          "published_at": "2026-04-29T00:54:15Z"
        },
        {
          "tag": "v0.245.30",
          "kind": "patch",
          "published_at": "2026-04-29T00:35:59Z"
        },
        {
          "tag": "v0.245.29",
          "kind": "patch",
          "published_at": "2026-04-29T00:31:55Z"
        },
        {
          "tag": "v0.245.28",
          "kind": "patch",
          "published_at": "2026-04-29T00:06:39Z"
        },
        {
          "tag": "v0.245.27",
          "kind": "patch",
          "published_at": "2026-04-29T00:04:03Z"
        },
        {
          "tag": "v0.245.26",
          "kind": "patch",
          "published_at": "2026-04-28T23:54:25Z"
        },
        {
          "tag": "v0.245.25",
          "kind": "patch",
          "published_at": "2026-04-28T23:15:03Z"
        },
        {
          "tag": "v0.245.24",
          "kind": "patch",
          "published_at": "2026-04-28T23:01:54Z"
        },
        {
          "tag": "v0.245.23",
          "kind": "patch",
          "published_at": "2026-04-28T22:22:22Z"
        },
        {
          "tag": "v0.245.22",
          "kind": "patch",
          "published_at": "2026-04-28T22:22:01Z"
        },
        {
          "tag": "v0.245.21",
          "kind": "patch",
          "published_at": "2026-04-28T21:49:53Z"
        },
        {
          "tag": "v0.245.20",
          "kind": "patch",
          "published_at": "2026-04-28T21:42:19Z"
        },
        {
          "tag": "v0.245.19",
          "kind": "patch",
          "published_at": "2026-04-28T21:27:06Z"
        },
        {
          "tag": "v0.245.18",
          "kind": "patch",
          "published_at": "2026-04-28T21:25:15Z"
        },
        {
          "tag": "v0.245.17",
          "kind": "patch",
          "published_at": "2026-04-28T21:23:07Z"
        },
        {
          "tag": "v0.245.16",
          "kind": "patch",
          "published_at": "2026-04-28T20:51:00Z"
        },
        {
          "tag": "v0.245.15",
          "kind": "patch",
          "published_at": "2026-04-28T20:46:10Z"
        },
        {
          "tag": "v0.245.14",
          "kind": "patch",
          "published_at": "2026-04-28T20:46:02Z"
        },
        {
          "tag": "v0.245.13",
          "kind": "patch",
          "published_at": "2026-04-28T20:38:09Z"
        },
        {
          "tag": "v0.245.12",
          "kind": "patch",
          "published_at": "2026-04-28T20:16:31Z"
        },
        {
          "tag": "v0.245.11",
          "kind": "patch",
          "published_at": "2026-04-28T19:44:55Z"
        },
        {
          "tag": "v0.245.10",
          "kind": "patch",
          "published_at": "2026-04-28T19:14:52Z"
        },
        {
          "tag": "v0.245.9",
          "kind": "patch",
          "published_at": "2026-04-28T18:59:25Z"
        },
        {
          "tag": "v0.245.8",
          "kind": "patch",
          "published_at": "2026-04-28T18:41:33Z"
        },
        {
          "tag": "v0.245.7",
          "kind": "patch",
          "published_at": "2026-04-28T18:24:05Z"
        },
        {
          "tag": "v0.245.6",
          "kind": "patch",
          "published_at": "2026-04-28T18:14:35Z"
        },
        {
          "tag": "v0.245.5",
          "kind": "patch",
          "published_at": "2026-04-28T18:12:35Z"
        },
        {
          "tag": "v0.245.4",
          "kind": "patch",
          "published_at": "2026-04-28T17:37:57Z"
        },
        {
          "tag": "v0.245.3",
          "kind": "patch",
          "published_at": "2026-04-28T17:07:10Z"
        },
        {
          "tag": "v0.245.2",
          "kind": "patch",
          "published_at": "2026-04-28T16:55:32Z"
        },
        {
          "tag": "v0.245.1",
          "kind": "patch",
          "published_at": "2026-04-28T16:29:47Z"
        },
        {
          "tag": "v0.245.0",
          "kind": "minor",
          "published_at": "2026-04-28T16:10:31Z"
        },
        {
          "tag": "v0.244.1",
          "kind": "patch",
          "published_at": "2026-04-28T15:50:37Z"
        },
        {
          "tag": "v0.244.0",
          "kind": "minor",
          "published_at": "2026-04-28T15:47:01Z"
        },
        {
          "tag": "v0.243.1",
          "kind": "patch",
          "published_at": "2026-04-28T15:31:45Z"
        },
        {
          "tag": "v0.243.0",
          "kind": "minor",
          "published_at": "2026-04-28T15:27:27Z"
        },
        {
          "tag": "v0.242.0",
          "kind": "minor",
          "published_at": "2026-04-28T15:08:33Z"
        },
        {
          "tag": "v0.241.1",
          "kind": "patch",
          "published_at": "2026-04-28T14:55:59Z"
        },
        {
          "tag": "v0.241.0",
          "kind": "minor",
          "published_at": "2026-04-28T13:55:48Z"
        },
        {
          "tag": "v0.240.0",
          "kind": "minor",
          "published_at": "2026-04-28T13:48:32Z"
        },
        {
          "tag": "v0.239.0",
          "kind": "minor",
          "published_at": "2026-04-28T13:41:49Z"
        },
        {
          "tag": "v0.238.1",
          "kind": "patch",
          "published_at": "2026-04-28T13:33:32Z"
        },
        {
          "tag": "v0.238.0",
          "kind": "minor",
          "published_at": "2026-04-28T13:31:41Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "6b82c89e95546829f93693d2f451afbb01e5df4f",
          "body": "…docs (#1623)\n\n- cli.md: add wave proposals subcommands (list/show/approve/reject)\n- cli.md: add proposals to quick reference table\n- web-dashboard.md: add /proposals section + API endpoints\n- state-resumption.md: add rework (test guard) failure mode\n- webhooks-worksource-overlap.md: F4 analysis (informational)",
          "is_bot": false,
          "headline": "docs: add proposals CLI reference, webui /proposals, contract rework …",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-30T11:30:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ae6c3d07591a505b0c263414adf6e424071d796b",
          "body": "…(#1621)\n\n* feat(contract): add test_count_baseline post-commit guard\n\nCloses #1584. Defense-in-depth alongside test_diff (#1583) + llm_judge\n(#1582). Compares COMMITTED tree counts of test declarations: HEAD vs\nBaseRef (default HEAD~1). Catches deletions slipping past diff\ninspection — file moves, \n[…]\nry impl-issue run now checks for test deletions (test_diff) and\nenforces test count baseline (test_count_baseline) as rework gates.\nCloses #1583, #1584 wiring gap — contracts existed but were unwired.",
          "is_bot": false,
          "headline": "feat(contract): wire test_diff + test_count_baseline into impl-issue …",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-30T11:29:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e3d5eed8468c6894629118d0e8ce24ffeb00d74b",
          "body": "* feat(contract): add test_count_baseline post-commit guard\n\nCloses #1584. Defense-in-depth alongside test_diff (#1583) + llm_judge\n(#1582). Compares COMMITTED tree counts of test declarations: HEAD vs\nBaseRef (default HEAD~1). Catches deletions slipping past diff\ninspection — file moves, force-push\n[…]\n on Project\n\nWithout these fields the wave.yaml entries from the same PR fail YAML\nunmarshal in TestLoadWaveYAML_PersonaPermissions. Mirrors the contract\nfields added in internal/contract/contract.go.",
          "is_bot": false,
          "headline": "feat(contract): test_count_baseline post-commit guard (#1584) (#1619)",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-30T11:09:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a14861480f026bb0b07957907fd2038244b07c3b",
          "body": "`wave proposals rollback <pipeline_name>` and POST\n/pipelines/{pipelineName}/rollback flip the active pipeline_version\nto the highest version below the active one. Reuses the existing\nstate.ActivateVersion atomic flip — no schema changes.\n\n- `internal/proposals/rollback.go` PriorVersion helper + sen\n[…]\nname}/rollback to avoid mux conflict with\n  the existing /proposals/{id}/{approve,reject} wildcards.\n- Tests cover prior-found, gap-aware rollback, no-active, no-prior.\n\nPart of epic #1565 follow-ups.",
          "is_bot": false,
          "headline": "feat(proposals): evolution auto-rollback CLI + webui (F3) (#1620)",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-30T11:07:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8be20ed56942880d5ea26151284b1de4b7c56542",
          "body": "* feat(contract): add test_diff guard against persona test-deletion\n\nCloses #1583. Net deletions of `func Test*` lines in `*_test.go` diff\nbeyond MaxTestDeletions (default 0) fail the contract. Renames net to\nzero. No HEAD / no git → silent skip (companion source_diff catches).\n\n* refactor(contract)\n[…]\nvior. Pipelines override per\nproject ecosystem (Python `def test_*`, JS `it(/test(`, etc.). Two new\ntests cover Python + TypeScript configs.\n\n* fix(contract): test_diff error string staticcheck ST1005",
          "is_bot": false,
          "headline": "feat(contract): test_diff guard against test-deletion (#1583) (#1618)",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-30T10:42:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "71a8db8d539708ab90a1660da03918862158f85d",
          "body": "* feat(webui,cli): proposals approval UI for evolution gate (#1613)\n\nAdd human-approval gate for evolution proposals via webui /proposals\n(list/detail/approve/reject) and CLI `wave proposals` (list/show/approve/\nreject). Approve calls EvolutionStore.DecideProposal then\nCreatePipelineVersion(active=t\n[…]\ns the proposal decided. Diff render uses escaped <pre> with\nclass spans, no new chroma dep. Webui reuses per-session CSRF middleware.\n\n* fix(proposals): atomic ApproveProposalAndActivate via single tx",
          "is_bot": false,
          "headline": "feat(webui,cli): proposals approval UI for evolution gate (#1614)",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-30T09:28:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4de0e1cc87664d6bae6f6ee6661d8accfcba4554",
          "body": "* feat(evolution): trigger heuristics for pipeline-evolve (#1612)\n\nShouldEvolve(pipelineName) decides when accumulated pipeline_eval rows\nwarrant firing pipeline-evolve. Three heuristics evaluated as OR:\n\n- every-N: median judge_score dropped >=0.1 over 2x10-row window\n  (filtered to rows after last\n[…]\nver block finalize.\n\nLastProposalAt(name) added to EvolutionStore to anchor the every-N\nwindow's \"since last evolution\" semantics.\n\n* fix(evolution): allocate combined slice to avoid appendAssign lint",
          "is_bot": false,
          "headline": "feat(evolution): trigger heuristics for pipeline-evolve (#1616)",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-30T09:18:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1cee68a5f82d26411533b6f0bcae7aa5dd1ebed3",
          "body": "…k (#1615)\n\nThe \"step wrote N file(s) outside declared output_artifacts\" warning\nwalked the entire workspace dir and flagged every pre-existing file as\n\"unexpected\". For worktree workspaces this meant ~2477 files (the full\nproject checkout) showed up on every step, swamping signal with noise.\n\nReal-\n[…]\n, __pycache__, .venv, venv, .tox, .pytest_cache, .bundle,\n.cache, .gradle, .mvn, .next, .nuxt, .turbo. Keeps build-output names\n(dist, build, out, bin, obj) UNpruned because some projects commit them.",
          "is_bot": false,
          "headline": "fix(pipeline): use git status for artifact warning, not workspace wal…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-30T09:18:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ac460901babdaac86911fa424d8964dd5a02ec4e",
          "body": "* feat(pipelines): add pipeline-evolve meta-pipeline (#1607)\n\nShip the four-step pipeline-evolve.yaml that ingests pipeline_eval\nhistory for a target pipeline and proposes an improved v+1 (yaml +\npersona-prompt diffs) via LLM, recording the candidate as a 'proposed'\nrow in evolution_proposal for the\n[…]\nSchemaSync, and covers gather-eval + record + skip\nbranches with direct bash-script tests against a real on-disk SQLite.\n\n* fix(pipeline-evolve): drop pipefail (sh-incompat) + bump analyze to balanced",
          "is_bot": false,
          "headline": "feat(pipelines): add pipeline-evolve meta-pipeline (#1611)",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-30T08:18:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "efab2520a238db3277b5f0822bf6ddfd32213c20",
          "body": "Phase 3.1 of Epic #1565 evolution loop: define typed EvalSignal contract\ntypes and emit per-step + per-run signals from the executor into the\npipeline_eval table via state.EvolutionStore.RecordEval.\n\n- internal/contract/eval_signal.go: SignalKind enum (success, failure,\n  contract_failure, judge_sco\n[…]\nty. RecordEval failures never\n  bubble up.\n- Wired into executor_steps.go terminal branches and into\n  executor_lifecycle.go finalizePipelineExecution + scheduling-loop\n  failure/rejection exit paths.",
          "is_bot": false,
          "headline": "feat(evolution): EvalSignal types + post-run hook (#1606) (#1610)",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-30T08:13:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fef4e9618ecbffa590e49ace11e21e1e72067eb5",
          "body": "… (#1609)\n\nCheapest (Haiku) tier produced shallow / lazy outputs on judgment-shaped\nwork — most visibly the test deletion in #1582 and forbidigo-panic\npatterns in #1585. Real-world signal from Epic #1565 Phase 1 dispatch:\nHaiku is fine for summary/distill/format steps but not for any persona\nthat sc\n[…]\nfetch-only steps\n\nAlso adds golangci-lint to flake.nix devShell so the same lint that gates\nCI runs locally without manual install (CI uses v2.10, nixpkgs ships v2.8 —\nminor skew, acceptable for now).",
          "is_bot": false,
          "headline": "chore(pipelines): raise judgment-step model from cheapest to balanced…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-30T07:34:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d00be0856fb3f5bc081c987865749b936a2c3f25",
          "body": "Replace empty fixture structs in preview_fixtures.go with five per-route\nservice interfaces (PreviewLandingSource, PreviewOnboardSession,\nPreviewWorkSource, PreviewWorkItemSource, PreviewProposalSource), typed\nview-model structs, deterministic stub implementations, and a package-level\npreviewService\n[…]\nservices\".\nBuild remains gated by webui_preview tag; default build keeps zero preview\nfootprint.\n\nAdds preview_stubs_test.go covering per-stub determinism, no-error guarantee,\nand registry population.",
          "is_bot": false,
          "headline": "feat(webui): phase B preview stub services (#1600) (#1605)",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-30T01:35:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "111657f17370b35f68f8959061d67908f6c644b3",
          "body": "Replace runtime cdn.tailwindcss.com script in templates/work/{board,detail}.html\nwith a build-time-compiled, embedded /static/tailwind.css. The compiled file is\ncommitted so plain go build still works without Node or the Tailwind CLI.\n\n- internal/webui/tailwind.{input.css,config.js}: Tailwind v3 sou\n[…]\nwind_test.go: asserts CSS embedded, non-empty, contains\n  --tw- custom props + bg-slate-50 utility; guards templates against CDN\n  regression\n- docs/build.md: front-end build steps + npx fallback path",
          "is_bot": false,
          "headline": "feat(webui): vendor Tailwind via go:embed (#1601) (#1604)",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-30T01:32:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "18534967e2c93381ad1350682e976b815ca7b587",
          "body": "…ests (#1603)\n\nPipeline runs on PRs #1596, #1600, #1601 each got stuck in fix-implement\nre-running this test trying to chase its intermittent failure (httptest\nserver + goroutine sequencing). The unit-level coverage in\nhandlers_onboard_test.go already exercises the same code paths.\n\nSkipped pending a rebuild that doesn't depend on httptest goroutine\ntiming.",
          "is_bot": false,
          "headline": "chore(test): skip flaky TestOnboardSSEPostRoundTrip; cover via unit t…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-30T01:11:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aedad94f7426b9fdd6a62491081dab3a8bacd86a",
          "body": "…1602)\n\nReplace static GET /{$} -> /runs redirect with sentinel-aware handler.\nIf .agents/.onboarding-done exists under repoDir, redirect / -> /work;\notherwise redirect / -> /onboard. Stat errors fall through to /onboard\nas the safer default. Reuses onboarding.SentinelFile and the existing\nserverRuntime.repoDir populated from git rev-parse --show-toplevel.\n\nAdds handlers_root_test.go with t.TempDir fixtures covering both\nbranches plus an empty-repoDir fallback case.",
          "is_bot": false,
          "headline": "feat(webui): smart-redirect / based on onboarding sentinel (#1599) (#…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-30T01:06:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "828f28ba59f6d102312ee337d4fda5d4a73f49f3",
          "body": "* feat(webui): wire run-on-this-issue dispatch (#1595)\n\nAdd POST /work/{forge}/{owner}/{repo}/{number}/dispatch handler that resolves\nmatching worksource bindings, picks a pipeline (409 on zero, 400 on ambiguous,\nexplicit pipeline form value disambiguates), serializes the work_item_ref\nshared schema\n[…]\nrge param from dispatch test helpers (unparam lint)\n\n* fix(test): drop owner/repoPattern params (unparam) — hardcode in helpers\n\n* fix(test): drop unused labels param from seedBinding (unparam, final)",
          "is_bot": false,
          "headline": "feat(webui): wire run-on-this-issue dispatch (#1595) (#1598)",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-30T00:46:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f4a04a275f804b20b02edba711cbba4ccf878506",
          "body": "Add unified /work board listing all worksource bindings + a\n/work/{forge}/{owner}/{repo}/{number} detail view backed by the\nworksource.Service from #1591. Two self-contained Tailwind CDN\ntemplates render board + detail without extending layout.html so\nutility classes don't collide with the project s\n[…]\ns; round-trip tests for both handlers\n  (Empty / WithBindings / NoMatch / OneMatch / BadNumber)\n- specs/1594-work-board/: spec + plan + tasks\n\nRefs #1594, depends on #1591 (MERGED) and #1590 (MERGED).",
          "is_bot": false,
          "headline": "feat(webui): implement #1594 /work board + detail templates (#1597)",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-30T00:38:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b03d0df10b49a88d58fbb8864069fa6c18ce6c3e",
          "body": "…(#1596)\n\n* feat(pipeline): reject net test deletions in impl-issue via llm_judge\n\nAdds a navigator step `judge-test-deletion` between `implement` and\n`create-pr` in both `.agents/pipelines/impl-issue.yaml` and the embedfs\ndefault. The step captures the diff of `_test.go` files into\n`.agents/output/\n[…]\nhe embedfs/ timeout regression that re-introduced\n120s/90s contract bounds (PR #1589 already bumped them to 300s).\n\n* fix(defaults): also revert impl-issue.yaml — embedfs untouched, project-only guard",
          "is_bot": false,
          "headline": "fix(pipeline): reject net test deletions in impl-issue via llm_judge …",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-30T00:31:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b8f4e01ac212e51219c3bf364033599424f90ae2",
          "body": "Phase 2.2 of epic #1565 — WorkSourceService over the existing\nstate.WorksourceStore (PRE-5). Six ctx-first methods (Create/List/Get/\nUpdate/Delete/Match), typed BindingSpec validation (forge, repo glob,\nlabel filter, pipeline name, trigger enum), and an in-memory MatchBindings\nfilter against a WorkI\n[…]\n by golden test.\n\nNo webui (#2.3) and no executor wiring (#2.4) in this issue.\nWorkItemRef is a Go struct mirror of the #2.1 schema and is ready for a\none-line registry wire-up once that schema lands.",
          "is_bot": false,
          "headline": "feat(worksource): add domain service + bindings CRUD (#1591) (#1592)",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-30T00:07:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7b6aadc9b486f64b07f7c98da8a605e21d7db150",
          "body": "Phase 2.1 of Epic #1565 (work-source dispatch). Adds a draft-07 JSON\nschema at internal/contract/schemas/shared/work_item_ref.json so future\nWorkSourceService, /work board, and dispatch wiring share a validated\nshape for forge issues/PRs, scheduled jobs, and manual triggers.\n\nSchema details:\n- $id w\n[…]\npo,\n  kind/id -> number + state).\n\n.agents/contracts/ deliberately not mirrored: that registry holds\nstep-output contracts validated by sync_test.go, not pipeline-I/O\ntyped schemas (different system).",
          "is_bot": false,
          "headline": "feat(contract): add work_item_ref shared schema (#1590) (#1593)",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-30T00:07:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bf39994590514ec2d15343309a9a56036fc5985f",
          "body": "…1589)\n\n* chore(timeouts): loosen aggressive defaults causing canceled steps\n\nReal-world signal: impl-issue runs on the Wave codebase that exercise\n\\`go test ./...\\` routinely take 6-10 minutes; the prior 5-minute\nStepDefault forced a \"canceled\" failure class even when the step was\nmaking clear prog\n[…]\nll values stay overridable per-step in pipeline yaml or per-runtime\nin wave.yaml; this only loosens the fallback floor.\n\n* test(pipeline): bump GatePollTimeout assertion 30m → 60m to match new default",
          "is_bot": false,
          "headline": "chore(timeouts): loosen aggressive defaults causing canceled steps (#…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T23:59:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c44433d787da5b5f649555d26239bb818dde497f",
          "body": "Wire cmd/wave init to onboarding.BaselineService.StartSession instead of\nthe legacy RunWizard machinery. Delete the wizard step types\n(WizardConfig, WizardResult, WizardStep, DependencyStep,\nTestConfigStep, PipelineSelectionStep, AdapterConfigStep,\nModelSelectionStep, SkillSelectionStep, WaveCommand\n[…]\nure.\n\nInteractive prompts are deliberately removed pending the follow-up UI\nwork in the parent epic — non-interactive --yes / --reconfigure /\n--merge behaviour remains intact.\n\nRefs #1578, epic #1565.",
          "is_bot": false,
          "headline": "refactor(onboarding): replace RunWizard with BaselineService (#1588)",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T23:46:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "719503e189de1a0d06df8928719a6c68d3f1750e",
          "body": "Add /onboard chat-style web UI driving internal/onboarding.Service via\nSSE-streamed conversation and form-encoded answer POSTs. Covers Phase 1\nof Epic #1565: GET /onboard creates a session and redirects to\n/onboard/{id}; the page subscribes to /onboard/{id}/stream and renders\nprompts as HTML forms; POST /onboard/{id}/answer unblocks the agent's\nPromptString/PromptChoice. Last-Event-ID ring buffer replay survives\nreload. In-memory session registry on Server (mirrors activeRuns).",
          "is_bot": false,
          "headline": "feat(webui): implement #1577 onboarding driver chat shell (#1587)",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T23:46:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "033ed1cb0e2b9eabcb940b44ee1e4eaa1c01dda9",
          "body": "…s (#1586)\n\n* fix(cli): unblock cold-start bootstrap pipelines + materialise outputs\n\nThe 1.1 onboarder pipeline (PR #1581) merged with three latent\nchicken-and-egg gates that prevented `wave run onboard-project` from\never executing on a fresh repo — the exact scenario it was designed for.\n\nFixes:\n\n\n[…]\nootstrap embedded-pipeline\n  fallback now reads via embedfs\n\nTest path updates for sync_test.go + impl_finding_workspace_test.go +\nall_pipelines_load_test.go to point at the new embedfs/* directories.",
          "is_bot": false,
          "headline": "fix(cli): unblock cold-start bootstrap pipelines + materialise output…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T23:01:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2f6a9425028868fac53a7d91ad41b6f641e7931c",
          "body": "* feat(webui): /preview/* phase A (build tag, fixtures only)\n\nAdds a build-tag-gated /preview/* route group rendering five fixture-\nbacked mockup pages ported from docs/scope/mockups/. Default builds\nship zero preview footprint; the webui_preview tag activates routes,\ntemplates, css, fixtures, and s\n[…]\nd test runs.\n\nCI matrix in lint.yml builds, lints, and runs preview smoke tests\nunder both tag modes.\n\nIssue #1580 (epic #1565).\n\n* fix(webui): replace panics with init-time error sentinel (forbidigo)",
          "is_bot": false,
          "headline": "feat(webui): /preview/* phase A (build tag, fixtures only) (#1585)",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T21:50:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5065e2871708f0a05daeae065d2b71134242bf70",
          "body": "…ne (1.1) (#1581)\n\nPhase 1.1 of Epic #1565. Ships the first user-facing artefact of the\nonboarding-as-session vision: a four-step meta-pipeline that surveys an\nexisting project, proposes a tailored .agents/* overlay, writes it, and\nmarks the project as onboarded.\n\n- internal/defaults/personas/onboar\n[…]\netect, non_empty_file\n  contracts elsewhere\n- Tests: schema validates valid + invalid fixtures, registry load checks\n  for the persona / pipeline / prompts, persona-count bumped 31 -> 32\n\nIssue: #1576",
          "is_bot": false,
          "headline": "feat(onboarding): add onboarder persona + onboard-project meta-pipeli…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T21:50:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f9f3f1bd16f4b52c6f68656dd06db03654dc4c29",
          "body": "* feat(forge): add Gitea HTTP adapter (PRE-3)\n\nImplement forge.Client against the Gitea v1 HTTP API. Works with vanilla\nGitea, Forgejo (same /api/v1 surface), and Codeberg (hosted Forgejo).\nAuth via the Authorization: token <TOKEN> header, sourced from\nGITEA_TOKEN (or CODEBERG_TOKEN with GITEA_TOKEN\n[…]\n.\nVerified end-to-end: codeberg.org/forgejo/forgejo returns issues + PRs\nincluding the merged-state override (state=closed && merged=true →\nexposed as State=\"merged\" in the forge-neutral PullRequest).",
          "is_bot": false,
          "headline": "feat(forge): Gitea HTTP adapter (PRE-3) (#1575)",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T20:13:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "798c81f4e1056a04514d7aa9c167de830cb96f53",
          "body": "New bounded context for cron-driven recurring runs. Reads schedule rows\nwritten via state.ScheduleStore (PRE-5 #1568), fires due jobs through a\ncaller-supplied Dispatcher, advances next_fire_at via the cron parser.\n\nComponents:\n\n- internal/scheduler/cron.go — 5-field cron parser supporting *, N, N-M\n[…]\n(every-min/top-of-hour/weekday/range-step),\nNextFire correctness (incl. impossible-expression error), tick loop\n(due-only, future-skip, bad-cron, dispatch-err, Start fires immediately).\n\nCloses #1571.",
          "is_bot": false,
          "headline": "feat(scheduler): add cron parser + in-process tick loop (PRE-6) (#1574)",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T19:50:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a470e81f2199ed3ccf904efd9eaff75f56d640b9",
          "body": "…E-2) (#1573)\n\nSkeleton for ADR-016 D2 onboarding-as-session: a Domain Service that\nboth the CLI driver (cmd/wave/commands/init.go) and the upcoming webui\ndriver (internal/webui/handlers_onboard.go, Phase 1) consume so the\nonboarding logic — flavour detection, manifest scaffolding, sentinel\nwrite — \n[…]\ners RunWizard removal and CLI driver migration to Phase 1 children\n(1.3 and 1.4) so this PR stays purely additive — `wave init` and\n`wave init --yes` continue producing the same output.\n\nCloses #1569.",
          "is_bot": false,
          "headline": "feat(onboarding): add Service + UI interfaces and BaselineService (PR…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T19:42:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a13220d9c40b39b372b341e4379f2957c8c538c0",
          "body": "…5) (#1572)\n\nAdd the persistence surface that Phase 2 (work-source dispatch) and Phase 3\n(evolution loop) of the onboarding-as-session epic depend on:\n\n- pipeline_eval        — per-run signal aggregation (judge_score, contract\n                         pass, retry count, failure class, duration, cost\n[…]\nigrations 29-33, additive only. Indexes target the access patterns:\nListDueSchedules (active+next_fire_at), GetActiveVersion (active=1),\nListProposalsByStatus (status+proposed_at DESC).\n\nCloses #1568.",
          "is_bot": false,
          "headline": "feat(state): add 5 tables for evolution + worksource + schedule (PRE-…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T19:33:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "54a5669d29bb2d141fc84056c3f8cfec81316ef8",
          "body": "…Registry drop (#1570)\n\n* refactor(runner): extract shared executor option builder + LaunchForeground\n\nAdd runner.BuildExecutorOptions as the single source of truth for assembling\npipeline.ExecutorOption lists, and runner.LaunchForeground for CLI-shaped\nsynchronous runs. Both LaunchInProcess (webui)\n[…]\nts this.\n- Add coverage for MockOverride=true: confirms manifest-declared adapters\n  are rerouted through the supplied runner so pipelines pinning a\n  non-mock adapter still hit the mock under --mock.",
          "is_bot": false,
          "headline": "refactor(runner): unify CLI + webui executor option builder, fix With…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T19:17:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b6b59022147616dad8d37bcfa799715d55c4f244",
          "body": "* docs(scope): plan onboarding-as-session feature\n\nAdds planning docs and UI mockups for the onboarding-as-session\nexperiment: reproducible Docker VM clones a project, Claude-Code-driven\nonboarding tailors `.agents/*` to it, work-source dispatch hides\npipelines from the user, and pipelines self-evol\n[…]\n\n* fix(mockups): tighten discover box right padding\n\n* feat(mockups): remove self-evolution diagram card (unreadable)\n\n* feat(mockups): use real install script + adapter/model sub-pills in audit table",
          "is_bot": false,
          "headline": "docs(scope): plan onboarding-as-session feature (#1431)",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T18:41:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ddd0f1664bbc18573c76afb4752b11902f3020d4",
          "body": "chore: remove ontology feature entirely",
          "is_bot": false,
          "headline": "Merge pull request #1564 from re-cinq/chore/remove-ontology",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T18:10:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3079bb58e9bfc10f927a6bdac72e488c731b5670",
          "body": "The ontology feature (bounded-context injection, decision lineage\ntracking, wave analyze/evolve commands) was behind a build tag but\nleaked into 157 unconditional files: executor dependency injection,\nmanifest types, DB migrations, TUI views, onboarding wizard, and\nadapter config.\n\nRemoved:\n- intern\n[…]\npped + .agents pipelines\n- Schemas: ontology property nodes removed from wave-manifest + wave-pipeline schemas\n- Docs: vv-paradigm layers renumbered; validation.md rewritten; AGENTS.md section removed",
          "is_bot": false,
          "headline": "chore: remove ontology feature entirely",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T18:01:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2566fb36b8ed332a54b026d001e537fa8bf8520e",
          "body": "refactor(config): add EffectiveConfig merge layer (manifest+env+runtime)",
          "is_bot": false,
          "headline": "Merge pull request #1562 from re-cinq/refactor/config-effective-pr2",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T16:57:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "775c832c3787a96f89cd83eff5732109177232bf",
          "body": "Introduces config.Effective + config.Resolve, a single resolved per-run\nconfiguration view that collapses manifest defaults, the env snapshot,\nand runtime overrides with explicit precedence rules:\n  manifest < env < runtime\nZero-valued higher-precedence fields defer to lower layers so an unset\nCLI f\n[…]\nceeds\n  wave run --pipeline wave-smoke-contracts --adapter claude\n    (no --model)            succeeds, defaults to manifest tier\n\nFollow-up to PR #1561 (PR-1: runner.Options -> config.RuntimeConfig).",
          "is_bot": false,
          "headline": "refactor(config): add EffectiveConfig merge layer (manifest+env+runtime)",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T16:55:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5e78b123f4ab03e7bc8ac73ab748fdb844107c09",
          "body": "refactor(config): lift runner.Options to config.RuntimeConfig",
          "is_bot": false,
          "headline": "Merge pull request #1561 from re-cinq/refactor/config-runtime-pr1",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T16:37:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8b5d6be955362452383bfa29e852581407f2a1fe",
          "body": "Move the per-run flag bag from internal/runner into internal/config so\nruntime configuration lives next to the env snapshot in a single home.\nThis is a rename + relocation only — no semantics change.\n\nWhat moved:\n  internal/runner/options.go → internal/config/runtime.go\n  runner.Options             \n[…]\nunner/doc.go.\n\nPR-1 of #61. PR-2 will add a config.Effective merge layer that overlays\nmanifest defaults with config.RuntimeConfig and config.Env to produce\nthe resolved view consumed by the executor.",
          "is_bot": false,
          "headline": "refactor(config): lift runner.Options to config.RuntimeConfig",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T16:35:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "546c26b06e9e387ea17aec24931505b1dbfc6b62",
          "body": "refactor(metrics): extract internal/metrics package from state",
          "is_bot": false,
          "headline": "Merge pull request #1560 from re-cinq/refactor/extract-metrics-package",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T16:14:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e7d073b16dc53e48c8c3a34c5346ecc0234e5347",
          "body": "Carve performance-metric and retrospective persistence out of internal/state\ninto a dedicated internal/metrics sibling package. State stays focused on\nrun/step lifecycle; metrics owns the performance_metric and retrospective\ntables. Schema migrations remain in state's migration runner since there is\n[…]\nage.\n\nTests: go build ./...; go test -race ./... all green. New\nmetrics/store_test.go covers record + read-back, list-by-run, retro save/get\nround-trip, smoothness/status updates, and cleanup pruning.",
          "is_bot": false,
          "headline": "refactor(metrics): extract internal/metrics package from state",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T16:12:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2423466130cedbec2ed272dd6f766efd03e9c8ac",
          "body": "feat(state,webui,cmd): distinguish design-rejection from runtime failure",
          "is_bot": false,
          "headline": "Merge pull request #1559 from re-cinq/feat/run-state-design-rejection",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T15:14:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4da480ed3fb44dffde8a114b1e6e8d2048bd19a5",
          "body": "…interface\n\nrefactor(webui): drop direct internal/pipeline import via narrow interface",
          "is_bot": false,
          "headline": "Merge pull request #1553 from re-cinq/refactor/webui-narrow-pipeline-…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T15:12:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "62a06fe14192043065ba1527d3a232a7b4d699cc",
          "body": "A pipeline that halts because a gating contract reported the work is\nnon-actionable (e.g. fetch-assess setting `implementable: false` for\nan already-implemented or superseded issue) is no longer rendered as\na generic red `failed` run. It now lands in a dedicated `rejected`\nterminal state with non-re\n[…]\n) now uses `on_failure: rejected` for the\n  issue-assessment contract, fixing the inception-bugfix UX gap.\n- Regression tests cover both the rejection path and the unchanged\n  `on_failure: fail` path.",
          "is_bot": false,
          "headline": "feat(state,webui,cmd): distinguish design-rejection from runtime failure",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T15:08:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "aaea813f6f27690e008d3078c33032616132aea3",
          "body": "…rface\n\nRoutes the executor's gate and fork contracts through new runner-side\nadapters so internal/webui no longer depends on internal/pipeline in the\nfive files originally listed under #1498 sub-task B.\n\nNew runner surface:\n- WebUIGate / WebUIGateChoice / WebUIGateDecision: transport types webui\n  \n[…]\nace unchanged: /api/runs, /api/runs/<id>, /api/compose,\n/api/runs/<id>/fork, /api/runs/<id>/rewind, /api/runs/<id>/fork-points,\n/api/runs/<id>/gates/<step>/approve verified live with curl.\n\nRefs #1498",
          "is_bot": false,
          "headline": "refactor(webui): drop direct internal/pipeline import via narrow inte…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T15:06:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ab63f9e35abba52042f49054ba7ce6f0460f9621",
          "body": "…-link\n\nfeat(webui): link composition children to parent in /runs and detail pages",
          "is_bot": false,
          "headline": "Merge pull request #1558 from re-cinq/feat/webui-composition-children…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T15:03:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "02536b657e1af018cf850b889c452ea94e93ba69",
          "body": "…t-propagation\n\nfeat(pipeline): propagate parent artifacts to sub-pipeline children",
          "is_bot": false,
          "headline": "Merge pull request #1557 from re-cinq/feat/sub-pipeline-cross-artifac…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T15:03:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9eaa59e5fc66241bb2b35d77fe350e796faa9856",
          "body": "…e-outcome\n\nfeat(pipelines/wave-self): every wave-* pipeline ends with visible outcome (PR or report)",
          "is_bot": false,
          "headline": "Merge pull request #1556 from re-cinq/feat/wave-self-pipelines-visibl…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T14:59:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4732b1c38e634a090cdaada07993f238c2cf0226",
          "body": "…pages\n\nMirrors the resume linkage UI from #1548 for composition children\n(iterate / sub-pipeline / branch / loop / aggregate). Composition\nchildren have had `parent_run_id` populated since #1450, but the\nvisualisation surface only handled resumes — parent run pages had no\ninline link list to their \n[…]\nn the parent row is the discoverability\nhook. top_level_only=false continues to expose every child row inline\nunder nestChildRuns.\n\nRefs #1548 (resume pattern), #1450 (composition children DB schema).",
          "is_bot": false,
          "headline": "feat(webui): link composition children to parent in /runs and detail …",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T14:58:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8171e182485008e8051159cc67fb34590f9cf848",
          "body": "Plumb the parent pipeline's already-produced output_artifacts into\nthe child executor's crossPipelineArtifacts map at sub-pipeline\nlaunch time, mirroring the semantics that SequenceExecutor uses for\nsequence-pipeline boundaries.\n\nBefore: a child sub-pipeline's `inject_artifacts` ref of the form\n`pip\n[…]\nion: existing sequence-pipeline cross-pipeline flow keeps\n  populating the captured map shape.\n\nRefs #1551 (the optional: true workaround in impl-finding.yaml that\nshipped via #1546 is now removable).",
          "is_bot": false,
          "headline": "feat(pipeline): propagate parent artifacts to sub-pipeline children",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T14:54:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6cada9f5d07aff6afcad8e211dcc8bd337925db4",
          "body": "…tcome (PR or report)\n\nEvery wave-* self-evolution pipeline now terminates in one tangible,\noperator-clickable deliverable so a run no longer ends with files sitting\nsilently in a workspace.\n\nPer-pipeline outcomes:\n\n- wave-test-hardening: modifies the project tree, so the harden + run-tests\n  steps \n[…]\noutputs.\n- wave-smoke-contracts, wave-smoke-gates: smoke-only, untouched per spec.\n\nPipelines wave-evolve, wave-bugfix, and wave-review do not exist in this\nrepository and were therefore not modified.",
          "is_bot": false,
          "headline": "feat(pipelines/wave-self): every wave-* pipeline ends with visible ou…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T14:53:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5d6ddaa0e71038f448c69b0c2fd5e8fba4207c26",
          "body": "fix(pipeline): add prepare to wave-smoke-gates verify dependencies",
          "is_bot": false,
          "headline": "Merge pull request #1551 from re-cinq/fix/wave-smoke-gates-verify-deps",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T14:25:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "552dfcb6335d3c13caeb3b7982fd4db1707946c8",
          "body": "The verify step listed only approval-gate as a dependency, so the\nauto-injected dep artifacts mechanism (#1452) didn't propagate\nprepare's gate-marker.json into verify's workspace. The pre-#1542\nbehaviour masked this by collapsing both command steps to the project\nroot via resolveCommandWorkDir's em\n[…]\ne artifact lands at\n.agents/output/gate-marker.json (back-compat alias) and\n.agents/artifacts/prepare/gate-marker.json (canonical).\n\nVerified: pipeline now completes in 5.1s with both contracts green.",
          "is_bot": false,
          "headline": "fix(pipeline): add prepare to wave-smoke-gates verify dependencies",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T14:20:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d79922ea00dd44a53f3a2813640e1813cbd96f6b",
          "body": "refactor(tui): route pipeline_launcher detach through internal/runner",
          "is_bot": false,
          "headline": "Merge pull request #1550 from re-cinq/refactor/tui-launcher-via-runner",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T14:18:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e0ec56d0c6a4d7b42856124b1e616ffd8d0a943b",
          "body": "…inal-sites\n\nrefactor(config): migrate remaining os.Getenv sites to internal/config",
          "is_bot": false,
          "headline": "Merge pull request #1549 from re-cinq/refactor/config-env-migration-f…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T14:12:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "34c85fda2b16ce286e10f6132d3c2c7e93116b5c",
          "body": "The TUI launcher carried its own copy of the detach + spawn dance:\nexec.Command(os.Args[0], ...) with Setsid, hand-rolled env passthrough,\nlog-file routing, and PID record. PR #1527 extracted that logic into\ninternal/runner so cmd/wave/commands and internal/webui share one\ncanonical detach contract \n[…]\n go vet ./...: clean\n- golangci-lint run ./...: 0 issues\n- Full repo go test ./...: clean (one webui test flake unrelated to\n  this change, passes on retry)\n\nCloses the TUI follow-up note in PR #1527.",
          "is_bot": false,
          "headline": "refactor(tui): route pipeline_launcher detach through internal/runner",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T14:10:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "875760cb0bbf7bf9c888237715d3dcc97662766f",
          "body": "feat(state,webui): link resumed runs to parent failed run (#1510)",
          "is_bot": false,
          "headline": "Merge pull request #1548 from re-cinq/worktree-agent-ae1bde83",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T14:08:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6705943be02283bd2ff4aed5f48d4b20f2d760ba",
          "body": "Centralise the remaining four scattered env-reader call clusters behind\nthe internal/config typed surface introduced in #1531. After this commit\ngit grep -nE 'os\\.Getenv\\(' across the migrated paths returns zero hits.\n\n- internal/scope/introspect.go (3 sites): GitHub/GitLab/Gitea token\n  introspecto\n[…]\nprocessHomePath() (home, path string), and LoadMigrationEnv() with\nthe typed MigrationEnv struct (pointer fields distinguish \"unset\" from\n\"explicitly set to false\"). All new accessors have unit tests.",
          "is_bot": false,
          "headline": "refactor(config): migrate remaining os.Getenv sites to internal/config",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T14:07:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1a5b7b617a2530e4a3a0ab5f6460f32bc904fca6",
          "body": "Wire `wave resume` and the WebUI POST /api/runs/{id}/resume endpoint to\nrecord `parent_run_id`, `parent_step_id`, and `run_kind=\"resume\"` on the\nnew run row, mirroring the composition-children pattern (#1450).\n\nThe /runs page gains a `top_level_only` query param (default true) that\nhides resume/comp\n[…]\nl page renders a \"Resumed by\" pill linking to each\nresume attempt; the resumed run detail page already shows a parent\nbreadcrumb that is now labelled \"resumed from\" when run_kind=resume.\n\nCloses #1510",
          "is_bot": false,
          "headline": "feat(state,webui): link resumed runs to parent failed run (#1510)",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T14:03:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "57b294315b4633875aecf53ebd4823c16ab26f3a",
          "body": "…utput-path\n\nfix(pipeline): align ops-issue-quality enhance output to .agents/output/ convention",
          "is_bot": false,
          "headline": "Merge pull request #1547 from re-cinq/fix/ops-issue-quality-enhance-o…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T13:23:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bf9105e3afd86604cdfbc06f886f06265ea0c956",
          "body": "…ut/ convention\n\nFollow-up to #1543 which fixed the same path-convention bug on the scan\nstep. The enhance step's enhancement-summary output and its handover\ncontract still pointed at .agents/artifacts/, which is reserved for\nframework-injected upstream files. Producers must write under\n.agents/output/.",
          "is_bot": false,
          "headline": "fix(pipeline): align ops-issue-quality enhance output to .agents/outp…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T13:14:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "133950090b6295a91600872a8f9fd6bb411c7b75",
          "body": "fix(pipeline): wire impl-finding apply-fix through memory.inject_artifacts",
          "is_bot": false,
          "headline": "Merge pull request #1546 from re-cinq/fix/impl-finding-inject-artifacts",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T13:06:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "52230dd03f697ae0839b36f104302d5eee8ffd57",
          "body": "feat(pipeline): auto-escalate model tier on retry; opt-out via retry.no_escalate",
          "is_bot": false,
          "headline": "Merge pull request #1545 from re-cinq/feat/retry-model-escalation",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T13:06:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "838919449a07f158188c996572dceeda75a7ae3a",
          "body": "…opt-out",
          "is_bot": false,
          "headline": "docs(retry): document model tier escalation on retry and no_escalate …",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T13:01:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "793446f47a891cad125841da8730e6a74a6b2c24",
          "body": "The previous commit on this branch declared\nmemory.inject_artifacts with `step: fetch-pr`, but `fetch-pr` lives\nin the parent `ops-pr-respond` pipeline, not in `impl-finding`. The\ndryrun validator (internal/pipeline/dryrun.go) flags any `step:`\nreference that does not resolve to an in-pipeline step \n[…]\nnal mechanism that places `pr-context` in the\nchild workspace; the inject_artifacts block is the declarative\ncontract that earns the auto-emitted `## Input Artifacts` prompt\nblock and the audit trail.",
          "is_bot": false,
          "headline": "fix(pipeline): use pipeline: ref for cross-pipeline pr-context inject",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T12:56:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c7df15510fa21e8cf5b8c27ae41355e00ffcfd7f",
          "body": "…t-injection\n\nfix(pipeline): isolate command-step workspaces; auto-inject input artifact paths",
          "is_bot": false,
          "headline": "Merge pull request #1542 from re-cinq/fix/workspace-pollution-artifac…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T12:50:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d04e3dcd96c7910a4fccbdad98a2e5f7d3970543",
          "body": "…facts\n\nThe apply-fix step previously read pr-context directly from\n.agents/artifacts/pr-context via inline shell (jq + git checkout),\nrelying on an undocumented side-effect of the parent ops-pr-respond\npipeline's resolve-each config.inject. That bypassed the framework's\nartifact-injection contract:\n[…]\nlives. The prompt now describes\n   semantic intent only (\"pr-context carries the PR head branch\") —\n   no paths, no schema fields.\n\nFound by audit sweep (broad pipeline injection audit, this session).",
          "is_bot": false,
          "headline": "fix(pipeline): wire impl-finding apply-fix through memory.inject_arti…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T12:48:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ae56a463b9adcb112f5dce814cb11c590f5cb85b",
          "body": "…no_escalate\n\nWhen a step is retried (attempt > 1) the executor now resolves a model one tier\nstronger than the originally configured tier:\n\n  cheapest -> balanced -> strongest\n\nIf the configured model is already strongest, retries stay at strongest.\nLiteral model names (e.g. \"claude-opus-4-7\") neve\n[…]\nmpt model resolver\n- executor_dispatch.go: threads attempt index through to the resolver\n- routing_test.go: covers escalate cheapest->balanced->strongest, no-escalate\n  flag, literal-name preservation",
          "is_bot": false,
          "headline": "feat(pipeline): auto-escalate model tier on retry; opt-out via retry.…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T12:47:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4f753ba980af6413f2c98ff4158e827b4e407697",
          "body": "…t-artifacts\n\nfix(pipeline): wire inject_artifacts on ops-pr-review-publish publish step",
          "is_bot": false,
          "headline": "Merge pull request #1544 from re-cinq/fix/ops-pr-review-publish-injec…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T12:45:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e4c0518f08c143955bad4c41667b8da60747eb6",
          "body": "fix(pipeline): align ops-issue-quality scan output to .agents/output/ convention",
          "is_bot": false,
          "headline": "Merge pull request #1543 from re-cinq/fix/ops-issue-quality-output-path",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T12:45:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "46715500e53c32fa2e12f3b7070ee2c5377ad989",
          "body": "…ifact paths\n\nThree coordinated fixes for silent workspace-pollution + false-positive smoke contract:\n\n1. createStepWorkspace pre-creates .agents/output/ in the default workspace.\n   Without it, resolveCommandWorkDir saw the workspace as bare and silently\n   fell back to project root, causing comman\n[…]\nes both flags to be true.\n\nVerified end-to-end: smoke-contracts now passes only when content is actually\nvalid (data_valid=true, schema_valid=true with real 16/81-byte payloads,\nno project-root leak).",
          "is_bot": false,
          "headline": "fix(pipeline): isolate command-step workspaces; auto-inject input art…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T12:42:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0eb902d4960ebb4556cc60bf68b3e729a5f3d00b",
          "body": "… step\n\nThe publish step referenced .agents/output/review-verdict.json and\n.agents/output/diff-analysis.json directly in its prompt body, but had\nno dependencies block and no memory.inject_artifacts entries. As a\nsub-pipeline launched from ops-pr-review's profile-gated branch, its\nworkspace is isola\n[…]\ne) and remove the\nhand-written .agents/output/* paths from the prompt. The framework\nauto-injects an Input Artifacts block listing actual paths, so the\nprompt now describes only what each input means.",
          "is_bot": false,
          "headline": "fix(pipeline): wire inject_artifacts on ops-pr-review-publish publish…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T12:38:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5475837a44617014a9c260d37d3ebfb6cbe7e528",
          "body": "… convention\n\nThe scan step declared its quality-report.json output under .agents/artifacts/,\nwhich is the framework's INTERNAL injection target populated by\nmemory.inject_artifacts — not where pipelines should write outputs. Wave\nconvention is .agents/output/<name>.<ext> for declared pipeline outpu\n[…]\nts/output/quality-report.json. The artifact name (quality-report) is\nunchanged, so the enhance step's inject_artifacts reference continues to\nresolve correctly (consumers reference by name, not path).",
          "is_bot": false,
          "headline": "fix(pipeline): align ops-issue-quality scan output to .agents/output/…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T12:34:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fca4d7de3e554b3344f39a9f436307622ad313f5",
          "body": "refactor(state): retire StateStore umbrella; narrow consumer ifaces (#1496 P2)",
          "is_bot": false,
          "headline": "Merge pull request #1541 from re-cinq/refactor/1496-statestore-retire",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T10:28:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4129ef90ba48363d8e6da69dfa558875bb8ee86f",
          "body": "- StateStore is now the sum of its sub-interfaces (RunStore, EventStore,\n  OntologyStore, WebhookStore, ChatStore + Close); the ~93 inline\n  duplicate methods are gone. Methods that only lived on the umbrella\n  (GetMostRecentRunID, RunExists, GetRunStatus, ListPipelineNamesByStatus,\n  BackfillRunTok\n[…]\n  internal/state store.go (runningRunsLister for WaitForConcurrencySlot)\n- Concrete *stateStore satisfies every sub-interface unchanged.\n- Build, vet, and go test -race ./... all green.\n\nCloses #1496.",
          "is_bot": false,
          "headline": "refactor(state): retire StateStore umbrella; narrow consumer ifaces",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T10:21:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "421ff05e4d60376f5bb17dd15e53bcb57e73b066",
          "body": "refactor(webui): split Server struct into composed sub-structs (#1498 D)",
          "is_bot": false,
          "headline": "Merge pull request #1540 from re-cinq/refactor/1498-server-struct-split",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T10:12:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "853003c27a5132fb3cbad05380bfd7d3f1cb0102",
          "body": "- 27 fields grouped into transport/auth/runtime/realtime/assets\n  composed sub-structs. Top-level Server now has 6 fields\n  (5 sub-structs + sync.Mutex).\n- Handlers updated to s.transport.X, s.auth.X, s.runtime.X,\n  s.realtime.X, s.assets.X across 40 files in internal/webui/.\n- No behaviour change; HTTP API contracts and NewServer signature\n  preserved.\n\nPartial of #1498 (sub-task D — Server struct split).",
          "is_bot": false,
          "headline": "refactor(webui): split Server struct into composed sub-structs",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T10:06:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d3bba68791b8aa9a54b7c76f9cb16b1663b84074",
          "body": "refactor: extract internal/persona; resolve adapter<->manifest cycle (#1507.13.5)",
          "is_bot": false,
          "headline": "Merge pull request #1539 from re-cinq/refactor/1507-extract-persona-pkg",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T09:49:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "08b1e2fd4492b649bd3f13ec3c7fcdd8f2de9adc",
          "body": "refactor(webui): split control + runs handlers (#1498 P2 partial)",
          "is_bot": false,
          "headline": "Merge pull request #1538 from re-cinq/refactor/1498-webui-thin-handlers",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T09:44:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1340d745566f7f4edf98e2339a3f9ef809869358",
          "body": "- New internal/persona package owns the agent-compiler input type.\n- internal/adapter.PersonaSpec is now a type alias for persona.Persona;\n  adapter no longer carries its own mirror struct. Call sites that use\n  adapter.PersonaSpec{} keep working unchanged.\n- cmd/wave/commands consumes persona.Perso\n[…]\nAML tags, and behaviour are unchanged. The full\nmanifest.Persona stays in internal/manifest; aliasing it to a smaller\nneutral type would have broken its 9-field shape.\n\nPartial of #1507 (subset 13.5).",
          "is_bot": false,
          "headline": "refactor: extract internal/persona; resolve adapter cycle",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T09:43:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b26ff688fb00ae358ebf5d57c90d3010a9f69572",
          "body": "…uting\n\nrefactor(adapter): close adapter-bypass sites in webui+tui (#1501)",
          "is_bot": false,
          "headline": "Merge pull request #1537 from re-cinq/refactor/1501-adapter-bypass-ro…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T09:41:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "141a7163d594625c67fb594ea9c646fea928c5f8",
          "body": "- New internal/git package wraps git command invocations needed\n  by TUI providers; tests fake via exec runner hook.\n- webui/handlers_skills.go skill install routes through\n  internal/sandbox.RunShell so it inherits sandbox+audit policy.\n- internal/tui/{header,pipeline_detail}_provider.go consume\n  internal/git instead of exec.Command.\n\nCloses #1501.",
          "is_bot": false,
          "headline": "refactor(adapter): close adapter-bypass sites in webui+tui",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T09:35:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5130408a483ad6387cbe93ad9e42006624671f78",
          "body": "handlers_control.go (821 -> 381 LOC) by extracting fork/rewind\nhandlers, adapter/model meta endpoints, run-launcher methods,\nloadPipelineYAML and option-projection helpers into dedicated\nfiles (handlers_fork.go, handlers_meta.go, server_launcher.go,\nserver_helpers.go).\n\nhandlers_runs.go (1352 -> 319\n[…]\nferred to a\nfollow-up: gate types, fork manager, and gate registry still\nrequire pipeline types in DTOs and handler bodies, so a clean\nbreak needs a new narrow-interface layer rather than a file\nmove.",
          "is_bot": false,
          "headline": "refactor(webui): split control + runs handlers",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T09:30:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0ccec71241aa5080659d81b7735c95f082169e22",
          "body": "refactor(cmd): split runRun god function into stages (#1499 close)",
          "is_bot": false,
          "headline": "Merge pull request #1536 from re-cinq/refactor/1499-runrun-split",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T09:10:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58908438379360dc0f17fa7cc357fb70e1be5ffb",
          "body": null,
          "is_bot": false,
          "headline": "fix(cmd): drop unused p param in assembleExecutorOptions (lint)",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T09:06:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "85481aafd19fce3003f88fafd729f83587edf8e0",
          "body": "- runRun becomes thin orchestrator (~74 LOC).\n- Stages extracted: validateFlags, setupSignalHandling,\n  loadManifestAndPipeline, buildStateStore, autoRecoverResumeInput,\n  resolveOrGenerateRunID, buildExecutor, assembleExecutorOptions,\n  runOnce, runContinuous, formatRecoveryError, printSummary.\n- r\n[…]\nmDryRun) keep run.go under the size budget.\n- Each stage <= 150 LOC.\n- run.go: 953 -> 375 LOC.\n- No behaviour change; CLI flags, signals, output formats, and\n  exit codes are unchanged.\n\nCloses #1499.",
          "is_bot": false,
          "headline": "refactor(cmd): split runRun god function into stages",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T09:04:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ca7df2ab59635f9fec2d6ba63dfe7ebcffbec8b4",
          "body": "refactor(adapter,pipeline): Resolver iface + explicit ontology (#1504 close)",
          "is_bot": false,
          "headline": "Merge pull request #1535 from re-cinq/fix/1504-resolver-ontology",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T01:02:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c72fbbbdab817acf6f3bde933ec12c11a5e3412",
          "body": null,
          "is_bot": false,
          "headline": "fix(pipeline): replace ontology nil panic with NoOp default (lint)",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T00:58:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cb0d456a145bbf03a521054f69e32e769cfbf629",
          "body": "Add adapter.Resolver, a one-method interface satisfied by\n*AdapterRegistry via ResolveStrict. FallbackRunner.registry is now\ntyped as Resolver so tests can mock the single method instead of\nspinning up a real registry.\n\nMake the ontology service a required constructor argument for\nDefaultPipelineExe\n[…]\nfest declares ontology contexts.\n\nAll production call sites (cmd/wave/commands, internal/runner,\nsub-pipeline propagation) and ~150 test sites are updated to pass\nthe option explicitly.\n\nCloses #1504.",
          "is_bot": false,
          "headline": "refactor(adapter,pipeline): Resolver iface + explicit ontology",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T00:54:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "578f52e120fdc25609702ae1971f6ede12c8b05f",
          "body": "refactor(cmd): move compose logic to internal/pipeline (#1502 partial)",
          "is_bot": false,
          "headline": "Merge pull request #1534 from re-cinq/refactor/compose-relocation-1502",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T00:50:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72307ee0b13e7960bd82f9b44fb137a96e6f930d",
          "body": "refactor: centralize HTTP client in internal/httpx (#1503 partial 8.3)",
          "is_bot": false,
          "headline": "Merge pull request #1533 from re-cinq/refactor/1503-httpx",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T00:49:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "29b794083b0d9eed2032ecb32b0721b766695f49",
          "body": "- BuildExecutionPlan and ValidateComposeSpec moved from\n  cmd/wave/commands/compose.go to internal/pipeline/composition.go.\n- Now testable without cobra; reusable from webui/tui.\n- compose.go reduced from 496 to 403 LOC; cobra wiring, validation\n  formatting, and execution wiring only. setupComposeR\n[…]\nm a list of named pipelines.\n- CLI behaviour unchanged; flags, validation rules, output schemas,\n  and 'wave compose --help' output all preserved byte-for-byte.\n\nPartial of #1502 (compose.go portion).",
          "is_bot": false,
          "headline": "refactor(cmd): move compose logic to internal/pipeline",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T00:44:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0d8d392927e4ad9d3a1bfd25297b2cea8d1e7acd",
          "body": "- New internal/httpx package: shared Client with timeout, retry, and\n  audit hook configuration. Single network policy across the codebase.\n- Migrate contract/llm_judge, forge/detect, github, onboarding to consume\n  httpx.Client. forge probes and github use single-shot mode (their\n  callers handle r\n[…]\nwebui/embed, webui/handlers_runs all use internal/humanize. Only\n  audit/logger keeps a private formatDuration (\"%.3fs\" trace format) by\n  design — different output shape from humanize.\n\nCloses #1503.",
          "is_bot": false,
          "headline": "refactor: centralize HTTP client in internal/httpx",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T00:44:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3974e550b5c41a3f1fe66c53e4b3946d26b1a2d1",
          "body": "…tracts\n\nrefactor: extract internal/uitheme; onboarding no longer imports tui (#1497 residual)",
          "is_bot": false,
          "headline": "Merge pull request #1532 from re-cinq/refactor/1497-uitheme-smoke-con…",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T00:30:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "45bec3217e64b84caa9b6e3a67539f616cb08d91",
          "body": "refactor(config): centralize env reads in internal/config (#1507 partial 13.3)",
          "is_bot": false,
          "headline": "Merge pull request #1531 from re-cinq/refactor/1507-config-persona",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T00:26:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7159c91fd52f318e80fccf067b75048c102bbdfb",
          "body": "- New internal/uitheme package owns WaveTheme, SelectionStyle,\n  WaveLogo. Lightweight, free of bubbletea-specific deps so\n  non-TUI callers (notably internal/onboarding) can consume it\n  without pulling the full TUI runtime.\n- internal/onboarding/{steps,ontology_step}.go imports\n  internal/uitheme \n[…]\ni retains thin alias shim for existing consumers\n  (theme.go); migration to internal/uitheme is opt-in and\n  non-breaking.\n\nCloses #1497 (residual). Smoke-contracts pipeline fix deferred\nto follow-up.",
          "is_bot": false,
          "headline": "refactor: extract internal/uitheme; onboarding no longer imports tui",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T00:26:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "21f67bd9fa2c582553444432a68ec3f8facc8fda",
          "body": "New internal/config package consolidates env var reads. Migrated\n4 sites: contract/llm_judge (ANTHROPIC_API_KEY), adapter/github\n(GITHUB_TOKEN), display/capability (NO_COLOR/TERM/CI), hooks/env\n(WAVE_HOOK_ENABLED/etc).\n\nPartial of #1507. Persona extract (13.5) and remaining 4 sites\n(scope/introspect, webui/handlers_admin, state/migration_config,\nrunner/detach passthrough) deferred to follow-up.",
          "is_bot": false,
          "headline": "refactor(config): centralize env reads in internal/config",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T00:16:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "43c388fac5efe3ff1e77ea040c22b7aefd87889b",
          "body": "refactor(cmd): relocate misplaced infra types out of run.go (#1499 partial)",
          "is_bot": false,
          "headline": "Merge pull request #1530 from re-cinq/refactor/1499-relocations",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-29T00:00:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0f1858c238864ecd2e27fbfe537dc7a35e1ede63",
          "body": "refactor(state): physically split store.go (3386 LOC) into per-domain files (#1496 partial)",
          "is_bot": false,
          "headline": "Merge pull request #1529 from re-cinq/refactor/1496-split-state-store",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-28T23:58:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "64cd747d361559c3aa52ed6426eaa4ba778fdc2c",
          "body": "- DBLoggingEmitter -> internal/event (deletes webui duplicate\n  loggingEmitter; unified semantics preserve stream_activity tool\n  calls and PipelineID-as-runID precedence)\n- AdapterCompactionRunner -> internal/relay (was relayCompactionAdapter)\n- RunHeartbeatLoop + HeartbeatInterval -> internal/stat\n[…]\n() replaces magic-string skill paths in\n  run/resume/compose/do/meta\n\nDrops cmd/wave/commands/run.go from 1116 to 953 LOC (-163).\n\nPartial of #1499. runRun god-function split deferred to follow-up PR.",
          "is_bot": false,
          "headline": "refactor(cmd): relocate misplaced infra types out of run.go",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-28T23:54:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "05ff91c02b5781814ddef59f2d11afd359514b4d",
          "body": "Carves the 3386-LOC umbrella into 14 domain-scoped files: runs,\nevents, artifacts, cancellation, metrics, progress, chat, ontology,\nforks, retros, decisions, webhooks, outcomes, orchestration. store.go\nnow retains only types, constants, the StateStore interface, the\nconstructor, migration init, pipe\n[…]\ngnature changes, no interface changes,\nno behaviour change. StateStore umbrella retained — consumer\nmigration to narrow interfaces deferred to Part 2.\n\nPartial of #1496. Closes the file-split portion.",
          "is_bot": false,
          "headline": "refactor(state): split store.go into per-domain files",
          "author_name": "Michael Czechowski",
          "author_login": "nextlevelshit",
          "committed_at": "2026-04-28T23:53:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 100,
      "commits_last_year": 2470,
      "latest_release_at": "2026-04-30T11:36:18Z",
      "latest_release_tag": "v0.273.1",
      "releases_from_tags": false,
      "days_since_last_push": 93,
      "active_weeks_last_year": 14,
      "days_since_latest_release": 96,
      "mean_days_between_releases": 0
    },
    "artifacts": {
      "collected": true,
      "structure": [
        "tree.go_importable",
        "tree.go_main",
        "tree.goreleaser"
      ],
      "declarations": []
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "readme_badges": {
        "hosts": [
          "shields.io"
        ],
        "total": 2,
        "header": 2,
        "collected": true,
        "has_inspect_badge": false
      },
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 50,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": []
    },
    "popularity": {
      "forks": 3,
      "stars": 20,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-03-24",
            "count": 1
          },
          {
            "date": "2026-04-17",
            "count": 1
          },
          {
            "date": "2026-07-03",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 3,
        "total_forks": 3
      },
      "star_history": null,
      "open_issues_and_prs": 253
    },
    "ai_readiness": {
      "has_nix": true,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 232035,
      "source_files_sampled": 872,
      "oversized_source_files": 6,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md",
        "GEMINI.md"
      ],
      "agent_instruction_max_bytes": 20451
    },
    "dependencies": {
      "manifests": [
        "docs/package.json",
        "go.mod"
      ],
      "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": [
        "go",
        "npm"
      ],
      "dependencies": [
        {
          "name": "github.com/charmbracelet/bubbles",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.0"
        },
        {
          "name": "github.com/charmbracelet/bubbletea",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.10"
        },
        {
          "name": "github.com/charmbracelet/huh",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.8.0"
        },
        {
          "name": "github.com/charmbracelet/lipgloss",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.0"
        },
        {
          "name": "github.com/charmbracelet/x/exp/teatest",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20260316093931-f2fb44ab3145"
        },
        {
          "name": "github.com/chromedp/cdproto",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20250803210736-d308e07a266d"
        },
        {
          "name": "github.com/chromedp/chromedp",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.14.2"
        },
        {
          "name": "github.com/santhosh-tekuri/jsonschema/v6",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v6.0.2"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.8.0"
        },
        {
          "name": "github.com/stretchr/testify",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.11.1"
        },
        {
          "name": "golang.org/x/sync",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.19.0"
        },
        {
          "name": "golang.org/x/term",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.39.0"
        },
        {
          "name": "golang.org/x/text",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.28.0"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        },
        {
          "name": "modernc.org/sqlite",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.44.3"
        }
      ],
      "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": 5,
        "merged_prs": 521,
        "open_issues": 248,
        "closed_ratio": 0.755,
        "closed_issues": 764,
        "closed_unmerged_prs": 106
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "nextlevelshit",
          "commits": 2469,
          "avatar_url": "https://avatars.githubusercontent.com/u/10194510?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "docs.yml",
        "lint.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".golangci.yml"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum",
        "package-lock.json"
      ],
      "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": 0,
            "reason": "branch protection not enabled on development/release branches",
            "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/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "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": 0,
            "reason": "no 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": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
            "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": 1,
            "reason": "dependency not pinned by hash detected -- score normalized to 1",
            "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": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "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": 0,
            "reason": "35 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "6b82c89e95546829f93693d2f451afbb01e5df4f",
        "ran_at": "2026-08-05T09:22:23Z",
        "aggregate_score": 2.7,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "recent_prs": {
        "merged_7d": 0,
        "decided_7d": 0,
        "merged_30d": 0,
        "authors_30d": 0,
        "decided_30d": 0,
        "sample_size": 60,
        "window_days": 30,
        "sample_exhausted": false,
        "authors_probed_30d": 0,
        "newcomer_merged_30d": 0,
        "bot_prs_excluded_30d": 0,
        "newcomer_authors_30d": 0,
        "newcomer_decided_30d": 0
      },
      "ci_last_run_at": "2026-04-30T12:06:22Z",
      "oldest_open_prs": [
        {
          "number": 1439,
          "created_at": "2026-04-27T19:33:27Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1468,
          "created_at": "2026-04-28T09:25:51Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1472,
          "created_at": "2026-04-28T11:37:30Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1617,
          "created_at": "2026-04-30T09:31:15Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1643,
          "created_at": "2026-05-02T13:06:51Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-04-30T13:20:32Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 991,
          "created_at": "2026-04-12T00:51:00Z",
          "last_comment_at": "2026-04-17T14:59:31Z",
          "last_comment_author": "nextlevelshit"
        },
        {
          "number": 992,
          "created_at": "2026-04-12T00:51:02Z",
          "last_comment_at": "2026-04-17T14:59:43Z",
          "last_comment_author": "nextlevelshit"
        },
        {
          "number": 993,
          "created_at": "2026-04-12T00:51:03Z",
          "last_comment_at": "2026-04-17T14:59:56Z",
          "last_comment_author": "nextlevelshit"
        },
        {
          "number": 1041,
          "created_at": "2026-04-12T14:27:55Z",
          "last_comment_at": "2026-04-24T20:47:20Z",
          "last_comment_author": "nextlevelshit"
        },
        {
          "number": 1106,
          "created_at": "2026-04-13T21:44:07Z",
          "last_comment_at": "2026-04-14T09:19:43Z",
          "last_comment_author": "nextlevelshit"
        },
        {
          "number": 1123,
          "created_at": "2026-04-14T18:12:07Z",
          "last_comment_at": "2026-04-17T15:58:40Z",
          "last_comment_author": "nextlevelshit"
        },
        {
          "number": 1133,
          "created_at": "2026-04-17T14:19:26Z",
          "last_comment_at": "2026-04-22T11:19:51Z",
          "last_comment_author": "nextlevelshit"
        },
        {
          "number": 1141,
          "created_at": "2026-04-20T11:38:51Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1148,
          "created_at": "2026-04-21T22:22:37Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1149,
          "created_at": "2026-04-22T05:45:12Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1150,
          "created_at": "2026-04-22T05:45:13Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1151,
          "created_at": "2026-04-22T05:45:15Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1152,
          "created_at": "2026-04-22T05:45:16Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1153,
          "created_at": "2026-04-22T05:45:18Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1154,
          "created_at": "2026-04-22T05:45:19Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1155,
          "created_at": "2026-04-22T05:45:21Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1156,
          "created_at": "2026-04-22T05:48:34Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1157,
          "created_at": "2026-04-22T05:48:40Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1160,
          "created_at": "2026-04-22T06:03:44Z",
          "last_comment_at": "2026-04-27T00:21:47Z",
          "last_comment_author": "nextlevelshit"
        },
        {
          "number": 1161,
          "created_at": "2026-04-22T06:03:45Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/re-cinq/wave",
    "host": "github.com",
    "name": "wave",
    "owner": "re-cinq"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": "The weighted overall 53 is calibrated to 54 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 53,
            "calibrated": 54,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 54,
      "inputs": {
        "security": 27,
        "vitality": 55,
        "community": 45,
        "governance": 43,
        "calibration": "2026-08-02",
        "engineering": 86,
        "ai_readiness": 76,
        "weighted_overall_raw": 53
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 55,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "weak",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 38,
            "inputs": {
              "commits_last_year": 2470,
              "human_commit_share": 1,
              "days_since_last_push": 93,
              "active_weeks_last_year": 14
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 93 days ago",
                "points": 9.9,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 93
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "14/52 weeks with commits",
                "points": 9.7,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 14
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "2470 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 2470
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 81,
            "inputs": {
              "releases_count": 100,
              "latest_release_tag": "v0.273.1",
              "releases_from_tags": false,
              "days_since_latest_release": 96,
              "mean_days_between_releases": 0
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "100 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 100
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 96 days ago",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 96
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "exceptional",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 96,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 96 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 96
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "weak",
        "name": "Community & Adoption",
        "value": 45,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 23,
            "inputs": {
              "forks": 3,
              "stars": 20,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "20 stars",
                "points": 20.7,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "3 forks",
                "points": 2.5,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "readme_badges": 2,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "readme_badge_services": [
                "shields.io"
              ],
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "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": 0,
                "status": "missed",
                "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "weak",
        "name": "Sustainability & Governance",
        "value": 43,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "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 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 65,
            "inputs": {
              "merged_prs": 521,
              "open_issues": 248,
              "closed_issues": 764,
              "prs_merged_7d": 0,
              "prs_decided_7d": 0,
              "prs_merged_30d": 0,
              "prs_decided_30d": 0,
              "issue_closed_ratio": 0.755,
              "closed_unmerged_prs": 106,
              "first_time_authors_30d": 0,
              "first_time_prs_merged_30d": 0,
              "first_time_prs_decided_30d": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "76% of issues closed",
                "points": 31.7,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 76
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "521/627 decided PRs merged",
                "points": 24.9,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 521,
                      "decided": 627
                    }
                  }
                ],
                "max_points": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 57,
            "inputs": {
              "followers": 16,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "re-cinq",
              "public_repos": 43,
              "account_age_days": 1098
            },
            "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": "16 followers of re-cinq",
                "points": 8.8,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 16,
                      "login": "re-cinq"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "43 public repos, account ~3 yr old",
                "points": 18,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 43
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 3
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "excellent",
        "name": "Engineering Quality",
        "value": 86,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "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": ".golangci.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "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": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [
                "ai-as-code",
                "agentic-workflow",
                "multi-agent-systems"
              ],
              "has_wiki": false,
              "homepage": "https://re-cinq.github.io/wave/",
              "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": "https://re-cinq.github.io/wave/",
                "points": 15,
                "status": "met",
                "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": "3 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": 27,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 27,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 2.7
            },
            "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": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "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/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "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": "no update tool detected",
                "points": 0,
                "status": "missed",
                "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": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
                "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 1",
                "points": 0.5,
                "status": "partial",
                "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 not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "35 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "exceptional",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "commit_weight_rule": {
                "min_commits": 50,
                "min_commit_share": 0.1
              },
              "review_only_matches": 0,
              "below_threshold_exposures": [],
              "assessed_self_published_locations": 2
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 76,
        "weight": 0.04,
        "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": [
                "AGENTS.md",
                "CLAUDE.md",
                "GEMINI.md"
              ],
              "agent_instruction_max_bytes": 20451
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md, GEMINI.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md, GEMINI.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": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 73,
            "inputs": {
              "has_nix": true,
              "has_tests": true,
              "lockfiles": [
                "go.sum",
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "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": ".golangci.yml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Nix, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Nix, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 1",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "exceptional",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 232035,
              "source_files_sampled": 872,
              "oversized_source_files": 6
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "6/872 source files over 60KB",
                "points": 54.6,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 872,
                      "oversized": 6
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "weak",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "top": [
        "application"
      ],
      "labels": [
        "cli",
        "tui"
      ],
      "scores": {
        "cli": 4,
        "tui": 4,
        "library": 3,
        "application": 9
      },
      "primary": "cli",
      "evidence": [
        {
          "tier": "structure",
          "label": "application",
          "source": "tree.go_main",
          "weight": 5
        },
        {
          "tier": "structure",
          "label": "application",
          "source": "tree.goreleaser",
          "weight": 4
        },
        {
          "tier": "dependencies",
          "label": "cli",
          "source": "dep:github.com/spf13/cobra",
          "weight": 4
        },
        {
          "tier": "dependencies",
          "label": "tui",
          "source": "dep:github.com/charmbracelet/bubbletea",
          "weight": 4
        },
        {
          "tier": "structure",
          "label": "library",
          "source": "tree.go_importable",
          "weight": 3
        }
      ],
      "artifacts": [],
      "confidence": "medium",
      "host_extension": false,
      "runs_as_process": true,
      "consumed_by_code": false
    },
    "metrics_version": "2.5.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "Could not fetch go package 'github.com/recinq/wave' from its registry",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-08-05T09:22:43.207810Z",
  "schema_version": "0.31.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/r/re-cinq/wave.svg",
  "full_name": "re-cinq/wave",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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 v2.5.0, esquema v0.31.0 — metodología completa · wiki de métricas.

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