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

ruslano69 / funcfinder

- Multi-language function boundary detection - Support for Go, C, C++, C#, Java, D - 95%+ token reduction for AI workflows - Complete documentation and CI/CD"

GoMIT★ 2 estrellas⑂ 0 forksdesde dic 2025Ver en GitHub ↗

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

57
global / 100
Moderado

Índice de salud del software

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

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

Perfil de puntuación

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

Titularidad

Ruslan OmelchenkoCuenta personal
2 seguidores8 repositorios públicosdesde mar 2019SIP

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/ruslano69/funcfinderv1.11.0-8hace 5 días

Métricas por categoría

Vitalidad

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

80Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 5 días
9.7/36Cadencia de commits — 14/52 semanas con commits
18/18Volumen de commits — 203 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_year203
human_commit_share1
days_since_last_push5
active_weeks_last_year14
Cómo se puntúa
27/27Publica versiones — 8 versiones publicadas
36/36Recencia de las versiones — última versión hace 5 días
27/27Cadencia de publicación — una versión cada ~26,2 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count8
latest_release_tagv1.11.0
releases_from_tagsno
days_since_latest_release5
mean_days_between_releases26,2

Comunidad y Adopción

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

24Crítico · 18% del índice global
Cómo se puntúa
0/60Estrellas — 2 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars2
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)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sostenibilidad y Gobernanza

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

56Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
9.3/22.5Distribución de commits — el principal contribuyente firma el 59% de los commits
2.7/13.5Amplitud de contribuyentes — 2 contribuyentes
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Datos de entrada utilizados
bus_factor1
contributors_sampled2
top_contributor_share0,586
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
38.2/38.3Aceptación de PR — 50/50 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs50
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
3.4/25Alcance del propietario — 2 seguidores de ruslano69
18.9/25Trayectoria — 8 repos públicos, cuenta de ~7 años
Datos de entrada utilizados
followers2
owner_typeUser
is_verified
owner_loginruslano69
public_repos8
account_age_days2689
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 5 días
20/20Historial de versiones — 8 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/ruslano69/funcfinder
ecosystemsgo
any_deprecatedno
min_days_since_publish5

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 — 3 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
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepage
has_readme
has_docs_dir
has_description

Seguridad

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

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
1.5/2.5Contributors — project has 2 contributing companies or organizations -- score normalized to 6
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
5/5SAST — SAST tool detected: CodeQL
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
6.8/7.5Vulnerabilities — 1 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4,2
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, packaging. Los pesos restantes se han renormalizado.
Cómo se puntúa
26.6/35Dependencias directas libres de avisos conocidos — 1 afectados: golang.org/x/text v0.38.0 (unknown)
0/25Dependencias indirectas libres de avisos conocidos — el conjunto transitivo no es separable de las dependencias de desarrollo y prueba en este alcance
40/40Sin avisos pendientes — ningún aviso lleva público más de 90 días
Datos de entrada utilizados
sourceosv
advisories1
affected_packages1
assessed_packages15
unassessed_packages0
affected_by_severityunknown 1
direct_affected_packages1
Excluidos de la puntuación (sin datos o no aplicable): Dependencias indirectas libres de avisos conocidos. Los pesos restantes se han renormalizado. Se cotejaron 15 dependencias resueltas con OSV. Este repositorio no publica ningún paquete que el índice resuelva, por lo que se evaluó en su lugar el grafo de dependencias del repositorio. Ese grafo mezcla fijaciones de desarrollo y prueba con las dependencias distribuidas, de modo que solo se puntúan las dependencias declaradas en tiempo de ejecución; los hallazgos transitivos se informan como contexto y quedan excluidos de la puntuación. No se analiza la alcanzabilidad.

Preparación para IA

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

75Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md, cmd/AGENTS.md, docs/AGENTS.md, examples/AGENTS.md, internal/AGENTS.md, skills/AGENTS.md, test_examples/AGENTS.md, test_files/AGENTS.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 97 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,97
agent_instruction_filesAGENTS.md, cmd/AGENTS.md, docs/AGENTS.md, examples/AGENTS.md, internal/AGENTS.md, skills/AGENTS.md, test_examples/AGENTS.md, test_files/AGENTS.md
agent_instruction_max_bytes13.231
Cómo se puntúa
18/18Arranque con un solo comando — Makefile
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 — 84 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum
has_dockerfileno
typed_language
bootstrap_filesMakefile
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,84
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/83 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes24.709
source_files_sampled83
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

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

Advertencias de recopilación de datos

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

Más detalle

OpenSSF Scorecard 4.2 / 10
4.2agregado

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
n/dCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
6Contributorsproject has 2 contributing companies or organizations -- score normalized to 6
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
10SASTSAST tool detected: CodeQL
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
9Vulnerabilities1 existing vulnerabilities detected
Dependencias directas 5
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/ledongthuc/pdfv0.0.0-20250511090121-5959a4027728go.mod
Gogithub.com/zeebo/xxh3v1.1.0go.mod
Gogolang.org/x/netv0.56.0go.mod
Gogolang.org/x/textv0.38.0go.mod
Gomodernc.org/sqlitev1.53.0go.mod
Todas las dependencias 15

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

RegistroPaqueteVersiónRelación
Gogithub.com/ledongthuc/pdfv0.0.0-20250511090121-5959a4027728directa
Gogithub.com/zeebo/xxh3v1.1.0directa
Gogolang.org/x/netv0.56.0directa
Gogolang.org/x/textv0.38.0directa
Gomodernc.org/sqlitev1.53.0directa
Gogithub.com/dustin/go-humanizev1.0.1indirecta
Gogithub.com/google/uuidv1.6.0indirecta
Gogithub.com/klauspost/cpuid/v2v2.2.10indirecta
Gogithub.com/mattn/go-isattyv0.0.20indirecta
Gogithub.com/ncruces/go-strftimev1.0.0indirecta
Gogithub.com/remyoudompheng/bigfftv0.0.0-20230129092748-24d4a6f8daecindirecta
Gogolang.org/x/sysv0.46.0indirecta
Gomodernc.org/libcv1.73.4indirecta
Gomodernc.org/mathutilv1.7.1indirecta
Gomodernc.org/memoryv1.11.0indirecta
Avisos de dependencias 1

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

PaqueteVersiónRelaciónGravedadAvisosCorregido en
golang.org/x/textv0.38.0directadesconocida10.39.0

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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 3124,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "C": 4399,
        "D": 6562,
        "C#": 8159,
        "Go": 438364,
        "C++": 21434,
        "PHP": 3116,
        "Java": 20852,
        "Ruby": 2437,
        "Rust": 2939,
        "Scala": 3138,
        "Shell": 1265,
        "Swift": 2017,
        "Kotlin": 2524,
        "Python": 25865,
        "Makefile": 7542,
        "JavaScript": 3429,
        "PowerShell": 1494,
        "TypeScript": 1285
      },
      "pushed_at": "2026-07-18T11:34:48Z",
      "created_at": "2025-12-31T16:05:21Z",
      "owner_type": "User",
      "updated_at": "2026-07-18T11:34:51Z",
      "description": "- Multi-language function boundary detection - Support for Go, C, C++, C#, Java, D - 95%+ token reduction for AI workflows - Complete documentation and CI/CD\"",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": "sipsoft.com.ua",
      "name": "Ruslan Omelchenko",
      "type": "User",
      "login": "ruslano69",
      "company": "SIP",
      "location": "Ukraine",
      "followers": 2,
      "avatar_url": "https://avatars.githubusercontent.com/u/48532671?v=4",
      "created_at": "2019-03-13T20:19:42Z",
      "is_verified": null,
      "public_repos": 8,
      "account_age_days": 2689
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.11.0",
          "kind": "minor",
          "published_at": "2026-07-18T11:35:38Z"
        },
        {
          "tag": "v1.10.1",
          "kind": "patch",
          "published_at": "2026-07-18T11:17:25Z"
        },
        {
          "tag": "v1.10.0",
          "kind": "minor",
          "published_at": "2026-07-18T07:48:08Z"
        },
        {
          "tag": "v1.9.0",
          "kind": "minor",
          "published_at": "2026-07-17T13:34:49Z"
        },
        {
          "tag": "v1.8.1",
          "kind": "patch",
          "published_at": "2026-07-01T09:31:33Z"
        },
        {
          "tag": "v1.8.0",
          "kind": "minor",
          "published_at": "2026-06-30T08:59:56Z"
        },
        {
          "tag": "v1.6.117",
          "kind": "patch",
          "published_at": "2026-02-20T05:58:52Z"
        },
        {
          "tag": "v1.6.0",
          "kind": "minor",
          "published_at": "2026-01-16T08:45:16Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "f36ad4429357e1879b7785293af8b6f922ec9e58",
          "body": null,
          "is_bot": false,
          "headline": "Merge: extract docsearch/docsearch-server to distill-docs (v1.11.0)",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-18T11:34:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "752d77bd63a203d4545330a87e1f7ebde1a5ffa5",
          "body": "Remove docsearch/docsearch-server from README, AGENTS tree, CI_CD, TODO;\ndelete the orphaned DOCSEARCH.md + skills/docsearch.md (ported to distill-docs);\nrepoint the funcfinder skill's \"see also\" to the distill-docs project. Add the\nv1.11.0 CHANGELOG entry documenting the extraction and the new public analyze API.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: slim funcfinder docs to 5 tools after distill-docs extraction",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-18T11:34:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5971d28fc7aac112022d16e87917c557f16b5ee5",
          "body": "The knowledge subsystem (docsearch + docsearch-server and their internal\npackages) moved to its own repository, github.com/ruslano69/distill-docs,\nwith full history preserved. funcfinder returns to its focused 5-tool code-\nanalysis identity (funcfinder, stat, deps, complexity, callgraph); build/CI/\n\n[…]\nstays so distill-docs\ndepends on funcfinder as a library for code-ingest.\n\nDocs cleanup (README/AGENTS/DOCSEARCH.md/skills) follows separately.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: extract docsearch/docsearch-server to distill-docs",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-18T11:29:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ed657164348e42630045e868152f2e3eafd3395d",
          "body": null,
          "is_bot": false,
          "headline": "Merge: public analyze API for library consumers (distill-docs prep)",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-18T11:14:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4a3d43cbc44a29cda4d539612bef6a67ffeecd35",
          "body": "Adds package analyze re-exporting the code-map engine (LoadConfig,\nNewDirProcessor, DirResult + FunctionBounds/ClassBounds) via type aliases,\nso other modules can use funcfinder as a library without importing its\ninternal packages (which Go forbids across module boundaries). Repoints\ninternal/codema\n[…]\nonto it — proving the API and pre-staging the pending\ndistill-docs extraction, where codemap imports funcfinder/analyze as a\nmodule dependency.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(analyze): public code-mapping API for library consumers",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-18T11:14:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e3eca7e7deac673b3335e3dae27090e7c3ab7632",
          "body": "Single-file docsearch was BYO-embedding only, so hybrid silently collapsed\nto FTS and vec returned nothing unless you hand-passed --embedding at both\nadd and search time. Now `add` and `search` accept --embed-model/--embed-url\nand embed text on the fly via internal/embed (the same client docsearch-s\n[…]\nranked the on-topic doc first; a dead endpoint\ndegraded to FTS with a warning. Docs updated (DOCSEARCH.md, skill, AGENTS.md);\nTODO item closed.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(docsearch): auto-embedding via Ollama for real vec/hybrid search",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T20:39:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fb72a69044716b83411e41d3cb53fce856c7a3bd",
          "body": "The crawler feature (web.go + tests) landed on main; this documents it\nacross every surface so it ships in v1.10.0:\n\n- docs/DOCSEARCH.md: full \"add — web crawler\" section (same host+path\n  scoping, content-hash + @version dedup, main/article extraction,\n  --max-pages bound) + quick-reference line.\n-\n[…]\ne web\n  crawl path in the ingestion pipeline, and web.go in the purpose line.\n- CHANGELOG: new \"docsearch — web crawler\" section under v1.10.0.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: document the docsearch web crawler (add --url) for v1.10.0",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T20:11:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4b1a3e76ddd936100cfeff68ff976669f649eb0f",
          "body": "The crawler commit shipped 342 lines of web.go with zero tests. This adds\n14 tests — 80-100% coverage of every function — split into pure helpers\nand httptest-driven integration:\n\n- normalizeURL: @go1.x/@v1.x version-segment stripping, fragment drop\n- isSameSite: host match, path-prefix scoping, que\n[…]\nites via mutation (breaking the isSameSite host guard\nfails TestIsSameSite). All assertions run against httptest servers — no\nexternal network.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(knowledge): cover the web crawler (web.go)",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T20:06:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "29d91494fae89433b52b0729499ff55a88fdc844",
          "body": "Crawls a documentation site (staying within the same host+path prefix),\nextracts text from HTML main/article content, deduplicates pages by\ncontent hash, normalizes versioned URL variants (@go1.x, @v1.x), and\nindexes all chunks into the FTS knowledge base.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add web crawler: docsearch add --url for indexing online docs",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T20:02:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c78bec7823e0b08e1da2d419d17941612159b9fc",
          "body": "…check\n\ndocsearch.md: new \"Scaling up: docsearch-server + MCP\" section — the CQRS\ntruth-server model (write-log -> publish -> immutable release, channels),\nMCP as the primary agent interface (JSON-RPC 2.0 over stdio, protocol\n2024-11-05, with a .mcp.json registration snippet), the 14 tools split by\n\n[…]\nmap/ to the versioned map baked by publish --code-dir.\n\nskills/AGENTS.md: docsearch.md ownership now notes the docsearch-server\nscale-up scope.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(skills): cover docsearch-server/MCP and the deps --shards trust …",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T16:28:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9f3166e09116409315774798a168bbbfdfb8964f",
          "body": "Ready the tree for the v1.10.0 tag (all TZ requirements FR-1..FR-22 done).\n\n- CHANGELOG: Unreleased -> v1.10.0 covering everything since v1.9.0 —\n  FR-2 (structured JSON ingest), FR-15 (release retention), FR-20 (HTTP\n  read-server), the code-review hardening of code-ingest, and the version\n  embedd\n[…]\nble.\n- build.sh/build.ps1: VERSION_BASE 1.9 -> 1.10.\n\nTagging (v1.10.0) is deliberately left for release day — the tag is the\npipeline trigger.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): prep v1.10.0",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T16:21:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b7d9a9b3969f792bffa263fc718671d3041b93b2",
          "body": "The DOX docs still described a 5-6 tool toolkit and indexed a cmd/findstruct/\ndirectory that doesn't exist, while omitting docsearch-server entirely.\n\nRoot AGENTS.md:\n- build.sh count 5 -> 7 (docsearch + docsearch-server were unlisted)\n- new docsearch-server row in the toolkit glance table\n- new \"Ve\n[…]\nrs DOCSEARCH.md and the docsearch-server/ subtree\n- indexed docs/docsearch-server/ (TZ/DIFFERENTIATION/HOW_TO_USE)\n\nDocs only; no code touched.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(agents): bring AGENTS.md tree current with docsearch-server",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T16:15:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cf8c46e98be1b40e55bc53422eb2341904b66b94",
          "body": "The last unimplemented requirement from the spec (§6.6). serve-http is the\nsame stateless read node as the TCP serve command — same release model,\nsame channel hot-swap — exposed over HTTP/JSON instead of the ###END###\nline protocol, so ordinary clients (curl, browsers, a service mesh) can\nground wi\n[…]\nrving: /healthz followed 2026.07 -> 2026.08 with\nno restart.\n\nWith this, every functional requirement in the spec (FR-1..FR-22) is\nimplemented.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(docsearch-server): HTTP/JSON read-server (FR-20)",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T16:11:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4844023157f8a151261f1817b9733b4acd594166",
          "body": "Covers the atomicity fix from the previous commit directly: a BEFORE\nINSERT trigger aborts on one rigged document title (the docs schema has\nno natural constraint an ingest could trip over), forcing Ingest to fail\npartway through a re-ingest. Asserts the previous code map survives\nwholesale — includ\n[…]\nransactional)\nimplementation it fails with exactly the original bug's picture — the\nold map deleted, the aborted run's first file half-inserted.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(codemap): regression test for mid-ingest rollback",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T16:00:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "572226a8b60beb58447d080c73d79fa7b1b97010",
          "body": "…nce leaks\n\nCode review of the last 15 commits surfaced four issues in the FR-22\ncode-ingest and FR-2 structured-record features:\n\n- codemap.Ingest deleted the previous code_map docs and reinserted the new\n  ones as two separate operations; a failure mid-loop left the write-log\n  half-replaced. Now \n[…]\nblanks a record left empty).\n\nAlso drops knowledge.DeleteByType, which lost its only caller once\ncodemap.Ingest inlined a tx-scoped equivalent.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(codemap): atomic replace, empty-reingest warning, MCP/CLI provena…",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T15:57:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fe366de2990f5ce02d93420f183ccb11d10c2ed7",
          "body": "Store.PruneReleases(keep) retains the newest N releases and deletes the\nrest — both the release file and its control-DB row — implementing FR-15's\n\"keep last K for time-travel/audit, clean up the rest\" policy. A release\ncurrently pinned by a channel (stable/testing) is never pruned regardless\nof age\n[…]\nand the\npin (files confirmed gone from disk), while the pinned release and the 2\nnewest survived and stable kept resolving/searching correctly.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(docsearch-server): release retention policy (FR-15)",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T15:42:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4d3456e8692524943f9572324e33d6584db466cb",
          "body": "ingest --file now dispatches .json to a separate path from the chunked\n.txt/.md/.pdf pipeline: knowledge.ParseRecordsFile accepts a single record\nobject or an array, each carrying its own title/content/type/author/\nrole_tags/source_version/source_ref rather than one type/metadata applied\nfile-wide. \n[…]\nch found a JSON-ingested changelog\nrecord on the first query; a record missing \"title\" is rejected with a\nclear error and nothing gets written.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(docsearch-server): structured JSON record ingest (FR-2)",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T15:30:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7e0c121a17c7fd7bbe9dc3b1100aaf6954f7429b",
          "body": "Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(todo): log the CI covdata root cause",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T14:14:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2cea4f7dc8022cc07da907025b6adf96ccdbd017",
          "body": "… race\n\nReal error, found in the coverage step's log (not visible via --log-failed\nbefore): `go: no such tool \"covdata\"` for internal/embed, the only package\nwith no test files — computing its coverage entry needs covdata, which\nthis runner's Go install lacks. -race was never the cause; every failur\n[…]\n list via `go list | grep\n-v`. The race/coverage split from the previous commit stays regardless —\ndecoupling them is good practice on its own.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: fix root cause — exclude the zero-test package from coverage, not…",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T14:10:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4be7d8d257c28720829933712c923bd89d392a72",
          "body": "…ion)\n\nDiagnostic run (dc32be0) confirmed it: with -coverprofile/-covermode\ndropped, every job goes green. All packages were always passing under\n-race alone; it's specifically -race combined with coverage-profile\nfinalization across multiple packages that dies with a bare exit 1 on this\nrunner/Go v\n[…]\nrt (-coverprofile, no -race). A genuine data race still fails\nCI; coverage collection no longer depends on surviving that specific\ninteraction.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: split race and coverage test runs (real fix, confirmed via bisect…",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T14:07:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dc32be044afa5677b8bc7b615cf5adedc6507e9b",
          "body": "… failure\n\n-p 1 alone didn't fix it — the full log shows every package (including root\ninternal) actually completes with \"ok\", and exit 1 fires immediately after\nthe last package's result with no FAIL/panic anywhere. That points at\ncoverage-profile finalization under -race on Go 1.24, not the tests\n\n[…]\ndropping -coverprofile/-covermode (and disabling\nthe two downstream steps that depend on coverage.txt) to confirm before\ndeciding the real fix.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci(diagnostic): drop coverage profile from race test run to bisect CI…",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T14:02:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7635bf62ac31be1473f4895f7f06e5bb54f120ca",
          "body": "…h-server\n\nCI's Test job has failed on every push to main since the docsearch-server\nmerge (2026-07-01), with a bare \"exit code 1\" and no FAIL/panic in the log\n— not reproducible locally (confirmed with a real gcc/cgo toolchain: -race\npasses clean, 0 failures, across every package including internal\n[…]\ner over a\nmemory limit. -p 1 serializes package-level execution so only one\nrace-instrumented package's SQLite fixtures are resident at a time.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: serialize race-detector tests (-p 1) to fix CI OOM since docsearc…",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T13:57:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "475b0eb882ac539717d350f5ebca50263106e9c5",
          "body": "…changelog\n\nrelease.yml, ci.yml (all three OS build jobs), build.sh, and build.ps1 only\never built 6 of the 7 binaries — docsearch-server was missing from TOOLS\nlists, --version smoke tests, and artifact uploads, so a tag right now would\nship a GitHub Release without it despite it being most of this\n[…]\nch-server (release model,\nhybrid search, MCP, FR-3/9/11/17/18/22) and the five toolkit-core\ncorrectness bugs found and fixed while building it.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): wire docsearch-server into build/CI/release + v1.9.0 …",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T13:31:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "09c3e1648f5df0585d8038994c4bf2f62760178a",
          "body": "New internal/codemap package: Ingest(db, codeDir) runs funcfinder's own\nDirProcessor over a source tree (all 15 languages, .gitignore-aware) and\nwrites one type=code_map document per file (function/type map, tagged with\ncodeDir's git commit SHA) to the write-log. A re-ingest replaces the\nprevious co\n[…]\ne on\nthe first query; a second publish with the same tree produced exactly 74\ncode_map docs again (not 148), confirming replace-not-accumulate.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(docsearch-server): funcfinder code-ingest at publish (FR-22)",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T13:21:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "732064cf66f7b49e601348513fd7c7a85579f3f9",
          "body": "…prefix\n\nFound while mapping this project with funcfinder's own tools: deps --shards\nshowed cmd_funcfinder.json depending on internal_knowledge.json, but\ncmd/funcfinder/main.go only imports the parent \"internal\" package. shardForDir\nmatched by string prefix (dirRel + \"/\"), which any subpackage's fil\n[…]\nreaded through shardForDir/resolveImportToShard (it\nnever affected the returned shard). Post-fix, 5 repeated real-repo runs\nconsistently agree.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(importresolver): shardForDir matches exact directory, not string …",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T13:10:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e13c55c6059ddc73eeb9d648daf7d000f77b4bd0",
          "body": "…a single-line body\n\nfindFunctionsSimple (the non-nested path: Rust, C, C++, C#, Java, D, Kotlin,\nPHP) closed a function on depth==0 && prevDepth>0. That never fires when a\nfunction's opening and closing brace land on the same line — net delta is 0\nand prevDepth was also 0, indistinguishable from \"n\n[…]\nern in findFunctionsWithNesting. The Rust\nwhere-clause multiline-signature case (why prevDepth>0 was required in the\nfirst place) still passes.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(finder): stop findFunctionsSimple from swallowing functions with …",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T12:56:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "068bf87eaba50023afb6b5584532212fdb971098",
          "body": "runDirMode always passed the full multi-language config to NewDirProcessor,\nso the function-extraction pass auto-detected and processed every supported\nlanguage in dir regardless of -l — only the (separate) import-alias\ncollection actually respected it. `-l rust --dir backend` on a Python\nbackend st\n[…]\nnt the --dir behavior. Verified before/after on a synthetic Go+Python\nmix: \"Analyzed 2 files\" pre-fix -> \"Analyzed 1 files\" (go only) post-fix.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(callgraph): make -l a real filter in --dir mode",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T12:47:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b816696e21714af90b8e81d78b6821e0c64154b6",
          "body": "…TS/JS)\n\nfindAllTypes left a brace-less single-line construct (e.g. a TS type alias\n`type Handler = (req: Request) => void;`) open with depth=0, so it silently\nabsorbed every following line — including a subsequent class — until an\nunrelated brace-balance event coincidentally closed it, dropping tha\n[…]\naces_SwallowsFollowingLines, which\npinned the buggy behavior, is renamed ..._DoesNotSwallowFollowingLines and\nnow asserts both types are found.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(struct_finder_factory): close brace-less type_alias immediately (…",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T12:39:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "862a58844d3dace52e054742814a2d8042c9dc33",
          "body": "…en misrooted\n\ndeps --shards rooted one level too deep, below the project's tsconfig.json,\nresolved zero aliases and reported every shard as a leaf with no edges, with\nno indication anything was wrong (TODO.md \"deps trust bug\", found on a\nmeetily reference run).\n\nTwo diagnostics in internal/importre\n[…]\n wired into cmd/deps's --shards path as stderr warnings. Reproduced the\nexact scenario against a synthetic tsconfig+alias fixture before/after.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(deps): warn instead of silently returning an empty shard graph wh…",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T12:35:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "64121cf646d67d36fd4a816361982096fe8ae515",
          "body": "Corrects the stale \"9 инструментов\" MCP tool count (now 13) and adds\ngovernance primitives (provenance, freeze, diff_releases, context(role))\nto the moat inventory — each tied to the test that verifies it, matching\nthe doc's existing evidence-based style.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(docsearch-server): update differentiation doc for FR-3/9/11/17/18",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T12:13:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7d6b5635f51b07314a87b97cace794744ae5a48e",
          "body": "knowledge.DiffDocs compares two release databases' docs tables by id (stable\nacross releases — VACUUM INTO preserves rowids) and reports added/removed/\nchanged documents, using a SHA-256 fingerprint over title+content+type+\nmetadata to detect changes without a field-by-field comparison.\n\nWired into \n[…]\n --from <ref> --to <ref>, ref = release version or\nchannel) and MCP (diff_releases tool); MCP tool count 12→13 in\nTestMCPHandshakeAndToolsList.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(docsearch-server): diff_releases (FR-18)",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T12:09:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "61f7b16460cc09afe53e4be257ac27639ea11176",
          "body": "knowledge.ByRole filters the corpus by role_tags — a comma-delimited\nmembership match (\",role_tags,\" LIKE \"%,role,%\"), so \"backend\" doesn't also\nmatch \"backend2\" or \"frontend-backend-liaison\" — newest first. Builds\ndirectly on FR-3's indexed role_tags column rather than scanning metadata\nJSON per row.\n\nWired into CLI (context --role <tag>) and MCP (context tool); MCP tool count\n11→12 in TestMCPHandshakeAndToolsList.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(docsearch-server): context(role) view filter (FR-9)",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T12:02:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c4e086b75d7252bf8ffbb8dd055b992b31645e84",
          "body": "author/role_tags/source_version were only reachable by parsing docs.metadata\nJSON. Adds them as GENERATED ALWAYS ... VIRTUAL columns (indexed) derived\nfrom that same JSON, so metadata stays the single write path while callers\nget real SQL columns to filter on — unblocks FR-9 (context by role).\n\nALTE\n[…]\n and is\nidempotent across repeated Open() calls. ReadBySource now filters on the\nindexed source_version column instead of json_extract per row.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(docsearch-server): queryable metadata columns (FR-3)",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T11:56:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "341e753ac4ca94e0ea60dff29adca3b0e93061ee",
          "body": "* docs(docsearch-server): differentiation — features that set us apart\n\nPositioning companion to TZ §15: frames the session's built + measured work as\n7 competitive moats vs Onyx/Glean/Mintlify and vector DBs — reproducible\ngrounding (immutable releases), zero-infra single binary, zero-downtime\nrele\n[…]\novenance --record-id, freeze --release) and MCP\n(provenance, freeze tools).\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Docs/differentiation (#50)",
          "author_name": "Ruslan Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-07-17T11:39:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cfdc4a20ac590c94beefdd2bef9411522b2011cf",
          "body": "…rimitive\n\nPromotes HOW_TO_USE.md step 4 (\"did I miss a category\") from a manual\n`search --json | grep -o <pattern> | sort -u` pass into a first-class command:\n\n  docsearch-server enumerate --pattern 'PB_Cipher_[A-Za-z0-9]+'\n\ninternal/knowledge/search.go: Enumerate(db, pattern, limit) scans title+co\n[…]\nated HOW_TO_USE.md step 4 and \"what's still missing\" accordingly; both\nprimitives HOW_TO_USE.md called out as gaps (read, enumerate) now exist.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(docsearch-server): enumerate --pattern, the completeness-audit p…",
          "author_name": "Ruslan.Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-07-02T06:05:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9d177be40e61606f044b5d71df347c40d9bbce95",
          "body": "Promotes the \"read the full contiguous chunk range\" step from\nHOW_TO_USE.md #5 out of a throwaway SQL script into a first-class command:\n\n  docsearch-server read --id <n> --context <k>   contiguous neighborhood\n  docsearch-server read --source \"<tag>\"          whole ingested source file\n\ninternal/kn\n[…]\nws the CLI command instead of raw SQL;\nnarrowed \"what's missing\" to just the completeness-audit primitive (step 4),\nwhich read doesn't address.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(docsearch-server): read --id/--context and --source CLI primitive",
          "author_name": "Ruslan.Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-07-02T06:00:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "39d737d968fa93758d226ee4af51fab28dfc636b",
          "body": "Captures the loop that actually found good answers this session — suggest\n(cheap vocabulary probe) -> search with a naming hypothesis (expect misses,\nthey prune fast) -> recognize noise before trusting a hit -> completeness\naudit (enumerate a category, don't stop at the first match) -> read the full\n[…]\nno first-class \"read contiguous chunk\nneighborhood by id\" or \"enumerate pattern matches\" primitive yet — listed as\ncandidate MCP/CLI additions.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(docsearch-server): document the search methodology (How To Use)",
          "author_name": "Ruslan.Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-07-02T05:55:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4381e402ab20c0143fe85d64a43367cbddc390fb",
          "body": "SearchFTS previews were the chunk's opening bytes, not the matched region — a\nresult could rank first by BM25 yet show an unrelated-looking preview because\nthe term appeared mid-chunk. Wire SQLite's snippet(docs_fts, -1, ...) into\nSearchFTS: FTS5's own token-boundary-safe excerpt builder, column -1 \n[…]\nspect\" search that previously\nshowed unrelated-looking chunk openings for 3/10 results now shows **inspect**\nhighlighted in context for all 10.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(knowledge): keyword-in-context snippets for FTS search results",
          "author_name": "Ruslan.Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-07-02T05:14:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8c094f310f3ab0d5e843abec1d3b50d111bc9c62",
          "body": "snippet[:117] sliced by byte index; multi-byte runs (Cyrillic, CJK, any\nnon-ASCII) could land mid-codepoint and print U+FFFD in the console preview\n(e.g. \"Шаблон\" -> \"Ша<REPLACEMENT>\"). Found while spot-checking chunk\nboundaries on a Cyrillic/Ukrainian corpus. Stored data was never corrupted —\nverif\n[…]\n has zero U+FFFD bytes and all content is valid UTF-8; this\nwas display-only. Fixed by truncating on []rune instead of the byte-indexed\nstring.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(docsearch-server): rune-safe snippet truncation in search CLI",
          "author_name": "Ruslan.Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-07-02T05:05:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "baeb44f1178b705a4418eea7fb75bd1a951ed87e",
          "body": "… tag\n\ntest_example.go / test_structs_go.go are funcfinder parser fixtures, not a\nbuildable package — but their presence made Go treat test_examples/ as a\npackage, which then choked on the .c/.cpp sibling fixtures (\"C source files\nnot allowed when not using cgo or SWIG\"). Tagged both //go:build igno\n[…]\nild ./...` / `go vet ./...` skip the directory; funcfinder's regex parser\nis unaffected by build tags (verified: still finds all 14 functions).\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(test_examples): exclude Go fixtures from go build ./... via build…",
          "author_name": "Ruslan.Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-07-02T04:42:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d6250d89f013f05912553da44737a729eb2a6a7b",
          "body": "…read-server + MCP + FTS vocabulary grounding)\n\nAdds cmd/docsearch-server and internal/truth + internal/embed: an immutable,\nrelease-versioned truth store for team grounding — CQRS write-log/release split,\nVACUUM-INTO snapshots, channels with zero-downtime hot-swap, an MCP interface,\noptional BYO embeddings, and an FTS5 vocabulary front-door (suggest) with IDF\nweak-key flagging, partition-relative IDF, and numeric-token filtering.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Merge docsearch-server: versioned truth server (release model + CQRS …",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-01T19:39:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d45c85d2ef3a5825a3ea0dd7a1d3b6fd792d9d5c",
          "body": "Bare numbers — page, line, and section numbers — dominate the vocabulary by\nfrequency but are useless search keys (\"15\" matches everything). Suggest now\ndrops pure-digit tokens by default (SQL: term GLOB '*[^0-9]*' keeps tokens with\nat least one non-digit), so alphanumeric identifiers like \"comp-3\" \n[…]\nOCR-glued numeric junk (\"1ω\") is already gone, and this filter clears the\npure-digit residue — together yielding a clean vocabulary front-door.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(docsearch-server): filter pure-digit tokens from suggest",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-01T19:36:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9da38fe61b82d8c5a01f3631acf87a8a54fb16ac",
          "body": "Global IDF over-states a term's discriminating power in a mixed-language /\nmulti-source release: chunks of the *other* partition — where the term cannot\nappear — count toward N, inflating IDF. SuggestRelativeTo computes IDF against\nthe chunk count of the partition (a `type` value) the term actually \n[…]\nst_terms(..., relative_to: <type>)\n\nDocs/IDF become partition-relative; Count stays the corpus-global occurrence\ncount for magnitude reference.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(docsearch-server): partition-relative IDF for heterogeneous corpora",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-01T19:29:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cae1dd02f5c7bfc8345c6cabd9624c228e82b7ff",
          "body": "A high-frequency term is a poor FTS key — it matches most documents, so it\nfloods results with weakly-relevant hits and \"leads away from the solution\".\nSuggest now reports each term's IDF (ln(N/df)) and marks terms below WeakKeyIDF\n(occurring in >~25% of docs) as weak keys.\n\nIDF, not a raw count thr\n[…]\nnstant\n- CLI suggest prints idf and a \"← weak key\" marker; MCP suggest_terms carries\n  idf in its JSON so agents can prefer discriminating keys\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(docsearch-server): flag weak search keys via IDF in suggest",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-01T19:20:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6546b926f62450e5120ea32e32f47d4010c2221d",
          "body": "…tion\n\nThe vocabulary key to FTS5: instead of guessing a keyword and hoping it's in\nthe corpus, look up which terms actually exist (and in which inflected /\nforeign-language forms). Free from the existing index via the FTS5 fts5vocab\nvirtual table.\n\ninternal/knowledge:\n  - schema: add docs_vocab (ft\n[…]\noken (cnt 53) folds back into \"sort\"\n(214 -> 235) and the 14k junk omega tokens vanish, so the vocabulary and term\nfrequencies become accurate.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(docsearch-server): FTS vocabulary suggest + index-time normaliza…",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-01T19:12:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6a9e6fc3212180a4550737ba0b4f3e0950c4f8fa",
          "body": "…r search\n\nBYO-embeddings stays the default (TZ §7.2), but wiring an embedding provider\nis now one flag instead of hand-passing vectors.\n\ninternal/embed — provider-agnostic client for any Ollama-compatible /api/embed\n(url + model); a zero/empty model is a disabled client, so the agnostic\ndefault is \n[…]\n\nVerified end-to-end: \"parallel execution and locking\" (zero shared keywords)\nreturns the Threads doc under vec mode while FTS returns nothing.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(docsearch-server): optional Ollama embedder for end-to-end vecto…",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-01T18:07:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a296fd617ea055af7450dff5f6185d9087568353",
          "body": "Implements the docsearch-server MVP from docs/docsearch-server/TZ.md: a\nversioned \"truth\" store with a CQRS split, reusing internal/knowledge for\ndocument storage and hybrid search unchanged.\n\ninternal/truth — the release/channel backbone:\n  - control DB (releases/channels/provenance) + live write-l\n[…]\nding, plus immutability (post-publish writes invisible to a frozen\nrelease), point-release opt-in, and the MCP handshake/tools/error semantics.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(docsearch-server): MVP — release backbone + CLI + read-server + MCP",
          "author_name": "Ruslan",
          "author_login": "ruslano69",
          "committed_at": "2026-07-01T16:17:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eec94cdc47176fed0f2c8bb5dbfb32cb2eeefcc5",
          "body": "…ning\n\nTZ §7.4: funcfinder toolkit as the first-class code->truth compiler — deterministic\nstructural map (funcfinder/callgraph/deps/complexity/stat) baked into each release\nat the frozen commit; accuracy certified by the AST ruler (100% go/ast parity) is\nthe trust bar for canonical code-truth; skel\n[…]\ntlify the real neighbors), Onyx-vs-docsearch differentiation table,\nand the \"git-for-truth, not Confluence-for-AI\" / SQLite:Postgres archetype.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(docsearch-server): funcfinder code-ingest + related-work positio…",
          "author_name": "Ruslan.Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-07-01T11:43:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8bebc65c8c54b096d19c75195266310be4358770",
          "body": "Native-async Go search server (goroutines + channel = queue+semaphore, no poll\nloop) over modernc.org/sqlite FTS5 in WAL. Subcommands: seed, serve, bench\n(persistent connection pool + ramp), query (pure in-process timing).\n\nSubstrate for the docsearch-server product (docs/docsearch-server/TZ.md).\nMeasured ~23k req/s/node (8 workers/8 cores, localhost), sub-ms latency to\nsaturation; pure query ~100us (database/sql Scan-bound).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(benchmarks): async FTS5 search server prototype + load harness",
          "author_name": "Ruslan.Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-07-01T11:07:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "81c65a894f5915a48299d62b669d2f251c1af6cb",
          "body": "Product spec for docsearch as a standalone team source-of-truth server for\ndistributed development: CQRS readonly/rewrite split, distro-style release model\n(immutable named releases, stable/testing/unstable channels, reproducible\ngrounding), BYO embeddings, hybrid FTS5+vector+regex retrieval, MCP interface.\nExplicit non-goal: not a PM tool — the truth bus, not the boss. Grounded in the\nsearchserver prototype measurements.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(docsearch-server): product TZ — team documentation server",
          "author_name": "Ruslan.Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-07-01T11:07:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f2139232cba535dbe9c163a9c5e7c59383c8634a",
          "body": "Char-literal brace leak fix (Go/C#/Java/D/Kotlin), defined types, composite\ndefined types, inline structs, generics; plus the AST ruler + spec-sheet harness.\nMeasured 100% recall/precision on tdtp-framework and on funcfinder itself.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(changelog): v1.8.1 — Go accuracy to full go/ast parity",
          "author_name": "Ruslan.Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-07-01T09:29:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0d634c1e6f66d621bce464a5fec34fa0889de32c",
          "body": "…hosts 100%\n\nThe bootstrap test — funcfinder on its own source — found two clean gaps:\n\n1. Generics: func pattern expected ( right after the name, choking on the\n   [type params] list. Added non-capturing (?:\\[[^\\]]*\\])? between name and args\n   (covers methods and multi-constraint params). Non-capt\n[…]\nall and precision both 100.0%. tdtp unchanged at\n3366/3366 (no regression). funcfinder now maps its own codebase symbol-for-symbol\nwith go/ast.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(go): handle generics + composite defined types; funcfinder self-…",
          "author_name": "Ruslan.Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-07-01T09:22:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "91a277a3c3202090883df1d9c7ce239b207175c6",
          "body": "…ercounting)\n\nThe oracle walked only top-level f.Decls, so `type T` declared inside a function\nbody was invisible to it. funcfinder (line-based) reports those, which showed up\nas false \"precision misses\" — 14 on tdtp, all real local interface/struct types.\nA ruler that undercounts real symbols is a \n[…]\n is symbol-presence (name + line +/-2) over shared Go files, two\nnode kinds, one project — not full span/grammar parity. README documents this.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(astoracle): count function-local type declarations (ruler was und…",
          "author_name": "Ruslan.Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-07-01T09:13:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e12083ac8399a598ba15ddc1d821f9daa40f54e4",
          "body": "…>100%\n\nTwo clean categories the AST ruler surfaced on tdtp, both cheap config/regex\nfixes rather than \"only AST gets it\" territory:\n\n1. char/rune literals leaked braces. char_delimiters was unset for every\n   language, so the sanitizer's char-literal path was dead code and a lexer\n   line like `if \n[…]\nestCharLiteralSanitized,\nTestGoStructFinder_InlineBraces_NoSwallow. Spec-sheet: recall 99.1->100.0%,\nmisses 30->0, precision unchanged (99.6%).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(sanitizer/structfinder): close residual Go recall gap; tdtp 99.1-…",
          "author_name": "Ruslan.Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-07-01T08:59:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f4e01c5a88201fc4950a53c9c0d2d6c2c78321c0",
          "body": "….1->99.1%\n\nThe AST ruler (benchmarks/specsheet.py) flagged that funcfinder missed Go\n\"defined types\" — `type X string`, `type X func(...)`, `type X []byte`,\n`type X map[...]` — because the Go struct_type_patterns only covered\nstruct/interface/= alias. 66 such misses in tdtp-framework.\n\nFix:\n- Add a\n[…]\n e.g. lexer char literals) — the harder layer\nwe deliberately leave to a sanitizer refinement or the parser tier. Full suite\ngreen under -race.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(go): detect defined types (type X string/func/[]byte); recall 98…",
          "author_name": "Ruslan.Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-06-30T10:21:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "75f0b8de7b0a9d2b7e6da8cae628f8695231f257",
          "body": "cmd/astoracle: a go/ast-based ground-truth symbol extractor that emits the\nsame JSON shape as `funcfinder --all --json`, so the regex output can be\ndiffed directly against a real parser. Go-only by design — the ruler must be\nunimpeachable on the flagship language.\n\nbenchmarks/specsheet.py: computes \n[…]\n cover (only struct/interface/= alias).\n~66 instances in tdtp — a cheap, single-pattern fix (community engine). Logged\nin benchmarks/README.md.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(benchmarks): add AST ruler + spec-sheet harness; first row (tdtp)",
          "author_name": "Ruslan.Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-06-30T10:13:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "172c6f8564083e0721105937631f7c3d92d6f5b6",
          "body": "Two behaviors surfaced while running the toolkit on meetily as a candidate\ngolden reference project:\n- deps silently returns an all-leaf, zero-edge graph when rooted below the\n  tsconfig (alias resolution finds nothing) with no warning — a confident\n  wrong answer; should fail loudly or warn on a lo\n[…]\nlved-imports ratio.\n- callgraph --dir's -l flag is a hint (per-file auto-detect wins), not a\n  filter; decide the contract and document or fix.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(todo): log meetily reference-run findings",
          "author_name": "Ruslan.Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-06-30T09:31:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2b71e136f91893c56da5d1a3ad4ab958923048cd",
          "body": "v1.8.0 is the first binary release since v1.6.x, so docsearch (SQLite FTS5 +\nvector hybrid knowledge base) and callgraph both ship for the first time. The\nrelease body links to CHANGELOG.md, so they belong here as headline items.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(changelog): feature docsearch and callgraph as new tools in v1.8.0",
          "author_name": "Ruslan.Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-06-30T09:01:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e2bed520dfa05fd14fb589d273a43a9ba6bbd49c",
          "body": "Minor bump after the hot-path review + Unicode-identifier feature session.\nAlso fixes a drift where Makefile's VERSION_BASE was 1.6 while build.ps1 and\nbuild.sh were on 1.7 — all three now read 1.8. Version becomes 1.8.<commits>.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version base to 1.8; sync Makefile; changelog",
          "author_name": "Ruslan.Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-06-30T08:56:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3ba5a2a6aa574a1430e64800a1d39149f458edd7",
          "body": "funcfinder/findstruct/callgraph/stat previously missed function, type and\ncall names containing non-ASCII letters (e.g. `func Привет()`, `type Café`)\nbecause the patterns used `\\w`, which is ASCII-only in Go's RE2.\n\nSingle source of truth (internal/identifiers.go):\n- identClass = [\\p{L}\\p{Nd}_]  (Un\n[…]\nr\nline), dwarfed by the earlier 2.5x sanitizer speed-up and negligible\nend-to-end; see identifiers_bench_test.go. Full suite green under -race.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(internal): detect Unicode identifiers across all 15 languages",
          "author_name": "Ruslan.Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-06-30T08:49:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fae193ff03c26c7084d4aa66b40c472091fbfed8",
          "body": "Replace the hand-rolled JSON string builders (formatDirResultsJSON,\nformatManifestJSON) and the incomplete escapeJSON with encoding/json. This\nfixes a real escaping bug — the old escaper didn't handle control characters\nbelow 0x20 and could emit invalid JSON for paths/names containing them — and\nrem\n[…]\nshes and control chars through json.Unmarshal) plus the existing\nmanifest round-trip and incremental-split tests. Full suite green under -race.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(dirprocessor): emit shard/manifest JSON via encoding/json",
          "author_name": "Ruslan.Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-06-30T08:29:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8620da176343670015c8bb31157445ba1a4fa2c0",
          "body": "…ionsSimple\n\nThe `else if currentFunc != nil && depth == 0` branch lived inside the else\nof `if currentFunc != nil`, so currentFunc was always nil there — it never\nexecuted. Multiline signatures are continued by the `if currentFunc != nil`\nbranch on subsequent lines. Verified by finder_multiline_test.go (Rust\nwhere-clause), which passes identically with and without the branch.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(finder): remove dead multiline-signature branch in findFunct…",
          "author_name": "Ruslan.Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-06-30T08:23:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0c17d8c3a1c6c4a782eaa938b51d2bf7063f747b",
          "body": "Sanitizer (hottest path — runs per char/line/file):\n- Fix byte/rune indexing mismatch in CleanLine. The result buffer was sized\n  by byte count (leaving trailing-space artifacts on non-ASCII lines) and the\n  block-comment/docstring handlers sliced line[idx:] by byte at a rune index,\n  misaligning wh\n[…]\nision, finder.go dead\nbranch, Unicode-identifier detection) tracked in TODO.md. Full suite green\nunder -race; internal coverage 66.5% -> 66.8%.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf+fix(internal): rune-safe sanitizer hot path; drop stdlib wheels",
          "author_name": "Ruslan.Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-06-30T08:21:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f9dd3a43da8d957219567e75f4c8c1ca51ef278a",
          "body": "…er_factory\n\nAdds unit tests for three previously-untested core files:\n\n- dirprocessor.go: IgnoreMatcher/.gitignore parsing, CollectSourceFiles,\n  end-to-end ProcessDirectory, all output formatters, and both the\n  full and incremental split/manifest write paths.\n- callgraph.go: BuildDirCallGraph (cr\n[…]\nridStructFinder_TypeAliasWithoutBraces_SwallowsFollowingLines so\na future fix has a test to update rather than discover the regression\nblind.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(internal): add coverage for dirprocessor, callgraph, struct_find…",
          "author_name": "Ruslan.Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-06-30T07:58:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "afaab445f46cea0ee1bb0d0a8d0b594b8cf5557f",
          "body": "Makefile still built/installed/cleaned the removed findstruct binary\ninstead of callgraph. docs/CI_CD.md described a stale 4-binary,\nGo 1.21-1.23 pipeline with placeholder badge URLs and outdated test\ncoverage numbers; updated to match the current 6-binary toolkit,\nGo 1.23/1.24 matrix, and measured coverage (~51%, 360+ tests).\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(build): replace findstruct with callgraph in Makefile; sync CI_CD.md",
          "author_name": "Ruslan.Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-06-30T07:31:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ddb37732a3f397227573b57f75a1bd5db226670f",
          "body": "* docs: add docsearch CLI documentation\n\nCovers storage schema, all four actions (init/add/search/count), file\nchunking and the PDF OCR-quality gate, and the four search modes.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n* docs(skills): add docsearch skill\n\nAdds skills/docsearch.md c\n[…]\nlative-path\nprefix. Updates AGENTS.md and both skill files accordingly.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Docs/docsearch skill (#49)",
          "author_name": "Ruslan Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-06-30T07:19:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c0591c2cefaee41dc6226d93c08750ace1558757",
          "body": "* Remove findstruct binary, fix CI/release for all 6 tools\n\n- Delete cmd/findstruct: functionality fully covered by funcfinder -struct/-all/-type\n- Remove findstruct from .gitignore, add .knowledge/ to .gitignore\n- build.ps1: add callgraph + docsearch, sync with build.sh, inject version via ldflags\n\n[…]\nute FTS rankings.\nPureBasic.pdf: 4022 to 3740 chunks (-282 TOC chunks).\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix/remove findstruct and ci fixes (#48)",
          "author_name": "Ruslan Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-06-29T16:56:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c6e6b49d3856da9b06ddde5211e1dd5a7db6db71",
          "body": "* Remove findstruct binary, fix CI/release for all 6 tools\n\n- Delete cmd/findstruct: functionality fully covered by funcfinder -struct/-all/-type\n- Remove findstruct from .gitignore, add .knowledge/ to .gitignore\n- build.ps1: add callgraph + docsearch, sync with build.sh, inject version via ldflags\n\n[…]\nsts: BuildFTSQuery cases, prefix on/off, regex match, regex filter-type\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix/remove findstruct and ci fixes (#47)",
          "author_name": "Ruslan Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-06-29T16:20:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "33e30c204a5d21249ac4b3ff6e739945ea206c7d",
          "body": "- Delete cmd/findstruct: functionality fully covered by funcfinder -struct/-all/-type\n- Remove findstruct from .gitignore, add .knowledge/ to .gitignore\n- build.ps1: add callgraph + docsearch, sync with build.sh, inject version via ldflags\n- ci.yml: update Go matrix to 1.23/1.24, add callgraph+docse\n[…]\nallgraph+docsearch to all platform builds and archives, bump Go to 1.24\n- cmd/docsearch/main.go: add --version flag via internal.PrintVersion\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove findstruct binary, fix CI/release for all 6 tools (#46)",
          "author_name": "Ruslan Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-06-29T16:10:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "91b325e9a8cb8966068b1f2b39e17d3938dc74cd",
          "body": "* Add docsearch: SQLite FTS5 + vector hybrid knowledge base for agents\n\nNew tool for AI agents to accumulate and retrieve documentation across\nsessions. Stores text in FTS5 for BM25 keyword search and float32 BLOBs\nfor cosine vector similarity, combined via Reciprocal Rank Fusion.\n\n- internal/knowle\n[…]\nests pass.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01NKWk31yWLE6TTmQQJsBB4E\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Claude/sqlite vec docs system r2mw3s (#45)",
          "author_name": "Ruslan Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-06-29T15:51:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c1665547f318e56f85d3415c49233ca9879f9dfd",
          "body": null,
          "is_bot": false,
          "headline": "Merge claude/dox-agent-docs-mjls4b: DOX framework + doc cleanup",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-14T08:20:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a7317ed8aa7b8b4282ce5e6659665720c6a312b3",
          "body": "Deleted:\n- docs/archive/ (23 historical reports and proposals, 252KB — all implemented or obsolete)\n- docs/USE_CASES.md (duplicate of README/AGENTS.md content)\n- docs/ENHANCED_SANITIZER.md (references v1.3.0, current is v1.7.0)\n- docs/examples/README.md (49 lines listing scripts that speak for themselves, wrong language count)\n\nUpdated docs/AGENTS.md to remove stale references to archive/ and\nENHANCED_SANITIZER.md.\n\nhttps://claude.ai/code/session_01RyKhrwsPKkFULgsF1jeLbq",
          "is_bot": false,
          "headline": "Remove stale docs and archive, update docs/AGENTS.md",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-14T08:18:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c5dcc1e702ed710254b0c8a114d00259437a24b8",
          "body": "Removed 834 lines of duplicated content (flag reference, use-case examples,\ntoken savings math, roadmap, architecture deep-dive) that now live in\nAGENTS.md or are self-evident from the code. Kept: why-table, install,\ntools overview, quick start, architecture summary.\n\nAdded DOX section explaining the AGENTS.md hierarchy, the read-before-edit\nrule, and how to extend the doc tree when adding new folders.\n\nhttps://claude.ai/code/session_01RyKhrwsPKkFULgsF1jeLbq",
          "is_bot": false,
          "headline": "Trim README to essentials and add DOX navigation guide",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-14T08:15:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f87025cfc84a53f006d92227b650a95e84e9e00b",
          "body": "Installs the DOX framework (agent0ai/dox) into AGENTS.md and initializes\nthe full documentation hierarchy with child AGENTS.md files for every\nmajor directory: cmd/, internal/, docs/, examples/, skills/,\ntest_examples/, test_files/.\n\nEach child doc describes purpose, ownership, local contracts, work guidance,\nverification commands, and its own Child DOX Index.\n\nhttps://claude.ai/code/session_01RyKhrwsPKkFULgsF1jeLbq",
          "is_bot": false,
          "headline": "Add DOX hierarchical documentation framework",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-14T08:10:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6894231368f09cc5ffbe904a362c640744f6167b",
          "body": "* Fix Python docstring handling in call graph analysis\n\nSwitch Python from block_comment (\"/\")  to doc_string_markers.\nWith block_comment_start == block_comment_end == \", the nested-depth\nlogic in tryHandleBlockComment increments depth on every \" (it checks\nfor a nested start before the close), so a\n[…]\nCII so `gofmt`/`make check` stays clean.\nNo behavioral change to the tests.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix/python docstring markers (#44)",
          "author_name": "Ruslan Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-06-13T18:47:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "edef75c971af671ae1bd595828c372b7adeb3561",
          "body": "* Fix Python docstring handling in call graph analysis\n\nSwitch Python from block_comment (\"/\")  to doc_string_markers.\nWith block_comment_start == block_comment_end == \", the nested-depth\nlogic in tryHandleBlockComment increments depth on every \" (it checks\nfor a nested start before the close), so a\n[…]\nng.\n\nBoth fail against the pre-fix config and pass with doc_string_markers.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix/python docstring markers (#43)",
          "author_name": "Ruslan Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-06-13T10:44:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "843ae5f810d8d5f003a14db66e340c1074b2e94a",
          "body": "Switch Python from block_comment (\"/\")  to doc_string_markers.\nWith block_comment_start == block_comment_end == \", the nested-depth\nlogic in tryHandleBlockComment increments depth on every \" (it checks\nfor a nested start before the close), so a one-line docstring \"x\"\npushes depth to 2, never closes,\n[…]\n to match.\n\nValidated on graphify-analysis (126 .py files): functions unchanged at\n3062, call edges 2201 -> 8252 (x3.75). internal/ tests pass.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix Python docstring handling in call graph analysis (#42)",
          "author_name": "Ruslan Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-06-13T10:19:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d50234406293de99e2f112184e73f29626522281",
          "body": "* Clean up repository structure for showcase\n\n- Rename AI_AGENTS.md → AGENTS.md (trimmed from 730 to 182 lines)\n- Delete garbage from root: findstruct binary, debug_stat_cleaning.go,\n  test_stat_fix.sh, test_stat_vs_sanitizer.go, languages.json (duplicate)\n- Move analyze.sh to examples/\n- Move 8 out\n[…]\n(~1350 tokens vs 15000 reading files)\n- Quick reference card\n- Common pitfalls table\n\nhttps://claude.ai/code/session_01AKXnXWhGvNdGRBHMqBkLYk\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Claude/explore funcfinder agent qox ti (#41)",
          "author_name": "Ruslan Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-05-18T05:14:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a38ddc30364d76fdb13b8c3ae9211f31a5077231",
          "body": "* Clean up repository structure for showcase\n\n- Rename AI_AGENTS.md → AGENTS.md (trimmed from 730 to 182 lines)\n- Delete garbage from root: findstruct binary, debug_stat_cleaning.go,\n  test_stat_fix.sh, test_stat_vs_sanitizer.go, languages.json (duplicate)\n- Move analyze.sh to examples/\n- Move 8 out\n[…]\n* Update CHANGELOG with v1.7.0: deps --shards, TS alias resolution, dependency graph\n\nhttps://claude.ai/code/session_01AKXnXWhGvNdGRBHMqBkLYk\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Claude/explore funcfinder agent qox ti (#40)",
          "author_name": "Ruslan Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-04-30T05:34:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b376afb98a3a8aadf4062e0a61110d992073da35",
          "body": "* Clean up repository structure for showcase\n\n- Rename AI_AGENTS.md → AGENTS.md (trimmed from 730 to 182 lines)\n- Delete garbage from root: findstruct binary, debug_stat_cleaning.go,\n  test_stat_fix.sh, test_stat_vs_sanitizer.go, languages.json (duplicate)\n- Move analyze.sh to examples/\n- Move 8 out\n[…]\ntly,\nproduces full inter-shard dep graph (src_app → src_components, src_hooks, etc.)\n\nhttps://claude.ai/code/session_01AKXnXWhGvNdGRBHMqBkLYk\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Claude/explore funcfinder agent qox ti (#39)",
          "author_name": "Ruslan Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-04-30T05:23:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2369503a6e4a1b3a6e8f2b42d4376b07035fdb92",
          "body": "* Clean up repository structure for showcase\n\n- Rename AI_AGENTS.md → AGENTS.md (trimmed from 730 to 182 lines)\n- Delete garbage from root: findstruct binary, debug_stat_cleaning.go,\n  test_stat_fix.sh, test_stat_vs_sanitizer.go, languages.json (duplicate)\n- Move analyze.sh to examples/\n- Move 8 out\n[…]\nttps://claude.ai/code/session_01AKXnXWhGvNdGRBHMqBkLYk\n\n* Update AGENTS.md with --split, --inc, performance table and large codebase workflow\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Claude/explore funcfinder agent qox ti (#38)",
          "author_name": "Ruslan Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-04-29T15:07:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a23f5b75673d04555da466a062e95f207cd1580c",
          "body": "* Clean up repository structure for showcase\n\n- Rename AI_AGENTS.md → AGENTS.md (trimmed from 730 to 182 lines)\n- Delete garbage from root: findstruct binary, debug_stat_cleaning.go,\n  test_stat_fix.sh, test_stat_vs_sanitizer.go, languages.json (duplicate)\n- Move analyze.sh to examples/\n- Move 8 out\n[…]\nthand syntax\n- Directory mode for stat utility\n- Bug fixes for hidden file detection\n\nhttps://claude.ai/code/session_01AKXnXWhGvNdGRBHMqBkLYk\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Claude/explore funcfinder agent qox ti (#37)",
          "author_name": "Ruslan Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-04-29T08:53:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "171552bf852f218103598d83b05c6802837cf373",
          "body": "* Clean up repository structure for showcase\n\n- Rename AI_AGENTS.md → AGENTS.md (trimmed from 730 to 182 lines)\n- Delete garbage from root: findstruct binary, debug_stat_cleaning.go,\n  test_stat_fix.sh, test_stat_vs_sanitizer.go, languages.json (duplicate)\n- Move analyze.sh to examples/\n- Move 8 out\n[…]\no.json\n\nAlso fixes bug where \".\" as root directory was skipped by hidden file check.\n\nhttps://claude.ai/code/session_01AKXnXWhGvNdGRBHMqBkLYk\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Claude/explore funcfinder agent qox ti (#30)",
          "author_name": "Ruslan Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-04-29T08:48:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5cd75d8d64c878206f13b8e60441207a20ed831e",
          "body": "* Add --struct <Names> --extract support for named struct extraction\n\nPreviously, extracting specific structs by name required two flags:\n--struct --type \"TypeA,TypeB\" --extract. Agents writing the intuitive\nform --struct \"TypeA,TypeB\" --extract were failing because Go's flag\npackage stops parsing a\n[…]\nplicated\nextension-filtering and directory-skipping code across the three utilities.\n\nhttps://claude.ai/code/session_01XbpkewpZgoyuxwGkBPUJ85\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Claude/fix agent command rztz5 (#36)",
          "author_name": "Ruslan Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-02-25T08:43:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f5434bf72a87bd3a50fb9f17e9a3348448810b46",
          "body": "* Add --struct <Names> --extract support for named struct extraction\n\nPreviously, extracting specific structs by name required two flags:\n--struct --type \"TypeA,TypeB\" --extract. Agents writing the intuitive\nform --struct \"TypeA,TypeB\" --extract were failing because Go's flag\npackage stops parsing a\n[…]\nlasses so that\n--dir --struct --map produces output consistent with --struct --tree.\n\nhttps://claude.ai/code/session_01XbpkewpZgoyuxwGkBPUJ85\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Claude/fix agent command rztz5 (#35)",
          "author_name": "Ruslan Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-02-25T06:36:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ba5bf3485f676e69912c4646ef59bbf3b587cd93",
          "body": "* Add --struct <Names> --extract support for named struct extraction\n\nPreviously, extracting specific structs by name required two flags:\n--struct --type \"TypeA,TypeB\" --extract. Agents writing the intuitive\nform --struct \"TypeA,TypeB\" --extract were failing because Go's flag\npackage stops parsing a\n[…]\n-list --count HEAD)\n  passed via -X github.com/ruslano69/funcfinder/internal.Version\n\nhttps://claude.ai/code/session_01XbpkewpZgoyuxwGkBPUJ85\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Claude/fix agent command rztz5 (#34)",
          "author_name": "Ruslan Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-02-25T06:17:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c5389d29238dbef65823eb90e50c50f15b918f72",
          "body": "* Add --struct <Names> --extract support for named struct extraction\n\nPreviously, extracting specific structs by name required two flags:\n--struct --type \"TypeA,TypeB\" --extract. Agents writing the intuitive\nform --struct \"TypeA,TypeB\" --extract were failing because Go's flag\npackage stops parsing a\n[…]\nrt path\n  - release target updated: bump major/minor only with make release BASE=X.Y\n\nhttps://claude.ai/code/session_01XbpkewpZgoyuxwGkBPUJ85\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Claude/fix agent command rztz5 (#33)",
          "author_name": "Ruslan Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-02-19T20:07:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d776be1b295ce45ee5acbfff08cfe09ea7e5ded0",
          "body": "* Add --struct <Names> --extract support for named struct extraction\n\nPreviously, extracting specific structs by name required two flags:\n--struct --type \"TypeA,TypeB\" --extract. Agents writing the intuitive\nform --struct \"TypeA,TypeB\" --extract were failing because Go's flag\npackage stops parsing a\n[…]\nrt path\n  - release target updated: bump major/minor only with make release BASE=X.Y\n\nhttps://claude.ai/code/session_01XbpkewpZgoyuxwGkBPUJ85\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Claude/fix agent command rztz5 (#32)",
          "author_name": "Ruslan Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-02-19T14:07:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "60617248b87d0dbf711188f57b6954583d424082",
          "body": "* Add --struct <Names> --extract support for named struct extraction\n\nPreviously, extracting specific structs by name required two flags:\n--struct --type \"TypeA,TypeB\" --extract. Agents writing the intuitive\nform --struct \"TypeA,TypeB\" --extract were failing because Go's flag\npackage stops parsing a\n[…]\n struct extraction shorthand,\nand add mistake #5 showing the old error with the fix.\n\nhttps://claude.ai/code/session_01XbpkewpZgoyuxwGkBPUJ85\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Claude/fix agent command rztz5 (#31)",
          "author_name": "Ruslan Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-02-19T13:54:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a7a9ed8896808741dcdaed8d2490c8d264184cf2",
          "body": "* Clean up repository structure for showcase\n\n- Rename AI_AGENTS.md → AGENTS.md (trimmed from 730 to 182 lines)\n- Delete garbage from root: findstruct binary, debug_stat_cleaning.go,\n  test_stat_fix.sh, test_stat_vs_sanitizer.go, languages.json (duplicate)\n- Move analyze.sh to examples/\n- Move 8 out\n[…]\nmparison table (without vs with)\n- Lead with the single command that does everything\n\nhttps://claude.ai/code/session_01AKXnXWhGvNdGRBHMqBkLYk\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Claude/explore funcfinder agent qox ti (#29)",
          "author_name": "Ruslan Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-02-11T06:37:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "08c2303bf8bf11c02b9c6ee146469dc31e4363db",
          "body": "…-QoxTi\n\nAdd Usage Scenarios section to README.md",
          "is_bot": false,
          "headline": "Merge pull request #28 from ruslano69/claude/explore-funcfinder-agent…",
          "author_name": "Ruslan Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-02-10T15:43:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "330cba614e72c5e07d9507221b853ba2e04ddc61",
          "body": "- Git Hooks integration pattern: \"Commit once, search instantly forever\"\n- Post-commit hook example for auto-updating code map\n- .funcfinder.config example for project customization\n- Comparison table: grep vs funcfinder + hooks\n- jq recipes for querying .codemap.json\n\nhttps://claude.ai/code/session_01AKXnXWhGvNdGRBHMqBkLYk",
          "is_bot": false,
          "headline": "Add Usage Scenarios section to README.md",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-02-10T15:42:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f149a585b855eaa178ceb9649411362ac3259563",
          "body": "…-QoxTi\n\nClaude/explore funcfinder agent qox ti",
          "is_bot": false,
          "headline": "Merge pull request #27 from ruslano69/claude/explore-funcfinder-agent…",
          "author_name": "Ruslan Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-02-10T07:31:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e885521600b50ec644eca940bc0e43c647e3542",
          "body": "The --nosimple flag filters out trivial functions with complexity ≤ 1,\nsignificantly reducing output tokens when analyzing large files.\n\nhttps://claude.ai/code/session_01AKXnXWhGvNdGRBHMqBkLYk",
          "is_bot": false,
          "headline": "Add --nosimple flag to complexity docs (token savings)",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-02-10T07:30:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f832838719fd1616217476fbf51b8322a99e782c",
          "body": "Added based on real-world usage feedback:\n\n1. JSON structure clarification:\n   - Explicit warning that `path` is NOT in function objects\n   - Correct jq pattern: `.files[] | .path as $p | .functions[]`\n\n2. Advanced jq recipes (copy-paste ready):\n   - Functions with full paths (most common need)\n   -\n[…]\nfor simple searches\n\nAddresses feedback: \"20% documentation, 80% learning by trial\"\nGoal: Reduce trial-and-error for AI agents using funcfinder\n\nhttps://claude.ai/code/session_01AKXnXWhGvNdGRBHMqBkLYk",
          "is_bot": false,
          "headline": "Improve AI_AGENTS.md based on Sonnet 4.5 field test feedback",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-02-10T07:29:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fae5579cffce71d469481b8726ea2e0c68a35947",
          "body": "Ruby uses 'end' keyword instead of braces or indentation to close blocks.\nThis change adds proper support for Ruby class/module boundary detection.\n\nChanges:\n- config.go: Add BlockEndKeyword field to LanguageConfig\n- languages.json: Change Ruby from indent_based to block_end_keyword=\"end\"\n- structfi\n[…]\n-tree to find all types (pass mapMode=true)\n\nRuby class detection now works correctly:\n  Person (29-50), Loggable (53-67), Logger (70-80), etc.\n\nhttps://claude.ai/code/session_01AKXnXWhGvNdGRBHMqBkLYk",
          "is_bot": false,
          "headline": "Add Ruby block_end_keyword support for class/module detection",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-02-10T07:23:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b0a310ab81d1e74ee79749ed6123207b1d9fdada",
          "body": "Added test files for languages that were configured but lacked test coverage:\n- Swift (.swift): 11 functions, 4 classes\n- Kotlin (.kt): 10 functions, 8 classes\n- PHP (.php): 20 functions, 6 classes\n- Ruby (.rb): 30 functions (class detection limited due to end-keyword)\n- Rust (.rs): 22 functions, 16\n[…]\n that should NOT be detected)\n\nNote: Ruby class detection is limited because it uses 'end' keyword\ninstead of indentation for block boundaries.\n\nhttps://claude.ai/code/session_01AKXnXWhGvNdGRBHMqBkLYk",
          "is_bot": false,
          "headline": "Add test examples for 6 missing languages",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-02-05T18:45:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "55b8b3d4da5fea2db97c939badcb0ad013d6889b",
          "body": "- Add 'else' to Swift exclude_words to filter guard-let-else constructs\n- Add isExcludedWord helper function to structfinder.go\n- Apply exclude_words filter when parsing fields in both struct finders\n\nFixes issue where `guard let base else {` was incorrectly matching\nfield_pattern and capturing 'else' as a field name.\n\nhttps://claude.ai/code/session_01AKXnXWhGvNdGRBHMqBkLYk",
          "is_bot": false,
          "headline": "Fix false positive 'else' fields in Swift struct finder",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-02-05T18:34:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a6809f3d8168b2fe80d4f686b89f3e45897df3ca",
          "body": "…-QoxTi\n\nFix 3 bugs found via clawdbot analysis: export const, class dedup, si…",
          "is_bot": false,
          "headline": "Merge pull request #26 from ruslano69/claude/explore-funcfinder-agent…",
          "author_name": "Ruslan Omelchenko",
          "author_login": "ruslano69",
          "committed_at": "2026-01-27T11:05:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "29b0df0b1c37c2b164f5ad077fc47058611672dc",
          "body": "…ngle-line boundaries\n\nBug #1: export const arrow functions not detected in TS/JS\n- Added (?:export\\s+)? before (const|let|var) in func_pattern for js and ts\n- Recovers ~140 missed functions in real-world TypeScript codebases\n\nBug #2: Duplicate classes in --dir --all --json output\n- In processFile()\n[…]\nins \"{\", function completes immediately\n- Fixes Swift, Go, JS/TS, Ruby, Scala (all supports_nested languages)\n\nTests added for all three fixes.\n\nhttps://claude.ai/code/session_01AKXnXWhGvNdGRBHMqBkLYk",
          "is_bot": false,
          "headline": "Fix 3 bugs found via clawdbot analysis: export const, class dedup, si…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-01-27T10:13:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 8,
      "commits_last_year": 203,
      "latest_release_at": "2026-07-18T11:35:38Z",
      "latest_release_tag": "v1.11.0",
      "releases_from_tags": false,
      "days_since_last_push": 5,
      "active_weeks_last_year": 14,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 26.2
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/ruslano69/funcfinder",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/ruslano69/funcfinder",
          "is_deprecated": false,
          "latest_version": "v1.11.0",
          "repository_url": "https://github.com/ruslano69/funcfinder",
          "versions_count": 8,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-18T11:34:36Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 2,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 24709,
      "source_files_sampled": 83,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "AGENTS.md",
        "cmd/AGENTS.md",
        "docs/AGENTS.md",
        "examples/AGENTS.md",
        "internal/AGENTS.md",
        "skills/AGENTS.md",
        "test_examples/AGENTS.md",
        "test_files/AGENTS.md"
      ],
      "agent_instruction_max_bytes": 13231
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": "repository_graph",
        "source": "osv",
        "findings": [
          {
            "name": "golang.org/x/text",
            "direct": true,
            "version": "v0.38.0",
            "severity": "unknown",
            "ecosystem": "go",
            "cvss_score": null,
            "advisory_ids": [
              "GO-2026-5970"
            ],
            "fixed_version": "0.39.0",
            "advisory_count": 1,
            "oldest_advisory_days": 9
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "unknown": 1
        },
        "advisory_count": 1,
        "affected_count": 1,
        "assessed_count": 15,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 1
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/ledongthuc/pdf",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20250511090121-5959a4027728"
        },
        {
          "name": "github.com/zeebo/xxh3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.0"
        },
        {
          "name": "golang.org/x/net",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.56.0"
        },
        {
          "name": "golang.org/x/text",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.38.0"
        },
        {
          "name": "modernc.org/sqlite",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.53.0"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "github.com/ledongthuc/pdf",
            "direct": true,
            "version": "v0.0.0-20250511090121-5959a4027728",
            "ecosystem": "go"
          },
          {
            "name": "github.com/zeebo/xxh3",
            "direct": true,
            "version": "v1.1.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/net",
            "direct": true,
            "version": "v0.56.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/text",
            "direct": true,
            "version": "v0.38.0",
            "ecosystem": "go"
          },
          {
            "name": "modernc.org/sqlite",
            "direct": true,
            "version": "v1.53.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/dustin/go-humanize",
            "direct": false,
            "version": "v1.0.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/google/uuid",
            "direct": false,
            "version": "v1.6.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/klauspost/cpuid/v2",
            "direct": false,
            "version": "v2.2.10",
            "ecosystem": "go"
          },
          {
            "name": "github.com/mattn/go-isatty",
            "direct": false,
            "version": "v0.0.20",
            "ecosystem": "go"
          },
          {
            "name": "github.com/ncruces/go-strftime",
            "direct": false,
            "version": "v1.0.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/remyoudompheng/bigfft",
            "direct": false,
            "version": "v0.0.0-20230129092748-24d4a6f8daec",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/sys",
            "direct": false,
            "version": "v0.46.0",
            "ecosystem": "go"
          },
          {
            "name": "modernc.org/libc",
            "direct": false,
            "version": "v1.73.4",
            "ecosystem": "go"
          },
          {
            "name": "modernc.org/mathutil",
            "direct": false,
            "version": "v1.7.1",
            "ecosystem": "go"
          },
          {
            "name": "modernc.org/memory",
            "direct": false,
            "version": "v1.11.0",
            "ecosystem": "go"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 15,
        "direct_count": 5,
        "indirect_count": 10
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 50,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "ruslano69",
          "commits": 119,
          "avatar_url": "https://avatars.githubusercontent.com/u/48532671?v=4"
        },
        {
          "type": "User",
          "login": "claude",
          "commits": 84,
          "avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.586
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "codeql.yml",
        "release.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": 6,
            "reason": "project has 2 contributing companies or organizations -- score normalized to 6",
            "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": 10,
            "reason": "SAST tool detected: CodeQL",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 9,
            "reason": "1 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "f36ad4429357e1879b7785293af8b6f922ec9e58",
        "ran_at": "2026-07-24T04:43:42Z",
        "aggregate_score": 4.2,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": true,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-19T01:17:45Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-17T11:39:20Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/ruslano69/funcfinder",
    "host": "github.com",
    "name": "funcfinder",
    "owner": "ruslano69"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 57,
      "inputs": {
        "security": 51,
        "vitality": 80,
        "community": 24,
        "governance": 56,
        "engineering": 66
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 80,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 74,
            "inputs": {
              "commits_last_year": 203,
              "human_commit_share": 1,
              "days_since_last_push": 5,
              "active_weeks_last_year": 14
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "14/52 weeks with commits",
                "points": 9.7,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 14
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "203 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 203
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 8,
              "latest_release_tag": "v1.11.0",
              "releases_from_tags": false,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 26.2
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "8 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~26.2 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 26.2
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 5,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 5 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 24,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 2,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "2 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 56,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 27,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.586
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 59% of commits",
                "points": 9.3,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 59
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 72,
            "inputs": {
              "merged_prs": 50,
              "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": "50/50 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 50,
                      "decided": 50
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 40,
            "inputs": {
              "followers": 2,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "ruslano69",
              "public_repos": 8,
              "account_age_days": 2689
            },
            "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": "2 followers of ruslano69",
                "points": 3.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 2,
                      "login": "ruslano69"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "8 public repos, account ~7 yr old",
                "points": 18.9,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 8
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 7
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/ruslano69/funcfinder"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "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 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "8 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "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": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 51,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 42,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 4.2
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection 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 2 contributing companies or organizations -- score normalized to 6",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool detected: CodeQL",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "1 existing vulnerabilities detected",
                "points": 6.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories. Remaining weights renormalized. Matched 15 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "indirect_dependencies_free_of_known_advisories"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_repository",
                "params": {
                  "assessed": 15
                }
              },
              {
                "code": "advisories_repo_graph_caveat",
                "params": {}
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 89,
            "inputs": {
              "source": "osv",
              "advisories": 1,
              "affected_packages": 1,
              "assessed_packages": 15,
              "unassessed_packages": 0,
              "affected_by_severity": "unknown 1",
              "direct_affected_packages": 1
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "1 affected: golang.org/x/text v0.38.0 (unknown)",
                "points": 26.6,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 1,
                      "packages": "golang.org/x/text v0.38.0 (unknown)"
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "transitive set not separable from development and test dependencies in this scope",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_scope_not_separable",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory has been public longer than 90 days",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "advisories_none_stale",
                    "params": {
                      "days": 90
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 15,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 2
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 75,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.97,
              "agent_instruction_files": [
                "AGENTS.md",
                "cmd/AGENTS.md",
                "docs/AGENTS.md",
                "examples/AGENTS.md",
                "internal/AGENTS.md",
                "skills/AGENTS.md",
                "test_examples/AGENTS.md",
                "test_files/AGENTS.md"
              ],
              "agent_instruction_max_bytes": 13231
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, cmd/AGENTS.md, docs/AGENTS.md, examples/AGENTS.md, internal/AGENTS.md, skills/AGENTS.md, test_examples/AGENTS.md, test_files/AGENTS.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, cmd/AGENTS.md, docs/AGENTS.md, examples/AGENTS.md, internal/AGENTS.md, skills/AGENTS.md, test_examples/AGENTS.md, test_files/AGENTS.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "97 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 97,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.84,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": 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": "84 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 84,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 24709,
              "source_files_sampled": 83,
              "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/83 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 83,
                      "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": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-24T04:43:47.569140Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/r/ruslano69/funcfinder.svg",
  "full_name": "ruslano69/funcfinder",
  "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.