Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-24 04:14 UTC

micro / mu

A personal home server

GoAGPL-3.0★ 97 estrellas⑂ 3 forksdesde nov 2025Ver en GitHub ↗

micro/mu tiene un índice de salud de 62 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (95/100) y la más baja, Security (32/100). Se actualizó por última vez hace 1 día. Una sola persona concentra la mayor parte del trabajo reciente.

62
global / 100
Moderado

Índice de salud del software

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

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

Perfil de puntuación

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

Titularidad

MicroOrganización
230 seguidores3 repositorios públicosdesde ago 2013

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

Métricas por categoría

Vitalidad

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

95Excelente · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 1 días
33.9/36Cadencia de commits — 49/52 semanas con commits
18/18Volumen de commits — 3904 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year3904
human_commit_share1
days_since_last_push1
active_weeks_last_year49
Cómo se puntúa
27/27Publica versiones — 40 versiones publicadas
36/36Recencia de las versiones — última versión hace 3 días
27/27Cadencia de publicación — una versión cada ~5 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count40
latest_release_tagv0.32.0
releases_from_tagsno
days_since_latest_release3
mean_days_between_releases5

Comunidad y Adopción

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

42En riesgo · 18% del índice global
Cómo se puntúa
32.2/60Estrellas — 97 estrellas
2.5/25Forks — 3 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks3
stars97
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (AGPL-3.0)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sostenibilidad y Gobernanza

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

55Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
6/22.5Distribución de commits — el principal contribuyente firma el 73% de los commits
2.7/13.5Amplitud de contribuyentes — 2 contribuyentes
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Datos de entrada utilizados
bus_factor1
contributors_sampled2
top_contributor_share0,733
Cómo se puntúa
45.5/46.8Resolución de issues — 97% de issues cerradas
37.7/38.3Aceptación de PR — 874/886 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs874
open_issues15
closed_issues540
issue_closed_ratio0,973
closed_unmerged_prs12
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
17/25Alcance del propietario — 230 seguidores de micro
16.4/25Trayectoria — 3 repos públicos, cuenta de ~12 años
Datos de entrada utilizados
followers230
owner_typeOrganization
is_verified
owner_loginmicro
public_repos3
account_age_days4736

Calidad de Ingeniería

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

76Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 3 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.

Documentación

100Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://micro.mu
10/10Descripción del repositorio
10/10Topics — 4 topics
10/10Wiki
Datos de entrada utilizados
topicsmu, micro, apps, mcp
has_wiki
homepagehttps://micro.mu
has_readme
has_docs_dir
has_description

Seguridad

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

32En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — sin datos
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
1.5/2.5Contributors — project has 2 contributing companies or organizations -- score normalized to 6
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
7.5/7.5Maintained — 30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — sin datos
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
2/5Security-Policy — security policy file 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 — 30 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate3,2
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, packaging. Los pesos restantes se han renormalizado.

Preparación para IA

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

79Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 98 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,98
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes3104
Cómo se puntúa
12.6/18Arranque con un solo comando — go.mod (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — Go (tipado estático)
10/10Entorno reproducible — Dockerfile, lockfile
10/10Práctica demostrada con agentes — 72 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum
has_dockerfile
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,72
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
53.7/55Tamaños de archivo manejables — 7/295 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes100.229
source_files_sampled295
oversized_source_files7

Datos clave

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

Advertencias de recopilación de datos

  • 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

Más detalle

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

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

12233312025-112026-032026-07
Mayor 0Menor 32Parche 8
OpenSSF Scorecard 3.2 / 10
3.2agregado

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
n/dCI-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
6Contributorsproject has 2 contributing companies or organizations -- score normalized to 6
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10
n/dPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
4Security-Policysecurity policy file detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities30 existing vulnerabilities detected
Dependencias directas 18
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/ProtonMail/go-cryptov1.3.0go.mod
Gogithub.com/PuerkitoBio/goqueryv1.8.0go.mod
Gogithub.com/asim/quadtreev0.3.0go.mod
Gogithub.com/emersion/go-msgauthv0.7.0go.mod
Gogithub.com/emersion/go-smtpv0.24.0go.mod
Gogithub.com/go-webauthn/webauthnv0.16.0go.mod
Gogithub.com/gomarkdown/markdownv0.0.0-20250311123330-531bef5e742bgo.mod
Gogithub.com/google/uuidv1.6.0go.mod
Gogithub.com/gorilla/websocketv1.5.3go.mod
Gogithub.com/mmcdole/gofeedv1.3.0go.mod
Gogithub.com/mrz1836/go-sanitizev1.5.3go.mod
Gogithub.com/piquette/finance-gov1.1.0go.mod
Gogo-micro.dev/v6v6.3.10go.mod
Gogolang.org/x/cryptov0.48.0go.mod
Gogolang.org/x/netv0.49.0go.mod
Gogolang.org/x/syncv0.19.0go.mod
Gogoogle.golang.org/apiv0.243.0go.mod
Gomodernc.org/sqlitev1.42.2go.mod
Todas las dependencias no recopilado

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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [
        "mu",
        "micro",
        "apps",
        "mcp"
      ],
      "is_fork": false,
      "size_kb": 24814,
      "has_wiki": true,
      "homepage": "https://micro.mu",
      "languages": {
        "Go": 2413257,
        "CSS": 100954,
        "HTML": 666,
        "Shell": 12749,
        "Dockerfile": 365,
        "JavaScript": 61266
      },
      "pushed_at": "2026-07-22T11:08:47Z",
      "created_at": "2025-11-06T09:21:18Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-22T11:09:12Z",
      "description": "A personal home server",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "AGPL-3.0",
      "default_branch": "main",
      "license_spdx_raw": "AGPL-3.0",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": "https://micro.mu",
      "name": "Micro",
      "type": "Organization",
      "login": "micro",
      "company": null,
      "location": null,
      "followers": 230,
      "avatar_url": "https://avatars.githubusercontent.com/u/5161210?v=4",
      "created_at": "2013-08-04T19:35:53Z",
      "is_verified": null,
      "public_repos": 3,
      "account_age_days": 4736
    },
    "license": {
      "state": "standard",
      "spdx_id": "AGPL-3.0",
      "raw_spdx": "AGPL-3.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.32.0",
          "kind": "minor",
          "published_at": "2026-07-20T22:17:39Z"
        },
        {
          "tag": "v0.31.0",
          "kind": "minor",
          "published_at": "2026-07-17T09:33:26Z"
        },
        {
          "tag": "v0.30.0",
          "kind": "minor",
          "published_at": "2026-06-30T19:21:42Z"
        },
        {
          "tag": "v0.29.0",
          "kind": "minor",
          "published_at": "2026-06-15T21:16:00Z"
        },
        {
          "tag": "v0.28.2",
          "kind": "patch",
          "published_at": "2026-06-07T10:42:31Z"
        },
        {
          "tag": "v0.28.1",
          "kind": "patch",
          "published_at": "2026-06-07T10:25:13Z"
        },
        {
          "tag": "v0.28.0",
          "kind": "minor",
          "published_at": "2026-06-07T10:19:31Z"
        },
        {
          "tag": "v0.27.0",
          "kind": "minor",
          "published_at": "2026-06-06T16:57:06Z"
        },
        {
          "tag": "v0.26.0",
          "kind": "minor",
          "published_at": "2026-06-06T10:39:51Z"
        },
        {
          "tag": "v0.25.0",
          "kind": "minor",
          "published_at": "2026-06-05T21:49:25Z"
        },
        {
          "tag": "v0.24.0",
          "kind": "minor",
          "published_at": "2026-05-27T05:47:34Z"
        },
        {
          "tag": "v0.23.0",
          "kind": "minor",
          "published_at": "2026-05-24T12:50:06Z"
        },
        {
          "tag": "v0.22.0",
          "kind": "minor",
          "published_at": "2026-05-11T10:53:13Z"
        },
        {
          "tag": "v0.21.0",
          "kind": "minor",
          "published_at": "2026-04-16T09:03:02Z"
        },
        {
          "tag": "v0.20.0",
          "kind": "minor",
          "published_at": "2026-04-07T10:44:48Z"
        },
        {
          "tag": "v0.19.0",
          "kind": "minor",
          "published_at": "2026-04-03T15:38:06Z"
        },
        {
          "tag": "v0.18.0",
          "kind": "minor",
          "published_at": "2026-03-28T14:48:59Z"
        },
        {
          "tag": "v0.17.0",
          "kind": "minor",
          "published_at": "2026-03-26T17:00:10Z"
        },
        {
          "tag": "v0.16.0",
          "kind": "minor",
          "published_at": "2026-03-24T18:53:09Z"
        },
        {
          "tag": "v0.15.1",
          "kind": "patch",
          "published_at": "2026-03-22T19:02:08Z"
        },
        {
          "tag": "v0.15.0",
          "kind": "minor",
          "published_at": "2026-03-21T10:25:06Z"
        },
        {
          "tag": "v0.14.0",
          "kind": "minor",
          "published_at": "2026-03-16T15:53:40Z"
        },
        {
          "tag": "v0.13.1",
          "kind": "patch",
          "published_at": "2026-03-13T09:35:34Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-03-11T19:01:44Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-03-06T16:59:28Z"
        },
        {
          "tag": "v0.11.2",
          "kind": "patch",
          "published_at": "2026-03-02T23:13:11Z"
        },
        {
          "tag": "v0.11.1",
          "kind": "patch",
          "published_at": "2026-03-02T21:07:29Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-03-02T13:05:09Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-02-25T08:02:45Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-02-17T08:58:34Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-01-29T12:34:22Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-01-23T13:58:23Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-01-19T16:23:25Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-01-17T11:46:45Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-01-07T15:01:25Z"
        },
        {
          "tag": "v0.3.2",
          "kind": "patch",
          "published_at": "2025-12-26T10:16:23Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2025-12-26T10:12:04Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2025-12-25T21:18:10Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2025-12-23T21:01:47Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2025-12-17T21:47:34Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "4862f003aa017a3e96b1c5cae88e59fe42de1721",
          "body": "Sidebar is now Home first, then alphabetical (Agent, Apps, Blog, Chat,\nImages, Islam, Mail, Markets, News, Places, Search, Social, Video, Wallet,\nWeather). Remove Saved — it linked to /app/saved but nothing in the UI can\nsave an item yet, so it was a dead end. Account/Logout stay below the\ndivider. Drop the Saved mention from the README services list.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "nav: alphabetise the sidebar and drop the non-functional Saved link",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-22T11:08:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8d7c17a16eef48ec7c69db378368f94fe435917e",
          "body": "…egistry\n\nThe /agent/new tool picker was a hardcoded list of 11 that had drifted from\nwhat agents can actually call, and Images and Islam weren't callable at all\nbecause they were HTTP handlers, not go-micro services.\n\n- Register `images` (Generate) and `reminder` (Today) as go-micro services so\n  t\n[…]\n).\n- Show friendly labels in the picker (Memory, Web search, Islam, …).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "agent: expose Images and Islam as tools; derive the picker from the r…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-22T11:08:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4322998988fe2aa5490c82009bdae792f305084a",
          "body": "Features describes the platform (services in one process, the agent, the\nweb home, the front doors); Services lists what you can actually use. Drop\nthe \"Each is a service\" claim from the Services intro since the list also\nincludes capabilities that aren't standalone go-micro services (agent,\nchat, i\n[…]\nges, islam, stream). Promote Accounts & sign-in to its own\nsection too.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "docs: split Features and Services into separate sections",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-21T09:55:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3098348f4ca6eaffa30d3655e1f767741f33cf81",
          "body": "Images had no mobile `order`, so it defaulted to order:0 and jumped above\nevery other card on mobile — landing first, above the fold — while sitting\nat the very bottom of the right column on desktop. Give it an explicit\nmobile slot and rebalance the columns:\n\n- Desktop: left = Blog, Islam, News; rig\n[…]\nhe key cards\n  stay above the fold and Images no longer displaces them.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "home: fix card order so mobile and desktop agree",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-21T09:54:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "923dbbd41ab348113437b503846985e1b6d2020e",
          "body": "Saved lives at /app/saved (userdb-backed read-later with a saved_list\ntool), not a registered go-micro service. Move it under Apps as a\nbuilt-in example instead of listing it alongside the services.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "docs: Saved is an app, not a service",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-21T09:37:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "042d107cfe756594f29e33c8b5785c3bd46c46b6",
          "body": "The services list had drifted from what ships. Update it to match:\n- add Images (prompt generation + daily image), Saved (read-later), and\n  Social (was only in the overview line)\n- rename Web → Search (the page is /search with a reader view)\n- Reminder is surfaced as Islam (verse, hadith, reflectio\n[…]\ngram command lists to the full set, and bump the MCP tool\ncount to 40+.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "docs: bring README up to date with current services and sign-in",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-21T09:28:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f71b31f85c415a32d7dfacbac3b6e3a6a01011cf",
          "body": "The marketing surfaces described Mu as something you \"run yourself\" / \"host\"\nwhile the reader was already on the hosted instance and the page's own CTAs\nwere the hosted sign-up path. \"Personal home server\" is right — it's the\nuser's relationship to it, true whether hosted or self-hosted — but the co\n[…]\nep \"a personal home server\" as a plain fact — reference,\nnot marketing.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "copy: frame micro.mu as the hosted instance, not self-host-only",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-21T08:53:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8c69bd104289fda1c076b74f841408da8233b5b3",
          "body": "The home card list treated HomeCards as a strict allowlist, so any card\nadded to cards.json after a user had customised their home was hidden for\nthem with no way back — logged-out visitors saw the Images card but\nlogged-in users who'd customised did not. The customise panels had also\ndrifted (the i\n[…]\n panels agree. Also label the reminder card\n\"Islam\" to match its title.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "home: show newly-added cards (like Images) for existing users",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-20T22:17:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4261481b3d24520b93439cad68002a88639b58f6",
          "body": "The mobile drawer used height:100svh (small viewport), which does not\ntrack Safari's collapsing toolbar, so Account/Logout reachability changed\ndepending on toolbar state. Switch to 100dvh (dynamic) with a 100vh\nfallback so the drawer bottom always lands at the real visible bottom, and\nadd env(safe-\n[…]\now scrolls like every other page and the drawer reaches Account/Logout.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "css: make the mobile sidebar consistent across every screen",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-20T13:18:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eb58b0613f6687ef46874387cfd74e2e3b3cc7f1",
          "body": "Lets a logged-in user (e.g. a username-only admin with no email) link Google\nso they can sign in with it, without creating a second account. Account page\ngets a Connect Google card; /oauth2/google/connect (session required) runs the\nOAuth flow in link mode via a g_link cookie; the callback sets the \n[…]\nt), so identities stay one-to-one. Username and password are untouched.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "auth: add \"Connect Google\" to link Google sign-in to an existing account",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-20T12:55:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a125f28fc21c6fb02eb66a40ca5d1d458fc87188",
          "body": "…chable\n\nThe mobile slide-out relied on an inner #nav scroll with a bottom-pinned\n.nav-bottom inside a 100svh fixed container. With the nav now much taller\n(Markets, Weather, Places, Islam, Images, Saved added), the pinned Account/\nLogout sat at the very bottom of 100svh — behind the browser toolbar\n[…]\nntire sidebar including\nAccount/Logout scrolls into view on any height.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "css: scroll the whole mobile sidebar so Account/Logout are always rea…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-20T12:10:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5e8f39c019d35e3719cb7b753ff9a39cd3e5388e",
          "body": "Inject \"Continue with Google\" after the page heading rather than before the\nform, so the title reads first.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "auth: put the Login/Signup title above the Google button",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-20T12:01:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8f3871745194fa4b975ed10fb98a2243e09ce684",
          "body": "Mu acts as an OAuth client of Google (distinct from the /oauth/* MCP server\nroutes). /oauth2/google starts the flow with a state-cookie CSRF guard;\n/oauth2/callback verifies state, exchanges the code, fetches the OIDC userinfo,\nand links by email or provisions a new account (username derived from th\n[…]\nom settings/env at request time — never embedded, logged, or committed.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "auth: add Google sign-in (OAuth) on login and signup",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-20T11:38:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c0ebe99e066b6e618b2e07498b2eebe7d83f8978",
          "body": "…tch to /about\n\nSignups clustered when the logged-out root was the live home — people could use\nMu immediately, then sign up once they'd felt the value. The marketing landing\nput a sign-in wall in front of that and cut it off. Switch the logged-out root\nback to the live home (real cards + working gu\n[…]\nr, viewable signed in or out) with an \"Open Mu\" CTA into the live home.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "home: make the live home the logged-out front door again; move the pi…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-20T11:11:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0cfd2f6e09555c1f6e3e9cfaeda20078bc0b0a15",
          "body": "The numbers were already live-bound to wallet.Cost* (so agent=7, image=15 were\ncorrect), but the table had no column labels and predated the current app set.\nAdd an Action/Credits header, state the free-reads model up front, add Places\nsearch, and show external email (4) instead of internal mail (1) since that's\nthe metered one.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "pricing: label the credit-costs table and reflect the current apps",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-20T11:02:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f835713e70579e80610416c9a93d08e0109a7997",
          "body": "The page showed Starter and Pro columns with the free/included features tucked\ninto a separate block below — most people scan pricing left-to-right and expect\na Free tier first. Promote it to a proper Free column (£0, no account needed:\ncommodity reads, daily image & verse, 3 AI questions a day, no ads) beside\nStarter and Pro, and widen the container to fit three.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "pricing: add a Free column so it reads as three tiers",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-20T10:46:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d4e2cf53040498639d4cdf12028f71c774a3a452",
          "body": "Thin search.svg and apps.svg from 2.5 to the 1.5 stroke standard, and replace\nthe raster weather.png in the nav with a matching thin sun weather.svg so the\nwhole sidebar reads as one consistent line-icon set.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "nav: finish the thin-icon pass — search, apps, and a new weather SVG",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T17:31:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "01ef1fe43551e51c8d6cce22b8422e4e65d885a0",
          "body": "The reminder card body built its own \"More\" link to reminder.dev, and the home\ncard framework also appends a \"More\" to the card's link (now /islam), so the\ncard showed two. Keep only the verse in the body; the framework's single\n\"More -> /islam\" stands.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "islam: drop the duplicate \"More\" link on the home card",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T15:53:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ff3d648fb58d584b1567e4aff4f5ac42fe620ca7",
          "body": "Rename the route /reminder -> /islam (301 redirect kept for old links) and use\nthe whole reminder.dev payload rather than just the verse: Verse of the day,\nName of Allah, Hadith and Reflection, each with a link to its source. Nav and\nthe home card now point at /islam; the page is public and serves JSON on\nAccept: application/json.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "islam: move the page to /islam and render the full daily reminder",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T15:21:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c1403afa85d07680081eb489e2ece1a371cf54ff",
          "body": "…andard\n\nImages, Markets, Places and Reminder rendered at a 2–2.5 stroke, heavier than\nthe existing thin icons (agent, social, saved at 1.5). Normalise them to 1.5 so\nthe sidebar reads consistently.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "nav: thin the newly-surfaced sidebar icons to match the 1.5 stroke st…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T15:00:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4293aff7d80021ad179d9bbbb55d8d5a2599a07f",
          "body": "Thread \"personal home server\" through the positioning copy — README, landing\n(title/tagline/lead), pricing hero, CLAUDE.md, the agent's self-description,\nABOUT/VISION/SYSTEM_DESIGN/docs, and the blog notes prompt — replacing \"personal\napp server\" / \"agent for everyday\". It's literally accurate: a se\n[…]\nse, hadith and\nname of Allah in-app (with JSON), keeping a source link.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "copy: reposition Mu as a personal home server; make /reminder in-app",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T14:51:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "df15bcba91a4ce1146f4e70cef2981fbc5272324",
          "body": "nano-banana rejected generation with \"Request parameters are invalid\" because\nthe go-micro Atlas provider hardcodes gpt-image-2 params (quality, size,\noutput_format, moderation) on every request. Call /api/v1/model/generateImage\ndirectly with the documented body ({model, prompt, aspect_ratio}) and p\n[…]\natible extras. Also bound prompt length and\nsurface the real API error.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "ai: call Atlas image API directly with documented minimal params",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T14:48:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7ec315c5462f8e7abd6e3a05abedfac36d510c4a",
          "body": "The save/unsave tools and per-user storage already existed and /app/saved\nrendered the list, but it wasn't in the nav and had no machine-readable face.\nComplete the surface:\n- Sidebar \"Saved\" entry (existing saved.svg icon) → /app/saved.\n- GetSavedList: one structured accessor (type, id, url, title,\n[…]\ngent can read your bookmarks; save and\n  unsave already handle writing.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "saved: surface Save / read-later as an app with a JSON + tool face",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T14:11:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1ca79359629c611e9b869628002fc2c710355537",
          "body": "…ases\n\nmarkets/social/video/news_headlines were the odd tools out — bare service\nnames against the service_action convention (blog_list etc.). Rename them to\nmarkets_list/social_list/video_list/news_list for a consistent public surface\n(tools/list, /mcp, /api, cards).\n\nThe old names are wired throug\n[…]\nkeyed separately (by\ncards.json type) and are unaffected. Docs updated.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "api: rename bare service tools to service_list; keep old names as ali…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T14:07:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "70e72890f032a498ad59d328849b8a38e4834601",
          "body": "Generated images are already stored per-owner; make them findable and reusable:\n- images.Search — search your own images plus everyone's public ones by prompt\n  text (public-only for guests), backed by userdb's contains operator.\n- Share-to-stock: a per-image public toggle (POST /images {id,public})\n[…]\nSON.\n- New public, free image_search MCP/REST tool over the stock pool.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "images: add search + a shareable community stock pool",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T13:04:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4b7bb5b36df1384f72514b368ef82ebec0fdeafb",
          "body": "These already had pages, cards, MCP tools and REST endpoints but weren't in\nthe nav, so they were only reachable via home cards or direct URL. Add them so\nevery capability is a discoverable first-class app.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "nav: surface Markets, Weather and Reminder as apps in the sidebar",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T12:59:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "797c8cd0de660ac6fd7251979c76dfe827f6e6a2",
          "body": "The Places app (search, nearby, saved searches, Google Places-backed, with\nplaces_search/places_nearby MCP+REST tools) already existed but wasn't in the\nnav, so it was undiscoverable. Add it to the sidebar. Also bump places_nearby\nfrom 2 to 4 credits — it hits Google at a similar cost to places_search (5),\nso 2 left it under-priced.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "places: surface the Places app in the sidebar; align nearby pricing",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T12:56:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "49d99991bb8fe2653a3398cca75d96007d0f9099",
          "body": "Atlas Cloud model ids are vendor/model/task (its default is\n\"openai/gpt-image-2/text-to-image\"). We passed \"google/nano-banana-2-lite\"\nwithout the task suffix, so Atlas answered 400 \"not found\". Use the full id\n\"google/nano-banana-2-lite/text-to-image\".\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "ai: fix image model id — Atlas needs the /text-to-image task suffix",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T12:12:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1549fd8718f99fac451e1754dae5cc7bbb074e1c",
          "body": "If the first daily generation fails (no Atlas key yet, a transient model\nerror), the scheduler waited until the next 06:00 UTC to try again. Retry\nwithin the hour instead so the daily image self-heals soon after the Atlas\nCloud key is configured, rather than a day later.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "images: retry the daily image hourly on failure, not once a day",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T12:09:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e7e89f0678c72eec7d60e4c0851935a83a9b67f2",
          "body": "A new image service on Atlas Cloud's google/nano-banana-2-lite text-to-image:\n- /images page: today's ambient image (nature / space / mindful, rotated by\n  day), a generate panel, and the signed-in user's gallery.\n- Daily image generated once a day at 06:00 UTC via a Load()-started scheduler,\n  pers\n[…]\no refresh the agent price in docs/MCP.md (3 -> 7) to match the reprice.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "images: add the /images app — generation + a calming daily image",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T11:45:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a83f057ca66dc39b128b2d1ddf9cd5b7514ccc35",
          "body": "Existing tests cover the payer loop and requirement shape; this adds the\nmissing server assertion — a metered call with no payment returns a well-formed\nHTTP 402 (status, application/json, x402Version/error/accepts envelope) whose\nadvertised price equals what the op's credit cost derives. Determinis\n[…]\nI-safe; the real-money settle half stays a testnet/mainnet manual step.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "wallet: test the server-side x402 402 challenge over HTTP",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T11:30:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bf96e82455c6a988c71f6ebf0a86c0c1819f2c36",
          "body": "The agent is the most expensive op — plan + multi-tool execution + synthesis,\nseveral LLM calls — yet it cost 3 credits while a single chat turn or web search\ncost 5. Price it above them (7; premium stays 9) so the flagship carries margin.\nCredits remain 1p each and the subscription bundles stay 1:1\n[…]\np cost sitting above true marginal cost, not from shrinking the bundle.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "wallet: reprice the agent query from 3 to 7 credits",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T11:29:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1bb708ae51f335e1d2e6fcd1bab78c07d98cf87d",
          "body": "Matches blog_delete and the service_action convention. db_delete is new this\ncycle with no external consumers, so this is a clean rename (no alias needed).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "db: rename db_del tool to db_delete for naming consistency",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T11:06:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b792474e8db9562547b85dd84cd8c8d0db4a4955",
          "body": "…/list\n\nThe MCP and API pages, and the MCP tools/list response, listed tools in\nregistration order, which is effectively random to a reader. Add sortedTools()\nand sortedEndpoints() (sorted copies, leaving the registration slice and its\ncard/execution semantics untouched) and use them in every displa\n[…]\nist path.\nTools sort by name; REST endpoints group by path then method.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "api: order tools and endpoints alphabetically on /mcp, /api and tools…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T10:30:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "606ea62d9d1f5f0ebf81437e3099d1618d752f86",
          "body": "The plan cards spanned the full content width while the info cards below\nwere a narrower 560px, so nothing shared a centre line and it read as\noff-centre. Wrap the whole page in a single 620px centred column and let\nevery block fill it.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "home: centre the pricing page in one consistent column",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T10:19:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "303b620183e33b195ef7309acc82963b6e2608c6",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "home: add Pricing link to the landing footer",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T10:09:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "af0837f232140d2f2106a1a26b6310cfa62c19e1",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "home: landing link reads \"See the agents page\"",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T10:08:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3f2c86e8ce0fdfcaa1f65498ebdd1487c9231057",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "home: shorten landing agents line to \"Building agents?\"",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T10:07:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8009376bae9b892a135ceb2ce2f495f6866e4b1c",
          "body": "The root used to render the live home (cards + guest agent) for logged-out\nvisitors, doubling as the landing. It never actually said what Mu is. Replace\nit with a proper landing in the same format as /agents: a short description,\nCreate account / Sign in CTAs, a pointer to the /agents developer page\n[…]\ning guards and\nredirects too. The live home remains reachable at /home.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "home: give logged-out visitors a real landing page",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T10:05:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c77a65f73cd0c7d49ae3e532d02aa6af90fae2d1",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-19T07:25:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b759eca85cab6f6f4b4de13212fbd6b91cc92c9",
          "body": "The agent is our most valuable and most expensive operation, but it only\nchecked quota — it never consumed credits, so the flagship op ran free.\n\nTurn on billing in both entry points (streaming /agent and /agent/run):\nafter the quota check admits the request, deduct the query cost via the new\nagent.\n[…]\nain\nfree (ConsumeQuota routes admins through RecordUsage at zero cost).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "agent: charge the acting user's wallet for agent queries",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T15:14:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9a2abfa36bf64aa453d7824fb4316b373828d84c",
          "body": "The API face is for agents, and it isn't a portal — drop the whole\nX-Mu-Portal / domain-branding machinery now that m3o.com is retired.\n\n- /developers -> /agents (301 redirect kept for old links). The page is\n  rebranded to a fixed \"Mu\" wordmark and mentions the new db capability.\n- Remove PortalMod\n[…]\nlink is\npresent, and the X-Mu-Portal header no longer changes any page.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "agents: rename /developers -> /agents; remove portal mode",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T09:50:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a91387c71aa7cbfad8bac16bb0382747f3434b26",
          "body": "Make mu.db a first-class capability across every surface (web UI, SDK, API,\nMCP), so it can be used and monetised consistently.\n\n- internal/userdb: extract the shared record layer (owner scoping, private/\n  public, where operators, per-owner caps, path-confined keys) out of the app\n  SDK. A namespac\n[…]\nSDK db still works; /mcp and\n/api list the db tools and a single agent.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "db: expose the personal store over MCP + REST; unify the record layer",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-17T15:36:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fcfc444c66882b5bbed48094044f8705a8cc7908",
          "body": "The /mcp Authentication card presented a Bearer token as required and only\nmentioned x402 in a separate, conditionally-rendered card — so it read as\n\"login required\" while /developers says \"no login, pay per call\". When x402\nis enabled, the card now leads with the two ways to call (pay-per-call with\n[…]\nages, and notes that a few account-touching tools\nstill need a session.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "mcp: align /mcp auth wording with /developers and /api",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-17T09:35:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "03a2c26bc34100594c40c1e13e08124c6737df61",
          "body": "The app SDK's costly calls weren't being charged: mu.web.fetch had no quota\ngate at all, and mu.ai checked the balance but never deducted. Add a\nChargeQuota hook (set in main.go) and deduct from the acting user after a\nsuccessful call — mu.web.fetch → web_fetch, mu.ai → chat_query.\n\nCharging the act\n[…]\nlf-hosted instances are unaffected (ConsumeQuota already exempts them).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "apps: charge the user wallet for metered SDK calls (mu.web.fetch, mu.ai)",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-16T09:08:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "96200139be451e8377e241c6a2d380b6d9924404",
          "body": "The create cap counted every user's records, so a universal app shared by\neveryone would hit the 2000-record ceiling collectively — one user could\nfill a public collection and block the rest. Count only the caller's own\nrecords, so each user gets their own budget and universal apps scale.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "apps: cap mu.db records per owner, not per collection",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-16T08:51:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1becca47a99bd8749af71640972ada5edb0fdbc4",
          "body": "Ship the apps announcement/tutorial as a built-in post, merged idempotently\nby fixed ID on every startup (so it publishes on the next deploy and on\nfresh installs, without duplicating). Covers mu.user, mu.db (private/public\n+ where operators), mu.web.fetch, and mu.ai/mu.agent, with the bookmarks\napp\n[…]\npost lists on /blog and renders at /blog/post with all\nfour primitives.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "blog: publish \"Build your own apps on Mu\" as a seeded post",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-16T08:41:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f352f5b507c80d14a77b5ec73186d3daf2568b49",
          "body": "Seeding only ran on first run, so new built-ins never reached existing\ninstances and a deleted one stayed gone. Replace it with ensureBuiltins():\non every startup, add any missing \"mu\"-authored app, and only fill gaps —\nnever overwrite a user's app or their in-place edits to a built-in.\n\nThese are t\n[…]\nools an\nOS includes — while users still build and run their own on top.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "apps: built-in apps always exist (merge on every startup)",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-16T08:37:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e70408ddbb4b3818bb462a8036f8423773cc338c",
          "body": "mu.db and mu.store build a data-file key from the app slug and collection\nname. collection was validated but slug was not, and data.SaveJSON/LoadFile\njoined the key onto the store dir without confining it — so a crafted slug\ncould, in principle, escape $HOME/.mu/data via path traversal (the router\nc\n[…]\nthe session, not\nthe client, so app data can't be spoofed across users.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "security: confine app data paths; validate app slug in SDK handlers",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-16T08:35:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a829e7f0b3606eb51e53f5820785bc06d35391fa",
          "body": "A reference/example app that exercises the new building blocks end to end:\npaste a link, the title is fetched server-side with mu.web.fetch (no CORS,\nSSRF-guarded), and the bookmark is saved as a mu.db record — private by\ndefault or shared publicly, with Mine / Public tabs. Ships as a seed and a\nsta\n[…]\n live: adding a link fetches its title and lists it; no console\nerrors.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "apps: add Bookmarks example — mu.db (private/public) + mu.web.fetch",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-16T07:57:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "414ae61aee5a43f3a67bfaae8eb472d97e8996c3",
          "body": "…u.db query operators\n\n- SDK: mu.server.fetch is now mu.web.fetch (the web namespace reads better).\n- safefetch: add a dial-time public-IP pin for direct (non-proxied) requests,\n  closing the DNS-rebinding gap the pre-flight check alone can't — parity with\n  the platform's already-guarded web_fetch.\n[…]\nhecks); no gap there. This brings the app-facing fetch to the same bar.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "apps: rename mu.server.fetch -> mu.web.fetch; harden safefetch; add m…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-16T07:52:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "da65fd80a6e252f7a13f8173358d4f6fc9bee362",
          "body": "The apps doc had drifted from the code: it described a sandboxed-iframe +\npostMessage SDK (apps now render as a full page with same-origin\nauthenticated fetch), documented a mu.fetch that doesn't exist, an\noutdated App struct, and nothing on the new building blocks.\n\nRewrite to match reality and cov\n[…]\n server-bound. Corrects the API\ntable, security section, and seed list.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "docs: rewrite APPS.md for the current SDK (mu.db, mu.server.fetch)",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-15T19:24:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e014e73ed87a9250b7426464562fb03f2686cc31",
          "body": "…apps\n\nClient-side apps can't reach most external APIs (CORS) and can't hold\nsecrets. Add mu.server.fetch: the server makes the request and returns\n{status, body, headers}, so an app gets no-CORS access, server-side keys,\nand a place to add server value.\n\n- internal/safefetch: a guarded HTTP client.\n[…]\nssification, URL validation,\nand a real loopback-block are unit-tested.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "apps: add mu.server.fetch — SSRF-guarded server-side fetch for micro …",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-15T16:08:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "05d8059d8f945d71c6712e48fc54af792b60d2be",
          "body": "…apps\n\nThe flat key-value store (mu.store) can't express the data model real apps\nneed. Add mu.db: named collections of JSON records, each with a server-set\nowner and a private/public flag, so one universal app can hold every user's\nprivate data plus a shared public set.\n\n- SDK: mu.db.create/get/lis\n[…]\nr-private)\nis unit-tested; the notes app renders and reads its records.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "apps: add mu.db — a per-user/public collections data layer for micro …",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-15T14:38:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "abf7ff44c474c2d219a92efcf456b3148d8cdf63",
          "body": "Route guests through the real home dashboard instead of a separate\nmarketing page. home.Handler already handled a nil account for cards, the\nJSON refresh, and the prefs/pins (all gated on a session); this makes the\ninline agent render for guests too (guest chat + generic starters), adds a\n\"Log in\" a\n[…]\nin (not\nAccount), no prefs/pins panel, and a deep link seeds the agent.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "home: the logged-out landing is now the home screen itself",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-12T21:35:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "042c345b5f8f8773bd7cef21f099b4bde14758e9",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-12T21:26:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a21f5f087d0260b2fe5c153366e0266c87b15c49",
          "body": "…irst rewrite\n\nLanding (logged out): reframe from a bare chat box to a public version of\nthe home. Beneath the guest agent, render a live glance — real market\nprices and (when feeds are loaded) headlines — with inline styles since\nthe landing shell doesn't load mu.css. Copy shifts from \"an agent for\n[…]\n prices with\nup/down colouring; price formatting covered by unit tests.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "landing: public home with live glance; readme: functional developer-f…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-12T21:22:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1df429736e226b15ea8c8b119f826b83d0944878",
          "body": "…gout in sidebar\n\nREADME rewrite: lead with the actual product thesis — a daily home you\nown, glanceable by default (cards for the everyday), with an agent for\nwhat a glance can't do, on a stack that's yours. Glance is the habit, the\nagent is the value, ownership is the moat. De-emphasise Go Micro i\n[…]\n Verified in a mobile browser: both render and sit\nwithin the viewport.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "readme: reframe around glance/agent/ownership; fix missing account/lo…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-12T21:12:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6aa0359b7ec1d711f78882ed72db5a3729542d66",
          "body": "The draggable grid rendered cards row-major across two grid columns, which\nlocked row heights and shuffled cards between columns as you dragged —\nfighting the clean two-column masonry. Revert to the fixed layout: two\nindependent columns (each flows at its own height), with which cards show\ncontrolle\n[…]\nas iframe cards at the bottom, and the\n\"Search\" card label in settings.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "home: drop card dragging, restore the fixed two-column layout",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-12T19:08:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a26fd2903e238ca0d18adee6bba63e1cb2d133b3",
          "body": "Add a built-in \"Hello World\" app — a minimal, dependency-free raw-mode\npage — so the directory ships a dead-simple example and every fresh\ninstall has a pinnable public app.\n\nAlso fix a latent bug: apps.Load() returned early when apps.json did not\nexist, so seedApps() never ran on a genuinely fresh \n[…]\ninning it surfaces the tile in the home top strip above the\ncards grid.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "apps: seed a Hello World example and fix first-run seeding",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-12T18:26:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "53a022bb735e2d16f31ad87f4c2040ac944eafed",
          "body": "Rework the home dashboard around a single grid the user arranges, GitHub\npinned-items style:\n\n- Cards render in one #home grid (2 columns desktop, 1 mobile) in the\n  account's saved order, replacing the fixed left/right columns and the\n  per-id mobile order hacks. Default order for a fresh account i\n[…]\nid in default\norder, a reorder POST round-trips and persists on reload.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "home: draggable card grid with saved order, pinned-apps strip on top",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-12T18:12:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "09c8844f3b80cf7dfe7fd69337e8d10856247ad7",
          "body": "Less is more. The daily push brief was mostly noise (crypto-heavy,\nrarely read) and the Home glance was a second summary surface that\ncould go blank. Both removed:\n\n- Discord: remove StartBriefingLoop and the whole brief pipeline\n  (diverseHeadlines, bigMoversLine, briefHook, personalContext) and th\n[…]\nll package to fix the test build left over from the earlier extraction.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "Simplify: drop the Discord morning brief and Home \"at a glance\"",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-12T12:26:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5e0ea48c39bcbf258f2aedc49973b2a12fd135a3",
          "body": "End the sharp, short brief with one line linking the day's richer read on the\nblog — the opinion piece if there is one, else the digest. The wall of text\nlives on the blog; Discord gets the tight brief plus a click-through into the\nbetter long-form content.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "discord: append a blog hook to the morning brief",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-12T07:21:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2070423046a487771074b18e719628688eda8a81",
          "body": "… dump\n\nThe brief fed the top-10 chronological headlines to the LLM. Because the feeds\nare crypto/finance-heavy (Coindesk, CNBC), that input was mostly crypto — so\nthe output was too, no matter what the prompt asked.\n\nFix the input, then the voice:\n- diverseHeadlines spreads the pick across news cat\n[…]\nped and one line.\n\nTests cover the category spread and crypto deferral.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "discord: make the morning brief diverse and intelligent, not a crypto…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-12T07:15:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "967e6a3077d616aee9cb11db03aab4f2fba8402c",
          "body": "service.Call was going over an HTTP loopback transport — ~398µs, 25KB, 270\nallocs per in-process call (benchmarked). The registry and broker were already\nin-memory but client/servers used the default HTTP transport. Wire a shared\ntransport.NewMemoryTransport() into the client and every server so cal\n[…]\nvs BenchmarkDirectCall)\nso the framework round-trip cost stays visible.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "perf: in-memory transport for in-process service calls (6x)",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-11T18:56:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "68a02760a12727c365f486b80e164933d0517a56",
          "body": "The recall go-micro service (types + handler + ~100 lines of helpers) lived in\nmain.go. Move it to a recall/ package like every other domain service\n(recall.Server, recall.Request/Response), shrinking main.go and giving the\nservice a proper home. main.go 1960 -> 1860 lines.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "refactor: extract RecallServer into its own package",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-11T18:56:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "835d282642ab9b1a32943da76dae2a88a0d2c016",
          "body": "The trade package was removed earlier; strip the leftover references:\n- README: drop 'trade' from the service list and the '/swap' Discord command;\n  soften the 'Built on Go Micro' section to accurate, humble framing (each\n  capability is a Go Micro service the agent calls; single binary) instead of\n[…]\n\n\nFunctional continuity kept as-is (TRADE_RPC_URL, trade_wallets.json).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "docs+code: remove retired trade/swap; soften go-micro README claims",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-11T18:22:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bdd115016bbc6f846f7821ecba488d1f48f2aa90",
          "body": "Run gofmt -w across the tree (29 files were not gofmt-clean) and stop the drift\nat the source: pre-commit and CI (test.yml) now fail on gofmt-unclean files and\nrun go vet, not just tests.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "chore: gofmt the repo and enforce formatting",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-11T18:22:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8bf165a3ad9b95579fd4179f29780a03f04fa36e",
          "body": "Move the scattered design/migration docs into the single docs/ dir:\n- root ARCHITECTURE.md, MIGRATION.md, GO_MICRO.md -> docs/\n- internal/docs/ARCHITECTURE.md -> docs/GO_MICRO_ARCHITECTURE.md (renamed to\n  avoid colliding with the general ARCHITECTURE.md; it's the go-micro target\n  model)\n- internal\n[…]\nt too — it's project instructions Claude Code loads, not\ndocumentation.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "docs: consolidate all markdown into docs/ (only README stays at root)",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-11T16:30:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "205e23df432692a2a3b178948ec4765b163bd641",
          "body": "With the autonomous loop gone, its working docs in internal/docs are dead:\nPRIORITIES.md (the auto-maintained queue), MARKETING.md, THESIS.md, and the\nblog/ drafts folder. Remove them. Keep ARCHITECTURE, X402, SECURITY, SERVICES\nas reference notes, and repoint ARCHITECTURE.md's intro (which linked the\ndeleted THESIS.md) at the README / docs/VISION.md.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "docs: remove orphaned Codex-loop planning docs",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-11T16:26:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "56633a7d56ed1fb90416fea2920683591ed38c53",
          "body": "static/maintenance.html is a reverse-proxy 'be right back' page shown while\nthe app is down during a restart — not embedded, not served by the app. It's\nan ops artifact, so it belongs with the deploy scripts, not app/static. Moving\nit empties the top-level static/ dir, which is removed.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "cleanup: move maintenance page to scripts/deploy, drop empty static/",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-11T16:20:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c5a944a6fc6da9a5d294b4339dbc773f6eb6bb8a",
          "body": "Declutter the top level so it's mostly domain/product packages:\n- setup/ -> internal/setup (first-run bootstrap wizard, only main.go uses it)\n- portal/ -> internal/portal (dev-portal rendering, only main.go uses it)\n- deploy/ -> scripts/deploy (ops scripts + systemd units, no Go code)\n\nUpdated the t\n[…]\nckage names and behaviour\nunchanged; git history preserved via renames.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "cleanup: tuck away non-core top-level dirs",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-11T16:14:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "06e36df43c9d65f308177e72628f1c7bfac66929",
          "body": "Strip the development-loop GitHub Actions (product-review, marketing-review,\ncontinuous-improvement) and the CONTINUOUS_IMPROVEMENT.md doc that only\ndescribed them — we drive development ourselves again. Keep deploy, release,\nand test (CI/infra). THESIS/PRIORITIES/MARKETING docs left as standalone\nreferences.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "ci: remove the autonomous Codex development loop",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-11T16:09:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1127d04974a60d861e755e1b23826296d3890b2a",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Update product priorities for review 1440 (#1442)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-11T15:54:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d48d1427a47a707b478d6ed9956991091683a72",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Polish AI news freshness summaries (#1439)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-11T15:44:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eeecb2b59320e08dd86eaab77738deb6d2ddd170",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Update product priorities after review 1435 (#1437)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-11T14:52:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d69b3536fe41fd6ce31b8c140ea2da4a75191fd0",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Filter weak AI news job-market and compiler posts (#1434)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-11T14:08:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8706580b54d3b07d3813dc85aa1013b2bc76690",
          "body": "The nav list gained an 11th item (Apps) and could exceed the viewport. #nav\nhad flex:1 + overflow-y:auto but no min-height:0, so it grew to fit its\ncontent instead of scrolling, pushing the pinned .nav-bottom (account/logout)\noff the bottom of the slide-out menu. Add min-height:0 so it scrolls.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KdcPjN9ndJwMGKQSRrAGPE",
          "is_bot": false,
          "headline": "nav: keep account/logout visible when the menu overflows on mobile",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-11T13:19:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9c6a40f04823548156e338b92772d835af375cb5",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Update product priorities for review 1430 (#1432)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-11T13:13:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b5ee8af1d6db8e4979ac1d73c7fe5cd10255fd30",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Filter novelty AI news demos (#1429)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-11T12:22:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "42c9ecec27eb0df6ef2efe3c0c1be460dd30aa7b",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Update product priorities after review 1425 (#1427)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-11T11:03:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee37dd3f2e893163d23c3580e6a3a7863c55765d",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Filter broad AI chip finance from news cards (#1424)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-11T10:49:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2229e0c852fa81c7374be64d097afdaace06f7b0",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Update product priorities after review 1420 (#1422)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-11T09:27:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2842e5b154b86052e834d56542ae1804109fcc4d",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Filter stale AI-chip finance background (#1419)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-11T09:12:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "59a33f4668048b183e4e386f04ba70f0351b4733",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Align marketing surface with places service (#1417)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-11T08:50:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "783d64003da40972d46ae0d126e33472a6792be1",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Update product priorities after review 1413 (#1415)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-11T07:51:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9cd0007a72043c151db3af7e917f8fa7f34183a8",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Filter broad AI chip finance from AI news (#1412)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-11T07:32:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f9db09d414e9d2c3f2681a8af40d7c9acfef9be2",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Update product priorities after review 1408 (#1410)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-11T05:39:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "365a9d214d391b0ec9a996eee20487b301bfa87c",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Filter generic software posts from AI news (#1407)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-11T04:44:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3f50efc1eab39c7ff93c887470baebb1d9f1308e",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Update product priorities after review 1403 (#1405)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-11T02:24:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53832c9559972bdf6f0c3e40cc66af1b8a4c0d9c",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Add indexed AI-news hiring filter coverage (#1402)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-11T01:08:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9a6763505c6195ae55494ec880d016f6713b7de9",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Tighten AI news topic filtering (#1400)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-10T23:35:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b3d5caa37fe02f728f8d5632bd7d45ac47b1b064",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Update product priorities after review 1395 (#1397)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-10T22:01:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9dba07415b0633571cbfc349009e991936c59218",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Filter generic finance policy from AI news (#1394)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-10T21:44:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ccb36e053ce2b3a3880ceb6e42b5fab0c3204323",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Update product priorities after review 1390 (#1392)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-10T20:22:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f7c8b0ca09b4dc4a367299562e923fa9a3ee5ace",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Tighten AI-chip finance news fallback (#1389)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-10T20:06:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eee3905a0bee7ca5fe79b53b9072469e6bba0b14",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Update product priorities after review 1385 (#1387)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-10T18:23:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0c5e147c331d79ba91190dc1a216c4a0e043162",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Tighten AI news finance filtering (#1384)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-10T18:16:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "779c924510f9429b933919b2663156d8f3bc6562",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Update product priorities after review 1380 (#1382)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-10T16:55:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3d8d5f488f81ece9b37f4a29bda29dce1c206964",
          "body": "Co-authored-by: Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Tighten AI news adjacent filtering (#1379)",
          "author_name": "Asim Aslam",
          "author_login": "asim",
          "committed_at": "2026-07-10T15:53:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 40,
      "commits_last_year": 3904,
      "latest_release_at": "2026-07-20T22:17:39Z",
      "latest_release_tag": "v0.32.0",
      "releases_from_tags": false,
      "days_since_last_push": 1,
      "active_weeks_last_year": 49,
      "days_since_latest_release": 3,
      "mean_days_between_releases": 5
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 50,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": []
    },
    "popularity": {
      "forks": 3,
      "stars": 97,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2025-11-30",
            "count": 1
          },
          {
            "date": "2026-06-02",
            "count": 1
          },
          {
            "date": "2026-07-21",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 3,
        "total_forks": 3
      },
      "star_history": null,
      "open_issues_and_prs": 15
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 100229,
      "source_files_sampled": 295,
      "oversized_source_files": 7,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 3104
    },
    "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": "github.com/ProtonMail/go-crypto",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.0"
        },
        {
          "name": "github.com/PuerkitoBio/goquery",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.8.0"
        },
        {
          "name": "github.com/asim/quadtree",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.3.0"
        },
        {
          "name": "github.com/emersion/go-msgauth",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.7.0"
        },
        {
          "name": "github.com/emersion/go-smtp",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.24.0"
        },
        {
          "name": "github.com/go-webauthn/webauthn",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.16.0"
        },
        {
          "name": "github.com/gomarkdown/markdown",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20250311123330-531bef5e742b"
        },
        {
          "name": "github.com/google/uuid",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/gorilla/websocket",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.5.3"
        },
        {
          "name": "github.com/mmcdole/gofeed",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.0"
        },
        {
          "name": "github.com/mrz1836/go-sanitize",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.5.3"
        },
        {
          "name": "github.com/piquette/finance-go",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.0"
        },
        {
          "name": "go-micro.dev/v6",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v6.3.10"
        },
        {
          "name": "golang.org/x/crypto",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.48.0"
        },
        {
          "name": "golang.org/x/net",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.49.0"
        },
        {
          "name": "golang.org/x/sync",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.19.0"
        },
        {
          "name": "google.golang.org/api",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.243.0"
        },
        {
          "name": "modernc.org/sqlite",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.42.2"
        }
      ],
      "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": 874,
        "open_issues": 15,
        "closed_ratio": 0.973,
        "closed_issues": 540,
        "closed_unmerged_prs": 12
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "asim",
          "commits": 2336,
          "avatar_url": "https://avatars.githubusercontent.com/u/17530?v=4"
        },
        {
          "type": "User",
          "login": "claude",
          "commits": 849,
          "avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.733
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "deploy.yml",
        "release.yml",
        "test.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": 6,
            "reason": "project has 2 contributing companies or organizations -- score normalized to 6",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10",
            "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": 4,
            "reason": "security policy file 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": "30 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "4862f003aa017a3e96b1c5cae88e59fe42de1721",
        "ran_at": "2026-07-24T04:14:38Z",
        "aggregate_score": 3.2,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-22T11:11:25Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-11T15:54:36Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 42,
          "created_at": "2025-12-03T09:25:33Z",
          "last_comment_at": "2026-02-19T09:08:58Z",
          "last_comment_author": "asim"
        },
        {
          "number": 43,
          "created_at": "2025-12-04T11:44:11Z",
          "last_comment_at": "2026-02-19T09:09:23Z",
          "last_comment_author": "asim"
        },
        {
          "number": 47,
          "created_at": "2025-12-08T08:42:50Z",
          "last_comment_at": "2026-01-15T09:51:49Z",
          "last_comment_author": "asim"
        },
        {
          "number": 54,
          "created_at": "2025-12-11T06:56:09Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 59,
          "created_at": "2025-12-12T16:04:52Z",
          "last_comment_at": "2025-12-16T18:27:41Z",
          "last_comment_author": "asim"
        },
        {
          "number": 65,
          "created_at": "2025-12-23T13:08:17Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 66,
          "created_at": "2025-12-23T20:00:33Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 71,
          "created_at": "2025-12-26T09:43:44Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 72,
          "created_at": "2025-12-26T09:44:43Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 74,
          "created_at": "2025-12-27T09:06:09Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 76,
          "created_at": "2026-01-01T15:48:34Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 81,
          "created_at": "2026-01-17T13:15:40Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 83,
          "created_at": "2026-02-09T18:26:00Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 89,
          "created_at": "2026-02-16T14:22:37Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1441,
          "created_at": "2026-07-11T15:53:45Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/micro/mu",
    "host": "github.com",
    "name": "mu",
    "owner": "micro"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 62,
      "inputs": {
        "security": 32,
        "vitality": 95,
        "community": 42,
        "governance": 55,
        "engineering": 76
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 95,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 98,
            "inputs": {
              "commits_last_year": 3904,
              "human_commit_share": 1,
              "days_since_last_push": 1,
              "active_weeks_last_year": 49
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 1 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 1
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "49/52 weeks with commits",
                "points": 33.9,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 49
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "3904 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 3904
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 40,
              "latest_release_tag": "v0.32.0",
              "releases_from_tags": false,
              "days_since_latest_release": 3,
              "mean_days_between_releases": 5
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "40 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 40
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 3 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 3
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~5 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 5
                    }
                  }
                ],
                "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": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 1,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 1 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 1
                    }
                  }
                ],
                "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": 42,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 35,
            "inputs": {
              "forks": 3,
              "stars": 97,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "97 stars",
                "points": 32.2,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 97
                    }
                  }
                ],
                "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": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (AGPL-3.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "AGPL-3.0"
                    }
                  }
                ],
                "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": "moderate",
        "name": "Sustainability & Governance",
        "value": 55,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 24,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.733
            },
            "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 73% of commits",
                "points": 6,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 73
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 83,
            "inputs": {
              "merged_prs": 874,
              "open_issues": 15,
              "closed_issues": 540,
              "issue_closed_ratio": 0.973,
              "closed_unmerged_prs": 12
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "97% of issues closed",
                "points": 45.5,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 97
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "874/886 decided PRs merged",
                "points": 37.7,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 874,
                      "decided": 886
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 63,
            "inputs": {
              "followers": 230,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "micro",
              "public_repos": 3,
              "account_age_days": 4736
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "230 followers of micro",
                "points": 17,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 230,
                      "login": "micro"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "3 public repos, account ~12 yr old",
                "points": 16.4,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 3
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 12
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 76,
        "weight": 0.2,
        "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": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "mu",
                "micro",
                "apps",
                "mcp"
              ],
              "has_wiki": true,
              "homepage": "https://micro.mu",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://micro.mu",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "4 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 32,
        "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": 32,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 3.2
            },
            "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 2 contributing companies or organizations -- score normalized to 6",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "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 detected",
                "points": 2,
                "status": "partial",
                "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": "30 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 79,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.98,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 3104
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "98 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 98,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.72,
              "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": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "72 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 72,
                      "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": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 100229,
              "source_files_sampled": 295,
              "oversized_source_files": 7
            },
            "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": "7/295 source files over 60KB",
                "points": 53.7,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 295,
                      "oversized": 7
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "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-24T04:14:44.146813Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/m/micro/mu.svg",
  "full_name": "micro/mu",
  "license_state": "standard",
  "license_spdx": "AGPL-3.0"
}

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

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

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