Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-28 11:31 UTC

dracory / blogstore

GoAGPL-3.0★ 1 estrella⑂ 0 forksdesde feb 2024Ver en GitHub ↗

dracory/blogstore tiene un índice de salud de 57 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (86/100) y la más baja, Community & Adoption (24/100). Se actualizó por última vez hace 2 días. Una sola persona concentra la mayor parte del trabajo reciente.

57
global / 100
Moderado

Índice de salud del software

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

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

Perfil de puntuación

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

Titularidad

dracoryOrganización
4 seguidores74 repositorios públicosdesde mar 2025

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Gogithub.com/dracory/blogstorev1.34.0-52hace 2 días

Métricas por categoría

Vitalidad

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

86Excelente · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 2 días
13.2/36Cadencia de commits — 19/52 semanas con commits
17.2/18Volumen de commits — 81 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year81
human_commit_share0,98
days_since_last_push2
active_weeks_last_year19
Cómo se puntúa
27/27Publica versiones — 51 versiones publicadas
36/36Recencia de las versiones — última versión hace 2 días
27/27Cadencia de publicación — una versión cada ~4 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count51
latest_release_tagv1.34.0
releases_from_tagsno
days_since_latest_release2
mean_days_between_releases4
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?

24Crítico · 18% del índice global
Cómo se puntúa
0/60Estrellas — 1 estrellas
0/25Forks — 0 forks
0/15Observadores — 1 observadores
Datos de entrada utilizados
forks0
stars1
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (AGPL-3.0)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sostenibilidad y Gobernanza

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

56Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
1.7/22.5Distribución de commits — el principal contribuyente firma el 92% de los commits
2.7/13.5Amplitud de contribuyentes — 2 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled2
top_contributor_share0,925
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
38.2/38.3Aceptación de PR — 2/2 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/28 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs2
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues. Los pesos restantes se han renormalizado.
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
5/25Alcance del propietario — 4 seguidores de dracory
15.8/25Trayectoria — 74 repos públicos, cuenta de ~1 años
Datos de entrada utilizados
followers4
owner_typeOrganization
is_verified
owner_logindracory
public_repos74
account_age_days506
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en go
35/35Recencia de publicación — última publicación hace 2 días
20/20Historial de versiones — 52 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/dracory/blogstore
ecosystemsgo
any_deprecatedno
min_days_since_publish2

Calidad de Ingeniería

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

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

Documentación

40En riesgo
Cómo se puntúa
30/30README
0/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_dirno
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?

53Moderado · 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
2.5/2.5CI-Tests — 2 out of 2 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/28 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — sin datos
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
6.8/7.5Vulnerabilities — 1 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4,1
Excluidos de la puntuación (sin datos o no aplicable): packaging, signed_releases. Los pesos restantes se han renormalizado.
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
0/25Dependencias indirectas libres de avisos conocidos — el conjunto transitivo no es separable de las dependencias de desarrollo y prueba en este alcance
0/40Sin avisos pendientes — ningún aviso tiene fecha de publicación
Datos de entrada utilizados
sourceosv
advisories1
affected_packages1
assessed_packages21
unassessed_packages0
affected_by_severityunknown 1
direct_affected_packages0
Excluidos de la puntuación (sin datos o no aplicable): Dependencias indirectas libres de avisos conocidos, Sin avisos pendientes. Los pesos restantes se han renormalizado. Se cotejaron 21 dependencias resueltas con OSV. Este repositorio no publica ningún paquete que el índice resuelva, por lo que se evaluó en su lugar el grafo de dependencias del repositorio. Ese grafo mezcla fijaciones de desarrollo y prueba con las dependencias distribuidas, de modo que solo se puntúan las dependencias declaradas en tiempo de ejecución; los hallazgos transitivos se informan como contexto y quedan excluidos de la puntuación. No se analiza la alcanzabilidad.

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.

60Moderado · 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 — 78 de 98 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,796
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
12.6/18Arranque con un solo comando — go.mod (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — Go (tipado estático)
10/10Entorno reproducible — lockfile
4/10Práctica demostrada con agentes — 2 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,02
toolchain_manifestsgo.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/30 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes35.349
source_files_sampled30
oversized_source_files0

Datos clave

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

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token

Más detalle

OpenSSF Scorecard 4.1 / 10
4.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-28 11:30 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests2 out of 2 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/28 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
n/dPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
9Vulnerabilities1 existing vulnerabilities detected
Dependencias directas 6
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/dracory/neatv0.33.0go.mod
Gogithub.com/dracory/sbv0.26.0go.mod
Gogithub.com/dracory/strv0.18.0go.mod
Gogithub.com/dromara/carbon/v2v2.6.16go.mod
Gogithub.com/samber/lov1.53.0go.mod
Gomodernc.org/sqlitev1.54.0go.mod
Todas las dependencias 21

Conjunto completo de dependencias resueltas según el grafo de dependencias de GitHub: 6 paquetes directos y 15 indirectos (transitivos). El cierre transitivo es completo cuando el repositorio incluye un lockfile.

RegistroPaqueteVersiónRelación
Gogithub.com/dracory/neatv0.33.0directa
Gogithub.com/dracory/sbv0.26.0directa
Gogithub.com/dracory/strv0.18.0directa
Gogithub.com/dromara/carbon/v2v2.6.16directa
Gogithub.com/samber/lov1.53.0directa
Gomodernc.org/sqlitev1.54.0directa
Gogithub.com/dracory/uidv1.9.0indirecta
Gogithub.com/dustin/go-humanizev1.0.1indirecta
Gogithub.com/georgysavva/scanyv1.2.3indirecta
Gogithub.com/google/uuidv1.6.0indirecta
Gogithub.com/mattn/go-isattyv0.0.24indirecta
Gogithub.com/ncruces/go-strftimev1.0.0indirecta
Gogithub.com/remyoudompheng/bigfftv0.0.0-20230129092748-24d4a6f8daecindirecta
Gogithub.com/spf13/castv1.10.0indirecta
Gogolang.org/x/cryptov0.54.0indirecta
Gogolang.org/x/expv0.0.0-20260718201538-764159d718efindirecta
Gogolang.org/x/sysv0.47.0indirecta
Gogolang.org/x/textv0.40.0indirecta
Gomodernc.org/libcv1.74.3indirecta
Gomodernc.org/mathutilv1.7.1indirecta
Gomodernc.org/memoryv1.11.0indirecta
Avisos de dependencias 1

Este repositorio no publica ningún paquete que el índice resuelva, así que se evaluó su propio grafo de dependencias — 21 paquetes, que incluyen también fijaciones de desarrollo y prueba que nunca se distribuyen: 1 tienen avisos conocidos, de los cuales 0 son directas.

PaqueteVersiónRelaciónGravedadAvisosCorregido en
golang.org/x/cryptov0.54.0indirectadesconocida1

Un aviso significa que la versión registrada en el grafo de dependencias cae dentro del rango afectado de un aviso. No se analiza la alcanzabilidad, y el grafo incluye fijaciones de desarrollo y prueba: un hallazgo puede referirse al utillaje y no al software distribuido.

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 506,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 404863
      },
      "pushed_at": "2026-07-26T03:53:00Z",
      "created_at": "2024-02-19T04:55:57Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-26T03:48:06Z",
      "description": null,
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "AGPL-3.0",
      "default_branch": "main",
      "license_spdx_raw": "AGPL-3.0",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "Organization",
      "login": "dracory",
      "company": null,
      "location": null,
      "followers": 4,
      "avatar_url": "https://avatars.githubusercontent.com/u/202408768?v=4",
      "created_at": "2025-03-08T11:35:51Z",
      "is_verified": null,
      "public_repos": 74,
      "account_age_days": 506
    },
    "license": {
      "state": "standard",
      "spdx_id": "AGPL-3.0",
      "raw_spdx": "AGPL-3.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.34.0",
          "kind": "minor",
          "published_at": "2026-07-26T03:53:01Z"
        },
        {
          "tag": "v1.33.0",
          "kind": "minor",
          "published_at": "2026-07-24T07:53:14Z"
        },
        {
          "tag": "v1.32.0",
          "kind": "minor",
          "published_at": "2026-07-24T06:51:08Z"
        },
        {
          "tag": "v1.31.0",
          "kind": "minor",
          "published_at": "2026-07-23T16:46:23Z"
        },
        {
          "tag": "v1.30.0",
          "kind": "minor",
          "published_at": "2026-07-19T21:05:25Z"
        },
        {
          "tag": "v1.29.0",
          "kind": "minor",
          "published_at": "2026-06-28T05:48:08Z"
        },
        {
          "tag": "v1.28.0",
          "kind": "minor",
          "published_at": "2026-06-27T01:54:26Z"
        },
        {
          "tag": "v1.27.0",
          "kind": "minor",
          "published_at": "2026-06-21T00:53:37Z"
        },
        {
          "tag": "v1.26.0",
          "kind": "minor",
          "published_at": "2026-06-20T23:04:52Z"
        },
        {
          "tag": "v1.25.0",
          "kind": "minor",
          "published_at": "2026-06-20T12:03:35Z"
        },
        {
          "tag": "v1.24.0",
          "kind": "minor",
          "published_at": "2026-06-15T18:59:51Z"
        },
        {
          "tag": "v1.23.0",
          "kind": "minor",
          "published_at": "2026-06-15T18:05:49Z"
        },
        {
          "tag": "v1.22.0",
          "kind": "minor",
          "published_at": "2026-05-24T22:26:10Z"
        },
        {
          "tag": "v1.21.0",
          "kind": "minor",
          "published_at": "2026-05-19T06:36:32Z"
        },
        {
          "tag": "v1.20.0",
          "kind": "minor",
          "published_at": "2026-05-13T04:05:27Z"
        },
        {
          "tag": "v1.19.0",
          "kind": "minor",
          "published_at": "2026-05-09T17:45:13Z"
        },
        {
          "tag": "v1.18.0",
          "kind": "minor",
          "published_at": "2026-05-03T12:37:25Z"
        },
        {
          "tag": "v1.17.0",
          "kind": "minor",
          "published_at": "2026-05-03T06:14:55Z"
        },
        {
          "tag": "v1.16.0",
          "kind": "minor",
          "published_at": "2026-05-02T22:06:02Z"
        },
        {
          "tag": "v1.15.0",
          "kind": "minor",
          "published_at": "2026-05-02T16:55:57Z"
        },
        {
          "tag": "v1.14.0",
          "kind": "minor",
          "published_at": "2026-05-02T16:47:32Z"
        },
        {
          "tag": "v1.13.0",
          "kind": "minor",
          "published_at": "2026-05-02T16:29:45Z"
        },
        {
          "tag": "v1.12.0",
          "kind": "minor",
          "published_at": "2026-04-08T04:57:35Z"
        },
        {
          "tag": "v1.11.0",
          "kind": "minor",
          "published_at": "2026-04-07T19:49:48Z"
        },
        {
          "tag": "v1.10.0",
          "kind": "minor",
          "published_at": "2026-04-07T07:25:12Z"
        },
        {
          "tag": "v1.9.0",
          "kind": "minor",
          "published_at": "2026-04-07T06:52:47Z"
        },
        {
          "tag": "v1.8.0",
          "kind": "minor",
          "published_at": "2026-04-07T06:34:00Z"
        },
        {
          "tag": "v1.7.0",
          "kind": "minor",
          "published_at": "2026-03-28T23:23:10Z"
        },
        {
          "tag": "v1.6.0",
          "kind": "minor",
          "published_at": "2026-03-21T06:26:20Z"
        },
        {
          "tag": "v1.5.0",
          "kind": "minor",
          "published_at": "2026-02-04T22:29:14Z"
        },
        {
          "tag": "v1.4.4",
          "kind": "patch",
          "published_at": "2026-01-16T18:18:26Z"
        },
        {
          "tag": "v1.4.3",
          "kind": "patch",
          "published_at": "2026-01-15T08:31:57Z"
        },
        {
          "tag": "v1.4.2",
          "kind": "patch",
          "published_at": "2026-01-15T07:52:38Z"
        },
        {
          "tag": "v1.4.1",
          "kind": "patch",
          "published_at": "2026-01-10T06:34:52Z"
        },
        {
          "tag": "v1.4.0",
          "kind": "minor",
          "published_at": "2026-01-09T08:54:12Z"
        },
        {
          "tag": "v1.3.1",
          "kind": "patch",
          "published_at": "2026-01-09T02:46:19Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2026-01-08T18:38:23Z"
        },
        {
          "tag": "v1.2.1",
          "kind": "patch",
          "published_at": "2025-12-06T05:34:23Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2025-11-21T10:47:00Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2025-09-01T18:27:10Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2025-04-01T18:51:51Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2025-03-14T06:22:46Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2024-11-28T17:51:35Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2024-11-02T20:21:30Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2024-10-31T06:59:34Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2024-10-31T06:55:53Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2024-09-10T07:08:28Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2024-09-08T18:39:28Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2024-04-22T00:31:21Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2024-02-19T05:45:31Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2024-02-19T05:26:51Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "6c08071c2ad7c89b880ff6501b1768f954ca42f0",
          "body": "Update dependencies to latest version",
          "is_bot": false,
          "headline": "Merge pull request #2 from dracory/jules-15759358083476341671-90594248",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2026-07-26T03:48:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0992c4b13d4ca6bcb25b9c4ca8febc118003308c",
          "body": "Co-authored-by: lesichkovm <7744963+lesichkovm@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: update dependencies to latest versions",
          "author_name": "google-labs-jules[bot]",
          "author_login": "google-labs-jules[bot]",
          "committed_at": "2026-07-26T03:46:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "63cdffc5f598ef2eeaa89da76bfa17b12d07ee78",
          "body": "…amples",
          "is_bot": false,
          "headline": "docs: add media handler documentation with configuration and usage ex…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-07-24T07:44:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "64833c84472bc8dd98d072e7611ccc05418f5e1c",
          "body": "…urable prefix support",
          "is_bot": false,
          "headline": "refactor: move ServeURL from Media entity to MediaHandler with config…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-07-24T07:43:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f378e33656078a540a01d5d7d2d0efd94543b2e",
          "body": "… redirect support",
          "is_bot": false,
          "headline": "feat: add HTTP handler for serving blog media files with data URI and…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-07-24T06:49:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e1e6021e13c9acb90d80cc5171bb8923628a62f6",
          "body": "…of string concatenation",
          "is_bot": false,
          "headline": "fix: use separate arguments for OrderBy column and direction instead …",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-07-23T08:49:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d726de883bb5e2e7a5d807eb6cf10b4d447d53d2",
          "body": "…ults",
          "is_bot": false,
          "headline": "fix: reset limit and offset in count queries to prevent incorrect res…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-07-22T05:19:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3fb07a26404aa1340a92b66010ac09857ecf6f42",
          "body": "…d error handling\n\n- Upgrade github.com/dracory/neat from v0.27.0 to v0.31.0\n- Upgrade modernc.org/sqlite from v1.53.0 to v1.54.0\n- Upgrade golang.org/x/crypto from v0.53.0 to v0.54.0\n- Upgrade golang.org/x/sys from v0.46.0 to v0.47.0\n- Upgrade golang.org/x/text from v0.38.0 to v0.40.0\n- Upgrade golang.org/x/exp from v0.0.0-20260611194520-c48552f49976 to v0.0.0-20260718201538-764159d718ef\n- Upgrade github.com/mattn/go-isatty from v0.0.",
          "is_bot": false,
          "headline": "chore: upgrade neat to v0.31.0 and sqlite to v1.54.0, improve test an…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-07-19T20:58:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6752380c1ea31a4f52d8dc124e04165b3256bdc1",
          "body": "- Rename post file columns to media columns (COLUMN_URL → COLUMN_MEDIA_URL, COLUMN_FILE_TYPE → COLUMN_MEDIA_TYPE)\n- Add MEDIA_STATUS_DRAFT, MEDIA_STATUS_ACTIVE, MEDIA_STATUS_INACTIVE constants\n- Create MediaInterface with methods for ID, EntityID, Title, Description, Memo, URL, Type, Size, Extension, Sequence, Status, timestamps, and metadata operations\n- Implement mediaImplementation using neat ORM traits (ShortID, SoftDeletesMaxDate, Cre",
          "is_bot": false,
          "headline": "feat: add media entity for file attachments with metadata support",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-06-28T05:11:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "19b0c00e746f0d6cdaec0d777fe61b82d0edafc7",
          "body": "- Add COLUMN_URL, COLUMN_FILE_TYPE, COLUMN_FILE_SIZE, COLUMN_FILE_EXTENSION constants\n- Add PostFileTableName field to NewStoreOptions with default \"blog_post_file\"\n- Create PostFileInterface with methods for ID, PostID, Name, URL, Type, Size, Extension, Sequence, timestamps\n- Implement postFileImplementation using neat ORM traits (ShortID, SoftDeletesMaxDate, CreatedAt, UpdatedAt)\n- Add NewPostFile() and NewPostFileFromExistingData() factory functions",
          "is_bot": false,
          "headline": "feat: add post file entity for media attachments",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-06-27T11:30:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bec259e75f685d83386e40c45e1f78799b1eb782",
          "body": "…defaults\n\n- Upgrade github.com/dracory/neat from v0.26.0 to v0.27.0\n- Upgrade modernc.org/sqlite from v1.52.0 to v1.53.0\n- Upgrade modernc.org/libc from v1.73.4 to v1.73.5\n- Add default values to post table columns in MigrateUp()\n- Change COLUMN_TITLE from Text to String(255)\n- Change COLUMN_FEATURED from Boolean to String(3) with default \"no\"\n- Set COLUMN_STATUS default to POST_STATUS_DRAFT\n- Set COLUMN_PUBLISHED_AT default to neat.Null",
          "is_bot": false,
          "headline": "chore: upgrade neat to v0.27.0 and sqlite to v1.53.0, improve schema …",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-06-27T01:53:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5eec143f24244e37942515460f0e6686b4fd91a8",
          "body": null,
          "is_bot": false,
          "headline": "chore: upgrade neat to v0.26.0",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-06-21T00:46:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cfd628fc00fea95a2f1c7aa06b87dba738e04c96",
          "body": "…78244\n\nUpdate neat to v0.25.0",
          "is_bot": false,
          "headline": "Merge pull request #1 from dracory/update-neat-v0.25.0-81253442257410…",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2026-06-20T23:02:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11d3f9a640064b35744e408e5adfb859b221d610",
          "body": "Updated the neat dependency to version v0.25.0 and ran go mod tidy to update go.sum. Verified that all tests pass with the new version.\n\nCo-authored-by: lesichkovm <7744963+lesichkovm@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build: update github.com/dracory/neat to v0.25.0",
          "author_name": "google-labs-jules[bot]",
          "author_login": "google-labs-jules[bot]",
          "committed_at": "2026-06-20T23:00:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e0a3f9a2b6ac2573012bfd114a31a98d566360d5",
          "body": "…ORM features\n\n- Upgrade github.com/dracory/neat from v0.15.0 to v0.23.0\n- Remove github.com/dracory/versionstore v1.3.0 dependency\n- Embed orm.ShortID and soft_delete.SoftDeletesMaxDate in versioningImplementation\n- Add db struct tags to versioningImplementation fields for ORM mapping\n- Update buildVersioningQuery() to use Model() with Select(\"*\") for automatic soft delete handling\n- Update buildPostQuery() to explicitly set table",
          "is_bot": false,
          "headline": "chore: upgrade neat to v0.23.0 and refactor versioning to use neat's …",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-06-20T11:15:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "59b4829fd5fdbc571e93251adb0a76c9d489b73e",
          "body": "…ally\n\n- Remove github.com/dracory/versionstore dependency from go.mod\n- Add COLUMN_ENTITY_ID and COLUMN_ENTITY_TYPE constants\n- Replace versioningStore field with versioningTableName in storeImplementation\n- Implement versioning table migration directly in MigrateUp() and MigrateDown()\n- Reimplement all versioning methods (Create, Delete, FindByID, List, SoftDelete, Update) using neat database operations\n- Add buildVersioningQuery() helper method",
          "is_bot": false,
          "headline": "chore: remove versionstore dependency and implement versioning intern…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-06-20T07:31:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "49b03affeca70fd3e507f66977968de48cad55c6",
          "body": null,
          "is_bot": false,
          "headline": "chore: upgrade versionstore to v1.3.0",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-06-15T18:57:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb9fc17d714641e257cec5039ea87ee8dfc4a899",
          "body": "…oft delete test",
          "is_bot": false,
          "headline": "test: fix versioning query method call from SetEntityID to SetID in s…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-06-15T18:54:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce41c4d4530c77c7288d5c5ef1a7ff66b338f229",
          "body": "- Upgrade github.com/dracory/versionstore from v1.1.0 to v1.2.0\n- Upgrade modernc.org/libc from v1.73.3 to v1.73.4\n- Remove unused github.com/doug-martin/goqu/v9 and github.com/dracory/database dependencies\n- Update CreatedAt() to GetCreatedAt() in mcp/mcp.go\n- Update SoftDeletedAt() to GetSoftDeletedAt() in store_versioning_test.go\n- Clean up go.sum with updated dependency versions",
          "is_bot": false,
          "headline": "chore: upgrade versionstore to v1.2.0 and update method calls",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-06-15T18:45:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0ad5decc01d240df3d4bea40440199eb9f85c6b1",
          "body": "…t.go\n\n- Delete post_implementation.go containing postImplementation struct and methods\n- Consolidate post implementation into post.go for better code organization\n- No functional changes, pure file reorganization",
          "is_bot": false,
          "headline": "refactor: move post implementation from post_implementation.go to pos…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-06-15T17:58:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e7ecfae6dc13d9223fe6a2fedd88a3f6d1e2c3fc",
          "body": "…package with neat\n\n- Add NULL_DATETIME and MAX_DATETIME constants for datetime boundary values\n- Upgrade go version from 1.26 to 1.26.3\n- Replace github.com/dracory/dataobject v1.7.0 with github.com/dracory/neat v0.15.0\n- Upgrade modernc.org/sqlite from v1.50.1 to v1.52.0\n- Upgrade golang.org/x/crypto from v0.52.0 to v0.53.0\n- Upgrade golang.org/x/sys from v0.45.0 to v0.46.0\n- Upgrade golang.org/x/text from v0.37.0 to v0.38.0\n- Upgrade modern",
          "is_bot": false,
          "headline": "chore: add datetime constants, upgrade dependencies, and replace uid …",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-06-15T16:30:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7cebda12199d621ddf78c903cc7c4ff58e61accf",
          "body": "…e schema package\n\n- Upgrade github.com/dracory/sb from v0.24.0 to v0.26.0\n- Upgrade golang.org/x/crypto from v0.51.0 to v0.52.0\n- Upgrade golang.org/x/sys from v0.44.0 to v0.45.0\n- Upgrade modernc.org/libc from v1.72.3 to v1.72.4\n- Refactor migrateSlugColumn() to use schema.TableColumnExists() and schema.TableColumnAdd()\n- Replace manual SQL generation with schema package methods for column operations\n- Simplify column existence",
          "is_bot": false,
          "headline": "chore: upgrade sb to v0.26.0 and refactor slug column migration to us…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-24T22:21:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b856e87da44caa198ffb915e1beede72f3e92d7",
          "body": "…ation methods\n\n- Upgrade github.com/dracory/versionstore from v1.0.0 to v1.1.0\n- Add context.Context parameter to MigrateUp() and MigrateDown() methods\n- Replace Exec() calls with ExecContext() in migration methods\n- Update NewStore() to pass context.Background() to MigrateUp()\n- Update versioning store migration calls to include context parameter",
          "is_bot": false,
          "headline": "chore: upgrade versionstore to v1.1.0 and add context support to migr…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-19T06:29:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1eca1c8cf9e244062e7c2b4d7134fd75561ba5ab",
          "body": "- Upgrade github.com/dracory/versionstore from v0.9.0 to v1.0.0\n- Upgrade golang.org/x/tools from v0.44.0 to v0.45.0\n- Rename AutoMigrate() to MigrateUp() and add optional transaction parameter\n- Add MigrateDown() method for dropping all blog store tables\n- Add SQL drop table methods for post, taxonomy, term, and term relation tables\n- Add getter/setter methods for all table names (post, taxonomy, term, term relation)\n- Update",
          "is_bot": false,
          "headline": "chore: upgrade versionstore to v1.0.0 and refactor migration methods",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-19T05:53:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f3c46e50a284fcdc93b30f2dbd845e7044d134e9",
          "body": "- Upgrade modernc.org/sqlite from v1.50.0 to v1.50.1\n- Add MarkAsDirty() method to PostInterface, TaxonomyInterface, TermInterface, and TermRelationInterface\n- Extend MarkAsNotDirty() to accept optional column parameters for selective dirty state management\n- Update all implementations to support column-specific dirty tracking via variadic parameters\n- Add comprehensive documentation for dirty tracking methods across all interfaces",
          "is_bot": false,
          "headline": "feat: add selective column dirty tracking and upgrade SQLite dependency",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-13T04:00:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4256af2dfcd257719951a80629ec1d085520426d",
          "body": "…sting\n\n- Remove github.com/stretchr/testify dependency from go.mod\n- Replace testify assertions with standard library if/t.Errorf patterns in id_helpers_test.go\n- Replace testify assertions with standard library if/t.Errorf patterns in mcp/content_type_test.go\n- Update go.sum to remove testify and related transitive dependencies\n- Clean up outdated dependency versions in go.sum (golang.org/x/crypto, golang.org/x/mod, etc.)",
          "is_bot": false,
          "headline": "chore: remove testify dependency and replace with standard library te…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-09T17:43:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f6c15e324e5e628a136376f97ea31ecb019b7508",
          "body": null,
          "is_bot": false,
          "headline": "test: add comprehensive versioning store test suite",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-09T17:39:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "91d8e210d07662c62cfb2f03cfbf8ff404f0f138",
          "body": "… for precise JSON filtering\n\n- Rename MetaContains to MetaEquals in PostQueryOptions for clarity on equality checks\n- Add MetaArrayContains filter for checking if JSON array fields contain specific values\n- Update postQuery() to implement MetaEquals with driver-specific JSON extraction\n- Add MetaArrayContains implementation with proper JSON array contains logic for SQLite, MySQL, and PostgreSQL\n- Fix MySQL JSON_CONTAINS syntax in",
          "is_bot": false,
          "headline": "refactor: rename MetaContains to MetaEquals and add MetaArrayContains…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-03T12:36:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2def96e8b4322b54d37a5c3ccdd4f7133dcb35b",
          "body": "- Add Slug filter to PostQueryOptions for slug-based queries\n- Add PostFindBySlug() method to retrieve posts by slug\n- Implement slug filtering in postQuery() using COLUMN_SLUG equality check\n- Add comprehensive test suite for PostFindBySlug with existent and non-existent slugs",
          "is_bot": false,
          "headline": "feat: add PostFindBySlug method for retrieving posts by slug",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-03T06:14:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc8f72c7d825ca8197b179e24e04ca0855cc2d3f",
          "body": "… references\n\n- Move META_KEY_OLD_SLUGS constant from post_implementation.go to constants.go\n- Rename constant value from \"_wp_old_slug\" to \"_old_slugs\"\n- Update all JSON path references in postQuery() to use META_KEY_OLD_SLUGS constant\n- Apply constant usage across SQLite, MySQL, and PostgreSQL driver implementations",
          "is_bot": false,
          "headline": "refactor: move META_KEY_OLD_SLUGS constant to constants.go and update…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-02T22:04:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "941614ac6f570cb3225bf4e1ff139e4681f7e558",
          "body": "…me parameter\n\n- Remove duplicate table name parameter from TableColumnAdd method call\n- Table name already specified in Column struct, no need to pass separately",
          "is_bot": false,
          "headline": "refactor: simplify TableColumnAdd call by removing redundant table na…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-02T16:55:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c34bbe80e704ab83266a42a49b8e2b5dbc42b43",
          "body": "…tion\n\n- Add error handling for sql.ErrNoRows case when checking column existence\n- Set exists to false when no rows returned instead of failing migration\n- Add error logging for non-ErrNoRows database errors",
          "is_bot": false,
          "headline": "fix: handle sql.ErrNoRows in slug column existence check during migra…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-02T16:47:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f585d6b2c50bb6bf1c99b8f5667dbe11cc6e0ada",
          "body": "…g history\n\n- Add OldSlug filter to PostQueryOptions for old slug-based queries\n- Add PostFindByOldSlug() method to retrieve posts by old slug from history\n- Implement old slug filtering in postQuery() with driver-specific JSON array contains logic\n- Add comprehensive test suite for PostFindByOldSlug with existent and non-existent slugs",
          "is_bot": false,
          "headline": "feat: add PostFindByOldSlug method for redirect handling with old slu…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-02T16:28:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "05693a99690c6a34787cd38d0be9dc8088397355",
          "body": "- Add COLUMN_SLUG to post table schema with VARCHAR(255) type\n- Add SetSlug() method to PostInterface and implementation\n- Modify GetSlug() to return custom slug if set, otherwise auto-generate from title\n- Initialize slug to empty string in NewPost() defaults\n- Add PostFindBySlug() method to retrieve posts by slug\n- Add Slug filter to PostQueryOptions for slug-based queries\n- Add old slug history tracking with GetOldSlugs(), SetOldSlugs(), and AddOldSlug()",
          "is_bot": false,
          "headline": "feat: add custom slug support and old slug history tracking for posts",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-02T16:24:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4a0333d945a7bd43253ae122b69e4c95d365a513",
          "body": "… direct key access\n\n- Change JSON path from `$..key` to `$.key` for both SQLite and MySQL drivers\n- Add debug logging for SQL parameters in PostList method\n- Add comprehensive test suite for MetaContains filtering with multiple metadata scenarios",
          "is_bot": false,
          "headline": "fix: correct JSON path syntax in MetaContains query from recursive to…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-02T12:32:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "164b26a0f65f566ddd581cb788d933810ad0666b",
          "body": "…sequence management\n\n- Add PostAddTerm() method to append terms at the end of the sequence automatically\n- Add PostMoveTermTo() method to reorder terms by moving to a specific sequence position\n- Add internal helper methods: postMaxSequence(), postTermList(), postTermUpdateSequence()\n- Add comprehensive test suite covering sequence operations, edge cases, and error handling\n- Implement in-memory reordering algorithm with bubble",
          "is_bot": false,
          "headline": "feat: add PostAddTerm and PostMoveTermTo methods for simplified term …",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-08T04:56:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d76729a874ba7ce5dfbbe2d231a585bc3a6c038",
          "body": "…CRUD naming conventions\n\n- Rename PostTermAddAt to PostInsertTermAt to align with Insert/Remove pattern\n- Rename PostTermRemove to PostRemoveTerm to match object-action naming style\n- Update all method calls in implementation, tests, and MCP integration\n- Update interface documentation to reflect new method names",
          "is_bot": false,
          "headline": "refactor: rename post-term relationship methods for consistency with …",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-08T04:29:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5867155b6d616152bbee6a9dd57f90ce945a48f8",
          "body": "…rsions",
          "is_bot": false,
          "headline": "deps: update dracory dependencies and modernc.org/sqlite to latest ve…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-08T04:22:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f225a1e120ff0c68959e0352c4153863d6d9ea0",
          "body": null,
          "is_bot": false,
          "headline": "test: add comprehensive versioning store test suite",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-08T04:02:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "65fd91fc14c6f69ed77e303de0e49ed5ad74e325",
          "body": "…ns, and context utilities\n\n- Add package-level documentation for PostInterface describing main content entity features\n- Document all PostInterface methods with detailed comments for identity, author, content, SEO, status, timestamps, metadata, versioning, and taxonomy operations\n- Add method documentation for content type checks, status checks, and timestamp conversions\n- Document PostQueryOptions struct and all filtering, sorting, and pagination fields",
          "is_bot": false,
          "headline": "docs: add comprehensive godoc comments to post interface, query optio…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-08T03:26:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5eaa0637fa75d0567af6ec74e83b9d2439f87345",
          "body": "…aces, and store creation\n\n- Add package-level documentation for NewStore constructor and NewStoreOptions struct\n- Document versioning internal interfaces (versioningMarshalToInterface, versioningDataInterface)\n- Add method documentation for all versioning operations (create, delete, find, list, update, track)\n- Document TaxonomyInterface, TermInterface, and TermRelationInterface with detailed method comments\n- Add documentation",
          "is_bot": false,
          "headline": "docs: add comprehensive godoc comments to versioning, taxonomy interf…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-08T03:22:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6dcb6771faf6c69a508a8105c7bd7d8795a177f1",
          "body": "…on files\n\n- Add package-level documentation for NewPost and NewPostFromExistingData constructors\n- Document postImplementation struct and its DataObject embedding\n- Add method documentation for all post getters, setters, and helper methods\n- Document slug generation, editor types, content types, and status checks\n- Add versioning serialization/deserialization method documentation\n- Document metadata operations (GetMeta, SetMeta, GetMetas",
          "is_bot": false,
          "headline": "docs: add comprehensive godoc comments to post and store implementati…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-08T03:20:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25a6cc077de60b4572de016cab2819a92f1cfb0b",
          "body": "…D method\n\n- Rename PostTermAdd to PostTermAddAt to clarify sequence parameter purpose\n- Rename PostTerms to TermListByPostID for clearer method naming convention\n- Add PostListByTermID method to retrieve posts associated with a term\n- Rename taxonomy_store.go to store_implementation_taxonomy.go for consistency\n- Add comprehensive taxonomy store test suite (641 lines)\n- Update README example to use renamed TermListByPostID method",
          "is_bot": false,
          "headline": "refactor: rename taxonomy methods for clarity and add PostListByTermI…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-08T03:08:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b2bf10149570eeb5884ebaa04ca7ee02203985fa",
          "body": "- Add COLUMN_SEQUENCE constant (renamed from COLUMN_TERM_SEQUENCE for consistency)\n- Add sequence column to term table schema with INTEGER type\n- Add GetSequence() and SetSequence() methods to TermInterface and termImplementation\n- Initialize sequence to 0 in NewTerm() defaults\n- Update TermRelation to use COLUMN_SEQUENCE constant instead of COLUMN_TERM_SEQUENCE\n- Fix parseInt() to handle negative integers correctly\n- Add comprehensive",
          "is_bot": false,
          "headline": "feat: add sequence field to Term model for ordering hierarchical terms",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-07T19:48:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bd2c059f6b782b97f35336e3dd4fe17df69d4208",
          "body": "…omy feature state\n\n- Add TaxonomyEnabled() method to StoreInterface\n- Implement TaxonomyEnabled() in storeImplementation to return taxonomyEnabled field\n- Enable runtime checking of taxonomy feature availability",
          "is_bot": false,
          "headline": "feat: add TaxonomyEnabled method to StoreInterface for checking taxon…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-07T17:12:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b59d4931503b458056fa14889af4a3dabe4f6ba5",
          "body": "…taxonomy system\n\n- Add Installation section with go get command\n- Add Setup section with NewStore configuration example\n- Add Usage section with post creation and listing examples\n- Add Taxonomy System section documenting three-table architecture\n- Document hierarchical terms, cached counts, slugs, and ordered relations features\n- Add taxonomy usage examples for creating taxonomies, terms, and post-term relationships\n- Remove detailed",
          "is_bot": false,
          "headline": "docs: add comprehensive README sections for installation, usage, and …",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-07T07:24:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3b016be7221848ac73fa866a365f6bbd7de91ab5",
          "body": "… consistency\n\n- Rename sqlCreateTable method to sqlCreatePostTable to explicitly indicate it creates the post table\n- Update AutoMigrate to call sqlCreatePostTable instead of sqlCreateTable\n- Update method documentation to reflect new name",
          "is_bot": false,
          "headline": "refactor: rename sqlCreateTable to sqlCreatePostTable for clarity and…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-07T07:19:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3ad46f609a48015e26b93e5c75267353a54e756e",
          "body": "- Add TaxonomyEnabled field to NewStoreOptions for opt-in taxonomy feature\n- Add taxonomyEnabled field to storeImplementation to track taxonomy state\n- Conditionally create taxonomy tables in AutoMigrate only when enabled\n- Add taxonomy enabled checks to all taxonomy, term, and term relation store methods\n- Return descriptive errors when taxonomy methods are called while disabled\n- Update all taxonomy tests to explicitly enable",
          "is_bot": false,
          "headline": "feat: add TaxonomyEnabled flag to conditionally enable taxonomy system",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-07T07:07:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "13c24eab592642ac0d8713c75786e94ffc0b172d",
          "body": "- Rename post_test.go to post_implementation_test.go for consistency with implementation file naming\n- Add COLUMN_UPDATED_AT to taxonomy, term, and term_relation table schemas\n- Add comprehensive test suite for taxonomy system (681 lines)\n- Test taxonomy, term, and term relation domain models with defaults, setters, and slug normalization\n- Test store integration for create, find, list, count, update, and delete operations\n- Test post-term relationships and hierarchical term structures",
          "is_bot": false,
          "headline": "refactor: rename test files and add updated_at column to taxonomy tables",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-07T07:03:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b86de21ffdf5451025e42c0a93ac3bf7f226a656",
          "body": "… design proposal\n\n- Add database column constants for taxonomy tables (count, description, name, parent_id, post_id, slug, taxonomy_id, term_id, sequence)\n- Add pre-defined taxonomy type constants (TAXONOMY_CATEGORY, TAXONOMY_TAG)\n- Add detailed taxonomy system proposal document outlining three-table architecture\n- Document implementation plan covering domain models, store layer, database schema, post integration, MCP tools, and",
          "is_bot": false,
          "headline": "feat: add taxonomy system foundation with constants and comprehensive…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-07T06:50:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2caf2b5eb519ee7a297284884f77a63fb03b672c",
          "body": "… interface naming convention\n\n- Replace ContentType() with GetContentType() in all test files\n- Replace Editor() with GetEditor() in test assertions\n- Replace Meta() with GetMeta() in test validations\n- Replace ID() with GetID() in test lookups\n- Replace Title(), Status(), Featured(), Content() with Get-prefixed versions\n- Update all Post getter methods in post_implementation.go to use Get prefix\n- Update Slug() to GetSlug() and adjust implementation",
          "is_bot": false,
          "headline": "test: update Post method calls to use Get prefix for consistency with…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-07T06:34:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b48fc2e51d2b4a2ca87cfd59ddf0e2cadfa7b96",
          "body": "…sed architecture\n\n- Rename store struct to storeImplementation to distinguish from StoreInterface\n- Update NewStore to instantiate storeImplementation instead of store\n- Change all method receivers from *store to *storeImplementation\n- Update interface implementation verification comment and variable declaration\n- Update test type assertion to expect *storeImplementation concrete type\n- Maintain all existing functionality while enabling",
          "is_bot": false,
          "headline": "refactor: rename store struct to storeImplementation for interface-ba…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-07T05:35:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ff124154f98ad213f5626887caef99bcc11720a8",
          "body": "…d architecture\n\n- Rename Post struct to postImplementation to distinguish from PostInterface\n- Update NewPost and NewPostFromExistingData to return PostInterface instead of concrete type\n- Change all method receivers from *Post to *postImplementation\n- Update interface implementation verification comment and variable declaration\n- Maintain all existing functionality while enabling interface-based polymorphism",
          "is_bot": false,
          "headline": "refactor: rename Post struct to postImplementation for interface-base…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-07T05:31:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "165fd2951e93fd17ae9fc8ca78997e8ba46a3e2a",
          "body": "…d of concrete type\n\n- Add PostInterface to define contract for blog post operations\n- Update all Post setter methods to return PostInterface instead of *Post\n- Expose DataObject methods (Data, DataChanged, Get, Set, Hydrate, IsDirty, MarkAsNotDirty) through Post\n- Update store methods to accept and\n[…]\nost\n- Update MCP postToMap to accept PostInterface parameter\n- Modify PostList to return []PostInterface instead of []Post\n- Update PostFindByID, PostFindPrevious, PostFindNext to return PostInterface",
          "is_bot": false,
          "headline": "refactor: change Post method receivers to return PostInterface instea…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-07T05:28:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "21d0231535cad894c41d843ae12211490bc64fdf",
          "body": "… descent for nested key support",
          "is_bot": false,
          "headline": "refactor: switch MetaContains JSON path from exact match to recursive…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-03-28T23:28:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "55960d4379c6e45f463fdc5b248c41a5a84af6de",
          "body": "…-database support\n\n- Add MetaContains field to PostQueryOptions for filtering posts by meta JSON key-value pairs\n- Implement database-specific JSON extraction in postQuery method\n- Support SQLite (json_extract), MySQL (JSON_UNQUOTE/JSON_EXTRACT), and PostgreSQL (->>) syntax\n- Add documentation and usage example for MetaContains field",
          "is_bot": false,
          "headline": "feat: add MetaContains filter for JSON-based post querying with cross…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-03-28T23:22:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "383e02ede6c99faca0006468889dc0897b273fe8",
          "body": "- Upgrade Go version from 1.25 to 1.26\n- Update sb from v0.15.0 to v0.20.0\n- Update versionstore from v0.5.0 to v0.6.0\n- Update samber/lo from v1.52.0 to v1.53.0\n- Update modernc.org/sqlite from v1.44.3 to v1.47.0\n- Update various indirect dependencies (crypto, sys, text, mod, tools, etc.)\n- Refactor sqlCreateTable to return error alongside SQL string\n- Update AutoMigrate to handle sqlCreateTable error return",
          "is_bot": false,
          "headline": "chore: upgrade Go to 1.26 and update dependencies to latest versions",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-03-21T06:24:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "97c38f7090a59af6318f30ecb8a49a5d8ff7ecfa",
          "body": "…st lookups\n\n- Add GenerateShortID, ShortenID, UnshortenID, IsShortID, and NormalizeID helper functions\n- Implement Crockford Base32 encoding for shortened IDs (9-21 chars vs 32+ chars)\n- Update NewPost to use GenerateShortID instead of uid.HumanUid\n- Modify PostFindByID to normalize IDs and support both short and long ID lookups\n- Add automatic ID shortening in MCP postToMap for API responses\n- Add comprehensive tests for all ID",
          "is_bot": false,
          "headline": "feat: add ID shortening helpers and automatic ID normalization for po…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-02-04T21:15:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8303cff8d6ca2f45a9c77980de327b548bc89dab",
          "body": null,
          "is_bot": false,
          "headline": "chore: upgrade dependencies to latest versions",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-02-04T21:14:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "253c94e593eea3e931582ffa84c628a9097589e6",
          "body": "Removed Gitpod link from the README.",
          "is_bot": false,
          "headline": "Remove Gitpod link from README",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2026-01-16T18:17:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fdc6545691aba4174456d8d231c6fee8296b4024",
          "body": "…mestamp on restore",
          "is_bot": false,
          "headline": "refactor: exclude timestamp fields from versioning and auto-update ti…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-01-16T18:16:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3cff1532b878663230870adf0037921e6c8c515e",
          "body": "…ned content\n\n- Implement UnmarshalFromVersioning to deserialize JSON content back into Post entity\n- Parse versioned data map and restore fields using Set method\n- Add error handling for JSON unmarshaling failures",
          "is_bot": false,
          "headline": "feat: add UnmarshalFromVersioning method to Post for restoring versio…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-01-15T08:31:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "244abd96def11c947033291422752600e5cb3dc5",
          "body": "- Move sortOrder initialization and OrderBy handling inside the Limit > 0 conditional block\n- Ensure sorting is only applied when pagination is active\n- Fix indentation to match conditional scope",
          "is_bot": false,
          "headline": "refactor: move sorting logic inside limit condition block in postQuery",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-01-14T20:21:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d9d4f21dab80c56da363ec4f32d12e06b76c45c1",
          "body": "…stUpdate methods\n\n- Remove manual version creation logic from toolPostUpsert in MCP handler\n- Add automatic version tracking in PostCreate and PostUpdate using versioningTrackEntity\n- Update tests to expect version creation on both create and update operations (1 + N versions instead of N)\n- Fix test assertions to verify all expected version titles are present without assuming ordering\n- Remove redundant manual version creation from",
          "is_bot": false,
          "headline": "refactor: move version creation from post_upsert to PostCreate and Po…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-01-10T15:48:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c29be06f44c3256d4c5039083635c67148b3f53b",
          "body": "…content extraction\n\n- Add versioningMarshalToInterface and versioningDataInterface for flexible entity serialization\n- Implement versioningContentFromEntity to extract versionable content from entities, excluding timestamp fields\n- Add versioningCreateIfChanged to prevent duplicate versions by comparing with last version\n- Implement versioningTrackEntity as unified method for tracking entity changes\n- Add comprehensive error handling for nil",
          "is_bot": false,
          "headline": "feat: add internal versioning helper methods for entity tracking and …",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-01-10T15:46:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39272d78ed5fee5bb8c3940a0f42492377a41a3d",
          "body": null,
          "is_bot": false,
          "headline": "chore: upgrade dependencies to latest versions",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-01-10T06:07:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4290d00a023ed8cb53565bfab122bdcb7a9ce254",
          "body": "…story\n\n- Add post_versions tool to MCP tools list with support for id, limit, order_by, and sort_order parameters\n- Implement toolPostVersions method to query and return version history for blog posts\n- Add automatic version creation in toolPostUpsert before updating posts when versioning is enabled\n- Update blog_schema tool to document post_versions usage and versioning behavior\n- Add comprehensive tests for version creation, retrieval, and integration",
          "is_bot": false,
          "headline": "feat: add post_versions tool to MCP handler for retrieving version hi…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-01-09T08:49:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "828f9224d9a1409d2b4cbbd36b4f926f4d78d429",
          "body": "…sert tool",
          "is_bot": false,
          "headline": "refactor: consolidate post_create and post_update into single post_up…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-01-09T08:43:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c8e7453770a901c361ca14f19ba593dbdf79cea3",
          "body": null,
          "is_bot": false,
          "headline": "feat: add versioning support",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-01-09T07:28:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e00b8ac5f5fc459526dc8db4977a53693c1d863b",
          "body": "…ext options",
          "is_bot": false,
          "headline": "feat: add content_type field support with markdown, HTML, and plain t…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-01-09T02:41:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "940875b9f99792ce406717c6ffeb9a6c74f60348",
          "body": "…t management",
          "is_bot": false,
          "headline": "docs: add MCP (Model Context Protocol) handler for LLM-based blog pos…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-01-08T18:02:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "12250a9d7bb3418d5d526f4209688691a3934ba2",
          "body": null,
          "is_bot": false,
          "headline": "chore: update indirect dependencies in go.mod and go.sum",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2025-12-06T05:31:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7de394752ae50fc1c20ad65e3a71ec25e3251dcf",
          "body": "…istency\n\n- Rename constant COLUMN_DELETED_AT to COLUMN_SOFT_DELETED_AT\n- Update Post methods: DeletedAt() to SoftDeletedAt(), DeletedAtCarbon() to SoftDeletedAtCarbon(), and SetDeletedAt() to SetSoftDeletedAt()\n- Update all references in NewPost(), PostSoftDelete(), postQuery(), and tests to use new naming convention",
          "is_bot": false,
          "headline": "refactor: rename COLUMN_DELETED_AT to COLUMN_SOFT_DELETED_AT for cons…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2025-11-21T10:54:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0622f430c05c272e20603c758702b0cc2efcd8d",
          "body": "…ation\n\n- Add post_test.go with tests for NewPost defaults, meta handling, status helpers, and slug/image methods\n- Add store_implementation_test.go tests for PostList, PostCount, PostTrash, PostUpdate, PostSoftDeleteByID, PostDeleteByID, PostFindPrevious, PostFindNext, and query options including search, ordering, and WithDeleted flag",
          "is_bot": false,
          "headline": "test: add comprehensive unit tests for Post model and Store implement…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2025-11-21T10:45:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "090803fbafb0d34362593e842f3641ef7916d4de",
          "body": null,
          "is_bot": false,
          "headline": "chore: move dracory/database from indirect to direct dependency",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2025-11-21T10:40:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4addc81200eb0def20c93258388bb1b954ee945b",
          "body": "…ade dependencies\n\n- Rename consts.go to constants.go and blogpost.go to post.go for consistent naming\n- Add context.Context parameter to all store interface methods\n- Replace sb.NewDatabase with dracory/database package for query execution\n- Upgrade dracory/sb from v0.12.0 to v0.15.0\n- Upgrade modernc.org/sqlite from v1.40.0 to v1.40.1\n- Upgrade golang.org/x/crypto from v0.44.0 to v0.45.0\n- Update tests to use in-memory database an",
          "is_bot": false,
          "headline": "refactor: rename files for consistency, add context support, and upgr…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2025-11-21T10:39:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9eaffe5ae0c13ba78afb5aaa23a1ae621bad80af",
          "body": "…ng convention",
          "is_bot": false,
          "headline": "refactor: rename Post.go to blogpost.go for consistent lowercase nami…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2025-11-21T10:29:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "934a7193f2981ff1edf2df573949b32bb60e18d0",
          "body": "…/mysql, stretchr/testify, and modernc.org/sqlite",
          "is_bot": false,
          "headline": "chore: upgrade dependencies including dracory packages, go-sql-driver…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2025-11-17T08:23:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "106bb9588b482a1fc86dac585971524b37a7635f",
          "body": "…ackages, carbon/v2, samber/lo, and modernc.org/sqlite",
          "is_bot": false,
          "headline": "chore: upgrade Go to 1.25 and update dependencies including dracory p…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2025-11-17T08:21:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "082d5616073316965861bb4203252d691e6c1b2c",
          "body": null,
          "is_bot": false,
          "headline": "chore: upgrade dependencies including carbon/v2 and sqlite packages",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2025-09-01T18:25:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "08c69396660233271742e31ede2d168d93347bbc",
          "body": "…JSON handling",
          "is_bot": false,
          "headline": "refactor: migrate from gouniverse to dracory dependencies and update …",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2025-09-01T18:24:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fab3aa78ea72173bd310f0d1862ac7161f7f799b",
          "body": null,
          "is_bot": false,
          "headline": "updated dependencies",
          "author_name": "lesichkovm",
          "author_login": "lesichkovm",
          "committed_at": "2025-04-01T18:50:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d0a7a4e3a734c2cef24b26a9c0b3e6d9bc13990",
          "body": null,
          "is_bot": false,
          "headline": "updated dependencies",
          "author_name": "lesichkovm",
          "author_login": "lesichkovm",
          "committed_at": "2025-03-14T06:18:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9c67649f19e3b74561498574b1fad20e14d5c38f",
          "body": null,
          "is_bot": false,
          "headline": "updated interface",
          "author_name": "lesichkovm",
          "author_login": "lesichkovm",
          "committed_at": "2025-03-14T06:14:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6f79b5662091ccde7ccc56b06bcc5a8bafef87cd",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'main'",
          "author_name": "Sinevia",
          "author_login": "Sinevia",
          "committed_at": "2024-11-28T17:50:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "43212737210d23b817c081cb189d007ab839ab6d",
          "body": null,
          "is_bot": false,
          "headline": "upgraded carbon",
          "author_name": "Sinevia",
          "author_login": "Sinevia",
          "committed_at": "2024-11-28T17:46:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2fe460356c43ff381a42687535ed64c2073ee56d",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2024-11-04T19:25:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb1ef6987df02172b01a70a2ce7e8f4aafadf1bb",
          "body": null,
          "is_bot": false,
          "headline": "Update LICENSE",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2024-11-04T19:23:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16eebd50a20b7f829d97db11071b2e0ba5346f54",
          "body": null,
          "is_bot": false,
          "headline": "updated dependencies",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2024-11-02T20:19:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c75bd8cab88512ae79be789d770bde9c43b4f9d6",
          "body": null,
          "is_bot": false,
          "headline": "updated soft delete logic to use max date time",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2024-11-02T20:15:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d357d69cfa723d041ca24eae2734d6d59acb55d",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2024-10-31T06:58:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "92a5255dcf1cc783fb2a2e270179f88479cb86c4",
          "body": null,
          "is_bot": false,
          "headline": "Create LICENSE_COMMERCIAL.txt",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2024-10-31T06:57:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2d915de93ab99b131a41e5eabc26bc2ce545069d",
          "body": null,
          "is_bot": false,
          "headline": "added new editor",
          "author_name": "Sinevia",
          "author_login": "Sinevia",
          "committed_at": "2024-10-31T02:26:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "559385817c663cc0aa565c0c31eb7c073d99a444",
          "body": null,
          "is_bot": false,
          "headline": "updated search to be case insensitive",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2024-09-10T06:39:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e0e3a869d09dcf5b95eb64385d9ad1d55e9622e1",
          "body": null,
          "is_bot": false,
          "headline": "updated dependencies",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2024-09-08T18:38:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "018706f20ce4da5c3a5e1dfdcea737e2e5ed0b37",
          "body": null,
          "is_bot": false,
          "headline": "Update tests.yml",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2024-09-08T18:35:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d9b7506d2d47be3d8e94fd8643f4b4e02d58237",
          "body": null,
          "is_bot": false,
          "headline": "added search option",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2024-09-08T18:31:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "59f1e52623b930ba8b217fe20ba29244ae765594",
          "body": null,
          "is_bot": false,
          "headline": "added editor",
          "author_name": "Sinevia",
          "author_login": "Sinevia",
          "committed_at": "2024-08-23T20:46:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3968fced04a7b0d3fe8014901b4221cabe45ae2b",
          "body": null,
          "is_bot": false,
          "headline": "added memo attribute",
          "author_name": "Sinevia",
          "author_login": "Sinevia",
          "committed_at": "2024-08-23T06:04:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17e28598d0841ffab367d6fe28879f165594aded",
          "body": null,
          "is_bot": false,
          "headline": "added IsDraft method",
          "author_name": "Sinevia",
          "author_login": "Sinevia",
          "committed_at": "2024-08-22T05:11:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 51,
      "commits_last_year": 81,
      "latest_release_at": "2026-07-26T03:53:01Z",
      "latest_release_tag": "v1.34.0",
      "releases_from_tags": false,
      "days_since_last_push": 2,
      "active_weeks_last_year": 19,
      "days_since_latest_release": 2,
      "mean_days_between_releases": 4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": false,
      "has_contributing": false,
      "health_percentage": 37,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/dracory/blogstore",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/dracory/blogstore",
          "is_deprecated": false,
          "latest_version": "v1.34.0",
          "repository_url": "https://github.com/dracory/blogstore",
          "versions_count": 52,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-26T03:48:02Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 2
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 1,
      "watchers": 1,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 35349,
      "source_files_sampled": 30,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": "repository_graph",
        "source": "osv",
        "findings": [
          {
            "name": "golang.org/x/crypto",
            "direct": false,
            "version": "v0.54.0",
            "severity": "unknown",
            "ecosystem": "go",
            "cvss_score": null,
            "advisory_ids": [
              "GO-2026-5932"
            ],
            "fixed_version": null,
            "advisory_count": 1,
            "oldest_advisory_days": 20
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "unknown": 1
        },
        "advisory_count": 1,
        "affected_count": 1,
        "assessed_count": 21,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/dracory/neat",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.33.0"
        },
        {
          "name": "github.com/dracory/sb",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.26.0"
        },
        {
          "name": "github.com/dracory/str",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.18.0"
        },
        {
          "name": "github.com/dromara/carbon/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.6.16"
        },
        {
          "name": "github.com/samber/lo",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.53.0"
        },
        {
          "name": "modernc.org/sqlite",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.54.0"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "github.com/dracory/neat",
            "direct": true,
            "version": "v0.33.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/dracory/sb",
            "direct": true,
            "version": "v0.26.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/dracory/str",
            "direct": true,
            "version": "v0.18.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/dromara/carbon/v2",
            "direct": true,
            "version": "v2.6.16",
            "ecosystem": "go"
          },
          {
            "name": "github.com/samber/lo",
            "direct": true,
            "version": "v1.53.0",
            "ecosystem": "go"
          },
          {
            "name": "modernc.org/sqlite",
            "direct": true,
            "version": "v1.54.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/dracory/uid",
            "direct": false,
            "version": "v1.9.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/dustin/go-humanize",
            "direct": false,
            "version": "v1.0.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/georgysavva/scany",
            "direct": false,
            "version": "v1.2.3",
            "ecosystem": "go"
          },
          {
            "name": "github.com/google/uuid",
            "direct": false,
            "version": "v1.6.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/mattn/go-isatty",
            "direct": false,
            "version": "v0.0.24",
            "ecosystem": "go"
          },
          {
            "name": "github.com/ncruces/go-strftime",
            "direct": false,
            "version": "v1.0.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/remyoudompheng/bigfft",
            "direct": false,
            "version": "v0.0.0-20230129092748-24d4a6f8daec",
            "ecosystem": "go"
          },
          {
            "name": "github.com/spf13/cast",
            "direct": false,
            "version": "v1.10.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/crypto",
            "direct": false,
            "version": "v0.54.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/exp",
            "direct": false,
            "version": "v0.0.0-20260718201538-764159d718ef",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/sys",
            "direct": false,
            "version": "v0.47.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/text",
            "direct": false,
            "version": "v0.40.0",
            "ecosystem": "go"
          },
          {
            "name": "modernc.org/libc",
            "direct": false,
            "version": "v1.74.3",
            "ecosystem": "go"
          },
          {
            "name": "modernc.org/mathutil",
            "direct": false,
            "version": "v1.7.1",
            "ecosystem": "go"
          },
          {
            "name": "modernc.org/memory",
            "direct": false,
            "version": "v1.11.0",
            "ecosystem": "go"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 21,
        "direct_count": 6,
        "indirect_count": 15
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 2,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "lesichkovm",
          "commits": 99,
          "avatar_url": "https://avatars.githubusercontent.com/u/7744963?v=4"
        },
        {
          "type": "User",
          "login": "Sinevia",
          "commits": 8,
          "avatar_url": "https://avatars.githubusercontent.com/u/3450815?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.925
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "tests.yml"
      ],
      "has_docs_dir": false,
      "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": 10,
            "reason": "2 out of 2 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/28 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 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": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 9,
            "reason": "1 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "6c08071c2ad7c89b880ff6501b1768f954ca42f0",
        "ran_at": "2026-07-28T11:30:52Z",
        "aggregate_score": 4.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-26T03:48:39Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-26T03:48:02Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/dracory/blogstore",
    "host": "github.com",
    "name": "blogstore",
    "owner": "dracory"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 57,
      "inputs": {
        "security": 53,
        "vitality": 86,
        "community": 24,
        "governance": 56,
        "engineering": 57
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 86,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "commits_last_year": 81,
              "human_commit_share": 0.98,
              "days_since_last_push": 2,
              "active_weeks_last_year": 19
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 2 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "19/52 weeks with commits",
                "points": 13.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 19
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "81 commits in the last year",
                "points": 17.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 81
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "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": 100,
            "inputs": {
              "releases_count": 51,
              "latest_release_tag": "v1.34.0",
              "releases_from_tags": false,
              "days_since_latest_release": 2,
              "mean_days_between_releases": 4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "51 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 51
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 2 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 4
                    }
                  }
                ],
                "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": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 2,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 2 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 24,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 1,
              "watchers": 1,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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": "1 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (AGPL-3.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "AGPL-3.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 56,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 16,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.925
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 92% of commits",
                "points": 1.7,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 92
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 72,
            "inputs": {
              "merged_prs": 2,
              "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": "2/2 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 2,
                      "decided": 2
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/28 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 51,
            "inputs": {
              "followers": 4,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "dracory",
              "public_repos": 74,
              "account_age_days": 506
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "4 followers of dracory",
                "points": 5,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 4,
                      "login": "dracory"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "74 public repos, account ~1 yr old",
                "points": 15.8,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 74
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 1
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/dracory/blogstore"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 2
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 2 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "52 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 52
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 57,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "1 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "2 out of 2 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "at_risk",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "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": 0,
                "status": "missed",
                "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": "moderate",
        "name": "Security",
        "value": 53,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 41,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 4.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": "2 out of 2 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/28 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow 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": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "1 existing vulnerabilities detected",
                "points": 6.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 21 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "indirect_dependencies_free_of_known_advisories",
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_repository",
                "params": {
                  "assessed": 21
                }
              },
              {
                "code": "advisories_repo_graph_caveat",
                "params": {}
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 1,
              "affected_packages": 1,
              "assessed_packages": 21,
              "unassessed_packages": 0,
              "affected_by_severity": "unknown 1",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "transitive set not separable from development and test dependencies in this scope",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_scope_not_separable",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 21,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 1
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 60,
        "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": 0.796,
              "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": "78 of 98 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 78,
                      "sampled": 98
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 60,
            "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.02,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "go.mod (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "go.mod"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "2 of the last 100 commits agent-authored or agent-credited",
                "points": 4,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 2,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 35349,
              "source_files_sampled": 30,
              "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/30 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 30,
                      "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": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-28T11:31:00.265409Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/dracory/blogstore.svg",
  "full_name": "dracory/blogstore",
  "license_state": "standard",
  "license_spdx": "AGPL-3.0"
}

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

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

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