Registro público
Informe de salud del softwareesquema 0.26.0 · métricas 1.13.0 · 2026-07-22 15:05 UTC

metalabel / dfos

Dark Forest OS identity and content protocol, reference implementations, schemas and tests

TypeScript · GoMIT★ 28 estrellas⑂ 2 forksdesde mar 2026Ver en GitHub ↗

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

57
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.

57
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

MetalabelOrganización
25 seguidores8 repositorios públicosdesde jun 2022

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
Gogithub.com/metalabel/dfosv0.24.0-38hace 5 días
npm@metalabel/dfos-protocol0.24.0501240hace 5 díasdfosprotocoled25519jwsdidverifiableidentitycontent-addressingdag-cborcidmetalabel
npm@metalabel/dfos-web-relay0.24.0479436hace 5 díasdfosrelayweb-relayhonoed25519jwsdidverifiableidentitycontent-addressingmetalabel

Métricas por categoría

Vitalidad

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

80Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
9.7/36Cadencia de commits — 14/52 semanas con commits
18/18Volumen de commits — 262 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year262
human_commit_share1
days_since_last_push0
active_weeks_last_year14
Cómo se puntúa
27/27Publica versiones — 30 versiones publicadas
36/36Recencia de las versiones — última versión hace 5 días
27/27Cadencia de publicación — una versión cada ~1,8 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count30
latest_release_tagv0.24.0
releases_from_tagsno
days_since_latest_release5
mean_days_between_releases1,8

Comunidad y Adopción

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

43En riesgo · 18% del índice global
Cómo se puntúa
23.2/60Estrellas — 28 estrellas
0/25Forks — 2 forks
0/15Observadores — 1 observadores
Datos de entrada utilizados
forks2
stars28
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
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
Cómo se puntúa
53.2/80Descargas mensuales — 9806 descargas/mes en go, npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesgithub.com/metalabel/dfos, @metalabel/dfos-protocol, @metalabel/dfos-web-relay
dependents
ecosystemsgo, npm
total_downloads
monthly_downloads9806
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

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

57Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
10/10OpenSSF Scorecard: Contributors — project has 3 contributing companies or organizations -- score normalized to 10
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
37.5/38.3Aceptación de PR — 194/198 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs194
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs4
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues. Los pesos restantes se han renormalizado.
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
10.2/25Alcance del propietario — 25 seguidores de metalabel
15.1/25Trayectoria — 8 repos públicos, cuenta de ~4 años
Datos de entrada utilizados
followers25
owner_typeOrganization
is_verified
owner_loginmetalabel
public_repos8
account_age_days1486
Cómo se puntúa
25/25Publicado y resoluble — 3 paquete(s) en go, npm
35/35Recencia de publicación — última publicación hace 5 días
20/20Historial de versiones — 40 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/metalabel/dfos, @metalabel/dfos-protocol, @metalabel/dfos-web-relay
ecosystemsgo, npm
any_deprecatedno
min_days_since_publish5

Calidad de Ingeniería

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

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

Documentación

55Moderado
Cómo se puntúa
30/30README
0/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://protocol.dfos.com
10/10Descripción del repositorio
0/10Topics
0/10Wiki
Datos de entrada utilizados
topics
has_wikino
homepagehttps://protocol.dfos.com
has_readme
has_docs_dirno
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.8/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.5/2.5CI-Tests — 24 out of 24 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 3 contributing companies or organizations -- score normalized to 10
0/10Dangerous-Workflow — 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 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
5/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 — 58 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate3,2

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.

67Moderado · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 100 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
18/18Arranque con un solo comando — packages/dfos-cli/Makefile
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — packages/dfos-client/tsconfig.json, packages/dfos-explorer/tsconfig.json, packages/dfos-protocol/tsconfig.json, packages/dfos-web-relay/tsconfig.json, packages/site-protocol/tsconfig.json, packages/site-schemas/tsconfig.json
10/10Entorno reproducible — Dockerfile, lockfile
10/10Práctica demostrada con agentes — 81 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
lockfilesCargo.lock, go.sum, package-lock.json, pnpm-lock.yaml
has_dockerfile
typed_language
bootstrap_filespackages/dfos-cli/Makefile
has_devcontainerno
has_linter_configno
typecheck_configspackages/dfos-client/tsconfig.json, packages/dfos-explorer/tsconfig.json, packages/dfos-protocol/tsconfig.json, packages/dfos-web-relay/tsconfig.json, packages/site-protocol/tsconfig.json, packages/site-schemas/tsconfig.json
agent_commit_share0,81
toolchain_manifestspackages/dfos-cli/go.mod, packages/dfos-protocol-go/go.mod, packages/dfos-web-relay-go/go.mod, packages/protocol-verify/go/go.mod, packages/protocol-verify/rust/Cargo.toml, packages/relay-conformance/go.mod
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — TypeScript (tipado estático)
54.6/55Tamaños de archivo manejables — 2/302 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageTypeScript
largest_source_bytes156.997
source_files_sampled302
oversized_source_files2
Cómo se puntúa
40/40Esquema de API (OpenAPI/GraphQL/proto) — packages/dfos-web-relay/openapi.yaml
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_filespackages/dfos-web-relay/openapi.yaml

Datos clave

28estrellas de GitHub
1contribuidores
262commits en los últimos 12 meses
0días desde el último push
30versiones publicadas
1factor bus
0issues abiertas
npmecosistemas de paquetes

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • Could not fetch npm package '@metalabel/dfos' from its registry
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index npm:@metalabel/dfos-protocol@0.24.0; advisories assessed against the repository dependency graph instead

Más detalle

Historial de estrellas y forks 0 ★ / 2 ⇿
0Estrellas
2Forks
25Versiones

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.

111222212026-042026-062026-07
Mayor 0Menor 15Parche 10
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-22 15:04 UTC

10Binary-Artifactsno binaries found in the repo
1Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests24 out of 24 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
10Contributorsproject has 3 contributing companies or organizations -- score normalized to 10
0Dangerous-Workflowdangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
10Security-Policysecurity policy file detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities58 existing vulnerabilities detected
Dependencias directas 32
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/mattn/go-isattyv0.0.22packages/dfos-cli/go.mod
Gogithub.com/metalabel/dfos/packages/dfos-protocol-gov0.0.0packages/dfos-cli/go.mod
Gogithub.com/metalabel/dfos/packages/dfos-web-relay-gov0.0.0packages/dfos-cli/go.mod
Gogithub.com/pelletier/go-toml/v2v2.3.1packages/dfos-cli/go.mod
Gogithub.com/spf13/cobrav1.10.2packages/dfos-cli/go.mod
Gogithub.com/zalando/go-keyringv0.2.8packages/dfos-cli/go.mod
Gogolang.org/x/sysv0.46.0packages/dfos-cli/go.mod
npm@metalabel/dfos-clientworkspace:*packages/dfos-explorer/package.json
npm@metalabel/dfos-protocolworkspace:*packages/dfos-explorer/package.json
npm@metalabel/dfos-web-relayworkspace:*packages/dfos-explorer/package.json
npmmultiformats^14.0.0packages/dfos-explorer/package.json
npmpreact^10.28.2packages/dfos-explorer/package.json
Gogithub.com/fxamacker/cbor/v2v2.9.2packages/dfos-protocol-go/go.mod
Gogithub.com/mr-tron/base58v1.3.0packages/dfos-protocol-go/go.mod
npm@ipld/dag-cbor^10.0.1packages/dfos-protocol/package.json
npm@noble/curves^2.2.0packages/dfos-protocol/package.json
npm@noble/hashes^2.2.0packages/dfos-protocol/package.json
npmmultiformats^14.0.0packages/dfos-protocol/package.json
npmzod^4.4.3packages/dfos-protocol/package.json
Gogithub.com/metalabel/dfos/packages/dfos-protocol-gov0.0.0packages/dfos-web-relay-go/go.mod
Gomodernc.org/sqlitev1.52.0packages/dfos-web-relay-go/go.mod
npmhono^4.12.23packages/dfos-web-relay/package.json
npmzod^4.4.3packages/dfos-web-relay/package.json
Gogithub.com/metalabel/dfos/packages/dfos-protocol-gov0.0.0packages/relay-conformance/go.mod
npm@astrojs/sitemap^3.3.0packages/site-protocol/package.json
npm@metalabel/dfos-protocolworkspace:*packages/site-protocol/package.json
npmastro^5.7.0packages/site-protocol/package.json
npmgithub-slugger^2.0.0packages/site-protocol/package.json
npmmarked^15.0.0packages/site-protocol/package.json
npmshiki^4.2.0packages/site-protocol/package.json
npm@metalabel/dfos-protocolworkspace:*packages/site-schemas/package.json
npmhono^4.12.23packages/site-schemas/package.json
Todas las dependencias no recopilado

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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 5981,
      "has_wiki": false,
      "homepage": "https://protocol.dfos.com",
      "languages": {
        "Go": 1271618,
        "CSS": 53463,
        "HTML": 1314,
        "Rust": 35942,
        "Astro": 33863,
        "Shell": 33893,
        "Swift": 34227,
        "Python": 26670,
        "Makefile": 203,
        "Dockerfile": 1265,
        "JavaScript": 4447,
        "TypeScript": 1468084
      },
      "pushed_at": "2026-07-21T17:44:43Z",
      "created_at": "2026-03-09T17:17:29Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-21T17:45:00Z",
      "description": "Dark Forest OS identity and content protocol, reference implementations, schemas and tests",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript",
        "Go"
      ]
    },
    "owner": {
      "blog": "https://metalabel.com",
      "name": "Metalabel",
      "type": "Organization",
      "login": "metalabel",
      "company": null,
      "location": null,
      "followers": 25,
      "avatar_url": "https://avatars.githubusercontent.com/u/108232828?v=4",
      "created_at": "2022-06-26T16:48:28Z",
      "is_verified": null,
      "public_repos": 8,
      "account_age_days": 1486
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.24.0",
          "kind": "minor",
          "published_at": "2026-07-17T13:22:49Z"
        },
        {
          "tag": "v0.23.0",
          "kind": "minor",
          "published_at": "2026-07-09T17:41:14Z"
        },
        {
          "tag": "v0.22.0",
          "kind": "minor",
          "published_at": "2026-07-08T01:34:51Z"
        },
        {
          "tag": "v0.21.0",
          "kind": "minor",
          "published_at": "2026-07-07T14:17:20Z"
        },
        {
          "tag": "v0.20.0",
          "kind": "minor",
          "published_at": "2026-07-06T22:39:26Z"
        },
        {
          "tag": "v0.19.0",
          "kind": "minor",
          "published_at": "2026-07-05T23:36:59Z"
        },
        {
          "tag": "v0.18.0",
          "kind": "minor",
          "published_at": "2026-07-05T17:21:03Z"
        },
        {
          "tag": "v0.17.0",
          "kind": "minor",
          "published_at": "2026-07-05T00:36:49Z"
        },
        {
          "tag": "v0.16.0",
          "kind": "minor",
          "published_at": "2026-07-03T19:05:38Z"
        },
        {
          "tag": "v0.15.0",
          "kind": "minor",
          "published_at": "2026-07-01T15:51:38Z"
        },
        {
          "tag": "v0.14.4",
          "kind": "patch",
          "published_at": "2026-07-01T00:49:14Z"
        },
        {
          "tag": "v0.14.3",
          "kind": "patch",
          "published_at": "2026-06-30T03:14:35Z"
        },
        {
          "tag": "v0.14.2",
          "kind": "patch",
          "published_at": "2026-06-29T20:25:48Z"
        },
        {
          "tag": "v0.14.1",
          "kind": "patch",
          "published_at": "2026-06-29T19:16:06Z"
        },
        {
          "tag": "v0.14.0",
          "kind": "minor",
          "published_at": "2026-06-29T18:08:41Z"
        },
        {
          "tag": "v0.13.6",
          "kind": "patch",
          "published_at": "2026-06-28T20:14:07Z"
        },
        {
          "tag": "v0.13.5",
          "kind": "patch",
          "published_at": "2026-06-26T17:46:49Z"
        },
        {
          "tag": "v0.13.4",
          "kind": "patch",
          "published_at": "2026-06-26T13:03:38Z"
        },
        {
          "tag": "v0.13.3",
          "kind": "patch",
          "published_at": "2026-06-26T06:44:32Z"
        },
        {
          "tag": "v0.13.2",
          "kind": "patch",
          "published_at": "2026-06-25T22:32:38Z"
        },
        {
          "tag": "v0.13.1",
          "kind": "patch",
          "published_at": "2026-06-25T16:59:36Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-06-24T20:25:31Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-06-23T14:32:34Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-06-20T15:23:33Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-06-16T02:47:44Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-04-15T22:35:36Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2026-04-15T15:22:49Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-04-15T14:09:11Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2026-04-06T11:48:47Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-04-05T00:51:54Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "618e1601e4b66c4e0f144b56363a6f1cb88c1207",
          "body": "## Problem\n\n`collectIndexDirtyAfterOp` maps every `revocation` op to\n`dirty.allPublicContent = true` — recompute every currently-public-read\ncontent row. That superset is correct but O(all public content) per\nrevocation, and a batch of revocations (e.g. a bulk visibility change)\npays it even though \n[…]\n.\n- Go: `packages/dfos-web-relay-go/index_test.go` — full `go test ./...`\ngreen.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(relay): targeted revocation index maintenance (#198)",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-21T17:44:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5fe87761bd1a0179fac01d29baf140c2c0bd3dac",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.24.0",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-17T13:18:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5a3d9ed5dbe1affd35a599bee395e6a6547514a",
          "body": "## What\n\nA chain-scoped **standing public read grant** let *any* caller fetch the\nblob bytes of **any operation in the chain's log**, not just the current\nhead. Operation CIDs are enumerable via the public\n`/proof/v1/content/:id/log` route, so this exposed prior and edited-out\nrevisions — including \n[…]\n137/137, Go relay unit, Go conformance (incl. the\nnew head-only case) all green.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(relay): standing public grants serve head-only blobs (#197)",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-17T13:17:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "64798ab4e830c38dbb9a10ca15122fee5f2caedf",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.23.0",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-09T17:36:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "86bd1e0bb8aa92223908bac7a6d39388370b8615",
          "body": "## Security fix\n\nThe `/index/v0` projections extracted display-name fields (identity\n`profile.name`, content `title`) from relay-held document bytes and\nserved them to anonymous callers without consulting the `publicRead`\nboolean computed right beside them. A relay holding non-public documents\n(an o\n[…]\n so their\ncircuit-breaker assertions isolate what they actually test.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(relay): gate index display-name projections on publicRead (#196)",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-09T17:36:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "84ccc9ef6674e990098f0f0ff5a39bbb5122efd5",
          "body": "…#195)\n\nHotfix for a #194 regression observed on the live explorer: every\nbrowse/home/identity row stuck on \"verifying…\" while detail pages\nverified fine.\n\n## Root cause\n\n#194 bumped the local index `DB_VERSION` 5→6. `openExplorerDb` handled\n`onupgradeneeded`/`onsuccess`/`onerror` but had **no `onbl\n[…]\naude adversarial pass + codex cross-model review; both\nconfirmed findings fixed.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(explorer): local-index open can no longer hang the verify queue (…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-09T01:54:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9800d8523915e76e8fa9a79df5ee6c08946df832",
          "body": "…dardized doc labels, newest-first browse (#194)\n\nUI polish pass across the explorer, four workstreams:\n\n## JsonView on content + op pages\n- New shared `<JsonView>` Preact component (zero new deps):\nsyntax-colored collapsible tree, multiline strings rendered as\nreal-newline indented blocks, `did:dfo\n[…]\n dead helper, negative-cache TTL) addressed in the final two\ncommits.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(explorer): JsonView tree, authorization credential parsing, stan…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-08T23:19:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9596ccd827cb261aa5058c2a72995261f4dfcf1c",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.22.0",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-08T01:30:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f5d50a72e3b67c18d13f7e2901ece8c1e3927c5",
          "body": "…igner= feature probe) (#193)\n\nFollow-up to #192, found by post-merge probe: relays running web-relay <\n0.22.0 (including the current live relay on 0.21.0) silently ignore\n`order=` and `signer=`. The explorer therefore presented lexical rows\nunder \"newest\" labels and — worse — fabricated the Contrib\n[…]\n Codex cross-review: 1 finding (probe/query timeout mismatch), fixed.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(explorer): honest degradation on pre-iteration-2 relays (order=/s…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-08T00:45:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e9164fb78a6a225b332c2d16ecb19aff5322f248",
          "body": "…rowse, honest projections (#192)\n\nWires the explorer to the index v0 iteration 2 surface (#190 spec, #191\nrelays). PR3 of 3.\n\n## What\n\n- **Server-side name search**: identities browse passes `nameContains=`\nthrough to the relay (deleted the now-false \"relay has no name search\"\ncopy).\n- **Actor ledg\n[…]\nr; the capability null→true transition\nexercised without hook errors.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(explorer): index v0 iteration 2 wiring — actor ledger, recency b…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-08T00:26:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cfc617b6954e256404900f717f93cdb6d7b0d639",
          "body": "…=, signer= (TS + Go + conformance) (#191)\n\nImplements the three index capabilities specified in #190 (\"actor,\nclock, name\") across both relay implementations and the conformance\nsuite.\n\n## What\n\n- **Display-name registry row 2 — `post/v1 → title`**: content rows gain\na nullable `title` projected fr\n[…]\nroof/v1/log` untouched;\nrecent-ops module parked per PR1 resolution).\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(relay): implement index v0 iteration 2 — title projection, order…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-07T23:42:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "19ba018b3669c5d266803c08f6ffd295181cc947",
          "body": "Amends the `/index/v0` contract (unfrozen 0.x clock — WEB-RELAY\nterritory only, no PROTOCOL.md touch) with the second iteration of the\nindex surface. Spec-only; TS + Go + conformance implementation follows\nin the next PR, explorer wiring in the one after.\n\n## The fence\n\nThe Structural Seam gains its\n[…]\neiling — relocation candidate into `/search` when that family\nexists.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(spec): index v0 iteration 2 — actor, clock, name (#190)",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-07T18:05:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fd13eb81b8e4ecdf33f5734dfd175c60e4b61188",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.21.0",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-07T14:12:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "975d92255e14d287c557c4ea3190164871c31ab7",
          "body": "…ons (#189)\n\nReleases 0.17–0.20 never rolled the `[Unreleased]` heading, so it\naccumulated four releases' worth of entries. This attributes each entry\nto its actual tag (#165 → 0.17.0, index namespace → 0.18.0/0.19.0,\n#182/#183/#184 → 0.20.0) and stages the 0.21.0 section: the second\n`post/v1` pre-a\n[…]\nredentialRow` re-export fix\n(#186).\n\nDocs-only; staged ahead of cutting v0.21.0.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(changelog): roll accumulated Unreleased into 0.17.0–0.21.0 secti…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-07T14:12:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8ce5bd0a7552fde360022dce124a0240a644c40d",
          "body": "…ow format, add publishedAt (#188)\n\n## Why now\n\nPost chains exist only on shadowed (never-served) chains being wiped and\nre-anchored under this shape — no external observer can hold the old\nform, so this is a free in-place amendment. **The pre-adoption breaking\nwindow closes for good at first public\n[…]\n*73/73** · Python:\n**74/74** · dfos-cli Go: pass · mirror diff: empty\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(spec): post/v1 second pre-adoption amendment — drop topics, narr…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-07T03:06:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "930a5eab65dfe76f2cec6d487b00375dd963c641",
          "body": "…x (#187)\n\n## What\n\nAdds `?nameContains=` to `GET /index/v0/identities` — a\n**case-insensitive substring filter** over the already-projected\n`profile.name`.\n\n- **Amber / non-authoritative** — a discovery hint, re-derivable from\nthe proof plane; never authority.\n- **Dumb & deterministic** — true subs\n[…]\nive, opt-in param) → ships in the next npm release; not auto-live.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(index): add ?nameContains= substring filter on the identity inde…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-07T01:26:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "527d56e6bd4e709fb857cfd6ce706b9759a715cd",
          "body": "`IndexCredentialRow` is defined in `index-routes.ts` alongside its\nsibling index-row types, but was the only one missing from the\npackage-root re-export block in `src/index.ts`. Its siblings —\n`IndexContentRow`, `IndexCountersignatureRow`, `IndexIdentityRow`,\n`IndexProfile` — are all exported, so co\n[…]\nport.\n- `pnpm --filter @metalabel/dfos-web-relay typecheck` clean.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(web-relay): re-export IndexCredentialRow from package root (#186)",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-07T00:14:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "19f994fbbfa87dcd7ee1f328373dc45cd644838d",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.20.0",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-06T22:35:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f796d4c7b11bc8906b9592829b077887bbc0470",
          "body": "…s, Media object, Authorship lattice (#183)\n\nThe final pre-adoption breaking amendment to `post/v1`, made **in\nplace** — deliberately, while zero `post/v1` documents exist on any\nchain. This closes the breaking window: from here `post/v1` evolves\nadditively only, and any further breaking change is a\n[…]\ntaged for review before merge — release (`./scripts/release.sh` →\n0.20.0) after.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "spec(content-model): post/v1 pre-adoption breaking amendment — credit…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-06T21:31:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bcc1b0bf609796e7a16a7b87c35f6fd887f40ad3",
          "body": "…s violation) (#185)\n\n## What\n\nRewires the two credential panels to the new `/index/v0/credentials`\nroute (#2a) so they populate **on a fresh browser with no deep sync** —\nclosing the \"index-always violation\" (the last place the explorer's\nindex-always model broke).\n\n- **`identity.tsx` \"credentials \n[…]\nasync-per-row fold genuinely needs browser\nobservation.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(explorer): index-native credential panels (kills the index-alway…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-06T19:38:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ff908d69fbfb46d76829cc7e17729428b870f3dc",
          "body": "…uer + resource, chain:* union) (#184)\n\n## What\n\nAdds a 4th index route, `GET /index/v0/credentials`, enumerating the\nrelay's held **public** credentials, filterable by `issuer` (exact DID)\nand/or `resource`, keyset-paginated by `cid`. Closes item #2 of the\nrelay-indexer architecture review — the on\n[…]\nfied clean (no verification\nhelpers in the query path).\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(index): /index/v0/credentials — public-credential discovery (iss…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-06T18:37:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a71cbcf653841b1f1dee93082225b84206789e30",
          "body": "## What\n\nAdds a `?documentCID=<cid>` exact-equality filter to `GET\n/index/v0/content`, matching the projected `currentDocumentCID`. This\nvalue was already projected into every content row but wasn't queryable\n— so \"who published document X\", \"editions of this document\", and\ndedup-by-hash were unansw\n[…]\nlaude reviewed the diff +\nran the live dual-relay + parity suites.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(index): documentCID exact-match filter on /index/v0/content (#182)",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-06T18:05:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e3325c64ff3cd74aacc15624c5faf18b241b4b63",
          "body": "… (3-way parity) (#181)\n\n## What\n\nExtends the shared relay conformance suite (`conformance_index_test.go`)\nto lock the `/index/v0` **filter + keyset-pagination + 400** surface\nthat was previously only covered by each implementation's *private* unit\ntests.\n\nBefore this PR, conformance nailed only hap\n[…]\nrun-conformance.sh` (vs Go `dfos\nserve`) → all 11 index tests PASS\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(relay-conformance): lock /index/v0 filters, pagination, and 400s…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-06T17:36:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "aeee77a5e207b04dd6b0359e3f8395d61e6624f1",
          "body": "…ma facet + witness reverse-lookup) (#180)\n\nLights up two already-built relay `/index/v0` capabilities the explorer\nnever consumed. Both **FE-only, pure-consume** (no relay / protocol /\nclient-package change), amber-hint-then-fold, matching the existing\nindex-browse conventions.\n\n## 1 — `$schema` fa\n[…]\nen\non the single-schema corpus. No regressions, no error boundary.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dfos-explorer): consume two latent /index/v0 capabilities ($sche…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-06T12:55:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ccf38c0558be65df29b4e4221b0b93a70e6220a9",
          "body": "… authorization (#179)\n\n## What\n\nArtifacts, countersignatures, and revocations are **standalone signed\nstatements** — they carry no container chain, so the op view dead-ended\nthem at an amber:\n\n> signer authorization unproven standalone — *a key signed this — fold\nthe owning chain to prove authoriza\n[…]\nk.\n\nSingle-file change: `packages/dfos-explorer/src/views/op.tsx`.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dfos-explorer): JIT-fold owning chain to prove standalone signer…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-06T02:33:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8dd219cdd8595e37020fdedf996cc229505f44bc",
          "body": "…ally (#178)\n\n## Summary\n\nThe home **NETWORK** panel flipped binary between a green \"local\nverified index\" and an amber \"relay-asserted — nothing synced\". In the\nnew index-always world you're never in a degraded \"nothing synced\" state\n— you're always browsing the relay index and verifying sparsely a\n[…]\nTest plan\n- typecheck clean · 95 tests · build ok · prettier clean\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dfos-explorer): home hero stats — relay-asserted vs verified-loc…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-06T01:40:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "77bb28f3e1a67594e88a09f533582407d2ce306c",
          "body": "…IFIED (#177)\n\n## Summary\n\nCollapses the light-mode / local-mode phase machine into **one** model:\nwhen a relay advertises `capabilities.index`, browse and home **always**\nenumerate from `/index/v0` (even after a full deep sync — the live index\nis always fresher than a past sync). Every row renders \n[…]\nplorer build` — ok\n- Live browser verification as above\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dfos-explorer): index-always browse + durable real-time ATTR/VER…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-06T01:24:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "66487ef6a4b8ff52b1de8dc2a330aa9a8b7193a1",
          "body": "…(#176)\n\n## Summary\n\nThe relay `/.well-known/dfos-relay` already advertises\n`capabilities.index` (since 0.18), and `client.health()` spreads the raw\nper-relay capability object straight into the relay browser's `Caps`\nchip row. The `index` flag was simply missing from the curated\n`CAP_LABELS` allowl\n[…]\nelays` against live relays, index chip renders\ncorrectly per-relay\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dfos-explorer): surface index capability chip on the relay list …",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-06T00:14:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "67895535fd30b7a20abec76dd7e31c9de164d0d1",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.19.0",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-05T23:32:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "391d7607d3556dbf22287f477d28a27c01178b7b",
          "body": "…(#175)\n\n## Why\n\nThe `/index/v0` query family shipped in #173 recomputes its projection\nfrom the full corpus on every request: the store hands back **every**\nchain, and the routes hydrate each one (content-chain + blob +\nstanding-auth sub-reads per row) before slicing to `limit`. Measured on\na live \n[…]\n15s to\nlow ms (will be validated live on the lark mesh post-release).\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web-relay): materialized O(page) /index/v0 projection (TS + Go) …",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-05T20:27:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "44048a76267eefeba96a528fe504172f92a00009",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.18.0",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-05T17:16:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec6cb1e1bb4b05e8e124c11b016dd3afaa486e78",
          "body": "…rified in view (3/3) (#174)\n\n## Summary\n\nFinal PR of the /index/v0 arc (#172 spec, #173 dual-relay\nimplementation) — the explorer now works instantly against an\nindex-capable relay with **no full chain sync required**, while keeping\nthe full-corpus IndexedDB path as the audit stance.\n\n### `@metalab\n[…]\nser verification as above (Playwright against `dfos serve` from\n#173)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dfos-explorer): index light mode — instant attributed browse, ve…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-05T16:52:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "47c28cd5c7a0442588357bea912cd17a8e194047",
          "body": "## Summary\n\nImplements the **Index (v0)** contract merged in #172 — in **both\nreference relays**, keeping the dual-relay parity harness in lockstep.\n\n### TypeScript relay (`packages/dfos-web-relay`)\n- **Routes** (all 501-gated on `capabilities.index`, cursor paradigm\n`after`/`limit`(100/1000)/`next`\n[…]\n- Conformance index tests skip cleanly against capability-less relays\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web-relay): implement /index/v0 query routes (2/3) (#173)",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-05T16:10:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8f2b2cee6cac2b42db4f4906f2ae0ae1f395d5e2",
          "body": "…(#172)\n\n## Summary\n\n- Adds the **Index (v0)** section to `specs/WEB-RELAY.md`: an optional,\nnon-authoritative, cursor-paginated query surface over the current-state\nprojections the relay already folds — following the same\noptional-capability pattern as the content plane and `/revocations/v1`.\n- **N\n[…]\nve.\n- Contract/conformance tests land with PR 2 alongside the routes.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "spec(web-relay): /index/v0 — non-authoritative query namespace (1/3) …",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-05T15:35:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "34d5f8d2482915e59a7f84cab9b995075a832c10",
          "body": "…nk, IA pass (#170)\n\nLane RS — the subjective homepage-rethink + restyle + IA pass for the\nexplorer (D1, D2, D3-IA, D8 from the 2026-07-04 redesign brief). Builds\non Lane CF (#169). **No auto-merge** — this is a visual/subjective lane\nfor review.\n\n## Scope\n\n### D1 — dark-default theme + toggle\n- `st\n[…]\ne + detail; no JS console errors\n(only pre-existing gated-blob 401s).\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dfos-explorer): dark-default observatory restyle, homepage rethi…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-05T03:53:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "81d384a9bd9f3caebdb13495326082dab5451e25",
          "body": "…d pool) (#171)\n\nPhase 2 (\"resolving public projections\") resolved one content chain at a\ntime, each turn gated on a full network blob fetch — a 9.5k-chain corpus\ntook tens of minutes serially.\n\n## Change\n- `resolvePublicProjections` now runs a **bounded worker pool (8)** over\nthe eligible chains. E\n[…]\n`profileSource`.\n- 73/73 explorer tests pass; scoped typecheck clean.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(dfos-explorer): parallelize public-projection resolution (bounde…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-05T03:49:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b75fc8e480c1d9ab8a99f20d890bb6a571e08163",
          "body": "…idebar fixes (#169)\n\nLane CF — the objective \"clear fixes\" pass over the explorer (decisions\nD5, D6, D4-existing-projections, D7, and the mechanical parts of D3).\nSingle package, additive UI + one data-bug fix. No\nhomepage/restyle/IA-relocation (separate lane).\n\n## Fixes\n\n**1. Credential active/rev\n[…]\nexplorer build` — clean\n- `prettier --check` on touched files — clean\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dfos-explorer): credential status, parsed titles, relay stats, s…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-05T02:07:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8e5ddc32b95e8db93da63e7cfebb18925b6cd7a5",
          "body": "The new openapi version tripwire (#167) caught its first real bug on its\nfirst release: `version:sync` rewrites `openapi.yaml` `info.version`,\nbut `release.sh` staged only the package manifests — v0.17.0 was tagged\nwith openapi.yaml still at 0.16.0, the tripwire failed `test / ci` on\nthe tag run, an\n[…]\nt missed. The v0.17.0 tag will be deleted and re-cut at\nthis commit once merged.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(release): stage openapi.yaml in the release commit (#168)",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-05T00:32:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "582aa3015e3a8d4e094918e44e5006c6ee7daee2",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.17.0",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-05T00:27:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a981c0383c75f67ec2a47b372ea56310c44960cd",
          "body": "…ge (#167)\n\n## What\n\nFollow-through on the docs-sync audit (#166) process-gap finding, plus\nfull Go/TS parity verification of the #165 amendment, via an ultracode\nworkflow (2 Opus auditors, 2 builders — codex authored the guardrails\nlane one-shot).\n\n### Guardrails (openapi.yaml can never silently dr\n[…]\ned (only `info.version` rewrites).\n\nThis is the last gate before the 0.17.0 cut.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(relay): openapi drift guardrails + amendment conformance covera…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-05T00:26:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9ac3f5926ce1281a37482cb95728a5fb747e2fe4",
          "body": "## What\n\nAn ultracode docs-sync audit (11 parallel auditors + adversarial\nverification, 30 agents, 0 refuted findings) checked every prose surface\n— specs, package READMEs, site copy, CLI docs, examples — against the\ncode as it stands after #163 (explorer browse) and #165 (the last\npre-adoption brea\n[…]\nase. Worth folding into\nversion:sync at some point; set to 0.16.0 manually here.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: sync all prose surfaces with the pre-adoption amendment (#166)",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-04T22:15:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "39dcd0cd1b3b67ee29f9326d69c81e8328852f3c",
          "body": "## The last pre-adoption breaking amendment\n\nOne PR, five sequential commits, that closes the window on breaking\nchanges to the reference relay's **non-frozen** surfaces before there\nare any external adopters. The proof plane (`/proof/v1/*`) stays frozen\nwith Protocol v1 throughout; everything here \n[…]\n4, which was cut before #163 landed\nand could not build a merge ref.)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dfos-web-relay): the last pre-adoption breaking amendment (#165)",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-04T21:20:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "045a5882a5c19d265ab872fd93628e2a149b5bbd",
          "body": "…ts (#163)\n\nTwo-phase sync + three browse sections over the explorer's local\nIndexedDB index — enumeration stays sync-local (never a query-for-list\nagainst a relay), per the explorer-relay decision ledger (A1/B/C/D).\n\n## What ships\n- **Phase 2 \"resolve public projections\"** (`sync-projections.ts`) —\n[…]\nangles → verify) run;\nconfirmed findings fixed in the second commit.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dfos-explorer): browse public identities, documents, and artifac…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-04T20:21:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "29a17ff092ba2a7ee267e3378dc678cdcf41367d",
          "body": "…browser (#162)\n\n## What\nRelays on 0.16.0 advertise `capabilities.revocations` (the\n`/revocations/v1` query routes the credential view consults). The\nrelay-browser capability chips hardcoded the original four\n(`proof/content/log/write`), so a 0.16.0 relay's revocation-feed\ncapability was invisible i\n[…]\n; prettier clean.\n- Verified live: relay.dfos.com card renders `revocations ✓`.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dfos-explorer): surface the revocations capability in the relay …",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-03T21:35:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "566cafac3e13587bdf568a56aa5f341c80acfaa0",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.16.0",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-03T19:01:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac18d4f25532f72ebfe580b634c4f04c601bdb7b",
          "body": "Convert the [Unreleased] block to [0.16.0] (2026-07-03) ahead of the release\ncut, add a fresh [Unreleased] placeholder, and repair the footer compare\nlinks. Extends the dfos-explorer bullet to the full in-window PR span\n(#155–#161: sync engine, auto-sync, JIT indexing, verified profiles + relay\nbrow\n[…]\ntorage stats, related-credential surfacing) and clarifies that the\nclient/explorer ride the published protocol + web-relay pair (both private).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(changelog): 0.16.0 release notes",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-03T19:00:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ff9da6595901aa780a218021aa35a1c2f00c8269",
          "body": "## What\n\n`.kv .v` carried `word-break: break-all` — correct for long identifiers,\nbut it also applied to the glossary and \"what this is\" **prose**,\nbreaking words mid-word (\"t he atom\", \"cont ent chains\", \"credential\ns\").\n\n## Fix\n\nSwap to `overflow-wrap: anywhere` + `word-break: normal`: prose wraps\n[…]\nty DIDs/CIDs still wrap with **zero horizontal overflow**\n\nOne-line CSS change.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(dfos-explorer): wrap prose on word boundaries, not mid-word (#161)",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-03T16:14:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "57c3a031cf9cb94ada07843498fcfcec9748be0e",
          "body": "…ge (#160)\n\n## What\n\nThe content chain page now surfaces the **public-read (and any scoped)\ngrants** that name it as a resource — a direct answer to \"what makes\nthis public?\" with a link to the credential.\n\n## How\n\nThe relay has no \"grants for this chain\" endpoint\n(`hasPublicStandingAuth` is interna\n[…]\nlocal index …\nbytes are gated.\"\n\nNothing deployed — local `dfos-explorer` only.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dfos-explorer): show related credentials on the content chain pa…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-03T16:12:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f4572a44e30aca2824f6f0b337a113f1c271d1ec",
          "body": "…159)\n\n## What\n\nTwo fixes prompted by a real \"why only 55 credentials?\" investigation.\n\n### 1. Credential count was a rollup artifact\nCredentials chain under their **issuer DID**, colliding with that\nidentity's chain. The explorer's per-chain rollup keeps one `kind` per\n`chainId` (last-writer-wins),\n[…]\n identity chain). **51 green.**\n\nNothing deployed — local `dfos-explorer` only.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(dfos-explorer): correct credential count + show IndexedDB size (#…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-03T15:59:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "09e81bb2f306d232656f33f9f661d257359ddf4f",
          "body": "## What\n\nRender profiles clearly — and **honestly**. A profile is \"verified\" only\nwhen its carrier proved out; a relay describing itself is a claim until\nits artifact signature checks against its self-certifying DID.\n\n## Changes\n\n- **`lib/profile.ts`** — `decodeRelayProfile` (beat-1 unsafe decode,\nf\n[…]\ns diff before merge.\n\nNothing deployed — local `dfos-explorer` only.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dfos-explorer): verified profile rendering + relay browser (#158)",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-03T14:39:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e05bde542571933ec407690cb92a8d43cb749140",
          "body": "…ntity (#157)\n\n## What\n\nNavigating straight to a chain now **populates the local index\nincrementally** — no full sync required. The detail view has already\nfetched and **verified** the op log via the client, so landing those ops\nin the index is free, and a later full sync skips them (idempotent by\nC\n[…]\nnd keys\" behavior from the\nask.\n\nNothing deployed — local `dfos-explorer` only.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dfos-explorer): JIT index chains on visit + prefetch creator ide…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-03T14:18:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3a012ef19e1202f9b135d630ce8f9cf00f71c7e0",
          "body": "## What\n\nOpt-in periodic **background sync**. Stacked on #155 (base will retarget\nto `main` once #155 merges).\n\nA single 30s heartbeat in the sync store fires a background sync\nwhenever the local index is older than the configured cadence — setting\nchanges, load-time staleness, and post-run reschedu\n[…]\nnav-resilient store from #155).\n\nNothing deployed — local `dfos-explorer` only.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dfos-explorer): auto-sync setting + background scheduler (#156)",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-03T14:11:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e371fe9fd12b27850529d8c829e4fcd190aeda37",
          "body": "… (#155)\n\n## What\n\nLifts sync from the `LocalIndex` component into a **module singleton**\n(`lib/sync-store.ts`), observable like `relays.ts`. This is the\nfoundation for the requested homepage/auto-sync improvements: one sync\nruns at a time, progress broadcasts to every subscriber, and the run\n**surv\n[…]\nNothing deployed — local `dfos-explorer` only. Foundation for auto-sync\n(next).\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dfos-explorer): global nav-resilient sync engine + live progress…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-03T14:08:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "16d8d3c990a0ee8f205f31c1eb2716d1ef4bc8e9",
          "body": "…ng (chain/id binding) (#154)\n\nTwo related changes on the dfos-client/explorer surface, both driven by\nthe explorer being the client's first real consumer.\n\n## 1. Global-log read ergonomics\n- **`PeerLogEntry` / `LogOp` gain optional `kind` + `chainId`** — the\nglobal `/log` always served them; the ty\n[…]\ntly since it\ntouches the verification path. Worth a glance in the AM.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dfos-client): global-log ergonomics + adversarial-review hardeni…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-03T04:40:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2ba230183ed5e00352ceac70f6ccad70cf23ab40",
          "body": "…sh (#153)\n\n## What (PR 5 of tonight's explorer series)\n\n- **Mobile index drawer** — below 900px the local index becomes a\nslide-in drawer toggled from the header (☰ index), with an in-drawer\nclose affordance; navigating from an index row auto-closes it\n- **Stacked kv grids** below 480px (caps-label\n[…]\npens/closes/auto-dismisses on\nnavigation, sync + filters usable from the drawer.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dfos-explorer): mobile UX — index drawer, stacked kv grids, poli…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-03T04:09:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8097fb75a5e78997d0948b0bcc93a2bfb7672587",
          "body": "…ering (#152)\n\n## What (PR 4 of tonight's explorer series)\n\nThe wave-1 protocol features, now visible:\n\n- **Index state panel** — detects \\`index/v1\\` chains and runs the\n**canonical fold in the tab**: every op's committed document fetched by\nref (\\`/content/{id}/blob/{opCID}\\`), integrity-checked (\n[…]\netection\n(never folds + gap), null docs, media parse, rawCidOf shape/determinism\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dfos-explorer): index/v1 canonical fold view + Media object rend…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-03T04:06:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "872eb171eaf07ac17468a77b8f4e1d4bb5f5f944",
          "body": "…quorum + provenance panel (#151)\n\n## What (PR 3 of tonight's explorer series)\n\n- **Credential view** — full verification ladder via\n\\`client.credential\\` (signature, CID integrity, issuer resolution,\nrevocation checker), root-authority check (single \\`chain:<id>\\` grant →\nissuer must own the chain,\n[…]\n live\nfeeds at the next platform deploy — the explorer is already wired for\nit).\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dfos-explorer): credential view — delegation, revocation feeds, …",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-03T03:55:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2f4c0a80176747e77a4c0befbea186c3f4e7918e",
          "body": "…in-tab verification (#150)\n\n## What (PR 2 of tonight's explorer series, stacks on #149)\n\nThe two-beat spine, now real: render the relay's **claim** instantly\n(marked relay-asserted), then \\`dfos-client\\` re-folds the whole chain\nin the tab and every section flips to **verified** — or drifts loudly.\n[…]\nal index, annotated payload,\nhonest empty countersig state\n- zero console errors\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dfos-explorer): chain detail views — identity, content, op with …",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-03T03:52:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eb9fcbf0aae8d4da8e7870d72f68d799a421b1de",
          "body": "…cal IndexedDB index (#149)\n\n## What\n\nNew **private** package \\`@metalabel/dfos-explorer\\` — the proper app\nbuilt from the single-file relay-explorer spike\n(\\`notes.local/prototypes/dfos-relay-explorer.html\\`), and the first\nfull consumer of \\`@metalabel/dfos-client\\`. Vite + Preact, client-side\nonl\n[…]\nl), revocations, provenance\npanel, and index/v1 fold views land in the next PRs.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dfos-explorer): client-side chain explorer — scaffold, shell, lo…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-03T03:37:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "259344fdcc4ed3b8b5c8ce3d58847609be839ad4",
          "body": "…ys (#147)\n\n## What\n\nScaffolds `packages/dfos-client` — the missing high-level TS read\nclient. The protocol library owns the crypto truth (CID re-derivation,\nsignature verification, chain folding); this package owns the four\nthings it deliberately refuses to do: **fetch, resolve,\nverify-orchestratio\n[…]\nbuild` / `typecheck` / `test` / `lint` all green locally\n(repo-wide).\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dfos-client): v1 read + verify orchestration over untrusted rela…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-03T01:36:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "71d9844c9933d0a1f6f49e61e6de8fb4d3ab112e",
          "body": "## Summary\n\nDefines the canonical **Media object** shape in the content model and\nlands its first consumer: an OPTIONAL, strictly **additive** `avatar`\nfield on `profile/v1` (deliberately not a `profile/v2` — existing\navatar-less documents remain valid, verified by tests).\n\n## Media object (`{ uri, \n[…]\ncol + 163 relay),\n`pnpm lint`, `pnpm lint:specs` — all green locally.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(protocol): Media object + profile/v1 additive avatar (#148)",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-03T01:29:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "728df915c50703f2f497a296f4bb044672699a40",
          "body": "## Summary\n\nIntroduces the **canonical fold** — a deterministic total order over\n**all** operations in a content chain's log (every branch, not just the\nselected-head branch) — and the first schema built on it, **`index/v1`**\n(an LWW-Map).\n\nThe linearization is the web relay's deterministic head-sel\n[…]\n `pnpm lint`, `pnpm\nlint:specs` — all green locally (442 tests pass).\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(protocol): index/v1 spec + canonical fold (#146)",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-03T00:50:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9e4bbda8ac992affbc3691f6b595290ff1192388",
          "body": "…inks (#145)\n\nThe 0.15.0 release (#141 universal resolver) was never documented in the\nchangelog and the `[Unreleased]` compare link still pointed at\n`v0.14.4...HEAD`. Backfills a `[0.15.0]` section in house voice and\nrepairs the footer links (`[Unreleased]` → `v0.15.0...HEAD`, adds\n`[0.15.0]`). Docs only.\n\nSurfaced by the #144 tidy pass; staged ahead of the next release cut.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(changelog): backfill 0.15.0 (universal resolver) + fix compare l…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-02T03:27:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1cac8ecac4a0b7468d18cf252da949f54fb85130",
          "body": "…capability cleanup (#144)\n\nPost-0.15.0 housekeeping. Three small, additive tidies atop\n`origin/main` (which already carries #142 and #143).\n\n## Items\n\n1. **Changelog** — stage the merged #142 (documentation drift pass) and\n#143 (relay revocation-status query routes) under `[Unreleased]` in\n`@metala\n[…]\nations` in TS and Go,\nso the OpenAPI `required` addition is accurate.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: post-0.15.0 tidy — changelog, parity-script timeouts, openapi …",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-02T03:23:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e00b21b4db0579501fae7fab5b24326ee161b5fe",
          "body": "… twin) (#143)\n\nAdds a revocation-status query route family (`/revocations/v1`) to the\nweb relay, implemented in both the TypeScript relay and the Go twin,\nwith conformance and dual-relay parity coverage.\n\n## Design\n\n- **Own-clock additive route family.** `/revocations/v1` is versioned\nindependently\n[…]\n- `./scripts/run-parity.sh` — all revocation-status parity cases pass\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(relay): revocation-status query routes (/revocations/v1, TS + Go…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-02T02:37:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c15b454e642463d4384e0c0590357c3b3631e4fe",
          "body": "Post-0.15.0 documentation drift pass. Every change was verified against\nthe reference relay (`packages/dfos-web-relay/src/relay.ts`) before\nbeing applied. No normative spec semantics were altered.\n\n## OpenAPI (`packages/dfos-web-relay/openapi.yaml`)\n- Removed the stale `documents` capability flag fr\n[…]\nesolver at `GET /1.0/identifiers/:did`\nas a convenience layer, not a dependency.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: prose drift pass post-0.15.0 (#142)",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-02T02:06:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "332af69dfdb92f9ae502e88cf7db992f18fb4d48",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.15.0",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-01T15:47:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b839382055e53384bb9368c4f4135c50b121e795",
          "body": "…sted) (#141)\n\n## Summary\n\nAdds a **universal DID resolver** endpoint to\n`@metalabel/dfos-web-relay`:\n\n- **`GET /1.0/identifiers/:did`** — mounts at the relay ROOT on its own\n`1.0` clock (off the frozen `/proof/v1` proof-plane base path),\npublic/unauthenticated. This is the [DIF Universal\nResolver](\n[…]\ng\nthe §4.5 doc-gateway example, vs. drop-unrecognized).\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web-relay): universal did:dfos resolver (TS + Go twin, parity-te…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-01T15:45:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cb0876b833d6d640ffb0d2290de4487dc90f0009",
          "body": "… (#140)\n\nRenames every reference to the **clear.txt** discussion space to just\n**DFOS**, and repoints its link from `https://clear.dfos.com` →\n`https://nce.dfos.com`.\n\n**Scope** — 13 replacements across 12 files: the 8 specs (status/footer\n\"Discuss\" lines), root `README.md`, `packages/dfos-cli/CLI.\n[…]\nept verbatim. Happy to relabel\nit \"DFOS space\" there if preferred.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: rename clear.txt discussion space to \"DFOS\" (link nce.dfos.com)…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-01T02:01:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "afcfed3d7384db574a6c16b77a0cb3047425edf2",
          "body": "…gelog backfill (#139)\n\nFull audit of all human-facing content in this public repo — 9 specs, 16\nsite pages, CLI docs, the 3 SKILL.md files, and every README — driven by\na multi-reviewer sweep (leak hygiene, accuracy-vs-implementation,\nterminology, versions, working examples). **The repo was already\n[…]\nreal \"Getting started\" stanza (currently\npointer-only).\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: public-repo prose audit — leak fix, accuracy, consistency, chan…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-01T01:48:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "308bca7d9350884d9e7fd629a20b28c1bd3a8367",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.14.4",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-01T00:44:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cca0766f9325faa20a11f8efa39a18b62a50fc90",
          "body": "… lock (#138)\n\n## Problem\n\nConcurrent `dfos` processes race on shared local state — surfaced by\nstress-testing parallel `identity create` (the agent-driven batch\nworkflow `dfos skill` is built for):\n\n- **config.toml clobber (silent data loss):** every mutating command\ndoes `load → modify → save` wit\n[…]\n.\n- Full CLI module `go test ./...` green; `gofmt`/`go vet` clean.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): serialize concurrent invocations with a cross-process state…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-07-01T00:44:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "63760bd83621679dc4b8177adf935ae2d9544595",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.14.3",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-30T03:10:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b08ef1c7938d178fdae8da0a51165102d95e51a4",
          "body": "…ntropy re-pull) (#137)\n\n## The chatter\n\n`ReadLog` returned a pagination cursor **only when a page was full**\n(`len == limit`). The final partial page returned an empty cursor →\nnull, so a caught-up puller never advanced past it: every sync cycle it\nresumed from the prior checkpoint and **re-fetched\n[…]\nboth\nbackends. Full relay-go suite green under `-race`.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(relay): return a resume cursor on the final log page (kill anti-e…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-30T03:10:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c01aca495debb3cd411c871d4faaba6c6cf02d98",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.14.2",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-29T20:21:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11aeb3081872891fe05a6858de88b7d7adc19062",
          "body": "…h propagation) (#136)\n\n## The bug (surfaced by meshing the lark fleet)\n\nFollow-up to #134. In a peer mesh, a write to one relay reached the\nothers' **proof plane** (chain + grant gossiped fine) but its **bytes\nnever materialized** until the slow reconcile backstop (~minutes). So a\nwrite to atx took\n[…]\nFollowDirty` pins gap #1. Full relay-go\nsuite green under `-race`.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(relay): materialize gossip-pushed + directly-written content (mes…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-29T20:21:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8ff4b3a5b16d77b27829546355c8b09906320154",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.14.1",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-29T19:11:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "152291a9103cd8a316c0082cf6ab61e416b0882b",
          "body": "…t never sent) (#135)\n\n## The bug\n\n`dfos credential grant` minted a credential, printed it, and returned —\nit **never ingested it locally or pushed it to a peer**, and the global\n`--peer` flag was silently ignored. For a **public standing grant**\n(`aud: \"*\"`) that's inert: the grant only authorizes \n[…]\nthe content's `blob/head` flips **401 → 200**\nwith no manual POST.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): publish the credential on `credential grant` (was minted bu…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-29T19:10:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8d56b920c1c161cc8004625fac5a015f7ac97a40",
          "body": "…tate CPU peg (#134)\n\n## The bug\n\nAn eager content follower (`CONTENT_FOLLOW=eager`, shipped in 0.14.0)\nre-scanned **every** content chain and re-verified **every** public-read\ngrant's Ed25519 signature on **every sync tick** — a 5s timer sweep\n*plus* a trigger-kick on any sequenced op. On a small n\n[…]\nuting, GC gated on dirty. Full relay-go suite\ngreen under `-race`.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(relay): event-driven content materialization — kill the steady-s…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-29T19:09:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0bcc2e57ac28028551c9dd08f4b8eed997a4ec8a",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.14.0",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-29T18:04:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0777d7d6d7d0530e85ce9ba382acf09c0a196e1c",
          "body": "…tion (#133)\n\n## What\n\nPhase 3 of the content-plane arc: lock the follower behavior with a\n**real-wire conformance test** and write the **spec** down so `main`\nmatches the code. No release here — 0.14.0 is the next step.\n\n## Conformance test (Go, in-package, race-tested)\n`http_following_test.go` — t\n[…]\no `CONTENT_FOLLOW=eager` — both deploy-class, on Brandon's signal.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(relay): real-HTTP content-following conformance + spec formaliza…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-29T17:44:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c1a86965ab6f63ec1ba0f458f1a922d2911ca6c1",
          "body": "… (#132)\n\n## What\n\nProduction-hardens the eager content materializer (#131) along the three\naxes that matter before the larks run it for real: **latency**, **fetch\nrobustness**, and **storage reclamation**. The convergent sweep stays\nthe correctness backbone; this makes it fast, kind to a dead origi\n[…]\ndential resource-index for `hasPublicStandingAuth` at posts scale.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(relay): harden content following — triggers, circuit breaker, GC…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-29T17:34:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c98bdfe53029d14578e182da62db479827eadca3",
          "body": "…T_FOLLOW) (#131)\n\n## What\n\nAdds the **content-plane transport** that's been missing from\nfederation: a follower relay that **pulls the document bytes it's\ngranted to read**, content-addressed and grant-gated.\n\nToday the operation log federates the **authz plane** (identity chains,\ncontent chains, p\n[…]\nse-2 low-latency triggers + GC-on-revoke also deferred.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(relay): eager content-byte materialization for followers (CONTEN…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-29T00:46:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d6f5ef3677a9b408a8226925c9d6d13b8eb8c735",
          "body": "… front page (#130)\n\n## Why\n\nThe protocol site's meta flow had rotted: the nav felt sprawly and the\nfront-page content architecture had drifted. Concretely:\n\n- **Four** hand-maintained, mutually-divergent nav lists (Base header 10\n· hero 11 · closing-nav 14 · footer 17) that no longer agreed on\nmemb\n[…]\nnd-authored (its per-link\ndescriptions are content, not nav data).\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(site): unify nav into one source; trim header sprawl; de-dup…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-29T00:36:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c7501d82389cde0a0ddb5c5e80ad7904543cb921",
          "body": "…oke (#129)\n\nFixes from a cold-start usability test of `protocol.dfos.com/skill` (a\nfresh agent with no DFOS context drove the whole CLI from the page\nalone). Verdict was \"mostly clean\"; two real issues:\n\n### 1. `credential revoke` was unreachable from documented output\n`credential revoke <credentia\n[…]\n-to-end grant→revoke in a\nsandbox; `pnpm lint` clean; site builds.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli,skill): surface credentialCID on grant; correct skill log/rev…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-28T20:54:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dc10a4f372e50281b473ef2acfe913937b8a4db9",
          "body": "Two small site changes:\n\n1. **Discoverability** — add **Skill** to the top nav (`Base.astro` +\n`index.astro`), between Deploy and FAQ. It was previously only in the\nfooter + home card.\n2. **De-brand** — rename the home-page card and the `/skill` page title\nfrom \"Claude Code Skill\" to **\"Agent Skill\"\n[…]\nllms.txt` entry\nupdated to match.\n\nSite builds; `pnpm lint` clean.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(site): surface skill in nav, generalize to \"Agent Skill\" (#128)",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-28T20:33:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3cd15256d47c98f90bcca4920241010be3f09f2c",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.13.6",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-28T20:09:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "561d027e828d1e5642511db8b7579b05ce385263",
          "body": "… (#127)\n\n## The bug\n\n`deploy.yml` runs `pnpm --filter X run deploy -- --branch <b>`, which\nresolves to:\n\n```\nwrangler pages deploy dist -- --branch main\n```\n\nWrangler reads the stray `--` as end-of-options and **ignores\n`--branch`**. It then\nauto-detects the branch from the detached-HEAD CI checkou\n[…]\nalidate`),\nbut worth wiring separately for instant edge freshness.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): wrangler dropped --branch — deploys never reached production…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-28T19:45:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3bf54668cda4c409508ce7fde7f52c5f9cd760c1",
          "body": "## Summary\n\nVerified clear-wins from a **fan-out ground-truth ergonomics audit** —\nagents drove the real `dfos` binary against prod (read-only) and scratch\nconfigs, surfaced friction, and each finding was adversarially verified\nas a *clear win* (taste calls and product decisions parked). 16 changes\n\n[…]\nig `defaults:{}`) — **all 4 fixed in\nthis branch and re-verified**\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): ground-truth ergonomics audit wins (16 changes) (#126)",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-28T19:26:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "753e95360becde2b7118718fa88c87f2fb265164",
          "body": "## What\n\nConsolidates the Claude Code skill into **one canonical source** —\n`skills/dfos/SKILL.md` — and wires it into every major skill-ingress\nchannel, all\nfed from that single file.\n\nThe old `specs/CLAUDE-SKILL.md` was a 435-line monolith that (a) leaked\nprivate\ndev-env tooling in its \"three simi\n[…]\nuthor→adversarial-review pass;\nrebased on\n  current `main` (#124).\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(skill): single DFOS skill, all major install channels (#125)",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-28T16:16:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5df0fcc06cb478aba1286afd110f2b302a1b0357",
          "body": "…ics (#124)\n\n## Summary\n\nDeferred CLI ergonomics follow-ups from the Go CLI audit\n(`notes.local/2026-06-28-cli-ergo-followups.md`). All CLI/HTTP-only — no\nwire, protocol, or DID-derivation changes.\n\n- **`operation show <cid>`** (alias `op`) — new command. Inspect a\nsingle operation by CID: local sto\n[…]\n `--peer` reads) was fixed to local-first fallback\nbefore this PR.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): operation show, --peer-aware reads, quieter relay, ergonom…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-28T15:53:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b07dd82f016eaf76ea3022215fa169ed858538d7",
          "body": "…gs) (#123)\n\n## Summary\n\nCLI ergonomics pass from a hands-on shakedown against the prod relay\n(`relay.dfos.com`).\n\n**Extension**\n- Add **`dfos identity log <name|did>`** — view an identity's operation\nhistory (genesis, updates, key rotations). The relay already serves\n`/proof/v1/identities/{did}/log\n[…]\n-DID error is\nsingle-mention; `content remove --help` is truthful.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): add `identity log`; ergonomics fixes (help, --json, warnin…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-27T20:07:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2a1af72873bd01fdb8aa21cc3a57388de288db81",
          "body": "…al-width DIDs (#122)\n\n## Summary\n\nThere was **no DID-format validation anywhere** in the codebase — DIDs\nwere *derived* (always the canonical 31-char width) but never *checked*\non the way in from peer sync or external operations. Consequence: a\nrelay running a stale / half-migrated derivation can s\n[…]\ngainst the\nconformant TS reference relay, including the new tests.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(protocol): validate did:dfos well-formedness; reject non-canonic…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-27T19:59:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "87ba913d24071ea327a7cbf4ad67e61580ba6d86",
          "body": "…field (#121)\n\n## Summary\n\n- `dfos identity fetch` and `dfos content fetch` were silently ingesting\n**0 operations**. They read a `log` field off `GET\n/proof/v1/identities/{did}` (and `/content/{id}`), but those endpoints\nreturn *resolved state* with no `log` field. Result: fetch appeared to\nsucceed\n[…]\nund\").\n  - The resolved `state.did` is the correct full-width DID.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): fetch op chain from /log endpoint, not a nonexistent \"log\" …",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-27T19:58:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "16dac7626c268f90a74084996d4da6c12f86348c",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.13.5",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-26T17:42:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b35e3e5f198125a12a31eb4d33270ba7372d762d",
          "body": "…crubber (#120)\n\n## Summary\n\nThe lark mirrors (OSS Go relay) pulling from `relay.dfos.com` all froze\nat **exactly 29,606 ops** with zero pull errors. Root cause, in two\nlayers:\n\n### Primary — bare-CID cursor fabrication (the cure)\n`relay.dfos.com` pages an opaque `createdAt|cid` cursor, returns a\n**\n[…]\n9,606 climbed to current (29,673) within one scrub lap.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(relay): cure bare-CID cursor fabrication + bounded anti-entropy s…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-26T17:42:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f14ead945b0a063fe5ad117b50ceaf8b190117b7",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.13.4",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-26T12:57:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c329639c300a44dfea1d42655dd2da1920e64104",
          "body": "… (#119)\n\n## Summary\n\n- Expose the `raw_ops` sequencing backlog as `stats.pendingOps` on\n`/.well-known/dfos-relay`, turning the otherwise-invisible\nsequencer-wedge failure mode into a single `curl` (no on-box `sqlite3`\nneeded).\n- Nested under a `stats` object so the protocol contract\n(`did`/`capabil\n[…]\nonformance shards validate the public well-known shape.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(relay): expose raw_ops backlog as stats.pendingOps in well-known…",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-26T12:56:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dd255484d00c2ab0b0646471e623a97bb5bdcd0c",
          "body": "…#117) (#118)\n\n## Summary\n\nCompletes #117. That fix changed the raw_ops drain **key** to the\nrecomputed storage CID, but both drain loops still **gated** on `if\nres.CID == \"\" { continue }`.\n\n`res.CID` is the JWS-header-claimed CID, which is **empty** for a\ndecodable-but-malformed credential — `inges\n[…]\nit of the #117 fix. Ships alongside #116/#117 in the next\nrelease.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(relay): gate raw_ops drain on storage CID, not res.CID (complete …",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-26T07:35:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c26fb84ba18c35a9d2d65d11b8e62afe97ba0149",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.13.3",
          "author_name": "Brandon",
          "author_login": "bvalosek",
          "committed_at": "2026-06-26T06:39:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 30,
      "commits_last_year": 262,
      "latest_release_at": "2026-07-17T13:22:49Z",
      "latest_release_tag": "v0.24.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 14,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 1.8
    },
    "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": [
        {
          "name": "github.com/metalabel/dfos",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/metalabel/dfos",
          "is_deprecated": false,
          "latest_version": "v0.24.0",
          "repository_url": "https://github.com/metalabel/dfos",
          "versions_count": 38,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-17T13:18:16Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        },
        {
          "name": "@metalabel/dfos-protocol",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "dfos",
            "protocol",
            "ed25519",
            "jws",
            "did",
            "verifiable",
            "identity",
            "content-addressing",
            "dag-cbor",
            "cid",
            "metalabel"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@metalabel/dfos-protocol",
          "is_deprecated": false,
          "latest_version": "0.24.0",
          "repository_url": "https://github.com/metalabel/dfos",
          "versions_count": 40,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 2,
          "monthly_downloads": 5012,
          "first_published_at": "2026-03-12T10:42:11.702000Z",
          "latest_published_at": "2026-07-17T13:20:46.564000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        },
        {
          "name": "@metalabel/dfos-web-relay",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "dfos",
            "relay",
            "web-relay",
            "hono",
            "ed25519",
            "jws",
            "did",
            "verifiable",
            "identity",
            "content-addressing",
            "metalabel"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@metalabel/dfos-web-relay",
          "is_deprecated": false,
          "latest_version": "0.24.0",
          "repository_url": "https://github.com/metalabel/dfos",
          "versions_count": 36,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 2,
          "monthly_downloads": 4794,
          "first_published_at": "2026-03-22T23:29:13.323000Z",
          "latest_published_at": "2026-07-17T13:20:53.209000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 2,
      "stars": 28,
      "watchers": 1,
      "fork_history": {
        "days": [
          {
            "date": "2026-04-29",
            "count": 1
          },
          {
            "date": "2026-07-19",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 2,
        "total_forks": 2
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "packages/dfos-cli/Makefile"
      ],
      "api_schema_files": [
        "packages/dfos-web-relay/openapi.yaml"
      ],
      "has_devcontainer": false,
      "typecheck_configs": [
        "packages/dfos-client/tsconfig.json",
        "packages/dfos-explorer/tsconfig.json",
        "packages/dfos-protocol/tsconfig.json",
        "packages/dfos-web-relay/tsconfig.json",
        "packages/site-protocol/tsconfig.json",
        "packages/site-schemas/tsconfig.json"
      ],
      "toolchain_manifests": [
        "packages/dfos-cli/go.mod",
        "packages/dfos-protocol-go/go.mod",
        "packages/dfos-web-relay-go/go.mod",
        "packages/protocol-verify/go/go.mod",
        "packages/protocol-verify/rust/Cargo.toml",
        "packages/relay-conformance/go.mod"
      ],
      "largest_source_bytes": 156997,
      "source_files_sampled": 302,
      "oversized_source_files": 2,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "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": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "github.com/mattn/go-isatty",
          "manifest": "packages/dfos-cli/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.22"
        },
        {
          "name": "github.com/metalabel/dfos/packages/dfos-protocol-go",
          "manifest": "packages/dfos-cli/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0"
        },
        {
          "name": "github.com/metalabel/dfos/packages/dfos-web-relay-go",
          "manifest": "packages/dfos-cli/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0"
        },
        {
          "name": "github.com/pelletier/go-toml/v2",
          "manifest": "packages/dfos-cli/go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.3.1"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "packages/dfos-cli/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.2"
        },
        {
          "name": "github.com/zalando/go-keyring",
          "manifest": "packages/dfos-cli/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.2.8"
        },
        {
          "name": "golang.org/x/sys",
          "manifest": "packages/dfos-cli/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.46.0"
        },
        {
          "name": "@metalabel/dfos-client",
          "manifest": "packages/dfos-explorer/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@metalabel/dfos-protocol",
          "manifest": "packages/dfos-explorer/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@metalabel/dfos-web-relay",
          "manifest": "packages/dfos-explorer/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "multiformats",
          "manifest": "packages/dfos-explorer/package.json",
          "ecosystem": "npm",
          "version_constraint": "^14.0.0"
        },
        {
          "name": "preact",
          "manifest": "packages/dfos-explorer/package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.28.2"
        },
        {
          "name": "github.com/fxamacker/cbor/v2",
          "manifest": "packages/dfos-protocol-go/go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.9.2"
        },
        {
          "name": "github.com/mr-tron/base58",
          "manifest": "packages/dfos-protocol-go/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.0"
        },
        {
          "name": "@ipld/dag-cbor",
          "manifest": "packages/dfos-protocol/package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.0.1"
        },
        {
          "name": "@noble/curves",
          "manifest": "packages/dfos-protocol/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.2.0"
        },
        {
          "name": "@noble/hashes",
          "manifest": "packages/dfos-protocol/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.2.0"
        },
        {
          "name": "multiformats",
          "manifest": "packages/dfos-protocol/package.json",
          "ecosystem": "npm",
          "version_constraint": "^14.0.0"
        },
        {
          "name": "zod",
          "manifest": "packages/dfos-protocol/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.4.3"
        },
        {
          "name": "github.com/metalabel/dfos/packages/dfos-protocol-go",
          "manifest": "packages/dfos-web-relay-go/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0"
        },
        {
          "name": "modernc.org/sqlite",
          "manifest": "packages/dfos-web-relay-go/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.52.0"
        },
        {
          "name": "hono",
          "manifest": "packages/dfos-web-relay/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.12.23"
        },
        {
          "name": "zod",
          "manifest": "packages/dfos-web-relay/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.4.3"
        },
        {
          "name": "github.com/metalabel/dfos/packages/dfos-protocol-go",
          "manifest": "packages/relay-conformance/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0"
        },
        {
          "name": "@astrojs/sitemap",
          "manifest": "packages/site-protocol/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.3.0"
        },
        {
          "name": "@metalabel/dfos-protocol",
          "manifest": "packages/site-protocol/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "astro",
          "manifest": "packages/site-protocol/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.7.0"
        },
        {
          "name": "github-slugger",
          "manifest": "packages/site-protocol/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.0.0"
        },
        {
          "name": "marked",
          "manifest": "packages/site-protocol/package.json",
          "ecosystem": "npm",
          "version_constraint": "^15.0.0"
        },
        {
          "name": "shiki",
          "manifest": "packages/site-protocol/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.2.0"
        },
        {
          "name": "@metalabel/dfos-protocol",
          "manifest": "packages/site-schemas/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "hono",
          "manifest": "packages/site-schemas/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.12.23"
        }
      ],
      "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": 194,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 4
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "bvalosek",
          "commits": 262,
          "avatar_url": "https://avatars.githubusercontent.com/u/644088?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "deploy.yml",
        "release.yml",
        "test-matrix.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "Cargo.lock",
        "go.sum",
        "package-lock.json",
        "pnpm-lock.yaml"
      ],
      "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": 1,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "24 out of 24 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 3 contributing companies or organizations -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 0,
            "reason": "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 0 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": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 10,
            "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": "58 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "618e1601e4b66c4e0f144b56363a6f1cb88c1207",
        "ran_at": "2026-07-22T15:04:47Z",
        "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-21T17:47:02Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-21T17:44:41Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/metalabel/dfos",
    "host": "github.com",
    "name": "dfos",
    "owner": "metalabel"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 57,
      "inputs": {
        "security": 32,
        "vitality": 80,
        "community": 43,
        "governance": 57,
        "engineering": 63
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 80,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 74,
            "inputs": {
              "commits_last_year": 262,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 14
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "14/52 weeks with commits",
                "points": 9.7,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 14
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "262 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 262
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 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": 30,
              "latest_release_tag": "v0.24.0",
              "releases_from_tags": false,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 1.8
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "30 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 30
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~1.8 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1.8
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "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": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 43,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 23,
            "inputs": {
              "forks": 2,
              "stars": 28,
              "watchers": 1,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "28 stars",
                "points": 23.2,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 28
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "2 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "1 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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 (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 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
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 66,
            "inputs": {
              "packages": [
                "github.com/metalabel/dfos",
                "@metalabel/dfos-protocol",
                "@metalabel/dfos-web-relay"
              ],
              "dependents": null,
              "ecosystems": "go, npm",
              "total_downloads": null,
              "monthly_downloads": 9806
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "9,806 downloads/month across go, npm",
                "points": 53.2,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 9806,
                      "ecosystems": "go, npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 57,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 70,
            "inputs": {
              "merged_prs": 194,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 4
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "194/198 decided PRs merged",
                "points": 37.5,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 194,
                      "decided": 198
                    }
                  }
                ],
                "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": 55,
            "inputs": {
              "followers": 25,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "metalabel",
              "public_repos": 8,
              "account_age_days": 1486
            },
            "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": "25 followers of metalabel",
                "points": 10.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 25,
                      "login": "metalabel"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "8 public repos, account ~4 yr old",
                "points": 15.1,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 8
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 4
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/metalabel/dfos",
                "@metalabel/dfos-protocol",
                "@metalabel/dfos-web-relay"
              ],
              "ecosystems": "go, npm",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "3 package(s) on go, npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 3,
                      "ecosystems": "go, npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "40 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 40
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 63,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "4 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "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": "24 out of 24 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": "https://protocol.dfos.com",
              "has_readme": true,
              "has_docs_dir": false,
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://protocol.dfos.com",
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 32,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 32,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "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 is not maximal on development and all release branches",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "24 out of 24 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "dangerous workflow patterns detected",
                "points": 0,
                "status": "missed",
                "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 0 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 detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 5,
                "status": "met",
                "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": "58 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 1
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 67,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "Cargo.lock",
                "go.sum",
                "package-lock.json",
                "pnpm-lock.yaml"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "packages/dfos-cli/Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "packages/dfos-client/tsconfig.json",
                "packages/dfos-explorer/tsconfig.json",
                "packages/dfos-protocol/tsconfig.json",
                "packages/dfos-web-relay/tsconfig.json",
                "packages/site-protocol/tsconfig.json",
                "packages/site-schemas/tsconfig.json"
              ],
              "agent_commit_share": 0.81,
              "toolchain_manifests": [
                "packages/dfos-cli/go.mod",
                "packages/dfos-protocol-go/go.mod",
                "packages/dfos-web-relay-go/go.mod",
                "packages/protocol-verify/go/go.mod",
                "packages/protocol-verify/rust/Cargo.toml",
                "packages/relay-conformance/go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "packages/dfos-cli/Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "packages/dfos-cli/Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "packages/dfos-client/tsconfig.json, packages/dfos-explorer/tsconfig.json, packages/dfos-protocol/tsconfig.json, packages/dfos-web-relay/tsconfig.json, packages/site-protocol/tsconfig.json, packages/site-schemas/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "packages/dfos-client/tsconfig.json, packages/dfos-explorer/tsconfig.json, packages/dfos-protocol/tsconfig.json, packages/dfos-web-relay/tsconfig.json, packages/site-protocol/tsconfig.json, packages/site-schemas/tsconfig.json"
                    }
                  }
                ],
                "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": "81 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 81,
                      "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": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 156997,
              "source_files_sampled": 302,
              "oversized_source_files": 2
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "2/302 source files over 60KB",
                "points": 54.6,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 302,
                      "oversized": 2
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "good",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 80,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": [
                "packages/dfos-web-relay/openapi.yaml"
              ]
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": "packages/dfos-web-relay/openapi.yaml",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "packages/dfos-web-relay/openapi.yaml"
                    }
                  }
                ],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? 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",
    "Could not fetch npm package '@metalabel/dfos' from its registry",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index npm:@metalabel/dfos-protocol@0.24.0; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T15:05:06.105204Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/m/metalabel/dfos.svg",
  "full_name": "metalabel/dfos",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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