Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-23 16:43 UTC

dirtyduck3712 / Ducklog

Go · ShellSin licencia detectada★ 0 estrellas⑂ 0 forksdesde jul 2026Ver en GitHub ↗

dirtyduck3712/Ducklog tiene un índice de salud de 31 sobre 100, lo que lo sitúa en la banda En riesgo. Su puntuación más alta es AI Readiness (58/100) y la más baja, Community & Adoption (12/100). Se actualizó por última vez hace 3 días.

31
global / 100
En riesgo

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

31
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

duck3712Cuenta personal
3 seguidores8 repositorios públicosdesde mar 2015

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Gogithub.com/dirtyduck3712/ducklog/clientv0.1.0-1hace 5 días
Gogithub.com/dirtyduck3712/ducklog/zapsinkv0.1.0-1hace 5 días

Métricas por categoría

Vitalidad

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

33En riesgo · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 3 días
1.4/36Cadencia de commits — 2/52 semanas con commits
17.7/18Volumen de commits — 93 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year93
human_commit_share1
days_since_last_push3
active_weeks_last_year2
Cómo se puntúa
0/27Publica versiones — sin versiones publicadas
0/36Recencia de las versiones — sin versiones
0/27Cadencia de publicación — sin versiones
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count0
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

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

12Crítico · 18% del índice global
Cómo se puntúa
0/60Estrellas — 0 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
0/22.5Licencia — no se detectó ningún archivo de licencia
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_licenseno
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sostenibilidad y Gobernanza

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

39En riesgo · 24% del índice global
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
0/38.3Aceptación de PR — sin PR decididos o sin datos
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues, Aceptación de PR. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
4.3/25Alcance del propietario — 3 seguidores de dirtyduck3712
18.9/25Trayectoria — 8 repos públicos, cuenta de ~11 años
Datos de entrada utilizados
followers3
owner_typeUser
is_verified
owner_logindirtyduck3712
public_repos8
account_age_days4159
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 2 paquete(s) en go
35/35Recencia de publicación — última publicación hace 5 días
4/20Historial de versiones — 1 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/dirtyduck3712/ducklog/client, github.com/dirtyduck3712/ducklog/zapsink
ecosystemsgo
any_deprecatedno
min_days_since_publish5

Calidad de Ingeniería

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

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

Documentación

65Moderado
Cómo se puntúa
30/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
0/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepage
has_readme
has_docs_dir
has_descriptionno

Seguridad

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

21Crítico · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — sin datos
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
0/10Dangerous-Workflow — sin datos
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
0/2.5Licencia — license file not detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — sin datos
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — sin datos
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated13
scorecard_versionv5.5.0
checks_inconclusive5
scorecard_aggregate2,1
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, dangerous_workflow, packaging, signed_releases, token_permissions. Los pesos restantes se han renormalizado.

Preparación para IA

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

58Moderado · 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 — 93 de 93 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
12.6/18Arranque con un solo comando — client/go.mod, go.mod, zapsink/go.mod (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — Go (tipado estático)
10/10Entorno reproducible — lockfile
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 93
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0
toolchain_manifestsclient/go.mod, go.mod, zapsink/go.mod
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
55/55Tamaños de archivo manejables — 0/40 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes7036
source_files_sampled40
oversized_source_files0

Datos clave

0estrellas de GitHub
-contribuidores
93commits en los últimos 12 meses
3días desde el último push
0versiones publicadas
-factor bus
0issues abiertas
Goecosistemas de paquetes

Advertencias de recopilación de datos

  • Contributor list unavailable
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Más detalle

OpenSSF Scorecard 2.1 / 10
2.1agregado

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-23 16:43 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
n/dCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
n/dDangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
0Licenselicense file not detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
n/dPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
n/dToken-PermissionsNo tokens found
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 3
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/mark3labs/mcp-gov0.48.0go.mod
Gogithub.com/dirtyduck3712/ducklog/clientv0.1.0zapsink/go.mod
Gogo.uber.org/zapv1.27.1zapsink/go.mod
Todas las dependencias no recopilado

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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 287,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 88252,
        "Shell": 12582,
        "Python": 548,
        "Go Template": 1530
      },
      "pushed_at": "2026-07-20T03:13:57Z",
      "created_at": "2026-07-13T14:32:52Z",
      "owner_type": "User",
      "updated_at": "2026-07-20T03:14:01Z",
      "description": null,
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "main",
      "license_spdx_raw": null,
      "primary_language": "Go",
      "significant_languages": [
        "Go",
        "Shell"
      ]
    },
    "owner": {
      "blog": null,
      "name": "duck3712",
      "type": "User",
      "login": "dirtyduck3712",
      "company": null,
      "location": null,
      "followers": 3,
      "avatar_url": "https://avatars.githubusercontent.com/u/11313766?v=4",
      "created_at": "2015-03-04T12:55:58Z",
      "is_verified": null,
      "public_repos": 8,
      "account_age_days": 4159
    },
    "license": {
      "state": "absent",
      "spdx_id": null,
      "raw_spdx": null,
      "file_present": false,
      "scorecard_found": false,
      "profile_has_license": false
    },
    "activity": {
      "releases": [],
      "recent_commits": [
        {
          "oid": "f9eb80fb1bb6a71b6264a760b14ff0434442432f",
          "body": "Telegram 出口三項手動驗收實測通過(firing / send_resolved / VL Basic Auth)。\n通知訊息改走 alertmanager templates 機制,正體中文。\n關鍵陷阱:parse_mode HTML 下 html/template 已自動跳脫,模板內不可再手動跳脫。",
          "is_bot": false,
          "headline": "merge: 告警通知中文化(Telegram 模板 + rule summary)+ 驗收清單完成",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-20T03:08:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d18414281bdf33371b237c93cfe9a52d5d163cd3",
          "body": "三項手動驗收實測通過。原標準「/api/v1/rules 有 group」不足以證明\ndatasource 認證可用——rule 從磁碟載入,查 VL 全 401 時 group 照樣出現;\n改記正確驗法(401/200 對照閘門 + lastError 空 + 端到端 firing),\n並補充通知訊息格式與跳脫陷阱。",
          "is_bot": false,
          "headline": "docs(alert): Telegram 驗收清單完成 + 修正 Basic Auth 驗收標準",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-20T03:07:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0eac6c799bb486aa3be42af5c567951b142a6598",
          "body": "以 alertmanager templates 機制取代內建的 telegram.default.message:\n- 新增 alertmanager/templates/ducklog.tmpl(正體中文,firing/resolved 兩種版面)\n- alertmanager.yml.tmpl 加 templates: 與 telegram_configs.message:\n- docker-compose 掛載 templates 目錄\n\nparse_mode: HTML 下 telegram notifier 走 TmplHTML → Go html/template,\n{{ }} 帶出的值已自動 contextual escaping,模板內不可再手動跳脫 & < >,\n否則雙重跳脫、訊息顯示成字面 &lt; &amp;(已踩過,原因記於模板註解)。",
          "is_bot": false,
          "headline": "feat(alert): Telegram 通知改中文模板",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-20T03:07:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "98aa12a2aa5d6a49074595fe980f1ca2541d02a1",
          "body": "HighErrorRate / FatalPattern 的 annotations.summary 由英文改為正體中文,\nsummary 會原樣帶進 Telegram 通知,故與訊息模板一併中文化。",
          "is_bot": false,
          "headline": "feat(alert): rule summary 改中文",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-20T03:07:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f45af65e7daaa68ea321b89e1c8370e45a17925",
          "body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "merge: service 靜默偵測(absence,不分組 stats filter n:0)",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T23:52:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0383e250a504ab84ba13c5a49bd32e910e541ac2",
          "body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "fix(alert): e2e alive 對照改 fail-closed + README glob footgun 提醒",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T20:13:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e85d59b5c23a2c81e8b47dc812c30900eec5b9f6",
          "body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "docs: spec 補冷啟瞬時誤報 caveat(e2e 浮現)",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T20:04:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7159de372cceafbf9cb3bb5110928991b206105b",
          "body": null,
          "is_bot": false,
          "headline": "docs(alert): service 靜默偵測使用說明 + 恆 firing 警示",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T20:01:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6c887804f5266e8d80a9e88abe9d50898e90ad1a",
          "body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "test(alert): service 靜默偵測 e2e(dead firing + alive 對照)",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T19:52:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a56808d43c997417b84acbe59fd903676c7fcd38",
          "body": null,
          "is_bot": false,
          "headline": "feat(alert): service 靜默偵測 rule 範本 + vmalert glob 掛載",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T18:42:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce97a8f50da159b51aad0b39d2810a283165679a",
          "body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "docs: service 靜默偵測實作計畫(3 task,含 firing 必驗點)",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T18:39:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c7ce27179a635a9e8751b816844a1a33ac1c9c2a",
          "body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "docs: service 靜默偵測(absence)設計",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T18:33:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8b4b35532e0dc2cb32006bce12e32b06ade5e6a1",
          "body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "merge: vmalert 告警(vmalert+VM+alertmanager,docker-compose,off-by-default)",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T18:05:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a037aa026dddd74ba2bf2f1b6855287c27b631ab",
          "body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "docs(alert): 補 VL 側 Basic Auth 啟用說明 + 修正 .env.example 過時註解",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T18:00:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2d4da583710bbfc2c7ec0eb8130f7d09fc592a29",
          "body": null,
          "is_bot": false,
          "headline": "docs(alert): 告警 stack 啟動說明 + Telegram 手動驗收清單",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T17:52:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9ce49859d2c1467508315cd98c58149168525bbb",
          "body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "test(alert): 端到端 smoke(ingest panic → FatalPattern → webhook sink)",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T17:47:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "70e10097bd34d636c1b5c3068aa054a0dd134d4d",
          "body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "feat(alert): docker-compose alert stack(VL+VM+vmalert+alertmanager)",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T17:31:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78c29a1d5f95e5d336ef2dda60d42f9ebf3020ff",
          "body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "feat(alert): alertmanager config template + envsubst 渲染腳本",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T17:25:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6c1d0bdf1133a64a8280c5ba417fe1d333548945",
          "body": null,
          "is_bot": false,
          "headline": "feat(alert): vmalert vlogs rule 集(error-rate 門檻 + fatal-pattern)",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T17:21:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac59b5d0f82d261a6bc9f1d8d06746a8613b411a",
          "body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "docs: vmalert 告警實作計畫(5 task,dryRun+e2e 驗證)",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T17:14:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1dabcf2b4034a2ce9f889aba4431a58ad1ce7df",
          "body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "docs: vmalert 告警設計(標準全家桶 + docker-compose)",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T09:16:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "89361a4727630feab5ffa0c8a059735b408ddb85",
          "body": "偵測舊接法(本機 replace / 裸 ducklog/client import / APIKey 欄位),\n① 刪已移除的 APIKey 欄位(必要,否則 rebuild 炸)② 本機 replace → go get\n完整路徑。含安全閘與「改名不破壞 replace、只有 APIKey 移除會炸」的說明。\nmigrate 步驟已用真實多行 config 端到端實測(炸→綠)。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "feat(skill): ducklog-integration 加 migrate 舊接法模式",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T06:59:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c8520443e27ff25d5f873d080d0a4c55a1fee84c",
          "body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "docs: skill 旁補 symlink 安裝說明(全域啟用/新機器重建)",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T06:48:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "13c0f2c9ca128a0fa152a72608afff1442978034",
          "body": "canonical 移入 repo .claude/skills/;~/.claude/skills 那份改 symlink\n指向此處(單一來源、有版控、仍全域可用)。內容為 go get 版接入指南。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "chore: ducklog-integration skill 納入版控",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T06:47:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "15e47b409da78f555d706f91215823b3513958d6",
          "body": "client/zapsink 正名為 github.com/dirtyduck3712/ducklog/*,外部專案改用\ngo get,不再整包複製。root module 不動;zapsink 保留 replace 供 repo 內開發\n(對外部 consumer 被忽略,走 require v0.1.0)。接入文件改 go get 為主。\n\n發佈需另打 tag client/v0.1.0 + zapsink/v0.1.0。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "merge: 發佈 client/zapsink 模組(可 go get)",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T06:32:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ef20259ba9a05129dc678e9411dc307c016c0e58",
          "body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "docs: 註明 client 需 Go≥1.22、zapsink 需 Go≥1.24",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T06:32:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b4f9eb2d7ca946d1d08f9bcadd4120efcc38c8d3",
          "body": "INTEGRATION §0 以 go get 為主要接法,import 範例改完整路徑。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "docs: 接入改用 go get github.com/dirtyduck3712/ducklog/*",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T06:21:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56c0192e95cf7db367a67073c57dc71c36527f8c",
          "body": "裸 module path 無法 go get;改為 VCS 路徑供外部安裝。\nzapsink 保留 replace => ../client 供 repo 內開發。root 不動。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "refactor(modules): client/zapsink 正名為 github.com/dirtyduck3712/ducklog/*",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T06:17:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c3c99d6370b6bd8ea924f1b02e110aef23cfa321",
          "body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "docs: 發佈 client/zapsink 模組實作計畫",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T06:15:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "30c91417afb5101184074bd59ab8b35e03618f65",
          "body": "正名 client/zapsink 為 github.com/dirtyduck3712/ducklog/* 路徑,\n取代整包複製/本機 replace。root 不動。monorepo + 前綴 tag。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "docs: 發佈 client/zapsink 模組設計(可 go get)",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T06:09:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "596161c1ec145ea4ddd95aa85ffb8fedd0bc689a",
          "body": "VL 以 -httpAuth.* 開一組 Basic Auth;寫入端 RemoteConfig.Username/Password、\n讀取端 VL_USERNAME/VL_PASSWORD env,三端留空維持無 auth。移除對 VL 無效的\nAPIKey/Bearer。/health 不受 auth 保護,故 MCP 啟動以受保護查詢驗憑證 fail-fast。\nTLS 記 caveat。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "merge: VL Basic Auth(單一共享密鑰,off-by-default)",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T05:08:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e20afb4b6bb1f91257fed050e0df7bf2a53f1dda",
          "body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "docs: VL Basic Auth 執行示範與 env 說明(含 TLS caveat)",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T04:57:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e4bf1484c9e7939999cfef488240dcdc1c8a76ef",
          "body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "fix(mcp): 啟動時以受保護查詢驗證 VL 憑證(/health 不受 auth 保護)",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T04:51:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9a9cd245a034ab4dfdc6cf22fb1001f424add2c9",
          "body": "vl.Client 新增 NewWithAuth,Ping/Query 帶 Basic Auth;MCP 讀 env。\nvltest 加 StartVLWithAuth 供端到端驗證。New 簽章不變。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "feat(vl): 讀取端 Basic Auth(NewWithAuth + VL_USERNAME/PASSWORD)",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T04:46:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16e517df6aa065dc6273b6b37f4f974b9dcc5663",
          "body": "RemoteConfig 移除 APIKey、改 Username/Password 走 SetBasicAuth;\n憑證空則不帶 auth header(off-by-default)。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "feat(client): VL Basic Auth,移除對 VL 無效的 Bearer",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T04:39:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "280cd5a0420aecc208350df71792450eb8153b3f",
          "body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "docs: VL Basic Auth 實作計畫",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T04:36:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ecbab6cd46aa982a789e95dc599a8a734ef2b1f7",
          "body": "單一共享密鑰、off-by-default;移除 client 對 VL 無效的 Bearer,\n改帶 Basic Auth;讀取端獨立 VL_USERNAME/VL_PASSWORD env。TLS 記 caveat。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "docs: VL Basic Auth 設計",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T04:27:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db26e2410f705b31549caea33ee85c4f2f387b5f",
          "body": "第 5 個 MCP tool — 4 個罐頭 tool 不合用時的受控 raw LogsQL 通道。\n時間過濾 quote-aware 注入(括號包裹解 OR 優先序)、命中 limit 誠實截斷。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "merge: run_logsql 逃生 tool",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T04:13:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "de1fd25e075f0c2b8fc0f39c89ec6e54fa0cd99d",
          "body": "① injectTimeFilter 改用 firstUnquotedPipe 找引號外第一個 pipe 切分,\nfilter 段用括號包住再 AND 時間;修正正則/phrase 內 | 被誤切導致 _time\n被吞、時間護欄靜默失效,並解掉 top-level OR 的優先序漏過濾。\n② 命中 limit 截斷時清零 TotalMatched,消除 total/returned/truncated 矛盾。\n補 TestInjectTimeFilter(含正則/OR 回歸)、time-actually-filters、\nQUERY_FAILED 三組測試。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "fix(tools): run_logsql 時間注入 quote-aware + 截斷不吐誤導 total_matched",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T04:06:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d7a26d1a9f58fd5ff29f32a74d30c473796118af",
          "body": "第 5 個 tool,description 引導 AI 優先用專用 tool。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "feat(mcpserver): 註冊 run_logsql tool",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T03:49:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "43e9e5979862cc38360fd37837e96022404f67e3",
          "body": "時間過濾注入第一個 pipe 之前;命中 limit 即標 Truncated,不硬湊 Count。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "feat(tools): run_logsql 逃生口 — 任意 LogsQL pipeline",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T03:44:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c2bc9e889b82caadda4d6b4808721285ad33cafa",
          "body": "Claude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "docs: run_logsql 逃生 tool 實作計畫",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T03:42:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "30a64fd94c2a02e1235e12ac27ea6fcc1366170b",
          "body": "4 個罐頭 tool 不合用時的受控 raw LogsQL 通道。沿用 requireRange +\nBoundRaw 護欄;關鍵是時間過濾須注入第一個 pipe 之前。\n\nClaude-Session: https://claude.ai/code/session_018usf3iQoLwJuvsjzPQmXDN",
          "is_bot": false,
          "headline": "docs: run_logsql 逃生 tool 設計",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T03:38:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "895632da41fe227c6967114894cd8c012e6da31b",
          "body": "json.Marshal(error) 會「成功」但產出 {}(無 exported fields),\nVictoriaLogs 攤平空物件後欄位整個不見——slog 慣用的 \"err\", err\n在查詢端看不到錯誤原因。jsonSafe 在 marshal 檢查前先轉字串。\n\nClaude-Session: https://claude.ai/code/session_0146m1jQxFDhxaBHsxrx1LRn",
          "is_bot": false,
          "headline": "fix(client): error attr 序列化為 Error() 字串,修欄位靜默消失",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-18T01:56:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "24f56f3c27411f7d26980c4ca84ab84ef566e5a5",
          "body": "…ebug\n\nzapcore.NewTee evaluates each sub-core's Enabled independently, so the\nducklog sink hardcoded at LevelDebug kept receiving debug entries even when\nthe base console core was gated at info — LOG_LEVEL=info didn't stop debug\nfrom reaching VictoriaLogs. Tee now derives the sink level from cfg.Level\n(default Info), matching client.RemoteHandler.\n\nClaude-Session: https://claude.ai/code/session_01F6M2eYKpycNVAbGmH7vcSy",
          "is_bot": false,
          "headline": "fix(zapsink): respect configured level in Tee instead of hardcoding D…",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-13T22:54:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ada6c01439eed366d58e6c67da93d9437d03db96",
          "body": "phase0/ was throwaway probe code that validated (and ultimately\ndisproved) the self-hosted DuckLake storage approach. The pivot to\nVictoriaLogs + MCP is merged and the rationale/evidence lives in the\ndesign doc under docs/superpowers/specs/. The spikes carried no\nunique knowledge, and the committed FINDINGS.md (\"DuckLake PASS\")\ncontradicted the shipped architecture.\n\nClaude-Session: https://claude.ai/code/session_01WGuG4rjv2dL8XuFUyLhumf",
          "is_bot": false,
          "headline": "chore: remove phase0 DuckLake validation spikes",
          "author_name": "DrDex",
          "author_login": null,
          "committed_at": "2026-07-13T15:04:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c277822ed97597683722ea7195ef71f287f47afa",
          "body": null,
          "is_bot": false,
          "headline": "merge: rename docklog -> ducklog",
          "author_name": "ducklog",
          "author_login": null,
          "committed_at": "2026-07-13T14:29:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1df59bbe43c0e1deff895a403c085e3beee90c0c",
          "body": "Module paths (ducklog, ducklog/client, ducklog/zapsink), all imports,\ncmd/ducklog-mcp, the MCP server name, DUCKLOG_VL_URL env var, README,\nINTEGRATION.md, and run-dev.sh. Behavior unchanged.\n\nClaude-Session: https://claude.ai/code/session_01HKX13PQ3HszozbEJUSYoKd",
          "is_bot": false,
          "headline": "rename: docklog -> ducklog across modules, binary, docs, MCP name",
          "author_name": "ducklog",
          "author_login": null,
          "committed_at": "2026-07-13T14:29:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b99b26bc2105a11dbbc491e356316b11262cd0c",
          "body": null,
          "is_bot": false,
          "headline": "merge: zapsink reusable zap adapter + integration guide",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-13T14:13:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4ddd0606893d270133ac8920ff9444ea0ce89831",
          "body": "- zapsink: new importable module (docklog/zapsink) bridging go.uber.org/zap\n  to the slog-based transport, so any zap service can feed VictoriaLogs.\n  NewCore (generic zap->slog.Handler) + Tee (one-call wrap of a base core\n  with a docklog sink). Ported from the per-project copy that lived in a\n  co\n[…]\nace,\n  MCP registration, and the gotchas (vmui time range, curl content-type,\n  non-serializable attrs, zap Fatal skips drain).\n\nClaude-Session: https://claude.ai/code/session_01HKX13PQ3HszozbEJUSYoKd",
          "is_bot": false,
          "headline": "feat(zapsink): reusable zap->docklog adapter + integration guide",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-13T14:13:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cb4f45d0fdc4ba406d09ea6205e4e4c2373958cf",
          "body": null,
          "is_bot": false,
          "headline": "merge: never drop logs on non-serializable attrs (transport hardening)",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-13T04:35:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "09a155945eca765c9f4233653487eaeb82f9b557",
          "body": "Routing slog.Default() to the transport captures library error logs\n(e.g. pgx) whose attr values contain non-JSON-serializable fields such\nas pgconn.DialFunc. Two independent defects dropped whole batches of\ngood logs silently (only the stdout fallback kept them):\n\n1. flattenAttr stored raw attr val\n[…]\neither the batch nor the line is lost.\n\nBoth paths now honor the never-silently-drop contract. Regression tests\nadded for each.\n\nClaude-Session: https://claude.ai/code/session_01HKX13PQ3HszozbEJUSYoKd",
          "is_bot": false,
          "headline": "fix(client): never drop logs on non-serializable attrs",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-13T04:30:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a57617c5987d3fcf0b8e068ae31387f48955878c",
          "body": null,
          "is_bot": false,
          "headline": "merge: VictoriaLogs backend + MCP tooling layer pivot",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-13T03:04:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "28cc4ace081bd1899583b3022da5fb9c73f4026a",
          "body": "…ashes, honest get_trace total, reject piped search) + tests",
          "is_bot": false,
          "headline": "fix: harden anti-confabulation contract (bound compare, escape backsl…",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-13T02:57:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "be9708b05d99dc5f858ef72ab4860803e0aa361b",
          "body": null,
          "is_bot": false,
          "headline": "chore: gitignore docklog-mcp build output",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-13T02:49:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b97a9577c72c096d8a80acbfff5dcda89f89af36",
          "body": null,
          "is_bot": false,
          "headline": "docs: run scripts + README for VictoriaLogs + MCP setup",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-13T02:45:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "371a03f7c02e604dc75e77ea5f5a40a159429238",
          "body": "…toriaLogs)",
          "is_bot": false,
          "headline": "refactor: remove superseded DuckLake storage layer (superseded by Vic…",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-13T02:40:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7affb4c055ef4f9e8b9ca21629e6b1a6f80bfa03",
          "body": null,
          "is_bot": false,
          "headline": "feat(mcp): stdio MCP server exposing 4 LogsQL-backed tools",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-13T02:34:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5dc4bfaad11ecc534f6bc8506cff65c12e5361e5",
          "body": "…s over LogsQL",
          "is_bot": false,
          "headline": "feat(tools): summarize_errors, get_trace, search_logs, compare_period…",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-13T02:23:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9407d32c2bafeafb19d89bf4ff89b38acf2fc629",
          "body": "…rade)",
          "is_bot": false,
          "headline": "feat(bound): anti-confabulation contract (token-bound, explicit downg…",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-13T02:20:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "edba0c1d0de2b1e5a529e8c2f3e0b02953ade0da",
          "body": null,
          "is_bot": false,
          "headline": "feat(vl): LogsQL HTTP client + query builders",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-13T02:10:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78c8463411795a34364d15ce595fe2134c233efd",
          "body": null,
          "is_bot": false,
          "headline": "feat(client): repoint transport e2e to VictoriaLogs ingest",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-13T02:04:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "670c4a89076a8e7dee421108a7c371015b0e5ede",
          "body": null,
          "is_bot": false,
          "headline": "docs: pivot design — VictoriaLogs backend + thin MCP tooling layer",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-13T01:49:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f02f3393de916ef3b047128f9585bcca2340c923",
          "body": null,
          "is_bot": false,
          "headline": "fix(config): default rate_limits.default to 1000 (avoid silent drop-all)",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T22:55:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bcd945e7abc40019ebcdd005d1cb9baecb5ef28a",
          "body": "…ain to 5s",
          "is_bot": false,
          "headline": "fix(client): resolve LogValuer, flatten inline groups, bound Close dr…",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T22:46:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5896a6c8d62a3a1557b27a0ced93acc71141fc5",
          "body": null,
          "is_bot": false,
          "headline": "test(client): end-to-end wire-contract test against real docklog server",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T22:30:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f7bcaadc434c343781659a20ce2da3607145b62",
          "body": null,
          "is_bot": false,
          "headline": "feat(client): trace id HTTP middleware + outbound propagation",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T22:25:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "de2045aa53832654652f380b2935784e538235e1",
          "body": null,
          "is_bot": false,
          "headline": "fix(client): idempotent Close + serialize shutdown-summary write",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T22:24:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e49c1af2894053263ebb5d35f166f18568ec81b5",
          "body": null,
          "is_bot": false,
          "headline": "feat(client): slog.Handler with dual-write, trace, non-blocking, Close",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T22:19:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17117871fbd455e06d3a44fabf829d61167895a0",
          "body": "…ng drop",
          "is_bot": false,
          "headline": "feat(client): background batch sender with retry, breaker, non-blocki…",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T22:14:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e3d86ce4d1dfd69c0ad7702e29b40bf812411dba",
          "body": null,
          "is_bot": false,
          "headline": "feat(client): RemoteConfig with defaults",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T22:10:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d7d6bf3453ab8df414aeedd9671ea393d07969eb",
          "body": null,
          "is_bot": false,
          "headline": "feat(client): consecutive-failure circuit breaker",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T22:08:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf4c66b1828265a549e8c44d4354e45f9cc79f94",
          "body": null,
          "is_bot": false,
          "headline": "feat(client): trace id generation + context propagation",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T22:06:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "780f4b6f53936b4f88eeefdc0f7ec8329246c8a4",
          "body": null,
          "is_bot": false,
          "headline": "feat(client): module scaffold + wire types",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T22:03:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "43cce6cb2bbb8d11a483116fded287641a4accaf",
          "body": null,
          "is_bot": false,
          "headline": "docs: Phase 1b client transport implementation plan",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T21:43:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "37ee6d0fe39195d32ceeabf59746458958919e45",
          "body": null,
          "is_bot": false,
          "headline": "docs: Phase 1b Go client transport design spec",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T21:38:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "86c706571b0f020e4045879b2994672da046b9f6",
          "body": null,
          "is_bot": false,
          "headline": "fix(ingest): canonicalize valid trace_id so no format can poison a batch",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T18:51:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0fe30e9b190468496cfca7d73e2c3b8b90aa0220",
          "body": "…json drops\n\nThree whole-branch review fixes defending never-lose / never-silent rules:\n\n- I-2: ParseLevel is now case-insensitive (slog's INFO/ERROR no longer\n  silently downgrade to Info); genuinely unknown non-empty levels are\n  marked _level_unknown instead of a silent downgrade.\n- I-1: non-UUID\n[…]\nr() is now checked so an over-cap line returns 400\n  instead of a silent truncated 200.\n\nmergeSkewFlag generalized into a shared mergeAttr helper.\nTests added for all three; model+ingest suites green.",
          "is_bot": false,
          "headline": "fix(ingest): case-insensitive level, trace_id validation, explicit nd…",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T18:49:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f475e0dba0d49c1293df885173482f85a46442e5",
          "body": null,
          "is_bot": false,
          "headline": "test: assert crash test committed progress (no vacuous 0/0 pass)",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T18:36:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "646a30928aee700c694b3f6306aa25f8f5a1a177",
          "body": null,
          "is_bot": false,
          "headline": "test: crash recovery integration test (kill -9 during ingest)",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T18:33:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "739b17b2d3e91d07b361a6723c495c1c7777a0c3",
          "body": null,
          "is_bot": false,
          "headline": "feat: config loader + main wiring with graceful shutdown",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T18:28:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38876c5414e90ba3a4034454f77e87ca800aaa9e",
          "body": "…opped",
          "is_bot": false,
          "headline": "test: assert health exposes catalog_size_mb, last_checkpoint null, dr…",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T18:25:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d57acc673c2b3de9bb75b45c1aa564aee902471c",
          "body": null,
          "is_bot": false,
          "headline": "feat: health endpoint with catalog size + last checkpoint",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T18:23:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "287bc5037603101e9b4563aaddb974963f1a7d68",
          "body": null,
          "is_bot": false,
          "headline": "test: cover checkpoint panic recovery via Checkpointer interface",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T18:20:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0291044e9e8d27348378698f4412dc7f1dd3fe0d",
          "body": null,
          "is_bot": false,
          "headline": "feat: checkpoint loop with panic recovery + last-checkpoint tracking",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T18:18:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "45b51a3a17f062ed5d4777973e08c0787ba57e64",
          "body": null,
          "is_bot": false,
          "headline": "feat: ingest handler wiring auth, skew, rate-limit, disk-guard, store",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T18:13:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dd535b82504c91217e49a4e062f06cfefd8ea4cb",
          "body": null,
          "is_bot": false,
          "headline": "feat: disk usage guard with warn/reject/purge thresholds",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T18:07:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a7f145b5985fe3f9db627891dc9fc05247887e75",
          "body": null,
          "is_bot": false,
          "headline": "feat: per-service token bucket rate limiter",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T18:05:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7da78419bb502870f08c05ac9ec11f91f300e1d0",
          "body": null,
          "is_bot": false,
          "headline": "feat: bearer key auth with scopes",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T18:03:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d961222cc837e41a3a8d25872de1710d35536666",
          "body": null,
          "is_bot": false,
          "headline": "feat: separate metrics store with upsert + dropped counter",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T18:00:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "65f326cee997e020c0b4cb793cd37389ee9f9ec7",
          "body": null,
          "is_bot": false,
          "headline": "feat: DuckLake store with batch insert, checkpoint, retention",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T17:57:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f446509f17777b9bafeb68bdd22af7b9db335f24",
          "body": null,
          "is_bot": false,
          "headline": "feat: project scaffold + model types",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T17:54:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d54bd03a034a6d96491a4eb4fc7d91a95069527",
          "body": null,
          "is_bot": false,
          "headline": "chore: initial repo — spec, phase0 findings, phase1 plan",
          "author_name": "docklog",
          "author_login": null,
          "committed_at": "2026-07-12T17:52:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 0,
      "commits_last_year": 93,
      "latest_release_at": null,
      "latest_release_tag": null,
      "releases_from_tags": false,
      "days_since_last_push": 3,
      "active_weeks_last_year": 2,
      "days_since_latest_release": null,
      "mean_days_between_releases": null
    },
    "community": {
      "has_readme": true,
      "has_license": false,
      "has_description": false,
      "has_contributing": false,
      "health_percentage": 14,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/dirtyduck3712/ducklog/client",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/dirtyduck3712/ducklog/client",
          "is_deprecated": false,
          "latest_version": "v0.1.0",
          "repository_url": "https://github.com/dirtyduck3712/ducklog",
          "versions_count": 1,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-18T06:32:26Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        },
        {
          "name": "github.com/dirtyduck3712/ducklog/zapsink",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/dirtyduck3712/ducklog/zapsink",
          "is_deprecated": false,
          "latest_version": "v0.1.0",
          "repository_url": "https://github.com/dirtyduck3712/ducklog",
          "versions_count": 1,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-18T06:32:26Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "client/go.mod",
        "go.mod",
        "zapsink/go.mod"
      ],
      "largest_source_bytes": 7036,
      "source_files_sampled": 40,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "client/go.mod",
        "go.mod",
        "zapsink/go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/mark3labs/mcp-go",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.48.0"
        },
        {
          "name": "github.com/dirtyduck3712/ducklog/client",
          "manifest": "zapsink/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.1.0"
        },
        {
          "name": "go.uber.org/zap",
          "manifest": "zapsink/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.27.1"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": null,
      "bot_contributors": 0,
      "top_contributors": [],
      "contributors_sampled": null,
      "top_contributor_share": null
    },
    "quality_signals": {
      "has_ci": false,
      "has_tests": true,
      "ci_workflows": [],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "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": 0,
            "reason": "license file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": null,
            "reason": "No tokens found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "f9eb80fb1bb6a71b6264a760b14ff0434442432f",
        "ran_at": "2026-07-23T16:43:52Z",
        "aggregate_score": 2.1,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-20T03:13:58Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/dirtyduck3712/Ducklog",
    "host": "github.com",
    "name": "Ducklog",
    "owner": "dirtyduck3712"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 31,
      "inputs": {
        "security": 21,
        "vitality": 33,
        "community": 12,
        "governance": 39,
        "engineering": 44
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "at_risk",
        "name": "Vitality",
        "value": 33,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "commits_last_year": 93,
              "human_commit_share": 1,
              "days_since_last_push": 3,
              "active_weeks_last_year": 2
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 3 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 3
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "2/52 weeks with commits",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "93 commits in the last year",
                "points": 17.7,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 93
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "critical",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "releases_count": 0
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "no releases published",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_releases_published",
                    "params": {}
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "no releases",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_releases",
                    "params": {}
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "no releases",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_releases",
                    "params": {}
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": "critical",
        "name": "Community & Adoption",
        "value": 12,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "critical",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "has_readme": true,
              "has_license": false,
              "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": "no license file detected",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "license_absent",
                    "params": {}
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 39,
        "weight": 0.24,
        "metrics": [
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "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": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "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": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 41,
            "inputs": {
              "followers": 3,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "dirtyduck3712",
              "public_repos": 8,
              "account_age_days": 4159
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "3 followers of dirtyduck3712",
                "points": 4.3,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 3,
                      "login": "dirtyduck3712"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "8 public repos, account ~11 yr old",
                "points": 18.9,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 8
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 11
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "good",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "packages": [
                "github.com/dirtyduck3712/ducklog/client",
                "github.com/dirtyduck3712/ducklog/zapsink"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "2 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 2,
                      "ecosystems": "go"
                    }
                  }
                ],
                "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": "1 published versions",
                "points": 4,
                "status": "partial",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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": "at_risk",
        "name": "Engineering Quality",
        "value": 44,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "at_risk",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 30,
            "inputs": {
              "has_ci": false,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "critical",
        "name": "Security",
        "value": 21,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Dangerous-Workflow, Packaging, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "dangerous_workflow",
                    "packaging",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 21,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 13,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 5,
              "scorecard_aggregate": 2.1
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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 not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "No tokens found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 58,
        "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": "93 of 93 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 93,
                      "sampled": 93
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "client/go.mod",
                "go.mod",
                "zapsink/go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "client/go.mod, go.mod, zapsink/go.mod (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "client/go.mod, go.mod, zapsink/go.mod"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 93",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 93
                    }
                  }
                ],
                "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": "Go",
              "largest_source_bytes": 7036,
              "source_files_sampled": 40,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/40 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 40,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Contributor list unavailable",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T16:43:56.778178Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/dirtyduck3712/Ducklog.svg",
  "full_name": "dirtyduck3712/Ducklog",
  "license_state": "absent",
  "license_spdx": null
}

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

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

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