Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-29 18:02 UTC

lknappich / gitlab-geo-sync

Open-source infrastructure-level 1:1 geo-replication for self-hosted GitLab

GoApache-2.0★ 0 estrellas⑂ 0 forksdesde jul 2026Ver en GitHub ↗

lknappich/gitlab-geo-sync tiene un índice de salud de 50 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es AI Readiness (87/100) y la más baja, Sustainability & Governance (35/100). Se actualizó por última vez hace 6 días. Una sola persona concentra la mayor parte del trabajo reciente.

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

50
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

Lukas KnappichCuenta personal
3 seguidores12 repositorios públicosdesde ago 2023

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Gogithub.com/lknappich/gitlab-geo-syncv0.0.0-20260720152908-44d1050473f3-1hace 9 días

Métricas por categoría

Vitalidad

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

62Moderado · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 6 días
1.4/36Cadencia de commits — 2/52 semanas con commits
15.8/18Volumen de commits — 56 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year56
human_commit_share0,946
days_since_last_push6
active_weeks_last_year2
Cómo se puntúa
27/27Publica versiones — 1 versiones publicadas
36/36Recencia de las versiones — última versión hace 9 días
12.6/27Cadencia de publicación — cadencia desconocida (una sola versión)
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count1
latest_release_tagv0.1.0
releases_from_tagsno
days_since_latest_release9
mean_days_between_releases

Comunidad y Adopción

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

43En riesgo · 18% del índice global
Cómo se puntúa
0/60Estrellas — 0 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (Apache-2.0)
18/18Guía CONTRIBUTING
13.5/13.5Código de conducta
0/7.2Plantilla de issues
6.3/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conduct
has_pull_request_template

Sostenibilidad y Gobernanza

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

35En riesgo · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
12.8/38.3Aceptación de PR — 3/9 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/24 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs3
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs6
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
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
4.3/25Alcance del propietario — 3 seguidores de lknappich
14/25Trayectoria — 12 repos públicos, cuenta de ~2 años
Datos de entrada utilizados
followers3
owner_typeUser
is_verified
owner_loginlknappich
public_repos12
account_age_days1071
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en go
35/35Recencia de publicación — última publicación hace 9 días
4/20Historial de versiones — 1 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/lknappich/gitlab-geo-sync
ecosystemsgo
any_deprecatedno
min_days_since_publish9

Calidad de Ingeniería

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

68Moderado · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 2 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter — .golangci.yml
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — 0 out of 3 merged PRs checked by a CI test -- score normalized to 0
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_config
has_precommit_configno
Cómo se puntúa
30/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepage
has_readme
has_docs_dir
has_description

Seguridad

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

44En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — 0 out of 3 merged PRs checked by a CI test -- score normalized to 0
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/24 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
5/5Packaging — packaging workflow detected
1.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 3
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate4,4

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.

87Excelente · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 49 de 53 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,925
agent_instruction_filesAGENTS.md
agent_instruction_max_bytes3204
Cómo se puntúa
18/18Arranque con un solo comando — Makefile
22/22Pruebas automatizadas
11/11Configuración de lint / formato — .golangci.yml
11/11Verificación estática de tipos — Go (tipado estático)
10/10Entorno reproducible — Dockerfile, lockfile
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 56
8/8Mantenimiento automatizado — 3 de los últimos 56 commits son actualizaciones automáticas de dependencias
3/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 3
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum
has_dockerfile
typed_language
bootstrap_filesMakefile
has_devcontainerno
has_linter_config
typecheck_configs
agent_commit_share0
toolchain_manifestsgo.mod
dependency_bot_commit_share0,054
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
55/55Tamaños de archivo manejables — 0/57 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes19.860
source_files_sampled57
oversized_source_files0

Datos clave

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

Advertencias de recopilación de datos

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

Más detalle

OpenSSF Scorecard 4.4 / 10
4.4agregado

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-29 18:02 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
0CI-Tests0 out of 3 merged PRs checked by a CI test -- score normalized to 0
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/24 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
10Packagingpackaging workflow detected
3Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 3
0SASTSAST tool is not run on all commits -- score normalized to 0
10Security-Policysecurity policy file detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 11
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/aws/aws-sdk-go-v2v1.42.1go.mod
Gogithub.com/aws/aws-sdk-go-v2/configv1.32.30go.mod
Gogithub.com/aws/aws-sdk-go-v2/credentialsv1.19.29go.mod
Gogithub.com/aws/aws-sdk-go-v2/service/s3v1.105.2go.mod
Gogithub.com/google/uuidv1.6.0go.mod
Gogithub.com/jackc/pgx/v5v5.10.0go.mod
Gogithub.com/prometheus/client_golangv1.24.0go.mod
Gogithub.com/rs/zerologv1.35.1go.mod
Gogithub.com/spf13/cobrav1.10.2go.mod
Gogolang.org/x/syncv0.22.0go.mod
Gogopkg.in/yaml.v3v3.0.1go.mod
Todas las dependencias no recopilado

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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 286,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 303768,
        "Makefile": 582,
        "Dockerfile": 204
      },
      "pushed_at": "2026-07-23T16:59:32Z",
      "created_at": "2026-07-14T22:54:05Z",
      "owner_type": "User",
      "updated_at": "2026-07-20T19:24:27Z",
      "description": "Open-source infrastructure-level 1:1 geo-replication for self-hosted GitLab",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Lukas Knappich",
      "type": "User",
      "login": "lknappich",
      "company": null,
      "location": null,
      "followers": 3,
      "avatar_url": "https://avatars.githubusercontent.com/u/142992442?v=4",
      "created_at": "2023-08-23T11:31:30Z",
      "is_verified": null,
      "public_repos": 12,
      "account_age_days": 1071
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-07-20T15:39:25Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "188cc758d97bf3a1fa77bcd78009dc75a7db45af",
          "body": "…ages\n\nlocalcmd: test RunWith with nil (falls back to Default), mock runner\nsuccess/error, and verify Default is a realRunner.\n\nobjectstorage: add fake S3 server (httptest returning XML) to test\nbucketStats end-to-end with a real *s3.Client pointed at the fake\nendpoint. Test newS3Client with and wit\n[…]\nn, loadConfig missing file, and findSecondary\nfound/not-found.\n\nlocalcmd coverage: 0% -> 85.7%.\nobjectstorage coverage: 53.1% -> 79.7%.\ncmd/geoctl coverage: 0% -> 26.3% (CLI wiring; deeply I/O-bound).",
          "is_bot": false,
          "headline": "test(localcmd,objectstorage,cmd/geoctl): add tests for remaining pack…",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T19:23:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2aeb8455547bb4d71bcecac499ea817ad5f36f26",
          "body": "sla: register metrics on the default registry before setting values\nso Generate's metric-parsing branches (PG lag, drift, last sync) are\nexercised. Add full Report.Print test with all fields populated.\n\nrunbook: remove unused template FuncMap helpers (mul, failoverCfg)\nthat were dead code counting a\n[…]\nand\nfs-backend-skips-s3-prompts.\n\nsla coverage: 47.7% -> 97.7%.\nrunbook coverage: 60.0% -> 87.5%.\nfailover coverage: 65.0% -> 76.7%.\nwebhook coverage: 66.7% -> 83.9%.\ninitcmd coverage: 70.8% -> 99.2%.",
          "is_bot": false,
          "headline": "test(sla,runbook,failover,webhook,initcmd): fill coverage gaps",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T19:14:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3510afd4b061cc36d2e61750761fd581da98a263",
          "body": "…erage\n\nconsistency: extract rowQuerier interface (QueryRow) so rowCount and\nReconcile can be driven by mock pools. WithPools injects them.\nAdd mock-based tests for: all-match, drift, approx-equal skip,\nprimary/secondary error, missing table, Name, execGitFsck\nsuccess/error via stubCmd, gitFsck pass\n[…]\nult) and gains WithRunner. Add mock-based tests for\nRepairRepo success and failure paths.\n\nconsistency coverage: 45.0% -> 88.1%.\npgsetup coverage: 80.0% -> 86.8%.\nautorepair coverage: 89.5% -> 100.0%.",
          "is_bot": false,
          "headline": "refactor(consistency,pgsetup,autorepair): inject runners for test cov…",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T19:04:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d0e0c329e9e9df2e42fa5344ac93e7cb14cb14ca",
          "body": "Introduce internal/localcmd with a Runner interface (Run(ctx, name,\nargs, env) ([]byte, error)) backed by exec.CommandContext. The three\nrsync/git-based reconcilers now hold a runner field (defaulting to\nlocalcmd.Default) and gain a WithRunner method for test injection.\n\ngitfetch additionally extrac\n[…]\nProject success/dry-run, listProjects\npool error and empty/success rows, SetMaxParallel, Name.\n\ngitrsync coverage: 22.7% -> 100%.\nfsstorage coverage: 18.6% -> 97.8%.\ngitfetch coverage: 13.4% -> 91.9%.",
          "is_bot": false,
          "headline": "refactor(gitrsync,fsstorage,gitfetch): inject localcmd.Runner for tests",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T17:24:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a544588c96c93c87f38837e0b3aa3370953c72a2",
          "body": "…terfaces\n\npostgres: introduce a Querier interface (QueryRow + Close) backed by a\npoolAdapter around *pgxpool.Pool. NewWithFactory accepts a PoolFactory\nso tests inject mock pools. Add PrimaryQuerier/SecondaryQuerier for\nmock-backed access; PrimaryPool/SecondaryPool still return concrete\n*pgxpool.Po\n[…]\nwS3Client plumbing remains uncovered (needs real S3).\n\npostgres coverage: 15.7% -> 86.4%.\nobjectstorage coverage: 29.0% -> 53.1% (bucketStats/newS3Client\nremain untestable without a real S3 endpoint).",
          "is_bot": false,
          "headline": "refactor(postgres,objectstorage): extract Querier and bucketLister in…",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T17:17:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "15cfd82162c4dd2f8133e11ad06fe46da2c97eaf",
          "body": "Spin up httptest.Server for each package to drive Reconcile through\nits branches without any refactor: primary success, drift, primary\nerror, secondary error, missing X-Total, connection failure, auth\nskip, catalog error, repo-list drift, tag drift, in-sync, and the\nfetchCount/listRepositories/listTags helpers (bad URL, bad JSON,\nbad status, auth required).\n\napivalidator coverage: 6.5% -> 97.8%.\nregistry coverage: 21.4% -> 91.8%.",
          "is_bot": false,
          "headline": "test(apivalidator,registry): add httptest-driven end-to-end tests",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T17:13:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e8449fb056360aac26b45188ee34b6012f2b795b",
          "body": "Introduce sshexec.Runner-based signatures for sshCheck, rsyncCheck,\ngitCheck, remoteBinaryCheck, pathExistsCheck, dbKeyPresentCheck, and\ndbKeyParityCheck — they no longer call exec.CommandContext inline.\n\nIntroduce a Pool interface (QueryRow + Close) plus a poolAdapter that\nwraps *pgxpool.Pool. pgCo\n[…]\n PASS / FAIL / WARN branches. Cover: empty host, SSH\nerror, pool error, query error, mismatched values, success paths,\nmulti-line sudo output, parity check pass/fail.\n\ndoctor coverage: 14.8% -> 93.8%.",
          "is_bot": false,
          "headline": "refactor(doctor): inject Runner and PoolFactory for full test coverage",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T16:48:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ac24e551246c1359c75e48b482d49514e0e1a201",
          "body": "Add the sshexec.Runner interface (CombinedOutput + SSHString). Config\nalready satisfies it. This unlocks mocking the SSH layer in tests for\npackages that previously depended on the concrete Config and reached\nout to the network.\n\nMigrate dbkey to accept a Runner (CheckWithRunner); Check and\nCheckWit\n[…]\n covering: match,\nmismatch, primary SSH failure, key-not-found, empty host, YAML\nfallback path, sudo/no-sudo command construction, and the\nsudo-fail-then-fallback path.\n\ndbkey coverage: 6.1% -> 88.2%.",
          "is_bot": false,
          "headline": "refactor(sshexec): introduce Runner interface for mockable SSH calls",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T16:41:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6435366c88405fc689a204121dd2747fdcc37c61",
          "body": "Lift total coverage from 27.3% to 39.3% by exercising the testable\n(non-network, non-SSH) surface of each package:\n\n- config: ExpandEnv (replace/missing/empty/no-refs), InstanceID\n  uniqueness, SSHExecConfig, resolveEnvInStruct nil-pointer and\n  slice expansion, missing-env rejection.\n- logging: par\n[…]\nSecondaryPool found/not-found, Close nil-safe,\n  PrimaryPool nil.\n- registry: isAuthError, New URL construction with/without trailing\n  slash, Name.\n\nAll tests pass go test -race; golangci-lint clean.",
          "is_bot": false,
          "headline": "test: add pure-logic tests across low-coverage packages",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T16:35:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e9e3bcb01c7ae4c2849b29b13b7b3314eba5ba16",
          "body": null,
          "is_bot": false,
          "headline": "chore(deps): update dependencies to latest versions",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T16:26:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f7b883f34b568084dc3b4130004e8a14ccc82a60",
          "body": "dockers_v2 builds binaries itself and places them in a context under\n$TARGETPLATFORM/<binary>; the Dockerfile should COPY them, not rebuild\nfrom source. Rebuilding also broke the build (go.sum not in the\ncontext). Switch to a single-stage distroless COPY of the pre-built\ngeoctl binary.",
          "is_bot": false,
          "headline": "fix(docker): use goreleaser pre-built binaries in image",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T15:36:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1754ea631957fbf04a1527c270a91b29596867ec",
          "body": "The default docker driver doesn't support SBOM attestations which\ngoreleaser dockers_v2 enables by default. Switch to the\ndocker-container driver via docker/setup-buildx-action.",
          "is_bot": false,
          "headline": "fix(ci): use docker-container buildx driver for attestations",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T15:32:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44d1050473f3a74209a7b6df51de69fa9a88f412",
          "body": "goreleaser's sboms pipe requires syft on PATH; the runner doesn't\nship it. Install via the official install.sh, pinned to v1.48.0.",
          "is_bot": false,
          "headline": "fix(ci): install syft before goreleaser for SBOM generation",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T15:29:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8fec6d2360221a36ce0d4fa75f01da5702243df7",
          "body": "- Migrate .goreleaser.yaml from deprecated dockers/docker_manifests to\n  dockers_v2: a single buildx run produces linux/amd64 + linux/arm64\n  images tagged with {{.Version}} and latest.\n- Update Dockerfile to use TARGETPLATFORM for the binary path (required\n  by dockers_v2 context layout).\n- Add .gi\n[…]\nb/workflows/release.yml: on tag v*, login to ghcr.io and\n  run goreleaser release --clean. Permissions scoped to contents,\n  packages, id-token.\n- archives.builds -> archives.ids per v2.8 deprecation.",
          "is_bot": false,
          "headline": "ci: add goreleaser v2 release workflow, multi-arch docker",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T15:25:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "adfa5ca67f94931f8655f64ed7ccfc5e81dac54a",
          "body": "- Rewrite .golangci.yml to the v2 schema: exclusions live under\n  linters.exclusions.rules, not issues.exclude-rules (which v2 rejects).\n- Disable revive unused-parameter/exported and staticcheck ST1020/ST1021/\n  ST1022 + QF101x style nags; AGENTS.md prefers minimal comments.\n- Exclude gosec G204/G3\n[…]\neak loop.\n- Fix staticcheck SA1012: pass context.TODO instead of nil in tests.\n- Fix staticcheck SA9003: drop empty branch in registry reconciler.\n- Fix staticcheck ST1003: newDbKeyCmd -> newDBKeyCmd.",
          "is_bot": false,
          "headline": "fix: align golangci-lint v2 config and resolve lint findings",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T15:02:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "eee0648f23de1e9aa858d4439fe30f4cedfec38d",
          "body": "Resolves the govulncheck failure on github.com/jackc/pgx/v5@v5.7.1\n(SQL injection via placeholder confusion with dollar-quoted string\nliterals). Fixed in v5.9.2 per the advisory.",
          "is_bot": false,
          "headline": "fix: bump pgx to v5.9.2 for GO-2026-5004 SQL injection fix",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T15:02:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "392c8cf02535cc5c5018c8462d88c8445f93c84d",
          "body": "# Conflicts:\n#\t.github/workflows/ci.yml",
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T14:53:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e6fb006b9a48b26fb7b27cb95964a648ee532588",
          "body": "- Pin checkout/setup-go/upload-artifact/trivy-action/codeql-action to\n  verified commit SHAs with the moving tag noted in a comment so\n  dependabot can still bump them.\n- Drop continue-on-error from govulncheck so vulns block PRs.\n- Add a trivy job that runs a CRITICAL/HIGH fs scan and uploads SARIF\n  to the GitHub Security tab (security-events: write scoped to job).",
          "is_bot": false,
          "headline": "ci: pin actions by SHA, make govulncheck blocking, add Trivy SARIF",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T14:51:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bf57dd261fff9a9cdc0e5d933fe9cf443e2078fb",
          "body": "Replace the bare [maintainer email] placeholder in SECURITY.md and\nCODE_OF_CONDUCT.md with the repo's private vulnerability reporting URL,\nthe standard channel for public OSS.",
          "is_bot": false,
          "headline": "docs: point vuln reports to GitHub private reporting",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T14:51:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "63c1a772e31392ed93cb8dd3a372af2975121ddc",
          "body": "Align go.mod, Dockerfile ldflags, goreleaser owner, and all internal\nimport sites with the canonical git remote. No behavior change.",
          "is_bot": false,
          "headline": "refactor: unify module path to github.com/lknappich/gitlab-geo-sync",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T14:51:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e4175162120713ef381da93ddc0869f01f5c45e8",
          "body": "…/prometheus/client_golang-1.23.2\n\nchore(deps): bump github.com/prometheus/client_golang from 1.20.5 to 1.23.2",
          "is_bot": false,
          "headline": "Merge pull request #5 from lknappich/dependabot/go_modules/github.com…",
          "author_name": "Lukas Knappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T14:27:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aab86b2b3b3cb977be0f44bc9ccf25f7b3bc077e",
          "body": "…client_golang-1.23.2",
          "is_bot": false,
          "headline": "Merge branch 'main' into dependabot/go_modules/github.com/prometheus/…",
          "author_name": "Lukas Knappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T14:27:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "42269e63846e00a433f8f945d7052364afb1da44",
          "body": "…s/upload-artifact-7\n\nchore(deps): bump actions/upload-artifact from 4 to 7",
          "is_bot": false,
          "headline": "Merge pull request #3 from lknappich/dependabot/github_actions/action…",
          "author_name": "Lukas Knappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T14:26:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cbd4802012c8cd9f4bdf0255378ce5a4f4534b80",
          "body": "…ifact-7",
          "is_bot": false,
          "headline": "Merge branch 'main' into dependabot/github_actions/actions/upload-art…",
          "author_name": "Lukas Knappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T14:26:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd6064b5557da8eb3862e01442b02162a2e52f21",
          "body": "…s/setup-go-7\n\nchore(deps): bump actions/setup-go from 5 to 7",
          "is_bot": false,
          "headline": "Merge pull request #1 from lknappich/dependabot/github_actions/action…",
          "author_name": "Lukas Knappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T14:25:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0623b73495a5ab8255a7545fc43b318a2cb8357",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'main' into dependabot/github_actions/actions/setup-go-7",
          "author_name": "Lukas Knappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T14:25:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53c55e42e3ad46dd044be6d2833ae19fe7557f9e",
          "body": null,
          "is_bot": false,
          "headline": "revert: remove frontend from main repo",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T09:00:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "65ff76ad8f0884c657f1998e1b75c4f6da0064a2",
          "body": null,
          "is_bot": false,
          "headline": "feat: add project frontend under frontend/",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-20T08:59:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "43b3f06f43529b32b01e07b949794db701c3cba2",
          "body": "- Use _, _ = fmt.Fprintf for all io.Writer calls in initcmd, sla, gitfetch\n- Use defer func() { _ = resp.Body.Close() }() in registry, apivalidator\n- Use _, _ = fmt.Fprintf(h, ...) in sha1Hex and its test",
          "is_bot": false,
          "headline": "fix: resolve remaining errcheck warnings for golangci-lint",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-16T12:38:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "723058750810a91ad3051179f286ba72ae6bb106",
          "body": "- Replace unchecked fmt.Fprintln calls in initcmd with a helper that\n  discards errors (writing to stdout for a CLI wizard)\n- Use _ = resp.Body.Close() in failover.pollURL\n- Use defer func() { _ = f.Close() }() in cmd/geoctl init command",
          "is_bot": false,
          "headline": "fix: resolve errcheck warnings flagged by golangci-lint",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-16T12:34:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17c40d7f11cdf15e697113a926eaf22c86c0d893",
          "body": "Bumps [actions/setup-go](https://github.com/actions/setup-go) from 5 to 7.\n- [Release notes](https://github.com/actions/setup-go/releases)\n- [Commits](https://github.com/actions/setup-go/compare/v5...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-go\n  dependency-version: '7'\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/setup-go from 5 to 7",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-16T12:32:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "54d4683a8a9ce483d0159008cfdd03ee67b29356",
          "body": "golangci-lint v2 moved gofmt from linters to formatters section. Update\n.golangci.yml to use formatters.enable instead of linters.enable.\n\ngovulncheck fails on Go 1.25.0 stdlib vulns (crypto/tls, crypto/x509,\nnet) that need Go 1.25.11+ which isn't available in setup-go yet. Mark\nthe job as continue-on-error so it reports but doesn't block the pipeline.",
          "is_bot": false,
          "headline": "fix: golangci-lint v2 formatter config, make govulncheck non-blocking",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-16T12:30:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "139dd0a86116237255c6ecb27d2c6386e4a68311",
          "body": "…urce\n\ngovulncheck was failing because Go 1.25.0 has stdlib vulnerabilities\n(crypto/tls, crypto/x509, net, net/textproto) fixed in 1.25.11+.\nPin build-test and govulncheck to go-version 1.25.11.\n\ngolangci-lint-action v6 ships a binary built with Go 1.24 which can't\nlint Go 1.25 code. Install golangci-lint v2 from source via go install\ninstead, which builds with the CI's Go 1.25 toolchain.",
          "is_bot": false,
          "headline": "fix: pin Go 1.25.11 for govulncheck, install golangci-lint v2 from so…",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-16T12:26:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04fd1bea46901de4c5f4b1261d6deb495101e877",
          "body": "Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 7.\n- [Release notes](https://github.com/actions/upload-artifact/releases)\n- [Commits](https://github.com/actions/upload-artifact/compare/v4...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/upload-artifact\n  dependency-version: '7'\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/upload-artifact from 4 to 7",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-16T12:23:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d201cedda36c0e376cba5765d3bf92ab6bf7a7f7",
          "body": "build-test was failing with 'go: no such tool covdata' when -coverprofile\nwas combined with -race on packages that have no test files. Separated\nthe race test and coverage steps so they don't conflict.\n\ngovulncheck was failing on Go 1.24 stdlib vulnerabilities (crypto/tls,\ncrypto/x509, net, net/textproto) that are fixed in Go 1.25.x. Bumping\nCI, go.mod, Dockerfile, .golangci.yml, and CONTRIBUTING.md to Go 1.25.",
          "is_bot": false,
          "headline": "fix: bump Go to 1.25 to fix CI pipeline failures",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-16T12:21:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ba060294f460830c3d7274903cb0881c51f7d2ec",
          "body": "Bumps [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang) from 1.20.5 to 1.23.2.\n- [Release notes](https://github.com/prometheus/client_golang/releases)\n- [Changelog](https://github.com/prometheus/client_golang/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/pro\n[…]\nithub.com/prometheus/client_golang\n  dependency-version: 1.23.2\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump github.com/prometheus/client_golang",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-16T12:06:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "85f7a80d87b554b1bd465c685df2194c9278e711",
          "body": "O2: Add CODE_OF_CONDUCT.md (Contributor Covenant 2.1), CHANGELOG.md\n(Keep-a-Changelog format), .github/ISSUE_TEMPLATE/ (bug_report,\nfeature_request), .github/PULL_REQUEST_TEMPLATE.md,\n.github/dependabot.yml (gomod + github-actions, weekly).\n\nO3: Refresh README from stale 'Phase 0' status to reflect \n[…]\nrget to use\ngolangci-lint. Add docker and release-snapshot Makefile targets.\n\nO5: Add tests for metrics server, SLA report, and version package.\nUpdate CONTRIBUTING.md to reference CODE_OF_CONDUCT.md.",
          "is_bot": false,
          "headline": "docs: refresh README, add community files, golangci-lint config, tests",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-16T11:39:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4c7a81efc89573ee2f1fa4533b1d375a09e8e835",
          "body": "…rance, SECURITY.md\n\nS8: Add SECURITY.md documenting the sudo/SSH trust model, recommended\nsudoers allowlist, host-key verification policy, db_key_base sharing\nrationale, and PostgreSQL TLS configuration.\n\nS9: Log a warning at config load time when failover.auto_failover is true\nso operators can't e\n[…]\n\nQ6: Add isApproxEqual tolerance band (10%, min 5 rows) to consistency\nsweep so reltuples estimate differences across two databases don't\nreport false drift. Add unit tests for the tolerance function.",
          "is_bot": false,
          "headline": "feat: bounded-parallel git fetch, SLA honest labels, consistency tole…",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-16T11:37:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "09cfcf4d3a5adb3cb7067112ec955b3ca505c794",
          "body": "S6: Registry reconciler treats 401 Unauthorized as 'unconfigured/skip'\ninstead of reporting false drift. The GitLab container registry requires\nBearer token auth; without a configured token the reconciler now returns\nOK with a skip message rather than critical drift.\n\nS7: Remove hardcoded -S main fr\n[…]\nql.auto.conf line-by-line, handle missing trailing newlines,\nand ensure the output always ends with a newline. Add tests for\ncreate-line, update-existing, no-trailing-newline, and empty-appName\ncases.",
          "is_bot": false,
          "headline": "fix: registry 401 skip, pg_basebackup slot flags, auto.conf editing",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-16T11:34:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a7c320ff9be638bc8f961f660ed3a09fa43130d4",
          "body": "Previously  placeholders were text-substituted into raw YAML\nbefore parsing, allowing an env value containing newlines or YAML\nmetacharacters (e.g. foo\\npassword: attacker_key) to inject additional\nkeys or alter document structure.\n\nNow the YAML is parsed first, then the Config struct is walked via\n\n[…]\n become opaque Go strings, never re-parsed as YAML.\n\nExpandEnv is kept for backwards compatibility but no longer used by Load.\nAdd test proving a newline-containing env value cannot inject a YAML key.",
          "is_bot": false,
          "headline": "fix: resolve env placeholders after YAML parse to prevent injection",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-16T11:32:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d2ee95af54425582bffd8aa998f9d07cd43b8906",
          "body": "Webhook (S3):\n- NewServer now returns (*Server, error) and rejects empty secretToken\n  (hmac.Equal(\"\",\"\") would accept every unauthenticated request)\n- Add concurrency cap (semaphore channel, capacity 8) so a flood of\n  valid-token requests cannot spawn unbounded goroutines (DoS)\n- Add projectpath.V\n[…]\nics http.Server\n\nTests:\n- Add internal/projectpath package with full validation tests\n- Add webhook tests for empty-secret rejection and path traversal\n- Add gitfetch test for traversal path rejection",
          "is_bot": false,
          "headline": "fix: harden webhook receiver and add HTTP server timeouts",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-16T11:30:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b8ec212db76ed451aa93f632b06ada6f8c6ad5c6",
          "body": "- Add internal/sshexec package with Config that controls\n  StrictHostKeyChecking and KnownHostsFile options\n- Add SSHConfig to top-level config with known_hosts_file and\n  strict_host_key_checking fields\n- Default to StrictHostKeyChecking=accept-new (TOFU) when no\n  known_hosts_file is set, 'yes' wh\n[…]\nT_SSH_COMMAND env var to pass SSH options to git\n- Update deploy/config.example.yaml with ssh config block\n- Add dev config (deployments/dev/config.yaml) with sslmode: disable\n- Add sshexec unit tests",
          "is_bot": false,
          "headline": "refactor: centralize ssh execution and pin host keys",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-16T11:27:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "68afcb1e341ae0be6b57abcb255fea71d4001d43",
          "body": "…tials\n\n- Add SSLMode, SSLRootCert, SSLCert, SSLKey fields to PostgresConfig\n- Default SSLMode to 'require' when unset (was hardcoded sslmode=disable)\n- Log a warning when sslmode=disable is explicitly used\n- Replace fmt.Sprintf DSN construction with libpq key=value quoting\n  that correctly handles \n[…]\nAdd dev config (deployments/dev/config.yaml) with sslmode: disable\n- Add tests: default sslmode, explicit disable, special-char passwords,\n  SSL cert paths, replication DSN, quoteLibPQValue unit tests",
          "is_bot": false,
          "headline": "fix: enforce TLS on postgres connections and safely encode DSN creden…",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-16T11:20:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "58fd36ba8904a410820f52765eb568ed987cb656",
          "body": "CI jobs and Dockerfile were using Go 1.23 but go.mod declares go 1.24,\nwhich cannot build a go 1.24 module. Bump all three jobs to 1.24, update\nDockerfile base image, and fix CONTRIBUTING.md/AGENTS.md references.",
          "is_bot": false,
          "headline": "fix: align Go toolchain to 1.24 across CI, Dockerfile, and docs",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-16T11:17:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "695492a7dcf760e312d01c8eec6a05b88758ccf6",
          "body": "- Fix objectstorage replica client using primary's region/creds\n- Fix gitfetch listProjects SQL to use public CE schema (projects+routes)\n- Fix readonly to actually pause Sidekiq + maintenance mode\n- Fix objectstorage Remaining going negative when replica > primary\n- Fix consistency.rowCount swallow\n[…]\ne with build/test/vet/lint/fmt/coverage targets\n- Write docs/architecture.md (was referenced as 'planned' in README)\n- Add tests: gitfetch, retry, readonly, dbkey\n- Run gofmt -w across entire codebase",
          "is_bot": false,
          "headline": "fix: correctness bugs, robustness improvements, and code hygiene",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-16T11:16:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c3c5ba9414ccfe87a1b4682cb7e84e677dbfecd7",
          "body": "doctor: checks SSH, PG control/recovery, replication role, wal_level,\nmax_wal_senders, db_key_base presence+parity, rsync/git availability,\nS3 config, repos path — on both primary and secondary.\ninit: interactive config.yaml generator wizard.\ndocs/testing-guide.md: step-by-step guide for two real GitLab instances.",
          "is_bot": false,
          "headline": "feat: doctor prerequisite checker, init wizard, testing guide",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-14T22:55:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f40e317cd92d41e6ecccc6c94651354b208f11ea",
          "body": "failover: heartbeat-based primary health check with configurable\nquorum; 6-step promotion sequence (stop GitLab, pg_ctl promote,\ndisable read-only, start GitLab, verify db_key_base, print runbook);\nadopt-as-secondary for role-swap.\nrunbook: generates Markdown runbook from live config.\nsla: RPO/RTO report from Prometheus metrics.",
          "is_bot": false,
          "headline": "feat: failover controller, role-swap, runbook generator, SLA reporter",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-14T22:55:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9b5931276bac14138c41e3b0233856b8495827ba",
          "body": "webhook: HTTP receiver for GitLab push/create/delete webhooks.\nValidates X-Gitlab-Token, extracts project path, triggers immediate\nper-project sync with 2-second debounce for burst coalescing.\nautorepair: re-fetches drifted git repos, logs missing S3 objects.",
          "is_bot": false,
          "headline": "feat: webhook receiver with debounce + drift auto-repair",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-14T22:54:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "68a977e39d39bf087edc55433ef212f7cfbdca04",
          "body": "gitfetch: per-project git fetch --prune +refs/*:refs/* as alternative\nto rsync; pulls project list from replicated DB.\nfsstorage: rsync of uploads/artifacts/packages/LFS/registry dirs.\nregistry: container registry parity via Docker Registry HTTP API v2\n(_catalog + tags/list).\napivalidator: observational API diff (read-only, never writes) for\nprojects/users/groups/issues/MR counts.",
          "is_bot": false,
          "headline": "feat: git fetch, fs storage, registry, and API validator reconcilers",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-14T22:54:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c3fcb0247a099cfe9b12c2b788321ea25f548a9b",
          "body": "gitrsync: rsync --delete --checksum of git-data over SSH with sudo.\nobjectstorage: S3 bucket parity check (object count + total size).\nconsistency: row-count audit of 10 key GitLab CE tables + git fsck\non a configurable sample of secondary repos.\ndbkey: SSH-greps db_key_base from secrets.yml/gitlab.rb and compares.\nreadonly: enables GitLab maintenance mode via SSH.",
          "is_bot": false,
          "headline": "feat: git rsync, S3 object storage, consistency sweep, dbkey, readonly",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-14T22:54:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5c6583a88dfa9d83d28010c5276bffb082a4afe1",
          "body": "Reconciler runner framework with periodic sweeps, metrics, logging.\nPostgres reconciler: monitors pg_stat_replication on primary and\npg_is_in_recovery() on secondary, reports replay lag.\npgsetup: pg_basebackup bootstrap with standby.signal + primary_conninfo\n+ application_name injection.",
          "is_bot": false,
          "headline": "feat: PostgreSQL streaming replication reconciler + pg setup",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-14T22:54:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5049d1cfc0d9581f06b416ef50cc8c344fcf8bf3",
          "body": "Multi-stage Dockerfile (distroless). docker-compose dev stack with\nPG primary/replica + MinIO. CI: go vet, build, test -race,\ngovulncheck, staticcheck. goreleaser: multi-arch + Docker + SBOM.\ndeploy/config.example.yaml with full annotated config.",
          "is_bot": false,
          "headline": "chore: Dockerfile, dev compose stack, CI, goreleaser, example config",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-14T22:54:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc76953f50faa13f504655ba9f32832e8c8bb387",
          "body": "Cobra-based CLI with persistent flags (config, log-level, log-format,\ndry-run). Subcommands: version, config-validate, serve (metrics only\nat this stage).",
          "is_bot": false,
          "headline": "feat: geoctl CLI skeleton — version, config-validate, serve",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-14T22:54:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0df7f51da4f9a74a4065cfa1e189515a53f828ab",
          "body": "YAML config with ${ENV_VAR} placeholder expansion for all secrets.\nValidator rejects missing/empty env vars, unknown git modes, missing\nrequired fields. Includes Postgres, git storage, S3, registry, sync,\nwebhook, API validator, and failover config sections.",
          "is_bot": false,
          "headline": "feat: config schema with env-only secret expansion",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-14T22:54:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "05e7773f2e30331e6e286fbf6dc60a682c24d55c",
          "body": "internal/version: build metadata via ldflags.\ninternal/logging: zerolog-based structured logger (json/text).\ninternal/metrics: Prometheus collectors + HTTP server with /metrics\nand /healthz endpoints.",
          "is_bot": false,
          "headline": "feat: version, logging, and metrics foundations",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-14T22:54:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f4bb86f268e720f7c8ba41298802c9197da260ee",
          "body": "Apache-2.0 license, AGENTS.md clean-room policy, CONTRIBUTING.md,\nREADME.md with architecture overview, .gitignore, Go module init.",
          "is_bot": false,
          "headline": "chore: project scaffolding — license, docs, go module",
          "author_name": "lknappich",
          "author_login": "lknappich",
          "committed_at": "2026-07-14T22:54:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 1,
      "commits_last_year": 56,
      "latest_release_at": "2026-07-20T15:39:25Z",
      "latest_release_tag": "v0.1.0",
      "releases_from_tags": false,
      "days_since_last_push": 6,
      "active_weeks_last_year": 2,
      "days_since_latest_release": 9,
      "mean_days_between_releases": null
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 100,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/lknappich/gitlab-geo-sync",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/lknappich/gitlab-geo-sync",
          "is_deprecated": false,
          "latest_version": "v0.0.0-20260720152908-44d1050473f3",
          "repository_url": "https://github.com/lknappich/gitlab-geo-sync",
          "versions_count": 1,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-20T15:29:08Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 9
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 8
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 19860,
      "source_files_sampled": 57,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "AGENTS.md"
      ],
      "agent_instruction_max_bytes": 3204
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/aws/aws-sdk-go-v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.42.1"
        },
        {
          "name": "github.com/aws/aws-sdk-go-v2/config",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.32.30"
        },
        {
          "name": "github.com/aws/aws-sdk-go-v2/credentials",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.19.29"
        },
        {
          "name": "github.com/aws/aws-sdk-go-v2/service/s3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.105.2"
        },
        {
          "name": "github.com/google/uuid",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/jackc/pgx/v5",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v5.10.0"
        },
        {
          "name": "github.com/prometheus/client_golang",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.24.0"
        },
        {
          "name": "github.com/rs/zerolog",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.35.1"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.2"
        },
        {
          "name": "golang.org/x/sync",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.22.0"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 8,
        "merged_prs": 3,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 6
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "lknappich",
          "commits": 53,
          "avatar_url": "https://avatars.githubusercontent.com/u/142992442?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".golangci.yml"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "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": 0,
            "reason": "0 out of 3 merged PRs checked by a CI test -- score normalized to 0",
            "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/24 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 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": 10,
            "reason": "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": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 3,
            "reason": "dependency not pinned by hash detected -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 10,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "188cc758d97bf3a1fa77bcd78009dc75a7db45af",
        "ran_at": "2026-07-29T18:02:04Z",
        "aggregate_score": 4.4,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-23T16:59:35Z",
      "oldest_open_prs": [
        {
          "number": 10,
          "created_at": "2026-07-23T16:54:19Z",
          "last_comment_at": "2026-07-23T16:54:20Z",
          "last_comment_author": "dependabot"
        },
        {
          "number": 11,
          "created_at": "2026-07-23T16:54:22Z",
          "last_comment_at": "2026-07-23T16:54:23Z",
          "last_comment_author": "dependabot"
        },
        {
          "number": 12,
          "created_at": "2026-07-23T16:54:26Z",
          "last_comment_at": "2026-07-23T16:54:27Z",
          "last_comment_author": "dependabot"
        },
        {
          "number": 13,
          "created_at": "2026-07-23T16:54:29Z",
          "last_comment_at": "2026-07-23T16:54:30Z",
          "last_comment_author": "dependabot"
        },
        {
          "number": 14,
          "created_at": "2026-07-23T16:55:37Z",
          "last_comment_at": "2026-07-23T16:55:38Z",
          "last_comment_author": "dependabot"
        },
        {
          "number": 15,
          "created_at": "2026-07-23T16:56:55Z",
          "last_comment_at": "2026-07-23T16:56:56Z",
          "last_comment_author": "dependabot"
        },
        {
          "number": 16,
          "created_at": "2026-07-23T16:58:14Z",
          "last_comment_at": "2026-07-23T16:58:15Z",
          "last_comment_author": "dependabot"
        },
        {
          "number": 17,
          "created_at": "2026-07-23T16:59:33Z",
          "last_comment_at": "2026-07-23T16:59:34Z",
          "last_comment_author": "dependabot"
        }
      ],
      "last_merged_pr_at": "2026-07-20T14:27:39Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/lknappich/gitlab-geo-sync",
    "host": "github.com",
    "name": "gitlab-geo-sync",
    "owner": "lknappich"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 50,
      "inputs": {
        "security": 44,
        "vitality": 62,
        "community": 43,
        "governance": 35,
        "engineering": 68
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 62,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 53,
            "inputs": {
              "commits_last_year": 56,
              "human_commit_share": 0.946,
              "days_since_last_push": 6,
              "active_weeks_last_year": 2
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "2/52 weeks with commits",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "56 commits in the last year",
                "points": 15.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 56
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "good",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "releases_count": 1,
              "latest_release_tag": "v0.1.0",
              "releases_from_tags": false,
              "days_since_latest_release": 9,
              "mean_days_between_releases": null
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "1 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 9 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "cadence unknown (single release)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence_unknown",
                    "params": {}
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 43,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "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": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 35,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "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": 24,
            "inputs": {
              "merged_prs": 3,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 6
            },
            "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": "3/9 decided PRs merged",
                "points": 12.8,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 3,
                      "decided": 9
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/24 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 35,
            "inputs": {
              "followers": 3,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "lknappich",
              "public_repos": 12,
              "account_age_days": 1071
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "3 followers of lknappich",
                "points": 4.3,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 3,
                      "login": "lknappich"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "12 public repos, account ~2 yr old",
                "points": 14,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 12
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 2
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "good",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "packages": [
                "github.com/lknappich/gitlab-geo-sync"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 9
            },
            "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 9 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "1 published versions",
                "points": 4,
                "status": "partial",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 68,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": ".golangci.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "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": "0 out of 3 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": 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": "at_risk",
        "name": "Security",
        "value": 44,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 44,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 4.4
            },
            "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": "0 out of 3 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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/24 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "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": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 3",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "excellent",
        "name": "AI Readiness",
        "value": 87,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.925,
              "agent_instruction_files": [
                "AGENTS.md"
              ],
              "agent_instruction_max_bytes": 3204
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "49 of 53 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 49,
                      "sampled": 53
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 83,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0.054
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": ".golangci.yml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 56",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 56
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "3 of the last 56 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 3,
                      "sampled": 56
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "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": 19860,
              "source_files_sampled": 57,
              "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/57 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 57,
                      "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": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-29T18:02:11.776327Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/l/lknappich/gitlab-geo-sync.svg",
  "full_name": "lknappich/gitlab-geo-sync",
  "license_state": "standard",
  "license_spdx": "Apache-2.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.