Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 2.3.1 · 2026-07-28 06:02 UTC

alanchenchen / suna

Local-first terminal agent runtime with isolated subtasks and intent-aware safety.

GoEigene Lizenz★ 14 Sterne⑂ 3 Forksseit Juni 2026Auf GitHub ansehen ↗

alanchenchen/suna erreicht einen Gesundheitsindex von 48 von 100 und liegt damit im Bereich Schwach. Am stärksten schneidet es bei AI Readiness (74/100) ab, am schwächsten bei Security (26/100). Zuletzt heute aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

48
gesamt / 100
Schwach

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.

48
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 49 wird auf der veröffentlichten Indexskala auf 48 kalibriert (Register-Kalibrierung 2026-08-02).

Eigentümerschaft

Alan ChenPersönliches Konto
43 Follower34 öffentliche Reposseit Nov. 2016

Dieses Repository gehört einem persönlichen Konto. Ein Projekt mit nur einem Eigentümer trägt ein höheres Kontinuitätsrisiko als ein organisationsgetragenes.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlicht
Gogithub.com/alanchenchen/sunav0.13.3-20vor 0 Tagen

Metriken nach Kategorie

Vitalität

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

73Gut · 21 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 0 Tagen
8.3/36Commit-Rhythmus — 12/52 Wochen mit Commits
18/18Commit-Volumen — 207 Commits im letzten Jahr
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Verwendete Eingangsdaten
commits_last_year207
human_commit_share1
days_since_last_push0
active_weeks_last_year12
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 24 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 0 Tagen
27/27Release-Rhythmus — ein Release etwa alle 2,1 Tage
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Verwendete Eingangsdaten
releases_count24
latest_release_tagv0.13.3
releases_from_tagsnein
days_since_latest_release0
mean_days_between_releases2,1

Community & Verbreitung

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

32Gefährdet · 17 % des Gesamtindex
Wie die Bewertung erfolgt
18.1/60Stars — 14 Stars
2.5/25Forks — 3 Forks
0/15Watcher — 0 Watcher
Verwendete Eingangsdaten
forks3
stars14
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
16.9/22.5Lizenz — Lizenzdatei vorhanden, keine anerkannte Lizenz
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
readme_badges
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
readme_badge_services
has_pull_request_templatenein

Nachhaltigkeit & Governance

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

38Schwach · 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
0/42Issue-Lösungsquote — keine Issues oder keine Daten
0/30PR-Annahme — keine entschiedenen Pull Requests oder keine Daten
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_prs0
open_issues0
closed_issues0
prs_merged_7d
prs_decided_7d
prs_merged_30d
prs_decided_30d
issue_closed_ratio
closed_unmerged_prs0
first_time_authors_30d
first_time_prs_merged_30d
first_time_prs_decided_30d
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Issue-Lösungsquote, PR-Annahme, newcomer_pr_acceptance. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
11.8/25Reichweite des Inhabers — 43 Follower von alanchenchen
23.2/25Kontohistorie — 34 öffentliche Repos, Kontoalter ca. 9 Jahre
Verwendete Eingangsdaten
followers43
owner_typeUser
is_verified
owner_loginalanchenchen
public_repos34
account_age_days3.550
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Paketpflege

100Außergewöhnlich
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf go
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 0 Tagen
20/20Versionshistorie — 20 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesgithub.com/alanchenchen/suna
ecosystemsgo
any_deprecatednein
min_days_since_publish0

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

66Gut · 19 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 1 Workflow(s)
24/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — keine Daten
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_confignein
has_precommit_confignein
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: CI-Tests. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
10/10Repository-Beschreibung
10/10Topics — 4 Topics
0/10Wiki
Verwendete Eingangsdaten
topicsagent-runtime, ai-agent, local-first, terminal-ai
has_wikinein
homepage
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

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

26Gefährdet · 16 % des Gesamtindex

Sicherheitslage

26Gefä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
0/2.5CI-Tests — keine Daten
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
5/5Fuzzing — project is fuzzed
2.2/2.5Lizenz — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — keine Daten
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
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 — 21 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate2,6
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): ci_tests, packaging. Die verbleibenden Gewichte wurden renormalisiert.

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.

74Gut · 4 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — AGENTS.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
agent_instruction_max_bytes9.372
Wie die Bewertung erfolgt
12.6/18Bootstrap mit einem Befehl — go.mod (Toolchain-Konvention, kein Task-Runner)
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — Go (statisch typisiert)
10/10Reproduzierbare Umgebung — lockfile
0/10Belegte Agentenpraxis — keine von Agenten verfassten Commits unter den letzten 100
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilesgo.sum
has_dockerfilenein
typed_languageja
bootstrap_files
has_devcontainernein
has_linter_confignein
typecheck_configs
agent_commit_share0
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — Go (statisch typisiert)
55/55Handhabbare Dateigrößen — 0/353 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageGo
largest_source_bytes54.111
source_files_sampled353
oversized_source_files0

Eckdaten

14GitHub-Sterne
1Mitwirkende
207Commits, letzte 12 Monate
0Tage seit letztem Push
24Releases
1Bus-Faktor
0offene Issues
GoPaket-Ökosysteme

Warnungen zur Datenerhebung

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • 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
3Releases

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-062026-062026-06
Major 0Minor 0Patch 0
OpenSSF Scorecard 2.6 / 10
2.6Gesamtwert

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-07-28 06:02 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
k. A.CI-Testsno pull request found
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
10Fuzzingproject is fuzzed
9Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
k. A.Packagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
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
0Vulnerabilities21 existing vulnerabilities detected
Direkte Abhängigkeiten 12
RegistryPaketVersionsvorgabeManifest
Gocharm.land/bubbles/v2v2.1.0go.mod
Gocharm.land/bubbletea/v2v2.0.6go.mod
Gocharm.land/glamour/v2v2.0.0go.mod
Gocharm.land/lipgloss/v2v2.0.3go.mod
Gogithub.com/BurntSushi/tomlv1.6.0go.mod
Gogithub.com/Microsoft/go-winiov0.6.2go.mod
Gogithub.com/anthropics/anthropic-sdk-gov1.40.0go.mod
Gogithub.com/charmbracelet/x/ansiv0.11.7go.mod
Gogithub.com/google/uuidv1.6.0go.mod
Gogithub.com/openai/openai-go/v3v3.37.0go.mod
Gogolang.design/x/clipboardv0.8.0go.mod
Gomodernc.org/sqlitev1.50.0go.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": {
    "repo": {
      "topics": [
        "agent-runtime",
        "ai-agent",
        "local-first",
        "terminal-ai"
      ],
      "is_fork": false,
      "size_kb": 2526,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "Go": 1661976,
        "Shell": 3194
      },
      "pushed_at": "2026-07-27T13:36:46Z",
      "created_at": "2026-06-11T12:52:44Z",
      "owner_type": "User",
      "updated_at": "2026-07-27T13:42:07Z",
      "description": "Local-first terminal agent runtime with isolated subtasks and intent-aware safety.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "main",
      "license_spdx_raw": "NOASSERTION",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": "www.alancc.cn",
      "name": "Alan Chen",
      "type": "User",
      "login": "alanchenchen",
      "company": null,
      "location": "Wuhan, China",
      "followers": 43,
      "avatar_url": "https://avatars.githubusercontent.com/u/23295628?v=4",
      "created_at": "2016-11-06T15:42:23Z",
      "is_verified": null,
      "public_repos": 34,
      "account_age_days": 3550
    },
    "license": {
      "state": "custom",
      "spdx_id": null,
      "raw_spdx": "NOASSERTION",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.13.3",
          "kind": "patch",
          "published_at": "2026-07-27T13:43:03Z"
        },
        {
          "tag": "v0.13.2",
          "kind": "patch",
          "published_at": "2026-07-23T09:36:43Z"
        },
        {
          "tag": "v0.13.1",
          "kind": "patch",
          "published_at": "2026-07-21T14:53:40Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-07-21T02:00:31Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-07-20T03:36:33Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-07-17T04:29:33Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-07-16T10:48:46Z"
        },
        {
          "tag": "v0.9.4",
          "kind": "patch",
          "published_at": "2026-07-13T04:10:14Z"
        },
        {
          "tag": "v0.9.3",
          "kind": "patch",
          "published_at": "2026-07-09T12:56:18Z"
        },
        {
          "tag": "v0.9.2",
          "kind": "patch",
          "published_at": "2026-07-08T09:20:33Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-07-08T07:12:26Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-07-08T04:45:56Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-07-03T09:07:34Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-07-01T04:40:04Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-06-26T11:10:51Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-06-25T07:55:59Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-06-24T14:38:05Z"
        },
        {
          "tag": "v0.3.2",
          "kind": "patch",
          "published_at": "2026-06-22T10:12:26Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2026-06-22T10:01:32Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-06-22T09:36:44Z"
        },
        {
          "tag": "2026-6-22",
          "kind": "other",
          "published_at": "2026-06-22T05:53:17Z"
        },
        {
          "tag": "2026-6-19",
          "kind": "other",
          "published_at": "2026-06-18T16:23:01Z"
        },
        {
          "tag": "2026-6-15",
          "kind": "other",
          "published_at": "2026-06-15T07:23:28Z"
        },
        {
          "tag": "2026-6-12",
          "kind": "other",
          "published_at": "2026-06-11T13:54:36Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "f3d7a7faf4d97ea61ca235579369bd33546ef1cb",
          "body": "Use a native Bubbles list state model for Skills, MCP servers, and model selection while preserving Suna-specific actions and styling.\n\nKeep registered slash commands out of chat transcripts, reset list state when sessions change, and add regression coverage for filtering, lifecycle, and command routing.",
          "is_bot": false,
          "headline": "feat(tui): unify chat management lists",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-07-27T13:21:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38ee89e5a9a7d741bdc330be97ab652dec82c4ea",
          "body": "Keep composer rendering, focus state, and key routing aligned while terminal selection, guard confirmations, and AskUser interactions take control.\\n\\nUse Bubbles key bindings for selection and guard actions, and add regression coverage for interaction priority and focus restoration.",
          "is_bot": false,
          "headline": "fix(tui): align composer state with modal input handling",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-07-23T09:21:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5799a57fc9a5ed5348490cb1f187f49eddc1633",
          "body": "Remove private and relay-provider names from documentation, tests, and user-facing examples. Replace credential-shaped samples with neutral placeholders and safe test values.\\n\\nDocument the repository privacy policy in AGENTS.md so future code, docs, prompts, UI copy, and test fixtures avoid exposing credentials or internal provider details.",
          "is_bot": false,
          "headline": "chore: sanitize public provider examples",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-07-21T14:34:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4dd0a9db4ec8b651cc9938252fb79d60a1643177",
          "body": "Keep the edited model selected when leaving its detail page instead of resetting the model list to the first row.\\n\\nRemove duplicated Welcome picker help text and automatically return to the Welcome menu after the last visible idle session is deleted. Add regression coverage for model selection, help rendering, and idle-session lifecycle.",
          "is_bot": false,
          "headline": "fix(tui): preserve picker navigation state",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-07-21T14:34:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f44e535907fbc52d4e79e722821cfdd1757a9d9",
          "body": null,
          "is_bot": false,
          "headline": "feat(debug): add daemon memory diagnostics",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-07-20T15:45:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4ef3cdca0566277aa6df99dd09702f2146f46bfa",
          "body": "Expose third-party clients through a loopback TCP JSON-RPC transport and add suna serve for daemon discovery. Keep the official TUI on the local transport while both transports share daemon sessions, lifecycle, and handoff semantics.",
          "is_bot": false,
          "headline": "feat(transport): replace stdio runtime with tcp daemon",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-07-20T02:25:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "89079fe8f2f34c3e761f4adeed65d0bad9d511f4",
          "body": "Clear transient chat state when leaving for Welcome so transcript, render caches, tool data, interactions, and attachment references can be reclaimed. Ignore queued chat notifications while no session is open.",
          "is_bot": false,
          "headline": "fix(tui): release chat runtime on welcome",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-07-19T09:51:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "843bb616bcc4949ba382a01f33fc19c6c9c96baa",
          "body": "Cancel active runs and clear pending interactions when the last attached connection leaves a session runtime. Preserve interaction handoff while another connection remains attached.",
          "is_bot": false,
          "headline": "fix(daemon): cancel orphaned session runtimes",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-07-19T09:15:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5aef35d17d498e67ca1b3de6a3bd9f8fc46adc74",
          "body": null,
          "is_bot": false,
          "headline": "fix(tui): clarify model retry guidance",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-07-17T04:20:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bef22aaa7efc243d6b63c96114cee5b3f674acdb",
          "body": "Align the TUI session workflow with workspace-aware actions. Welcome now\nresumes or creates sessions for the current workspace, joins active\nsessions elsewhere, and exposes idle sessions elsewhere for cleanup.\n\nUpdate slash-command session navigation to separate current, active, and\nidle session gro\n[…]\n old session when creation\nfails.\n\nKeep delete confirmations bound to their original session across session\nlist refreshes, and document the updated new-session, sessions, and\nmodel command semantics.",
          "is_bot": false,
          "headline": "feat(tui): streamline session navigation",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-07-17T04:09:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "826726550d44306ecbd67c7f7fea3ae71213a9ad",
          "body": "Release idle session runtimes after a short detach grace period while keeping session metadata, persisted working state, and attachments intact.\n\nUse a generation-checked delayed unload so reconnects, active runs, state operations, waiting interactions, deletes, and pruning invalidate stale unload a\n[…]\nreconnects fast without retaining every detached session in the long-lived daemon.\n\nAdd lifecycle tests for unload, reattach reuse, persisted-state recovery, and runs that become idle after detaching.",
          "is_bot": false,
          "headline": "perf(daemon): unload detached session runtimes",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-07-16T10:37:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "46887e8e63ec9f788a81080ef29ea3842727ef75",
          "body": "Use Bubble Tea background-color queries to resolve the automatic theme while preserving the existing light and dark palettes. Refresh existing chat content when the resolved theme changes and keep explicit user choices authoritative.\n\nUnify Welcome and Config vertical navigation with a lightweight s\n[…]\n\nPolish the chat model metadata with a compact Thinking indicator and remove redundant status separators. Add focused rendering and behavior tests for themes, selection state, and configuration flows.",
          "is_bot": false,
          "headline": "feat(tui): refine theme and configuration navigation",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-07-16T09:43:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5206836900f43341c0261ba9de4efe233c91b7f9",
          "body": "Document the repository's English Conventional Commit format and require detailed English bodies for significant cross-module changes, migrations, and protocol updates.",
          "is_bot": false,
          "headline": "docs(agents): define commit message convention",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-07-16T05:06:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4c26eced44ec68c4b114ac773db1bc0f3ff593c5",
          "body": "Move runtime model choice from global active_model to persistent\nsessions.model_ref. Each session now creates an explicit immutable\nModelBinding for its runs, so model changes in one session do not affect\nother sessions or their auxiliary LLM calls.\n\n- use active_model only for new session defaults \n[…]\nodel ref\n- keep memory_queue global while persisting its processing model_ref\n- add structured unavailable-model recovery, session-aware model UI,\n  attachment cleanup, and session-model documentation",
          "is_bot": false,
          "headline": "feat(session): make model selection session-scoped",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-07-16T05:05:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "052796e72f9e994da0fc1305af12aec52719af05",
          "body": null,
          "is_bot": false,
          "headline": "fix(model): 修复 Responses 工具调用与思考摘要",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-07-14T07:26:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cdf45a887e3d501c7549479790723d44e0f9d7bb",
          "body": "Ensure the tool block for a subtask is sealed once the parent spawn\ncall finishes and no tools remain running, so subsequent main-agent\ntools start a fresh execution batch instead of being appended to the\ncompleted subtask block.\n\n- add CloseToolBlockWhenIdle flag to defer block closure\n- reset subtask cursors and selection when sealing the block\n- cover the behavior with new tool block tests",
          "is_bot": false,
          "headline": "fix(tui): close subtask tool block when idle after parent ends",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-07-13T04:02:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce2cf41c47a96c0ba48c1bad056e403695867206",
          "body": "Add guidance so the agent and guard reviewer respond in the user's\nlanguage while keeping structured keys and decision values in English.\n- system.md: write tool-call `intent` in the user's current language\n- guard_review.md: write `reason`/`suggestion` in the user's language,\n  keep JSON keys and `decision` values in English",
          "is_bot": false,
          "headline": "feat(prompt): localize agent-facing text to user's language",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-07-13T03:14:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7a716b6bbab11e5bfd6108d2c14f6318342c322d",
          "body": null,
          "is_bot": false,
          "headline": "feat: improve TUI model and session UX",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-07-09T12:32:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "182ba45589c834726405e2dd8b90db0e444edd08",
          "body": "…l+S selection\n\nMove the waiting/running status lines out of the transcript viewport and\nrender them as a locked input-area placeholder instead, so the transcript\nsignature stays stable and the bottom loading hint is not duplicated.\nReplace the Shift+drag native copy hint with an explicit Ctrl+S selection\nmode that temporarily disables mouse capture and returns to scrolling on\nEsc. Update i18n keys, help docs, and tests accordingly.",
          "is_bot": false,
          "headline": "refactor(tui): consolidate loading status into input area and add Ctr…",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-07-08T09:12:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c482d887f4c31ae4c2f4632e23f4b258e3ab53e9",
          "body": "Remove the TUI copy mode (Ctrl+Y) that toggled mouse capture, relying\ninstead on the terminal's Shift+drag native text selection. When the\ncomposer is empty, Up/Down now browse previous user messages as input\nhistory, preserving the in-progress draft on overflow. Includes tests\nfor history navigation.",
          "is_bot": false,
          "headline": "feat(tui): add input history recall and use native terminal copy",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-07-08T06:58:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f7072046e04ff593309e44a9f75a462c9711ae71",
          "body": "Replace the single-session model with a daemon-managed multi-session\nruntime. Sessions now isolate cwd, working memory, attachments, guard\nstate and run state while sharing global config, router, skills, MCP\nand memory stores.\n\nProtocol is bumped to v0.2: session.new/session.restore are replaced by\n\n[…]\n is migrated to sessions + session_state on startup.\n\nBREAKING CHANGE: stdio runtime protocol version is now 0.2; clients must\nuse session.create/session.attach instead of session.new/session.restore.",
          "is_bot": false,
          "headline": "feat(session): add multi-session management and handoff support",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-07-08T04:37:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "890bb98c1446962c5bdf20b9258b27fb3e96878f",
          "body": null,
          "is_bot": false,
          "headline": "docs: clarify Suna positioning",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-07-06T04:29:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "47382601b5582ed766fc2ee58e80158b2b67b5bb",
          "body": "Refactor docs/protocol.md into a semantic reference for maintainers\nand transport implementors, separating design principles from\ndeveloper quick-start. Update docs/runtime-stdio.md to a developer\nhandbook format with quickstart, handshake verification, and\nstructured method/notification tables.",
          "is_bot": false,
          "headline": "docs: restructure protocol reference and stdio runtime guide",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-07-03T09:56:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ba36ef2b291aae0d6eb819fc5c25e99f01611a5",
          "body": "Add `suna runtime --transport stdio` as a headless entry point\nthat exposes the existing daemon service over JSON-RPC/NDJSON with\na required `runtime.hello` handshake.\n\nExtract shared JSON-RPC serving code for local and stdio transports,\nadd transport lifecycle retention policies, and separate method\nresponses from daemon notifications in the TUI.\n\nDocument the runtime protocol, stdio integration flow, lifecycle\nsemantics, and third-party client guidance.",
          "is_bot": false,
          "headline": "feat(runtime): add stdio JSON-RPC runtime for third-party clients",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-07-03T08:51:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e3e3dc2e1fd5369b8631823a0d36d80b8a172456",
          "body": "Add FinishInfo struct to capture completion metadata from provider\nresponses and populate it in terminal stream chunks across all providers.\nRefactor LLM request logging to use dedicated stream statistics collection\nwith finish shape inference for better observability.",
          "is_bot": false,
          "headline": "feat(model): propagate finish info and refactor LLM request logging",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-07-01T04:06:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04ed2f47b9396b6f1fc2e281fad8a7a1c55da2df",
          "body": "…ents\n\nAdd router validation to reject orphan tool results without matching\nassistant calls. Expand memory compression to retain tool call parents\nfor recent tool results. Fix TUI to treat invalid spawn-prefixed tools\nas main entries when parent subtask is missing.",
          "is_bot": false,
          "headline": "fix(toolchain): validate tool result pairs and preserve tool call par…",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-30T15:24:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af382dc7a606fac1957f4d724af45a7c449295f4",
          "body": "…rers and handlers\n\nExtract input handling, attachment rendering, command overlays, live placeholders,\nreasoning display, and subtask views from monolithic chat.go, chat_render.go, and\nchat_view.go into dedicated files. This improves code organization and maintainability\nby separating concerns.",
          "is_bot": false,
          "headline": "refactor(tui): modularize chat components by extracting focused rende…",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-30T13:08:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "55f9cb8b1683f07a01d17975c2383db92e018380",
          "body": "Refactor the live transcript rendering system to use OSC (Operating System Command) sequences for embedding dynamic content like spinner frames and elapsed time. This replaces the previous placeholder approach with a more robust architecture that separates spinner and elapsed time markers, adds syncContent() calls to ensure viewport updates after state changes, and improves test coverage for the new placeholder replacement logic.",
          "is_bot": false,
          "headline": "refactor(tui): replace spinner placeholder with OSC-based live markers",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-30T12:09:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eab5a27a500adb35b723edb42955e01a9a198bae",
          "body": "…rebuilds\n\nInsert placeholder during rendering and replace with actual spinner frame\nin viewChat(), preventing O(N) transcript reconstruction on each tick.\nTruncate elapsed time to whole seconds to further reduce signature churn.",
          "is_bot": false,
          "headline": "perf(tui): defer spinner character substitution to reduce transcript …",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-30T08:08:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1958c8c42a5c88cea5851c4574d89239002e89eb",
          "body": "…ogging\n\nReplace all \"transport\" logging category references with \"ipc\" across\ndaemon and transport layers. Remove the \"perf\" logging category and\nassociated slow-performance instrumentation from TUI components,\nincluding threshold constants and timing wrappers. Clean up unused\nlogging imports and simplify time checks in transcript rendering.",
          "is_bot": false,
          "headline": "refactor(logging): rename transport category to ipc and remove perf l…",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-30T07:06:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4000c81c58782983c723fe96c01f5b2e453f3355",
          "body": "…oning\n\nImplement a notice system that shows a one-time message when a protocol\nchange automatically clears reasoning settings. The notice is deferred\nuntil the daemon confirms the config write to avoid showing success\nmessages on failure. Notices are cleared on user interaction or errors.",
          "is_bot": false,
          "headline": "feat(tui): add pending config notice when protocol change clears reas…",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-30T06:11:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6ddcd9f81ee7b1c2249067aed601604451a81124",
          "body": "…s pages\n\nPrevent duplicate input cursor blink tick chains by tracking blink state\nwith inputCursorBlinking flag. Keep the tick chain alive when navigating\naway from chat so the cursor resumes blinking on return, while keeping\nthe cursor visible on non-chat pages. Add tests verifying singleton\nstart behavior and cross-page tick continuity.",
          "is_bot": false,
          "headline": "fix(tui): ensure singleton cursor blink chain and maintain tick acros…",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-26T10:58:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ed374c6c77401bae5091ba5c0967ab3934fddcdb",
          "body": "…racy\n\nIntroduce TokenCalibrator to align local token estimates with actual\nprovider input tokens using EMA smoothing, hard range filtering, and\nrelative outlier rejection. Inject into Runner to dynamically adjust\ncompaction safety margins—thinner padding when calibrated, thicker\nduring cold start or anomalies. Separate raw estimates (for calibration\nfeedback) from calibrated values (for UI and compression decisions).",
          "is_bot": false,
          "headline": "feat(model): add token calibrator to improve context compression accu…",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-26T10:31:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "840eb82c02528b48673bf6453e33929483f69bf7",
          "body": "…nd unify Anthropic streaming\n\nSplit monolithic reasoning field handling into SDK-specific adapters\n(`reasoning_fields_openai.go`, `reasoning_fields_anthropic.go`) with a\nshared validation layer (`reasoning_fields.go`). Remove provider-specific\n`applyReasoning` methods in favor of generic `*Reasonin\n[…]\nmeout. Replace Claude budget-based presets with adaptive effort\npresets in TUI. Update architecture docs to reflect the new layered\ncontract where public reasoning logic must not import concrete SDKs.",
          "is_bot": false,
          "headline": "refactor(model): extract protocol-specific reasoning field adapters a…",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-26T08:11:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1da050900e87a70427eeee991ab96ecb6846d342",
          "body": "…from provider name\n\nPreviously, the provider name implicitly determined the API protocol\n(openai -> OpenAI Responses, anthropic -> Anthropic Messages, others\n-> OpenAI Chat). Introduce a dedicated `protocol` field in model\nconfiguration with supported values `openai_chat`, `openai_responses`,\nand `\n[…]\n protocol. Includes backward compatibility\nfor existing configs missing the protocol field, defaulting to\n`openai_chat`. Update TUI to support protocol selection and refresh\ndocumentation accordingly.",
          "is_bot": false,
          "headline": "feat(config): add explicit model protocol field and decouple routing …",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-26T06:46:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ecd2e1adec4836d2ca98d084c9032c6cd7ff463a",
          "body": "Replace string concatenation with strings.Builder in tool call accumulation,\nstream batching, log compaction, TUI rendering, and notification handling.\nAdd buffer retention limits to prevent unbounded growth. Introduce\nperformance logging for slow TUI operations and refactor local transport\nframing to use bufio.Reader and shared sendFrame/receiveFrame helpers.",
          "is_bot": false,
          "headline": "perf: reduce allocations and add memory bounds in streaming paths",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-26T04:24:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0677de5d6e93a506cc566d69f9107dc2b92476a5",
          "body": "Update package descriptions to reflect recent changes including\nagent.delta/agent.run/agent.usage protocol, model request auto-recovery,\nand structured ModelError handling. Add architecture rules for protocol\nsemantics and runner responsibilities. Update release process to require\nChinese release notes and version suggestion workflow.",
          "is_bot": false,
          "headline": "docs: update architecture and release process documentation",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-25T07:59:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b776c4144d8c3035029f1e58ce532871e04ee23",
          "body": "Replace inline retry configuration with named constants for max retries,\nmax attempts, and retry delay. Update protocol documentation to reflect\nthe correct retry semantics (3 retries = 4 total attempts) and add test\ncoverage for the constant values.",
          "is_bot": false,
          "headline": "refactor(runner): extract model request retry constants",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-25T07:45:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e47a0dcf99ee0455f1834c037940e10dd327c11b",
          "body": "Refactor tool input schema construction to correctly extract the `required`\narray and preserve additional fields beyond `type`, `properties`, and\n`required`. Previously these were silently dropped, causing tool definitions\nto diverge from their declared parameters when sent to the API.\n\nUpdate Claude reasoning presets to match Claude Code style budgets and add\ntests covering schema preservation and preset configurations.",
          "is_bot": false,
          "headline": "fix(anthropic): preserve required and extra fields in tool input schemas",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-25T07:17:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ae286d341088a8c5a73ce5ba4b93fff1dd29855b",
          "body": "…dd ModelError recovery\n\nRestructure the daemon-to-TUI protocol to separate content streaming from run\nlifecycle and errors. agent.delta carries assistant/reasoning text increments,\nagent.run carries running/retrying/done/failed/cancelled states with structured\nModelError, and agent.usage carries to\n[…]\ncoding, and documentation accordingly.\n\nBREAKING CHANGE: Protocol notifications changed; agent.stream and agent.reasoning\nare replaced by agent.delta and agent.run with different parameter structures.",
          "is_bot": false,
          "headline": "feat(protocol): replace agent.stream with agent.delta/agent.run and a…",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-25T07:00:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c0efbb91a0e79a5916d2e098b2d8026c28e44d1c",
          "body": null,
          "is_bot": false,
          "headline": "fix(release): fetch annotated tag notes in workflow",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-24T14:42:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1bf8d5d646b95c7f7b33641d04e9dbcfe94e92b3",
          "body": "…alling\n\nReplace auto-generated release notes with annotated tag message content,\ndisplay trimmed notes during update check, and prompt for explicit\nconfirmation before downloading and installing. Remove --check flag in\nfavor of unified flow that always shows status first.\n\nBREAKING CHANGE: suna update --check is no longer supported; the update\ncommand now always checks for updates and displays release notes before\nprompting for installation confirmation.",
          "is_bot": false,
          "headline": "feat(update): show release notes and require confirmation before inst…",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-24T14:24:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6c4f9cacc00e414eafc2d549dca48d3c8001ae9b",
          "body": "Avoid retaining full SKILL.md contents during manager reload by reading\nonly a bounded index window for metadata extraction. Load now reads the\nfull file on demand, while reload can still parse frontmatter fields from\nthe bounded index and ignores partial trailing lines.\n\nUse strings.Builder for guard review stream accumulation and add tests\ncovering large skill files and partial index parsing.",
          "is_bot": false,
          "headline": "perf(skill): limit reload indexing to skill metadata",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-24T07:21:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c3f69ed1f515d1b8f319ed15cbb1ddb02f60c2d",
          "body": "…ummary\n\nConvert tool summary storage from an unbounded slice of items to a\nstructured ToolSummary type that caps recent entries at 4, failures\nat 2, and aggregates change-tool counts. The daemon now emits the\nsummary through SessionRestoreStatus.ToolSummary as a structured\npayload, and the TUI rend\n[…]\nreventing compacted history from being retained via shared backing\narrays. Replace string concatenation with strings.Builder in the\nrunner streaming path to reduce allocation pressure on long replies.",
          "is_bot": false,
          "headline": "refactor(memory): replace flat tool summary with bounded structured s…",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-24T06:41:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "08c6fec131220b84e053b985e0a05748d4d774f5",
          "body": "…ring\n\nImplement a 32MB soft memory limit for TUI display history, trimming old\nturns from the top while preserving the first user message and adding a\ncumulative discard summary. Replace streaming text concatenation with an\nappend-only StreamingTextState buffer that only retains tail lines for\nrendering, reducing O(n²) rewrap CPU and memory pressure for long replies.",
          "is_bot": false,
          "headline": "feat(tui): add display history budget and streaming tail window rende…",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-24T04:58:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cab49eb2fd8c0328fc1e401ce2ca3900a27dd81d",
          "body": "Add redirect-based fallback for latest-release detection when the GitHub API is unavailable. Standardize generated release asset URLs for fixed binary names, add coverage for tag parsing and asset resolution, and improve update command status and error presentation.",
          "is_bot": false,
          "headline": "feat(update): make self-update fallback and reporting clearer",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-22T09:54:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "466d3653a43a716dc2947e16de30870214b422c1",
          "body": "Document package responsibilities for clipboard input, subtask result disclosure,\nupdate/version internals, and the TUI/daemon boundary for paste images.\n\nAdd release guidance covering SemVer tags, version source, pre-release checks,\nannotated tags, push order, and GitHub Actions release asset generation.",
          "is_bot": false,
          "headline": "docs(repo): clarify agent architecture and release workflow",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-22T09:43:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f1b00a6ab04a43332cff6b1dbaa7c3114c4178a3",
          "body": "Add `suna update` and `suna update --check` to fetch GitHub Release metadata, compare versions, download the matching platform asset, verify SHA256 checksums, extract the bundled binary, and replace the current executable.\n\nWire release builds to inject version information through a shared `internal\n[…]\nbuilds, checksums, and uploads `dist/*` releases.\n\nDocs now explain the update flow, daemon/TUI shutdown requirement, cache behavior, release asset naming, and the automated tag-based release process.",
          "is_bot": false,
          "headline": "feat(cli): add self-update command",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-22T09:28:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "08571b8e93ee60c84708aad8c76a898e52b68043",
          "body": "Update release documentation and platform build scripts so archives keep platform-specific names while the packaged binaries are consistently named `suna` or `suna.exe`.\n\nThis makes extracted binaries directly usable from `PATH` without renaming after installation.",
          "is_bot": false,
          "headline": "docs(build): standardize release binary names",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-22T08:02:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c6144a1aa45d49875b260412d2dbea23dde13485",
          "body": "When a pasted image is confirmed in the TUI, daemon-side attachment\nstatistics may not update automatically. Refresh the attachment status\nafter adding the image so the configuration page displays the current\nattachment count.",
          "is_bot": false,
          "headline": "fix(tui): refresh attachment status after confirming pasted image",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-22T06:07:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c04f4d6bdec1073ad37bf2adca58dce1306f039f",
          "body": "Implement Ctrl+V clipboard image fallback in the TUI chat input path. When no terminal paste arrives, the UI reads image bytes from the system clipboard, validates MIME and size, enqueues a pending image attachment, and persists it to the attachment root on confirmation.\n\nAdd attachment detection for raw image bytes, non-image filtering, size blocking, and content-hash based persistence behavior. Document the clipboard image paste flow and dependency updates for the new clipboard integration.",
          "is_bot": false,
          "headline": "feat(tui): add clipboard image paste fallback",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-22T05:48:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d8144b37ce06f564e16c11e02daf1d163faf42a",
          "body": "Dynamically split subtask row space so intent text and active tool activity use the available width instead of fixed half-widths. Failed subtasks now show their error reason before child activity, and selected summaries surface that reason in the detail panel.\n\nSearch summaries keep raw mode values and remove unused localized content label plumbing. Add regression tests for wide viewport subtask rows and failure reason precedence.",
          "is_bot": false,
          "headline": "fix(tui): surface subtask errors and fit row details",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-22T03:47:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "928048007e02cb5749b1ee64565bef6d82991cc4",
          "body": "Add a `subtask_for` model option that filters which active main models can see a configured model as a spawn/subtask candidate. Empty filters remain visible to all main models, while glob patterns match model refs with `*` and `**` semantics.\n\nThe router now exposes spawnable models for the active model, spawn validation rejects hidden models, and config/TUI plumbing preserves the new field across persistence, protocol, forms, and detail views.",
          "is_bot": false,
          "headline": "feat(config): add subtask model visibility filters",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-22T03:21:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f88420e8b7cb2f9f4c825febfc84c3a144829cf3",
          "body": "Update the prompt template to state that batching tool and spawn calls should\nbe accompanied by actual parallel work, not just narration. This reduces\nambiguity around when to claim parallelization in agent behavior.",
          "is_bot": false,
          "headline": "docs(prompt): clarify tool call batching guidance",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-20T13:02:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e74c8fc5f1b7fc42308fce7177a107ed7f270e12",
          "body": "Added coverage for the subtask panel divider so section titles do not leave a visible\nright gap when rendered.",
          "is_bot": false,
          "headline": "fix(tui): assert subtask divider reaches right edge",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-20T12:46:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "71956253805f137e25d3aea1db17051fbfb4f844",
          "body": "Tool summaries now render aggregate counts, failures, change-tool counts,\nrecent operations, and folded earlier entries. Thinking, tool, and subtask\nblocks use shared indentation and bounded reasoning previews to keep chat\nlayout stable.",
          "is_bot": false,
          "headline": "refactor(transcript): compact tool summaries and align blocks",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-20T12:41:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "67e94c99746031f7b2658674494ff4d228c7d915",
          "body": "Introduce structured subtask statuses, JSON result parsing, and side effect\nreporting so the main agent can surface failures and tool-caused changes\nreliably.",
          "is_bot": false,
          "headline": "feat(subtask): capture side effects in subtask results",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-20T11:52:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e1f844ea1f0177bf67657fb31c107351c935814c",
          "body": "Update the system prompt to consolidate tool-call and delegation instructions,\nclarify when to batch or split work, and emphasize bounded subtask scope with\nmain-agent control.",
          "is_bot": false,
          "headline": "docs(prompt): simplify tool call and delegation guidance",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-20T10:01:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fb5466eb46c40a84f5bcf6bad45c8e5453d7f43e",
          "body": "Document that the notification pump's 8ms text coalescing is separate from the TUI chat transcript's approximately 16ms dirty sync frame. Clarify that the transcript frame limits viewport visual refresh to about 60fps without changing daemon streaming, text delta semantics, or critical event delivery.\n\nUpdate the implementation comment for the transcript sync interval to reflect the 60fps terminal rendering target and reduced renderer pressure.",
          "is_bot": false,
          "headline": "docs(tui): clarify transcript sync frame semantics",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-18T16:10:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8aa8b41b4ee0518372bc854949f720f63a221d0a",
          "body": "Introduce a focused subtask panel for active delegations with keyboard navigation, tool detail expansion, and scrollable tool output.\n\nRefactor tool block rendering to show only main tools in a status-aware titled container, move compact running status into the input area, and adjust chat layout calculations to use rendered rows for input hints, suggestions, and separators.\n\nAdd tests for subtask interaction, tool block output, and chat view layout behavior.",
          "is_bot": false,
          "headline": "feat(tui): add interactive subtask panel",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-18T15:41:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5bfec9f5890c6e1def2efd5570dac9be9cfcddf8",
          "body": "Defer transcript synchronization until after a short frame interval so streaming output and tool events do not repeatedly trigger full chat renders.\n\nAlso update the system prompt to encourage batching independent tool and delegation work while avoiding parallel dependent, destructive, or duplicate write actions.",
          "is_bot": false,
          "headline": "perf(tui): coalesce transcript sync updates",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-18T08:12:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "92775edd3b2204713f82815d8e679a8c3efbbbb3",
          "body": "Expose memory delete and clear operations through the daemon protocol and TUI.\nActive memories can now be removed individually or cleared entirely from a new\nmemory overlay, while the memory extraction queue remains untouched.\n\nThe daemon emits updated memory list notifications after mutations so the TUI\ncan refresh overlay state and keep chat panel output for command-driven memory\nlisting.",
          "is_bot": false,
          "headline": "feat(tui): add interactive memory deletion",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-18T04:21:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee342b2f0ae2e1bb199a22871a5ad13cbde0b365",
          "body": "Image attachments pasted from the same path or URL now resolve to the\nexisting attachment instead of being appended again. The cursor moves to\nthe existing item, and tests cover duplicate paths, duplicate URLs, and\ndistinct sources.",
          "is_bot": false,
          "headline": "fix(tui): prevent duplicate image attachments",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-18T03:38:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "92b1ccccabd5b39b4496f04dd38fb513654bc056",
          "body": "Document the updated compaction policy across architecture,\nconfiguration, implementation, design, and performance guides. The\ndocs now describe proactive compaction using local context estimates,\nfull `max_output_tokens` output reservation, estimator safety tokens,\nand the distinction between TUI context estimates and provider usage\nmetrics.",
          "is_bot": false,
          "headline": "docs(context): clarify proactive compaction budgeting",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-18T03:08:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab6fbf2a12cbeb14530b4b6b8907b22f4c8a225c",
          "body": "Use a router-backed provider for memory extraction and compression so\nbackground work follows the active model after config reloads.\n\nThread estimated context tokens through runner, protocol, agent events, and\nthe TUI, while manual compaction reserves space for output budget and\nestimator safety. Router-level LLM logging now records provider, model, and\nstream statistics for all completion paths.",
          "is_bot": false,
          "headline": "feat(llm): route background LLM calls through active model",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-18T01:38:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e8d763a3cd78d6e01c5e6475a4c03672ba611a7",
          "body": "Intercept mouse wheel messages before Bubble Tea viewport handling so\ntranscript scrolling can move across transcript windows instead of being\nclamped by the current viewport slice.\n\nAdd coverage for wheel-up scrolling from the top of the current viewport.",
          "is_bot": false,
          "headline": "fix(tui): handle wheel scrolling across transcript windows",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-17T12:25:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2ebb88819a501584b8f352b28110335df8333696",
          "body": "Update built-in tool descriptions and parameter help to be shorter,\nsingle-purpose, and consistent, using \"Default X, max Y\" phrasing for\nbounds and defaults.\n\nRefresh implementation and performance docs to reflect the redesigned\nsearch schema, bounded listdir depth, writefile parent-directory creation\nguidance, and token-aware tool definition style.",
          "is_bot": false,
          "headline": "docs(tools): tighten built-in tool schemas and guidance",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-17T10:48:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "562b7e908ff8542688bb435f033e719453365c91",
          "body": "Update TUI documentation to describe the current streaming render\ncoordination, overscan-window scrolling semantics, reasoning detail\nwindowing, and visible-window refresh behavior.\n\nClarify that these changes preserve immediate scrolling and spinner\nupdates while avoiding redundant transcript synchronization and repeated\nreasoning rendering.",
          "is_bot": false,
          "headline": "docs(tui): document rendering, scroll, and spinner behavior",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-17T10:08:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3ea6f9a85186f50d71d1bba86538aab055c5f455",
          "body": "Clip long reasoning detail before wrapping or markdown rendering, cache\nrendered line counts by width/theme/mode, and avoid full transcript\nresyncs while streaming text is updating. Return whether scroll/page\nactions changed the transcript window so callers only refresh when\nvisible content changes.\n\nAdd tests for reasoning clipping, streaming suppression, and scroll\nwindow-change reporting.",
          "is_bot": false,
          "headline": "perf(tui): optimize chat rendering during streaming and scrolling",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-17T10:06:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d29824d37490a4ea7c10c86e28f2f898a5432c36",
          "body": null,
          "is_bot": false,
          "headline": "fix(tui): simplify config model rows and normalize reasoning tabs",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-17T09:15:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "55966ea42fa9db1a803578434abd19ac2eaeba20",
          "body": "Add max_output_tokens to model configuration, protocol messages, and provider construction. Validate context_window and max_output_tokens on load and save, requiring positive values with output smaller than the total context window.\n\nUse the configured output budget for chat, subtask, Guard review, \n[…]\nhe new required model capability fields.\n\nBREAKING CHANGE: existing model configs must include both context_window and max_output_tokens; load and save now fail when either field is missing or invalid",
          "is_bot": false,
          "headline": "feat(model): enforce explicit context and output limits",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-17T08:46:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a2f4c7a3c5d45a213c1944e6379309fef22dcacc",
          "body": "  - replace legacy search parameters with pattern, terms, mode, match, case, scope, context, limit, and depth\n  - add literal terms search for multiple alternatives without regex\n  - add workspace/deps/all search scopes with built-in safe excludes\n  - support doublestar glob patterns for path/include/exclude matching\n  - update TUI search summaries for the new schema\n  - refresh README and tool design docs",
          "is_bot": false,
          "headline": "refactor(tools): redesign search tool for LLM-friendly local discovery",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-16T08:19:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "abb7925f18395140b0b1341159551167c02a8b94",
          "body": "Update the built-in search tool and TUI summaries to use the newer\n`pattern` and `mode` parameter names. Rename result grouping and tests to\nmatch the unified search option vocabulary, add term-aware summaries, and\nkeep existing search behavior around scope, limits, context, and diagnostics.",
          "is_bot": false,
          "headline": "refactor(search): migrate search params to pattern and mode",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-16T07:44:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dcccd9828340e1bb2bc635654ed92e755a6b88be",
          "body": "…search and context lines\n\nReplace the `mode` parameter with `kind` (auto, content, path, symbol),\nrename `max_matches` to `max_results`, and add `context_lines`, `word`,\nand `kind=auto` that returns grouped path, symbol, and content matches.\nIntroduce `search_format.go` for output formatting, updat\n[…]\nry\nto show per-kind match counts, and adjust documentation and tests.\n\nBREAKING CHANGE: `mode` is removed in favor of `kind`; `max_matches` is\nrenamed to `max_results`. Old parameters will be ignored.",
          "is_bot": false,
          "headline": "feat(search)!: replace mode/kind, add structured path/symbol/content …",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-15T06:56:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e45307393efed82de6999fc5f8aba428f7a416db",
          "body": "Introduce `cachedStreamingText` that tracks last wrap state (`StreamLines`, `StreamLastLineWidth`, `StreamPendingNewlines`) per message. On each delta, only the appended text is processed through `appendStreamingDelta`, which reuses the existing wrapped lines and avoids re-wrapping the entire accumu\n[…]\nDelta` uses `ansi.GraphemeWidth` for proper cell-width wrapping. The test `TestCachedStreamingTextMatchesFullRender` verifies that incremental results stay identical to the full `renderStreamingText`.",
          "is_bot": false,
          "headline": "perf(tui): add incremental wrap cache for streaming assistant text",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-15T06:05:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6365c5ab9895f8afd76c629aaebfe5f63378e226",
          "body": "…ool calls and usage tracking\n\nReplace the non‑streaming `MessageNew` call with `NewStreaming`, enabling real‑time chunk processing. Accumulate tool calls by content block index and sort them before emitting. Track token usage via `message_start` / `message_delta` events, merging output deltas with \n[…]\nccumulated tool call ordering, initial arguments fallback, cache token inclusion in input totals, assistant block input object serialisation, usage merge semantics, and default temperature resolution.",
          "is_bot": false,
          "headline": "feat(anthropic): migrate Complete to streaming API with accumulated t…",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-15T05:07:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "db284acef9f0a559439496b836e2f0d91e83dc06",
          "body": "- Update README and design docs to describe smart mode as a safety gate\n  that judges safety, user intent, and boundaries—not a general tool-call\n  optimizer.\n- Clarify editfile `target` parameter: default unique match, `\"all\"` for\n  all, and `\"2\"` for 1‑based nth occurrence.\n- Rewrite guard_review prompt instructions to align with the refined\n  smart mode scope.",
          "is_bot": false,
          "headline": "docs: refine guard smart mode description and editfile target examples",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-15T04:49:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e291702e2ea2de338d57cacc44f81c171e1e0a89",
          "body": "The `mode` and `occurrence` properties are replaced by a single `target`\nproperty. `target` accepts:\n- omit (default) for unique replacement\n- \"all\" for replacing every match\n- a positive 1-based occurrence number as string (e.g. \"2\") for nth match\n\nThis simplifies the edit specification and eliminates invalid combinations\n(e.g. mode=\"unique\" with occurrence>0). All existing tests are updated\nto use the new field.",
          "is_bot": false,
          "headline": "feat(tools)!: replace mode/occurrence fields with unified target field",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-15T04:23:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "60bc57baac4c1e3a7bdecb75fcebe7b4b95881b6",
          "body": "Update the EditFile tool spec descriptions and parsing error messages to\nclearly communicate when the `occurrence` field is required or must be\nomitted based on the `mode` value. Add tests that verify:\n\n- Zero `occurrence` is accepted for `unique` and `all` modes.\n- Positive `occurrence` is rejected for `unique` and `all` modes with a\n  descriptive error.\n- `occurrence` is required when mode is `nth`.",
          "is_bot": false,
          "headline": "fix(tools): refine occurrence validation for EditFile mode values",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-14T14:58:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "671c82b38f1fbdda26fdcb6c3af25e4b724bc867",
          "body": "… on in-window scroll\n\nThe `transcriptWindowSignature` no longer includes `YOffset`, so scrolling\nwithin the current overscan window does not invalidate the signature and\ndoes not trigger a `SetContentLines` call. `ScrollTranscript` now checks\n`canReuseTranscriptWindow` and, when the new offset stay\n[…]\ndow, only adjusts the viewport offset instead of rebuilding the content.\n\nThis reduces CPU churn during small scrolls and keeps the same block\ncontent visible while moving the logical scroll position.",
          "is_bot": false,
          "headline": "refactor(tui): remove YOffset from window signature and reuse content…",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-14T09:42:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1d08869801a3b79a037791b201aa1706e9526078",
          "body": "…own cache\n\nReplace full-transcript `SetContent` with a windowed strategy: only the\nviewport's visible region plus overscan is built into blocks and fed to\nthe viewport. The `Model` retains a global block layout and `YOffset`,\nallowing `ScrollTranscript`, `PageTranscript`, and `SetTranscriptYOffset`\n[…]\naningful changed, reducing CPU churn on spinner/ticks.\n\nNew `transcript_test.go` covers windowed content bounds, unchanged\nwindow optimization, cache trimming, and full re-render after cache\neviction.",
          "is_bot": false,
          "headline": "perf(tui): implement windowed transcript rendering with bounded markd…",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-14T07:18:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "31cdc5546e51e42ba6de519c789fa21265dbc851",
          "body": "… TUI\n\nParses `reasoning_details` array from MiniMax M3 streaming delta,\nconcatenating `text` parts (filtered by optional `type`) into\nreasoning content. Adds MiniMax M3 / Split as a reasoning option\nin the TUI configuration page and includes an example model config\nin the documentation.",
          "is_bot": false,
          "headline": "feat(model): add reasoning_split parsing for MiniMax M3 and expose in…",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-14T05:31:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee09af9c88a87ac293167965df6a8b6179f2770b",
          "body": "… search diagnostics\n\nReplaces the mutually exclusive `replace_all` boolean and `occurrence`\ninteger in editfile with a single `mode` parameter (`unique`, `nth`,\n`all`), simplifying the API and eliminating invalid parameter combos.\n\nAdds diagnostic messages to search results when no matches are found,\nreporting skipped-file statistics (binary, large, excluded, etc.), while\npreserving the existing metadata contract expected by the TUI.",
          "is_bot": false,
          "headline": "refactor(tools): replace boolean replace flags with mode enum and add…",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-13T16:17:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "caf0d716dd7d99286b4b2ebac69a63e18f79f2c2",
          "body": "…stream reading\n\nAdd a shared `ReadStreamTextWithIdle` function in the model package to\nsimplify LLM stream reading with idle timeout for non-Runner calls.\nDefine per-purpose idle timeout constants (compact, guard review, skill\nreview, memory compact).\n\nRefactor Runner's `readStream` to accept a tim\n[…]\n reading loops in agent skill adapters, tools,\nmemory compress, and memory worker with the new helper, improving\ncode consistency and timeout handling.\n\nAdd tests to verify timeout extension behavior.",
          "is_bot": false,
          "headline": "feat(runner): implement dynamic reasoning idle timeout and unify LLM …",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-13T16:00:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "34d5c4d83551066cabeb29def37891b875de4b0a",
          "body": "Replace per-architecture build scripts (build-macos-arm64.sh, build-windows-amd64.sh)\nwith per-OS scripts (build-darwin.sh, build-linux.sh, build-windows.sh) that build\nboth arm64 and amd64 variants. This adds support for Linux and Windows arm64 targets.\n\nIntroduce `SUNA_BUILD_VERSION` environment v\n[…]\nme\nrelease, avoiding timestamp discrepancies.\n\nUpdate README and development docs to reflect the new build commands and warn\nagainst using `go run .` due to daemon/TUI process management requirements.",
          "is_bot": false,
          "headline": "feat(build): add per-platform multi-arch build scripts",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-12T04:43:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e70ce2c92bdb8ce30a7bd13957ce692d247e606b",
          "body": "Deprecate `go run .` usage for running Suna; the daemon and TUI rely on a stable executable path for local process management. Update instructions to use `go install .` or build a binary instead.",
          "is_bot": false,
          "headline": "docs(readme): clarify installation steps and recommend go install",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-11T13:46:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e1a9d8521fefe9f24841af45269e56176385b352",
          "body": "…ation\n\nRemove the redundant destination path display from the extra details row of FS change summaries. The full action/path/destination is already shown in the main tool entry line, so repeating the path here added visual clutter. The compact summary now focuses on key metadata (entry kind, recursive, size) instead.\n\nUpdate test to ensure the FS path appears only once in the rendered output.",
          "is_bot": false,
          "headline": "refactor(tui): compact filesystem change summary to avoid path duplic…",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-11T13:44:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9f34e240c3d2334b49611553a5dd3342325410bd",
          "body": "- Rewrite README with new structure emphasizing design philosophy,\n  highlights, and quickstart over feature enumeration\n- Add docs/design.md explaining key design decisions (TUI+daemon\n  separation, Guard system, context management)\n- Add docs/subtask.md documenting the intelligent model routing sy\n[…]\ned as three tiers: README (project\nshowcase), docs/ (implementation facts), and plans/ (historical\nrecords). Each tier has a clear purpose to avoid confusion between\ncurrent behavior and future plans.",
          "is_bot": false,
          "headline": "docs(readme): rewrite project documentation and add design docs",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-11T13:34:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c5db31ab7656d142d69581023677c3d9b77914c7",
          "body": "Replace the flat \"active memory\" model with a structured user profile\nmemory that tracks source, confidence, and evidence for each memory\nitem. Introduce ExtractCandidate to replace JudgeSignificance, using\nrule-based extraction that only processes user signals and ignores\nassistant output. Update t\n[…]\ntured\ncandidates, and adjust the worker compaction logic to handle the new\nfields. Rename all internal references from \"active memory\" to \"user\nprofile memory\" across code, documentation, and prompts.",
          "is_bot": false,
          "headline": "refactor(memory): migrate to structured user profile memory system",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-11T11:58:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "22ad628413b11921c7ff7948395736725e5675ad",
          "body": "…d examples\n\nEnhance the `Search` tool specification by improving parameter descriptions to\ninclude default values, range limits, and concrete examples. The tool-level\ndescription now advises using this over shell grep/find. These changes make the\ntool spec more self-documenting and reduce ambiguity for downstream consumers.",
          "is_bot": false,
          "headline": "chore(builtin): refine search tool spec descriptions with defaults an…",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-11T10:53:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "997c9692a94eafb1de4ed5f4204bf403b64cfead",
          "body": "…entifiers\n\nReplace hardcoded `/Users/alanchen/` paths with `/Users/me/` and\nremove the specific example domain `dreamfield.top` from test\nassertions and the agent overview document. This ensures the\ncodebase does not expose personal user data and that tests remain\ndeterministic regardless of the developer's environment.",
          "is_bot": false,
          "headline": "chore: sanitize test fixtures and documentation to remove personal id…",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-11T10:45:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "555b780908aad4d3365cc1ddb1acfb326df63eae",
          "body": "…or editfile and writefile\n\nThe previous descriptions for EditFile and WriteFile were ambiguous or\ndid not clearly distinguish their intended use cases. Update the short\ndescriptions to better explain atomically targeted edits versus whole-file\nreplacement, and clarify the mode parameter enum with examples.",
          "is_bot": false,
          "headline": "fix(builtin): correct tool descriptions and parameter documentation f…",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-11T10:32:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1815d12db7f64ce8d12af88ee63ae420c8baf087",
          "body": "… truncation logic\n\nThe path field was not consistently populated across all tool result\nmetadata and the truncation logic added complexity without meaningful\nbenefit. The summary now focuses solely on operation, line deltas, and\nreplacements, making it more robust and easier to maintain.",
          "is_bot": false,
          "headline": "refactor(toolview): simplify file change summary by removing path and…",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-11T10:21:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e45e43a5cf7decfa7b38e2fa680255ee47c5b8cc",
          "body": "Replace scattered per-interaction fields (PendingAskID, PendingAskOptions,\nPendingGuard, PendingImagePaste, ConfirmDiscardDraft) with a single\ninteraction queue. Each interaction is now represented by an Interaction\nstruct with a Kind field, and the model exposes typed accessor methods\n(ActiveAsk, A\n[…]\nImagePaste, etc.). This reduces state\nduplication, simplifies routing in RouteKey, and allows future\ninteractions (e.g., model picker, attachment confirm) to be added\nwithout touching multiple fields.",
          "is_bot": false,
          "headline": "refactor(tui): unify pending interactions into a generic queue system",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-11T10:17:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "347dc910521dc5b39c82e8fd7f67ab171186fd6c",
          "body": null,
          "is_bot": false,
          "headline": "feat(tui): add subtask completion waiting indicator and status label",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-11T09:51:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca7ecd529bf6b83dd8c5ac3055de471ab97d4b59",
          "body": "…ss.Width\n\n- Introduce `searchSummary` to display mode label, query, and compacted path\n- Replace `compactSummary` with `compactText` using lipgloss.Width for accurate rune-aware truncation\n- Apply `CompactPath` directly to file paths for readfile/listdir/writefile/editfile tools\n- Add tests verifying search query and path suffix preservation",
          "is_bot": false,
          "headline": "feat(toolview): add search summary and improve truncation with lipglo…",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-11T09:34:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "179cbc29e7a1cb5636dda6a29da00b653e4ec9ec",
          "body": "Ctrl+Up jumps to the start of the last assistant message, Ctrl+Down returns to\nthe bottom of the transcript. When a response is longer than the viewport, a\nhint is shown in the input area. Position tracking resets on new input to\nensure navigation reflects the latest assistant response.",
          "is_bot": false,
          "headline": "feat(tui): add keyboard shortcuts for response navigation",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-11T09:26:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4c847ca084ac2cdcdb920667802eaf263c27c92c",
          "body": "Automatic context compression in runner previously did not commit the compacted\nsession state immediately. A new `OnCompactCommit` hook now calls\n`commitCompactState`, which saves the state with a 3-second timeout context.\nWhen compact returns no state, the fallback `saveConversationState` is still\ncalled. This ensures the session state is always persisted after compression\nand prevents stale or missing state on subsequent requests.",
          "is_bot": false,
          "headline": "fix(agent): persist compacted session state via OnCompactCommit hook",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-11T08:54:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d0928b1296be13e876194c879d192af615168483",
          "body": "…ve editfile, readfile, writefile\n\nReplace the split readhttp/writehttp pair with a unified HTTP tool supporting GET, HEAD, POST, PUT, PATCH, DELETE methods. Add FileSystem tool for stat/mkdir/move/copy/remove operations and Search tool for file name and content search with safe defaults. Enhance Ed\n[…]\n new tool set.\n\nBREAKING CHANGE: Remove readhttp and writehttp tools; use http tool with method parameter.\nBREAKING CHANGE: EditFile schema changes from single old_string/new_string to an edits array.",
          "is_bot": false,
          "headline": "feat(tools): add structured filesystem, http, and search tools; impro…",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-11T08:39:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7bede7e376fa8c93814ae04b7226a6765655a4a2",
          "body": "…e message wrapping\n\nThe session state was previously embedded as a system message in the message\nlist, requiring special handling in the memory package (IsSessionStateMessage,\nSplitSessionStateMessages, NewSessionStateMessage). This polluted working\nmemory and complicated compression logic.\n\nNow, s\n[…]\nt.go, memory/compress.go to stop\n  injecting/parsing session state messages.\n- Update all providers to accept and inject session state.\n- Update runner to pass session state through CompletionRequest.",
          "is_bot": false,
          "headline": "refactor(model): move session state into provider layer, remove inlin…",
          "author_name": "alanchen",
          "author_login": "alanchenchen",
          "committed_at": "2026-06-10T15:44:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 24,
      "commits_last_year": 207,
      "latest_release_at": "2026-07-27T13:43:03Z",
      "latest_release_tag": "v0.13.3",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 12,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 2.1
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/alanchenchen/suna",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/alanchenchen/suna",
          "is_deprecated": false,
          "latest_version": "v0.13.3",
          "repository_url": "https://github.com/alanchenchen/suna",
          "versions_count": 20,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-27T13:21:36Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 3,
      "stars": 14,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-06-11",
            "count": 1
          },
          {
            "date": "2026-06-12",
            "count": 1
          },
          {
            "date": "2026-06-22",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 3,
        "total_forks": 3
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 54111,
      "source_files_sampled": 353,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "AGENTS.md"
      ],
      "agent_instruction_max_bytes": 9372
    },
    "dependencies": {
      "manifests": [
        "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"
      ],
      "dependencies": [
        {
          "name": "charm.land/bubbles/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.1.0"
        },
        {
          "name": "charm.land/bubbletea/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.0.6"
        },
        {
          "name": "charm.land/glamour/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.0.0"
        },
        {
          "name": "charm.land/lipgloss/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.0.3"
        },
        {
          "name": "github.com/BurntSushi/toml",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/Microsoft/go-winio",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.6.2"
        },
        {
          "name": "github.com/anthropics/anthropic-sdk-go",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.40.0"
        },
        {
          "name": "github.com/charmbracelet/x/ansi",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.11.7"
        },
        {
          "name": "github.com/google/uuid",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/openai/openai-go/v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.37.0"
        },
        {
          "name": "golang.design/x/clipboard",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.8.0"
        },
        {
          "name": "modernc.org/sqlite",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.50.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "alanchenchen",
          "commits": 207,
          "avatar_url": "https://avatars.githubusercontent.com/u/23295628?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "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": null,
            "reason": "no pull request found",
            "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": 10,
            "reason": "project is fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 9,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "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": "21 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "f3d7a7faf4d97ea61ca235579369bd33546ef1cb",
        "ran_at": "2026-07-28T06:02:10Z",
        "aggregate_score": 2.6,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-27T13:43:19Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/alanchenchen/suna",
    "host": "github.com",
    "name": "suna",
    "owner": "alanchenchen"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "weak",
      "name": "Overall health",
      "note": "The weighted overall 49 is calibrated to 48 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 49,
            "calibrated": 48,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 48,
      "inputs": {
        "security": 26,
        "vitality": 73,
        "community": 32,
        "governance": 38,
        "calibration": "2026-08-02",
        "engineering": 66,
        "ai_readiness": 74,
        "weighted_overall_raw": 49
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 73,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 62,
            "inputs": {
              "commits_last_year": 207,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 12
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "12/52 weeks with commits",
                "points": 8.3,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 12
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "207 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 207
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 24,
              "latest_release_tag": "v0.13.3",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 2.1
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "24 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 24
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~2.1 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 2.1
                    }
                  }
                ],
                "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": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 32,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 21,
            "inputs": {
              "forks": 3,
              "stars": 14,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "14 stars",
                "points": 18.1,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 14
                    }
                  }
                ],
                "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": "weak",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 44,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "readme_badges": null,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "readme_badge_services": [],
              "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": "license file present, not a recognized license",
                "points": 16.9,
                "status": "partial",
                "details": [
                  {
                    "code": "license_custom",
                    "params": {}
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": 38,
        "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": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance, Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance",
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "prs_merged_7d": null,
              "prs_decided_7d": null,
              "prs_merged_30d": null,
              "prs_decided_30d": null,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0,
              "first_time_authors_30d": null,
              "first_time_prs_merged_30d": null,
              "first_time_prs_decided_30d": null
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "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": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 56,
            "inputs": {
              "followers": 43,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "alanchenchen",
              "public_repos": 34,
              "account_age_days": 3550
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "43 followers of alanchenchen",
                "points": 11.8,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 43,
                      "login": "alanchenchen"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "34 public repos, account ~9 yr old",
                "points": 23.2,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 34
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 9
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "exceptional",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/alanchenchen/suna"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "20 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 66,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "1 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [
                "agent-runtime",
                "ai-agent",
                "local-first",
                "terminal-ai"
              ],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "4 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "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": 26,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 26,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 2.6
            },
            "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": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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 fuzzed",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "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": "21 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": 3
            },
            "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": 74,
        "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"
              ],
              "agent_instruction_max_bytes": 9372
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.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": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "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": "go.mod (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "go.mod"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "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": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "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 0",
                "points": 0,
                "status": "missed",
                "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": 54111,
              "source_files_sampled": 353,
              "oversized_source_files": 0
            },
            "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": "0/353 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 353,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "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": {
      "labels": [
        "library"
      ],
      "scores": {
        "library": 6
      },
      "primary": "library",
      "evidence": [
        {
          "tier": "distribution",
          "label": "library",
          "source": "registry:go",
          "weight": 6
        }
      ],
      "artifacts": [],
      "confidence": "medium",
      "host_extension": false,
      "runs_as_process": false,
      "consumed_by_code": true
    },
    "metrics_version": "2.3.1"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-28T06:02:15.006607Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/alanchenchen/suna.svg",
  "full_name": "alanchenchen/suna",
  "license_state": "custom",
  "license_spdx": null
}

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.3.1, Schema v0.27.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenGo.