Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-26 05:13 UTC

shin1ohno / terraform-provider-rtx

Terraform provider for managing Yamaha RTX series routers

GoMIT★ 1 star⑂ 1 forksince Aug 2025View on GitHub ↗

shin1ohno/terraform-provider-rtx holds a health index of 55 out of 100, placing it in the Moderate band. It scores highest on Engineering Quality (84/100) and lowest on Community & Adoption (24/100). It was last updated 21 days ago. A single contributor accounts for most of its recent work.

55
overall / 100
Moderate

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

55
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

Ohno Shin'ichiPersonal account
8 followers55 public repossince Aug 2011

This repository is owned by a personal account. A single-owner project carries more continuity risk than an organization-backed one.

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

80Good · 22% of overall
How it's scored
28.8/36Push recency — last push 21 days ago
11.1/36Commit cadence — 16/52 weeks with commits
18/18Commit volume — 316 commits in the last year
10/10OpenSSF Scorecard: Maintained — 20 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year316
human_commit_share1
days_since_last_push21
active_weeks_last_year16
How it's scored
27/27Ships releases — 32 releases published
36/36Release recency — latest release 21 days ago
27/27Release cadence — a release every ~4.8 days
8/10OpenSSF Scorecard: Signed-Releases — 5 out of the last 5 releases have a total of 5 signed artifacts.
Inputs used
releases_count32
latest_release_tagv0.15.2
releases_from_tagsno
days_since_latest_release21
mean_days_between_releases4.8

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

24Critical · 18% of overall
How it's scored
0/60Stars — 1 stars
0/25Forks — 1 forks
0/15Watchers — 0 watchers
Inputs used
forks1
stars1
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

43At risk · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
0.1/22.5Commit distribution — top contributor authored 100% of commits
2.7/13.5Contributor breadth — 2 contributors
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Inputs used
bus_factor1
contributors_sampled2
top_contributor_share0.997
How it's scored
0/46.8Issue resolution — no issues or no data
38.2/38.3PR acceptance — 18/18 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 1/30 approved changesets -- score normalized to 0
Inputs used
merged_prs18
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
6.9/25Owner reach — 8 followers of shin1ohno
24.7/25Track record — 55 public repos, account ~14 yr old
Inputs used
followers8
owner_typeUser
is_verified
owner_loginshin1ohno
public_repos55
account_age_days5,463
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.

Engineering Quality

Are baseline engineering and documentation practices in place?

84Good · 20% of overall
How it's scored
24/24CI workflows — 2 workflow(s)
24/24Tests present
16/16Linter config — .golangci.yml
0/9.6Pre-commit hooks
0/6.4.editorconfig
16/20OpenSSF Scorecard: CI-Tests — 16 out of 18 merged PRs checked by a CI test -- score normalized to 8
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configyes
has_precommit_configno

Documentation

90Excellent
How it's scored
30/30README
25/25Documentation directory
15/15Documentation / homepage site — https://registry.terraform.io/providers/shin1ohno/rtx/latest
10/10Repository description
0/10Topics
10/10Wiki
Inputs used
topics
has_wikiyes
homepagehttps://registry.terraform.io/providers/shin1ohno/rtx/latest
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

39At risk · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2/2.5CI-Tests — 16 out of 18 merged PRs checked by a CI test -- score normalized to 8
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 1/30 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
7.5/7.5Maintained — 20 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
6/7.5Signed-Releases — 5 out of the last 5 releases have a total of 5 signed artifacts.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 33 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate3.9

AI Readiness

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.

79Good · 0% of overall
How it's scored
45/45Agent instructions — CLAUDE.md
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 98 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.98
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes7,168
How it's scored
18/18One-command bootstrap — Makefile
22/22Automated tests
11/11Lint / format config — .golangci.yml
11/11Static type checking — Go (statically typed)
10/10Reproducible environment — lockfile
10/10Demonstrated agent practice — 26 of the last 100 commits agent-authored or agent-credited
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfilesgo.sum
has_dockerfileno
typed_languageyes
bootstrap_filesMakefile
has_devcontainerno
has_linter_configyes
typecheck_configs
agent_commit_share0.26
toolchain_manifestsgo.mod
dependency_bot_commit_share0
How it's scored
45/45Type-checkable code — Go (statically typed)
54.4/55Manageable file sizes — 4/374 source files over 60KB
Inputs used
primary_languageGo
largest_source_bytes129,682
source_files_sampled374
oversized_source_files4
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — examples
Inputs used
example_dirsexamples
has_mcp_signalno
api_schema_files

Key facts

1GitHub stars
2contributors
316commits, last 12 months
21days since last push
32releases
1bus factor
0open issues
Gopackage ecosystems

Data collection warnings

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • Could not fetch go package 'github.com/sh1/terraform-provider-rtx' from its registry
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

More detail

OpenSSF Scorecard 3.9 / 10
3.9aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-26 05:13 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
8CI-Tests16 out of 18 merged PRs checked by a CI test -- score normalized to 8
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 1/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained20 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
8Signed-Releases5 out of the last 5 releases have a total of 5 signed artifacts.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities33 existing vulnerabilities detected
Direct dependencies 9
RegistryPackageVersion constraintManifest
Gogithub.com/hashicorp/terraform-plugin-docsv0.24.0go.mod
Gogithub.com/hashicorp/terraform-plugin-frameworkv1.16.1go.mod
Gogithub.com/hashicorp/terraform-plugin-framework-validatorsv0.19.0go.mod
Gogithub.com/hashicorp/terraform-plugin-gov0.29.0go.mod
Gogithub.com/pkg/sftpv1.13.10go.mod
Gogithub.com/rs/zerologv1.34.0go.mod
Gogithub.com/stretchr/testifyv1.10.0go.mod
Gogolang.org/x/cryptov0.42.0go.mod
Gogopkg.in/yaml.v3v3.0.1go.mod
All dependencies not collected

The resolved dependency set could not be collected for this report: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 4334,
      "has_wiki": true,
      "homepage": "https://registry.terraform.io/providers/shin1ohno/rtx/latest",
      "languages": {
        "Go": 3669117,
        "Makefile": 873
      },
      "pushed_at": "2026-07-05T01:27:38Z",
      "created_at": "2025-08-13T05:05:11Z",
      "owner_type": "User",
      "updated_at": "2026-07-04T17:50:29Z",
      "description": "Terraform provider for managing Yamaha RTX series routers",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Ohno Shin'ichi",
      "type": "User",
      "login": "shin1ohno",
      "company": null,
      "location": null,
      "followers": 8,
      "avatar_url": "https://avatars.githubusercontent.com/u/972846?v=4",
      "created_at": "2011-08-11T01:38:15Z",
      "is_verified": null,
      "public_repos": 55,
      "account_age_days": 5463
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.15.2",
          "kind": "patch",
          "published_at": "2026-07-05T01:33:07Z"
        },
        {
          "tag": "v0.15.1",
          "kind": "patch",
          "published_at": "2026-06-02T15:15:29Z"
        },
        {
          "tag": "v0.15.0",
          "kind": "minor",
          "published_at": "2026-05-31T15:41:01Z"
        },
        {
          "tag": "v0.14.5",
          "kind": "patch",
          "published_at": "2026-05-31T13:04:04Z"
        },
        {
          "tag": "v0.14.4",
          "kind": "patch",
          "published_at": "2026-05-31T08:23:19Z"
        },
        {
          "tag": "v0.14.3",
          "kind": "patch",
          "published_at": "2026-05-31T08:00:42Z"
        },
        {
          "tag": "v0.14.2",
          "kind": "patch",
          "published_at": "2026-05-31T06:19:17Z"
        },
        {
          "tag": "v0.14.1",
          "kind": "patch",
          "published_at": "2026-05-31T05:44:48Z"
        },
        {
          "tag": "v0.14.0",
          "kind": "minor",
          "published_at": "2026-05-30T13:51:26Z"
        },
        {
          "tag": "v0.13.1",
          "kind": "patch",
          "published_at": "2026-05-23T03:56:46Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-05-11T11:58:33Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-05-08T04:13:51Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-05-02T04:08:59Z"
        },
        {
          "tag": "v0.10.2",
          "kind": "patch",
          "published_at": "2026-02-09T13:00:54Z"
        },
        {
          "tag": "v0.10.1",
          "kind": "patch",
          "published_at": "2026-02-07T11:55:42Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-02-07T03:46:15Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-02-03T02:57:46Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-02-02T14:36:11Z"
        },
        {
          "tag": "v0.8.3",
          "kind": "patch",
          "published_at": "2026-02-01T14:44:38Z"
        },
        {
          "tag": "v0.8.2",
          "kind": "patch",
          "published_at": "2026-02-01T10:30:43Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2026-02-01T08:41:11Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-01-28T18:00:02Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2026-01-27T15:23:21Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-01-27T04:01:47Z"
        },
        {
          "tag": "v0.5.3",
          "kind": "patch",
          "published_at": "2026-01-25T16:57:44Z"
        },
        {
          "tag": "v0.5.2",
          "kind": "patch",
          "published_at": "2026-01-25T16:19:15Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2026-01-25T15:54:53Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-01-25T15:45:59Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-01-25T13:05:54Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2026-01-25T10:36:59Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-01-25T06:46:04Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-01-25T06:20:41Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "0eebaf805cc14ff1aece7d6417af3559221791bc",
          "body": "…acency (#18)\n\nPR #17 inserted the rtxServicePorts var + resolvePort func between the\nParseNATMasqueradeConfig doc comment and its function, detaching the comment.\nrevive (golangci-lint) then flagged 'exported function ParseNATMasqueradeConfig\nshould have comment or be unexported', failing Lint Chec\n[…]\nnk line\nbetween the comment and func, so the doc comment sits immediately before\nParseNATMasqueradeConfig again. Verified locally with golangci-lint v1.64.8\n(run ./... = 0 issues). No behavior change.",
          "is_bot": false,
          "headline": "fix(nat_masquerade): restore ParseNATMasqueradeConfig doc-comment adj…",
          "author_name": "Ohno Shin'ichi",
          "author_login": "shin1ohno",
          "committed_at": "2026-07-04T17:50:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "afd6412e74ce2ccb5212cf03ca91e98f9035a436",
          "body": "…ke retries, sequence_step, keyword ports (#17)\n\n* fix(ip_filter): normalize `established` keyword in protocol slot\n\nRTX `show config` emits established filters as `ip filter N action src dst\nestablished * *`, putting the `established` keyword in the protocol slot. The\nparser left Protocol=\"establis\n[…]\nession test.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: hmdyt <me@hmdyt.dev>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix importing a real RTX1200 config: established filters, SSH handsha…",
          "author_name": "Hamada Yuto",
          "author_login": "hmdyt",
          "committed_at": "2026-07-04T17:29:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4a06c122ba8e351a95be342b4bf7087e0b8d63bd",
          "body": "…-config (#16)\n\nThe read-back after Create/Update (and the plan-time Read) parsed the\nSFTP-downloaded /system/config0, which lags the running config: the RTX\nflushes `save` to flash asynchronously (>300ms observed), so an immediate\nread-back races the save and parses the pre-write static_entry set. \n[…]\norm apply` now completes (0 added, 1 changed,\n0 destroyed) with no inconsistency error, and a follow-up plan reports\n\"No changes\".\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "nat_masquerade: read running config via SSH, not the stale SFTP saved…",
          "author_name": "Ohno Shin'ichi",
          "author_login": "shin1ohno",
          "committed_at": "2026-06-02T14:09:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "31b4c8b82a141313a7dc274e1795e2ceab159aad",
          "body": "…t) (#15)\n\nAdd optional list(string) attributes snmp_host and snmpv2c_host to\nrtx_snmp_server so the SNMPv1/SNMPv2c host access-control lines — which\ngate whether the RTX SNMP daemon answers queries at all — can be managed\ndeclaratively. These were out-of-band-only before; HND lost `snmp host\nany` o\n[…]\nrap Hosts), validation rejecting bare-IP snmp_host, Build<->Parse\nround-trip, console de-wrap, and model null-vs-empty invariants.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "snmp_server: manage SNMP host access-control (snmp host / snmpv2c hos…",
          "author_name": "Ohno Shin'ichi",
          "author_login": "shin1ohno",
          "committed_at": "2026-05-31T15:34:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b35346090d73871319adfe41e9cbf5c62857ea87",
          "body": "…d-back (#14)\n\nv0.14.4's dhcp de-wrap (PR #13) was ineffective on the live device and the dns\nparser's de-wrap was incomplete, so `terraform plan` still showed phantom\n+classless_static_routes and +server_select(aaaa) drift after apply.\n\nConfirmed from the provider's raw TF_LOG=debug read bytes:\n- R\n[…]\nim live RTX1210 read-back bytes (echo, wrap,\nprompt) for both rtx_dhcp_scope (option 121) and rtx_dns_server (IPv6 aaaa\nselector).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "parsers: shared, prompt-safe console de-wrap for dhcp_scope + dns rea…",
          "author_name": "Ohno Shin'ichi",
          "author_login": "shin1ohno",
          "committed_at": "2026-05-31T12:53:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "954efa642750198dfc150307fbc37c4dd0ed77c2",
          "body": "… survives (#13)\n\nThe post-apply read-back of rtx_dhcp_scope.classless_static_routes (option 121)\nreturned zero routes, producing \"Provider produced inconsistent result after\napply: .options.classless_static_routes: element N has vanished\" — the\nclean-plan half of the v0.14.2 failure (the crash half\n[…]\non tests reproduce the failure (0 routes without the de-wrap)\nfor single- and multi-line wraps, plus an unwrapped-unchanged guard.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "dhcp_scope: de-wrap RTX console line-wrapping so option-121 read-back…",
          "author_name": "Ohno Shin'ichi",
          "author_login": "shin1ohno",
          "committed_at": "2026-05-31T08:16:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "de39dde8a1793045d6d373753ed39881c3a84d82",
          "body": "…nt-result (#12)\n\nTwo bugs crashed `terraform apply` against rtx_dns_server.main and\nrtx_dhcp_scope.ebisu_main on provider v0.14.2.\n\n1. dns_server panic (nil pointer in reorderServerSelectToMatchPlan):\n   reorderedValues was pre-sized to len(planSelects) but only filled for plan\n   entries that matc\n[…]\negression tests reproduce both failures (the dns_server test panics without\nthe fix) and assert the corrected plan-ordered output.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "dns_server/dhcp_scope: fix v0.14.2 apply crash + classless inconsiste…",
          "author_name": "Ohno Shin'ichi",
          "author_login": "shin1ohno",
          "committed_at": "2026-05-31T07:50:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "658ee66d47dc35f4cdefe441ec3d87bc618f90d4",
          "body": "…#11)\n\nThe secure-filter READ parsers (Parse{Interface,InterfaceIPv6}SecureFilter[WithDynamic])\ntook the interface token straight from `ip|ipv6 <iface> secure filter` lines. For\ntunnel/pp interfaces RTX writes the filter as a BARE keyword (`ip tunnel secure\nfilter`) under a preceding `tunnel select \n[…]\ntParseInterfaceSecureFilter, plus\nTestParseSecureFilter_TunnelSelectContext_Variants covering the three previously\nuntested parser variants (with-dynamic + IPv6). go build/vet/test green; gofmt clean.",
          "is_bot": false,
          "headline": "parsers: track tunnel/pp select context when reading secure filters (…",
          "author_name": "Ohno Shin'ichi",
          "author_login": "shin1ohno",
          "committed_at": "2026-05-31T06:08:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3a63cad33b9e2b5c9e3ba317ca3a915ff2748183",
          "body": "…onsistent-result-after-apply (#10)\n\n* dhcp_scope: parse classless_static_route= read-back + options-only update on network drift (PARTIAL — Update read-back bug remains)\n\nTwo improvements toward managing DHCP option 121 via terraform, neither fully fixes the core bug:\n- parser: RTX accepts 'dhcp sc\n[…]\nusly reverted dns_servers, the read-back symptom.\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": "dhcp_scope/dns_server: read back from running config (SSH) to fix inc…",
          "author_name": "Ohno Shin'ichi",
          "author_login": "shin1ohno",
          "committed_at": "2026-05-31T05:38:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6a68db4ba62e4ad591e9311e685c70efe9f4b6ef",
          "body": "…) (#9)\n\n* dhcp_scope: support DHCP option 121 (RFC 3442 classless static routes)\n\nAdd a classless_static_routes attribute to the rtx_dhcp_scope options block so a scope can hand clients direct routes (e.g. 10.33.128.0/18 -> a LAN tailnet gateway), bypassing a router that won't hairpin. Encodes rout\n[…]\nic.com>\n\n* ci: auto-fix lint and regenerate files\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nCo-authored-by: shin1ohno <972846+shin1ohno@users.noreply.github.com>",
          "is_bot": false,
          "headline": "dhcp_scope: support DHCP option 121 (RFC 3442 classless static routes…",
          "author_name": "Ohno Shin'ichi",
          "author_login": "shin1ohno",
          "committed_at": "2026-05-30T13:46:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ff56b0426c4edb49250c72a5fb711da575e986db",
          "body": "Bug-fix release covering #7: tunnel parser now associates col-0\n`ipsec ike *` lines via their embedded gateway ID instead of\nsilently dropping them. Restores correct `ipsec.remote_address`\nhandling for L2TP/IPsec dial-up tunnels where RTX1210 dumps the\nIKE config outside the tunnel select block.",
          "is_bot": false,
          "headline": "release: bump version to 0.13.1 (#8)",
          "author_name": "Ohno Shin'ichi",
          "author_login": "shin1ohno",
          "committed_at": "2026-05-23T03:50:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5e3ea2210dc9443b6b1b9a2fc89e28587742a133",
          "body": "Real RTX1210 `/system/config0` places some `ipsec ike *` lines at\ncolumn 0 — outside any `tunnel select N` block — while related lines\nfor the same tunnel are inside the block. The parser's line-context\nreset clears currentTunnelID before reaching the col-0 lines, and\nall `currentTunnelID > 0` guard\n[…]\nlate correctly.\n\nOrigin: home-monitor `terraform apply` error\n\"Provider produced inconsistent result after apply\" on\nrtx_tunnel.remote_access (.ipsec.remote_address: was 'any', now\nnull) — 2026-05-23.",
          "is_bot": false,
          "headline": "tunnel: associate col-0 ipsec ike lines via embedded gateway ID (#7)",
          "author_name": "Ohno Shin'ichi",
          "author_login": "shin1ohno",
          "committed_at": "2026-05-23T03:46:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a0fa0658f1b969eb1fbeb7f09cd0c59ecd1437e0",
          "body": "Two breaking changes since 0.12.0:\n\n- dns_server: `hosts` block is now SetNestedBlock (was ListNestedBlock).\n  Existing state will trigger a one-time destroy+recreate of all host\n  entries on first apply after upgrade. Future entry additions no longer\n  cascade-recreate subsequent entries on alphabe\n[…]\n`syslog host <ip> <port>` as `host1 host2`).\n  Users with `port = N` in config must remove the line; state migrates\n  silently. #5\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: bump version to 0.13.0 (#6)",
          "author_name": "Ohno Shin'ichi",
          "author_login": "shin1ohno",
          "committed_at": "2026-05-11T11:52:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "75e22972fe1ef1487fe4b6f7bd7d9be47297a36c",
          "body": "BREAKING CHANGE. RTX firmware (RTX1210 Rev.14, RTX830 Rev.15) parses\n`syslog host <ip> <port>` as `host1 host2` (two host destinations, not\nhost+port). Specifying a non-default port produced two-IP rendering\nand zero-ingest at the intended receiver. The provider's\nBuildSyslogHostCommand already sile\n[…]\ng` output —\nSyslogHost.Port int field stays on the internal struct for roundtrip\nrobustness, just not surfaced to Terraform users.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "syslog: remove host.port from schema (#5)",
          "author_name": "Ohno Shin'ichi",
          "author_login": "shin1ohno",
          "committed_at": "2026-05-11T11:48:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4fb432f5bce77b1e346cfdc8a2646a16e1b2a428",
          "body": "BREAKING CHANGE. `hosts` was a `ListNestedBlock` which tracks elements\nby index. Consumers using `dynamic \"hosts\" { for_each = sorted_map }`\nwould see Terraform plan destroy+recreate for every entry whose\nalphabetic position shifts when a new entry is inserted mid-list.\n\nRTX firmware treats each `dn\n[…]\nthe current churn\nshape — entry adds already trigger cascade recreates today. After this\nrelease, future entry adds will be clean.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "dns_server: hosts is now SetNestedBlock (#4)",
          "author_name": "Ohno Shin'ichi",
          "author_login": "shin1ohno",
          "committed_at": "2026-05-11T11:47:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2f01cbf0b3d078e9c63b6a42f332fe13a78262e1",
          "body": "Carries the empty-list-vs-null fix sweep:\n- snmp_server: Communities, Hosts, EnableTraps (PR #2)\n- access_list_ip_apply.Sequences,\n  access_list_ipv6_apply.Sequences,\n  access_list_extended_ipv6.Entries,\n  bgp.Neighbors, bgp.Networks,\n  dns_server.ServerSelect, dns_server.Hosts,\n  policy_map.Classes\n[…]\nm.Statistics (PR #3)\n\nResolves \"Provider produced inconsistent result after apply: was null,\nbut now cty.ListValEmpty(...)\" on every resource above when an Optional\nlist/set attribute is unset in HCL.",
          "is_bot": false,
          "headline": "release: bump version to 0.12.0",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-05-08T03:17:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8cd0de15ccb3dc4dad8bec5e4f25ace0b1419b2a",
          "body": "Mirror the snmp_server fix (commit 00c069b) in every resource where\nFromClient unconditionally produced an empty ListValue/SetValue when the\nrouter returned no entries. Without the prior-state check, Terraform's\nframework rejects the apply with:\n\n  Provider produced inconsistent result after apply\n \n[…]\nn place.\n\nAffected: 16 source files modified + 7 model_test.go added. 12 fields\nfixed across 8 resources. Tier 3 fields untouched.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "provider: sweep empty-list-vs-null fix across 8 remaining resources (#3)",
          "author_name": "Ohno Shin'ichi",
          "author_login": "shin1ohno",
          "committed_at": "2026-05-08T01:31:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "00c069b13501092a527614cd34865531f94501e8",
          "body": "…leTraps (#2)\n\nFromClient unconditionally produced cty.ListValEmpty when the router\nreturned no communities/hosts/traps, even when the config never set the\nattribute. Terraform's framework rejects this on apply with:\n\n  Provider produced inconsistent result after apply\n  .enable_traps: was null, but\n[…]\n including the exact regression case from the bug\n  report.\n\nBug report: docs/dev/drift-bug-report-2026-05-08-snmp-enable-traps.md\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "snmp_server: fix inconsistent result for empty Communities/Hosts/Enab…",
          "author_name": "Ohno Shin'ichi",
          "author_login": "shin1ohno",
          "committed_at": "2026-05-08T01:06:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a37d383308e5d919bd39a69745d585a5df72becd",
          "body": "…08) (#1)\n\nRecurrence of the empty-list-vs-null pattern fixed for rtx_tunnel in\ncommit 4030206 (2026-02-08). rtx_snmp_server was missed in that sweep\nand now surfaces during home-monitor apply with:\n\n  Provider produced inconsistent result after apply\n  .enable_traps: was null, but now cty.ListValEm\n[…]\nel.go:140 flagged for the same audit.\n\nNo code change in this PR — handover only. Implementation will\nfollow as a separate fix PR.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add drift bug report for rtx_snmp_server.enable_traps (2026-05-…",
          "author_name": "Ohno Shin'ichi",
          "author_login": "shin1ohno",
          "committed_at": "2026-05-08T01:06:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a393fafdbff67291e451b0cb8dcbeb53c1150cf4",
          "body": null,
          "is_bot": false,
          "headline": "release: bump version to 0.11.0",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-05-01T11:54:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "acd3b810e81ffc9ddc4a7b11fb3f68622fe5bb9b",
          "body": "RTX CLI does not accept `ip tunnel<N>` or `ip pp<N>` as tokens. The <N>\nmust come from a preceding `tunnel select <N>` / `pp select <N>`, with\nthe filter command written as the bare keyword (`ip tunnel secure\nfilter` / `ip pp secure filter`). Before this fix, binding a filter to\ntunnel1 or pp1 via r\n[…]\nd\nbridge interfaces are unchanged — `ip lan1 ...` and `ip bridge1 ...`\nremain valid forms. Tests cover tunnel/pp/bridge/lan cases.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ip_filter: use tunnel/pp select context for interface filter commands",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-04-21T17:50:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4a9af58faa94dc73841baa52d9126c7b22484c29",
          "body": "Use (type, name) as group key for dns static diff detection\nso that individual IPs within a multi-IP hostname can be\ncorrectly added or removed. Preserve previous state ordering\nof host entries in FromClient to prevent plan drift.",
          "is_bot": false,
          "headline": "dns_server: Group-based hosts update and ordering",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-26T12:53:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44cb0cebebc3ff854d25c372bd3593b03ea2c601",
          "body": "- Preserve previous state ordering in server_select entries\n- Extract buildServerSelectAttrValue helper to reduce duplication\n- Return errors from DNS delete commands instead of ignoring them\n- Add model_test.go for ordering logic\n- Clarify build command in CLAUDE.md",
          "is_bot": false,
          "headline": "dns_server: improve ordering stability and error handling",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-09T12:49:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "34b162f8b6ba3089d4c240bd286523d35d604102",
          "body": null,
          "is_bot": false,
          "headline": "release: bump version to 0.10.2",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-09T12:32:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e6dc70438758acad3f9156193e70b76e8007129b",
          "body": null,
          "is_bot": false,
          "headline": "takt: add session state files",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-09T11:44:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72c815f27c11449efa558158ca42235f1316c7ae",
          "body": null,
          "is_bot": false,
          "headline": "docs: add drift bug report for empty list fields",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-09T11:44:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e225e7acdf1b80380f08358fcafaee6604306a9",
          "body": null,
          "is_bot": false,
          "headline": "serena: update project config to new schema",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-09T11:44:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "176966cc19dcce6580882b18e6ba4a0a00806bc7",
          "body": "Extract repeated patterns (saveConfig, checkOutputError,\nrunCommand, runBatchCommands) into command.go and consolidate\nduplicate list-conversion helpers (IntSliceToList, ListToIntSlice,\nStringSliceToList, ListToStringSlice) into fwhelpers. Fix nil vs\nempty list semantics in model FromClient methods to prevent\nTerraform drift on empty lists.",
          "is_bot": false,
          "headline": "client,fwhelpers: extract shared command and list helpers",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-09T11:44:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4030206a56b2e6a19d7a8edca55cd933e39ec44c",
          "body": "buildTunnelIPsecCommands now generates delete commands\n(no ip tunnel secure filter in/out) when SecureFilterIn or\nSecureFilterOut is empty. Update() preserves planned secure\nfilter values after read-back to prevent state mismatch.",
          "is_bot": false,
          "headline": "tunnel: Fix inconsistent result for empty secure_filter",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-07T20:33:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b0936d6ace917f8b00ccbe3e2461b59bfc2c5708",
          "body": "- Add 6 missing resources to README table (tunnel, access_list\n  apply variants, sshd_authorized_keys, sshd_host_key)\n- Update supported RTX models (add vRX, RTX3510, RTX1300, RTX840;\n  remove NVR series)\n- Add 9 missing entries to examples table\n- Create 21 resource.tf files for tfplugindocs Example Usage\n- Regenerate all resource docs via go generate",
          "is_bot": false,
          "headline": "docs: add missing resources, examples, update models",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-07T12:57:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4ab31181587fcf871010c3cd01f104d748bac89d",
          "body": "Add type/ttl attributes to dns_server hosts schema\nto match RTX command reference (dns static <type> <name> <value> [ttl=<ttl>]).",
          "is_bot": false,
          "headline": "release: bump version to 0.10.1",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-07T11:46:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c630a8d2ad4ceee57d938ad5f0d1b6aaa6c889eb",
          "body": "- Add Type/TTL fields to dns static host commands\n- Remove DomainLookup (not in RTX reference)\n- Remove NSSA area tests (unsupported on RTX)\n- Remove ospf import from connected (invalid protocol)",
          "is_bot": false,
          "headline": "dns,ospf: align with RTX command reference",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-07T11:21:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f3b143dbdeed5894337d4c85b73798b58b4a07d6",
          "body": null,
          "is_bot": false,
          "headline": "takt: dns",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-07T10:07:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af6ff4d89db0f4ff876ad2f4dc6a5ec8bbe34dfc",
          "body": null,
          "is_bot": false,
          "headline": "takt: vlan",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-07T09:56:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f2142b4e608f567644843162983ea4de7e810f52",
          "body": null,
          "is_bot": false,
          "headline": "takt: ipv6",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-07T09:56:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5045d34b462adbb6e8537d44cc6636824f91fd14",
          "body": null,
          "is_bot": false,
          "headline": "takt: ospf",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-07T09:55:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2eb14d815bab868faa6b988d3944add3796f697c",
          "body": null,
          "is_bot": false,
          "headline": "takt: ddns",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-07T09:55:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b98bfe6cbc083fe3e7d3470dfc8a2b39f78aaf6e",
          "body": null,
          "is_bot": false,
          "headline": "takt: bgp",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-07T09:31:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c641737a0de394500aa9ec019206868bba1c8a2f",
          "body": "SESSION_PROGRESS.md was a temporary session log that is no longer\nneeded. Add .takt/config.yaml for workflow configuration.",
          "is_bot": false,
          "headline": "chore: remove SESSION_PROGRESS.md, add takt config",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-07T06:11:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "22fe8108e1bda310a4a50d7170663c7dd9d14a78",
          "body": "- management: add rtx_sshd_authorized_keys, rtx_sshd_host_key;\n  fix rtx_sftpd status to Implemented\n- access-list: add 5 resources (ip/ipv6/mac apply, ip/ipv6 dynamic);\n  integrate filter spec parsing reliability content\n- filter: deprecate spec (resource names mismatched implementation)\n- vpn: con\n[…]\nources not registered in provider\n- ipv6: add scope note (rtx_ipv6_prefix only)\n- All 16 categories: add 2026-02-07 audit Change History entry\n\nVerified: all 49 resources covered by at least one spec.",
          "is_bot": false,
          "headline": "master-specs: full audit against 49 resources",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-07T06:02:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "600575d0b7571afce5762174980600447fcdefe5",
          "body": null,
          "is_bot": false,
          "headline": "release: bump version to 0.10.0",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-07T03:35:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38ee20973adba425a29dcedb84f203d11eeb4d36",
          "body": "Fix ServiceManager to use the injected sftpClient field instead of\ncreating a new SFTP client from s.client.config, which caused nil\npointer dereference in tests.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: Use injected SFTP client instead of creating new connection",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-06T08:46:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "135c2a81f4523c7f350caec49645c8344ec349d6",
          "body": "RTX routers' interactive `import sshd authorized-keys` command cannot\nbe handled properly by the SSH executor's batch command mode. The router\nprompts for key input but the executor times out waiting for a command\nprompt that never comes.\n\nThis change implements SFTP-based authorized_keys import as \n[…]\nlback when SFTP is disabled.\n\nFixes the issue where authorized_keys appeared to be set successfully\nbut SSH public key authentication failed because the keys were never\nactually written to the router.",
          "is_bot": false,
          "headline": "service_manager: Use SFTP for authorized_keys import",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-05T14:58:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e3555f79e6484dc6d352910b55b0da57f0038383",
          "body": "RTX routers (particularly RTX1210 with OpenSSH_7.7) only support the\nlegacy ssh-rsa signature algorithm, not the newer rsa-sha2-256 or\nrsa-sha2-512 that modern OpenSSH clients default to.\n\nChanges:\n- Add HostKeyAlgorithms to ssh.ClientConfig with ssh-rsa as first option\n- Create legacyRSASigner wrap\n[…]\ndd comprehensive tests for the legacy signer functionality\n\nThis fixes public key authentication failures when using RSA keys with\nRTX routers.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: Add legacy ssh-rsa algorithm support for RTX router compatibility",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-03T15:08:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "04deed1b29bd45413f5c818f15499f2a4ee7b915",
          "body": null,
          "is_bot": false,
          "headline": "takt: add .gitignore for temporary files",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-03T02:49:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b0c0ac9f172668b1bfafe516a5f45a3aea03615",
          "body": null,
          "is_bot": false,
          "headline": "release: bump version to 0.9.1",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-03T02:44:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d61dd284e6ff49a5740ec4fb789bce372121a38",
          "body": "Add 32 new round-trip test files that verify bidirectional conversion\nbetween RTX router commands and Terraform values using actual parsers.\n\nEach test file includes:\n- TestXXXRoundTrip_Parse: RTX command -> Terraform value conversion\n- TestXXXRoundTrip_Build: Terraform value -> RTX command conversi\n[…]\nt_filter\n- Network: interface_config, ipv6_interface, ipv6_prefix, bridge\n- Services: service, snmp, syslog, system, schedule, qos\n- DDNS: ddns\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Add comprehensive round-trip tests for all RTX parser types",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-03T00:58:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a722f49ab7f429ecf40f76a094eacc6aa68f67fe",
          "body": "Add comprehensive round-trip tests that verify actual Parse/Build\nfunction implementations match the spec file expectations:\n\n- TestBGPRoundTrip_Parse: RTX command -> Terraform value\n- TestBGPRoundTrip_Build: Terraform value -> RTX command\n- TestBGPRoundTrip_ParseBuildParse: Full round-trip verifica\n[…]\nrm resource values.\n\nRed-Green cycle verified:\n- Tests fail when expectations are incorrect\n- Tests pass when expectations match implementation\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Add RTX-Terraform round-trip tests for BGP and VLAN parsers",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-03T00:12:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b2d0b4359cbeaaca1c7c7edd9f44f4e4397ae216",
          "body": "Add new test function TestSpec*RTXTerraformMapping that validates:\n- Each syntax test has a corresponding terraform value (except build_only)\n- Terraform JSON values are valid and non-empty\n- Documents bidirectional mapping between RTX commands and Terraform\n\nChanges:\n- Add toJSON and hasTerraform h\n[…]\nimport to generated tests\n- Skip terraform validation for build_only tests (delete commands)\n- Regenerate all 32 spec test files with new tests\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Add RTX-Terraform mapping validation tests to specgen",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-03T00:06:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "969206d032157c90e7ebe6e39c1faae74fcffa15",
          "body": "- Add TestSpec*RTXSyntax tests that validate RTX commands from specs\n- Each spec file now generates tests verifying:\n  - RTX commands are not empty\n  - No unexpected whitespace in single-line commands\n- Fix YAML errors in specs/dhcp/binding.yaml (duplicate description key)\n- Total: 32 spec files, 62\n[…]\nd syntax tests\n\nRed-Green verified:\n- Empty RTX command -> test fails with \"RTX command should not be empty\"\n- Valid RTX command -> test passes\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Add RTX command syntax validation tests",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-02T22:54:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a1a76f97cc0095382771d1d37cb1646131a40518",
          "body": "- Extend specgen to generate TestSpec*ModelCompatibility tests\n- Add model_support.go with IsModelSupported function\n- Define supported models based on spec file applicable_models\n- Tests verify supported models are recognized\n- Tests verify unsupported models are rejected\n\nSupported models: vRX, RTX5000, RTX3510, RTX3500, RTX1300,\nRTX1220, RTX1210, RTX840, RTX830\n\nOlder models not supported: RTX810, NVR700W, NVR510, NVR500\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Add router model compatibility tests to specgen",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-02T22:47:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ebd928f56565185fdb47be4a8736a84bd057e9d3",
          "body": "Add YAML spec files covering 21 parser categories:\n- Admin, BGP, Bridge, DDNS, DNS\n- Ethernet Filter, Interface, IP Filter\n- IPsec, IPv6, L2TP, NAT (masquerade/static)\n- OSPF, PPP, PPTP, Service, SNMP\n- Syslog, Tunnel, VLAN\n\nEach spec includes:\n- RTX command syntax patterns\n- Terraform resource mapping\n- Boundary value tests\n- Applicable router models\n\nAlso includes generated spec coverage test files.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Add complete spec files for all RTX command parsers",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-02T22:41:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b37240823b32297077cfdf2dfba00330306fe719",
          "body": "…IP route extensions\n\n## Changes\n\n### New Spec Files\n- specs/system/config.yaml: System configuration commands\n  - timezone, console character/lines/prompt\n  - system packet-buffer settings\n  - statistics traffic/nat commands\n  - 32 syntax test patterns, 5 boundary test parameters\n\n- specs/schedule/\n[…]\ntax patterns documented across 5 spec files\n- All parser tests pass (0.332s)\n- Spec coverage tests provide clear documentation of test coverage\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Add complete spec files for System, Schedule, QoS commands and …",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-02T16:34:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "182a05c6e43ede77266c8894b7d737e6deb6b81a",
          "body": "Add new parsers for DHCP commands:\n- dhcp_service.go: DHCP service mode (server/relay) configuration\n- dhcp_relay.go: DHCP relay server and select configuration\n- dhcp_lease_type.go: DHCP scope lease type (bind-only/bind-priority/lease-only)\n- dhcp_interface.go: Interface-specific DHCP service confi\n[…]\nfiers: \"dhcp scope bind N IP text STRING\"\n- Wildcard IP bindings: \"dhcp scope bind N * MAC\"\n\nUpdate spec files to reflect implemented features.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "dhcp: implement all DHCP command parsers and extend binding support",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-02T16:16:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b128d837b3ad2f9e43e21251fd95adcb0cb48830",
          "body": "Extend DHCP scope parser with:\n- MaxLeaseTime field for maxexpire parameter support\n- Gateway parsing in IP range format (start-end/mask)\n- Hostname option (DHCP option 12) parsing and building\n- WINSServers option (DHCP option 44) parsing and building\n- Option number aliases (3=router, 6=dns, 12=ho\n[…]\nacy) and expire/maxexpire parameters\n- DHCP options (dns, router, domain, hostname, wins_server)\n- Exclude ranges and multi-line configurations\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "dhcp: add maxexpire, hostname, wins_server support and specgen tool",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-02T16:10:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e1456508cabe415f68ee2d3cfe3e0bc94c24c0fe",
          "body": "New features:\n- SSH private key authentication support for provider\n- sshd_authorized_keys: separate key and comment attributes with\n  state migration from v0 to v1 schema",
          "is_bot": false,
          "headline": "release: bump version to 0.9.0",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-02T14:22:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e3fd08b71e4ff84cfba6e094915c35f91febfcc",
          "body": "Update tech.md and structure.md to reflect current implementation:\n- Go 1.24 and terraform-plugin-framework v1.16.1\n- Modular resource structure (resources/{name}/resource.go + model.go)\n- Plugin Framework patterns instead of deprecated SDK v2\n- Updated directory layout and naming conventions",
          "is_bot": false,
          "headline": "steering: update docs for Plugin Framework architecture",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-02T14:17:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6373184e6c14ed50734d77d547627f3397ded20b",
          "body": "Change keys from string list to object list with explicit key and\ncomment attributes. This better models RTX behavior where comments\ndefault to \"no comment\" and allows cleaner state management.\n\n- Schema v0->v1 migration via UpgradeState\n- Fix parser to handle comments without @ symbol\n- Add tests for \"no comment\" and plain text comments",
          "is_bot": false,
          "headline": "sshd_authorized_keys: separate key and comment in schema",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-02T14:13:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ed6e8888afb6fbe5103378115578a81d85afac3d",
          "body": "Allow connecting to RTX routers using SSH private keys instead of\npassword-only authentication. Users can now specify private_key or\nprivate_key_file in provider configuration.\n\n- Export BuildAuthMethods for reuse in client.go\n- Update validation to require password OR private key\n- Add debug logging with key fingerprint",
          "is_bot": false,
          "headline": "client: support private key authentication",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-02T14:13:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b99001924a8027287194d5127cd5f75e6531b6c0",
          "body": "Updates:\n- Makefile: VERSION=0.8.3\n- README.md: Installation paths and version references\n\nAlso includes:\n- Fix gofmt formatting in nat_masquerade files\n- Update nat_masquerade service tests for ipcp command format",
          "is_bot": false,
          "headline": "release: bump version to 0.8.3",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-01T14:37:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1cd661764c94ae23aebf545576682afe52fc05c2",
          "body": null,
          "is_bot": false,
          "headline": "access_list_mac: add Computed to filter_id attribute",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-01T14:26:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3c66affaa0591c84e0ea0cb43d42564ff773507",
          "body": "Update all 13 master spec design.md files to reflect the new\nresources/{name}/ modular structure:\n\n- routing: bgp/, ospf/, static_route/\n- vpn: ipsec_tunnel/, ipsec_transport/, l2tp/, l2tp_service/, pptp/\n- schedule: kron_schedule/, kron_policy/\n- filter: access_list_*_apply/, access_list_*_dynamic/\n[…]\n_map/, policy_map/, service_policy/, shape/\n\nAlso includes:\n- Access list attribute naming fixes (filter_ids -> sequences)\n- NAT masquerade \"primary\" validation fix\n- Documentation and example updates",
          "is_bot": false,
          "headline": "master-specs: sync file paths to modular structure",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-01T14:26:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "255579e9e55639c3f282f6f090bdd0ab3196ee5e",
          "body": null,
          "is_bot": false,
          "headline": "release: bump version to 0.8.2",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-01T09:51:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6589927ec890a64c422a30ddacdba0b9daafd4cf",
          "body": "- Update all specs to reference Terraform Plugin Framework (not SDK v2)\n- Mark unimplemented features in interface, ppp, and management specs\n- Fix attribute names in routing spec (neighbor.id→index, area.id→area_id)\n- Add rtx_sftpd implementation status to management spec\n- Clarify dhcp hostname/description as Terraform-only attributes\n- Update file structure references to modular pattern",
          "is_bot": false,
          "headline": "master-specs: audit and sync with current implementation",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-01T09:50:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b46fdc24d06e00d1113e19aa7ed4e0ad1630eb44",
          "body": "Audited and corrected 18 example files to match actual resource schemas.\n\nKey fixes:\n- admin: connection → connection_methods\n- bgp: address→ip, added required index, merged to singleton\n- dns_server: servers list → nested server blocks\n- interface: removed non-existent access_list_* attributes\n- ip\n[…]\nist reference\n- sftp-enabled: name→username, administrator=\"on\"→true\n- Added terraform/provider blocks to l2tp_service, snmp, syslog\n\nDeleted duplicate variables.tf files from bgp/ and ospf/ examples.",
          "is_bot": false,
          "headline": "examples: fix schema mismatches across all example files",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-01T09:21:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1e23af7006073c22a918b1c7960eb1bfc58152c9",
          "body": "Remove WriteOnly: true from password/pre_shared_key attributes across\n6 resources (ipsec_tunnel, admin_user, admin, pppoe, ddns, tunnel).\n\nThe Terraform Plugin Framework's WriteOnly attribute prevents values\nfrom being passed to the client layer during Update operations, causing\npassword changes to \n[…]\nte operations\nby storing values in terraform.tfstate (still marked Sensitive: true\nfor output masking).\n\nAlso adds unit tests for PPP and DDNS services to verify password\ninclusion in Update commands.",
          "is_bot": false,
          "headline": "resources: remove WriteOnly attribute to fix Update operations",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-01T09:07:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a2687f5d49f49cb436904a6b28c9f00e2d2c32a0",
          "body": "- Remove 'name' attribute from examples (Computed/read-only)\n- Add endpoint_name, nat_traversal to L2TPv3 example\n- Add required ipsec block to L2TPv2 example\n- Add rtx_tunnel to VPN master spec as recommended resource\n- Mark rtx_ipsec_tunnel and rtx_l2tp as deprecated\n- Update feature spec with new attributes and corrected schema\n- Mark completed tasks in tasks.md",
          "is_bot": false,
          "headline": "docs,examples: sync rtx_tunnel with implementation",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-01T08:56:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a64fef71fa4b12d0b60a22d4c493fe02aa49a30a",
          "body": null,
          "is_bot": false,
          "headline": "release: bump version to 0.8.1",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-01T08:34:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e0eb22b85fe8eec1107e94dbe012fcc0eb366c2c",
          "body": "- tunnel: add Computed to ike_remote_name and ike_remote_name_type\n- tunnel: add l2tpv3 to ike_remote_name_type validator\n- tunnel: remove WriteOnly from tunnel_auth.password (was not working on Update)\n- access_list_mac: filter entries by expected sequences in read\n- access_list_mac: preserve Applies from Plan/State instead of router\n- tunnel: remove unused buildTunnelDescription function",
          "is_bot": false,
          "headline": "tunnel,access_list_mac: fix inconsistent result after apply errors",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-01T08:34:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7272d26156959735aca8dcefa9b236bd52d137c7",
          "body": "Implement a new rtx_tunnel resource that combines IPsec and L2TP\nconfigurations under a single tunnel select N context, matching\nRTX's actual command structure.\n\nFeatures:\n- Support for ipsec, l2tpv3, and l2tp encapsulation types\n- Separate ipsec_tunnel_id from tunnel_id (IKE gateway ID)\n- WriteOnly\n[…]\nname attribute made read-only (RTX doesn't support description\n  in tunnel context)\n- Parser resets tunnel context on non-indented lines to prevent\n  global descriptions from being assigned to tunnels",
          "is_bot": false,
          "headline": "tunnel: add unified rtx_tunnel resource",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-02-01T04:30:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ff6af97e3027feec5b3bb8c9ccb9fd8f8cf6bb90",
          "body": "BuildShowIPsecConfigCommand now returns \"show config\" instead of\n\"show config | grep ipsec\". Updated test mock to match.\nAlso added IPsecTunnelID to expected result.",
          "is_bot": false,
          "headline": "ipsec_tunnel_service_test: update mock for show config command",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-31T14:13:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2bf4e52b234079d1817a400185402f552bf9269d",
          "body": "\"invalid\" is actually a valid RFC 1123 hostname (single-label hostname\nwithout TLD). Changed test values to \"not!valid\" which contains an\ninvalid character for hostnames.",
          "is_bot": false,
          "headline": "ipsec_tunnel_test: fix invalid hostname test cases",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-31T14:11:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "31db6ebcf74efa48bf8d816e8a0d55ea1e0a7613",
          "body": "The ipsec_tunnel_id attribute allows specifying the ipsec tunnel ID\nseparately from tunnel_id (tunnel select N). This is necessary when\nthe ipsec tunnel number differs from the tunnel select number.\n\nFor example:\n  tunnel select 1\n    ipsec tunnel 101  # ipsec_tunnel_id = 101\n\nPreviously, the provider used tunnel_id for both values, which was\nincorrect when they differed.",
          "is_bot": false,
          "headline": "ipsec_tunnel: add ipsec_tunnel_id attribute for explicit ipsec tunnel ID",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-31T14:09:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9fcebd09a67aa9402d76d0cc5c996898858ae3a9",
          "body": "Previously, CreateAccessListMAC and UpdateAccessListMAC only processed\nthe legacy single Apply field, ignoring the Applies slice. This caused\nissues when multiple apply blocks were specified (e.g., for different\ndirections in/out on the same interface).\n\nNow iterates over all Applies blocks first, with fallback to legacy\nApply field for backward compatibility.",
          "is_bot": false,
          "headline": "access_list_mac: process all Applies blocks in Create/Update",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-31T13:33:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8e63bae9129128d3634ff3f9e385504216e8a49b",
          "body": "- Fix SA policy parsing to look up tunnels by stored SAPolicy value\n  instead of directly using policyNum. This fixes the case where\n  ipsec tunnel ID differs from tunnel select ID.\n\n- Add Computed and UseStateForUnknown to name, local_address,\n  remote_address attributes to allow provider to read these values\n  from router without causing plan diffs.",
          "is_bot": false,
          "headline": "ipsec_tunnel: fix SA policy parsing and computed attributes",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-31T12:40:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "55f160fad772007381fc673ac5d9ef8a7f407a51",
          "body": "Add three new features to rtx_ipsec_tunnel resource:\n\n- secure_filter_in/out: IP filter IDs for tunnel traffic\n  (ip tunnel secure filter in/out <ids...>)\n- tcp_mss_limit: TCP MSS limit setting (ip tunnel tcp mss limit)\n- tunnel enable/disable: Generate tunnel enable N command\n\nAlso fix show config command to return full config instead of\ngrep-filtered output, which was causing tunnel_id to be null\nafter import.",
          "is_bot": false,
          "headline": "ipsec_tunnel: add secure_filter, tcp_mss_limit, and tunnel enable",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-31T12:28:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "09c0d0c0d102988dae998acc1c8443f75985683d",
          "body": "LNS mode uses pp auth username (configured separately) to authenticate\nincoming clients. pp auth myname is for outgoing connections and should\nnot be generated in LNS mode.\n\n- Remove BuildPPAuthMynameCommand calls for LNS mode\n- Add 'no pp auth myname' to delete any existing setting",
          "is_bot": false,
          "headline": "l2tp_service: remove pp auth myname for LNS mode",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-29T16:22:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a07ed0e05c88dc98ef90d1fdf08828d3ebc9dc1",
          "body": null,
          "is_bot": false,
          "headline": "docs: update ipsec_tunnel and l2tp resource documentation",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-29T16:00:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "189b32686b7771d10e04bd73a182158209c7267a",
          "body": "- Only send local_address command when value is not empty\n- Only send remote_address command when value is not empty\n- Prevents parameter errors on update operations",
          "is_bot": false,
          "headline": "ipsec_tunnel: fix address commands when values empty",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-29T16:00:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f0a051e332f94fd796f4d0cc860b8d7b6b9c7a9a",
          "body": "- Add RequestMethod field to L2TPAuth struct\n- Add request_method attribute to authentication schema\n- Update model conversion to include RequestMethod",
          "is_bot": false,
          "headline": "l2tp_resource: add request_method attribute for authentication",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-29T16:00:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "23365573d68d97c10df62a0f29efb50d40345b1d",
          "body": "- Add Japanese error patterns to containsError function\n- Add Japanese authentication failure detection in executors\n- Patterns: エラー:, 管理レベルでのみ使用できます, パスワードが違います",
          "is_bot": false,
          "headline": "executor: add Japanese error message detection",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-29T15:59:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1a8e5593551c3ed0f22625df31deea5f74f49cf",
          "body": "- Add RequestMethod field to L2TPAuth for pp auth request\n- Add ppAuthRequestPattern to parse pp auth request from config\n- Add BuildPPAuthRequestCommand for generating pp auth request\n- Add BuildDeletePPAuthAcceptCommand for removing pp auth accept\n- Add BuildIPPPRemotePoolDHCPCommand for dhcp pool setting",
          "is_bot": false,
          "headline": "l2tp_parser: add RequestMethod and delete commands",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-29T15:59:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce8542774981713c12e4f135550531df4edb4180",
          "body": "- Use RunBatch instead of individual Run calls to maintain PP context\n- Add 'pp select none' before save to exit PP anonymous context\n- Add explicit 'no pp auth accept' when auth method not specified\n- Add explicit 'ip pp remote address pool dhcp' when pool not specified\n- Add RequestMethod field support for authentication\n- Add debug logging for command execution",
          "is_bot": false,
          "headline": "l2tp_service: fix LNS config by using RunBatch and exiting PP context",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-29T15:59:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5c6ed195d8252facc9460856aa0ba3a509ce7a15",
          "body": "Update version numbers in all files:\n- Makefile VERSION variable\n- README.md installation examples\n- docs/index.md version constraint\n- All example files version constraints (~> 0.8)\n\nAlso fix lint errors in dns_server and static_route resources.",
          "is_bot": false,
          "headline": "release: bump version to 0.8.0",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-28T17:29:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc5ecbb80a95a20a3a018a7f725e44f6f696b7e1",
          "body": "Add RangeStart and RangeEnd fields to ToClient and fromParserScope\nmethods so that DHCP address range configuration is properly passed\nto the router.",
          "is_bot": false,
          "headline": "dhcp_scope: include range_start/end in client conversion",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-28T17:26:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5772b20d6771ab6121f70ad953cd903f6f60c358",
          "body": "Fix inconsistent state handling when router returns empty keys:\n- Check for both null and empty list in Create/Update\n- Preserve state keys in Read when router returns empty\n- Set empty list in read() to detect drift from desired state\n- Remove UseStateForUnknown modifier from key_count",
          "is_bot": false,
          "headline": "sshd_authorized_keys: improve state handling",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-28T17:26:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca4c738dad146fa9d3bddd61b6227e7f8809e26d",
          "body": "RTX routers require all gateways to be specified in a single command for\nECMP/failover routes. Previously, separate commands caused each gateway\nto overwrite the previous one.\n\nChanges:\n- Add BuildIPRouteCommandMultiHop for multiple next hops in one command\n- Update CreateRoute and UpdateRoute to use single multi-hop command\n- Invalidate cache after Create/Update to read latest config\n- Remove SFTP cache fallback in read to ensure fresh data",
          "is_bot": false,
          "headline": "static_route: fix multi-hop route creation",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-28T17:26:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0625490b343b2a607696bec54a6fc8a165d6aefb",
          "body": "Add auto-priority mode for server_select entries. When priority_start\nis set, priorities are automatically calculated based on entry order.\n\nChanges:\n- Add priority_start and priority_step attributes to the schema\n- Add autoPriorityPlanModifier for computed priority values\n- Sort server_select by ID for consistent ordering\n- Add reorderServerSelectToMatchPlan to preserve user-specified ordering\n- Validate auto/manual mode configuration consistency\n- Fix DNS IP validation to use isValidIPForDNS",
          "is_bot": false,
          "headline": "dns_server: add priority_start/step for auto priority",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-28T17:26:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2d5cf60a0e4b6957ef5bafa3ee3cc54db1cd8522",
          "body": "Add sequence_start and sequence_step attributes to dynamic ACL models\n(access_list_ip_dynamic and access_list_ipv6_dynamic). When sequence_start\nis set, sequence numbers are automatically calculated based on entry\norder, similar to the static ACL resources.",
          "is_bot": false,
          "headline": "acl_dynamic: add sequence_start/step for auto numbering",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-28T17:26:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e457d3ab11970ee325c7d7d4b5d1590745ef09b",
          "body": "Add dynamic_filter_ids attribute to apply blocks in rtx_access_list_ip\nand rtx_access_list_ipv6 resources. This enables generating commands like:\n\n  ip lan2 secure filter out 100 dynamic 1 2 3 4 5 6\n\nChanges:\n- Add dynamic_filter_ids (Optional, Computed) attribute to apply block schema\n- Add ApplyFi\n[…]\nlter IDs from router\n- Add ParseInterfaceSecureFilterWithDynamic parsers for both IP and IPv6\n- Preserve user-specified dynamic_filter_ids in readApplyBlocks to avoid\n  state inconsistency after apply",
          "is_bot": false,
          "headline": "acl: support dynamic_filter_ids in apply blocks",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-28T16:54:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1313499b819cf896a7ec3258cd9752767d5b6eca",
          "body": "Add validation to detect sequence number conflicts when creating or\nupdating ACL resources. The router's filter namespaces (IP static,\nIP dynamic, IPv6 static, IPv6 dynamic) require unique sequence numbers,\nbut multiple Terraform resources can inadvertently use overlapping\nsequences.\n\nThis change queries the router for existing sequences during\nCreate/Update operations and reports clear errors when conflicts are\ndetected, guiding users to adjust their sequence_start values.",
          "is_bot": false,
          "headline": "acl: detect sequence conflicts across resources",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-28T16:17:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2437bc75bfc9411687f8569653d85c4ccc8232d3",
          "body": "Fix state drift caused by non-deterministic map iteration order when\nreading MAC ACL interface bindings. Apply blocks are now sorted by\ninterface name, then direction (\"in\" before \"out\").",
          "is_bot": false,
          "headline": "acl_mac: sort apply blocks for deterministic order",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-28T15:36:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "156d2ac07ffef18a050d4244f31c94391f9be406",
          "body": "Previously GetAccessListMAC only read the first matching apply binding\nand ignored additional directions. This caused terraform plan to miss\ndifferences when the router had both in and out filter bindings.\n\nNow all matching apply bindings are collected into the Applies slice,\nallowing proper detection of filter bindings in both directions.",
          "is_bot": false,
          "headline": "acl_mac: read multiple apply bindings from router",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-28T12:56:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53b8a1b636784d276578540f2cf063debb639cd6",
          "body": "Fix two issues with SSH session handling and syslog configuration:\n\n1. Goroutine leak in working_session.go:\n   - Each readUntil* function was creating a new goroutine that never\n     terminated, causing goroutine leaks on connection reuse\n   - Now uses a single dedicated reader goroutine per sessio\n[…]\n port specified\n   - This caused Terraform to see plan=514 vs actual=0, resulting in\n     \"Provider produced inconsistent result after apply\" error\n   - Now ParseSyslogConfig sets Port: 514 as default",
          "is_bot": false,
          "headline": "ssh/syslog: fix goroutine leak and port parsing",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-28T11:52:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cebc5e61b0ad637c502152686273e640a7f4ac06",
          "body": null,
          "is_bot": false,
          "headline": "kron_schedule: fix SA4017 lint error for unused return value",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-27T15:15:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "454908229649b93a1be05ed08322d5cdcf8961d8",
          "body": "Fix the IPsec SA policy parser to correctly map and parse algorithm\nsettings. The parser now:\n- Uses policy number (first parameter) to find the matching tunnel\n- Parses the encryption algorithm (aes-cbc, aes-cbc-256, 3des)\n- Parses the integrity algorithm (sha-hmac, sha256-hmac, md5-hmac)\n\nThis fixes the \"Provider produced inconsistent result after apply\"\nerror when updating IPsec tunnel encryption/integrity settings.",
          "is_bot": false,
          "headline": "ipsec_tunnel: parse SA policy algorithms correctly",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-27T15:09:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9c6647dd8f9200b93ea471bd800bc7c1333e6fb0",
          "body": "- Update version in Makefile and README.md\n- Fix lint issues:\n  - Replace nil Context with context.TODO() (SA1012)\n  - Remove unused functions (admin_user, dhcp_binding)\n  - Fix variable declaration (policy_map)\n  - Add golangci.yml exclude rules for package naming and stuttering\n- Fix failing IPsec tunnel tests (remove obsolete validation test cases)\n- Regenerate documentation",
          "is_bot": false,
          "headline": "release: bump version to 0.7.1",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-27T14:45:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7f5a03bf2039316317f6fa2e2c74683fc480605f",
          "body": null,
          "is_bot": false,
          "headline": "acl: minor model and resource improvements",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-27T14:31:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "884af2411752cae7869a40b15b3fc99081e58042",
          "body": "- ip_filter: enhance filter ID parsing to handle more formats\n- ipsec_tunnel: fix DPD value parsing",
          "is_bot": false,
          "headline": "parsers: improve IP filter and IPsec tunnel parsing",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-27T14:31:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39e90b58522d1d5f760f3ab1009c3be398f3631c",
          "body": "- disconnect_time: use Int64Value instead of Int64ValueOrNull since 0 is\n  a valid value meaning no timeout\n- keepalive_interval/retry: set to null when keepalive is not enabled",
          "is_bot": false,
          "headline": "l2tp: fix disconnect_time and keepalive value handling",
          "author_name": "Shin'ichi Ohno",
          "author_login": "shin1ohno",
          "committed_at": "2026-01-27T14:31:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 32,
      "commits_last_year": 316,
      "latest_release_at": "2026-07-05T01:33:07Z",
      "latest_release_tag": "v0.15.2",
      "releases_from_tags": false,
      "days_since_last_push": 21,
      "active_weeks_last_year": 16,
      "days_since_latest_release": 21,
      "mean_days_between_releases": 4.8
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": []
    },
    "popularity": {
      "forks": 1,
      "stars": 1,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-06-28",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_forks": 1
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 129682,
      "source_files_sampled": 374,
      "oversized_source_files": 4,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 7168
    },
    "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/hashicorp/terraform-plugin-docs",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.24.0"
        },
        {
          "name": "github.com/hashicorp/terraform-plugin-framework",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.16.1"
        },
        {
          "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.29.0"
        },
        {
          "name": "github.com/pkg/sftp",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.13.10"
        },
        {
          "name": "github.com/rs/zerolog",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.34.0"
        },
        {
          "name": "github.com/stretchr/testify",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.0"
        },
        {
          "name": "golang.org/x/crypto",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.42.0"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        }
      ],
      "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": 18,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "shin1ohno",
          "commits": 315,
          "avatar_url": "https://avatars.githubusercontent.com/u/972846?v=4"
        },
        {
          "type": "User",
          "login": "hmdyt",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/46584768?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.997
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".golangci.yml"
      ],
      "has_editorconfig": false,
      "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": 8,
            "reason": "16 out of 18 merged PRs checked by a CI test -- score normalized to 8",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 1/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "20 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 8,
            "reason": "5 out of the last 5 releases have a total of 5 signed artifacts.",
            "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": "33 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "0eebaf805cc14ff1aece7d6417af3559221791bc",
        "ran_at": "2026-07-26T05:13:01Z",
        "aggregate_score": 3.9,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-05T01:33:23Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-04T17:50:25Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/shin1ohno/terraform-provider-rtx",
    "host": "github.com",
    "name": "terraform-provider-rtx",
    "owner": "shin1ohno"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 55,
      "inputs": {
        "security": 39,
        "vitality": 80,
        "community": 24,
        "governance": 43,
        "engineering": 84
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 80,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "commits_last_year": 316,
              "human_commit_share": 1,
              "days_since_last_push": 21,
              "active_weeks_last_year": 16
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 21 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 21
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "16/52 weeks with commits",
                "points": 11.1,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 16
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "316 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 316
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "20 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 98,
            "inputs": {
              "releases_count": 32,
              "latest_release_tag": "v0.15.2",
              "releases_from_tags": false,
              "days_since_latest_release": 21,
              "mean_days_between_releases": 4.8
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "32 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 32
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 21 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 21
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~4.8 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 4.8
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "5 out of the last 5 releases have a total of 5 signed artifacts.",
                "points": 8,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 21,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 21 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 21
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 24,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 1,
              "stars": 1,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "1 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 43,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 12,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.997
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0.1,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 72,
            "inputs": {
              "merged_prs": 18,
              "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": "18/18 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 18,
                      "decided": 18
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 1/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": 52,
            "inputs": {
              "followers": 8,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "shin1ohno",
              "public_repos": 55,
              "account_age_days": 5463
            },
            "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": "8 followers of shin1ohno",
                "points": 6.9,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 8,
                      "login": "shin1ohno"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "55 public repos, account ~14 yr old",
                "points": 24.7,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 55
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 14
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 84,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 80,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "16 out of 18 merged PRs checked by a CI test -- score normalized to 8",
                "points": 16,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": "https://registry.terraform.io/providers/shin1ohno/rtx/latest",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://registry.terraform.io/providers/shin1ohno/rtx/latest",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 39,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 39,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "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": "16 out of 18 merged PRs checked by a CI test -- score normalized to 8",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 1/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "20 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "5 out of the last 5 releases have a total of 5 signed artifacts.",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "33 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 79,
        "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.98,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 7168
            },
            "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": "98 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 98,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.26,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": ".golangci.yml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "26 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 26,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 129682,
              "source_files_sampled": 374,
              "oversized_source_files": 4
            },
            "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": "4/374 source files over 60KB",
                "points": 54.4,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 374,
                      "oversized": 4
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "Could not fetch go package 'github.com/sh1/terraform-provider-rtx' from its registry",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-26T05:13:14.291725Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/shin1ohno/terraform-provider-rtx.svg",
  "full_name": "shin1ohno/terraform-provider-rtx",
  "license_state": "standard",
  "license_spdx": "MIT"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.27.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statistics.