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

opengeos / cog-tiler-wasm

Serverless Cloud Optimized GeoTIFF (COG) dynamic tiling in WebAssembly. TiTiler-style XYZ tiles, no backend, built on whitebox-wasm.

Rust · JavaScriptMIT★ 8 estrellas⑂ 0 forksdesde jun 2026Ver en GitHub ↗

opengeos/cog-tiler-wasm tiene un índice de salud de 54 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Engineering Quality (71/100) y la más baja, Community & Adoption (31/100). Se actualizó por última vez hace 6 días. Una sola persona concentra la mayor parte del trabajo reciente.

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

54
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

3836 seguidores168 repositorios públicosdesde abr 2023

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

Métricas por categoría

Vitalidad

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

67Moderado · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 6 días
2.8/36Cadencia de commits — 4/52 semanas con commits
12.9/18Volumen de commits — 26 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year26
human_commit_share1
days_since_last_push6
active_weeks_last_year4
Cómo se puntúa
27/27Publica versiones — 9 versiones publicadas
36/36Recencia de las versiones — última versión hace 6 días
27/27Cadencia de publicación — una versión cada ~4 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count9
latest_release_tagv0.3.1
releases_from_tagsno
days_since_latest_release6
mean_days_between_releases4

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
13.7/60Estrellas — 8 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars8
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sostenibilidad y Gobernanza

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

56Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
10/10OpenSSF Scorecard: Contributors — project has 5 contributing companies or organizations
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
38.2/38.3Aceptación de PR — 22/22 PR decididos fusionados
4.5/15OpenSSF Scorecard: Code-Review — Found 9/26 approved changesets -- score normalized to 3
Datos de entrada utilizados
merged_prs22
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues. Los pesos restantes se han renormalizado.
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
25/25Alcance del propietario — 3836 seguidores de opengeos
19.6/25Trayectoria — 168 repos públicos, cuenta de ~3 años
Datos de entrada utilizados
followers3836
owner_typeOrganization
is_verified
owner_loginopengeos
public_repos168
account_age_days1208

Calidad de Ingeniería

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

71Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 3 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 22 out of 22 merged PRs checked by a CI test -- score normalized to 10
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Cómo se puntúa
30/30README
0/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — http://opengeos.org/cog-tiler-wasm
10/10Descripción del repositorio
10/10Topics — 5 topics
10/10Wiki
Datos de entrada utilizados
topicsdata-science, geospatial, raster, wasm, whiteboxtools
has_wiki
homepagehttp://opengeos.org/cog-tiler-wasm
has_readme
has_docs_dirno
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?

38En 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.5/2.5CI-Tests — 22 out of 22 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
2.2/7.5Code-Review — Found 9/26 approved changesets -- score normalized to 3
2.5/2.5Contributors — project has 5 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
5/5Packaging — packaging workflow detected
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
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate3,8

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.

55Moderado · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 26 de 26 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
12.6/18Arranque con un solo comando — Cargo.toml, crates/cog-tiler-wasm/Cargo.toml (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — Rust (tipado estático)
10/10Entorno reproducible — lockfile
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 26
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
lockfilesCargo.lock
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0
toolchain_manifestsCargo.toml, crates/cog-tiler-wasm/Cargo.toml
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Rust (tipado estático)
50/55Tamaños de archivo manejables — 1/11 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageRust
largest_source_bytes61.905
source_files_sampled11
oversized_source_files1
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

8estrellas de GitHub
1contribuidores
26commits en los últimos 12 meses
6días desde el último push
9versiones publicadas
1factor bus
0issues abiertas
crates.io, npmecosistemas de paquetes

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • Could not fetch crates package 'cog-tiler-wasm' from its registry
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Más detalle

OpenSSF Scorecard 3.8 / 10
3.8agregado

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 21:25 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests22 out of 22 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
3Code-ReviewFound 9/26 approved changesets -- score normalized to 3
10Contributorsproject has 5 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
10Packagingpackaging workflow detected
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
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 4
RegistroPaqueteRestricción de versiónManifiesto
crates.iowasm-bindgen0.2crates/cog-tiler-wasm/Cargo.toml
crates.ioserde1crates/cog-tiler-wasm/Cargo.toml
crates.ioserde_json1crates/cog-tiler-wasm/Cargo.toml
crates.ioserde-wasm-bindgen0.6crates/cog-tiler-wasm/Cargo.toml
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": [
        "data-science",
        "geospatial",
        "raster",
        "wasm",
        "whiteboxtools"
      ],
      "is_fork": false,
      "size_kb": 349,
      "has_wiki": true,
      "homepage": "http://opengeos.org/cog-tiler-wasm",
      "languages": {
        "Rust": 82183,
        "JavaScript": 56515
      },
      "pushed_at": "2026-07-19T21:08:40Z",
      "created_at": "2026-06-17T20:46:13Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-24T07:09:05Z",
      "description": "Serverless Cloud Optimized GeoTIFF (COG) dynamic tiling in WebAssembly. TiTiler-style XYZ tiles, no backend, built on whitebox-wasm.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Rust",
      "significant_languages": [
        "Rust",
        "JavaScript"
      ]
    },
    "owner": {
      "blog": "https://opengeos.org",
      "name": "Open Geospatial Solutions",
      "type": "Organization",
      "login": "opengeos",
      "company": null,
      "location": "United States of America",
      "followers": 3836,
      "avatar_url": "https://avatars.githubusercontent.com/u/129896036?v=4",
      "created_at": "2023-04-04T19:02:44Z",
      "is_verified": null,
      "public_repos": 168,
      "account_age_days": 1208
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2026-07-19T21:09:29Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-07-19T17:35:53Z"
        },
        {
          "tag": "v0.2.6",
          "kind": "patch",
          "published_at": "2026-07-17T01:44:01Z"
        },
        {
          "tag": "v0.2.5",
          "kind": "patch",
          "published_at": "2026-07-12T04:49:29Z"
        },
        {
          "tag": "v0.2.4",
          "kind": "patch",
          "published_at": "2026-06-20T17:13:37Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2026-06-18T16:31:42Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-06-18T16:04:31Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-06-18T04:14:59Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-06-18T03:01:48Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "770519f47692fd63a2de9a8a90a892b8998963b9",
          "body": "Fixes a coloured border drawn around every nodata boundary. Both bilinear\nsamplers interpolated raw pixels and only then tested the result against\nthe nodata sentinel, so a pixel beside nodata blended toward it, matched\nneither the sentinel nor NaN, and clamped to the bottom of the rescale\nwindow -- a blue ring under 'jet' tracing coastlines and swath edges.\n\nPatch rather than minor: no API change. The JS sampler moved to its own\nmodule for testability, but the package's exports are unchanged.",
          "is_bot": false,
          "headline": "chore(release): cog-tiler-wasm 0.3.1",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-07-19T21:08:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cfbba7cc1944d207c6df2b46b2e07e10751a5f86",
          "body": "* fix: mask nodata before bilinear interpolation, not after\n\nInterpolating across a nodata boundary blends the sentinel into the\nvalue. The blend equals neither the sentinel nor NaN, so the equality\ntest applied to the *result* cannot recognise it. With the GDAL\nconvention of a large negative sentin\n[…]\neighbour falls back to nearest and holds the anchor's\nown valid value, matching the JS sampler, which already behaved this way\nfor its NaN neighbours. Thanks @coderabbitai for catching the divergence.",
          "is_bot": false,
          "headline": "fix: mask nodata before bilinear interpolation, not after (#23)",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-07-19T21:06:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6af393a29ec60d9ffd18e48e0e3f3f45f82a7cb5",
          "body": "Ships the full 107-colormap set generated from the colormap sprite, up from 13\nhand-written ramps, for about 8.5 KB more wasm. Minor rather than patch: the\naddition is backward compatible, but consumers that mirrored the old short list\ncan now read the real set from colormaps().",
          "is_bot": false,
          "headline": "chore(release): cog-tiler-wasm 0.3.0",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-07-19T17:34:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab41dc70947af64c7d153167c8f6fc3625164e4e",
          "body": "The tiler knew 13 hand-written colormaps, so a renderer offering the full\nsprite had to narrow its picker, and the shared ramps only approximated the\nsprite (the 9-stop viridis was off by up to 19/255 on a channel).\n\nA generator now derives colormap.rs from the sprite itself, reducing each row\nto the fewest anchor stops that reproduce it within 2/255. That is +8.5 KB of\nwasm for 94 more colormaps, and the ramps match the GPU renderer by\nconstruction rather than by hand.",
          "is_bot": false,
          "headline": "feat(colormap): generate all 107 ramps from the colormap sprite (#22)",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-07-19T17:34:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1ed3774ed0a01d143e1bc81e5c2fa7d176b8247d",
          "body": "Require whitebox-wasm ^0.4.1, which fixes decoding of COGs written with a\nTIFF horizontal/floating-point predictor (PREDICTOR=2/3) such as NAIP tiles\n(opengeos/whitebox-wasm#6).",
          "is_bot": false,
          "headline": "chore(release): cog-tiler-wasm 0.2.6",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-07-17T01:43:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d6549149a8d068d380d5a14531dd3f5f10097649",
          "body": "…(#21)\n\nnpm@latest is now npm 12, which requires Node >= 22; the pinned Node 20\nmade 'npm install -g npm@latest' fail with EBADENGINE and broke the\nv0.2.5 publish.",
          "is_bot": false,
          "headline": "ci(release): use Node 24 so the npm Trusted Publishing upgrade works …",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-07-12T04:47:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f4c3d6df23a2756a7df016d4a44d800de2b76d7e",
          "body": "makeReader slurped local File sources whole with blob.arrayBuffer(),\nwhich throws NotReadableError in Chromium for multi-GB rasters (e.g.\nthe 7 GB GEBCO 2026 GeoTIFF) - and the bytes could never fit in the\nwasm heap anyway. Only the header prefix and the requested tiles are\never needed, so give Blob\n[…]\nmemory\npath unchanged.\n\nVerified in a real browser via the maplibre-gl-raster example app: the\n7 GB gebco_2026.tif opens, renders the global extent, and serves tiles\nacross zoom levels with no errors.",
          "is_bot": false,
          "headline": "fix(reader): read Blob/File sources via ranged slices; 0.2.5 (#20)",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-07-12T04:45:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2f12f5910e3a91437b7214416de1c3ebe0e8f646",
          "body": "… 0.2.4 (#19)\n\ngeotiff-geokeys-to-proj4 cannot express a projection without a\nProjCoordTransGeoKey (e.g. ESRI world projections such as Mollweide /\nESRI:54009, which ArcGIS writes only as an `ESRI PE String = PROJCS[...]`\nWKT with a user-defined model type). It silently falls back to the bare\ngeogra\n[…]\nut a projected WKT is\npresent in PCSCitationGeoKey / GTCitationGeoKey, use that WKT instead;\nproj4 parses ESRI/OGC WKT directly. Also label such sources by their WKT\nCRS name rather than \"custom CRS\".",
          "is_bot": false,
          "headline": "fix(crs): warp projected COGs whose CRS is only in an ESRI PE string;…",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-20T17:12:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "69444e04dce17a6ad420cd22ddbd6414d52e7989",
          "body": "…ed API; 0.2.3 (#18)\n\ngeotiff v3 defers fileDirectory fields (large arrays like ColorMap are not\nactualized eagerly), so the v2-style direct reads `img.fileDirectory.ColorMap`\nand `img.fileDirectory.PlanarConfiguration` returned undefined. With ColorMap\nlost, paletted (categorical) COGs such as NLCD\n[…]\ntection).\n\nVerified against the NLCD COG on geotiff@3: the loaded ColorMap yields the\nofficial legend colors (water (70,107,159), evergreen forest (28,95,44),\ncrops (171,108,40), developed (235,0,0)).",
          "is_bot": false,
          "headline": "fix(geotiff): read ColorMap/PlanarConfiguration via geotiff v3 deferr…",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-18T16:30:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4adf90dba2f66fd526d398fa20ecba81934b80b0",
          "body": "The geotiff peer was pinned to ^2.1.0, which blocked consumers on\ngeotiff@3 (e.g. GeoLibre) from installing without --legacy-peer-deps.\nOnly the stable high-level geotiff API (fromUrl, fromArrayBuffer,\ngetImage, getGeoKeys, readRasters) is used, and it is unchanged across\nthe v3 major, so widen the \n[…]\nps to geotiff@3.0.5 to exercise v3.\n\nThe other peers (whitebox-wasm ^0.4.0, proj4 ^2.15.0,\ngeotiff-geokeys-to-proj4 ^2024.4.13) already satisfy current consumer\nversions, so no change is needed there.",
          "is_bot": false,
          "headline": "fix(deps): accept geotiff v3 in peer range; bump to 0.2.2 (#17)",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-18T16:03:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "506a804b7a18c52e13c7c6bd1688a599ecb9e363",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): bump version to 0.2.1 (#16)",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-18T04:13:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "acfa2f323c65f287fc968af22d460df34d51c467",
          "body": "Expose the existing `bidx` render param in the demo panel: a \"bands\" input\n(comma-separated 1-based indices; empty = auto). One band renders through the\ncolormap, three render as an RGB composite; changing it live re-renders.\n\nVerified in a browser with NAIP (4-band, EPSG:26911): default auto -> natural\ncolor RGB; \"1\" -> single band through gray; band order honored ([1,2,3] vs\n[3,2,1] swaps R/B).",
          "is_bot": false,
          "headline": "feat(demo): band selector (bidx) for visualization (#15)",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-18T04:08:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7804c48f4c2e4854f2464b7d20afe943aa924aa7",
          "body": "…#14)\n\nPlanar COGs (e.g. the Landsat 1984.tif composite, 3 Byte bands) rendered as\nstriped garbage: whitebox-wasm's streaming decoder is chunky-only - its\ntile_range only addresses band 0's plane and decode_tile_f64 returns a single\nband's tile, so multi-band striding read the wrong layout.\n\nRead pl\n[…]\n4.tif now renders as a clean RGB composite (river +\nforest, no stripes), preview is 100% colorful, point returns [38,83,11] for 3\nbands; single-band dem and paletted NLCD are unaffected (chunky path).",
          "is_bot": false,
          "headline": "fix: render planar (INTERLEAVE=BAND) multi-band COGs via geotiff.js (…",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-18T03:51:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bcdd5dc90cb60251c59310a718724158f769a81b",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): bump version to 0.2.0 (#13)",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-18T03:00:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fae2c430ab7316030131418f63955d99e76f25c0",
          "body": "…y (#12)\n\n* feat: render curve (linear/sqrt/log), gamma, reverse colormap, opacity\n\nAdd the remaining render controls so cog-tiler-wasm can drive the same panel as\nGPU raster viewers (e.g. maplibre-gl-raster) - band/rescale/colormap were\nalready there; this adds the rest with matching math (pipeline\n[…]\nped (not\n  skipped by JS falsiness), and transferCurve uses |gamma-1|>1e-9; opacity is\n  clamped to [0,1] with a finite check.\n- demo: add explicit <label for> for the gamma and opacity inputs (a11y).",
          "is_bot": false,
          "headline": "feat: render curve (linear/sqrt/log), gamma, reverse colormap, opacit…",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-18T02:53:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6f6526437d07642683b8f513b4244bf997d4c05b",
          "body": "…#11)\n\n* feat: TiTiler-style rendering API - bidx/RGB, 13 colormaps, preview, bbox\n\nUnify tile/image rendering on one extent renderer and add the image-generation\n+ band-selection parts of the TiTiler COG API.\n\n- Rust: add `colorize(grid, w, h, ...)` (1:1 colormap at any output size, the\n  arbitrary\n[…]\nrs before they reach\n  typed-array/canvas constructors.\n- demo: build the colormap <select> with DOM nodes instead of innerHTML.\n- cog-tiler.d.ts: update the rgbaToPng doc for the width/height params.",
          "is_bot": false,
          "headline": "feat: TiTiler rendering API - bidx/RGB, 13 colormaps, preview, bbox (…",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-18T02:21:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "114672185807241627fe19b44cbf2b739c69fa0a",
          "body": "…atistics) (#10)\n\nAdd client-side equivalents of TiTiler's COG read endpoints as CogSource\nmethods. All additive (no change to the render path); they work on projected /\npaletted sources too via the existing warp path.\n\n- info() / infoGeoJSON(): bounds, count, dtype, nodata, overviews, tile size,\n  \n[…]\noat64, stats\nmin/max ~61/1524; point profiles vary correctly across the sample dome; NLCD\n(warp) point at (-100,40) returns class 82 = Cultivated Crops; click-to-point\nshows ~155 m at an Oregon pixel.",
          "is_bot": false,
          "headline": "feat: TiTiler-style read API (info, info.geojson, tilejson, point, st…",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-18T01:18:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "46149c04eb29c36a02334de80caaca5973f53f84",
          "body": "* feat: open local rasters (File/Blob/bytes), not just URLs\n\nLet the tiler visualize a local COG with no server.\n\n- cog-tiler.js: openCog() now accepts a URL string OR in-memory bytes (File,\n  Blob, ArrayBuffer, Uint8Array). A `makeReader` abstraction provides the byte\n  reader - HTTP range for URLs\n[…]\nComponent against malformed %-escapes (400);\n  validate root containment with path.relative instead of startsWith (blocks\n  sibling-dir traversal); return 416 for out-of-bounds / inverted byte ranges.",
          "is_bot": false,
          "headline": "feat: open local rasters + npm run dev for local testing (#9)",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-18T00:58:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7999d6e69bb0f97b44d81116ead83d4357d531e4",
          "body": "… (#8)\n\nPrefill the demo with https://data.source.coop/giswqs/opengeos/dem.tif (a real\nEPSG:3857 DEM served with HTTP range + CORS) and bump the rescale max to 1600 to\nsuit its ~60-1565 m elevation range. Demonstrates remote COG streaming on first\nvisit. Verified in a browser: auto-loads and renders (EPSG:3857, 3 levels).",
          "is_bot": false,
          "headline": "chore(demo): use the remote source.coop dem.tif as the default sample…",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-18T00:23:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16f5c5a847bc16062065b2aadb15e9a15f722197",
          "body": "…e toggle (#7)\n\n* feat: ship cog-tiler.js in the npm package; MIT-only; demo globe toggle\n\nMake the reusable module a first-class part of the published package instead of\na demo-only file, relicense to MIT, and add a 3D globe toggle to the demo.\n\n- Move cog-tiler.js to the repo root (canonical packa\n[…]\nushes.\n- cog-tiler.d.ts: widen renderTileRGBA's return to\n  `Uint8Array | Uint8ClampedArray | null` (continuous tiles return the wasm\n  render() Uint8Array; paletted tiles return a Uint8ClampedArray).",
          "is_bot": false,
          "headline": "feat: publish cog-tiler.js in the npm package; MIT license; demo glob…",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-18T00:18:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "42e516cd3a0e3b0b2d56915e2843b0115f377585",
          "body": "…er.js module (#6)\n\n* feat(demo): warp projected COGs on the fly + paletted/categorical rendering\n\nMakes the demo render non-EPSG:3857 and paletted sources (e.g. the NLCD 2021\nland cover COG, which is Albers + an 8-bit color table) instead of rejecting\nthem.\n\n- For non-3857 sources, reproject each W\n[…]\n with regex metacharacters are matched literally.\n- demo readRender(): guard min/max against NaN (fall back to defaults) and\n  ensure min < max, so a blank/invalid rescale field can't blank out tiles.",
          "is_bot": false,
          "headline": "feat: warp projected COGs + paletted rendering, as a reusable cog-til…",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-17T23:40:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b297cd535ce65ee7fd397dadf7fa07b2f32f96fa",
          "body": "…S error (#5)\n\n* perf(demo): cache + parallel-fetch tiles, retry large headers, guard CRS\n\nAddresses slow tile loading and confusing failures on unsupported sources.\n\n- Cache decoded source tiles by level/col/row and dedupe in-flight requests\n  (getTile), so panning/zooming reuses overlapping tiles \n[…]\na tile's promise from the cache if its fetch/decode rejects, so\n  a transient network/decode error isn't cached permanently (otherwise the tile\n  would stay blank on every revisit until LRU eviction).",
          "is_bot": false,
          "headline": "perf(demo): cache + parallel tile fetch; large-header retry; clear CR…",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-17T22:36:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "28a2fb2a26e59d924e656c453ba52e83adcf3d2a",
          "body": "- pages.yml: build the wasm package straight into a site/ dir next to the demo,\n  copy in demo/index.html and the sample COG, cache-bust the loader, and deploy\n  to GitHub Pages (mirrors the whitebox-wasm deploy pattern).\n- demo: import the wasm package relatively (./cog_tiler_wasm.js?v=__BUILD__),\n\n[…]\n\n\nVerified locally in a browser: the demo auto-loads the sample over HTTP range\nrequests, reports \"EPSG:3857, 2 levels\", and renders the elevation dome in the\nterrain colormap, fit to the data extent.",
          "is_bot": false,
          "headline": "feat: add GitHub Pages demo with a self-hosted sample COG (#4)",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-17T21:46:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0d5ab5a4ee05cbde12ee671faf683302323d226c",
          "body": "…s (#2)\n\nThe unpkg `?module` URL for maplibre-gl serves a UMD bundle with no ESM\ndefault export, so `import maplibregl from \"...unpkg.../maplibre-gl.js?module\"`\nthrew \"does not provide an export named 'default'\" and the map never\ninitialized - the demo was broken at load. Switch to the esm.sh build\n\n[…]\ned a real EPSG:3857 COG DEM over HTTP\nrange requests; status reported \"EPSG:3857, 3 levels\" and the terrain-colored\nraster rendered correctly georeferenced on the MapLibre map via the cog://\nprotocol.",
          "is_bot": false,
          "headline": "fix(demo): import MapLibre from esm.sh so the map actually initialize…",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-17T21:27:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f107eb36f6bde882345facd1d926aeeb068e3589",
          "body": "* fix(demo): pin CogStream tile-record shape to whitebox-wasm 0.4.0\n\nVerified the real CogStream API against a generated EPSG:3857 COG driven\nthrough whitebox-wasm + cog-tiler-wasm in a browser:\n\n- tiles_for_window records are {col,row,offset,length} (no per-tile pixel\n  origin/size); derive origin \n[…]\n) cannot silently break on a future upstream\n  release.\n- demo: guard the parsed levels_json() against an empty array in openCog(),\n  throwing a clear error instead of a cryptic levels[0] dereference.",
          "is_bot": false,
          "headline": "fix(demo): pin CogStream tile-record shape to whitebox-wasm 0.4.0 (#1)",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-17T21:16:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6ad984cc6f5f2916ff6a573be00a0a33400614ef",
          "body": "Serverless, TiTiler-style XYZ tiling of Cloud Optimized GeoTIFFs in\nWebAssembly. CogTiler is the tiling brain: slippy-map math, overview\nselection, and window->RGBA rendering (rescale + colormap + nodata alpha).\nCOG parsing/decoding and HTTP range reads are delegated to whitebox-wasm's\nCogStream; th\n[…]\nh, built-in colormaps\n- demo/index.html: MapLibre 5.24 cog:// protocol demo\n- builds to wasm32-unknown-unknown; wasm-pack web package\n- CI: fmt + clippy + wasm build + wasm-pack\n- 6 unit tests passing",
          "is_bot": false,
          "headline": "feat: scaffold 3857-first COG XYZ tiler (CogTiler + MapLibre demo)",
          "author_name": "giswqs",
          "author_login": "giswqs",
          "committed_at": "2026-06-17T20:53:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 9,
      "commits_last_year": 26,
      "latest_release_at": "2026-07-19T21:09:29Z",
      "latest_release_tag": "v0.3.1",
      "releases_from_tags": false,
      "days_since_last_push": 6,
      "active_weeks_last_year": 4,
      "days_since_latest_release": 6,
      "mean_days_between_releases": 4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 50,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": []
    },
    "popularity": {
      "forks": 0,
      "stars": 8,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "Cargo.toml",
        "crates/cog-tiler-wasm/Cargo.toml"
      ],
      "largest_source_bytes": 61905,
      "source_files_sampled": 11,
      "oversized_source_files": 1,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "Cargo.toml",
        "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": [
        "crates",
        "npm"
      ],
      "dependencies": [
        {
          "name": "wasm-bindgen",
          "manifest": "crates/cog-tiler-wasm/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2"
        },
        {
          "name": "serde",
          "manifest": "crates/cog-tiler-wasm/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "serde_json",
          "manifest": "crates/cog-tiler-wasm/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "serde-wasm-bindgen",
          "manifest": "crates/cog-tiler-wasm/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.6"
        }
      ],
      "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": 22,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "giswqs",
          "commits": 26,
          "avatar_url": "https://avatars.githubusercontent.com/u/5016453?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "pages.yml",
        "release.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "Cargo.lock"
      ],
      "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": 10,
            "reason": "22 out of 22 merged PRs checked by a CI test -- score normalized to 10",
            "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": 3,
            "reason": "Found 9/26 approved changesets -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 5 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 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": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "770519f47692fd63a2de9a8a90a892b8998963b9",
        "ran_at": "2026-07-25T21:25:20Z",
        "aggregate_score": 3.8,
        "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-19T21:09:37Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-19T21:06:37Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/opengeos/cog-tiler-wasm",
    "host": "github.com",
    "name": "cog-tiler-wasm",
    "owner": "opengeos"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 54,
      "inputs": {
        "security": 38,
        "vitality": 67,
        "community": 31,
        "governance": 56,
        "engineering": 71
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 67,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 52,
            "inputs": {
              "commits_last_year": 26,
              "human_commit_share": 1,
              "days_since_last_push": 6,
              "active_weeks_last_year": 4
            },
            "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": "4/52 weeks with commits",
                "points": 2.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "26 commits in the last year",
                "points": 12.9,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 26
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 9,
              "latest_release_tag": "v0.3.1",
              "releases_from_tags": false,
              "days_since_latest_release": 6,
              "mean_days_between_releases": 4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "9 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "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 ~4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 31,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 14,
            "inputs": {
              "forks": 0,
              "stars": 8,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "8 stars",
                "points": 13.7,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 56,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 5 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 80,
            "inputs": {
              "merged_prs": 22,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "22/22 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 22,
                      "decided": 22
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 9/26 approved changesets -- score normalized to 3",
                "points": 4.5,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "good",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "followers": 3836,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "opengeos",
              "public_repos": 168,
              "account_age_days": 1208
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "3,836 followers of opengeos",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 3836,
                      "login": "opengeos"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "168 public repos, account ~3 yr old",
                "points": 19.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 168
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 3
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 71,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "22 out of 22 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [
                "data-science",
                "geospatial",
                "raster",
                "wasm",
                "whiteboxtools"
              ],
              "has_wiki": true,
              "homepage": "http://opengeos.org/cog-tiler-wasm",
              "has_readme": true,
              "has_docs_dir": false,
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "http://opengeos.org/cog-tiler-wasm",
                "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": "5 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 38,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 38,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 3.8
            },
            "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": "22 out of 22 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "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 9/26 approved changesets -- score normalized to 3",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 5 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 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": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "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": 4
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 55,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "26 of 26 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 26,
                      "sampled": 26
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "Cargo.lock"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "Cargo.toml",
                "crates/cog-tiler-wasm/Cargo.toml"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Cargo.toml, crates/cog-tiler-wasm/Cargo.toml (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "Cargo.toml, crates/cog-tiler-wasm/Cargo.toml"
                    }
                  }
                ],
                "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": "Rust (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Rust"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 26",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 26
                    }
                  }
                ],
                "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": 95,
            "inputs": {
              "primary_language": "Rust",
              "largest_source_bytes": 61905,
              "source_files_sampled": 11,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Rust (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Rust"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/11 source files over 60KB",
                "points": 50,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 11,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "Could not fetch crates package 'cog-tiler-wasm' from its registry",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-25T21:25:36.548851Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/o/opengeos/cog-tiler-wasm.svg",
  "full_name": "opengeos/cog-tiler-wasm",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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