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

cgerling / terraform-provider-unifi

Terraform provider for managing Ubiquiti's UniFi network controller

GoMPL-2.0★ 0 estrellas⑂ 0 forksdesde jun 2026forkVer en GitHub ↗

cgerling/terraform-provider-unifi tiene un índice de salud de 46 sobre 100, lo que lo sitúa en la banda En riesgo. Su puntuación más alta es AI Readiness (86/100) y la más baja, Community & Adoption (12/100). Se actualizó por última vez hace 7 días. 2 personas concentran la mayor parte del trabajo reciente.

46
global / 100
En riesgo

Índice de salud del software

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

46
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

Calvin GerlingCuenta personal
52 seguidores21 repositorios públicosdesde jul 2015@cliniahealth

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Gogithub.com/filipowm/terraform-provider-unifiapunta a otro repositorio; no se puntúav1.1.0-3hace 24 días

Métricas por categoría

Vitalidad

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

63Moderado · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 7 días
4.8/36Cadencia de commits — 7/52 semanas con commits
16/18Volumen de commits — 59 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_year59
human_commit_share0,85
days_since_last_push7
active_weeks_last_year7
Cómo se puntúa
16.2/27Publica versiones — 3 etiquetas de versión (sin releases de GitHub)
36/36Recencia de las versiones — última versión hace 24 días
12.6/27Cadencia de publicación — una versión cada ~247 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count3
latest_release_tagv1.1.0
releases_from_tags
days_since_latest_release24
mean_days_between_releases247
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

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

12Crítico · 18% del índice global
Cómo se puntúa
0/60Estrellas — 0 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
0/22.5README
22.5/22.5Licencia — licencia reconocida (MPL-2.0)
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_readmeno
has_licenseno
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?

40En riesgo · 24% del índice global
Cómo se puntúa
25.2/54Factor bus — la mitad de los commits recae en 2 contribuyente(s)
11.8/22.5Distribución de commits — el principal contribuyente firma el 48% de los commits
13.5/13.5Amplitud de contribuyentes — 33 contribuyentes
10/10OpenSSF Scorecard: Contributors — project has 8 contributing companies or organizations
Datos de entrada utilizados
bus_factor2
contributors_sampled33
top_contributor_share0,476
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
0/38.3Aceptación de PR — sin PR decididos o sin datos
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues, Aceptación de PR. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
12.4/25Alcance del propietario — 52 seguidores de cgerling
21.8/25Trayectoria — 21 repos públicos, cuenta de ~11 años
Datos de entrada utilizados
followers52
owner_typeUser
is_verified
owner_logincgerling
public_repos21
account_age_days4043
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.

Calidad de Ingeniería

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

69Moderado · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 4 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter — .golangci.yaml
0/9.6Hooks de pre-commit
6.4/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.

Documentación

40En riesgo
Cómo se puntúa
0/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://registry.terraform.io/providers/filipowm/unifi/latest/docs
0/10Descripción del repositorio
0/10Topics
0/10Wiki
Datos de entrada utilizados
topics
has_wikino
homepagehttps://registry.terraform.io/providers/filipowm/unifi/latest/docs
has_readmeno
has_docs_dir
has_descriptionno

Seguridad

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

39En 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
0/2.5CI-Tests — sin datos
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 8 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — 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
0/5Packaging — sin datos
5/5Pinned-Dependencies — all dependencies are pinned
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 11 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate3,9
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, packaging, signed_releases. Los pesos restantes se han renormalizado.

Preparación para IA

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

86Excelente · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 83 de 85 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,976
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes3594
Cómo se puntúa
18/18Arranque con un solo comando — Makefile
22/22Pruebas automatizadas
11/11Configuración de lint / formato — .golangci.yaml
11/11Verificación estática de tipos — Go (tipado estático)
10/10Entorno reproducible — Dockerfile, lockfile
10/10Práctica demostrada con agentes — 36 de los últimos 100 commits con autoría o crédito de agente
8/8Mantenimiento automatizado — 15 de los últimos 100 commits son actualizaciones automáticas de dependencias
10/10OpenSSF Scorecard: Pinned-Dependencies — all dependencies are pinned
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum
has_dockerfile
typed_language
bootstrap_filesMakefile
has_devcontainerno
has_linter_config
typecheck_configs
agent_commit_share0,36
toolchain_manifestsgo.mod
dependency_bot_commit_share0,15
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
54.4/55Tamaños de archivo manejables — 2/182 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes69.885
source_files_sampled182
oversized_source_files2
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

0estrellas de GitHub
33contribuidores
59commits en los últimos 12 meses
7días desde el último push
3versiones publicadas
2factor bus
0issues abiertas
Goecosistemas de paquetes

Advertencias de recopilación de datos

  • Community profile unavailable
  • go package 'github.com/filipowm/terraform-provider-unifi' points at a different repository (https://github.com/filipowm/terraform-provider-unifi); 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.9 / 10
3.9agregado

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-27 12:29 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
n/dCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
10Contributorsproject has 8 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
n/dPackagingpackaging workflow not detected
10Pinned-Dependenciesall dependencies are pinned
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities11 existing vulnerabilities detected
Dependencias directas 18
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/apparentlymart/go-cidrv1.1.1go.mod
Gogithub.com/biter777/countriesv1.7.5go.mod
Gogithub.com/deckarep/golang-set/v2v2.9.0go.mod
Gogithub.com/filipowm/go-unifi/v2v2.3.0go.mod
Gogithub.com/hashicorp/go-ctyv1.5.0go.mod
Gogithub.com/hashicorp/go-versionv1.9.0go.mod
Gogithub.com/hashicorp/terraform-plugin-docsv0.25.0go.mod
Gogithub.com/hashicorp/terraform-plugin-frameworkv1.19.0go.mod
Gogithub.com/hashicorp/terraform-plugin-framework-validatorsv0.19.0go.mod
Gogithub.com/hashicorp/terraform-plugin-gov0.31.0go.mod
Gogithub.com/hashicorp/terraform-plugin-logv0.10.0go.mod
Gogithub.com/hashicorp/terraform-plugin-muxv0.23.1go.mod
Gogithub.com/hashicorp/terraform-plugin-sdk/v2v2.40.1go.mod
Gogithub.com/hashicorp/terraform-plugin-testingv1.16.0go.mod
Gogithub.com/stretchr/testifyv1.11.1go.mod
Gogithub.com/testcontainers/testcontainers-gov0.43.0go.mod
Gogithub.com/testcontainers/testcontainers-go/modules/composev0.43.0go.mod
Gogolang.org/x/cryptov0.53.0go.mod
Todas las dependencias no recopilado

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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": true,
      "size_kb": 2497,
      "has_wiki": false,
      "homepage": "https://registry.terraform.io/providers/filipowm/unifi/latest/docs",
      "languages": {
        "Go": 1376415,
        "Shell": 309,
        "Makefile": 721,
        "Go Template": 9159
      },
      "pushed_at": "2026-07-20T00:34:23Z",
      "created_at": "2026-06-29T13:10:28Z",
      "owner_type": "User",
      "updated_at": "2026-07-20T00:34:27Z",
      "description": "Terraform provider for managing Ubiquiti's UniFi network controller",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MPL-2.0",
      "default_branch": "main",
      "license_spdx_raw": "MPL-2.0",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Calvin Gerling",
      "type": "User",
      "login": "cgerling",
      "company": "@cliniahealth",
      "location": null,
      "followers": 52,
      "avatar_url": "https://avatars.githubusercontent.com/u/13140497?v=4",
      "created_at": "2015-07-01T19:42:08Z",
      "is_verified": null,
      "public_repos": 21,
      "account_age_days": 4043
    },
    "license": {
      "state": "standard",
      "spdx_id": "MPL-2.0",
      "raw_spdx": "MPL-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": false
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2026-07-02T19:32:07Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2025-03-22T18:13:16Z"
        },
        {
          "tag": "v0.0.1",
          "kind": "patch",
          "published_at": "2025-02-23T19:10:28Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "70cc40ccebfacb3167de023059d7e82ebde01316",
          "body": "UniFi 10.x returns an empty data array on a successful networkconf PUT. go-unifi\nv1.9.x mapped that to unifi.ErrNotFound (handled by ReReadOnUpdateNotFound); v2\ninstead returns `unexpected response: expected 1 Network, got 0`, which the helper\ndid not recognize, so every network update failed after a successful write.\n\nTeach ReReadOnUpdateNotFound to also treat the v2 empty-echo (got 0) as the\nre-read trigger, while still propagating genuine anomalies (got 2+). Regression\ntests cover both.",
          "is_bot": false,
          "headline": "fix(network): re-read on go-unifi v2 empty-echo update error",
          "author_name": "Calvin Gerling",
          "author_login": "cgerling",
          "committed_at": "2026-07-20T00:34:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6d4d7ca23be418c76b74b57493e904cb699447d9",
          "body": "The plugin-framework provider (provider_v2.go) passed Insecure to\nbase.NewClient but omitted HTTPConfigurer, unlike the SDKv2 provider\n(provider.go). base.NewClient only builds the InsecureSkipVerify transport\nfrom cfg.Insecure inside the MaxRetries>0 branch, so with the default\nMaxRetries==0 the ni\n[…]\nert-verifying transport — making allow_insecure a no-op for every PF\nresource against self-signed UniFi controller certs. Mirror the SDKv2\nprovider and bake the insecure transport into HTTPConfigurer.",
          "is_bot": false,
          "headline": "fix(client): honor allow_insecure in the plugin-framework provider",
          "author_name": "Calvin Gerling",
          "author_login": "cgerling",
          "committed_at": "2026-07-19T20:10:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b22c4229097c09c57afe5bfbf15202c8164b6bfd",
          "body": "filipowm v1.1.0 raises a diagnostic error on ErrNotFound during read, which\nmakes plan/refresh fail when a resource was deleted outside Terraform instead\nof planning to recreate it. Restores the fork's behavior: read() reports\nfound/not-found, Read removes the resource from state, and\ncreate/update/import still treat not-found as an error.",
          "is_bot": false,
          "headline": "fix: drop out-of-band-deleted resources from state on read",
          "author_name": "Calvin Gerling",
          "author_login": "cgerling",
          "committed_at": "2026-07-19T16:31:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c16624d235430179f65632dcf8e9255bf0873946",
          "body": "Re-applies the go-unifi v2 migration on top of filipowm v1.1.0 (previously\nbased on ~v1.0.1). Swaps 66 imports to go-unifi/v2 and bumps to v2.3.0.\n\nBREAKING CHANGE: client auth is now API-key-only (go-unifi v2 removed\nusername/password/session Login), and the IPS resource drops ad-blocking +\nDNS-filtering (go-unifi v2's SettingIps no longer models them).",
          "is_bot": false,
          "headline": "feat!: migrate to go-unifi v2.3.0 on filipowm v1.1.0",
          "author_name": "Calvin Gerling",
          "author_login": "cgerling",
          "committed_at": "2026-07-19T16:31:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d388103e4646c2287b2466440883ae1ddf78386",
          "body": "Bumps the go_modules group with 1 update in the / directory: [go.mongodb.org/mongo-driver](https://github.com/mongodb/mongo-go-driver).\n\n\nUpdates `go.mongodb.org/mongo-driver` from 1.17.6 to 1.17.7\n- [Release notes](https://github.com/mongodb/mongo-go-driver/releases)\n- [Commits](https://github.com/\n[…]\ndencies:\n- dependency-name: go.mongodb.org/mongo-driver\n  dependency-version: 1.17.7\n  dependency-type: indirect\n  dependency-group: go_modules\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "build(deps): bump go.mongodb.org/mongo-driver",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-02T20:10:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "00cf727bee7486f8e7dbf3ebb4dd2a4ae46e8d82",
          "body": "Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 8.0.0 to 9.3.0.\n- [Release notes](https://github.com/golangci/golangci-lint-action/releases)\n- [Commits](https://github.com/golangci/golangci-lint-action/compare/4afd733a84b1f43292c63897423277bb7f4313a9...ba\n[…]\nname: golangci/golangci-lint-action\n  dependency-version: 9.3.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "build(deps): bump golangci/golangci-lint-action from 8.0.0 to 9.3.0",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-02T19:32:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9f681edb5ac750325ecc420393bb25b8ce832810",
          "body": "* chore(deps): update dependencies and clean up code formatting\n\n* chore: regenerate docs, update makefile\n\n* chore: apply linter fixes and clean up code formatting\n\n* adjust error message",
          "is_bot": false,
          "headline": "chore(deps): update dependencies and clean up code formatting (#175)",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-07-02T13:54:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e7f838a6143010a342867f8c1b23af1d48807c5d",
          "body": "Add .claude/rules/resource-validation.md (attribute vs ConfigValidators,\nControllerVersionValidator/FeatureValidator gating, how to verify) and\n.claude/rules/shared-code.md (base/utils/types/validators reuse map,\nno-duplication policy). Trim overlapping bullets in resource-conventions.md\nto pointers and reference the new rules from CLAUDE.md.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(claude): add resource-validation and shared-code rules",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-07-02T08:15:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "42e4c2e4938c693c4a89f8d8e9abf7e4d768bf7f",
          "body": null,
          "is_bot": false,
          "headline": "test(network): update version constraint in acceptance test to > 7.5",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-07-02T07:27:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f7311296df6c2e1d1aa8ad8fef570ba8897919ca",
          "body": "Bumps [goreleaser/goreleaser-action](https://github.com/goreleaser/goreleaser-action) from 7.2.2 to 7.2.3.\n- [Release notes](https://github.com/goreleaser/goreleaser-action/releases)\n- [Commits](https://github.com/goreleaser/goreleaser-action/compare/5daf1e915a5f0af01ddbcd89a43b8061ff4f1a89...f06c13\n[…]\n-name: goreleaser/goreleaser-action\n  dependency-version: 7.2.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "build(deps): bump goreleaser/goreleaser-action from 7.2.2 to 7.2.3",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-02T00:43:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4f9de57ff9c7f1477ee3d0286cdaf3810ccf7740",
          "body": null,
          "is_bot": false,
          "headline": "docs: regenrate docs",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-07-02T00:25:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bfc87ed338aa3a9149eb0663f975058674995d74",
          "body": null,
          "is_bot": false,
          "headline": "ci(changelog): implement changelog generation",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-07-02T00:23:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5c7da995bde60feab83bd767cc67361ca2002ca6",
          "body": "… 8.0",
          "is_bot": false,
          "headline": "test(network): update version constraint in mdns acceptance test to >…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-07-02T00:22:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e1521772432d5bc46f64ce94f2fa455e1b2e796",
          "body": "… policy destination",
          "is_bot": false,
          "headline": "feat(firewall): support match_opposite_networks attribute in firewall…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-07-02T00:21:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "235d0ccd84ef697ee50c8e56e8d3de2af4246b04",
          "body": null,
          "is_bot": false,
          "headline": "update NewFirewallPolicyTargetModel to handle nil port values",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-07-02T00:10:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a33c874f833923bc89997750d1a9a2145d189959",
          "body": "… destination",
          "is_bot": false,
          "headline": "feat(firewall): support network_ids attribute in firewall zone policy…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-07-02T00:10:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "faa49df7f9c92dde5c318e290deffe3896e1c959",
          "body": "…y ips field",
          "is_bot": false,
          "headline": "fix(firewall): allow mixed IPv4/IPv6 addresses in firewall zone polic…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-07-02T00:10:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "83ddf824c717c6dfe89d06cf0db513fcda0d6945",
          "body": "…20) (#173)\n\n* feat(network): add DHCP default-gateway override to unifi_network\n\nSurface the per-network DHCP default-gateway override (the UI's \"Default\nGateway\" Auto/Manual control) on the unifi_network resource and data source.\nBy default the controller advertises the network's own interface IP \n[…]\ne Opus 4.8 (1M context) <noreply@anthropic.com>\n\n* fix(network): add DHCP range validation for default-gateway override\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(network): add DHCP default-gateway override to unifi_network (#1…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-07-01T23:44:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6ada43c25179f6ad5113d814ee633007f1027456",
          "body": "* fix(network): accept single_network for ipv6_interface_type (#99)\n\nThe unifi_network resource validated ipv6_interface_type against a\nplan-time allow-list of only none|pd|static, so setting\nipv6_interface_type = \"single_network\" failed at terraform plan/validate\nwith \"invalid value for ipv6_interf\n[…]\n end-to-end behavior stay tracked as a follow-up.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(network): accept single_network for ipv6_interface_type (#99) (#169)",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-07-01T21:24:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cdaea8de8f3b15b5262bd0b24265d251ed62b8bd",
          "body": "… 7.2\n\nThe Switch Isolation Settings managed by unifi_setting_global_switch only\nexist on UniFi Network controllers from version 7.2 onward. Without a version\ngate, users on older controllers hit opaque API errors and the acceptance\ntests ran against controllers predating the feature (causing\nTestAc\n[…]\nsionConstraint \">= 7.2\" to all global_switch acceptance tests so they\n  skip cleanly below 7.2 and run in the version matrix scope\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(settings): gate unifi_setting_global_switch on controller version…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-07-01T14:26:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "076c34e3014f274480c5a4c2670c1461129a927a",
          "body": "…ns behind TF_ACC_LOCAL\n\nTestAccDevice_switch_portOverrides (added in #165/#97) is version-independent,\nso on PRs it ran once in the core scope job and went green, but on push to main\n(scope=all) it runs against all ~19 controller versions and failed everywhere.\n\nIt asserted behavior the Dockerized \n[…]\n, carries the LAG aggregate + inline-VLAN assertions.\n\nProvider-side round-trip correctness remains covered by offline unit tests.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(device): gate LAG aggregate & inline-VLAN port_override assertio…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-07-01T12:00:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2311d2dcc7b3903697e03a40047f3565b157368e",
          "body": "* fix(network): preserve IPv6/DHCPv6 values on import (#96)\n\nImported unifi_network resources planned the IPv6/DHCPv6 value fields to\nnull whenever the config omitted them: they were declared Optional but not\nComputed, so a sparse post-import config planned \"value -> null\". go-unifi's\n`,omitempty` s\n[…]\nription change, so docs are unaffected.\n\nRefs #96\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(network): preserve IPv6/DHCPv6 values on import (#96) (#171)",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-07-01T07:30:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bfe9a3bee5d716357dfdd349c901bd91a8aad07e",
          "body": "…ces (#98) (#162)\n\n* fix(port_profile,network): re-read on ErrNotFound after update (#98)\n\ngo-unifi v1.9.2's generated updatePortProfile/updateNetwork convert a\nsuccessful-but-empty PUT response (HTTP 200, {\"meta\":{\"rc\":\"ok\"},\"data\":[]})\ninto unifi.ErrNotFound via their `len(respBody.Data) != 1` gua\n[…]\nss state is repopulated from the\nreturned object.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: re-read on ErrNotFound after update across affected SDKv2 resour…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-06-30T10:36:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c9751e697616466ce5bce5789933cef83facd68a",
          "body": "…ide (#97) (#165)\n\n* feat(device): add inline per-port VLAN overrides on unifi_device port_override\n\nSurface the per-port VLAN field cluster (native_networkconf_id,\ntagged_vlan_mgmt, forward, excluded_network_ids, voice_networkconf_id,\nsetting_preference) on the `unifi_device` `port_override` block,\n[…]\nery plan. Update the example and regenerate\ndocs.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add inline per-port VLAN overrides to `unifi_device` port_overr…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-06-30T09:02:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6fd2cb4bc14dd7b26c5c366a4d19f5e8aa552e2d",
          "body": "…#84) (#163)\n\n* refactor(types): promote NormalizeMAC plan modifier to shared types package\n\nMove the set-of-MAC normalization plan modifier (and its unit test) out of\nthe apgroup domain into the shared internal/provider/types package so other\nresources (e.g. the new unifi_setting_global_switch) can\n[…]\niately, before any controller/device interaction.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add unifi_setting_global_switch for switch isolation settings (…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-06-30T08:32:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cba94d977509eb665e35a7ce82358e871da1a4f0",
          "body": "* fix(network): preserve DHCP Guarding on unifi_network (#123)\n\nThe `unifi_network` resource had no schema attribute for UniFi's \"DHCP\nGuarding\" setting, and the SDKv2 Create/Update mapper built a fresh\n`*unifi.Network` without ever assigning `DHCPguardEnabled`. Because the\ngo-unifi field has no `om\n[…]\ne table test (TestValidateDHCPGuardingRawConfig).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: preserve DHCP Guarding on unifi_network (#123) (#161)",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-06-29T22:32:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f01377d2cd862444ba92671a7639d83e03fca464",
          "body": "…irewall_zone_policy_order for policies ordering (#122) (#159)\n\n* refactor(firewall): drop duplicate connection_states config validator\n\n`unifi_firewall_zone_policy` registered the\n`RequiredSimpleTogetherIf(\"connection_state_type\", CUSTOM, \"connection_states\")`\nconfig validator twice. Remove the byt\n[…]\nal ZBF controller), examples, and generated docs.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(firewall): lock read-only index for zone policy & new resource_f…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-06-29T22:26:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ee1b3e1e09ec67e3149085a02d0e121f93d5442a",
          "body": "… (#160)\n\n* fix(account): map RADIUS VLAN assignment via the vlan attribute (#95)\n\nThe unifi_account resource and data source never mapped the controller's\ninteger vlan field; they only mapped network_id (networkconf_id), a network-\nconfig reference distinct from the 802.1Q VLAN used for RADIUS dyna\n[…]\nus 4.8 (1M context) <noreply@anthropic.com>\n\n* fix(account): update description for VLAN attribute in RADIUS assignment\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(account): map RADIUS VLAN assignment via the vlan attribute (#95)…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-06-29T20:39:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "74f6283e78a0a5360d4428db00444642db278016",
          "body": "…e (#94) (#164)\n\n* fix(network): map firewall_zone_id on unifi_network to fix blank ZBF Rules page\n\nOn UniFi OS 9.x with Zone-Based Firewall, creating a network via unifi_network\nleft it unzoned because the resource never mapped unifi.Network.FirewallZoneID.\nThe controller then returns HTTP 500 on t\n[…]\nep the zone-side networks.# == 1 check in step 1.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: map firewall_zone_id on unifi_network to fix blank ZBF Rules pag…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-06-29T17:16:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8500cdafd26b126501cbd2ab9892bda62235b8ae",
          "body": "* feat: add WireGuard VPN client support to unifi_network\n\nExpose the `vpn-client` purpose and the WireGuard VPN client attributes\non the unifi_network resource, wiring them to fields the go-unifi client\nalready models (Purpose `vpn-client`, VPNType `wireguard-client`,\nWireguardClient*, XWireguardPr\n[…]\npic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>\nCo-authored-by: devantler <devantler@users.noreply.github.com>\nCo-authored-by: Mateusz Filipowicz <matfilipowicz@gmail.com>",
          "is_bot": false,
          "headline": "feat: add WireGuard VPN client support to unifi_network (#147)",
          "author_name": "Nikolai Emil Damm",
          "author_login": "devantler",
          "committed_at": "2026-06-29T06:25:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "414a53316699bc85ee2d1fd2de1eaaf7f4094e73",
          "body": "… 6GHz) selection (#158)\n\n* feat(wlan): expose `wlan_bands` on `unifi_wlan` for multi-band (incl. 6GHz) selection\n\nAdds a `wlan_bands` set attribute (`2g`/`5g`/`6g`) to `unifi_wlan` — the modern multi-band field that supersedes the legacy single-band `wlan_band` enum (`2g`/`5g`/`both`) and is the on\n[…]\ne Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_018SCDby9NWYT5gsEB6jYbt3\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(wlan): expose `wlan_bands` on `unifi_wlan` for multi-band (incl.…",
          "author_name": "Steve Rice",
          "author_login": "steverice",
          "committed_at": "2026-06-28T19:04:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "64d69f621552b0497017137c65d3f2cb4bba0512",
          "body": "… changes (#131)\n\n* fix: upgrade go-unifi to v1.9.1 and adapt to its controller-API field changes\n\ngo-unifi v1.9.x is regenerated against current controller specs, which changed two fields the provider uses: `DevicePortOverrides.AggregateNumPorts` (int) became `AggregateMembers` (`[]int`), and `Fire\n[…]\nClaude-Session: https://claude.ai/code/session_018SCDby9NWYT5gsEB6jYbt3\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>\nCo-authored-by: Mateusz Filipowicz <matfilipowicz@gmail.com>",
          "is_bot": false,
          "headline": "fix: upgrade go-unifi to v1.9.1 and adapt to its controller-API field…",
          "author_name": "Steve Rice",
          "author_login": "steverice",
          "committed_at": "2026-06-27T21:18:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "781e09f7b71be5bcfa377fb2cdad431606c8d367",
          "body": "…pment` to `terraform-provider-development`",
          "is_bot": false,
          "headline": "chore(claude): correct plugin reference from `terraform-plugin-develo…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-06-26T23:03:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8cc0a13739b6c7f6fbda99e6b213c83dd0068521",
          "body": "Pin every GitHub Action to a full-length commit SHA (with a version\ncomment) instead of a mutable tag, to harden the CI supply chain\nagainst tag-hijacking. Versions bumped to latest where compatible:\n\n- actions/checkout                  v6     -> v7.0.0\n- actions/setup-go                  v6     -> \n[…]\ng. the Node 20 -> 24 runtime, which GitHub-hosted runners support).\nThe `# vX.Y.Z` comments keep Dependabot able to track updates.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: pin GitHub Actions to commit SHAs and bump to latest",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-06-26T23:03:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "851e7a271b9351e9c812a32aebe721a09e1189b9",
          "body": null,
          "is_bot": false,
          "headline": "chore(claude): add Claude Code setup",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-06-26T23:03:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "352a7b7f2460c8b109e9c54a896cd3e51142d4c1",
          "body": "WAN networks return empty values for these fields from the API, causing\nperpetual drift against schema defaults. Now explicitly set defaults\nwhen API returns empty for WAN networks.",
          "is_bot": false,
          "headline": "fix: handle empty network_group and ipv6_interface_type for WAN networks",
          "author_name": "shadyeip",
          "author_login": "shadyeip",
          "committed_at": "2026-06-26T22:52:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1522511abdc720fe4136d895537bcbbc276dd9c",
          "body": "The UniFi API ignores index on create/update - ordering is controlled\nvia a separate batch-reorder endpoint. Making index computed-only\nprevents \"Provider produced inconsistent result after apply\" errors.",
          "is_bot": false,
          "headline": "fix: make index field read-only in `unifi_firewall_zone_policy`",
          "author_name": "shadyeip",
          "author_login": "shadyeip",
          "committed_at": "2026-06-26T22:52:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c05f24ca2caf256974724e82ba10dad4577f67f0",
          "body": "…s meshing\n\nExposes the site `connectivity` setting (the controller's \"Wireless Meshing\" toggle) as a managed resource, mirroring the existing `unifi_setting_network_optimization` pattern. A single `enabled` bool maps to `SettingConnectivity.Enabled` via the `GetSettingConnectivity`/`UpdateSettingCo\n[…]\nller-generated mesh SSID (`x_mesh_essid`) and PSK (`x_mesh_psk`) are intentionally left unmanaged so the secret never lands in Terraform state.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(settings): add `unifi_setting_connectivity` resource for wireles…",
          "author_name": "Steve Rice",
          "author_login": "steverice",
          "committed_at": "2026-06-26T11:51:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f4170e580e6363b2f93f3a3dc6214729c1c8df90",
          "body": "Per-network UPnP/NAT-PMP opt-in — the toggle that, combined with the gateway-global `unifi_setting_usg.upnp_enabled`, controls which networks' clients may self-map WAN ports. Lets UPnP be scoped to trusted networks only (e.g. enable on Trusted so Plex/self-hosted services keep auto-mapping, leave of\n[…]\nbled` already exists; bool Optional+Computed, wired through the existing igmp_snooping/multicast_dns pattern (schema + get + set).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(network): expose `upnp_lan_enabled` on `unifi_network`",
          "author_name": "Steve Rice",
          "author_login": "steverice",
          "committed_at": "2026-06-25T08:28:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b942b75e97ea8e687864f0758db3d238ee5ab847",
          "body": "* feat(device): expose `switch_vlan_enabled` on `unifi_device` resource\n\nAdds a top-level `switch_vlan_enabled` bool attribute that maps to the controller-side `switch_vlan_enabled` field. Required to be `true` on access points with passthrough Ethernet ports (UAP-IW lineage — UAP-AC-IW, UAP-AC-IW-P\n[…]\ne schema with the API's write-once behavior so plans converge.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(device): expose `switch_vlan_enabled` on `unifi_device` (#127)",
          "author_name": "Steve Rice",
          "author_login": "steverice",
          "committed_at": "2026-06-25T07:20:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "930c5c4ca7e926bd68e27cac4acee2a1cd4608fb",
          "body": "…setting_ether_lighting` (#129)\n\n* feat(device): expose per-band `radio` config on `unifi_device`\n\nAdds a `radio` nested block to `unifi_device` for managing AP radio settings (`ng`/`na`/`6e`): `channel`, `ht` (width), `tx_power_mode` (incl. `disabled` to turn a band off), `tx_power`, and `min_rssi`\n[…]\n.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nCo-authored-by: Mateusz Filipowicz <matfilipowicz@gmail.com>",
          "is_bot": false,
          "headline": "feat: Etherlighting support — `ether_lighting` device block + `unifi_…",
          "author_name": "Steve Rice",
          "author_login": "steverice",
          "committed_at": "2026-06-25T05:50:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c2c2a71b05bf9efb719ba877ecd0b0fe71826b44",
          "body": "Adds a `radio` nested block to `unifi_device` for managing AP radio settings (`ng`/`na`/`6e`): `channel`, `ht` (width), `tx_power_mode` (incl. `disabled` to turn a band off), `tx_power`, and `min_rssi`/`min_rssi_enabled`. The underlying `go-unifi` `DeviceRadioTable` already models every field, so no\n[…]\numented in the block description. Unit tests cover band preservation, non-zero overlay, missing-band append, and min-rssi pairing.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(device): expose per-band `radio` config on `unifi_device`",
          "author_name": "Steve Rice",
          "author_login": "steverice",
          "committed_at": "2026-06-23T14:49:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "097e0645d46a17b96129c12cbca7a58516eeaa10",
          "body": "…ntain permissions'\n\nCo-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Potential fix for pull request finding 'CodeQL / Workflow does not co…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-06-23T11:25:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bc02dc30b97b44c6cc93d19d5cb6a60220b4836a",
          "body": "…Docker controller\n\nad_blocked_networks, dns_filters (IPS) and dhcp_relay_servers (USG) require an\nadopted gateway/IPS engine the Dockerized test controller lacks, so it accepts\nthe PUT but returns them empty on v7/v9/latest -> flaky \"element vanished\".\n\n- Gate the dedicated tests (TestAccSettingIps\n[…]\ne8\n  configs+assertions so the rest (ips_mode, categories, honeypots, suppression,\n  and all other USG settings) still runs in CI.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(settings): gate gateway-dependent assertions unsupported on the …",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-06-23T11:25:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "91595b190fa026cc40ba1724c6badbaffd86b2dd",
          "body": "…write\n\nThe bounded poll-until-consistent (commit 8f30310) did not fix the IPS/USG\n\"element vanished\" failures: debugging showed the provider payload is correct\n(arrays sent with their AdBlockingEnabled/DNSFiltering enable flags), the PUT is\naccepted (no api.err; the error is a framework plan-vs-sta\n[…]\nwhich is\nthe correct behavior for real users (state reflects the persisted GET). The\ngateway-dependent tests are gated separately.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "revert(settings): drop read-after-write poll, keep single read-after-…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-06-23T11:25:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "aa0dbce715e6888d0ecc4482b14b4346c2981e51",
          "body": "…ministic\n\ndata.unifi_dns_records returns ALL records on the site, so DNS tests creating\nrecords in parallel inflated the count and flaked TestDNSRecordsDataSource_*\n(result.# expected \"0\"/\"3\", got \"1\"/\"4\"). Share a dnsLock mutex across the\nrecord-creating and record-counting DNS tests so they never run concurrently;\npure validation/error tests (no records) are left unlocked.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(dns): serialize DNS tests so data-source record counts are deter…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-06-23T11:25:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5bbb388b1bf84e0874caf4e256d87bdc9f2d3b5c",
          "body": "…ections persist\n\nRead-after-write moved settings state from the PUT echo to the GET, but the\ncontroller's GET is ALSO eventually-consistent for gateway/IDS collections, so a\nsingle read could still return them empty -> \"inconsistent result after apply:\nelement N has vanished\" (ad_blocked_networks, \n[…]\nuired). Gated by ReadAfterWrite (settings-only) AND the\ninterface, so all other resources keep single-read behavior. Non-breaking.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(settings): poll read-after-write until eventually-consistent coll…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-06-23T11:25:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3af9e5c02e03f59fe35838a8e342d7f7ff288981",
          "body": "… regression)\n\nThe previous commit pointed the comprehensive IPS honeypot's network_id at a\nGetTestVLAN network (10.x.x.x) while leaving ip_address hardcoded to\n192.168.1.10, so the controller rejected the PUT with\napi.err.HoneypotIpNotWithinSelectedNetwork (deterministic 400). 'network1' is\nthe rea\n[…]\nt, mirroring the passing TestAccSettingIps_honeypot. dns_filters\nand ad_blocked_networks keep their real unifi_network references.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(settings): revert honeypot network to default LAN (fix introduced…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-06-23T11:25:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3fadbc888484bff75043c8e399c0e346f9132986",
          "body": "…trix\n\nEach of the 20 matrix jobs re-ran the full suite against a freshly-booted\ncontroller; ~123 of 197 tests are version-independent and don't need every\nversion. Split execution by a UNIFI_ACCTEST_SCOPE env var enforced centrally in\nAcceptanceTest (the single resource.ParallelTest call site):\n  -\n[…]\nHub 429s, moves the\n    cold pull out of the test timeout); drop the no-op TF_PLUGIN_CACHE_DIR and\n    check-latest re-resolution.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: speed up acceptance tests via core/matrix split and reduced PR ma…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-06-23T11:25:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "66ee5827ef05db8874fd81cd065ce36317295bf3",
          "body": "…erts on import\n\n- ad_blocked_networks/enabled_networks used literal non-existent IDs\n  (\"network1\"/\"network2\"/\"network3\") that the controller silently drops,\n  producing empty read-backs. Reference real unifi_network resources (asserted\n  via TestCheckTypeSetElemAttrPair) and use the valid \"LAN\" ke\n[…]\nked import step (\"ImportStateVerify attributes not equivalent\").\n  Ignore just that attribute path on the comprehensive IPS tests.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(settings): use real network refs and ignore async suppression.al…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-06-23T11:25:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "42cd23c9191c5ccfb7f73f57031b8f8f002e624f",
          "body": "…isted GET\n\ngo-unifi's SetSetting* does a single PUT and parses the PUT response echo (no\nGET); the gateway-less test controller intermittently echoes settings\ncollections (ad_blocked_networks, dns_filters, dhcp_relay_servers) back empty.\nThe provider built state from that echo (generic_resource Cre\n[…]\n eventually-consistent resources like users. Non-breaking\n(additive field; settings are site-scoped singletons that always exist).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(settings): read-after-write so post-apply state reflects the pers…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-06-23T11:25:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "19fae1cf1d381fcc979720785a0e97002a0ab68e",
          "body": "Under parallel load the controller intermittently returns transient responses\n(connection resets, HTTP 5xx/429, or an HTML error page instead of JSON, which\nsurfaces as \"invalid character '<' looking for beginning of value\"), failing\nunrelated acceptance tests. The existing RetryableUnifiClient.Do o\n[…]\nd, so existing behavior is unchanged\nand the change is non-breaking. Adds httptest-based unit tests and regenerated\nprovider docs.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(client): add opt-in configurable HTTP retries for transient errors",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-06-23T11:25:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "82ef6dc41d96d6e6e4deda35bb2e1e2faa6cca29",
          "body": "…lism\n\nThe retry step (nick-fields/retry@v3) was configured with timeout_minutes: 20,\nmax_attempts: 3, retry_on: timeout, but the job itself had timeout-minutes: 20.\nThe job-level timeout killed the whole job during attempt 1, so attempts 2-3\nnever ran — retry_on: timeout was dead config. Raise the \n[…]\n cases stop overloading the single shared\ncontroller, which amplified transient-load failures. Configurable for faster\nlocal runs.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: raise acctest job timeout above retry budget and cap test paralle…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-06-23T11:25:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dd0a87e2223691b45ca5a9091b5d66d81f3934d0",
          "body": "The MAC pool was mapset.NewSet[*net.HardwareAddr]() — a set of pointers deduped\nby pointer identity. The init loop ran i over 0..511 with mac[5]=byte(i), which\nwraps at 256, so only 256 distinct MAC values existed but 512 distinct pointers\nwere added; the dup guard never fired because every &mac is \n[…]\nlue, and build\nexactly the 256 addresses of the RFC 7042 00:00:5e:00:53:xx documentation block.\nThe public signature is unchanged.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(testing): make AllocateTestMac hand out unique MAC addresses",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-06-23T11:25:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "041ba8b366abc23b88f88a2588cf8103f19451f3",
          "body": "… timeouts\n\nwaitForController spawned a goroutine that polled readStatus and, on ANY\nreadStatus error, returned without calling wg.Done() while the parent blocked\non wg.Wait() forever. A single transient /status error during controller boot\n(the controller restarts Tomcat mid-provisioning) deadlocke\n[…]\n context.Cause error when the\ndeadline fires. waitForController now returns error; its single caller\nWaitUntilReady propagates it.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(testing): prevent waitForController goroutine deadlock causing CI…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-06-23T11:25:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c5b2c41545bd107950149b5eb386304e8a72f1e2",
          "body": "* feat: support AP Group resource\n\n* add missing test helper\n\n* fix: address review comment in internal/provider/acctest/resource_ap_group_test.go\n\nApplied from PR review feedback (thread PRRT_kwDONkoWWc6JXzJr).\n\n* fix: address review comment in internal/provider/apgroup/data_ap_group.go\n\nApplied fr\n[…]\n acceptance tests cannot run without AP adoption.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: support AP Group resource (#86)",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2026-06-23T02:21:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1e4546bdacbd2ac817717a2dbaf9e16701c8259f",
          "body": "Bumps [actions/setup-go](https://github.com/actions/setup-go) from 5 to 6.\n- [Release notes](https://github.com/actions/setup-go/releases)\n- [Commits](https://github.com/actions/setup-go/compare/v5...v6)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-go\n  dependency-version: '6'\n  depen\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump actions/setup-go from 5 to 6 (#107)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-13T21:57:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d6e31ce8af44acc31f6c5f77dad0feafdbd049e5",
          "body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 6.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v4...v6)\n\n---\nupdated-dependenc\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump actions/checkout from 4 to 6 (#114)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-13T21:54:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5203ed2aebce15181548de61607ce3df5bd0c7d4",
          "body": "….0.5 in the go_modules group (#92)\n\nbuild(deps): bump github.com/containerd/containerd/v2\n\nBumps the go_modules group with 1 update: [github.com/containerd/containerd/v2](https://github.com/containerd/containerd).\n\n\nUpdates `github.com/containerd/containerd/v2` from 2.0.4 to 2.0.5\n- [Release notes]\n[…]\n\n  dependency-type: indirect\n  dependency-group: go_modules\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump github.com/containerd/containerd/v2 from 2.0.4 to 2…",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-13T21:54:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3f4f5fbbb646df5f14b7c1503e5e753fbdf5186b",
          "body": "…l_zone",
          "is_bot": false,
          "headline": "Add example of how to find pre-existing zones with data.unifi_firewal…",
          "author_name": "Jonatan Olofsson",
          "author_login": "jonatanolofsson",
          "committed_at": "2026-06-04T17:20:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7dc512dff4b44a654ed69c8e915beb40bacdb702",
          "body": "…dules group (#83)\n\nbuild(deps): bump golang.org/x/net in the go_modules group\n\nBumps the go_modules group with 1 update: [golang.org/x/net](https://github.com/golang/net).\n\n\nUpdates `golang.org/x/net` from 0.37.0 to 0.38.0\n- [Commits](https://github.com/golang/net/compare/v0.37.0...v0.38.0)\n\n---\nup\n[…]\n\n  dependency-type: indirect\n  dependency-group: go_modules\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump golang.org/x/net from 0.37.0 to 0.38.0 in the go_mo…",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2025-04-20T04:57:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b9284f7758544f495d244133d459ffd530c9e7ed",
          "body": "* docs: add examples and recreate TF documentation\n\n* update readme\n\n* add information about experimental support of firewall zones",
          "is_bot": false,
          "headline": "docs: improve documentation for 1.0.0 release (#75)",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-22T18:13:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a133383b437c5c38c3e4753ff64b075388bcfe87",
          "body": "…i_portal_file` and `unifi_setting_guest_access` resources (#74)\n\n* feat: support customizing guest portal logo and background with `unifi_portal_file` and `unifi_setting_guest_access` resources\n\n* ci: run acceptance tests on go.mod changes\n\n* f",
          "is_bot": false,
          "headline": "feat: support customizing guest portal logo and background with `unif…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-22T16:31:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8dd4bfcb972b870aedfc25d3ba20f8dc7056672f",
          "body": "…e_policy` (#73)\n\n* feat: support Firewall Zone Policy resources with `unifi_firewall_zone_policy`\n\n* lint",
          "is_bot": false,
          "headline": "feat: support Firewall Zone Policy resources with `unifi_firewall_zon…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-22T14:16:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cdc0254289609031c4954b49a74e4b16e83073df",
          "body": null,
          "is_bot": false,
          "headline": "refactor: reorganize code to make it more readable (#71)",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-21T10:52:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "86fdc0b27a8e4182e4a8390083deea2082945a61",
          "body": "….0 (#62)\n\nBumps [github.com/deckarep/golang-set/v2](https://github.com/deckarep/golang-set) from 2.7.0 to 2.8.0.\n- [Release notes](https://github.com/deckarep/golang-set/releases)\n- [Commits](https://github.com/deckarep/golang-set/compare/v2.7.0...v2.8.0)\n\n---\nupdated-dependencies:\n- dependency-nam\n[…]\n..\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: Mateusz Filipowicz <matfilipowicz@gmail.com>",
          "is_bot": true,
          "headline": "build(deps): bump github.com/deckarep/golang-set/v2 from 2.7.0 to 2.8…",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2025-03-21T06:09:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3ae1d7ec668cd9c4dc513dd5abad413223ece44e",
          "body": "…#65)\n\nBumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 6.5.1 to 6.5.2.\n- [Release notes](https://github.com/golangci/golangci-lint-action/releases)\n- [Commits](https://github.com/golangci/golangci-lint-action/compare/v6.5.1...v6.5.2)\n\n---\nupdated-dependen\n[…]\nirect:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump golangci/golangci-lint-action from 6.5.1 to 6.5.2 (…",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2025-03-21T06:08:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bd9b32c27b1bb7a07545787d2911d0b2a5eae835",
          "body": "…1.11.0 to 1.12.0 (#67)\n\nbuild(deps): bump github.com/hashicorp/terraform-plugin-testing\n\nBumps [github.com/hashicorp/terraform-plugin-testing](https://github.com/hashicorp/terraform-plugin-testing) from 1.11.0 to 1.12.0.\n- [Release notes](https://github.com/hashicorp/terraform-plugin-testing/releas\n[…]\nirect:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump github.com/hashicorp/terraform-plugin-testing from …",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2025-03-21T06:08:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b585a209aa55a607986a0c22094d395d04ef5237",
          "body": "Bumps the go_modules group with 2 updates: [github.com/containerd/containerd/v2](https://github.com/containerd/containerd) and [github.com/docker/buildx](https://github.com/docker/buildx).\n\n\nUpdates `github.com/containerd/containerd/v2` from 2.0.2 to 2.0.4\n- [Release notes](https://github.com/contai\n[…]\n\n  dependency-type: indirect\n  dependency-group: go_modules\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump the go_modules group with 2 updates (#64)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2025-03-21T06:01:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "45ba7aace95cac7eb0deedc0f8102b527d2b24b7",
          "body": "* feat: support Firewall Zone resource and datasource\n\n* disable flaky test",
          "is_bot": false,
          "headline": "feat: support Firewall Zone resource and datasource (#70)",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-21T06:00:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca21f7908315c90ade075b803366db6b5079cc6b",
          "body": "…ss` (#61)\n\n* feat: support Guest Access settings with `resource_setting_guest_access`\n\n* feat: add support for redirect after authentication in guest access settings\n\n* feat: add support for Facebook authentication in guest access settings\n\n* feat: add support for Google authentication in guest acc\n[…]\nal\n\n* feat: retry client action on HTTP 401, but first attempt relogging in\n\n* require controllr version 7.4 for several portal customization attributes\n\n* enable acceptance tests workflow concurrency",
          "is_bot": false,
          "headline": "feat: support Guest Access settings with `resource_setting_guest_acce…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-17T13:53:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "28d28f17f6a914c0093e53cf9ca5bd56e0893bde",
          "body": "…nd UPNP enabled fields only computed (#60)\n\n* feat: simplify setting_usg resource by making geo IP fitering and UPNP enabled fields only computed\n\n* rename block to mode",
          "is_bot": false,
          "headline": "feat: simplify unifi_setting_usg resource by making geo IP fitering a…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-16T22:56:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "02d10929c9306ed4a66f68a47a08ec161840b0aa",
          "body": "…e (#58)",
          "is_bot": false,
          "headline": "feat: remove filter from dns_record datasource and use plain structur…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-16T15:25:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b269563553b9b3111b117215b749369eae691c36",
          "body": null,
          "is_bot": false,
          "headline": "ci: remove constraint on acceptance tests parallelism (#59)",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-16T14:55:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ff14bd365f72c1e39e29ebaabb38e39a05d22c3f",
          "body": "…(#57)\n\n* fix: user `ip` in user datasource is populated with `localDnsRecord`\n\n* add test",
          "is_bot": false,
          "headline": "fix: user `ip` in user datasource is populated with `localDnsRecord` …",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-16T13:08:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e9600c6e0687054fb89e9033b413118c3c3d0b16",
          "body": "… `unifi_setting_ips` resource (#56)\n\n* feat: add support for Intrution Prevention System (IPS) settings with `unifi_setting_ips` resource\n\n* require IPS features enabled on controller\n\n* require version 7.4\n\n* require version 7.5 for advanced_filtering_preference\n\n* feat: use Remember Me to prolong session for user/pass authentication\n\n* run some setting mgmt tests on 7.0+ due to auto_upgrade_hour not working until device is adopted and auto upgrade logic is different and not supported",
          "is_bot": false,
          "headline": "feat: add support for Intrution Prevention System (IPS) settings with…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-16T11:53:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8b6ff55a18da0c370467900cd1bcee05f2de377c",
          "body": "…source_setting_mgmt` (#54)\n\n* feat: completely support for all site-wide management settings in resource_setting_mgmt\n\n* require controller version minimum 7.3 for debug_tools_enabled",
          "is_bot": false,
          "headline": "feat: completely support for all site-wide management settings in `re…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-15T09:47:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fbb6296e9e704a2ea6e6e06c3dfd5158548f1b91",
          "body": null,
          "is_bot": false,
          "headline": "refactor: migrate resource_setting_mgmt to Terraform Plugin Framework",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-14T09:17:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "65f30999e91d2c0abe83fb9a02a8157c99357b79",
          "body": "…#48)\n\nBumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 6.5.0 to 6.5.1.\n- [Release notes](https://github.com/golangci/golangci-lint-action/releases)\n- [Commits](https://github.com/golangci/golangci-lint-action/compare/v6.5.0...v6.5.1)\n\n---\nupdated-dependen\n[…]\nirect:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump golangci/golangci-lint-action from 6.5.0 to 6.5.1 (…",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2025-03-14T06:32:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "55e6bbb4e99cc83cba9d226426ccc1bf3743fae8",
          "body": "…64.7 (#49)\n\nbuild(deps): bump github.com/golangci/golangci-lint\n\nBumps [github.com/golangci/golangci-lint](https://github.com/golangci/golangci-lint) from 1.64.6 to 1.64.7.\n- [Release notes](https://github.com/golangci/golangci-lint/releases)\n- [Changelog](https://github.com/golangci/golangci-lint/\n[…]\nirect:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump github.com/golangci/golangci-lint from 1.64.6 to 1.…",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2025-03-14T06:30:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7440febd101afa764d437213164cf3683f2e4a1f",
          "body": "…_usw` resource (#53)",
          "is_bot": false,
          "headline": "feat: add support for UniFi Switch (USW) settings with `unifi_setting…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-14T06:19:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "34c495021fbf84ba1b9470ba5b077eee69913f61",
          "body": null,
          "is_bot": false,
          "headline": "fix: invalid handling of site of DNS resource and datasources (#52)",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-14T00:03:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d1643ed8058fbd95f19bc692f2fe96a56fd6cd0",
          "body": "…icResource (#51)",
          "is_bot": false,
          "headline": "refactor: move BaseSettingResource to reusable in broader scope Gener…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-13T23:34:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9f2573d72c361ce7afb36cb62a42d9fc254f997c",
          "body": "…log` resource (#47)\n\n* feat: add support for Remote Syslog settings with `unifi_setting_rsyslog` resource\n\n* set controller version constraint on 8.5 for rsyslogd\n\n* require controller version 7.2 for teleport\n\n* fix: use dedicated site for USG setting tests to not interfere with other resources",
          "is_bot": false,
          "headline": "feat: add support for Remote Syslog settings with `unifi_setting_rsys…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-11T23:59:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f82bce6de0629f03626416c3274e82449ca39ced",
          "body": "…fi_setting_dpi` resource (#45)",
          "is_bot": false,
          "headline": "feat: add support for Deep Packet Inspection (DPI) settings with `uni…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-11T10:33:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72dcdd03cef75063b3d960df80b192b3ee5f5f11",
          "body": "…lcd_monitor` resource (#46)",
          "is_bot": false,
          "headline": "feat: add support for LCD Monitor (LCM) settings with `unifi_setting_…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-11T10:07:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fcea1e0ba41c6e91da50a25c6123f403de153009",
          "body": "* feat: add support for UPNP and Geo IP filtering to USG settings resource\n\n* feat: support complete USG settings resource\n\n* fix messages in required_together_if.go\n\n* improve docs of USG resource\n\n* tests: require version at least 9.0 for unbind_wan_monitors\n\n* feat: require version at least 8.5 for dns_verification\n\n* fix: use go-unifi 1.5.2 to fix NTP\n\n* require 7.0 or later for timeout preference\n\n* require 7.0 or later for geo IP filtering",
          "is_bot": false,
          "headline": "feat: support complete USG resource (#44)",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-11T01:17:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "35c74bf59d272e24cd30ec44520f2446c752cfc0",
          "body": "…(#42)\n\n* refactor: migrate USG setting resource to Terraform Plugin Framework\n\n* remove setting_usg from old provider\n\n* add USG resource to provider v2",
          "is_bot": false,
          "headline": "refactor: migrate USG setting resource to Terraform Plugin Framework …",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-05T11:38:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb8fc3871ea319e132ad4a71a2b51cf405fb0d06",
          "body": "Bumps [github.com/filipowm/go-unifi](https://github.com/filipowm/go-unifi) from 1.4.0 to 1.5.0.\n- [Release notes](https://github.com/filipowm/go-unifi/releases)\n- [Changelog](https://github.com/filipowm/go-unifi/blob/main/.goreleaser.yaml)\n- [Commits](https://github.com/filipowm/go-unifi/compare/v1.\n[…]\nirect:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump github.com/filipowm/go-unifi from 1.4.0 to 1.5.0 (#40)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2025-03-03T21:10:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7856ec47644e8c99aad54733c3f64c07f17566fb",
          "body": "* feat: add Telepor support with `unifi_setting_teleport` resource\n\n* add cidr validators\n\n* fix teleport tests by specifying version constraints\n\n* fix teleport version needed\n\n* require version 7.1\n\n* lint",
          "is_bot": false,
          "headline": "feat: add Teleport support with `unifi_setting_teleport` resource (#39)",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-03T20:08:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5da978a5d381bc6dbe6f4b82474e336cc291e195",
          "body": "…pection` resource (#38)\n\n* feat: add SSL inspection resource support with `unifi_setting_ssl_inspection` resource\n\n* add version contstraint",
          "is_bot": false,
          "headline": "feat: add SSL inspection resource support with `unifi_setting_ssl_ins…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-02T19:46:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a87f28545f9b3c4dadf8f2ee5786e73ffd3420e",
          "body": "…0.1 to 0.21.0 (#33)\n\nbuild(deps): bump github.com/hashicorp/terraform-plugin-docs\n\nBumps [github.com/hashicorp/terraform-plugin-docs](https://github.com/hashicorp/terraform-plugin-docs) from 0.20.1 to 0.21.0.\n- [Release notes](https://github.com/hashicorp/terraform-plugin-docs/releases)\n- [Changelo\n[…]\nirect:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump github.com/hashicorp/terraform-plugin-docs from 0.2…",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2025-03-02T17:21:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ef2221cab9b99c1cab8948d11615bbc12988f0af",
          "body": "…etwork_optimization` resource (#37)\n\n* feat: add network optimization resource support with `unifi_setting_network_optimization` resource",
          "is_bot": false,
          "headline": "feat: add network optimization resource support with `unifi_setting_n…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-02T00:41:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8b5ed14d8dbb3311a50c0f74c2b71f3c152af7c2",
          "body": "…rce (#36)\n\n* feat: add NTP setting resource support with `unifi_setting_ntp` resource\n\n* linting\n\n* fix missing method\n\n* add missing validators",
          "is_bot": false,
          "headline": "feat: add NTP setting resource support with `unifi_setting_ntp` resou…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-02T00:10:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a78667e6693c0f8777b2e3fe1acd046c7a9269f6",
          "body": "…_setting_magic_site_to_site_vpn` resource (#35)\n\n* feat: add magic site-to-site VPN setting resource support with `unifi_setting_magic_site_to_site_vpn` resource\n\n* do not use default\n\n* require controller version >=7.4 for magic site to site vpn tests",
          "is_bot": false,
          "headline": "feat: add magic site-to-site VPN setting resource support with `unifi…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-01T22:12:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f815ffef794b3f2db144e5f9b2af1f9ce71e272d",
          "body": "… resource (#34)\n\n* feat: add locale setting resource support with `unifi_setting_locale` resource\n\n* lint",
          "is_bot": false,
          "headline": "feat: add locale setting resource support with `unifi_setting_locale`…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-01T17:03:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "273d0dadddcedec87ce5090e413f828a7e382f35",
          "body": "…tting_auto_speedtest` resource (#32)\n\n* feat: add automatic speedtest setting resource support with `unifi_setting_auto_speedtest` resource\n\n* restore lowered test paralellism\n\n* refactoring and fixes\n\n* fix speedtest after refactor\n\n* run speedtest test on versions [7.2,7.4.156), cause later it was removed from USG which is used in tests",
          "is_bot": false,
          "headline": "feat: add automatic speedtest setting resource support with `unifi_se…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-03-01T14:38:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a36940b01905d41c33b1077023b6d62560ee3517",
          "body": "…y` resource (#31)\n\n* feat: add country setting resource support with `unifi_setting_country` resource\n\n* linting",
          "is_bot": false,
          "headline": "feat: add country setting resource support with `unifi_setting_countr…",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-02-27T01:56:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ccac6edebe50542623d8eca5cd7a4fbb55792b0d",
          "body": "* ci: try to fix text file busy error\n\n* set up terraform explicitly before running tests\n\n* remove limitation on parallel tests run",
          "is_bot": false,
          "headline": "ci: fix text file busy error causing test flakiness (#30)",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-02-26T19:22:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5cf4ea69ade4589826bc8523dc3006859e3c69bd",
          "body": null,
          "is_bot": false,
          "headline": "docs: add missing contributing file",
          "author_name": "Mateusz Filipowicz",
          "author_login": "filipowm",
          "committed_at": "2025-02-26T17:57:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 3,
      "commits_last_year": 59,
      "latest_release_at": "2026-07-02T19:32:07Z",
      "latest_release_tag": "v1.1.0",
      "releases_from_tags": true,
      "days_since_last_push": 7,
      "active_weeks_last_year": 7,
      "days_since_latest_release": 24,
      "mean_days_between_releases": 247
    },
    "community": {
      "has_readme": false,
      "has_license": false,
      "has_description": false,
      "has_contributing": false,
      "health_percentage": null,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/filipowm/terraform-provider-unifi",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": false,
          "registry_url": "https://pkg.go.dev/github.com/filipowm/terraform-provider-unifi",
          "is_deprecated": false,
          "latest_version": "v1.1.0",
          "repository_url": "https://github.com/filipowm/terraform-provider-unifi",
          "versions_count": 3,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-02T19:32:07Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 24
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 69885,
      "source_files_sampled": 182,
      "oversized_source_files": 2,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 3594
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/apparentlymart/go-cidr",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.1"
        },
        {
          "name": "github.com/biter777/countries",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.7.5"
        },
        {
          "name": "github.com/deckarep/golang-set/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.9.0"
        },
        {
          "name": "github.com/filipowm/go-unifi/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.3.0"
        },
        {
          "name": "github.com/hashicorp/go-cty",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.5.0"
        },
        {
          "name": "github.com/hashicorp/go-version",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.9.0"
        },
        {
          "name": "github.com/hashicorp/terraform-plugin-docs",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.25.0"
        },
        {
          "name": "github.com/hashicorp/terraform-plugin-framework",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.19.0"
        },
        {
          "name": "github.com/hashicorp/terraform-plugin-framework-validators",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.19.0"
        },
        {
          "name": "github.com/hashicorp/terraform-plugin-go",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.31.0"
        },
        {
          "name": "github.com/hashicorp/terraform-plugin-log",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.10.0"
        },
        {
          "name": "github.com/hashicorp/terraform-plugin-mux",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.23.1"
        },
        {
          "name": "github.com/hashicorp/terraform-plugin-sdk/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.40.1"
        },
        {
          "name": "github.com/hashicorp/terraform-plugin-testing",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.16.0"
        },
        {
          "name": "github.com/stretchr/testify",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.11.1"
        },
        {
          "name": "github.com/testcontainers/testcontainers-go",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.43.0"
        },
        {
          "name": "github.com/testcontainers/testcontainers-go/modules/compose",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.43.0"
        },
        {
          "name": "golang.org/x/crypto",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.53.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": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 2,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "paultyng",
          "commits": 210,
          "avatar_url": "https://avatars.githubusercontent.com/u/422474?v=4"
        },
        {
          "type": "User",
          "login": "filipowm",
          "commits": 96,
          "avatar_url": "https://avatars.githubusercontent.com/u/20795389?v=4"
        },
        {
          "type": "User",
          "login": "joshuaspence",
          "commits": 58,
          "avatar_url": "https://avatars.githubusercontent.com/u/234676?v=4"
        },
        {
          "type": "User",
          "login": "kurtmc",
          "commits": 11,
          "avatar_url": "https://avatars.githubusercontent.com/u/2661907?v=4"
        },
        {
          "type": "User",
          "login": "ziporah",
          "commits": 11,
          "avatar_url": "https://avatars.githubusercontent.com/u/3773929?v=4"
        },
        {
          "type": "User",
          "login": "jamestoyer",
          "commits": 9,
          "avatar_url": "https://avatars.githubusercontent.com/u/380725?v=4"
        },
        {
          "type": "User",
          "login": "steverice",
          "commits": 7,
          "avatar_url": "https://avatars.githubusercontent.com/u/1423851?v=4"
        },
        {
          "type": "User",
          "login": "cgerling",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/13140497?v=4"
        },
        {
          "type": "User",
          "login": "MaienM",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/583129?v=4"
        },
        {
          "type": "User",
          "login": "Tommi2Day",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/6551445?v=4"
        }
      ],
      "contributors_sampled": 33,
      "top_contributor_share": 0.476
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "acctest.yml",
        "ci.yaml",
        "conventional-release.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".golangci.yaml"
      ],
      "has_editorconfig": true,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 8 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": 10,
            "reason": "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": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 10,
            "reason": "all dependencies are pinned",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 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": "11 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "70cc40ccebfacb3167de023059d7e82ebde01316",
        "ran_at": "2026-07-27T12:29:30Z",
        "aggregate_score": 3.9,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-26T14:29:36Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": "FAILURE",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/cgerling/terraform-provider-unifi",
    "host": "github.com",
    "name": "terraform-provider-unifi",
    "owner": "cgerling"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 46,
      "inputs": {
        "security": 39,
        "vitality": 63,
        "community": 12,
        "governance": 40,
        "engineering": 69
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 63,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 57,
            "inputs": {
              "commits_last_year": 59,
              "human_commit_share": 0.85,
              "days_since_last_push": 7,
              "active_weeks_last_year": 7
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 7 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 7
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "7/52 weeks with commits",
                "points": 4.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 7
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "59 commits in the last year",
                "points": 16,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 59
                    }
                  }
                ],
                "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": "good",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 72,
            "inputs": {
              "releases_count": 3,
              "latest_release_tag": "v1.1.0",
              "releases_from_tags": true,
              "days_since_latest_release": 24,
              "mean_days_between_releases": 247
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "3 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 24 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 24
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~247 days",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 247
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 12,
        "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": "critical",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "has_readme": false,
              "has_license": false,
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MPL-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MPL-2.0"
                    }
                  }
                ],
                "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": "at_risk",
        "name": "Sustainability & Governance",
        "value": 40,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "moderate",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "bus_factor": 2,
              "contributors_sampled": 33,
              "top_contributor_share": 0.476
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "2 contributor(s) cover half of all commits",
                "points": 25.2,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 48% of commits",
                "points": 11.8,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 48
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "33 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 33
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 8 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "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": 55,
            "inputs": {
              "followers": 52,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "cgerling",
              "public_repos": 21,
              "account_age_days": 4043
            },
            "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": "52 followers of cgerling",
                "points": 12.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 52,
                      "login": "cgerling"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "21 public repos, account ~11 yr old",
                "points": 21.8,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 21
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 11
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 69,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 88,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": true,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "4 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "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": ".golangci.yaml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yaml"
                    }
                  }
                ],
                "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": 6.4,
                "status": "met",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "at_risk",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": "https://registry.terraform.io/providers/filipowm/unifi/latest/docs",
              "has_readme": false,
              "has_docs_dir": true,
              "has_description": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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://registry.terraform.io/providers/filipowm/unifi/latest/docs",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 39,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 39,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 3.9
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 8 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": "update tool detected",
                "points": 7.5,
                "status": "met",
                "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 not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "all dependencies are pinned",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "11 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": 13
            },
            "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": "excellent",
        "name": "AI Readiness",
        "value": 86,
        "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.976,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 3594
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.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": "83 of 85 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 83,
                      "sampled": 85
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "excellent",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.36,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0.15
            },
            "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": ".golangci.yaml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yaml"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "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": "36 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 36,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "15 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 15,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "all dependencies are pinned",
                "points": 10,
                "status": "met",
                "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": 69885,
              "source_files_sampled": 182,
              "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/182 source files over 60KB",
                "points": 54.4,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 182,
                      "oversized": 2
                    }
                  }
                ],
                "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": [
    "Community profile unavailable",
    "go package 'github.com/filipowm/terraform-provider-unifi' points at a different repository (https://github.com/filipowm/terraform-provider-unifi); 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-27T12:29:46.480246Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/c/cgerling/terraform-provider-unifi.svg",
  "full_name": "cgerling/terraform-provider-unifi",
  "license_state": "standard",
  "license_spdx": "MPL-2.0"
}

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.