Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-25 19:47 UTC

tyemirov / loopaware

Feedback Service to gather users' feedback

Go · HTML · JavaScriptLicencia propia★ 0 estrellas⑂ 0 forksdesde sept 2025Ver en GitHub ↗

tyemirov/loopaware tiene un índice de salud de 57 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (90/100) y la más baja, Security (30/100). Se actualizó por última vez hace 6 días. Una sola persona concentra la mayor parte del trabajo reciente.

57
global / 100
Moderado

Índice de salud del software

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

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

Perfil de puntuación

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

Titularidad

Vadym TyemirovCuenta personal
5 seguidores50 repositorios públicosdesde sept 2011Marco Polo Research Lab

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
Gogithub.com/MarkoPoloResearchLab/loopawareapunta a otro repositorio; no se puntúav0.7.51-70hace 6 días
npm@loopaware/react-native0.1.0791hace 14 díasloopawarefeedbackreact-nativeexpo

Métricas por categoría

Vitalidad

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

90Excelente · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 6 días
26.3/36Cadencia de commits — 38/52 semanas con commits
18/18Volumen de commits — 1254 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year1254
human_commit_share1
days_since_last_push6
active_weeks_last_year38
Cómo se puntúa
27/27Publica versiones — 56 versiones publicadas
36/36Recencia de las versiones — última versión hace 6 días
27/27Cadencia de publicación — una versión cada ~1 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count56
latest_release_tagv0.7.51
releases_from_tagsno
days_since_latest_release6
mean_days_between_releases1

Comunidad y Adopción

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

31En riesgo · 18% del índice global
Cómo se puntúa
0/60Estrellas — 0 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
16.9/22.5Licencia — archivo de licencia presente, no es una licencia reconocida
18/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
25.4/80Descargas mensuales — 79 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packages@loopaware/react-native
dependents
ecosystemsnpm
total_downloads
monthly_downloads79
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

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

50Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
1.2/22.5Distribución de commits — el principal contribuyente firma el 95% de los commits
2.7/13.5Amplitud de contribuyentes — 2 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled2
top_contributor_share0,948
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
34.4/38.3Aceptación de PR — 271/301 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/15 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs271
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs30
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
5.6/25Alcance del propietario — 5 seguidores de tyemirov
24.4/25Trayectoria — 50 repos públicos, cuenta de ~14 años
Datos de entrada utilizados
followers5
owner_typeUser
is_verified
owner_logintyemirov
public_repos50
account_age_days5417
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en npm
35/35Recencia de publicación — última publicación hace 14 días
4/20Historial de versiones — 1 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packages@loopaware/react-native
ecosystemsnpm
any_deprecatedno
min_days_since_publish14

Calidad de Ingeniería

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

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

Documentación

90Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://loopaware.mprlab.com
10/10Descripción del repositorio
10/10Topics — 3 topics
0/10Wiki
Datos de entrada utilizados
topicsfeedback, feedback-form, website
has_wikino
homepagehttps://loopaware.mprlab.com
has_readme
has_docs_dir
has_description

Seguridad

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

30En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2/2.5CI-Tests — 6 out of 7 merged PRs checked by a CI test -- score normalized to 8
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/15 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.2/2.5Licencia — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — sin datos
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 32 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate3
Excluidos de la puntuación (sin datos o no aplicable): packaging. 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.

76Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md, mobile/AGENTS.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 80 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,8
agent_instruction_filesAGENTS.md, mobile/AGENTS.md
agent_instruction_max_bytes7885
Cómo se puntúa
18/18Arranque con un solo comando — Makefile
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — clients/react-native/tsconfig.json, mobile/tsconfig.json, tests/tsconfig.json
10/10Entorno reproducible — Dockerfile, lockfile
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 100
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum, package-lock.json
has_dockerfile
typed_language
bootstrap_filesMakefile
has_devcontainerno
has_linter_configno
typecheck_configsclients/react-native/tsconfig.json, mobile/tsconfig.json, tests/tsconfig.json
agent_commit_share0
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
54.4/55Tamaños de archivo manejables — 2/198 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes125.772
source_files_sampled198
oversized_source_files2

Datos clave

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

Advertencias de recopilación de datos

  • go package 'github.com/MarkoPoloResearchLab/loopaware' points at a different repository (https://github.com/MarkoPoloResearchLab/loopaware); excluded from ecosystem scoring
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Más detalle

OpenSSF Scorecard 3.0 / 10
3.0agregado

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-25 19:46 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
8CI-Tests6 out of 7 merged PRs checked by a CI test -- score normalized to 8
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/15 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
9Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
n/dPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities32 existing vulnerabilities detected
Dependencias directas 27
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/gin-contrib/corsv1.7.6go.mod
Gogithub.com/gin-gonic/ginv1.11.0go.mod
Gogithub.com/glebarez/sqlitev1.11.0go.mod
Gogithub.com/golang-jwt/jwt/v5v5.3.0go.mod
Gogithub.com/google/uuidv1.6.0go.mod
Gogithub.com/spf13/cobrav1.10.2go.mod
Gogithub.com/stretchr/testifyv1.11.1go.mod
Gogithub.com/tyemirov/tauthv0.9.8go.mod
Gogithub.com/tyemirov/utilsv0.17.0go.mod
Gogo.uber.org/zapv1.27.1go.mod
Gogolang.org/x/netv0.52.0go.mod
Gogoogle.golang.org/grpcv1.78.0go.mod
Gogoogle.golang.org/protobufv1.36.11go.mod
Gogopkg.in/yaml.v3v3.0.1go.mod
Gogorm.io/gormv1.31.1go.mod
npmexpo~56.0.12mobile/package.json
npmexpo-auth-session~56.0.14mobile/package.json
npmexpo-constants~56.0.18mobile/package.json
npmexpo-crypto~56.0.4mobile/package.json
npmexpo-dev-client~56.0.20mobile/package.json
npmexpo-secure-store~56.0.4mobile/package.json
npmexpo-status-bar~56.0.4mobile/package.json
npmexpo-system-ui~56.0.5mobile/package.json
npmexpo-web-browser~56.0.5mobile/package.json
npmreact19.2.3mobile/package.json
npmreact-native0.85.3mobile/package.json
npmreact-native-safe-area-context~5.7.0mobile/package.json
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": [
        "feedback",
        "feedback-form",
        "website"
      ],
      "is_fork": false,
      "size_kb": 19700,
      "has_wiki": false,
      "homepage": "https://loopaware.mprlab.com",
      "languages": {
        "Go": 1286100,
        "CSS": 9611,
        "HTML": 1275603,
        "Shell": 313949,
        "Python": 98171,
        "Makefile": 21977,
        "Dockerfile": 461,
        "JavaScript": 732349,
        "TypeScript": 73987
      },
      "pushed_at": "2026-07-19T17:36:09Z",
      "created_at": "2025-09-01T19:48:48Z",
      "owner_type": "User",
      "updated_at": "2026-07-19T17:14:49Z",
      "description": "Feedback Service to gather users'  feedback",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "master",
      "license_spdx_raw": "NOASSERTION",
      "primary_language": "Go",
      "significant_languages": [
        "Go",
        "HTML",
        "JavaScript"
      ]
    },
    "owner": {
      "blog": "https://mprlab.com",
      "name": "Vadym Tyemirov",
      "type": "User",
      "login": "tyemirov",
      "company": "Marco Polo Research Lab",
      "location": "Los Angeles, CA",
      "followers": 5,
      "avatar_url": "https://avatars.githubusercontent.com/u/1078274?v=4",
      "created_at": "2011-09-25T14:17:14Z",
      "is_verified": null,
      "public_repos": 50,
      "account_age_days": 5417
    },
    "license": {
      "state": "custom",
      "spdx_id": null,
      "raw_spdx": "NOASSERTION",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.7.51",
          "kind": "patch",
          "published_at": "2026-07-19T17:14:47Z"
        },
        {
          "tag": "v0.7.50",
          "kind": "patch",
          "published_at": "2026-07-19T04:04:44Z"
        },
        {
          "tag": "v0.7.49",
          "kind": "patch",
          "published_at": "2026-07-19T01:13:08Z"
        },
        {
          "tag": "v0.7.48",
          "kind": "patch",
          "published_at": "2026-07-16T22:02:33Z"
        },
        {
          "tag": "v0.7.47",
          "kind": "patch",
          "published_at": "2026-07-16T21:12:00Z"
        },
        {
          "tag": "v0.7.46",
          "kind": "patch",
          "published_at": "2026-07-16T19:08:06Z"
        },
        {
          "tag": "v0.7.45",
          "kind": "patch",
          "published_at": "2026-07-16T18:30:00Z"
        },
        {
          "tag": "v0.7.44",
          "kind": "patch",
          "published_at": "2026-07-16T17:56:50Z"
        },
        {
          "tag": "v0.7.43",
          "kind": "patch",
          "published_at": "2026-07-11T06:09:22Z"
        },
        {
          "tag": "v0.7.42",
          "kind": "patch",
          "published_at": "2026-07-11T00:10:15Z"
        },
        {
          "tag": "v0.7.41",
          "kind": "patch",
          "published_at": "2026-07-09T04:13:51Z"
        },
        {
          "tag": "v0.7.40",
          "kind": "patch",
          "published_at": "2026-07-08T23:40:26Z"
        },
        {
          "tag": "v0.7.39",
          "kind": "patch",
          "published_at": "2026-07-08T20:37:04Z"
        },
        {
          "tag": "v0.7.38",
          "kind": "patch",
          "published_at": "2026-07-06T04:50:27Z"
        },
        {
          "tag": "v0.7.37",
          "kind": "patch",
          "published_at": "2026-07-05T22:10:06Z"
        },
        {
          "tag": "v0.7.36",
          "kind": "patch",
          "published_at": "2026-07-05T02:40:28Z"
        },
        {
          "tag": "v0.7.35",
          "kind": "patch",
          "published_at": "2026-07-03T21:32:01Z"
        },
        {
          "tag": "v0.7.34",
          "kind": "patch",
          "published_at": "2026-07-03T00:09:55Z"
        },
        {
          "tag": "v0.7.33",
          "kind": "patch",
          "published_at": "2026-07-02T19:21:15Z"
        },
        {
          "tag": "v0.7.32",
          "kind": "patch",
          "published_at": "2026-06-30T18:13:31Z"
        },
        {
          "tag": "v0.7.31",
          "kind": "patch",
          "published_at": "2026-06-26T19:39:17Z"
        },
        {
          "tag": "v0.7.30",
          "kind": "patch",
          "published_at": "2026-06-26T19:09:55Z"
        },
        {
          "tag": "v0.7.29",
          "kind": "patch",
          "published_at": "2026-06-25T01:04:04Z"
        },
        {
          "tag": "v0.7.28",
          "kind": "patch",
          "published_at": "2026-06-24T23:11:38Z"
        },
        {
          "tag": "v0.7.27",
          "kind": "patch",
          "published_at": "2026-06-24T22:40:08Z"
        },
        {
          "tag": "v0.7.26",
          "kind": "patch",
          "published_at": "2026-06-24T16:32:11Z"
        },
        {
          "tag": "v0.7.25",
          "kind": "patch",
          "published_at": "2026-06-20T00:12:26Z"
        },
        {
          "tag": "v0.7.24",
          "kind": "patch",
          "published_at": "2026-06-17T06:31:30Z"
        },
        {
          "tag": "v0.7.23",
          "kind": "patch",
          "published_at": "2026-06-17T03:13:17Z"
        },
        {
          "tag": "v0.7.22",
          "kind": "patch",
          "published_at": "2026-06-16T23:08:54Z"
        },
        {
          "tag": "v0.7.21",
          "kind": "patch",
          "published_at": "2026-06-13T22:07:28Z"
        },
        {
          "tag": "v0.7.20",
          "kind": "patch",
          "published_at": "2026-06-12T23:00:51Z"
        },
        {
          "tag": "v0.7.19",
          "kind": "patch",
          "published_at": "2026-06-10T06:00:37Z"
        },
        {
          "tag": "v0.7.18",
          "kind": "patch",
          "published_at": "2026-06-09T23:59:39Z"
        },
        {
          "tag": "v0.7.17",
          "kind": "patch",
          "published_at": "2026-06-09T00:29:53Z"
        },
        {
          "tag": "v0.7.16",
          "kind": "patch",
          "published_at": "2026-06-08T21:00:00Z"
        },
        {
          "tag": "v0.7.15",
          "kind": "patch",
          "published_at": "2026-06-05T21:18:56Z"
        },
        {
          "tag": "v0.7.14",
          "kind": "patch",
          "published_at": "2026-06-05T18:27:43Z"
        },
        {
          "tag": "v0.7.13",
          "kind": "patch",
          "published_at": "2026-06-04T19:05:16Z"
        },
        {
          "tag": "v0.7.12",
          "kind": "patch",
          "published_at": "2026-06-02T18:02:22Z"
        },
        {
          "tag": "v0.7.11",
          "kind": "patch",
          "published_at": "2026-06-02T07:58:04Z"
        },
        {
          "tag": "v0.7.10",
          "kind": "patch",
          "published_at": "2026-05-29T20:44:13Z"
        },
        {
          "tag": "v0.7.9",
          "kind": "patch",
          "published_at": "2026-05-26T06:17:18Z"
        },
        {
          "tag": "v0.7.8",
          "kind": "patch",
          "published_at": "2026-05-26T05:30:39Z"
        },
        {
          "tag": "v0.7.7",
          "kind": "patch",
          "published_at": "2026-05-25T23:00:15Z"
        },
        {
          "tag": "v0.7.6",
          "kind": "patch",
          "published_at": "2026-05-15T20:56:54Z"
        },
        {
          "tag": "v0.7.5",
          "kind": "patch",
          "published_at": "2026-05-15T08:55:06Z"
        },
        {
          "tag": "v0.7.4",
          "kind": "patch",
          "published_at": "2026-05-15T07:41:20Z"
        },
        {
          "tag": "v0.7.3",
          "kind": "patch",
          "published_at": "2026-05-15T02:06:25Z"
        },
        {
          "tag": "v0.7.2",
          "kind": "patch",
          "published_at": "2026-05-08T20:00:55Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2026-05-04T01:06:33Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-05-03T20:47:20Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-05-01T18:38:53Z"
        },
        {
          "tag": "v0.5.8",
          "kind": "patch",
          "published_at": "2026-04-24T07:02:35Z"
        },
        {
          "tag": "v0.5.7",
          "kind": "patch",
          "published_at": "2026-04-24T05:23:05Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2026-03-21T07:48:46Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "e3c087668113b7043afbe26b2c27afddb8ef7bc5",
          "body": null,
          "is_bot": false,
          "headline": "Release v0.7.51",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-19T17:13:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "666f2330cb965d7500bafe5b81af9d7e7ec1d4df",
          "body": "…ntract\n\nfix(preflight): use app-owned TAuth tenant contract",
          "is_bot": false,
          "headline": "Merge pull request #301 from tyemirov/bugfix/B067-use-tauth-tenant-co…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-19T17:03:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "41f211d61e247a48b58363bc156a98e2661e575e",
          "body": "…y contract test\n\n- Remove obsolete shared TAuth dotenv metadata from dependency verifier\n- Require LoopAware tenant ID and session cookie from canonical environment\n- Add dependency-contract-check to Makefile and shell/Python test coverage\n- Surface sanitized verifier failures in Ansible preflight failures",
          "is_bot": false,
          "headline": "fix(preflight): use app-owned TAuth tenant contract and add dependenc…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-19T04:39:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7f7fffea37793ab3d5ef5d56aabd6cc9b8d4f99",
          "body": null,
          "is_bot": false,
          "headline": "Release v0.7.50",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-19T04:03:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9946e673be4ea0fa349e7b1a2fe6dbf33fcd48c1",
          "body": "…mory\n\nfix(preflight): measure Linux available memory",
          "is_bot": false,
          "headline": "Merge pull request #300 from tyemirov/bugfix/B066-deploy-available-me…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-19T03:53:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6bca56002f6f53ea402befba02d825dc5315f1f7",
          "body": "- Replace Ansible ansible_memfree_mb with fail-closed MemAvailable parser\n- Separate architecture and memory assertions; report detected capacity\n- Update preflight contract checks and related documentation",
          "is_bot": false,
          "headline": "fix(preflight): require Linux MemAvailable for deployable memory check",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-19T01:44:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e644ee86389fa0ea92b909f8f6f5d5af446410c",
          "body": null,
          "is_bot": false,
          "headline": "Release v0.7.49",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-19T01:11:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "efee19397243d848361ddd70990be9f8dcd6f7ea",
          "body": "…ture\n\ntest: use mpr-ui auth fixture for protected pages",
          "is_bot": false,
          "headline": "Merge pull request #299 from tyemirov/bugfix/B064-use-mpr-ui-auth-fix…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-19T01:01:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b579742c0ffee0eea447b1975c2614d3cf85055e",
          "body": null,
          "is_bot": false,
          "headline": "docs(issues): record B065 merge and ci success in ISSUES.md",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-19T00:43:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dcc9db9d02dd7055d6c834f8e54cd2a67376ecf1",
          "body": "…-ui-auth-fixture\n\n# Conflicts:\n#\t.mprlab/ISSUES.md",
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/master' into bugfix/B064-use-mpr…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-19T00:37:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "885729f396e9bfed2e2a2f80e094a38bfa507597",
          "body": "…te fixture\n\n- Remove direct construction of mpr-ui's private tauth.restore.v1:* storage key\n- Use public MPRUI.testing.authenticate() to seed authenticated session state\n- Mount mpr-ui on /privacy in fixture, emit full auth lifecycle, and close\n- Preserve protected asset assertions and route-specific auth state validation\n- Update browser specs and fixtures to validate new authenticated event paths",
          "is_bot": false,
          "headline": "test: replace private restore-key logic with MPRUI.testing.authentica…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-19T00:36:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9edfbc887e20ac82e08bdda9ffc4ab461eb788c6",
          "body": "bugfix/B065-make-dry-run-lifecycle",
          "is_bot": false,
          "headline": "Merge pull request #298 from tyemirov/bugfix/B065-make-dry-run-lifecycle",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-19T00:08:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "da360b42f920cb9f51e21fc9e39270f798bf3167",
          "body": "…s rejection\n\n- Test Make's touch and question flags rejection\n- Ensure -n planning mode is allowed for release, publish, and deploy\n- Update workflow validator for new Make flag handling",
          "is_bot": false,
          "headline": "test: validate planning acceptance and enforce stricter Make by-bypas…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-18T23:45:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8e059772fa51f3a4046f8b743aae56a353bc16e7",
          "body": null,
          "is_bot": false,
          "headline": "fix(makefile): allow no-execute mode for lifecycle targets",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-18T23:45:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d6ee082d40ed4218dbdeb68502b9ac3b60da2405",
          "body": "…targets",
          "is_bot": false,
          "headline": "docs(changelog): add Make dry-run planning bug fix entry for release …",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-18T23:45:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3349967b0a5de097482892c890942c501eafa2b1",
          "body": "…targets\n\n- Adds B065: lifecycle targets now support Make's standard -n/--dry-run mode\n- Documents continued rejection of ignore-errors, touch, and question modes\n- References verification and successful contract/gate testing",
          "is_bot": false,
          "headline": "docs(issues): document acceptance of Make dry-run mode for lifecycle …",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-18T23:45:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a77e08bac97965d262a7d89353f65a789d643dfa",
          "body": "fix(auth): restore sessions before protected asset checks",
          "is_bot": false,
          "headline": "Merge pull request #297 from tyemirov/bugfix/B064-protected-asset-auth",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-18T23:26:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9c0e3cd6a7ca479d775e41daed1196a2830007ed",
          "body": null,
          "is_bot": false,
          "headline": "Fix B064 protected asset authentication",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-18T22:35:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7063249dd3dd355c0c6088a92ca2391aa4c665f",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/master'",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-18T21:46:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "75871907cc7bcbc5e589a2d786d9c639935db422",
          "body": "…check\n\n- Ensure deploy resource references image variable, not latest tag\n- Tighten validation against inventory drift",
          "is_bot": false,
          "headline": "fix(validate-release-workflow): require image var in deploy resource …",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-18T21:46:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "80b108a995e44a1fd70686fc7705f7735bff77c5",
          "body": "…upport\n\n- Add runtime_assets for env and config files\n- Switch to image_variable and gateway host_group\n- Use docker-compose.yml for service definition",
          "is_bot": false,
          "headline": "chore(deploy): update loopaware-api service with assets and compose s…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-18T21:46:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "578547cecdc8febffe57b60b73f416736744d0c8",
          "body": "…recovery\n\nbugfix/B062-idempotent-release-recovery",
          "is_bot": false,
          "headline": "Merge pull request #296 from tyemirov/bugfix/B062-idempotent-release-…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-18T21:45:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "24e50a9765578d2a2250d744465e1deb3228f7fc",
          "body": null,
          "is_bot": false,
          "headline": "Fix B063 protected dashboard auth readiness",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-18T19:27:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db12b8b92b403f0142ae51ba4f5643c3d78aee28",
          "body": "…tenant\n\nI034: Declare app-owned TAuth tenant",
          "is_bot": false,
          "headline": "Merge pull request #295 from tyemirov/improvement/I034-declare-tauth-…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-18T17:34:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0569a48cfa7d2f3970a66530c8de753d822413ca",
          "body": "…mmits\n\n- Allow the release workflow to recognize and reuse a pending, canonical Release commit at HEAD that is not yet tagged\n- Ensure release-preflight, prepare_release, and repository_identity.sh handle this state robustly\n- Add validation to avoid redundant release commit creation and ensure changelog/candidate-release integrity",
          "is_bot": false,
          "headline": "fix(scripts/release): support reuse of untagged, canonical release co…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-18T16:57:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ed9df9b8f45b05a94463507ca00dc3e3beaa0f68",
          "body": null,
          "is_bot": false,
          "headline": "docs: clarify rerun behavior for untagged release commits in preflight",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-18T16:57:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "88394fade791b9b22eef74911030065d3c134c65",
          "body": null,
          "is_bot": false,
          "headline": "docs(issues): record P0 recovery workflow for untagged release commit",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-18T16:57:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03a7d671be65c38cbe42104fd331754604061497",
          "body": null,
          "is_bot": false,
          "headline": "Release v0.7.49",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-17T08:37:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4ae5abb66bfe14bdcd857d06da6e46db252bead4",
          "body": null,
          "is_bot": false,
          "headline": "feat(deploy): add tauth tenant config for loopaware authentication",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-17T08:27:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a195e898468e3fe1add118e120bca9a41548d47d",
          "body": null,
          "is_bot": false,
          "headline": "improvement(I034): declare app-owned TAuth tenant",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-17T00:27:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d51fa3c733dbd42e41c05d9f9b2b03e08748f79",
          "body": null,
          "is_bot": false,
          "headline": "Release v0.7.48",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-16T22:01:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "579107ac6f63f0c8b1cc2901f1307dfb8efc453d",
          "body": "…do-prompt\n\nfix(deploy): replace raw Ansible become prompt",
          "is_bot": false,
          "headline": "Merge pull request #294 from tyemirov/bugfix/B061-explicit-gateway-su…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-16T21:51:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d921b3572512e9ddc1f1534ee71f6d4f6430574b",
          "body": "…esolution",
          "is_bot": false,
          "headline": "test: run deploy script from fixture repository for consistent path r…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-16T21:38:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf08f3bb1aa2ca01664c5f9ab3911cbf1ebe72e7",
          "body": "…become-pass\n\n- Prompt interactively for \"Gateway sudo password:\" if credential file is unset\n- Pass credential via temp file, remove file after Ansible exits\n- Preserve LOOPAWARE_ANSIBLE_BECOME_PASSWORD_FILE contract\n- Remove raw Ansible \"BECOME password:\" prompt path from contract\n- Add test coverage for prompt, file handoff, cleanup, and no --ask-become-pass",
          "is_bot": false,
          "headline": "fix(deploy): prompt for explicit gateway sudo password; remove --ask-…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-16T21:34:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "824a2acfa43e00539286af87c0c6b73312e2a1ef",
          "body": null,
          "is_bot": false,
          "headline": "Release v0.7.47",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-16T21:10:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "84a76fa0a33f20fb564d7a9ffb56cdbc99e8f54a",
          "body": "…losure\n\ndocs(issues): close B059 and B060 after v0.7.46 publication",
          "is_bot": false,
          "headline": "Merge pull request #293 from tyemirov/maintenance/B059-B060-release-c…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-16T19:19:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "890838a2e28115f8c8b13d62d85b0bc792fa17c6",
          "body": "…e blockers\n\n- Mark B059 and B060 fixed with complete resolution, validation, and file changes\n- Add detailed outcomes for release, preflight, and provider verifications",
          "is_bot": false,
          "headline": "docs(issues): record completion notes for GHCR and Google Play releas…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-16T19:19:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8233288ea8971bee5de1f34c501aa8679e8398e",
          "body": null,
          "is_bot": false,
          "headline": "Release v0.7.46",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-16T19:06:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16ebcd72078567366ee5c02bcb98a39e8d371e98",
          "body": "…ay-release\n\nfix(android-play): replace internal track with one completed release",
          "is_bot": false,
          "headline": "Merge pull request #292 from tyemirov/bugfix/B060-single-completed-pl…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-16T18:57:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "84631a92a1eaf26f74f81b3fddd224a968468bd8",
          "body": "…release\n\n- Ensure Play track always contains exactly one completed release on update\n- Remove completed-release append behavior and post-verify single release state\n- Update docs and lifecycle contracts to reflect replacement semantics\n- Add test coverage to prevent regression",
          "is_bot": false,
          "headline": "fix(android-play): replace Play internal track with single completed …",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-16T18:44:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "41f61c26e34ad14a1dfab2a8337dd2698e0060ad",
          "body": null,
          "is_bot": false,
          "headline": "Release v0.7.45",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-16T18:28:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "46a26aed70ea466051bf9fcbc259ed37e95d95bb",
          "body": "…ontainer-push\n\nfix: push canonical platform manifest to GHCR",
          "is_bot": false,
          "headline": "Merge pull request #291 from tyemirov/bugfix/B059-platform-specific-c…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-16T18:19:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc8e93ee264ac199156fc408e7e31eee4e55003c",
          "body": "- Ensure Docker push directly publishes the deployable platform manifest\n- Update black-box and static release-contract coverage for platform push\n- Clarify documentation for GHCR authentication and manifest shape expectations",
          "is_bot": false,
          "headline": "fix: push versioned container tag with --platform linux/amd64 for GHCR",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-16T18:07:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d07b9318e2ad3a0c115207ec55503b525999df99",
          "body": null,
          "is_bot": false,
          "headline": "Release v0.7.44",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-16T17:54:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "79f8df5d9449a260c8a5b3178e6c7a355659a97d",
          "body": "…preflight\n\nfix: prove npm authority at package boundary",
          "is_bot": false,
          "headline": "Merge pull request #290 from tyemirov/bugfix/B058-package-scoped-npm-…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-16T17:45:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "80cb2fab92f7b31608d235fea35b5191ed26ff77",
          "body": "- Remove broad npm whoami and package-list identity checks from publish preflight\n- Require canonical \"npm access set status=public <pkg>\" as sole authority proof\n- Update static and black-box tests to reject broader user package listing\n- Document package-scoped preflight in README and issues",
          "is_bot": false,
          "headline": "fix: prove npm authority using package-scoped public-status write only",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-16T17:33:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d034cb8a4312e720796214f6c11669a866e1ea2",
          "body": "…ht-clean\n\nFix B057 iOS API-key preflight",
          "is_bot": false,
          "headline": "Merge pull request #289 from tyemirov/bugfix/B057-ios-api-key-preflig…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-16T17:12:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd80f9b71d9f7d25749bdda864f8e4a7b14d8b5e",
          "body": "…A with API key\n\n- Drop `altool --list-providers` and partial `--preflight-only` mode\n- Require API-key-authenticated `altool --validate-app` on prepared IPA before upload\n- Update Makefile to validate exact IPA before submit\n- Remove dead credential-only logic, fixture, and config checks\n- Update release/test scripts to reject provider-list fallback",
          "is_bot": false,
          "headline": "fix: remove unsupported iOS credential-only preflight and validate IP…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-16T16:59:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "29d720b5e895769e1eb2ea73ec46d82df28259ad",
          "body": "bugfix/B056-standard-ghcr-publish",
          "is_bot": false,
          "headline": "Merge pull request #288 from tyemirov/bugfix/B056-standard-ghcr-publish",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-16T16:09:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2ffc875088e74def6e1660297fe7c2ef4b1a008",
          "body": "…ification\n\n- Removes custom curl/python GHCR push-access probe in favor of docker login.\n- Replaces curl fixture and container_log validation in tests.\n- Simplifies preflight-only testing of registry access and error paths.",
          "is_bot": false,
          "headline": "test: remove custom GHCR preflight, use docker login in preflight ver…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-16T04:20:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1f95755fdd68c15fd2e3fb4fbd5904f2d5bc3cd",
          "body": "…lication\n\n- Describes removal of manual Registry API logic and adoption of canonical Docker login/push\n- Details requirements, validation, and fixtures for publication and preflight\n- Lists impacted files for traceability",
          "is_bot": false,
          "headline": "docs(issues): document migration to standard Docker flow for GHCR pub…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-16T04:20:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8dc0ee50ad1c22751f7dd6fa89383987214b9a62",
          "body": "…se-changelog\n\nbugfix/B055-recover-stale-release-changelog",
          "is_bot": false,
          "headline": "Merge pull request #287 from tyemirov/bugfix/B055-recover-stale-relea…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-16T00:36:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a873474a915191f1c91ea2865a98cf03415482f9",
          "body": "…rsions\n\n- Require --version for insert-changelog and enforce heading match\n- Replace all sections for selected version instead of rejecting\n- Exclude release commit subjects from generated notes\n- Add test coverage for changelog recovery scenarios\n- Update workflow validation assertions",
          "is_bot": false,
          "headline": "test(release): ensure canonical changelog recovery for unpublished ve…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-16T00:07:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a46bde4d194463cb201a6c130555aa20c9942c58",
          "body": "…ions",
          "is_bot": false,
          "headline": "docs(issues): document recovery from stale unpublished changelog sect…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-16T00:07:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "171a98a0407c18737dcb2cd7256976219bb80855",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'master' of github.com:tyemirov/loopaware",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-15T23:37:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "99313f0386ad4d8d75a1f55b7c2d1818917ce922",
          "body": "bugfix/B054-ghcr-upload-location",
          "is_bot": false,
          "headline": "Merge pull request #286 from tyemirov/bugfix/B054-ghcr-upload-location",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-15T23:37:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6f0d9881248e08806682d702caa7b63f42496328",
          "body": "…t cases\n\n- Add strict validation for GHCR upload location using Python in publish script\n- Expand preflight test to cover origin, path, plural, and query edge cases\n- Update tests and validation script for new checks and error handling",
          "is_bot": false,
          "headline": "fix(release): validate GHCR upload location using python, improve tes…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-15T23:21:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5e82610414b5480424cc4934ec4bb4f68217bce7",
          "body": null,
          "is_bot": false,
          "headline": "docs(issues): record GHCR singular upload session location support",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-15T23:21:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b5312c51dac68649bf46594c0ecf2b579b77e68c",
          "body": null,
          "is_bot": false,
          "headline": "Release v0.7.44",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-15T22:32:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d815001625fb70f5bd66eef0176d09afeef31385",
          "body": "…eploy\n\nbugfix/B040-app-owned-ansible-deploy",
          "is_bot": false,
          "headline": "Merge pull request #285 from tyemirov/bugfix/B040-app-owned-ansible-d…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-15T22:23:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "860c1f3954fd23d102d4dad1a136976b60cb9d00",
          "body": "- Update all script and test usages to reference .mprlab/deploy/ paths\n- Ensure validate-release-workflow checks for new directory structure",
          "is_bot": false,
          "headline": "refactor: move app-owned deploy ansible paths under .mprlab directory",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-15T21:31:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "96968e564ebd3e4bbcc3fab2902fa2bac56ce6a0",
          "body": "…Compose\n\n- Delete all Ansible playbooks, tasks, inventory, and config under deploy/ansible/\n- Remove deploy/docker-compose.yml\n- Update related deployment/test scripts to reflect removal",
          "is_bot": false,
          "headline": "refactor(deploy): remove legacy Ansible-based deployment scripts and …",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-15T21:31:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "900fef6440f6d8332649bdc2917fbba1074ddd6c",
          "body": "- Delete all deploy/ansible files and deploy/docker-compose.yml\n- Change configaudit compose path to .mprlab/deploy/docker-compose.yml\n- Update scripts to accommodate path and tool changes",
          "is_bot": false,
          "headline": "refactor!: remove legacy Ansible deploy scripts and update compose path",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-15T21:31:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa9b4864a6f6b42d88448503174af61d04875e7b",
          "body": null,
          "is_bot": false,
          "headline": "docs: update README for new .mprlab/deploy/ governance boundary",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-15T21:31:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8bf632c49aa45e6667566b93799bcec617609c0f",
          "body": "- Relocate deployment files from root deploy/ to .mprlab/deploy/\n- Update references and consumers to new .mprlab paths\n- Enforce rejection of root deploy/ directory in validator checks\n- Update deployment docs and issue tracker for new layout\n- No functional change to deployment process or contract",
          "is_bot": false,
          "headline": "fix(deploy): move all Compose and Ansible deployment assets to .mprlab",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-15T21:31:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "831e562adf38266cfeb4dc7ac2af96dd41a44d84",
          "body": null,
          "is_bot": false,
          "headline": "chore(gitignore): update path for ansible hosts inventory file",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-15T21:31:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "561241b2232d77ebb22c5632465f621269048efd",
          "body": "…tracts\n\n- Introduce ansible playbooks and tasks for validation, preflight, deploy, and verify\n- Add example inventory and ansible config for gateway deployment\n- Provide production docker-compose.yml for remote container management",
          "is_bot": false,
          "headline": "feat(deploy): add Ansible-based deployment and production Compose con…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-15T21:17:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3741cfadc9b3c48482f2c9ce63d587b03edad316",
          "body": null,
          "is_bot": false,
          "headline": "test: add health endpoint test and proxy config for /healthz",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-15T21:17:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56f985921c52af20ec5a355d00dbb010c11acd71",
          "body": "…ible\n\n- Remove gateway integration and Makefile contracts from deploy workflow\n- Add app-owned Ansible deploy script and contract validation\n- Update dry-run/test harness for new Ansible-based deployment\n- Simplify environment and preflight checks for new backend path",
          "is_bot": false,
          "headline": "refactor(deploy): switch backend deploy from gateway to app-owned Ans…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-15T21:17:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d570a93f8fa9da1b2b8db89b873ca6851245d8a9",
          "body": null,
          "is_bot": false,
          "headline": "fix(config): add /healthz proxy to GHTTP_SERVE_PROXIES examples",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-15T21:17:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8e63ca8ddf9d623ca1c461b74c3575ef148c2db1",
          "body": "- Registers GET /healthz endpoint returning status: ok\n- Updates configaudit with deploy/docker-compose.yml as default compose path",
          "is_bot": false,
          "headline": "feat(server): add /healthz route for health checks",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-15T21:17:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1a3fd3e0cced55bb3256e92459d0552180417f8",
          "body": "… checks\n\n- Describe new deploy-dry-run requirements, preflight, and Ansible usage\n- Remove MPR gateway execution/dependency details from deployment steps\n- Update verification and post-deploy instructions for LoopAware-owned workflows",
          "is_bot": false,
          "headline": "docs: update README to clarify deployment workflow and remove gateway…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-15T21:17:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "afd9863c2d90612071ee73bf1a068cf944411dad",
          "body": null,
          "is_bot": false,
          "headline": "chore(makefile): remove unused GATEWAY_DIR variable and overrides",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-15T21:17:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bb86524b255240a790959f7a38f691f259ee600b",
          "body": "- Mark deployment readiness issue as complete with updated solution/resolution\n- Document transition to LoopAware-owned Ansible task bundle and new production flow\n- Add `ansible_task_bundle` resource to deployment descriptor\n- Update production Compose project and health check path for `loopaware-api`",
          "is_bot": false,
          "headline": "docs(deploy): update deployment design for app-owned Ansible controller",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-15T21:17:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "76f30ed9e2ea2cc320cba935d2938e794d5f1996",
          "body": null,
          "is_bot": false,
          "headline": "chore(gitignore): add ansible hosts inventory file to ignore list",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-15T21:17:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2aca6c8dd72aacc61f8ffbaddd2780348d60e613",
          "body": "… tests\n\n- Accept Bearer authentication parameters in any order with optional whitespace\n- Reject malformed, missing, duplicate, or unknown challenge parameters\n- Add black-box and static validation for all new challenge handling paths\n- Exclude aborted release commit and changelog from branch history",
          "is_bot": false,
          "headline": "fix: robustly parse GHCR Bearer challenges by parameter, add contract…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-14T04:15:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e8c2f823a6f894786ba34b05b276abc0f56379ac",
          "body": "…-and-ghcr-preflight\n\nbugfix/B051-fix-release-package-and-ghcr-preflight",
          "is_bot": false,
          "headline": "Merge pull request #284 from tyemirov/bugfix/B051-fix-release-package…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-14T03:54:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4bb79bc0a2c98150d3859d495e17e632cea11850",
          "body": "- Explicitly check upload location prefix in GHCR preflight\n- Log all intermediate GHCR token requests for testing\n- Simulate challenge and upload location failures in tests\n- Add missing test coverage for unexpected challenge/location/cleanup responses",
          "is_bot": false,
          "headline": "fix: harden GHCR token preflight, test challenge and cleanup errors",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-13T22:34:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd9c7cc6ac4ee11f60b928ed95ea4cfa2032f2e5",
          "body": "…ive artifact",
          "is_bot": false,
          "headline": "fix(makefile): run npm commands in extracted source dir for react-nat…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-13T22:34:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "41cd2a3724dbe11007b33e494f4f0d38b98616b0",
          "body": "…ning\n\n- Add [B051] false-success fix for React Native artifact builds, contract tests, and validation steps\n- Add [B052] GHCR Bearer challenge handling in publish preflight, contract checks, and validation",
          "is_bot": false,
          "headline": "docs(issues): document React Native artifact and GHCR preflight harde…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-13T22:34:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04d73be5c0c8a6ff9af39f31753e6445fac54a3e",
          "body": null,
          "is_bot": false,
          "headline": "Release v0.7.44",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-13T21:03:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78737b99ef313474f8a6d213285627845db6fd4e",
          "body": "…gation-race\n\nFix B049 dashboard auth navigation race",
          "is_bot": false,
          "headline": "Merge pull request #282 from tyemirov/bugfix/B049-dashboard-auth-navi…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-13T20:54:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "673c05666d7afbe4d30f7913a6127e01e11a4532",
          "body": "…e-release-state\n\nFix B050 transactional remote release state",
          "is_bot": false,
          "headline": "Merge pull request #283 from tyemirov/bugfix/B050-transactional-remot…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-13T20:54:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d802fa671cbf181d9e7173939406632f339f380",
          "body": "…it push\n\n- Discard stale local tags; keep only pending exact release above remote default\n- Force-fetch stable tags from origin before release validation\n- Push branch and tag in a single atomic transaction to prevent partial publish\n- Remove orphaned v0.7.44 CHANGELOG entry and update documentation/contracts\n- Add contract coverage proving atomicity for release publication",
          "is_bot": false,
          "headline": "fix(release): make remote tags authoritative and publish via atomic g…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-13T04:45:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "275e8aa3e4e36bf373d631a88df5ea062b49ce53",
          "body": null,
          "is_bot": false,
          "headline": "Fix B049 dashboard auth navigation race",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-12T23:05:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7280dffa0b4191bdd249ab1ff3b1adc3323419e0",
          "body": null,
          "is_bot": false,
          "headline": "Release v0.7.44",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-12T22:18:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cac91a268ac7fa2e18b85dfe4309fefd0c37a241",
          "body": "…ation-index\n\nFix B048 latest attestation publish preflight",
          "is_bot": false,
          "headline": "Merge pull request #281 from tyemirov/bugfix/B048-allow-latest-attest…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-12T22:17:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d30d12a1fd3285c67d5631cb21abf7b0d0b1c78",
          "body": null,
          "is_bot": false,
          "headline": "Fix B048 latest attestation publish preflight",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-12T20:44:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "80bc52e5005cb7d01aa89bd1a547dbf25ac47943",
          "body": "…mage-id\n\nFix B047 container archive image identity",
          "is_bot": false,
          "headline": "Merge pull request #280 from tyemirov/bugfix/B047-container-archive-i…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-12T19:29:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8149a7fa59893ba1ef471237dc577679cb1544f4",
          "body": null,
          "is_bot": false,
          "headline": "Fix B047 container archive image identity",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-12T18:21:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ed84e434f14baa8183396ff65c53cc8e9d9debd1",
          "body": "…t-failure\n\nbugfix/B046-ios-release-artifact-failure",
          "is_bot": false,
          "headline": "Merge pull request #279 from tyemirov/bugfix/B046-ios-release-artifac…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-12T17:35:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ea08bde4c83dd025ddee8037acce5a7d6b85581",
          "body": null,
          "is_bot": false,
          "headline": "feat(web): add site analytics pixel to all main HTML pages",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-12T17:18:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c3085dd49bfd7797058b9d4414952ea1b0bd7206",
          "body": "…ipts",
          "is_bot": false,
          "headline": "fix(mobile): ensure versioning type consistency in publish/submit scr…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-12T17:18:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c25305e9f2f272c4513a5a770e50e65bd2f7cb09",
          "body": "…tion\n\n- Mark [I033] as complete in .mprlab/ISSUES.md\n- Add resolution summary and changed files listing for reference",
          "is_bot": false,
          "headline": "docs: mark traffic pixel embed issue as resolved with detailed resolu…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-12T17:18:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "034ff74f60f30573820bd19db71ac66c4c28f2fd",
          "body": "…rder\n\n- Add fail-fast test fixture for iOS and Android build step order\n- Validate iOS builder fails before Android is invoked in release workflow\n- Assert build script and package dependencies for locked pod-install usage",
          "is_bot": false,
          "headline": "test: verify mobile artifact builders fail fast in iOS then Android o…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-12T03:40:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "52243a47e354e01910c72e4baef2dafc625d7372",
          "body": "…tion\n\n- Add pod-install@1.1.0 to devDependencies and package-lock\n- Update iOS archive script to install dev deps and use locked tools\n- Strengthen config validation for pod-install and subprocess stdio",
          "is_bot": false,
          "headline": "fix(mobile): lock pod-install as dev dep and enforce in config valida…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-12T03:40:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0f56820fff3b4fad4011a4b1fd70a7f96c0cec31",
          "body": null,
          "is_bot": false,
          "headline": "fix(makefile): ensure mobile-release-artifacts exits on command failure",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-12T03:40:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1dc51d806ec00c8f0f3a420990a42465109f9091",
          "body": null,
          "is_bot": false,
          "headline": "docs(issues): add [B046] surface iOS archive failures at failing builder",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-12T03:40:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "897a7f9d39cd7dfa5fd24be4797d2ac78bc0f22e",
          "body": "…-awk\n\nbugfix/B045-portable-remote-tag-awk",
          "is_bot": false,
          "headline": "Merge pull request #278 from tyemirov/bugfix/B045-portable-remote-tag…",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-11T23:10:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "74595bd53dc6ea3a70d405e33ec7fe779a943243",
          "body": "- Add workflow job extraction and stricter macOS release toolchain checks\n- Push annotated tag in test-lifecycle-orchestration.sh setup\n- Minor awk fallback semantics improvement in repository_identify.sh",
          "is_bot": false,
          "headline": "test: improve macOS release contract validation and fixture setup",
          "author_name": "Vadym Tyemirov",
          "author_login": "tyemirov",
          "committed_at": "2026-07-11T22:53:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 56,
      "commits_last_year": 1254,
      "latest_release_at": "2026-07-19T17:14:47Z",
      "latest_release_tag": "v0.7.51",
      "releases_from_tags": false,
      "days_since_last_push": 6,
      "active_weeks_last_year": 38,
      "days_since_latest_release": 6,
      "mean_days_between_releases": 1
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 57,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/MarkoPoloResearchLab/loopaware",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": false,
          "registry_url": "https://pkg.go.dev/github.com/MarkoPoloResearchLab/loopaware",
          "is_deprecated": false,
          "latest_version": "v0.7.51",
          "repository_url": "https://github.com/MarkoPoloResearchLab/loopaware",
          "versions_count": 70,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-19T17:13:12Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        },
        {
          "name": "@loopaware/react-native",
          "exists": true,
          "license": "SEE LICENSE IN LICENSE",
          "keywords": [
            "loopaware",
            "feedback",
            "react-native",
            "expo"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@loopaware/react-native",
          "is_deprecated": false,
          "latest_version": "0.1.0",
          "repository_url": "https://github.com/tyemirov/loopaware",
          "versions_count": 1,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 79,
          "first_published_at": "2026-07-11T06:11:56.865000Z",
          "latest_published_at": "2026-07-11T06:11:57.116000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 14
        }
      ]
    },
    "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": true,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "clients/react-native/tsconfig.json",
        "mobile/tsconfig.json",
        "tests/tsconfig.json"
      ],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 125772,
      "source_files_sampled": 198,
      "oversized_source_files": 2,
      "agent_instruction_files": [
        "AGENTS.md",
        "mobile/AGENTS.md"
      ],
      "agent_instruction_max_bytes": 7885
    },
    "dependencies": {
      "manifests": [
        "go.mod",
        "mobile/package.json",
        "tests/package.json"
      ],
      "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",
        "npm"
      ],
      "dependencies": [
        {
          "name": "github.com/gin-contrib/cors",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.7.6"
        },
        {
          "name": "github.com/gin-gonic/gin",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.11.0"
        },
        {
          "name": "github.com/glebarez/sqlite",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.11.0"
        },
        {
          "name": "github.com/golang-jwt/jwt/v5",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v5.3.0"
        },
        {
          "name": "github.com/google/uuid",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.2"
        },
        {
          "name": "github.com/stretchr/testify",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.11.1"
        },
        {
          "name": "github.com/tyemirov/tauth",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.9.8"
        },
        {
          "name": "github.com/tyemirov/utils",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.17.0"
        },
        {
          "name": "go.uber.org/zap",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.27.1"
        },
        {
          "name": "golang.org/x/net",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.52.0"
        },
        {
          "name": "google.golang.org/grpc",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.78.0"
        },
        {
          "name": "google.golang.org/protobuf",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.36.11"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        },
        {
          "name": "gorm.io/gorm",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.31.1"
        },
        {
          "name": "expo",
          "manifest": "mobile/package.json",
          "ecosystem": "npm",
          "version_constraint": "~56.0.12"
        },
        {
          "name": "expo-auth-session",
          "manifest": "mobile/package.json",
          "ecosystem": "npm",
          "version_constraint": "~56.0.14"
        },
        {
          "name": "expo-constants",
          "manifest": "mobile/package.json",
          "ecosystem": "npm",
          "version_constraint": "~56.0.18"
        },
        {
          "name": "expo-crypto",
          "manifest": "mobile/package.json",
          "ecosystem": "npm",
          "version_constraint": "~56.0.4"
        },
        {
          "name": "expo-dev-client",
          "manifest": "mobile/package.json",
          "ecosystem": "npm",
          "version_constraint": "~56.0.20"
        },
        {
          "name": "expo-secure-store",
          "manifest": "mobile/package.json",
          "ecosystem": "npm",
          "version_constraint": "~56.0.4"
        },
        {
          "name": "expo-status-bar",
          "manifest": "mobile/package.json",
          "ecosystem": "npm",
          "version_constraint": "~56.0.4"
        },
        {
          "name": "expo-system-ui",
          "manifest": "mobile/package.json",
          "ecosystem": "npm",
          "version_constraint": "~56.0.5"
        },
        {
          "name": "expo-web-browser",
          "manifest": "mobile/package.json",
          "ecosystem": "npm",
          "version_constraint": "~56.0.5"
        },
        {
          "name": "react",
          "manifest": "mobile/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "react-native",
          "manifest": "mobile/package.json",
          "ecosystem": "npm",
          "version_constraint": "0.85.3"
        },
        {
          "name": "react-native-safe-area-context",
          "manifest": "mobile/package.json",
          "ecosystem": "npm",
          "version_constraint": "~5.7.0"
        }
      ],
      "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": 271,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 30
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "tyemirov",
          "commits": 1172,
          "avatar_url": "https://avatars.githubusercontent.com/u/1078274?v=4"
        },
        {
          "type": "User",
          "login": "temirov",
          "commits": 64,
          "avatar_url": "https://avatars.githubusercontent.com/u/243108869?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.948
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum",
        "package-lock.json"
      ],
      "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": 8,
            "reason": "6 out of 7 merged PRs checked by a CI test -- score normalized to 8",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/15 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 9,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "32 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "e3c087668113b7043afbe26b2c27afddb8ef7bc5",
        "ran_at": "2026-07-25T19:46:57Z",
        "aggregate_score": 3,
        "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-19T17:14:46Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-19T17:03:29Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/tyemirov/loopaware",
    "host": "github.com",
    "name": "loopaware",
    "owner": "tyemirov"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 57,
      "inputs": {
        "security": 30,
        "vitality": 90,
        "community": 31,
        "governance": 50,
        "engineering": 74
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 90,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "commits_last_year": 1254,
              "human_commit_share": 1,
              "days_since_last_push": 6,
              "active_weeks_last_year": 38
            },
            "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": "38/52 weeks with commits",
                "points": 26.3,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 38
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "1254 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 1254
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 56,
              "latest_release_tag": "v0.7.51",
              "releases_from_tags": false,
              "days_since_latest_release": 6,
              "mean_days_between_releases": 1
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "56 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 56
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~1 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 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": "at_risk",
        "name": "Community & Adoption",
        "value": 31,
        "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": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file present, not a recognized license",
                "points": 16.9,
                "status": "partial",
                "details": [
                  {
                    "code": "license_custom",
                    "params": {}
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "at_risk",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 32,
            "inputs": {
              "packages": [
                "@loopaware/react-native"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 79
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "79 downloads/month across npm",
                "points": 25.4,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 79,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 50,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 16,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.948
            },
            "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.2,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 95
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "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": 65,
            "inputs": {
              "merged_prs": 271,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 30
            },
            "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": "271/301 decided PRs merged",
                "points": 34.4,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 271,
                      "decided": 301
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/15 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 50,
            "inputs": {
              "followers": 5,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "tyemirov",
              "public_repos": 50,
              "account_age_days": 5417
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "5 followers of tyemirov",
                "points": 5.6,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 5,
                      "login": "tyemirov"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "50 public repos, account ~14 yr old",
                "points": 24.4,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 50
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 14
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "good",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "packages": [
                "@loopaware/react-native"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 14
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 14 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 14
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "1 published versions",
                "points": 4,
                "status": "partial",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 74,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "1 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "6 out of 7 merged PRs checked by a CI test -- score normalized to 8",
                "points": 16,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [
                "feedback",
                "feedback-form",
                "website"
              ],
              "has_wiki": false,
              "homepage": "https://loopaware.mprlab.com",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://loopaware.mprlab.com",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "3 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 30,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 30,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 3
            },
            "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": "6 out of 7 merged PRs checked by a CI test -- score normalized to 8",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/15 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "32 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": 2
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 76,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.8,
              "agent_instruction_files": [
                "AGENTS.md",
                "mobile/AGENTS.md"
              ],
              "agent_instruction_max_bytes": 7885
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, mobile/AGENTS.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, mobile/AGENTS.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "80 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 80,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 61,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum",
                "package-lock.json"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "clients/react-native/tsconfig.json",
                "mobile/tsconfig.json",
                "tests/tsconfig.json"
              ],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "clients/react-native/tsconfig.json, mobile/tsconfig.json, tests/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "clients/react-native/tsconfig.json, mobile/tsconfig.json, tests/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 125772,
              "source_files_sampled": 198,
              "oversized_source_files": 2
            },
            "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": "2/198 source files over 60KB",
                "points": 54.4,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 198,
                      "oversized": 2
                    }
                  }
                ],
                "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": [
    "go package 'github.com/MarkoPoloResearchLab/loopaware' points at a different repository (https://github.com/MarkoPoloResearchLab/loopaware); excluded from ecosystem scoring",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-25T19:47:09.529455Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/t/tyemirov/loopaware.svg",
  "full_name": "tyemirov/loopaware",
  "license_state": "custom",
  "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, npm.