Öffentliches Register
Software-GesundheitsberichtSchema 0.31.0 · Metriken 2.5.0 · 2026-08-05 09:22 UTC

re-cinq / wave

Multi-agent pipelines for AI-assisted development

GoMIT★ 20 Sterne⑂ 3 Forksseit Feb. 2026Auf GitHub ansehen ↗
ArtKommandozeilenwerkzeugTerminal-Oberflächewie das ermittelt wird

re-cinq/wave erreicht einen Gesundheitsindex von 54 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Engineering Quality (86/100) ab, am schwächsten bei Security (27/100). Zuletzt vor 93 Tagen aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

54
gesamt / 100
Mittel

Software-Gesundheitsindex

Metriken werden auf einer standardisierten Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr gewichtetes Mittel, kalibriert auf die Verteilung des öffentlichen Registers, sodass die Stufen Perzentilbedeutung tragen; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze Gefährdet von 34.

54
Außergewöhnlich93-100Die Spitzengruppe des Registers (≈ obere 5 %); erfüllt im Wesentlichen alle geprüften Kriterien
Exzellent80-92Durchgehend stark; geringfügige Lücken
Gut65-79Gesund; Lücken sind begrenzt und beherrschbar
Mittel50-64Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Schwach35-49Wesentliche Schwächen in mehreren Bereichen
Gefährdet20-34Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-19Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Der gewichtete Gesamtwert 53 wird auf der veröffentlichten Indexskala auf 54 kalibriert (Register-Kalibrierung 2026-08-02).

Eigentümerschaft

re:cinqOrganisation
16 Follower43 öffentliche Reposseit Aug. 2023

Dieses Repository wird von einer Organisation getragen — geteilte, rechenschaftspflichtige Trägerschaft, die jeden einzelnen Maintainer überdauern kann.

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

55Mittel · 21 % des Gesamtindex
Wie die Bewertung erfolgt
9.9/36Push-Aktualität — letzter Push vor 93 Tagen
9.7/36Commit-Rhythmus — 14/52 Wochen mit Commits
18/18Commit-Volumen — 2.470 Commits im letzten Jahr
0/10OpenSSF Scorecard: Maintained — 0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Verwendete Eingangsdaten
commits_last_year2.470
human_commit_share1
days_since_last_push93
active_weeks_last_year14
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 100 Releases veröffentlicht
27/36Release-Aktualität — letztes Release vor 96 Tagen
27/27Release-Rhythmus — ein Release etwa alle 0 Tage
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Verwendete Eingangsdaten
releases_count100
latest_release_tagv0.273.1
releases_from_tagsnein
days_since_latest_release96
mean_days_between_releases0

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

45Schwach · 17 % des Gesamtindex
Wie die Bewertung erfolgt
20.7/60Stars — 20 Stars
2.5/25Forks — 3 Forks
0/15Watcher — 0 Watcher
Verwendete Eingangsdaten
forks3
stars20
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (MIT)
18/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
readme_badges2
has_contributingja
has_issue_templatenein
has_code_of_conductnein
readme_badge_servicesshields.io
has_pull_request_templatenein

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

43Schwach · 23 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 100 % der Commits
1.4/13.5Breite der Beitragenden — 1 Beitragende
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Verwendete Eingangsdaten
bus_factor1
contributors_sampled1
top_contributor_share1
Wie die Bewertung erfolgt
31.7/42Issue-Lösungsquote — 76 % der Issues geschlossen
24.9/30PR-Annahme — 521/627 entschiedene PRs gemergt
0/13Newcomer PR acceptance — kein PR eines Erstbeitragenden in 30 Tagen entschieden
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
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
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): newcomer_pr_acceptance. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
30/30Organisatorische Trägerschaft — im Besitz einer Organisation
0/20Verifizierte Domain
8.8/25Reichweite des Inhabers — 16 Follower von re-cinq
18/25Kontohistorie — 43 öffentliche Repos, Kontoalter ca. 3 Jahre
Verwendete Eingangsdaten
followers16
owner_typeOrganization
is_verified
owner_loginre-cinq
public_repos43
account_age_days1.098

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

86Exzellent · 19 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 3 Workflow(s)
24/24Tests vorhanden
16/16Linter-Konfiguration — .golangci.yml
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_configja
has_precommit_confignein

Dokumentation

90Exzellent
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
15/15Dokumentations-/Homepage-Site — https://re-cinq.github.io/wave/
10/10Repository-Beschreibung
10/10Topics — 3 Topics
0/10Wiki
Verwendete Eingangsdaten
topicsai-as-code, agentic-workflow, multi-agent-systems
has_wikinein
homepagehttps://re-cinq.github.io/wave/
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

27Gefährdet · 16 % des Gesamtindex

Sicherheitslage

27Gefährdet
Wie die Bewertung erfolgt
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.5Lizenz — 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
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate2,7

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Trägt ein bewusst kleines Gewicht (4 %): Agenten-Tooling ist ein echtes Pflegesignal, doch ein Repository ohne jedes Signal kann weiterhin 100/100 erreichen.

76Gut · 4 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — AGENTS.md, CLAUDE.md, GEMINI.md
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 100 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share1
agent_instruction_filesAGENTS.md, CLAUDE.md, GEMINI.md
agent_instruction_max_bytes20.451
Wie die Bewertung erfolgt
18/18Bootstrap mit einem Befehl — Makefile
22/22Automatisierte Tests
11/11Lint-/Format-Konfiguration — .golangci.yml
11/11Statische Typprüfung — Go (statisch typisiert)
10/10Reproduzierbare Umgebung — Nix, lockfile
0/10Belegte Agentenpraxis — keine von Agenten verfassten Commits unter den letzten 100
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
1/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
Verwendete Eingangsdaten
has_nixja
has_testsja
lockfilesgo.sum, package-lock.json
has_dockerfilenein
typed_languageja
bootstrap_filesMakefile
has_devcontainernein
has_linter_configja
typecheck_configs
agent_commit_share0
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — Go (statisch typisiert)
54.6/55Handhabbare Dateigrößen — 6/872 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageGo
largest_source_bytes232.035
source_files_sampled872
oversized_source_files6
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
0/20MCP-Server
40/40Lauffähige Beispiele — examples
Verwendete Eingangsdaten
example_dirsexamples
has_mcp_signalnein
api_schema_files

Eckdaten

20GitHub-Sterne
1Mitwirkende
2.470Commits, letzte 12 Monate
93Tage seit letztem Push
100Releases
1Bus-Faktor
248offene Issues
Go, npmPaket-Ökosysteme

Warnungen zur Datenerhebung

  • 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

Weitere Details

Stern- und Fork-Verlauf 0 ★ / 3 ⇿
0Sterne
3Forks
100Releases

Wann jeder Stern und Fork hinzugefügt wurde, von GitHub erfasst und nach Tagen gruppiert. Das kumulierte Wachstum steht direkt über den täglichen Zugängen, aus denen es besteht, sodass beide gegeneinander lesbar sind: stetiger organischer Zuwachs sieht ganz anders aus als ein abrupter, kurzlebiger Ausschlag. Wo dieser Unterschied messbar ist, wird er als Wachstumsauthentizität ausgewiesen.

12233312026-032026-052026-07
Major 0Minor 36Patch 64
OpenSSF Scorecard 2.7 / 10
2.7Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).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
Direkte Abhängigkeiten 15
RegistryPaketVersionsvorgabeManifest
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
Alle Abhängigkeiten nicht erhoben

Der aufgelöste Abhängigkeitssatz konnte für diesen Bericht nicht erhoben werden: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

JSON-Rohbericht maschinenlesbar
{
  "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"
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v2.5.0, Schema v0.31.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte Statistiken.