Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-26 15:55 UTC

dukkandcards / quadstore

Single-node graph database for Go applications. Pure Go, embedded, SQLite-backed. Quad model with enforced label namespaces.

GoMIT★ 0 estrellas⑂ 0 forksdesde abr 2026Ver en GitHub ↗

dukkandcards/quadstore tiene un índice de salud de 52 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Engineering Quality (66/100) y la más baja, Sustainability & Governance (35/100). Se actualizó por última vez hace 50 días.

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

52
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

dukkandcardsCuenta personal
0 seguidores1 repositorio públicodesde ene 2026

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/dukkandcards/quadstorev0.2.4-6hace 72 días

Métricas por categoría

Vitalidad

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

64Moderado · 22% del índice global
Cómo se puntúa
18/36Recencia de push — último push hace 50 días
3.5/36Cadencia de commits — 5/52 semanas con commits
16.8/18Volumen de commits — 74 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year74
human_commit_share1
days_since_last_push50
active_weeks_last_year5
Cómo se puntúa
16.2/27Publica versiones — 6 etiquetas de versión (sin releases de GitHub)
36/36Recencia de las versiones — última versión hace 72 días
27/27Cadencia de publicación — una versión cada ~2 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count6
latest_release_tagv0.2.4
releases_from_tags
days_since_latest_release72
mean_days_between_releases2
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

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

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 (MIT)
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
0/46.8Resolución de issues — sin issues o sin datos
0/38.3Aceptación de PR — sin PR decididos o sin datos
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues, Aceptación de PR. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
0/25Alcance del propietario — 0 seguidores de dukkandcards
3.2/25Trayectoria — 1 repos públicos, cuenta de ~0 años
Datos de entrada utilizados
followers0
owner_typeUser
is_verified
owner_logindukkandcards
public_repos1
account_age_days192
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 72 días
20/20Historial de versiones — 6 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/dukkandcards/quadstore
ecosystemsgo
any_deprecatedno
min_days_since_publish72

Calidad de Ingeniería

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

66Moderado · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 1 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.
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
10/10Topics — 6 topics
0/10Wiki
Datos de entrada utilizados
topicsembedded-database, golang, graph-database, graphdb, quadstore, sqlite
has_wikino
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?

51Moderado · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — sin datos
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — sin datos
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — sin datos
7.5/7.5Token-Permissions — GitHub workflow tokens follow principle of least privilege
6/7.5Vulnerabilities — 2 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate5,1
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, packaging, signed_releases. Los pesos restantes se han renormalizado.

Preparación para IA

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

59Moderado · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 74 de 74 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
12.6/18Arranque con un solo comando — go.mod (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — Go (tipado estático)
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 48 de los últimos 74 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,649
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
55/55Tamaños de archivo manejables — 0/52 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes26.692
source_files_sampled52
oversized_source_files0
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

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

Advertencias de recopilación de datos

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

Más detalle

OpenSSF Scorecard 5.1 / 10
5.1agregado

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
n/dCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
n/dPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
10Security-Policysecurity policy file detected
n/dSigned-Releasesno releases found
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
8Vulnerabilities2 existing vulnerabilities detected
Dependencias directas 3
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/cockroachdb/pebble/v2v2.1.5go.mod
Gogithub.com/google/uuidv1.6.0go.mod
Gomodernc.org/sqlitev1.48.2go.mod
Todas las dependencias no recopilado

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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [
        "embedded-database",
        "golang",
        "graph-database",
        "graphdb",
        "quadstore",
        "sqlite"
      ],
      "is_fork": false,
      "size_kb": 627,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "Go": 465841,
        "Shell": 5237
      },
      "pushed_at": "2026-06-06T14:46:17Z",
      "created_at": "2026-04-13T14:46:00Z",
      "owner_type": "User",
      "updated_at": "2026-05-15T15:11:38Z",
      "description": "Single-node graph database for Go applications. Pure Go, embedded, SQLite-backed. Quad model with enforced label namespaces.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "User",
      "login": "dukkandcards",
      "company": null,
      "location": null,
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/255067640?v=4",
      "created_at": "2026-01-15T07:19:35Z",
      "is_verified": null,
      "public_repos": 1,
      "account_age_days": 192
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.2.4",
          "kind": "patch",
          "published_at": "2026-05-15T15:11:32Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2026-05-07T15:21:18Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-05-06T08:32:20Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-05-05T19:39:34Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-05-05T17:41:05Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-05-05T15:05:34Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "c54c67cac4ae8e34fedb6b2a5305b116a8628e30",
          "body": "bench_scale_test.go: scale benchmarks (BenchmarkScale_BulkLoad1M_*,\nBenchmarkScale_FindBySubject_After1M_*, BenchmarkScale_FindByPredicate_After1M_*)\nfor SQLite + Pebble at 1M-quad workloads. Exercises LSM / B-tree shape\nat sizes where small-N benches may not extrapolate. Predicate\ncardinality 100 d\n[…]\nle_' -benchtime=1x -run=^$ ./...\n\n.gitignore: *.test added to exclude `go test -c` compiled-test binaries\n(matches Go convention).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test+chore: 1M-quad scale benchmarks + gitignore *.test",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-15T15:11:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "77385a776164642a01342142765944c20f5dd340",
          "body": "After a per-project audit (SecDek + lawdek-v2 + yeti-portrait + IGdek +\nmega-index + decklib), the consumer story in quadstore's docs was wrong\nin several load-bearing ways. This commit corrects them. CHANGELOG\n(append-only release record) untouched.\n\nREADME.md headline \"Pebble-backed by default\" pa\n[…]\nge-corpus consumers\n(~10M-100M+ quads)\" + accurate context that SecDek's 19M-quad snapshot\nremains the largest validated workload.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: reconcile to verified cross-project reality (2026-05-15)",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-15T15:07:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5d416288b0f6c89c060d93dda20dad69a436108d",
          "body": "Within a single Commit the SQLite path runs INSERT OR IGNORE then\nDELETE. Pebble mirrors this. Net effect when the same (S,P,O,L)\nappears in BOTH lists: REMOVE — the Add is dedup'd as a duplicate\nand the Remove deletes the existing row.\n\nSurfaced 2026-05-10 in secdek's force-reemit backfill. Caller \n[…]\nfor an\nostensibly-additive change.\n\nAdding writer_remove_add_order_test.go to lock the behavior so it\ncan't silently change later.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(writer): document Adds-then-Removes ordering + lock-in test",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-10T09:55:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "aeb01012419355c13c2ad36c7b1ade41b3ef9963",
          "body": "A practical guide for application authors who are choosing between\nquadstore's SQLite and Pebble backends, with specific guidance on\nthe multi-writer architecture decisions Pebble forces but SQLite\nhides.\n\nDistilled from production experience operating SecDek through a\nSQLite→Pebble cutover, 2026-05\n[…]\ny SecDek experience:\n  1. Expose IngestSortedExternalOptions.ScratchDir\n  2. Hoist a generic decklib/scheduler when 2nd consumer arrives\n  3. Strip a reference application showing Pattern 1 end-to-end",
          "is_bot": false,
          "headline": "docs: stacking writers on quadstore's Pebble backend",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-08T03:14:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "60a2c881e2c7db401d6e64c2ebc6c42311042da4",
          "body": "…ollow-up\n\nSurfaced 2026-05-07 during the SecDek Phase 2 commit. Both date to\n2026-05-05 and pre-date current work. Decide whether to finish + land\nthe bench file or delete it; .test binary should be gitignored\nregardless.",
          "is_bot": false,
          "headline": "docs(todo): flag untracked bench_scale_test.go + quadstore.test for f…",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-07T15:23:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7982ccdd82fe5c012a984faf53658b0fb2d1bbc0",
          "body": "Pebble's hardlink-based checkpoint primitive exposed as\n(*PebbleStore).Checkpoint(destDir) — atomic, sub-second on stores up\nto tens of GB, the right shape for a backup snapshot a sibling tool\ncan tar/upload while the live store keeps writing.\n\nOpenPebbleReadOnly registers the same label-count merger as OpenPebble,\nso verify-side tooling that opens a checkpoint produced by the live\nstore doesn't trip Pebble's \"merger name mismatch\" SST guard. SecDek's\ncmd/pebble-verify is the first consumer.",
          "is_bot": false,
          "headline": "feat(pebble): Checkpoint + OpenReadOnly on PebbleStore",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-07T15:21:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7bf63569528f970f5266bf794f4ef53312ca2606",
          "body": "The third level of the ladder isn't a new API — it's a documented\nusage pattern. Closes the migration-guide ladder section.\n\nReal-world bulk ingest workloads almost never look like \"one giant\nslice of every quad in the universe\"; they look like many corpora\ningested sequentially (one Turtle file per\n[…]\neds RAM\n- per-corpus driver: when corpus has natural boundaries that\n  fit in RAM individually\n\nAll three measured and documented.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: per-corpus driver pattern (third level of the IngestSorted ladder)",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-06T16:22:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8a7a9055c049d6fa48300d54081b22dfdad2c0bc",
          "body": "…roof\n\nTwo real-data validation runs of the IngestSortedExternal variant\nagainst the same 16,155,295-quad SecDek production snapshot:\n\nRun 1 — r6g.2xlarge (62 GB RAM, plenty of headroom):\n  3m 4.9s, 87,373 quads/sec sustained, ~1 GB peak memory\n  vs in-memory IngestSorted on same hardware: 22% slowe\n[…]\n.log\n\n(Earlier runs already archived: -in-memory-r6g, plus the two\ncorrectness logs from the per-label-counter merger validation.)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: IngestSortedExternal validated end-to-end with bounded-memory p…",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-06T15:16:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d8e3e1e38d286f0e44eef0c062c75f4b87f6d3dc",
          "body": "Adds the external-merge-sort variant on the IngestSorted ladder.\nReads quads from a channel, sorts in chunks, flushes sorted runs\nto disk, then k-way merges the runs into per-keyspace sstables and\nhands them to db.Ingest. Working set: ~400 bytes/quad × ChunkSize\n(default 500_000) regardless of total\n[…]\nk-class\ningest through this path) is the next bench step — pending bench\nhost availability after the in-memory variant validation.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(pebble): IngestSortedExternal — bounded-memory bulk ingest",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-06T14:30:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bc06a2692c79f9eff1c7ecfa05d277c084570206",
          "body": "Real-data validation of the IngestSorted in-memory variant against the\n16,155,295-quad / 30 GB SecDek production snapshot. Documents the\nladder's first measured ceiling and the speedup vs the standard\nBulkLoader path.\n\nRun sequence:\n\n1. First attempt on t4g.xlarge (16 GB RAM): OOM-killed cleanly dur\n[…]\nntil it lands, the in-memory variant is the right\n  choice for any consumer whose corpus fits the per-bench-host\n  memory ceiling.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: IngestSorted in-memory benched 6.7× faster on SecDek snapshot",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-06T14:15:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d19d20992eb6ce590684f71d3a9c37eecb9a196e",
          "body": "In-memory variant (option 1 of the three-level ladder in TODO.md).\nBuilds per-keyspace sorted sstables externally and hands them to\ndb.Ingest, bypassing the memtable + WAL + compaction work the\nstandard Writer / BulkLoader paths trigger per write.\n\nAPI:\n- *PebbleStore.IngestSorted(ctx, []Quad, Inges\n[…]\nhe SecDek-snapshot bench against the standard\nBulkLoader path. Numbers will land in MIGRATING_TO_PEBBLE.md as the\nbench completes.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(pebble): IngestSorted — bulk-ingest fast path via Pebble.Ingest",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-06T13:36:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3696cb810d1488a10b4b4f2bc01a61c351aa66d7",
          "body": "…unt(Label)\n\nLive experiment outcome: Pebble's Reader.Count(Pattern{Label: X}) was\n4-5× SLOWER than SQLite's covering-index idx_lsp path because it was\niter-and-counting the LSP keyspace. Adding a maintained counter\nkeyspace + the Merge operator turns it into a single 8-byte Get,\nmaking Pebble win e\n[…]\nrn).\n- docs/bench-output/: archived raw bench output for both runs\n  (with and without the merger) plus the correctness sweep log.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(pebble): per-label counter via Merge operator — 5,418× faster Co…",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-06T13:25:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a4627e803f826f8f22739cee26b48100ef311b74",
          "body": "Honoring the constraint that public quadstore docs stay generic\nabout consumers' graph schemas — numbers (sizes, latencies,\nspeedups) are publishable; subject prefix names, partition\nrouting label-prefix lists, and internal aggregation names are\nnot. The risk: someone reading these docs could infer \n[…]\nioning\nrationale, cold-start measurement context) — they just don't\nhand a reader the exact graph schema of a production consumer.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: scrub project schema details from public docs",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-06T09:12:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c611febdd0e50988d349b66deac28fd8512e8d73",
          "body": "A practical guide for moving an existing SQLite-backed quadstore\ndeployment to Pebble. Written so anyone hitting this fork in the\nfuture has the framework — not just SecDek and not just us.\n\nStructure:\n\n- \"Decide whether to migrate at all\" — a 30-second self-check\n  table (hosting shape, disk profil\n[…]\ner\n  saying its plan-as-shipped is now a stepping stone toward the\n  Pebble cutover (the SQLite-era fix for a SQLite-era problem).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add MIGRATING_TO_PEBBLE.md + flag SecDek as live experiment",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-06T08:56:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ddf1ba0f754f3a29af50a7e7521f3ed7a1dd1875",
          "body": "The previous commit (81daf74) overstated which dek products run\nquadstore in production. Verified against actual go.mod / call\nsites across all dukkandcards repos:\n\n  - ~/secdek            → DOES import quadstore (Open + OpenPartitioned), running SQLite in production at sfy.io\n  - ~/yeti-portrait   \n[…]\nshot (real production data) round-tripped to Pebble\" so\n  the reader doesn't infer Pebble is deployed in production.\n\nBuild clean.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: correct false production-user claims; honest origin story",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-06T08:45:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "81daf74e23052a927564b1aea3a53d1918bf8d76",
          "body": "The v0.2 Pebble work was driven by SlideDek's 133M-quad / 60 GB\nSQLite workload, not SecDek's. SecDek (19M / 28 GB) was the\nbyte-perfect validation case after the Pebble backend shipped.\nEarlier docs misattributed the 133M / 60 GB / 140-distinct-predicate\nnumbers to a \"SecDek-class corpus\" — those n\n[…]\nek\n  corpus)\" → \"133 M rows (SlideDek corpus, the workload that drove\n  the Pebble investigation)\".\n\nNo code changes. Build clean.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: SlideDek is the largest production user (corrects misattribution)",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-06T08:39:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3448057879e9f0dc6b7068b824796b624d413264",
          "body": "Pass 2 of the post-Pebble docs cleanup, focused on what a stranger\narriving from Google sees first (pkg.go.dev godoc, examples/) plus\nthe supporting docs that pass 1 missed.\n\nPublic-surface alignment:\n- quadstore.go package godoc (what shows on pkg.go.dev): replaces\n  \"SQLite default, Pebble opt-in\"\n[…]\ne\".\n\nBuild + vet clean. examples/minimal runs end-to-end on Pebble (3 quads\nwritten + read back, label-namespace check exercised).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: simplify on-ramps; credit Robert Melton; consistency pass 2",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-06T08:32:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d070e2386417b50d7581d85eee46cd40de800987",
          "body": "Reframes the v0.2 docs around the decision: Pebble is the path\ngoing forward, SQLite stays supported indefinitely for callers\nwho prefer ~20 fewer transitive deps, smaller binaries, or\nsqlite3-CLI access on the data file. No code/API changes —\nOpen(path) still returns SQLite, OpenPebble(path) still \n[…]\nmit b4cf0c9 message and\nPEBBLE_VS_SQLITE.md §\"Real-data validation\"; archived bench file\ncaptured timing/correctness only, not du.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: Pebble is the recommended backend; SQLite stays supported",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-06T08:18:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "86e928a9824beeba797ce8ab5d59fefafefb6fb5",
          "body": "The Pebble store has lived alongside SQLite as a parallel prototype\nfor weeks; SQLite remains the production backend (Open and\nOpenPartitioned both call the SQLite implementation). Top-of-file\nTODO so the decision doesn't keep drifting.\n\nForcing function: secdek-sqlite-busy is a live production alar\n[…]\ne_test.go on current corpus shape. Rough criteria\nspelled out so the decision is data-driven, not reactive to a single\nalarm fire.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(todo): track SQLite vs Pebble backend decision",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-06T06:36:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6356e07944a8768925c3cf1f07bd713d44874f6b",
          "body": "go mod tidy during today's fork-on-trigger drill noticed that\ngithub.com/cockroachdb/pebble/v2 is a direct require (imported by\ninternal/pebbleq) but was marked // indirect in go.mod. Likely a\nstale annotation from when pebbleq was first added. Promoting to\ndirect + sweeping go.sum tidies.\n\nNo version change. v2.1.5 stays pinned.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(deps): pebble = direct require (post-tidy correction)",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T21:20:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "85a8c32ec60fdea6034cb1bf365dd99c9e56d809",
          "body": "Replaces the descriptive five-step plan in CONTINGENCY.md with an\nactual script — scripts/fork-pebble-on-trigger.sh — that executes\nthe full mitigation locally:\n\n1. Clones cockroachdb/pebble at the pinned SHA\n   (36a5551312e40777b3afff9846796aaadca5f877 = v2.1.5).\n2. Refuses to proceed if upstream's\n[…]\ns. The fork\nwould be source-only; no operational tweaks needed.\n\nLICENSE_AUDIT.md now records the pinned SHA and the drill result.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(contingency): make Pebble fork-on-trigger automated and verified",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T21:19:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1f840a90368409c93b6dbd5a7c3eb15cd61484f8",
          "body": "The optional Pebble backend pulls in 7 libraries maintained by\nCockroach Labs (pebble, errors, redact, swiss, crlib, logtags,\ntokenbucket). All currently Apache 2.0 / BSD-3, but Cockroach Labs\nrelicensed CockroachDB itself (Apache → BSL 2019, hybrid 2024) — the\ntrust profile warrants explicit invent\n[…]\n(\"don't auto-upgrade\nPebble without re-checking license\") is documented in CONTINGENCY.md\nrather than as a fragile go.mod comment.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: license audit + Cockroach Labs contingency plan",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T20:58:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bf3d1f168c1fc2de2483682616b69e8b064fcb5d",
          "body": "5 s wasn't enough to wait out a SecDek server warmup. The\ngridCorpusIndex build issues bursts of multi-second writes that\nhold the WAL writer slot; concurrent writers (edgar-load,\ncorrespondence-load) hit SQLITE_BUSY after 5 s and either log-\nand-skip or fail outright.\n\nObserved 2026-05-05 post-resi\n[…]\nemedy for transient writer\ncontention; it was already partially in place at 5 s, just\nunder-sized for our workload. No API change.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(open): bump busy_timeout 5 s → 60 s",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T19:39:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b4cf0c9215f428a9440b5d063e2572908725f43c",
          "body": "Took the live SecDek nightly backup (production quadstore at\nsfy.io), copied it to a fresh EC2 t4g.xlarge / gp3, ran\ncmd/pebble-correctness: MigrateToPebble + byte-identical comparison.\n\nSource corpus:\n  19,176,859 quads\n  2,688,183 distinct subjects\n  337 distinct predicates\n  28 GB on disk (SQLite\n[…]\nion at scale,\nread-side scan performance.\n\nWhat's still ahead (RETHINK_TEST_PLAN.md item D): a real consumer\nin shadow mode for ~30 days. The byte-identical correctness here is\nthe gate to start that.",
          "is_bot": false,
          "headline": "docs: real-data validation — 19M-quad SecDek migration → Pebble",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T18:32:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "60acb0204fd6cb6c8d8567bf175602dd630146c0",
          "body": "Driver for validation step C in RETHINK_TEST_PLAN.md: take a real\nSQLite-backed quadstore (e.g. SecDek's nightly backup), migrate to\nPebble via MigrateToPebble, then assert byte-identical results\nacross both backends on:\n\n- Total quad count\n- Distinct-subject hash (sha256 of sorted distinct subject \n[…]\ngo build -o pebble-correctness ./cmd/pebble-correctness\n  pebble-correctness -src /path/sqlite.db -dst /path/pebble-dir [-sample N]\n\nOutput is a sequential log of each phase + per-check OK/FAIL lines.",
          "is_bot": false,
          "headline": "cmd/pebble-correctness: real-data SQLite-vs-Pebble correctness check",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T17:56:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8505dfeb927af7838a3f1559ae7c6c429c3b1ee9",
          "body": "Validates Pebble integration on real-shaped workloads beyond the\nhand-picked fixtures in pebble_store_test.go.\n\nA. Property-based round-trip (TestPebbleTorture_RoundTrip):\n\n   Generates 5000 random quads with content drawn from ASCII +\n   Latin-1 + Cyrillic + CJK runes (NUL stripped — known key-\n   \n[…]\n470 lines of\ntest code, no production code changes.\n\nOutstanding: C (real SecDek-snapshot migration test) and D (real\nconsumer in shadow mode) are bigger commits, planned but not blocked\non this work.",
          "is_bot": false,
          "headline": "test: A + B — property-based torture + crash recovery for Pebble backend",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T17:46:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c5b067b4c73988aabc3cc8dc89d105ccf9067818",
          "body": "Date-stamps the v0.2.0 entry. Full release notes in CHANGELOG;\nheadline: quadstore.OpenPebble(path) ships behind the same\nWriter/Reader/BulkLoader surface as the SQLite-backed Open(path),\nwith measured 18-40x single-commit advantage and 5.5x bulk-load-\nat-100k advantage on cloud Linux. SQLite stays the default;\nPebble is opt-in.",
          "is_bot": false,
          "headline": "release: v0.2.0 — Pebble backend (opt-in) shipped",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T17:41:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b6b805992135dfff8e485cc26ee2e022000f7b5a",
          "body": "Audit pass — the public quadstore docs were pointing readers at\ninternal paths in a closed-source consumer (SecDek). Those readers\ncan't access those files; the references either looked broken or\nsuggested the source was browsable. Both bad. Fixed:\n\n- examples/README.md: removed the \"look at how Sec\n[…]\ngeneric note that the consumer-specific migration plan is\n  out-of-tree.\n\nPublic product references via https://sfy.io stay (CHANGELOG and\nREADME) — they cite a known production user, not source code.",
          "is_bot": false,
          "headline": "docs: remove pointers into closed-source SecDek internals",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T17:37:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8298a8ec9498115ab2d0d739c1628847c140f338",
          "body": "Two changes that should have landed alongside the public OpenPebble\ncommit but didn't.\n\nquadstore.go package godoc:\n  Was: \"Package quadstore is a minimal quad store backed by SQLite.\"\n  Now: explicitly documents both backends, points at OpenPebble,\n       references docs/PEBBLE_VS_SQLITE.md, mentio\n[…]\n2 with full\n       Writer/Reader/BulkLoader/LabelCounts/Stats/CommitStatsAt\n       surface and cross-backend migration.\"\n\nBoth surfaces — pkg.go.dev godoc and README — now match the\nstate of the repo.",
          "is_bot": false,
          "headline": "docs: package godoc + README \"Where it stands\" reflect v0.2-track",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T17:25:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a01297969e6bbc1f9761c481781e63ac49042a82",
          "body": "Added BenchmarkConcurrentWriters_{SQLite,Pebble}_8x and a BigBatch\nvariant. Hypothesis going in: Pebble's \"no single-writer ceiling\"\nshould give linear concurrent scaling. The numbers say otherwise.\n\nM1 Pro, 8 goroutines × 100 single-quad commits = 800 total:\n\n  Serial:      SQLite 79 ms, Pebble 15 \n[…]\ne here.\n\nAnti-marketing note: this is the kind of finding that wouldn't\nland in a Pebble pitch. Landing it because honesty about limits\nis the only thing that distinguishes the doc from a sales sheet.",
          "is_bot": false,
          "headline": "bench: concurrent-writers — honest finding, scaling didn't materialize",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T17:24:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "57ffca3e4f2a49506ad6974c1e7d84014a132254",
          "body": "License audit on 2026-05-05 of every transitive dep Pebble adds:\n- github.com/cockroachdb/pebble/v2 — BSD-3 (LevelDB-Go Authors)\n- github.com/DataDog/zstd — BSD-2\n- github.com/getsentry/sentry-go — MIT\n- github.com/cockroachdb/* (errors, redact, swiss, tokenbucket,\n  logtags, crlib) — Apache 2.0\n- g\n[…]\ncom/{kr,beorn7,cespare,dustin,RaduBerinde}/* — MIT\n- everything else — MIT or BSD\n\nNo AGPL, no BSL, no commercial-use restrictions. Adding this\naudit note to CHANGELOG so future evaluators can verify.",
          "is_bot": false,
          "headline": "docs: confirm Pebble-introduced deps are all permissive",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T17:17:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4d7760b50eb175c6659b8c4b913fa0fa4779f95a",
          "body": "Closes the v0.2 parity gap so users on existing SQLite stores have a\nreal path forward to the Pebble backend.\n\nAdded:\n\n- (*PebbleStore).LabelCounts(ctx) — iterates the LSP keyspace with\n  per-label SeekGE skip; O(distinct_labels × log N).\n- (*PebbleStore).Stats() — quad count from SPO scan; distinct\n[…]\nbleStore: Match (legacy *Iterator type;\nusers use Reader.Find with iter.Seq2), Path (graph traversal\nhelpers), and partitioning (single Pebble dir per Store). All\ndeferred until concrete user request.",
          "is_bot": false,
          "headline": "feat: Pebble parity — LabelCounts, Stats, CommitStats, MigrateToPebble",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T17:16:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "29cc854084ed82d0e3f0ddeb5171e13c80f966eb",
          "body": "Ran the same bench suite on a fresh AWS t4g.large (2 vCPU /\n7.6 GB / 50 GB gp3 EBS / Ubuntu 24.04 ARM64) to confirm the M1 Pro\nresult wasn't a laptop-disk artifact.\n\nDisk probe (fio random 4K writes, iodepth=1, O_DIRECT+O_SYNC):\n  gp3 EBS    345 IOPS, ~2.9 ms per fsync\n  M1 NVMe    ~30,000+ IOPS for\n[…]\ns opt-in via OpenPebble.\nv1.0 question of which becomes default still open — Pebble's\n~20 transitive deps and lack of sqlite3 CLI debuggability are\nreal costs the speed wins must continue to outweigh.",
          "is_bot": false,
          "headline": "docs: Linux EC2 t4g.large numbers — Pebble dominance widens",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T17:05:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9d6c44870e110ae5a844db93b02816ca1cc7e6eb",
          "body": "Promotes internal/pebbleq behind a public quadstore.OpenPebble(path)\nAPI. SQLite-backed Open(path) stays the default; users opt in to\nPebble when the perf wins justify the transitive-dep cost.\n\nPublic API additions:\n- OpenPebble(path) (*PebbleStore, error)\n- (*PebbleStore).Close() / Writer / Reader \n[…]\nANGELOG updated with full breakdown of perf wins, dep cost, and\nremaining gaps. README adds a one-paragraph callout for the\nopt-in. Cloud Linux numbers still pending — see RETHINK_TEST_PLAN.md\nTest 2.",
          "is_bot": false,
          "headline": "feat: quadstore.OpenPebble — public opt-in Pebble backend",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T16:48:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "60c7c3f4912e9dfea59b07104fb64dfe0aa92bef",
          "body": "Updates the head-to-head doc now that the Pebble prototype has\nfeature parity (audit, label validation, real Find). Adds the\naudited single-commit row, which is the comparison most production\nusers care about: 5.95 µs (Pebble) vs 107 µs (SQLite) — 18× faster.\n\nDecision-rule moves from \"4 of 5\" to \"5\n[…]\n the new audited\nbatch and find rows holding up. Updated \"What this benchmark does\nNOT prove\" to remove the prototype-omits-audit caveat (no longer\ntrue) and the no-validation caveat (no longer true).",
          "is_bot": false,
          "headline": "docs: refresh PEBBLE_VS_SQLITE with audited prototype numbers",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T16:43:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a6a20c099a00a151329def64814bc19e4933a289",
          "body": "Promotes internal/pebbleq from \"minimum viable bench harness\" to\n\"production-shaped prototype.\" Still under internal/ until Linux\nnumbers confirm and we decide on the public OpenPebble entrypoint.\n\nAdded to match writer.go / reader.go / bulk.go semantics:\n\n- Label namespace validation. source: / der\n[…]\nh backend side-by-side.\n\nNext: same bench suite on cloud Linux to confirm the deltas survive\nreal-disk fsync. If they hold, promote pebbleq behind quadstore.\nOpenPebble(path) as a v0.2 opt-in backend.",
          "is_bot": false,
          "headline": "pebbleq: feature-complete prototype with audit, validation, real Find",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T16:42:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f6d460517819509036a0e00f9cc5f87bd1586204",
          "body": "internal/pebbleq/ is a non-production prototype: same Open/Writer/\nReader/BulkLoader API shape as quadstore proper, four-keyspace\nencoding (SPO/POS/OSP/LSP with single-byte prefixes), default Pebble\noptions other than a quiet logger.\n\nComparison runs at lazy-fsync durability on both sides (SQLite\nsy\n[…]\nction commands\n\nNext: same suite on cloud Linux (t4g.large, gp3 EBS) to confirm the\ndeltas survive a real-disk fsync profile. If they do, begin\nproduction Pebble port behind quadstore.OpenPebble(...).",
          "is_bot": false,
          "headline": "bench: Pebble prototype + head-to-head numbers vs SQLite (M1 Pro)",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T16:30:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c6865294b4a984512ba71e40d89d851dd1808228",
          "body": "The rigorous analysis lives in RETHINK_2026.md; this doc is the\nshort-form decision artifact:\n\n- Recommendation (swap SQLite for Pebble), with order-of-magnitude\n  expected deltas as a target, not a claim.\n- Three tests in priority order, with explicit pass/fail criteria:\n  1. Pebble head-to-head — \n[…]\nd order if we proceed (5 steps, internal/pebble/*).\n- Compatibility commitment: public API surface does not change\n  during the prototype; existing deployments are not broken to\n  land a backend swap.",
          "is_bot": false,
          "headline": "docs: RETHINK_TEST_PLAN — actionable companion to RETHINK_2026",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T16:09:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b14635a6b41aebf9fdcec75a26b7f8f461354554",
          "body": "Rigorous self-audit. Separates what's aged well (label namespace,\nembedded library, pure Go, Reader/Writer/BulkLoader API, audit as\nwrite-time invariant) from what we'd change today.\n\nThe biggest lever: swap SQLite → Pebble. SQLite's structural costs\n(single-writer ceiling, B-tree index rebuild, INS\n[…]\nnside SQLite.\n\nLinked from README \"Start here\" so it's findable as a public\nposition, not internal note. Open invitation: run any of these\ntests on a server we don't have access to and PR the results.",
          "is_bot": false,
          "headline": "docs: RETHINK_2026.md — what we'd build differently today",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T16:07:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f2daa0ce9bb63ac698bdc541fe02d0a1f6c96be1",
          "body": "Closes the largest open issue in LIMITATIONS.md. Single-quad Commit\ndrops from ~108 µs → ~60 µs (45% faster) on M1 Pro / darwin-arm64,\nbenchtime=3s, count=2 — putting Writer.Commit within ~2.4× of raw\nmodernc.org/sqlite single-INSERT (was ~4.3×).\n\nAPI: additive bool field on Batch (zero-value preser\n[…]\nwrites.\n\nTests: TestWriterCommit_NoAudit (audit rows are zero, mixing works)\nand TestWriterCommit_NoAudit_LabelStillValidated (label rules are\nnot bypassed). Bench: BenchmarkCommit_SingleQuad_NoAudit.",
          "is_bot": false,
          "headline": "feat: Batch.NoAudit — opt out of commits + commit_ops for hot paths",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T16:04:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "69eef82c028e46610e0f69934d729e0414ebfd98",
          "body": "Single-page audit of every way quadstore is worse than what an\nevaluator might hope for. Organized so adoption decisions are made\non real evidence, not the marketing surface:\n\n- Hard constraints (architectural, will not change): single-writer\n  per partition, no sharding, no query language, no graph\n[…]\nys honest.\n- Empty-promise check: invitation to PR-remove items that quietly\n  got fixed; performance numbers should be reproducible.\n\nLinked from README \"Start here\" so it's findable before adoption.",
          "is_bot": false,
          "headline": "docs: add LIMITATIONS.md — expose every known problem honestly",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T16:00:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "13d136a1b4bdf2931dad45df8f545ea38ce107be",
          "body": "Original code prepared addQuad, logOp, and removeQuad on every Commit\nregardless of what the batch contained. For the common shape\n(Adds-only, no Removes) the removeQuad prepare is pure waste.\n\nNow: only prepare statements we'll actually Exec against. Single-quad\nCommit drops from ~121 µs to ~112 µs\n[…]\nonConn, rebind\nvia tx.StmtContext) was tested and reverted: tx.StmtContext adds\noverhead that regresses Batch1k by ~14% under modernc/sqlite,\nwiping out the single-commit gain on workloads that batch.",
          "is_bot": false,
          "headline": "perf: skip Prepare in Writer.Commit for unused statement paths",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T15:55:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7666257512dae3fc2f6e7fc3cd87383ca15a1493",
          "body": "Replaces the technical-overview README with the conversational\n'Graph with a purpose' framing — leads with the four real questions\n(provenance, multi-tenancy, derivation rebuild, audit) that pushed\nus from triple to quad, and lets the label namespace fall out as\nthe answer.\n\nKeeps the comparison tab\n[…]\ninding: BulkLoader is within ~2% of expert\nhand-rolled SQLite using the same schema.\n\nNet: 213 → 128 lines, opening section now tells the user what\nproblem this exists to solve before showing the API.",
          "is_bot": false,
          "headline": "docs: rewrite README with origin-story voice from writeup",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T15:55:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "47d0b679ff701b06d37e53ab40fc00a325d96167",
          "body": "Adds BenchmarkCompare_RawSQLite_QuadstoreShape: raw modernc SQLite\nrunning quadstore's exact schema and exact pattern (four indexes,\ndrop three on load start, multi-row INSERT in 500-row batches,\nrebuild on close). Same pattern, no library.\n\nResult: BulkLoader is +6% at N=1k and +2% at N=10k/100k vs\n[…]\norkload\nonly reads by subject, you'd reproduce the simple-raw numbers in 200\nlines. If you read by predicate, object, or label too, you'd\nreproduce quadstore's schema and land at ~the same throughput.",
          "is_bot": false,
          "headline": "bench: prove BulkLoader is within 2% of hand-rolled raw SQLite",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T15:38:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6d788a2700b06993bd10695e4558899966c0e9cc",
          "body": "Earlier 9× overhead claim was a benchmark methodology bug — the loop\nreused the same store across iterations, so later iterations inserted\ninto a 320k-row table while the timer kept running. Fresh DB per\niteration via b.StopTimer/StartTimer fixes it.\n\nHonest overhead at scale: ~2.2× across N=10k and\n[…]\n rows that's\nnet-negative, which is why Writer.Commit batches are the right tool\nfor small loads.\n\nUpdates docs/PERFORMANCE.md with the corrected numbers and the\nbreakdown of where the overhead lives.",
          "is_bot": false,
          "headline": "bench: parameterize bulk-load comparison across N=1k/10k/100k",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T15:33:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5b258716f5bf1729d69dee9f6947a952c5c6f16e",
          "body": "Adds bench_compare_test.go: hand-rolled raw SQLite quad table on the\nsame modernc.org/sqlite driver, same WAL+NORMAL defaults quadstore\nuses, plus a BulkLoader-equivalent path with the bulk PRAGMAs the\nlibrary applies internally.\n\nCaptures the actual cost of using the library:\n- Single-quad commit: \n[…]\nead comes from. Also fixes a misleading\nline that claimed synchronous=FULL — quadstore opens WAL+NORMAL, so\nthe existing microbenchmark numbers were already taken with the\nrelaxed durability settings.",
          "is_bot": false,
          "headline": "bench: side-by-side vs raw SQLite (same modernc driver, same PRAGMAs)",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T15:25:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b274b7ad6cc88022ab10b6220bc61c442f43a021",
          "body": "Make the project feel like one a serious developer would invest time\ninto:\n\n- .github/ISSUE_TEMPLATE/bug_report.md — guides reporters toward the\n  reproducer + environment info we need.\n- .github/ISSUE_TEMPLATE/feature_request.md — explicitly states the\n  project's scope (\"no sharding, no query lang\n[…]\nitly NOT\n  claiming as our own.\n\nThese don't change any code. They change first-impression signals\nwhen someone lands on the repo.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: GitHub repo polish — issue/PR templates, security policy, CoC",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T15:17:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2f5ecb26045231a9f45539dad0384b313ace034b",
          "body": "The README's Inspiration section becomes Acknowledgements — explicit\nthanks by name, framed as the door being open if Barak or Robert ever\nwant to engage. Goal: if either of them ever lands on this repo, they\nshould feel respected, not \"credited as required.\"\n\nNew ACKNOWLEDGEMENTS.md gives a longer-\n[…]\ny + modernc.org/sqlite (Jan Mercl) + SQLite (D. Richard Hipp) +\nthe Go team for iter.Seq2. Linked from README documentation index.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: warmer credit to Barak Michener + Robert Hessmann + Cayley lineage",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T15:14:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "15e41886c0af286770b6ad3b80d3c49e59538971",
          "body": "Real benchmark numbers on M1 Pro:\n  Commit_SingleQuad:  116 µs/op (~8,600/sec)   — synchronous=FULL fsync each\n  Commit_Batch1k:     12 µs/quad (~80,000/sec) — amortized batch\n  Find_BySubject:     69 µs/op (~14,400/sec)   — indexed lookup\n\nProduction observations from SecDek (28 GB graph, t4g.large\n[…]\nn work (PRs welcome): BulkLoader 1M-quad bench, concurrent-reader\ncontention bench, side-by-side vs raw SQLite + vs Cayley/BoltDB.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: PERFORMANCE.md — measured numbers + practical guidance",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T15:12:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e6ef910275a282f01c5b0661296511be59eccd46",
          "body": "Three self-contained main.go programs that demonstrate the library's\nmain shapes. Each is short enough to read in one screen, builds clean\n(CI verifies it), and writes to a MkdirTemp directory that's cleaned\nup on exit.\n\n- minimal — Open + Writer.Commit + Reader.Find. The 30-second\n  walkthrough. Sh\n[…]\nalidation error (\"label X must start with one of: source:,\nderived:, human:, meta:\").\n\nREADME updated with explicit example links.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "examples: 3 runnable programs (minimal / audit-log / multi-tenant)",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T15:11:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d226b76ea9cdf9ca83c9ef4d749b6720dbc1d467",
          "body": "- README: sharpened positioning (\"graph database for Go applications,\n  pure Go, no CGo\"), comparison table vs Cayley/Dgraph/SQLite, status\n  callout, expanded Cayley credit (Barak Michener, Robert Hessmann),\n  badges, honest \"used in production\" (just SecDek for now).\n- CHANGELOG: v0.1.0 entry — wh\n[…]\nssed all targets.\n- Removed docs/QUADSTORE.md (older overlapping positioning doc; README\n  covers the same material more crisply).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.1.0: first public release",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T15:05:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "00cad44c4af4d51700c6b6324ed1a10cd4f06da4",
          "body": "…tion\n\nThe original framing reached for watermarks as the default answer.\nFor most ingest pipelines the simpler answer — a per-subject\nsentinel check that gates the expensive work — is sufficient and\nproven in production. Reach for watermarks only when many phases\nshare a change-set stream and empty\n[…]\nr to retired SecDek redesign plan with\n  pointers to INGEST_CONVENTION.md and INGEST_AUDIT.md as worked\n  in-repo specializations.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(incremental): lead with per-subject sentinel; cite SecDek conven…",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T07:41:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "298b7fb1565cb5fb7c8473fabdb6a501b3e8367e",
          "body": "Library consumers keep falling into the \"rebuild from scratch every\ntick\" anti-pattern: every recurring derivation reads the entire\ncorpus, recomputes everything, and writes the result. Cheap on day\none, breaks at scale.\n\nThis doc captures the three patterns that fix it (Watermark for\nderivation, Co\n[…]\nces PARTITIONING_DESIGN.md (orthogonal but\ncomplementary) and SecDek's INGEST_REDESIGN_PLAN.md (the SecDek-\nspecific application).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add INCREMENTAL_PROCESSING.md — patterns + anti-patterns",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T07:20:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "67edbfd1443092dffb6b335fa3cbe7b1c0e97b5e",
          "body": "Adds quadstore.MigrateFromSnapshot(ctx, srcPath, dst, opts) which takes\na consistent point-in-time copy of the source via SQLite's\n`VACUUM INTO`, then runs Migrate against the frozen snapshot.\nConcurrent writers on srcPath remain unblocked throughout (per SQLite\ndocs); the migration sees a single co\n[…]\nnt. The library trusts the caller.\n\nDoc: ~/quadstore/docs/PARTITIONING_DESIGN.md §Migration tooling.\nTests: 3 new (46 total pass).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(migrate): MigrateFromSnapshot for race-free upgrades",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T06:37:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8289ed61ee97b71aab6cd0b6cfd2ddaed0ee218e",
          "body": "Migrate was setting bl.batchSize = opts.ChunkSize (default 10000),\nproducing 40000 SQL variables per multi-row INSERT and tripping\nmodernc.org/sqlite's SQLITE_MAX_VARIABLE_NUMBER ceiling with\n\"SQL logic error: too many SQL variables (1)\".\n\nBulkLoader's default of bulkBatchRows = 500 (= 2000 vars per\n[…]\necoupled from the\nper-INSERT row count.\n\nCaught while applying SecDek's first real migration on a 19 M-row\nsource DB (2026-05-05).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(migrate): don't override BulkLoader.batchSize",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T06:28:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6fd33c3a501b0b1cbc6e642616c158af3ea282a1",
          "body": "A single quads table hits a B-tree dilution wall when a Store\naccumulates fact families that don't share queries. Concrete trigger:\nSecDek's live DB grew 1.3 GB → 28 GB in two weeks after a comment-\nletter corpus load, and product queries on the (still-256K-row)\nno-action letter family now scan a B-\n[…]\n\nAlso brings previously-untracked baseline files into version control:\nREADME.md, LICENSE, CONTRIBUTING.md, bulk.go, bulk_test.go.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: partitioning support (OpenPartitioned, Migrate, fan-out reader)",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-05T06:06:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "188db91d6ffa04888a3efa4f2ab0d5b0f20d263c",
          "body": "SQLite's wal_autocheckpoint moves data into the main DB on schedule\nbut with journal_size_limit=-1 (the default) the WAL high-water mark\nis never truncated — bytes are reused for the next round of writes,\nso on long-lived writers (server processes, daily-running ingests)\nthe WAL file grows unbounded\n[…]\n small enough to bound disk consumption\nacross long uptime windows.\n\nAffects every quadstore consumer (SecDek, LawDek-v2, future).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(open): add journal_size_limit=500MB to default DSN PRAGMAs",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-05-01T08:03:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "139799f9a972221fcd24ada6bfc0822496eaeadf",
          "body": "commit_ops grows unbounded (1 row per add/remove per commit); in SecDek\nit was 1.87M rows / ~42% of the 1.7 GB DB file. Its parent table\n(commits) holds lightweight provenance metadata and stays.\n\nAdditive API (no break):\n- Writer.PruneOps(ctx, olderThan) deletes commit_ops rows for commits\n  whose \n[…]\nd.\n\nTestWriterPruneOps covers: delete eligible, preserve commits, preserve\nquads, idempotent, error-after-close. 26 tests passing.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: commit-journal retention — Writer.PruneOps + cmd/prune",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-04-20T16:54:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d9f37f5d7860243899b74d44dd05c4a4c5c48bd6",
          "body": "…y ignored)\n\nThe prior DSN (?_journal_mode=WAL&_busy_timeout=5000) is not honored by\nmodernc.org/sqlite on file-backed DBs. Verified 2026-04-20 on the live\n1.7 GB SecDek DB: journal=delete, synchronous=FULL, cache=2MB default,\nbusy_timeout=0 — every dek product has been running in default\nrollback-j\n[…]\n6 MiB).\n\nPost-fix verification on fresh DB: journal=wal, sync=1, cache=-262144,\nbusy=5000, WAL sidecar created. All 25 tests pass.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: apply journal_mode/busy_timeout via _pragma= (legacy DSN silentl…",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-04-20T16:42:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f32eaaff631b9984d69c9c9249e537f57b2893ba",
          "body": "Three benchmarks to catch regressions when LawDek/PubDek workloads\nstart exercising the DB:\n- BenchmarkCommit_SingleQuad: per-commit overhead (WAL fsync dominates)\n- BenchmarkCommit_Batch1k: ingest-pipeline throughput\n- BenchmarkFind_BySubject: indexed-read latency\n\nFirst run on M1 Pro: 1.6k/sec sin\n[…]\ns, 75.8k/sec batched,\n73µs Find — see project_dek_graph_db_api.md pre-pass decisions for\ninterpretation and numbers-drift caveats.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: baseline benchmarks for commit and Find paths",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-04-14T02:33:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "37afc514f492dd904846c07cdaa16119e8e3cd80",
          "body": "…ation\n\n5 instances of fmt.Println(\"text\\n\") changed to fmt.Print(\"text\\n\\n\").\nSame bytes on stdout, vet-clean. Unblocks `go test ./...`.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(observe): satisfy go vet while preserving visual blank-line separ…",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-04-14T02:25:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d24279ac2449707bc5357ce1caee670f7dead530",
          "body": "…ption\n\nAdds rigorous API for dek-family graph DB consumers (LawDek, PubDek):\n- Writer/Reader separation, ctx throughout, iter.Seq2 streaming\n- Batch type: Adds, Removes, default Label, Metadata\n- commits + commit_ops journal (schema v2, UUIDv7 time-sortable ids)\n- Enforced label namespace on Writer\n[…]\ne) built-in\n- Partition opaque key reserved for future per-partition routing\n- 11 new tests covering new surface; 25 total passing\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Writer/Reader API with commits journal for multi-product consum…",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-04-14T02:24:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0e7293e5518e47199834c23452161b461136f079",
          "body": "RESEARCH.md: added page clustering section with cluster-to-index\nmapping table, interactive HTML tool description, and the key insight\n(find clusters, don't name them).\n\nCHANGELOG.md: added second session with observe tool, HTML review\npage, key findings, and research correction.\n\nTODO.md: updated to current state — clustering works, next steps\nare Michelle feedback and mega-index integration.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: update RESEARCH, CHANGELOG, TODO for clustering session",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-04-13T22:32:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8d3a63cf66535f6ef724323a39681b4b0cf57aa9",
          "body": "fmt.Sprintf had 4 substitutions but only 3 args. Added simJSON\nas the 4th arg. Clusters now render and splits use real cosine\nsimilarity from the precomputed matrix.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: pass simMatrix to HTML format string (was MISSING)",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-04-13T22:19:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cc050e2fe2d0633ceec0c001995a3ae71693838f",
          "body": "- Precompute full pairwise similarity matrix server-side, embed in HTML\n- Client-side split uses real cosine scores instead of 6-word Jaccard\n- Minimum 4 pages required to split (guarantees 2+ per side)\n- Refuses to split if pages can't be meaningfully separated\n- Results sorted by page number\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: split uses real cosine similarity, enforces min 2 pages per group",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-04-13T20:47:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "79eb9c8e74f25173c2c0de902696fb3954b14b51",
          "body": "- Each cluster has a \"Split this group\" button that divides it into\n  2 sub-clusters based on vocabulary similarity (k-means k=2 Jaccard)\n- Sub-clusters indented with left border, labeled with parent\n- Splits can be repeated: 10 → 15 → 22 → name them → export\n- Page text now flows as prose (PDF line\n[…]\nanularity is right, then name each group. The depth at which\nthey stop splitting reveals the natural granularity of index entries.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: split clusters + clean text formatting",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-04-13T19:53:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "de16bfaff398ce33be2ed9a71a855583587d655f",
          "body": "Self-contained HTML page (no deps, 35KB) showing page clusters.\nThe indexer opens in a browser, names each cluster, expands pages\nto read text, and exports named clusters as JSON.\n\nUX flow: see clusters → name them → verify by reading → export.\n\nIteration 1 of 3: static presentation + naming + export.\nNext: split/merge clusters, drag pages between groups.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: HTML cluster review page for indexer",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-04-13T19:17:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e6c66ddd2416134301cffc6e20d601a198427ea5",
          "body": "Page clustering via TF-IDF cosine similarity finds 10 clusters that\nmap directly to Michelle's major index groupings:\n- Cluster 1 (23-33): food/acorns/hoarding\n- Cluster 2 (4-6,36,50-55): tools/bill/tongue\n- Cluster 3 (1,60-68): species identification/key\n- Cluster 4 (17-22): sapsuckers/sap\n- Cluste\n[…]\ng\n\nThe tool finds the group boundaries. The indexer names them.\nThis is the expose-don't-solve pattern: unnamed groups for review.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: page clustering + page range fix",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-04-13T19:08:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a77572adf4ee35642cc3b1c9f13cdbb1fa9fd022",
          "body": "Parser was only extracting range endpoints, not filling in between.\nen-dash and hyphen ranges now properly expand. Adds 83 page references\nthat were being silently dropped.\n\nGenuine absence rate stable at 22.7% (was 22.9% before fix).\nThe finding holds — not a page mapping error.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: expand page ranges (23–27 → 23,24,25,26,27)",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-04-13T18:57:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c51e1783afdceab7c1126995c6dbdd7c0cb2cd14",
          "body": "Original claim of 46.6% no-match was too strict. After accounting for\nmorphological variants: 22.9% genuine absence (down from 46.6%).\n\nDocuments the three operations of indexing:\n1. Direct extraction (25.8%)\n2. Normalization (30.7%)\n3. Extension + abstraction (43.5% — the human judgment layer)\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: update RESEARCH.md with corrected input-output findings",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-04-13T18:55:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3931545000d93818200dc4362623ce4fbb997345",
          "body": "New cmd/observe with three modes:\n- Default: shows entry terms alongside their page text, side by side\n- -stats: counts how often entry terms appear on their pages\n- verify: digs into every \"no match\" pair to classify WHY\n\nKey finding (corrected from initial 46.6% claim):\n- 25.8% exact match (term i\n[…]\nxt match)\n2. Normalize (variant forms → canonical term)\n3. Abstract (name what the page discusses, even when the word isn't there)\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: observe tool — raw input-output analysis of index entries",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-04-13T18:54:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "78d50c8acd621958f366d81f10b2af84d9a53540",
          "body": "TODO captures the research pause point and recovery steps.\nCHANGELOG documents everything built and found in this session.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add TODO (where to start next) and CHANGELOG",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-04-13T14:48:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0fc76f27f40c6d69671a7af480f9531ade280b16",
          "body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: remove redundant newlines in Println calls (vet clean)",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-04-13T14:46:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9926152c51404a0e7e4c3d79e3ea385357f61456",
          "body": "Cayley-inspired SQLite quad store (481 lines) with path traversal,\npattern matching, and tokenized shape export. Standalone Go module,\nzero deps beyond modernc.org/sqlite.\n\nIngest tool loads professional indexer's reference DOCX and NLP\npipeline output into same store with labels. Computes 9 signal \n[…]\nrch paused at: model the input-output transformation (pages →\nindex), not the indexer's intent. See RESEARCH.md for full analysis.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: quad store library + contention research (Woodpeckers)",
          "author_name": "Jay Guiliano",
          "author_login": null,
          "committed_at": "2026-04-13T14:45:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 6,
      "commits_last_year": 74,
      "latest_release_at": "2026-05-15T15:11:32Z",
      "latest_release_tag": "v0.2.4",
      "releases_from_tags": true,
      "days_since_last_push": 50,
      "active_weeks_last_year": 5,
      "days_since_latest_release": 72,
      "mean_days_between_releases": 2
    },
    "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/dukkandcards/quadstore",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/dukkandcards/quadstore",
          "is_deprecated": false,
          "latest_version": "v0.2.4",
          "repository_url": "https://github.com/dukkandcards/quadstore",
          "versions_count": 6,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-05-15T15:11:32Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 72
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 26692,
      "source_files_sampled": 52,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "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/cockroachdb/pebble/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.1.5"
        },
        {
          "name": "github.com/google/uuid",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "modernc.org/sqlite",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.48.2"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": null,
      "bot_contributors": 0,
      "top_contributors": [],
      "contributors_sampled": null,
      "top_contributor_share": null
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 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": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "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": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 10,
            "reason": "GitHub workflow tokens follow principle of least privilege",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 8,
            "reason": "2 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "c54c67cac4ae8e34fedb6b2a5305b116a8628e30",
        "ran_at": "2026-07-26T15:55:30Z",
        "aggregate_score": 5.1,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-05-15T15:14:49Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/dukkandcards/quadstore",
    "host": "github.com",
    "name": "quadstore",
    "owner": "dukkandcards"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 52,
      "inputs": {
        "security": 51,
        "vitality": 64,
        "community": 43,
        "governance": 35,
        "engineering": 66
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 64,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "at_risk",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 48,
            "inputs": {
              "commits_last_year": 74,
              "human_commit_share": 1,
              "days_since_last_push": 50,
              "active_weeks_last_year": 5
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 50 days ago",
                "points": 18,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 50
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "5/52 weeks with commits",
                "points": 3.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "74 commits in the last year",
                "points": 16.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 74
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 88,
            "inputs": {
              "releases_count": 6,
              "latest_release_tag": "v0.2.4",
              "releases_from_tags": true,
              "days_since_latest_release": 72,
              "mean_days_between_releases": 2
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "6 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 72 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 72
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~2 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 2
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "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 (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 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": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "critical",
            "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": 16,
            "inputs": {
              "followers": 0,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "dukkandcards",
              "public_repos": 1,
              "account_age_days": 192
            },
            "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": "0 followers of dukkandcards",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "dukkandcards"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "1 public repos, account ~0 yr old",
                "points": 3.2,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 1
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/dukkandcards/quadstore"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 72
            },
            "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 72 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 72
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "6 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "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": 66,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "1 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [
                "embedded-database",
                "golang",
                "graph-database",
                "graphdb",
                "quadstore",
                "sqlite"
              ],
              "has_wiki": false,
              "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": "6 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 51,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 51,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 5.1
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "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": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "GitHub workflow tokens follow principle of least privilege",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "2 existing vulnerabilities detected",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 59,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "74 of 74 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 74,
                      "sampled": 74
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.649,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "go.mod (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "go.mod"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "48 of the last 74 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 48,
                      "sampled": 74
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 26692,
              "source_files_sampled": 52,
              "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/52 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 52,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Contributor list unavailable",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-26T15:55:32.965065Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/dukkandcards/quadstore.svg",
  "full_name": "dukkandcards/quadstore",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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