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

A-pen-app / hire-sdk

GoSin licencia detectada★ 0 estrellas⑂ 0 forksdesde jun 2025Ver en GitHub ↗

A-pen-app/hire-sdk tiene un índice de salud de 40 sobre 100, lo que lo sitúa en la banda En riesgo. Su puntuación más alta es Vitality (72/100) y la más baja, Security (14/100). Se actualizó por última vez hace 6 días. Una sola persona concentra la mayor parte del trabajo reciente.

40
global / 100
En riesgo

Índice de salud del software

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

40
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

A-pen-appOrganización
2 seguidores19 repositorios públicosdesde ago 2020

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Gogithub.com/A-pen-app/hire-sdkv1.3.18-92hace 6 días

Métricas por categoría

Vitalidad

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

72Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 6 días
10.4/36Cadencia de commits — 15/52 semanas con commits
14.2/18Volumen de commits — 37 commits en el último año
3/10OpenSSF Scorecard: Maintained — 4 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 3
Datos de entrada utilizados
commits_last_year37
human_commit_share1
days_since_last_push6
active_weeks_last_year15
Cómo se puntúa
27/27Publica versiones — 1 versiones publicadas
36/36Recencia de las versiones — última versión hace 7 días
12.6/27Cadencia de publicación — cadencia desconocida (una sola versión)
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count1
latest_release_tagv1.3.17
releases_from_tagsno
days_since_latest_release7
mean_days_between_releases
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

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

15Crítico · 18% del índice global
Cómo se puntúa
0/60Estrellas — 0 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
0/22.5Licencia — no se detectó ningún archivo de licencia
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
6.3/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_licenseno
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_template

Sostenibilidad y Gobernanza

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

57Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
1.1/22.5Distribución de commits — el principal contribuyente firma el 95% de los commits
5.4/13.5Amplitud de contribuyentes — 4 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled4
top_contributor_share0,95
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
38.2/38.3Aceptación de PR — 15/15 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 2/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs15
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues. Los pesos restantes se han renormalizado.
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
3.4/25Alcance del propietario — 2 seguidores de A-pen-app
21.4/25Trayectoria — 19 repos públicos, cuenta de ~5 años
Datos de entrada utilizados
followers2
owner_typeOrganization
is_verified
owner_loginA-pen-app
public_repos19
account_age_days2182
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en go
35/35Recencia de publicación — última publicación hace 6 días
20/20Historial de versiones — 92 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/A-pen-app/hire-sdk
ecosystemsgo
any_deprecatedno
min_days_since_publish6

Calidad de Ingeniería

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

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

Documentación

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

Seguridad

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

14Crítico · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — 0 out of 2 merged PRs checked by a CI test -- score normalized to 0
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 2/30 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
0/10Dangerous-Workflow — sin datos
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
0/2.5Licencia — license file not detected
2.2/7.5Maintained — 4 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 3
0/5Packaging — sin datos
0/5Pinned-Dependencies — sin datos
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — sin datos
0/7.5Vulnerabilities — 39 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated13
scorecard_versionv5.5.0
checks_inconclusive5
scorecard_aggregate1,4
Excluidos de la puntuación (sin datos o no aplicable): dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. Los pesos restantes se han renormalizado.

Preparación para IA

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

63Moderado · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 94 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,94
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
12.6/18Arranque con un solo comando — go.mod (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — Go (tipado estático)
10/10Entorno reproducible — lockfile
4/10Práctica demostrada con agentes — 2 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — sin datos
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,02
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Pinned-Dependencies. Los pesos restantes se han renormalizado.
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
55/55Tamaños de archivo manejables — 0/25 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes21.879
source_files_sampled25
oversized_source_files0

Datos clave

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

Advertencias de recopilación de datos

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

Más detalle

OpenSSF Scorecard 1.4 / 10
1.4agregado

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
0CI-Tests0 out of 2 merged PRs checked by a CI test -- score normalized to 0
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 2/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
n/dDangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
0Licenselicense file not detected
3Maintained4 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 3
n/dPackagingpackaging workflow not detected
n/dPinned-Dependenciesno dependencies found
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
n/dToken-PermissionsNo tokens found
0Vulnerabilities39 existing vulnerabilities detected
Dependencias directas 5
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/A-pen-app/feed-sdkv1.3.5go.mod
Gogithub.com/A-pen-app/loggingv0.4.0go.mod
Gogithub.com/google/uuidv1.6.0go.mod
Gogithub.com/jmoiron/sqlxv1.4.0go.mod
Gogithub.com/lib/pqv1.10.9go.mod
Todas las dependencias no recopilado

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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 230,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 118277
      },
      "pushed_at": "2026-07-17T01:46:32Z",
      "created_at": "2025-06-03T09:29:17Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-17T01:46:35Z",
      "description": null,
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "main",
      "license_spdx_raw": null,
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "Organization",
      "login": "A-pen-app",
      "company": null,
      "location": null,
      "followers": 2,
      "avatar_url": "https://avatars.githubusercontent.com/u/69080824?v=4",
      "created_at": "2020-08-01T13:44:52Z",
      "is_verified": null,
      "public_repos": 19,
      "account_age_days": 2182
    },
    "license": {
      "state": "absent",
      "spdx_id": null,
      "raw_spdx": null,
      "file_present": false,
      "scorecard_found": false,
      "profile_has_license": false
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.3.17",
          "kind": "patch",
          "published_at": "2026-07-16T09:37:09Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "770666995574647aa758d548809cc95e2dd76b93",
          "body": null,
          "is_bot": false,
          "headline": "feat: count resume applicants per post",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2026-07-17T01:46:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "87023f81c686882e5b2ba46210816298a61bffa1",
          "body": "* feat: add experience fields and preferred-location dual-write for J2 job intent\n\n- BusinessCardContent: ExperienceYears (apen sentinel encoding, 0=<1y /\n  21=>20y), ExperienceRange (nurse/phar 6-step range), PreferredLocations\n- new ExperienceRange type + Chinese()/ValidateExperienceRange, and\n  F\n[…]\ntx 內先後對結果無影響(mirror 不依賴 resume 寫入)。\n\n感謝 @asdf7894k 的 review 指出。\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: experience fields + preferred-location dual-write (PS-3132) (#15)",
          "author_name": "penpeer-williamhuang",
          "author_login": "penpeer-williamhuang",
          "committed_at": "2026-07-16T09:33:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4b71b83cbd2acb1e6575dd52b0e55f541edca475",
          "body": "…IDs case",
          "is_bot": false,
          "headline": "refactor: simplify user subscription list query and handle empty user…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2026-06-25T06:33:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b057e778dc90c780a80f8334f95099e4f25c13d",
          "body": "…usiness card",
          "is_bot": false,
          "headline": "feat: add current organization and job title to resume seeding from b…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2026-05-05T07:57:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4cfd75064ef6327f4806fca302a3010ea5240c02",
          "body": "…hat creation",
          "is_bot": false,
          "headline": "feat: add checks for resume relation and business card ownership in c…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2026-04-21T04:57:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b05d20c49378297a65c538d8d895d23f6c37f0a4",
          "body": "…owner",
          "is_bot": false,
          "headline": " fix: determine chat job seeker via resume relation or business card …",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2026-04-14T07:07:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc10cbe1f90ca6b3f89bfd005b8ef9cf14b7c70a",
          "body": "…e seeker UserID in service layer",
          "is_bot": false,
          "headline": "feat: update business card chat model to use snapshot IDs and populat…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2026-04-10T08:46:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce8d069d5496f16b0bc93df8e2105e35e1f6ee46",
          "body": "…elds",
          "is_bot": false,
          "headline": "refactor: split chat contact options into recruiter and job seeker fi…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2026-04-09T07:39:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "34f308d9a213d1566c6027974f00e5830eec69a7",
          "body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: move hire_contact from chat to chat_thread table",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2026-04-09T07:28:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b2c13fee64856ff8d7579390dfe18f6acaf6b992",
          "body": null,
          "is_bot": false,
          "headline": "feat: default chat access status to locked when creating new records",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2026-04-08T09:26:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ed999a0e6e4db0f2869535ba6fdf74a65e8a7a12",
          "body": "…using functional options",
          "is_bot": false,
          "headline": "refactor: integrate contact and access status updates into GetChatID …",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2026-04-08T08:58:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "55df35e60f4a8fa99efe6f63bf527e2582d2c810",
          "body": "…ia BusinessCardChatInfo model",
          "is_bot": false,
          "headline": "feat: refactor business card snapshot retrieval to include post IDs v…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2026-04-01T04:26:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2329d1461b77661a23d3abed5444a3a04694ecc3",
          "body": "…ir associated chat IDs",
          "is_bot": false,
          "headline": "feat: add batch retrieval methods for business card snapshots and the…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2026-03-31T10:15:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53b84f5b3d0bed5e619df6ce19bebebb4499273a",
          "body": "…without associated resumes",
          "is_bot": false,
          "headline": "feat: add GetBusinessCardOnly method to retrieve business card chats …",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2026-03-31T09:16:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "33f9c0aa2f81d403783e35507ddc88dbcf135c90",
          "body": "…ti-platform card fields",
          "is_bot": false,
          "headline": "feat: add chat-first business card support with access status and mul…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2026-03-31T07:55:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d3224fd358a1f35ff4de1f712eb103930f38e5c5",
          "body": "…N marshaling",
          "is_bot": false,
          "headline": "refactor: change AccessStatus type from string to int with custom JSO…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2026-03-30T09:13:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3e2e671f3400712645652c5e90b89c2258f4a247",
          "body": "…l logic",
          "is_bot": false,
          "headline": "refactor: persist access status in chat model and unify access contro…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2026-03-30T09:07:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39a2eec833024e537b8c92e2ffc28adcc9bd3e8c",
          "body": "…ieval with batch processing",
          "is_bot": false,
          "headline": "feat: implement business card snapshot support and optimize chat retr…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2026-03-30T04:43:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c8501a202190c207f3abe8888ce16a90dcf43e4e",
          "body": "- Add MsgBusinessCard, MsgResume types and BusinessCard/Resume\n  store interfaces\n- Add HireContact to ChatRoom, UpdateHireContact to Chat store\n- Refactor Chat.New to use NewChatOptionFunc (WithResume, WithCard,\n   WithContact)\n- GetChatID returns created bool to guarantee MsgPost as first\n  message",
          "is_bot": false,
          "headline": "feat: add chat-first models and refactor Chat.New with options pattern",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2026-03-25T08:04:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "66f8c9d5470bf1ab304121365ded288cea510450",
          "body": "…o 業配",
          "is_bot": false,
          "headline": "fix: correct typo in CollaborationType_Prescription comment from 葉配 t…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-12-16T08:58:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f0c703af3519852ec109e224717808461fdfa4e",
          "body": "… resume snapshots by IDs",
          "is_bot": false,
          "headline": "feat: add ListSnapshots method to resumeStore for retrieving multiple…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-10-31T05:37:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce4c38097b909b68c75c684f2d4a05038351157d",
          "body": "…ved query capabilities",
          "is_bot": false,
          "headline": "feat: enhance ListRelations with flexible filtering options for impro…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-10-31T04:58:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc48142539658e590efc2506c41d5e76ca2a6aff",
          "body": "…anced query capabilities",
          "is_bot": false,
          "headline": "feat: extend GetRelationOption with UserID and PostID filters for enh…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-10-30T07:29:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "701799209f4accc0f162edf88c6cf41cf3c3ad15",
          "body": "… accurate filtering",
          "is_bot": false,
          "headline": "fix: cast chat_id and sender_id to uuid in GetFirstMessages query for…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-10-30T02:50:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf712e8b6d6ba87b053c476dae24d8c614948215",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-10-28T05:42:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fdc3a33680f552358d5f521cda29dc532f282d22",
          "body": "* feat: add employer response time median calculation by post\n\n- Add GetResponseMediansByPost to calculate median response time for each job post\n- Implement batch query GetFirstEmployerMessages for better performance\n- Add time filtering to ListRelations at store layer\n- Rename from excluded sender\n[…]\n handle nil first employer messages in response time calculation\n\n* refactor: update GetFirstEmployerMessages to GetFirstMessages and introduce FirstMessageOption struct for improved message retrieval",
          "is_bot": false,
          "headline": "feat: add employer response time median calculation by post (#14)",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-10-28T05:35:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9521af27b6f63cde0b46152671a85da3389188a4",
          "body": null,
          "is_bot": false,
          "headline": " feat: add YearOfExperienceType enum for hospital experience years",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-09-11T04:50:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e52631187ae2be4037d92a9bf1cc821eded38bac",
          "body": "…me model",
          "is_bot": false,
          "headline": "fix: update CollaborationType_Prescription label for accuracy in resu…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-08-19T08:09:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "975a48cbd140815a8a53988d17f2f60b81bf7c46",
          "body": null,
          "is_bot": false,
          "headline": "fix: update CollaborationType_Lecturer label for clarity in resume model",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-08-04T07:43:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0ac57f979d83413edf92fd7ded9c3f84e1fb7a31",
          "body": "…gs and escape filenames correctly",
          "is_bot": false,
          "headline": "fix: improve URL JSON marshaling in MediaUpload to handle empty strin…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-30T02:06:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d32e9249716f9c4dca52e11823613c45c2818329",
          "body": null,
          "is_bot": false,
          "headline": "feat: add custom URL type with JSON marshaling to Media model",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-30T00:47:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6fe5cdc4f9a688ac5fb90e9ae2d39253515d5452",
          "body": "…improved clarity",
          "is_bot": false,
          "headline": "fix: refine error logging in Get method to exclude sql.ErrNoRows for …",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-29T12:54:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e3132ea171e1fc36ef07116bb5e6666a42f2017",
          "body": "… IsOfficialRole for improved chat filtering",
          "is_bot": false,
          "headline": "refactor: update GetOption structure to replace IncludeNoMessage with…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-25T08:04:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "07058bcf80c93eaaedf78f0c2637bdd07994bfe4",
          "body": "…er chat management",
          "is_bot": false,
          "headline": "feat: modify chat thread insertion to include is_pinned flag for bett…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-24T12:03:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7eca785860018ade1bfdf0391e8da1a7b1466e19",
          "body": "…role-based chat visibility",
          "is_bot": false,
          "headline": "feat: update GetChats method to include isOfficialRole parameter for …",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-24T11:54:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7612659710080006228d1dafe84646e40b4e21a2",
          "body": "…ed chats",
          "is_bot": false,
          "headline": "fix: correct SQL query ordering in GetChats method to prioritize pinn…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-24T09:18:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6dc3469d9fdec0789939fd22182c71ef224c025b",
          "body": "…Ds parameter in SQL query",
          "is_bot": false,
          "headline": "fix: update UpdateRelationListStatus method to use pq.Array for postI…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-24T04:09:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5530523f7faf62fb5d2db84cfee4c8269861dcc2",
          "body": "… add UpdateRelationListStatus method to Resume interface",
          "is_bot": false,
          "headline": "feat: enhance chat service to include resume status in New method and…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-23T14:48:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "960731c1643d485a64f995e384026003645aea76",
          "body": "…le user subscriptions",
          "is_bot": false,
          "headline": "feat: add List method to Subscription interface for retrieving multip…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-22T10:11:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6998f578f3da4f3d549059feb37ca43aac19724e",
          "body": "…ats without messages",
          "is_bot": false,
          "headline": "feat: extend GetChats functionality to include option for fetching ch…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-22T10:06:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "443a4749711a12207f79c78408e3271cbc6f017b",
          "body": "feat: add fetch messages",
          "is_bot": false,
          "headline": "Merge pull request #13 from A-pen-app/feat-fetch-msgs",
          "author_name": "Jonas Chen",
          "author_login": "bbhands",
          "committed_at": "2025-07-22T08:23:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d14df1221f8818024811f827d13e19175718b59",
          "body": null,
          "is_bot": false,
          "headline": "feat: add fetch messages",
          "author_name": "Jonas Chen",
          "author_login": "bbhands",
          "committed_at": "2025-07-22T06:53:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16ed28b2a4df4a8bc458d07a6c53e33c9d5ebeb1",
          "body": "…resentation",
          "is_bot": false,
          "headline": "feat: add String method to CollaborationType for localized string rep…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-22T03:23:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "607f240a0b39b225c3b12a5b7cb869f16de113c7",
          "body": "… logging",
          "is_bot": false,
          "headline": "fix: handle specific SQL error in GetRelation method to improve error…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-18T09:10:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a536c29a4cd321e77e0e6ac1fcf8c52a9742e31",
          "body": "… tracking",
          "is_bot": false,
          "headline": "fix: add Status field to resume relation creation for improved status…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-18T02:39:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "09d14ad72e6f9db29c5017544354162c01e9faec",
          "body": null,
          "is_bot": false,
          "headline": "feat: add subscription check for resume status in chat",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-18T01:45:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "76259a75bc47b59508b9d6f40b217cff9fff524a",
          "body": "…g resume relation status updates",
          "is_bot": false,
          "headline": "feat: add UpdateRelationStatus method to Resume interface for managin…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-17T10:06:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "12b75809649bca52edeb5c63e911393eaf2805c3",
          "body": "…ed methods for status management",
          "is_bot": false,
          "headline": "refactor: integrate ResumeStatus into ResumeRelation and update relat…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-17T09:48:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0fc206f5c82cab5da88f8c6aa292e9b1e35728c5",
          "body": null,
          "is_bot": false,
          "headline": "feat: add Set method to SubscriptionStatus for flag management",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-16T15:11:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a9981ec0f7ae5eaece4b636fa2222992de0ce992",
          "body": "…on to prevent message type reset",
          "is_bot": false,
          "headline": "refactor: comment out MsgEmpty assignment in aggregateMessages functi…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-16T04:31:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "941d968db3b19de5222b5b1f3cf0efdfe8569560",
          "body": "… identification",
          "is_bot": false,
          "headline": "refactor: add PushToken field to DisplayUser struct for enhanced user…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-15T09:16:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6670789890daa151d60c3606d742fecc226ae421",
          "body": "…sAnonymous field",
          "is_bot": false,
          "headline": "refactor: update role constants and enhance DisplayUser struct with I…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-15T08:59:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ed909fa94d3af7743f90e97c16c72f70f7844abf",
          "body": "… in chat service",
          "is_bot": false,
          "headline": "refactor: change HireStatus field to a pointer type and initialize it…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-14T10:12:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d3e38485e4a28372a50bba8b8a4cbf4d68a7bdf6",
          "body": "…t value to \"INACTIVE\"",
          "is_bot": false,
          "headline": "refactor: change HireStatus type from int to string and update defaul…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-14T09:49:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cb6e94511d41145965b89b9b2b71f2bc1407d8be",
          "body": "…e JSON marshaling",
          "is_bot": false,
          "headline": "feat: add HireStatusDeleted to manage deleted hire statuses and updat…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-14T09:44:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "817bd984f662d9dab70a33bb6eb94a4d2b6505f5",
          "body": "* feat: add user subscription management in service and store\n\n* refactor: streamline user subscription retrieval and update logic in service and store\n\n* Refactor subscription status handling and JSON marshaling\n\n* Refactor SubscriptionStatus MarshalJSON logic\n\n* Fix subscription status update on expiration\n\n* Fix subscription expiration check logic",
          "is_bot": false,
          "headline": "feat: add user subscription management in service and store (#12)",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-11T12:40:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "09d337c487e6be4d92e637bbf32853a30080569a",
          "body": "…tion",
          "is_bot": false,
          "headline": "feat: add IsMine field to Message struct for message ownership indica…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-10T08:57:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f334dc0a8c4bfbc6c7bbd286a18f1da5f67a38a",
          "body": null,
          "is_bot": false,
          "headline": "feat: introduce WithFile function to set file options in SendOption",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-10T07:37:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4d0bcded99b141c67f83fb2d8ceb1eeed400eefb",
          "body": null,
          "is_bot": false,
          "headline": "fix: inject content into messages during aggregation in chat service",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-10T05:36:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "37b1576c600ec44dc29cb775720bae929f5db573",
          "body": "…atus",
          "is_bot": false,
          "headline": "fix: standardize ResumeSnapshot struct by renaming UnlockStatus to St…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-10T05:16:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "204cab8974eb81ff33ccf07868e968d7b8c74f74",
          "body": null,
          "is_bot": false,
          "headline": "refactor: update ChatResumeSnapshot struct and introduce ResumeStatus",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-10T05:07:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aad9e519082076970ace458d0d8a690f3696f65d",
          "body": null,
          "is_bot": false,
          "headline": "fix: update JSON tag for Content field in ChatResumeSnapshot struct",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-09T16:43:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "199570b0236b61b76797ec6868e52178fe4fe015",
          "body": null,
          "is_bot": false,
          "headline": "update: Inline ResumeContent in ChatResumeSnapshot JSON",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-09T15:58:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "61af3ba6e8a9a032a45bce853b3f8303028d9e70",
          "body": "add: get applied job posts ids",
          "is_bot": false,
          "headline": "Merge pull request #11 from A-pen-app/feat_get_applied_ids",
          "author_name": "Robert Chu",
          "author_login": "juroberttyb",
          "committed_at": "2025-07-09T11:06:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c7067793f6abfc5882bd285b0a140c8eefbc822",
          "body": null,
          "is_bot": false,
          "headline": "add: get applied job posts ids",
          "author_name": "r",
          "author_login": "juroberttyb",
          "committed_at": "2025-07-09T11:01:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f64d664a528f6be9ad00f694f210ad7c4aa2ec36",
          "body": "…r agreement retrieval",
          "is_bot": false,
          "headline": "fix: update SQL query in Get method to include appID for accurate use…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-09T09:37:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ccafb4a650f4d1c927340127eb5b9192ac242f3",
          "body": "- Introduced Agreement interface in both service and store packages to handle agreement-related operations.\n- Added methods for agreeing to and retrieving agreement records",
          "is_bot": false,
          "headline": "feat: add Agreement  to service and store (#10)",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-09T08:37:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e7dee41576f619e53a567a53770e746ed073eacb",
          "body": "- Updated GetRelation method in resumeStore to accept variadic GetRelationOptionFunc for flexible filtering by chatID and snapshotID.\n- Introduced GetRelationOption struct to encapsulate filter options, improving code clarity and maintainability.\n- Modified chat service methods to utilize the new filtering capabilities, ensuring accurate retrieval of resume relations.",
          "is_bot": false,
          "headline": "refactor: GetRelation method to support multiple filters",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-09T07:36:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4c8ae200ef134082673b881c525675933d2ed856",
          "body": "- Changed HireStatus constants to use iota for automatic indexing, improving maintainability.\n- Modified the String method to MarshalJSON for proper JSON serialization of HireStatus values, enhancing data interchange capabilities.",
          "is_bot": false,
          "headline": "refactor: update HireStatus implementation in chat model",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-09T05:16:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2880b0fb0114f457090d3f51c7701434ae39bb80",
          "body": "… constants\n\n- Updated HireStatus field in ChatRoom struct from string to HireStatus type for better type safety and clarity.\n- Introduced HireStatus constants (Inactive and Active) to represent the hiring status more effectively.\n- Modified DisplayUser struct to rename ID field to user_id for improved clarity in user identification.",
          "is_bot": false,
          "headline": "refactor: change HireStatus field type in ChatRoom and add HireStatus…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-09T05:05:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e1481c99769d9f547e01ab01427d4603f45258e7",
          "body": "- Changed ResumeSnapshot field in ChatRoom struct from ChatResumeSnapshot to *ChatResumeSnapshot to allow for optional snapshot representation.\n- Updated chat service methods to reflect this change, ensuring proper initialization of ResumeSnapshot with detailed information.",
          "is_bot": false,
          "headline": "refactor: update ResumeSnapshot field in ChatRoom to be a pointer",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-09T01:27:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dbf18eaced0afc4aafd0acc7392ede3ac9d4dd2d",
          "body": "…Room\n\n- Introduced github.com/A-pen-app/feed-sdk v1.3.5 as an indirect dependency in go.mod and updated go.sum accordingly.\n- Implemented Feedtype, Score, and GetID methods in ChatRoom to enhance integration with the feed model.",
          "is_bot": false,
          "headline": "chore: add feed-sdk dependency and integrate Feedtype methods in Chat…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-08T09:52:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3cabe138429af44392ac018fa8e5e18a38960573",
          "body": "…m int64 to string\n\n- Updated Size field in both Media and MediaUpload structs to be of type string, allowing for more flexible size representation.\n- Adjusted JSON and database tags accordingly to maintain compatibility with existing data structures.",
          "is_bot": false,
          "headline": "refactor: change Size field type in Media and MediaUpload structs fro…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-08T04:52:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b764c755ce4d0ce62c39d5addf22aaadd6063c1c",
          "body": "…ld in media upload\n\n- Reordered role constants in chat model for clarity, introducing RoleNone and adjusting indices accordingly.\n- Added Placeholder field to MediaUpload struct to support additional media attributes.\n- Updated media store logic to accommodate the new Placeholder field during media uploads.",
          "is_bot": false,
          "headline": "refactor: update role constants in chat model and add placeholder fie…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-08T04:07:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4bd9a83b8625430ea039e3ae518e729c3930e3c8",
          "body": "- Changed Read method signature in resumeStore from chatID to snapshotID for improved clarity and consistency.\n- Updated SQL query and logging to reflect the new parameter, ensuring accurate updates to resume relation read status.",
          "is_bot": false,
          "headline": "refactor: update Read method in resumeStore to use snapshotID",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-07T10:00:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4171055471859c369de7220325e3e30b984ab5fc",
          "body": "- Enhanced GetChatID method to dynamically construct SQL queries based on the presence of postID, improving flexibility in chat retrieval.\n- Updated argument handling for database queries to ensure correct execution with varying postID conditions.",
          "is_bot": false,
          "headline": "refactor: improve GetChatID method for optional postID handling",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-07T09:01:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b0e260a0f22d13282aabccc6394453ae409dd40",
          "body": "- Changed Character field in DisplayUser struct from string to *string to allow for optional character representation, enhancing flexibility in user data handling.",
          "is_bot": false,
          "headline": "fix: update Character field in DisplayUser struct to be a pointer",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-07T04:11:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d4fc58efd7aa6d02626fc6f27a8c3f8242194765",
          "body": "- Added ChatResumeSnapshot struct to encapsulate resume snapshot details, including ID, content, read status, and unlock status.\n- Updated chat service methods to initialize ResumeSnapshot with detailed information, improving chat data handling.\n- Modified SQL query in chat store to support additional control flags for enhanced chat retrieval.",
          "is_bot": false,
          "headline": "feat: enhance chat model and service with resume snapshot functionality",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-07T03:18:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2627d5319715968b66dffaec0541e759901b778d",
          "body": "* feat: add media store with database operations\n\n  - Add media store interface and implementation\n  - Support comprehensive media model with extended fields\n\n* Merge branches 'media' and 'main' of https://github.com/A-pen-app/resume-sdk into media\n\n* Update chat.go",
          "is_bot": false,
          "headline": "feat: add media store with database operations (#9)",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-05T03:26:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "96e33e8f46db4d02d2e8ee4dc223ff67c2b030f9",
          "body": "- Updated GetChats method signature in chat service and store to remove the pinnedOnly parameter, streamlining chat retrieval.\n- Adjusted SQL query to maintain functionality without the pinnedOnly filter, ensuring consistent chat data retrieval.",
          "is_bot": false,
          "headline": "refactor: simplify GetChats method by removing pinnedOnly parameter",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-04T10:23:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72cffd3c2498888d9e7719d3febad9395ce17f2b",
          "body": "- Implemented Pin method in chat service to update the pinned status of chat threads.\n- Added Read method in resume service to mark resume relations as read, updating the timestamp accordingly.\n- Updated Chat and Resume interfaces to include the new methods for enhanced functionality.",
          "is_bot": false,
          "headline": "feat: add Pin and Read methods to chat and resume services (#8)",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-04T10:15:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e3516cb85ba0d69084868187a4cfb9e9244169d0",
          "body": "… (#7)\n\n- Added SendMessage method to facilitate sending messages in a chat, including error handling and content injection.\n- Introduced UnsendMessage method to allow users to unsend messages, with ownership checks and idempotency considerations.\n- Updated Chat interface to include the new methods for enhanced chat functionality.",
          "is_bot": false,
          "headline": "feat: implement SendMessage and UnsendMessage methods in chat service…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-04T04:32:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "da3d11492383409594a99f78d9495184285f7094",
          "body": "…injection\n\n- Added aggregateLastMessage method to process and retrieve the last message for a chat, handling message status and user visibility.\n- Implemented injectContent method to manage message content based on type and handle reply messages, ensuring proper content injection for different message types.\n- Updated Get and GetChats methods to include last message aggregation, improving chat data retrieval and user experience.",
          "is_bot": false,
          "headline": "feat: enhance chat service with last message aggregation and content …",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-03T10:53:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f34941b00373ba9c195d7a26a2bbd1187b69cd77",
          "body": "* feat: handle ChatRoom logic in chat service\n\n-  handle ChatRoom logic in chat service\n- Updated Message struct to include reference_id in the database.\n- Modified AddMessage method signature to accept referenceID as a parameter.\n- Adjusted related methods in chat store to handle reference_id for improved message tracking and retrieval.\n\n* Update chat.go\n\n* Update chat.go\n\n* Enhance logging in chat and resume services",
          "is_bot": false,
          "headline": "feat: handle ChatRoom logic in chat service (#6)",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-02T12:11:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "833a7aad161a238e95d5c70abcba9839fd0ced68",
          "body": "- Modified GetChatID method to accept postID as a pointer, allowing for optional postID handling.\n- Adjusted SQL query and insertion logic to accommodate cases where postID may be nil, enhancing flexibility in chat creation.",
          "is_bot": false,
          "headline": "refactor: update GetChatID method signature and logic",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-02T05:54:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "638ab605872935539e75156fdd8dcbefe4410896",
          "body": "- Updated GetChats method signature to add pinnedOnly parameter for filtering pinned chat rooms.\n- Modified query conditions to incorporate the pinnedOnly filter, enhancing chat retrieval functionality.",
          "is_bot": false,
          "headline": "feat: extend GetChats method to include pinnedOnly filter",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-02T05:07:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d2de10d37880d4fed70a1b76eca46f5bbfcae3fa",
          "body": "- Refactored resumeService to include an App store for better app context handling.\n- Updated method signatures to replace appID with bundleID.\n- Adjusted Patch and Get methods to retrieve app information using bundleID before performing operations on resumes.",
          "is_bot": false,
          "headline": "refactor: update resumeService to use App store and bundleID",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-02T01:26:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9fd009ac347c37b3e2c1a2205647cdb926c507d4",
          "body": "…… (#5)\n\n* feat: add AppID field to ChatRoom and Resume models, update related methods\n\n- Introduced AppID field in ChatRoom and Resume structs for better app context handling.\n- Updated methods in resume and chat services to include AppID as a parameter.\n- Modified store methods to accommodate AppID in queries and data handling.\n\n* Remove: AppID parameter from AddMessage and AddMessages methods",
          "is_bot": false,
          "headline": "feat: add AppID field to ChatRoom and Resume models, update related m…",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-01T10:40:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "625f2a0639bc3a3c43455999392208e3e6f05aa4",
          "body": "- Changed field names in `GetOption` and `SendOption` structs to follow Go naming conventions, updating `status` to `Status`, `unreadOnly` to `UnreadOnly`, `typ` to `Type`, `body` to `Body`, `mediaIDs` to `MediaIDs`, and `replyToMessageID` to `ReplyToMessageID`.",
          "is_bot": false,
          "headline": "refactor: update field names in GetOption and SendOption structs",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-01T05:40:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "212e89642f170143af3aceeef024cbd7cf994c72",
          "body": "- Renamed `getOption` to `GetOption` and `sendOption` to `SendOption` for consistency with Go naming conventions.",
          "is_bot": false,
          "headline": "refactor: rename option types",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-07-01T05:32:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0a6bc10fb43776daba9ee0fd4e03adca6c3beedb",
          "body": "* feat: add chat store\n\n- Changed ResumeContent to use BirthYear instead of Age.\n- Updated HospitalExperience to use pointers for Department and added YearOfExperience.\n- Introduced ResumeSnapshotContent struct for enhanced resume data handling.\n- Added Chat interface with methods for managing chat functionality.\n- Updated go.mod and go.sum to include github.com/lib/pq as a dependency.\n\n* update ResumeSnapshot and ChatRoom structures\n\n* Enhance ChatRoom and Resume structures",
          "is_bot": false,
          "headline": "feat: add chat store (#4)",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-06-27T05:02:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db4217049d03caa0a99217f9139be3b9a5e3b673",
          "body": "* feat add resume relation\n\n- Changed module name from resume-sdk to hire-sdk in go.mod and relevant import paths.\n- Updated ResumeContent fields to use pointers for optional values.\n- Added ResumeRelation struct and methods for creating and retrieving relations in the store.\n\n* Update README.md\n\n* feat: add UpdatedAt field to ResumeRelation and update store methods\n\n* Update resume.go",
          "is_bot": false,
          "headline": "feat add resume relation (#3)",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-06-17T04:56:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "84ac5c335692d9a9a9bd77d6d35ded4ad7863736",
          "body": null,
          "is_bot": false,
          "headline": "fix: correct parameter type for NewResume constructor",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-06-06T03:34:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bcb85962a821c370d78c4132349d883322eb6792",
          "body": "…store",
          "is_bot": false,
          "headline": "fix: correct parameter type for NewResume constructor in service and …",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-06-05T10:26:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "30a8cfbd5f0d22db956e1eec9d250940051a2932",
          "body": null,
          "is_bot": false,
          "headline": "refactor: remove context parameter from NewResume store and service",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-06-05T09:45:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c86db7d72206890f13d4dae317c1feec5f0edbc8",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-06-04T08:31:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "67443c16a8b4bf119c1baf86c7b1a5b84317366d",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-06-04T08:27:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5924ca6919f8fb0da8388355ee2ed2abfee49952",
          "body": "* feat: add store and service implementation\n\n* update some suggestions",
          "is_bot": false,
          "headline": "feat: add store and service implementation (#2)",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-06-04T08:11:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd436f1a1c38bc91db2f0599b467baadc2f28bf4",
          "body": "* feat: add interface and initial implementation\n\n* Update resume.go\n\n* update some suggestions\n\n* Update resume.go\n\n* update some suggestions",
          "is_bot": false,
          "headline": "feat: add interface and initial implementation (#1)",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-06-04T04:50:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fdc8959b1af3ef094a932b71d767c637be62b9a6",
          "body": null,
          "is_bot": false,
          "headline": "Initial commit",
          "author_name": "Jun",
          "author_login": "asdf7894k",
          "committed_at": "2025-06-03T09:29:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 1,
      "commits_last_year": 37,
      "latest_release_at": "2026-07-16T09:37:09Z",
      "latest_release_tag": "v1.3.17",
      "releases_from_tags": false,
      "days_since_last_push": 6,
      "active_weeks_last_year": 15,
      "days_since_latest_release": 7,
      "mean_days_between_releases": null
    },
    "community": {
      "has_readme": true,
      "has_license": false,
      "has_description": false,
      "has_contributing": false,
      "health_percentage": 37,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/A-pen-app/hire-sdk",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/A-pen-app/hire-sdk",
          "is_deprecated": false,
          "latest_version": "v1.3.18",
          "repository_url": "https://github.com/A-pen-app/hire-sdk",
          "versions_count": 92,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-17T01:46:13Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 21879,
      "source_files_sampled": 25,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/A-pen-app/feed-sdk",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.5"
        },
        {
          "name": "github.com/A-pen-app/logging",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.4.0"
        },
        {
          "name": "github.com/google/uuid",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/jmoiron/sqlx",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.4.0"
        },
        {
          "name": "github.com/lib/pq",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.9"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 15,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "asdf7894k",
          "commits": 95,
          "avatar_url": "https://avatars.githubusercontent.com/u/16027424?v=4"
        },
        {
          "type": "User",
          "login": "bbhands",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/1978004?v=4"
        },
        {
          "type": "User",
          "login": "juroberttyb",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/19973155?v=4"
        },
        {
          "type": "User",
          "login": "penpeer-williamhuang",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/291699331?v=4"
        }
      ],
      "contributors_sampled": 4,
      "top_contributor_share": 0.95
    },
    "quality_signals": {
      "has_ci": false,
      "has_tests": true,
      "ci_workflows": [],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 0,
            "reason": "0 out of 2 merged PRs checked by a CI test -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 2/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 0,
            "reason": "license file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 3,
            "reason": "4 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 3",
            "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": null,
            "reason": "no dependencies found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": null,
            "reason": "No tokens found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "39 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "770666995574647aa758d548809cc95e2dd76b93",
        "ran_at": "2026-07-23T22:13:23Z",
        "aggregate_score": 1.4,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-17T01:46:33Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-16T09:33:56Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/A-pen-app/hire-sdk",
    "host": "github.com",
    "name": "hire-sdk",
    "owner": "A-pen-app"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 40,
      "inputs": {
        "security": 14,
        "vitality": 72,
        "community": 15,
        "governance": 57,
        "engineering": 30
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 72,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "commits_last_year": 37,
              "human_commit_share": 1,
              "days_since_last_push": 6,
              "active_weeks_last_year": 15
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "15/52 weeks with commits",
                "points": 10.4,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 15
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "37 commits in the last year",
                "points": 14.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 37
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "4 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "good",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 84,
            "inputs": {
              "releases_count": 1,
              "latest_release_tag": "v1.3.17",
              "releases_from_tags": false,
              "days_since_latest_release": 7,
              "mean_days_between_releases": null
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "1 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 7 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 7
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "cadence unknown (single release)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence_unknown",
                    "params": {}
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 6,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 6 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 15,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "at_risk",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 32,
            "inputs": {
              "has_readme": true,
              "has_license": false,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "no license file detected",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "license_absent",
                    "params": {}
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 57,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 16,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 4,
              "top_contributor_share": 0.95
            },
            "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 95% of commits",
                "points": 1.1,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 95
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "4 contributors",
                "points": 5.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "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": 15,
              "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": "15/15 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 15,
                      "decided": 15
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 2/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "followers": 2,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "A-pen-app",
              "public_repos": 19,
              "account_age_days": 2182
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "2 followers of A-pen-app",
                "points": 3.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 2,
                      "login": "A-pen-app"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "19 public repos, account ~5 yr old",
                "points": 21.4,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 19
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 5
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/A-pen-app/hire-sdk"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 6
            },
            "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 6 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "92 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 92
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "at_risk",
        "name": "Engineering Quality",
        "value": 30,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "critical",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 24,
            "inputs": {
              "has_ci": false,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "0 out of 2 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "at_risk",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "critical",
        "name": "Security",
        "value": 14,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "dangerous_workflow",
                    "packaging",
                    "pinned_dependencies",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 14,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 13,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 5,
              "scorecard_aggregate": 1.4
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "0 out of 2 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 2/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "4 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 3",
                "points": 2.2,
                "status": "partial",
                "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": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "No tokens found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "39 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "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": 3
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 63,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.94,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "94 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 94,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_pinned_dependencies"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 66,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.02,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "go.mod (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "go.mod"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "2 of the last 100 commits agent-authored or agent-credited",
                "points": 4,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 2,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": 21879,
              "source_files_sampled": 25,
              "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/25 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 25,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T22:13:31.716874Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/A-pen-app/hire-sdk.svg",
  "full_name": "A-pen-app/hire-sdk",
  "license_state": "absent",
  "license_spdx": null
}

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

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

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