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

borisdali / helpdesk

aiHelpDesk: Agentic DB SRE support system that learns from every incident. A database reasoning layer equipped with a governed actuation arm that treats human operators and upstream agents indiscriminately

GoNo license detected★ 7 stars⑂ 0 forkssince Jan 2026View on GitHub ↗

borisdali/helpdesk holds a health index of 54 out of 100, placing it in the Moderate band. It scores highest on Vitality (86/100) and lowest on Community & Adoption (19/100). It was last updated today. A single contributor accounts for most of its recent work.

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

54
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

borisdaliPersonal account
3 followers11 public repossince Jan 2017

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?

86Excellent · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
18.7/36Commit cadence — 27/52 weeks with commits
18/18Commit volume — 712 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year712
human_commit_share1
days_since_last_push0
active_weeks_last_year27
How it's scored
27/27Ships releases — 44 releases published
36/36Release recency — latest release 9 days ago
27/27Release cadence — a release every ~6.6 days
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Inputs used
releases_count44
latest_release_tagv0.21.0
releases_from_tagsno
days_since_latest_release9
mean_days_between_releases6.6

Community & Adoption

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

19Critical · 18% of overall
How it's scored
12.6/60Stars — 7 stars
0/25Forks — 0 forks
0/15Watchers — 1 watchers
Inputs used
forks0
stars7
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
0/22.5License — no license file detected
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseno
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?

40At risk · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
0/22.5Commit distribution — top contributor authored 100% of commits
1.4/13.5Contributor breadth — 1 contributors
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Inputs used
bus_factor1
contributors_sampled1
top_contributor_share1
How it's scored
0/46.8Issue resolution — no issues or no data
38.2/38.3PR acceptance — 21/21 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/14 approved changesets -- score normalized to 0
Inputs used
merged_prs21
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
4.3/25Owner reach — 3 followers of borisdali
19.9/25Track record — 11 public repos, account ~9 yr old
Inputs used
followers3
owner_typeUser
is_verified
owner_loginborisdali
public_repos11
account_age_days3,468
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.

Engineering Quality

Are baseline engineering and documentation practices in place?

86Excellent · 20% of overall
How it's scored
24/24CI workflows — 3 workflow(s)
24/24Tests present
16/16Linter config — .golangci.yml
0/9.6Pre-commit hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 1 out of 1 merged PRs checked by a CI test -- score normalized to 10
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://aiHelpDesk.biz
10/10Repository description
10/10Topics — 11 topics
0/10Wiki
Inputs used
topicsai, database, generative-ai, kubernetes, postgres, support, dba, sre, agentic-ai, agents, multi-agent
has_wikino
homepagehttps://aiHelpDesk.biz
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

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

28Critical · 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.5/2.5CI-Tests — 1 out of 1 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/14 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
0/2.5License — license file not detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — no data
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 33 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate2.8
Excluded from scoring (no data or not applicable): packaging. Remaining weights renormalized.

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.

62Moderate · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 100 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
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 — Dockerfile, lockfile
0/10Demonstrated agent practice — no agent-authored commits among the last 100
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_dockerfileyes
typed_languageyes
bootstrap_filesMakefile
has_devcontainerno
has_linter_configyes
typecheck_configs
agent_commit_share0
toolchain_manifestsgo.mod
dependency_bot_commit_share0
How it's scored
45/45Type-checkable code — Go (statically typed)
52.9/55Manageable file sizes — 11/288 source files over 60KB
Inputs used
primary_languageGo
largest_source_bytes189,197
source_files_sampled288
oversized_source_files11
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — samples
Inputs used
example_dirssamples
has_mcp_signalno
api_schema_files

Key facts

7GitHub stars
1contributors
712commits, last 12 months
0days since last push
44releases
1bus factor
0open issues
Gopackage ecosystems

Data collection warnings

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

More detail

OpenSSF Scorecard 2.8 / 10
2.8aggregate

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:57 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests1 out of 1 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/14 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
0Licenselicense file not detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
n/aPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities33 existing vulnerabilities detected
Direct dependencies 11
RegistryPackageVersion constraintManifest
Gogithub.com/a2aproject/a2a-gov0.3.3go.mod
Gogithub.com/anthropics/anthropic-sdk-gov1.19.0go.mod
Gogithub.com/google/uuidv1.6.0go.mod
Gogithub.com/jackc/pgx/v5v5.8.0go.mod
Gogoogle.golang.org/adkv0.6.0go.mod
Gogoogle.golang.org/genaiv1.40.0go.mod
Gogopkg.in/yaml.v3v3.0.1go.mod
Gok8s.io/apiv0.35.0go.mod
Gok8s.io/apimachineryv0.35.0go.mod
Gok8s.io/client-gov0.35.0go.mod
Gomodernc.org/sqlitev1.45.0go.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": [
        "ai",
        "database",
        "generative-ai",
        "kubernetes",
        "postgres",
        "support",
        "dba",
        "sre",
        "agentic-ai",
        "agents",
        "multi-agent"
      ],
      "is_fork": false,
      "size_kb": 254075,
      "has_wiki": false,
      "homepage": "https://aiHelpDesk.biz",
      "languages": {
        "Go": 4354140,
        "Shell": 75803,
        "PLpgSQL": 2125,
        "Makefile": 23300,
        "Dockerfile": 6937,
        "Go Template": 3922
      },
      "pushed_at": "2026-07-26T02:49:11Z",
      "created_at": "2026-01-21T20:41:29Z",
      "owner_type": "User",
      "updated_at": "2026-07-21T23:01:04Z",
      "description": "aiHelpDesk: Agentic DB SRE support system that learns from every incident.  A database reasoning layer equipped with a governed actuation arm that treats human operators and upstream agents indiscriminately",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "main",
      "license_spdx_raw": null,
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "User",
      "login": "borisdali",
      "company": null,
      "location": null,
      "followers": 3,
      "avatar_url": "https://avatars.githubusercontent.com/u/25356173?v=4",
      "created_at": "2017-01-25T23:04:00Z",
      "is_verified": null,
      "public_repos": 11,
      "account_age_days": 3468
    },
    "license": {
      "state": "absent",
      "spdx_id": null,
      "raw_spdx": null,
      "file_present": false,
      "scorecard_found": false,
      "profile_has_license": false
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.21.0",
          "kind": "minor",
          "published_at": "2026-07-17T03:49:12Z"
        },
        {
          "tag": "v0.20.0",
          "kind": "minor",
          "published_at": "2026-07-09T03:18:20Z"
        },
        {
          "tag": "v0.19.0",
          "kind": "minor",
          "published_at": "2026-07-02T13:40:56Z"
        },
        {
          "tag": "v0.18.0",
          "kind": "minor",
          "published_at": "2026-06-26T13:07:07Z"
        },
        {
          "tag": "v0.17.0",
          "kind": "minor",
          "published_at": "2026-06-18T02:41:11Z"
        },
        {
          "tag": "v0.16.1",
          "kind": "patch",
          "published_at": "2026-06-13T17:16:40Z"
        },
        {
          "tag": "v0.16.0",
          "kind": "minor",
          "published_at": "2026-06-11T19:30:47Z"
        },
        {
          "tag": "v0.15.0",
          "kind": "minor",
          "published_at": "2026-06-05T17:56:51Z"
        },
        {
          "tag": "v0.14.0",
          "kind": "minor",
          "published_at": "2026-05-28T23:35:00Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-05-18T21:21:27Z"
        },
        {
          "tag": "v0.12.2",
          "kind": "patch",
          "published_at": "2026-05-07T22:47:22Z"
        },
        {
          "tag": "v0.12.1",
          "kind": "patch",
          "published_at": "2026-05-07T18:50:45Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-05-07T02:24:22Z"
        },
        {
          "tag": "v0.11.1",
          "kind": "patch",
          "published_at": "2026-04-25T03:36:11Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-04-22T18:05:55Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-04-15T15:06:08Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-04-10T14:49:04Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-04-09T02:34:54Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-03-30T13:51:10Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-03-24T22:21:04Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-03-18T04:51:00Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-03-10T22:37:20Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-03-04T21:42:53Z"
        },
        {
          "tag": "v0.3.6",
          "kind": "patch",
          "published_at": "2026-03-03T01:15:38Z"
        },
        {
          "tag": "v0.3.5",
          "kind": "patch",
          "published_at": "2026-03-02T05:45:01Z"
        },
        {
          "tag": "v0.3.4",
          "kind": "patch",
          "published_at": "2026-03-02T02:11:39Z"
        },
        {
          "tag": "v0.3.3",
          "kind": "patch",
          "published_at": "2026-03-01T21:38:45Z"
        },
        {
          "tag": "v0.3.2",
          "kind": "patch",
          "published_at": "2026-03-01T15:21:54Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2026-02-28T00:27:48Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-02-26T06:38:16Z"
        },
        {
          "tag": "v0.2.10",
          "kind": "patch",
          "published_at": "2026-02-24T04:11:03Z"
        },
        {
          "tag": "v0.2.9",
          "kind": "patch",
          "published_at": "2026-02-23T03:45:38Z"
        },
        {
          "tag": "v0.2.7",
          "kind": "patch",
          "published_at": "2026-02-20T04:52:06Z"
        },
        {
          "tag": "v0.2.5",
          "kind": "patch",
          "published_at": "2026-02-19T05:39:25Z"
        },
        {
          "tag": "v0.2.4",
          "kind": "patch",
          "published_at": "2026-02-19T05:31:00Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2026-02-19T05:19:54Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-02-19T04:34:48Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-02-17T03:06:21Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-02-16T18:39:09Z"
        },
        {
          "tag": "v0.1.4",
          "kind": "patch",
          "published_at": "2026-02-12T04:52:49Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2026-02-10T01:39:32Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2026-02-05T17:05:10Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-02-05T03:13:03Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-02-03T19:14:46Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "819497cab148818ca1f002b9195a0c9332b46cd5",
          "body": null,
          "is_bot": false,
          "headline": "chore: minor typo in sample 11.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-21T23:00:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0aa490d58f1be9cc9fc0506b827667f89cc5153b",
          "body": null,
          "is_bot": false,
          "headline": "chore: update the sample 11 doc with the vault accuracy numbers.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-21T22:47:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b30f89fb7f32e7a9be84b9cf34affa8bddfd3432",
          "body": null,
          "is_bot": false,
          "headline": "chore: more cosmetic doc changes in FOR_WHOM.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-21T19:19:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9626a0173c36084e1ad1ea933834ae58cb64c3f1",
          "body": null,
          "is_bot": false,
          "headline": "chore: update docs/FOR_WHOM.md with a flow image",
          "author_name": "borisdali",
          "author_login": "borisdali",
          "committed_at": "2026-07-21T19:06:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9a27792b2ba72fb998bbccd5f612671667955448",
          "body": null,
          "is_bot": false,
          "headline": "chore: a few minor cosmetic typos in a the main readme doc.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-21T15:52:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3cd7092ef0c37d998e4a62461699e8b99e2fd1f6",
          "body": null,
          "is_bot": false,
          "headline": "chore: update the primary readme.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-21T15:42:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eed76488697078e85697f8c05edb437c008e49a5",
          "body": null,
          "is_bot": false,
          "headline": "chore: minor typo in the sample 12 doc.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-21T13:31:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "286d9d8e985702ea3645834063f00d15a90ca803",
          "body": null,
          "is_bot": false,
          "headline": "fix: doc bug in url alignment.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-21T02:49:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4304b1d184f764a2ec241b007deba3cfd2f40c93",
          "body": null,
          "is_bot": false,
          "headline": "chore: add docs/sames/README + update sample 12.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-21T02:43:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a551067c802ccfb58bef6d3c33a9137342f73d3f",
          "body": "…blog posts.",
          "is_bot": false,
          "headline": "chore: update the instructions in sample docs 11 and 12 to match the …",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-20T22:00:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2b8eee9793704cb05badc2cbc6c2213d0f63a24",
          "body": "…/samples to avoid the clutter.",
          "is_bot": false,
          "headline": "chore: revamp the BENCHMARKING_SAMPLE* docs and place them under docs…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-20T18:32:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "de18c31dd58d2031dd9bb3b8d93396193ed6890c",
          "body": "…te_ one + add docs/FOR_WHOM.md.",
          "is_bot": false,
          "headline": "fix: replace the old lingering kill_idle_connections with the termina…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-18T22:24:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "698a387958db433bd6dd501d712d224feae589f9",
          "body": "Problem: `vault accuracy` showed only k8s-crashloop and not k8s-oomkilled\nwhen --ids flag was used.\n\nFix:\n1/ --ids respected:\n   When cfg.FailureIDs is non-empty, faults not in that set are skipped,\n   so --ids k8s-oomkilled,k8s-crashloop now actually filters to just those two\n\n2/ Series dedup bypas\n[…]\nd response rather than\n   hitting the gateway again\n\n4/ Default summary view unchanged:\n   `vault accuracy` with no args still shows one row per series\n   (the seen dedup is still active in that path)",
          "is_bot": false,
          "headline": "fix: cosmetic issue with `vault accuracy` and dup faults.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-17T18:10:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d52f60628524f76da546eec02d3a50ac40bdd204",
          "body": "Release/v0.21.0",
          "is_bot": false,
          "headline": "Merge pull request #21 from borisdali/release/v0.21.0",
          "author_name": "borisdali",
          "author_login": "borisdali",
          "committed_at": "2026-07-17T03:35:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e5fa7b7c3e877c2fae1920995ccedd78ce58556",
          "body": "Two fixes:\n\n1/ Makefile:\n   Bumped all three integration test timeouts from 120s → 300s.\n   The audit_monitor tests alone burn ~60s of fixed sleeps\n   (27s in TestSecbotHTTPPollingReconnect + 6s+6s+18s across the others),\n   plus 3 binary builds in TestMain.\n\n   The 120s budget was leaving TestIdent\n[…]\n on port 19913.\n   The port collision wouldn't cause a 2-minute timeout on its own,\n   but it could cause waitForReady to spin the full 10s trying to connect\n   to an already-bound port, adding waste.",
          "is_bot": false,
          "headline": "fix: integration governance test fails in CI on timeouts.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-17T03:27:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e958e15df7bda85172700c6d2c0540ef70898040",
          "body": "1/ playbook_run_store.go:\n   ListBySeriesID and ListByOutcome have zero tests\n\n2/ playbook_store.go:\n   ActivateSystem is 0%; nextVersion only covers the \"\"→\"1.0\" branch\n\n3/ fault_stability_store.go:\n   migrateSQLite fast-path (pkCols ≥ 2 already composite) not exercised;\n   migratePostgres needs a skip-if-no-postgres test\n\n4/ sysadmin/tools.go: containerRuntimeBin missing podman+unknown branches;\n   restartContainerImpl/restartServiceImpl missing policy-denied path",
          "is_bot": false,
          "headline": "fix: add the missing test coverage based on the codecov report.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-17T00:24:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8838ca32471bdfe7194df4242593202f15f1d140",
          "body": "l.Close() on a listener can fail (e.g., if the fd was already closed)\nand errcheck is right that ignoring it silently is bad practice here.\nIf close fails we'd return a port that may not actually be free.",
          "is_bot": false,
          "headline": "fix: CI linter issue in faulttest/autodb.go on Close.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-17T00:13:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9fb8c6bd8ad1124f92463849ec355380aec936cc",
          "body": "This is a prereq to activate the judge. without narrative field in\nexpected_diagnosis, even if --judge is requested, faulttest falls back\nto keyword+category scoring.",
          "is_bot": false,
          "headline": "fix: add 7 missing narratives to the K8s PBs.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-17T00:03:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bf26835f250b30a6e790c286740484b3b8ae1c88",
          "body": null,
          "is_bot": false,
          "headline": "chore: update the tool registry doc.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-16T21:21:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "19cf88dc7c7e4f0a358781713dae2c127c399dbc",
          "body": "assembleTriagePrompt prepended \"Call check_connection...\" for every playbook,\nbut sysadmin doesn't have `check_connection`. Combined with the old guidance\nalso mentioning check_connection in Step 3, the LLM spiraled into repeated\nfailed tool calls and never called restart_container.\nFix:\n1/ use a sy\n[…]\nat names `check_host`/`restart_container` instead\n2/ bump the playbook to v1.1 with guidance that removes check_connection and adds\n   \"Do NOT emit TRANSITION_TO — this is a terminal action playbook.\"",
          "is_bot": false,
          "headline": "fix: Wrong initial tool in sysadmin-agent prompt (playbooks.go).",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-16T17:31:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dd8037df479bf9262b1c406eb2745800b642b892",
          "body": "…fail.\n\nThe port fix works now and psql is connecting, but RunSQLBool checks for output \"t\n\" (boolean), while SELECT 1 returns \"1\" (integer).\nFix: straightforward: make it accept \"1\" as truth too.",
          "is_bot": false,
          "headline": "fix: verify_sql returning false, causing remediation in faulttest to …",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-16T17:19:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bfd4e573f59a40a6ef9a3d54a11c54378fa40e50",
          "body": "…B instructions.\n\nRCA: On some Docker Desktops, containers created with -p 127.0.0.1::5432\n(random port) get a new random port assigned on every start/restart.\nSo after `restart_container` ran docker restart faulttest-auto-db-XXXX,\nPostgreSQL was actually listening, but on a different port than the \n[…]\niner-restart-verify-connection` after\na successful restart. Added an explicit instruction:\n\"Do NOT emit TRANSITION_TO or ESCALATE_TO — this is a terminal action playbook. Your job ends with FINDINGS.\"",
          "is_bot": false,
          "headline": "fix: got the RCA, two fixes on stable port +sysadmin-docker-restart P…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-16T16:00:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "db2914089e3aa29bf79db34937e6ac92f0cde83f",
          "body": "1/ Gateway → sysadmin forwarding:\n   When faulttest registers auto-DB with the gateway, it now also notifies\n   the sysadmin (no more silent registration gaps)\n\n2/ Container-name fallback in resolveHost:\n   check_host(\"faulttest-auto-db-edec1798\") now resolves correctly.\n   The LLM no longer needs to use the connection string as target\n\n3/ Hypothesis parser + conn_str pass-through now also work correctly.",
          "is_bot": false,
          "headline": "fix: three more fixes for sysadmin transition.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-16T05:15:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "77d9e1fcc1c67f0a69616028de1cb4e44d37a3b2",
          "body": "Add a verification of an --operator against the users.yaml:\n\n1/ testing/cmd/faulttest/config.go:\n   Added UsersFile string to the local HarnessConfig\n\n2/ testing/faultlib/types.go:\n   Added UsersFile string to the faultlib HarnessConfig (for library callers)\n\n3/ testing/cmd/faulttest/main.go:\n   Add\n[…]\nw calls validateOperatorInUsersFile(r.cfg.UsersFile, r.cfg.OperatorID)\n   between the empty-check and ProceedEscalation;\n   the validateOperatorInUsersFile helper loads the YAML and checks users[*].id",
          "is_bot": false,
          "headline": "feat: add security check in faulttest --operator",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-16T01:55:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7353c3f4d95e3824e0b24487d99f60225ff735d4",
          "body": "1/ Problem:\n`--approval-mode force` in faulttest applies to the triage run's approval mode.\nIt controls step-by-step approval during triage.\nBut when the gate fires (--emit-and-wait), the gate is resolved externally by a separate HTTP call.\nThe user approved with `approval_mode=manual` (the default \n[…]\n identity is missing, faulttest errors out before calling ProceedEscalation.\nThe next faulttest run will need `--operator boris@borisdali.com` (or FAULTTEST_OPERATOR_ID if that env var wiring exists).",
          "is_bot": false,
          "headline": "fix: two minor problems with --approval-mode=force.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-15T21:48:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6aea701950ded90c552e07dd935a518dbee4b4b0",
          "body": "…ete wo/ --audit-url + sysadmin dynamic registration.\n\nRegistration failed with 401 becase registerAutoDBWithSysadmin sent no auth header.\nThe SysAdmin agent's auth middleware rejected it, so the server ID never gets registered\nand the SysAdmin spends the entire run trying every known infra entry by\n[…]\nas also tightened to hold RLock across both the primary lookup\nand the port-fallback scan (previously the map was accessed after RUnlock, which was a race\nwith concurrent register_infra_db mutations).",
          "is_bot": false,
          "headline": "feat: add a SA for faulttest in sysadmin agent + waitForChildRunCompl…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-15T17:01:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "58342251df1c8fa008fbd860699badf647faa2fe",
          "body": "Fix earlier regression:\nfaulttest_test.go has a pre-existing structural issue where it calls\nRemediate(pbs_db_restart_action) unconditionally even after a pending_gate\ntriage response (which already triggered the sysadmin chain via gate approval).\nThe CLI handles this correctly with the pending_gate\n[…]\n bypassing it\nb/ resp.ChainedRunID != \"\" → logs that gateway already handled remediation inline, skips\nc/ Otherwise → calls remediator.Remediate as before, gated on PlaybookID or AgentPrompt being set",
          "is_bot": false,
          "headline": "fix: regression in faulttest_test.go for calling Remediate.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-14T23:14:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "62eac746490edbcebd81c79ebe29c3191535dbf7",
          "body": "…waiting for transitioned PBs).\n\nUnit tests:\n\n1/ fetchRunOutcome:\n   3 tests: returns outcome from JSON; returns \"\" on 404; returns \"\" when AuditURL unset\n\n2/ waitForChildRunComplete\n   3 tests: happy path (child found → terminal); no AuditURL falls back; polls until \"\" resolves to \"resolved\"\n\n3/ au\n[…]\nfrom nil;\n   defaults runtime to docker;\n   resolveHost works post-register;\n   missing server_id/container_name errors\n\nAlso:\n\n6/ Close the gap with registry dispatch path test for register_infra_db.",
          "is_bot": false,
          "headline": "chore: add test coverage for enhanced faulttest (now capable of sync-…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-14T22:39:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "594b0e0a2a2cb8dca2fc760f3693512f76e62e24",
          "body": "…itions): r.waitForChildRunComplete.\n\nSysadmin agent: dynamic infra registration\nagents/sysadmin/tools.go:\n1/ Added sync.RWMutex (infraConfigMu) guarding concurrent reads/writes to infraConfig\n2/ resolveHost now uses a read-locked snapshot (ic := infraConfig) instead of the global directly\n3/ New re\n[…]\ntoDBWithSysadmin(sysadminURL, serverID, containerName):\n    POSTs to POST /tool/register_infra_db on the sysadmin agent\n11/ Called automatically after gateway registration when --sysadmin-agent is set",
          "is_bot": false,
          "headline": "feat: close the gaps to allow faulttest to run sync ops (for PB trans…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-14T22:08:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4c6031f6f8218b319fbf90262c9090621dfcbde5",
          "body": "StatsByVersion only counted outcome='escalated' runs,\nbut `faulttest --repeat` mode leaves escalation runs in 'gate_pending' state\n(sysadmin gate fires but is never resolved). Runs with outcome=gate_pending\nand escalated_to populated are now counted as escalated, so ESCALATED% correctly\nshows 100% for v1.7 and 66% for v1.6 (one run failed to escalate, matching the UNSTABLE cert).",
          "is_bot": false,
          "headline": "fix: count gate_pending+escalated_to as ESCALATED% in version stats.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-14T04:55:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "563aa541df60bf05cfa18cc2eeb65182b07564a8",
          "body": "…+ ESCALATED% columns\n\n`vault judge-accuracy` showed 0% SUCCESS% for escalation-heavy triage PBs\n(e.g. db-connection-refused) even when 3/3 runs correctly escalated,\nbecause SUCCESS% only counted resolved/transitioned outcomes, not escalated ones.\n\nFix:\n1/ PlaybookVersionStats gains Escalated int + \n[…]\nave to get a real playbook_id\n\n5/ registerAutoDBWithGateway includes hosting_type=docker + container_name so gateway\n   injects correct infra context (fixes UNSTABLE certs for escalation-heavy faults)",
          "is_bot": false,
          "headline": "fix: `faulttest vault judge-accuracy` splits SUCCESS% into RESOLVED% …",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-14T04:39:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1416b02c5fdd18f1bd7570376d1e541cbb03b1d8",
          "body": "…ersist) + auto-db registers with hosting_type/container_name.\n\n`vault suggest-update` got a new  `--file` option.\nIt was also calling /import (validate-only) and reading playbook_id from the response,\nwhich is always empty since /import does not persist.\nAdded step 2: POST to /api/v1/fleet/playbook\n[…]\ndes hosting_type=docker and container_name,\nso the gateway injects correct infra context instead of\n\"standalone PostgreSQL — NOT Kubernetes-managed\", fixing UNSTABLE certs for escalation-heavy faults.",
          "is_bot": false,
          "headline": "fix: `vault suggest-update --file` now saves draft (two-step import+p…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-14T04:17:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ce745618939bb3f47de3b05a664b87cdc16cb94d",
          "body": "faulttest results: 3/3 PASS, but UNSTABLE with confidence range 40pp (60%→100%), above the 30pp ceiling\nThe instability is real, not noise and judge scores: 33% → 67% → 100%\n\nThe reason for the inconsistency?\nThe auto-db isn't in the infra config, so the agent has no Known Infrastructure\nentry telli\n[…]\ntry, the agent's behavior\nis undefined and varies run-to-run.\n\nFix: Added a default action to the PB guidance when hosting type is unknown.\nThe correct default is: when in doubt, escalate to sysadmin.",
          "is_bot": false,
          "headline": "fix: --auto-db problem with judge instability.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-12T03:55:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "043372f33915a7285dc813c656a77cf10b97a148",
          "body": "…r --remediate-judge requested.\n\nWhat should happen when ANTHROPIC_API_KEY or HELPDESK_API_KEY is not set, but\n--judge or --remediate-judge are explicitly requested?\n\n1/ --judge-passed=no:\n   normal skip, test continues\n\n2/ --judge-passed=yes and API key is not set:\n   judgeCompleter == nil → Evalua\n[…]\nly, newJudgeCompleter returns\nan error at startup which is already logged as\nslog.Warn(\"LLM judge disabled: could not initialize\").\nThe os.Exit(1) is for the case where the key IS set, but is invalid.",
          "is_bot": false,
          "headline": "fix: ANTHROPIC_API_KEY or HELPDESK_API_KEY are not set, but --judge o…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-12T03:34:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ae101a915653be84f46386d130e253fb24bac75c",
          "body": "1/ testing/catalog/failures.yaml\n   - service: postgres restored\n   - external_compat: true added, so that the fault now works with both --auto-db and Docker Compose\n   - external_inject / external_teardown via shell_exec: docker stop/start helpdesk-test-pg for the auto-db container path\n   - remedi\n[…]\nnchanged.\nWhen that playbook runs, the container is already stopped, so there are no active\nconnections to check. The blast-radius logic lives in the triage Step 5\n(K8s rolling restart of a live pod).",
          "is_bot": false,
          "headline": "fix: db-connection-refused fault: make it work with --auto-db.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-12T03:11:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "14ab71498b1fd14261ef7a5b3581a733d8cb98e9",
          "body": "…s update.\n\n1/ `vault accuracy` triage consistency block was missing attribution.\n   The cert had all 5 fields, but `vault accuracy`didn't render them.\n   They now show up after \"Tested at\" section as follows:\n    Attribution (taxonomy 1.0)\n    Primary class  : idle-connection-accumulation\n    Consi\n[…]\nreport didn't show attribution.\n   After Verdict: STABLE in the faulttest run --repeat output,\n   the attribution summary now appears so operators see it without\n   having to query the API separately.",
          "is_bot": false,
          "headline": "fix: vault accuracy attribution fix + run-time stability report + doc…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-11T22:16:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3475cfdfb5e5856ac8e246c5e59ef3d8c4726fc3",
          "body": "testing/cmd/faulttest/vault_test.go:\n9 new tests:\n\n1/ TestFetchRootCauseClasses_* (6 tests)\n   found, nil classes, empty playbooks, server error, empty URL, auth header\n2/ TestVaultList_AttributionShown:\n   Consistent attribution renders as attr=<class>\n3/ TestVaultList_SplitAttributionShown:\n   Inc\n[…]\nok_run_store_postgres_test.go (new):\n    TestPlaybookRunStore_Migrate_Postgres: opens store twice against\n    a Postgres DSN, verifies migration is idempotent;\n    Skips when POSTGRES_TEST_DSN not set",
          "is_bot": false,
          "headline": "chore: add non unit test coverage for v0.21",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-10T22:57:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bcbcb0cd0fdee796d843f9e92dcc8be5af0d50a3",
          "body": "…ty, etc.\n\n1/ playbooks/seed_test.go:\n   1 new test (TestPlaybookStructure_RootCauseClasses):\n   Verifies all 21 triage playbooks have root_cause_classes with\n   version=\"1.0\" and ≥2 classes; remediation playbooks have nil\n\n2/ internal/audit/fault_stability_store_test.go\n   5 new tests: attribution \n[…]\nty summary, network error, auth header)\n\n5/  Fix during testing: JudgeSpread for identical float64 values produces\n    1.1e-16 (floating point noise), not 0.0 — used > 1e-10 threshold instead of != 0.",
          "is_bot": false,
          "headline": "chore: add test coverage for the v0.21 features, attribution, stabili…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-10T22:33:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a3534e8b3814c73fb2a5a18d4d80a676ba7bd573",
          "body": "1/ PG migration guard fixed in playbook_run_store.go (uses containsAny now).\n2/ RootCauseClassification type + RootCauseClasses field on Playbook.\n   Migration column added.\n   Insert/Update/Scan all handle it.\n   seed.go parses it from YAML.\n\n3/ All 21 triage playbooks seeded with root_cause_classe\n[…]\nss compared certs.\n\n8/ `Journey --detail` now shows a FINDINGS section fetched from\n   diagnostic_report on the playbook run.\n   That's the trailing agent conclusion that was missing from every trace.",
          "is_bot": false,
          "headline": "feat: add taxonomy/class attribution in all PBs.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-10T22:11:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f6359c6f3c59d20d2bac0aeaf4436a0fa48513d4",
          "body": null,
          "is_bot": false,
          "headline": "fix: add a link to the blog post in the bench sample 10 doc.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-10T19:39:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c95cb1cedabd0f7864346ed1388236257fc04330",
          "body": null,
          "is_bot": false,
          "headline": "fix: typos in bench sample 10.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-10T14:06:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b88bb4810e54fa27343fcba2e29947a67e807226",
          "body": null,
          "is_bot": false,
          "headline": "chore: add bench sample 10 doc.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-10T14:03:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c52ffcb63152c8229a3afe6efc7e146c885cf7e",
          "body": null,
          "is_bot": false,
          "headline": "fix: codecov.yml wasn't updated to reflect the agentutil split.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-09T04:16:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e53b414717355203e78fc07b93debc3ac3f8b62",
          "body": "Release/v0.20.0",
          "is_bot": false,
          "headline": "Merge pull request #20 from borisdali/release/v0.20.0",
          "author_name": "borisdali",
          "author_login": "borisdali",
          "committed_at": "2026-07-09T03:05:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b906d5ec3581bfa2c8f548219144f3106875fad0",
          "body": "…lder records.\n\nAfter flag parsing, fs.Visit detects whether --since was explicitly set.\nIf --incident is active and --since was not provided, the default widens from\n24h to 7d before the sinceDur normalization runs.\n\nThe title line will now say last 7d when you run\n`vault journey --incident` withou\n[…]\ntion, get_slow_queries, g...\n\n  ! = fabrication mismatch (agent reported success but no tool call recorded)\n\nTo drill into a trace:\n  faulttest vault journey <trace_id> --gateway http://localhost:8080",
          "is_bot": false,
          "headline": "fix: problem with `vault journey --incident` not showing historical/o…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-09T02:41:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0469ff00c588d6dedda3f65e280c16393e456165",
          "body": "DiagnosisModel was an annotation, not a verified fact.\nLine 178: it reads HELPDESK_MODEL_NAME or --agent-model.\nThere was no check that the running agent is actually using that model.\nIf you forget to set HELPDESK_MODEL_NAME when switching models,\nthe cert lands under \"\" (empty string) and cert-compare filters by model\nname so it simply finds nothing. The failure mode is silent too.\nYou get \"No stability certs found\" rather than an error. Fixed.",
          "is_bot": false,
          "headline": "fix: add a simple verification on the diagnostic model.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-09T00:12:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5006ebf82f74ce8a95b59f7626b59a663ea643c2",
          "body": "Changes:\n- extra blank line gone\n- pass rate renamed to diag_rate in the regression detail line\n- a legend line that answers your question before the table.\n\nalso:\n\n- change the display legend (now says \"triage diagnosis cert only …\n  remediation not included\")\n- updated the doc (VAULT.md) to be explicit \"necessary condition, not sufficient\"\n  note with the gap named).",
          "is_bot": false,
          "headline": "fix: cosmetic issues with the compare-certs.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-08T23:32:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7ccb78d7cc6c109873655e0259903482fb6e9abd",
          "body": "`get_host_logs` returned empty and provided no guidance, so the agent\nappears to (sometimes!!!)  conclude that \"no log output, external kill\"\nwithout proceeding to `read_pg_log_file`.\n\nFix: move the instruction into the tool response itself.\nThe agent now receives an explicit \"(no output — call `rea\n[…]\nThe previous fix (822e060) patched the same failure in the gateway\npath by improving the playbook guidance. Not reliable enough, only\nhelps sometimes. This patches the direct-agent path at the source.",
          "is_bot": false,
          "headline": "fix: TestFaultInjection/db-wal-disk-full fails again in a faulttest run.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-08T23:21:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "12c9116335a38d09981a43a0f6ed8251eebe3b8f",
          "body": "…x. Presently it's 34 (not 7).",
          "is_bot": false,
          "headline": "chore: fix vault's wording on the number of PBs we ship out of the bo…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-08T18:48:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "634cd4fe05c32ee0e26c6950821b88ab84b453c4",
          "body": "The new cert-compare surface has five pure functions and one HTTP client:\n\n1/ changeLabel:\n   regression, improvement, unchanged (both stable), unchanged (both unstable), missing (one nil), missing (both nil)\n\n2/ changeOrder:\n   sort priority — regression < improvement < stable-stable < unstable-uns\n[…]\ns \"No stability certs found\" message\n\nThese join the 9 unit tests already written (pure functions + HTTP client),\ngiving vault cert-compare complete coverage from the data layer through the CLI output",
          "is_bot": false,
          "headline": "chore: add test coverage for vault cert-compare.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-08T13:30:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "daba3ace541dccc5acf403dcd650f3b2db2e9231",
          "body": "…before any decisions.\n\nThe same two-sentence directive is now appended to all three agent prompts.\nIt closes the silent-batch gap with zero risk:\nThe model already tends to narrate, but this addition just makes it\nmandatory. The wording explains why (audit trail), which matters.\nModels follow instr\n[…]\nrary constraint.\n\nBefore calling any tool, emit one sentence stating what you expect to find and why. This ensures the audit trail captures your reasoning at each decision point, not just the outcome.",
          "is_bot": false,
          "headline": "chore: add new directive to all agents to request internal reasoning …",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-08T03:49:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ad6b7448bdece135bc428c1fa9ca2854b0a013f9",
          "body": "…ove) to vault journeys --incident --detail.",
          "is_bot": false,
          "headline": "fix: cosmetic display issue: add origin (agent/direct_tool/agent_appr…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-08T03:26:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b9ec25e52b70fac50039cb7c3f0498c2a863697e",
          "body": "The probem with the --detail option:\nEXECUTION TRACE empty: journeyEvent.ToolExecution had json:\"tool_execution\",\nbut audit.Event.Tool serializes as \"tool\", so every tool_execution event\nhad ev.ToolExecution == nil and was skipped.\nFix: json:\"tool_execution,omitempty\" → json:\"tool,omitempty\".\n\n[bori\n[…]\n    [ok]\n    (no preceding reasoning captured)\n\nINCIDENT LINK\n──────────────────────────────────────────────────────────────────────\n  Run ID:            plr_d7e1df41\n\n  → vault incidents plr_d7e1df41",
          "is_bot": false,
          "headline": "fix: vault journey --incident --detail didn't return execution trace.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-08T02:57:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "95b5a670d34ed8c0686b88978d46ae60f3f0b90e",
          "body": "Problem: vault journey --incident fetched the 20 most recent journeys,\nthen filtered client-side for IncidentRunID != \"\".\nIf your recent audit history had >20 non-incident journeys\n(routine ar_* agent calls) since the last faulttest run,\nthe incident-linked traces were simply past the limit.\n\nFix: a\n[…]\nw applies\nafter filtering, not before. The incident_only=true param\nis parsed in both the auditd handler and the local-governance\nhandler and vault.go passes it server-side instead of filtering in Go.",
          "is_bot": false,
          "headline": "fix: vault journey --incident doesn't return incident-linked journeys.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-08T02:32:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "822e0605b059cd69e7d3c1ba40604c7da2645758",
          "body": "Problem with scoring. Fix: improve the wal-disk-full.yaml sysadmin playbook guidance.\n\nStep 1 rewrite —\nThe old text said\n\"call get_host_logs. Look for the PANIC line\" which implied the PANIC would be there.\n\nThe new text:\n  - Explicitly names both tools as mandatory (a) / b))\n  - Explains why get_h\n[…]\nhypothesis\" — the same language the system prompt uses, so the two sources reinforce rather than contradict each other\n\nThe problem was the PB overriding it with a more specific but wrong instruction.",
          "is_bot": false,
          "headline": "fix: faulttest-gateway failure on TestFaultInjection/db-wal-disk-full.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-08T01:43:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c274a62d5906b07c145bd1d91fb16f3fea422b5f",
          "body": "Added 28 new tests in testing/cmd/faulttest/vault_test.go:\n1/ TestPct (6 cases) — percentage formatter\n2/ TestMax (3 cases) — two-arg max\n3/ TestFaultFromTraceID (6 cases) — trace ID → fault ID stripping\n4/ TestFormatRemediationOutcome (6 cases) — nil/missing/valid timestamps/empty outcome\n5/ TestSc\n[…]\nf-slice\n6/ TestFetchStabilityCert_* (5 cases) — found, 404, network error, empty URL, auth header\n7/ TestPostStabilityCert_* (4 cases) — payload fields, auth header, empty gateway no-op, 500 tolerance",
          "is_bot": false,
          "headline": "chore: additional test coverage for vault journey --detail.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-07T21:44:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5070ef576688488ec680c1de818da6f438526d61",
          "body": "Added 19 new tests:\n\n1/ TestWrapLines (7 cases):\n   Table-driven, mirrors the existing TestWordWrap pattern.\n   Covers the new wrapLines helper including empty input, paragraph breaks, blank-line skipping, and long-word passthrough.\n\n2/ TestFetchRunEvents_* (7 cases):\n   httptest.Server mocks, mirro\n[…]\nelper.\n   Covers: empty events, reasoning text interleaved before tool call (no orphan annotation), orphan tool with annotation, tool error status [error], one reasoning block covering multiple tools.",
          "is_bot": false,
          "headline": "chore: add unit test coverage for vault journey --detail.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-07T21:33:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "061c8b7bed69b98c87231bc94e46255c2c4737b0",
          "body": "When the --detail flag is passed with a journey that has an incident run ID,\nit calls GET /api/v1/fleet/playbook-runs/{runID}/events?types=agent_reasoning,tool_execution&limit=500,\nthen renders the EXECUTION TRACE section instead of flat TOOLS USED:\n\n  EXECUTION TRACE\n  ─────────────────────────────\n[…]\nexists\n   (e.g. direct A2A call not linked to a faulttest run),\n   it falls back to the flat TOOLS USED list with a one-line note\n\n4/ No gateway changes needed as it uses the existing /events endpoint",
          "is_bot": false,
          "headline": "feat: add vault journeys --detail.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-07T20:49:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4f42451e619dbdfea1acd4605265a276e79370c5",
          "body": "1/ NewReasoningCallback:\n   Before: 0%, After: 100%\n\n2/ CheckKubernetes:\n   Before: 0%, After: 100%\n\n3/ CheckKubernetesResult:\n   Before: 0%, After: 100%\n\n4/ registerSchemasHandler:\n   Before: 0%, After: 77.8%\n\n5/ CheckDatabaseSessionAge:\n   Before: 12.5%, After: 56.2%\n\n6/ agentutil total:\n   Before: 64.1%, After: 70.3%\n\n7/ agentutil/serve total:\n   Before: 35.8%, After: 39.2%",
          "is_bot": false,
          "headline": "chore: increase unit test coverage for agentutil after split.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-07T19:40:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "48fe4d1d9807de6123c65b83e5f2f6b20cae95ae",
          "body": "faulttest and gateway currently import all of agentutil, but only\nuse Config and NewTextCompleter. They're pulling in adka2a and\nall ADK server machinery unnecessarily. After this split they\nimport only the library package.\n\n1/ agentutil_test.go:\n   Removed dead imports (a2asrv, adka2a, session),\n  \n[…]\nknown, Len)\n   Route tests moved to serve\n\n3/ agentutil/serve/serve_test.go:\n   New file with package serve, containing all toolCallCallbacks tests +\n   all registerDirectToolRoutes HTTP handler tests",
          "is_bot": false,
          "headline": "chore: refactor agentutil: move server wiring to agentutil/serve.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-07T19:25:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d2823176e89c1d1cba7abd0a8f7fdcd13378afd5",
          "body": "… pending until stats gathered.\n\nOnce activated, is_active becomes true, so the pending-draft\nfilter skips it, but it has no runs so StatsByVersion\nalso skips it. It falls through both.\nFix: check whether the playbook is already in the versions slice\n(by PlaybookID), not whether it's a draft.",
          "is_bot": false,
          "headline": "fix: vault versions had a logical issue with new PB disappearing from…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-07T05:31:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d856c205d0096063a3c15ca83d6a19d97a26b8cc",
          "body": "http://github.com/borisdali/helpdesk/actions/runs/28838587204\n\ntesting/cmd/faulttest/vault_test.go:\nThe purgeOrphanDrafts function signature now includes Source,\nbut the test file uses a testDraft type without it. Let me fix it:",
          "is_bot": false,
          "headline": "fix: CI failure of not adding the new source column to the test.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-07T03:34:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "59f92c371ddc05790ced8230cac07d4f7ed2c723",
          "body": "…aft (vault drafts).",
          "is_bot": false,
          "headline": "fix: issue with the imported PB (vault import) not showing up as a dr…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-07T03:06:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8eeb1176fcdd067c0e3ddb2362d4c4d8511a0446",
          "body": "…ent it.",
          "is_bot": false,
          "headline": "fix: border for the data quality banner warning is not closed + docum…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-07T01:04:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a8a4b997689d844cdaf35bd2a504db7cf5a4d29c",
          "body": "The root cause was that handlePlaybookSetJudgeVerdict consumed r.Body\nwith the JSON decoder before proxyToAuditd could forward it.\nauditd received an empty body, couldn't find verdict, returned 400.\nFix: buffer the body bytes, validates them, then restores r.Body\nas an io.NopCloser before proxying.\n\n[…]\n                                                                                                                                                0.1s\n\nreal    5m3.142s\nuser    0m1.295s\nsys     0m1.320s",
          "is_bot": false,
          "headline": "fix: e2e test failure in TestPlaybooks_JudgeVerdictRoundtrip.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-06T21:57:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "46a677fd5cecf412b31efa78609183be451a972f",
          "body": "…acy, etc.",
          "is_bot": false,
          "headline": "chore: add docs for the new v0.20 features: vault import, judge accur…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-06T21:34:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b1b28d515f8b9fd57af9e360c4c971858efba8f",
          "body": "Added to testing/e2e/playbooks_test.go:\n1/ TestPlaybooks_TriggerContextRoundtrip:\n   POSTs trigger_context in a run body, fetches the run by ID, asserts the field is present\n\n2/ TestPlaybooks_JudgeVerdictRoundtrip:\n   Creates a draft, POSTs a verdict, GETs the playbook, asserts judge_verdict/judge_model/judge_at are all set\n\nAdded to testing/e2e/e2e.go:\n3/ SetJudgeVerdict client helper.\n   Both tests use the standard t.Skipf guard when the gateway is unreachable and run under go test -tags e2e.",
          "is_bot": false,
          "headline": "chore: add e2e tests for the trigger context and judge verdict.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-06T21:10:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9202546cd13cf90e7d74f12a1c5ba1987eb7dc98",
          "body": "…0 features.\n\ninternal/audit/fault_stability_store_test.go:\n1/ Extended TestFaultStabilityStore_Migrate to verify old rows survive table recreation\n2/ TestFaultStabilityStore_MultiModel_Coexist — same fault, two models coexist independently; update only hits correct row\n3/ TestFaultStabilityStore_Ge\n[…]\nk_import_test.go:\n9/ approval_mode: agent added to both YAML and LLM path tests\n\ntesting/cmd/faulttest/config_test.go:\n10/ TestReorderArgs — 8 table-driven cases covering all flag/positional orderings",
          "is_bot": false,
          "headline": "chore: add 10 new unit tests to extend test coverage for the new v0.2…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-06T21:03:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b94e3a63954473492dca59042b31e8ca0b43011e",
          "body": "Add the judge accountability feature:\n\ntesting/cmd/faulttest/vault.go:\nAdd `judge-accuracy`: vaultJudgeAccuracy now shows per series judge verdict\nrecorded at diff time and the actual outcome after runs accumulated\non that version. This closes the \"the judge said LIKELY_IMPROVEMENT —\ndid run data co\n[…]\n/playbooks/{id}/judge-verdict:\n\ninternal/audit/playbook_store.go:\nAdd judge_verdict, judge_model, judge_at to the playbooks table.\nAdd a SetJudgeVerdict method to the store and wire it in the gateway.",
          "is_bot": false,
          "headline": "feat:  judge-accuracy to gauge the judge accountability.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-06T05:14:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "60e9b93be72baf99aa086848ebf64ef1a659221d",
          "body": "…r + trigger context.\n\ntesting/cmd/faulttest/main.go:\nAdd reorderArgs helper that puts positional args after flags.\nThen use it everywhere fs.Parse is called\n\ncmd/gateway/playbook_import.go:\nFix approval_mode dropped on playbook import\n\ntesting/cmd/faulttest/vault.go:\nAdd calibration data quality banner\n\ninternal/audit/playbook_run_store.go:\nAdd trigger_context on PlaybookRun to remembr the orig request.\nThis is a schema + API + display change.",
          "is_bot": false,
          "headline": "feat: positional args in faulttest + approval mode drop + calib banne…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-06T04:42:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2aedeb4de49b0a21ed1feef496d1576ab01647bb",
          "body": null,
          "is_bot": false,
          "headline": "chore: add the customer bill of rights + second opinion docs.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-06T02:53:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a1f88632f30686d00f3b1c7336096207cf4ff45",
          "body": "…n diffs.",
          "is_bot": false,
          "headline": "chore: update the bench sample 9 doc: `vault diff` to show the versio…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-05T21:58:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "96c52f514ab22cd55d4796d4e92f80e58b86acce",
          "body": null,
          "is_bot": false,
          "headline": "chore: minor cosmetic doc fidex in bench sample 8 and consistency.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-05T20:58:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9629ec25e5d1ceb76497b0091fe21a9e97a524c3",
          "body": null,
          "is_bot": false,
          "headline": "chore: minor doc fixes in jugement layer + bench sample 9.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-05T03:39:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "50fecd5064a90188e9165c316dba78810bc2e62f",
          "body": null,
          "is_bot": false,
          "headline": "chore: add the judgment layer doc + the refs from vault and principles.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-05T02:07:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d12e19b424a58b1c093f0c17d3fbeff9e672cd98",
          "body": "…he bench sample 9 doc.",
          "is_bot": false,
          "headline": "chore: fix the connection-triage PB + docker compose timeouts + add t…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-04T23:37:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7ad58567111bea821aea3a2320a76ab6158c5d99",
          "body": "When `vault incidents pbs_vacuum_triage` ran, each row used the catalog's\nfirst-match reverse lookup. The fix is simple: extracted the fault from\nits own trace ID. The output is correct now:\n\n  plr_e8c89753  2026-07-02 02:34  db-vacuum-needed   transitioned  resolved 54.0s  ...\n  plr_31796641  2026-06-22 20:15  db-table-bloat     transitioned  –               ...",
          "is_bot": false,
          "headline": "fix: bug in `vault incidents` where the fault column may be incorrect.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-03T20:24:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3b5b868ec20797ed3ae51df621f4581e4bc9e951",
          "body": "…ion rate for triage PBs.\n\n[boris@ ~/helpdesk]$ go run ./testing/cmd/faulttest vault list --gateway $HELPDESK_GATEWAY_URL --api-key  $HELPDESK_CLIENT_API_KEY\nGateway: http://localhost:8080  ·  version: dev  ·  host: cassiopeia\n\nFAULT                            PLATFORM   DIAG PLAYBOOK               \n[…]\n is 0%. The actual signal is the transition rate (83-88%).\n\nAfter this fix the sub-rows now read like this:\n  1.4 *  9r  88%  avg: 1m26s recovery  100% approach OK\n  1.3    12r  83%  avg: 17s recovery",
          "is_bot": false,
          "headline": "fix: minor cosmetic fix in `vault list` incorrectly rendering resolut…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-02T17:32:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6278bb2b9301ff4cdfe0072c42e38ab198285dc4",
          "body": "HEAD of adk-go has moved internal packages to a v2/ subtree, which\ncauses Go to reject imports of google.golang.org/adk/v2/internal/...\nwhen the Dockerfile rewires the replace directive to the local clone.\n\nPinning to v0.6.0 keeps the clone in sync with the tagged version\nin go.mod so the Docker build and cross-compile steps stay consistent.",
          "is_bot": false,
          "headline": "fix: pin adk-go clone to v0.6.0 tag in CI and release workflows.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-02T05:26:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "67dc84a9112994e06b21f3c23d4ba96a19c6e10d",
          "body": "Release/v0.19.0",
          "is_bot": false,
          "headline": "Merge pull request #19 from borisdali/release/v0.19.0",
          "author_name": "borisdali",
          "author_login": "borisdali",
          "committed_at": "2026-07-02T05:02:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b9552f566864f02cb78990b69b0ae25b2249ce8f",
          "body": null,
          "is_bot": false,
          "headline": "fix: linter issues.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-02T04:56:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "732a5ad1f6a6734c4a750ad08f57efc3bcd34c41",
          "body": "notify_test.go has 5 call sites for requestVaultDraft that weren't updated\nwhen the seriesID parameter was added. All 5 call sites just need an empty\nstring for seriesID. They're testing the HTTP mechanics, not the series pinning.",
          "is_bot": false,
          "headline": "fix: add `vault list --short` and notify_test bug found by CI.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-02T02:36:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fcc129db3c170f5506744c0b3d1fa530f0acdd87",
          "body": "timestamp=... level=WARN msg=\"from-trace: draft has protocol violations\" playbook_type=triage warnings=\"[execution_mode: triage playbooks must use \\\"agent\\\", got \\\"\\\" guidance: missing FINDINGS: line — triage playbooks must emit structured findings guidance: missing signal line — must end with TRANS\n[…]\nd (f.DiagnosisPlaybookSeriesID) from the failure's\ndiagnosis playbook series to requestVaultDraft so the handler can fetch\nthe active playbook and use the improvement prompt instead of cold synthesis.",
          "is_bot": false,
          "headline": "fix: warn in gateway for faulttest run",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-02T02:12:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "64383030ffd2a9ef23ebf08a0ba35abea4c3c5d7",
          "body": "…n `vault suggest-update1`.\n\n[boris@ ~/helpdesk]$ go run ./testing/cmd/faulttest vault incidents pbs_vacuum_triage --gateway $HELPDESK_GATEWAY_URL --api-key $HELPDESK_CLIENT_API_KEY\nGateway: http://localhost:8080  ·  version: dev  ·  host: cassiopeia\n\nIncidents for pbs_vacuum_triage (pbs_vacuum_tria\n[…]\ny\nit goes straight to from-trace with the raw PLR ID.\nFix is straightforward: when --trace-id is a plr_* ID, run the same narrative\nresolution as pickBestRunForSuggest before sending it to from-trace.",
          "is_bot": false,
          "headline": "fix: cosmetic changes to `vault incidents` + PLR->trace enhancement i…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-01T23:39:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6ad31c6b7e0c9616a3452c29b3d7dd9173c5ba45",
          "body": "Closed 3 small gaps:\n\n1/ TestPlaybookStore_CreateAndGet\n   Didn't assert PlaybookType round-trips through DB, so that\n   if the column were missing from the INSERT or SELECT it would silently zero out.\n\n2/ TestSeedSystemPlaybooks_NewFields\n   Didn't verify playbook_type survives the seed cycle.\n\n3/ TestHandlePlaybookFromTrace_PreservesOperationalFieldsFromActive\n   Didn't assert PlaybookType is preserved, so that the field was\n   just added to the preservation block.",
          "is_bot": false,
          "headline": "chore: add test coverage + docs.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-01T22:00:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0efd1d97144eefc56bed5789d484803b55a224be",
          "body": "playbook_type field — \"triage\" | \"remediation\" | \"\"\nIt's now a first-class field on Playbook, persisted in SQLite/Postgres,\nround-tripped through the API, and carried forward in\nthe operational preservation block on suggest-update.\n\n31 system playbooks updated:\n  21 → triage, 10 → remediation.\n  The\n[…]\ndiation,\nreturns warnings in the suggest-update response and is a no-op\nfor untyped playbooks. Violations are non-blocking. The draft\nis persisted and the operator sees the warnings before activating.",
          "is_bot": false,
          "headline": "feat: add playbook type (triage/remediation) to all PBs.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-01T21:38:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fddec7ca84b1b51aef5c89ccd995c6da905f030e",
          "body": "Simple addition of a call to DELETE /api/v1/fleet/playbooks/{id}.\nModel it exactly after `vault activate`.\n\n[boris@ ~/helpdesk]$ go run ./testing/cmd/faulttest vault discard pb_a9258113 --gateway $HELPDESK_GATEWAY_URL --api-key  $HELPDESK_CLIENT_API_KEY\nGateway: http://localhost:8080  ·  version: de\n[…]\ngo run ./testing/cmd/faulttest vault drafts --gateway $HELPDESK_GATEWAY_URL --api-key  $HELPDESK_CLIENT_API_KEY\nGateway: http://localhost:8080  ·  version: dev  ·  host: cassiopeia\n\nNo pending drafts.",
          "is_bot": false,
          "headline": "feat: add `vault discard` feature.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-01T21:09:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2e76753fe383ea1900062c841da73cee840d4b9a",
          "body": null,
          "is_bot": false,
          "headline": "chore: updated the docs for llm-as-judge for `vault diff -judge`.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-01T18:21:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d19be8157f5e0a7d7dfb3cd13ae7269d63cec347",
          "body": "…rom-trace.\n\n1/ vault diff --judge:\n   testing/faultlib/playbook_judge.go:\n   JudgePlaybookDiff takes a PlaybookDiffInput (before/after knowledge\n   fields + pre-computed operational drift list), calls the LLM with\n   a structured prompt and returns PlaybookJudgeResult with Verdict\n   (APPROVE/NEEDS\n[…]\nequires_evidence, permitted_tools, target_hints\n\n   If the active-version fetch fails (new series, no active version yet),\n   it logs a warning and proceeds with the LLM's values rather than aborting.",
          "is_bot": false,
          "headline": "feat: add new `vault diff -judge` feature + preserve op settings in f…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-01T17:44:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6e13d2ea03eef69e836e54f60aa66f12291313e0",
          "body": "…diation outcome.\n\nAmend `vault versions` to work on faults, not just PBs, so that a result\nof a faulttest run can show both the triage and remediation outcome/improvement:\n\nfaulttest vault versions db-max-connections --gateway $GW --api-key $KEY\n\nNow shows both pipelines in one output:\n\n  Version s\n[…]\nw reliably the agent reaches the remediation gate\nThe remediation section shows how often recovery actually succeeds.\nTogether they tell you whether v1.4 improved the full pipeline, not just one half.",
          "is_bot": false,
          "headline": "feat: `vault versions` gains by-fault option to show both triage/reme…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-01T15:12:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2d3f89383fccb64e7a01635b6f4dc9bb947a6663",
          "body": "-- See all versions, including v1.4 that was deactivated by the seeder bug:\nfaulttest vault history pbs_connection_remediate --gateway $GW --api-key $KEY\n\n-- Compare v1.3 vs v1.4 using IDs from the history output\nfaulttest vault diff pb_be8b5667 pb_31575294 --gateway $GW --api-key $KEY\n\n-- Re-activate v1.4 (if it's still in the DB, just inactive):\nfaulttest vault activate pb_31575294 --gateway $GW --api-key $KEY",
          "is_bot": false,
          "headline": "feat: add `vault history`.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-01T03:51:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bfdd441052d4596f67eee81b712633c4a76a0d0a",
          "body": "[boris@ ~/helpdesk]$ go run ./testing/cmd/faulttest vault versions --gateway $HELPDESK_GATEWAY_URL --api-key\n$HELPDESK_CLIENT_API_KEY pbs_connection_remediate\nGateway: http://localhost:8080  ·  version: dev  ·  host: cassiopeia\n\nVersion stats for pbs_connection_remediate — 1 version(s)\n\nVERSION     \n[…]\nnclude_system=true.\n   The table already has a SOURCE column, so system playbooks show as\n   \"system\" and operators can see what's actually running even when\n   no generated version has been promoted.",
          "is_bot": false,
          "headline": "fix: two bugs with the seeder + `vault active`.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-01T03:31:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9e7547c431610b2d8344c04ea0414846e0d9fdff",
          "body": "…id=/from= detail.\n\n1/ vault versions now shows an id= / from= detail line under each version row,\n   giving you the playbook_id and origin_trace (run that generated it).\n   The two pieces needed for post-activation archaeology.\n\n2/ vault diff now has two modes:\n  - Single-ID (existing): vault diff \n[…]\nt diff <id1> <id2>`:\n    fetches both by playbook ID, orders by version (lower = \"before\"),\n    compares field by field. Works after both versions are already activated.\n    No activate/discard hints.",
          "is_bot": false,
          "headline": "feat: add `vault diff` now works with 2 IDs + `vault versions` shows …",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-01T02:31:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "47c05b87b44a6aace497dad16edbe6143fcc07f8",
          "body": "…roving.\n\nThe workflow:\n\n-- See what's pending\nfaulttest vault drafts --gateway $GW --api-key $KEY\n\n-- Compare draft vs active — only changed fields shown\nfaulttest vault diff pb_40729257 --gateway $GW --api-key $KEY\n\n-- Approve\nfaulttest vault activate pb_40729257 --gateway $GW --api-key $KEY\n\n-- C\n[…]\nent strategy directly) and escalation\n(determines when the agent calls a human instead of acting).\n\nIf the diff shows neither changed meaningfully, the draft is safe\nto activate or discard as a no-op.",
          "is_bot": false,
          "headline": "feat: add `vault diff` to decide if the new version of a PB worth app…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-01T01:55:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "de1ebdafbc6fb61d86ee6b7a322c6907203882ce",
          "body": "…ctivated drafts.\n\n1/ `vault activate <draft-id>`:\n   New subcommand, no curl needed:\n  \tfaulttest vault activate pb_40729257 --gateway $GW --api-key $KEY\n\n2/ fix `vault drafts` bug, so that it now filters is_active=false client-side\nand activated playbooks vanish from the queue immediately after promotion.",
          "is_bot": false,
          "headline": "feat: add `vault activate` + fix `vault draft` bug of non-vanishing a…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-07-01T00:24:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f865214fae5a4b1c98507b94fe6fb9767836e059",
          "body": "playbook_from_trace_test.go:\n4 new tests:\n1/ TestHandlePlaybookFromTrace_FallsBackToStepsWhenEventsEmpty:\n   Verifies the gateway calls /steps when audit_events returns []\n   for a plr_* ID and the LLM prompt contains the step tool names\n\n2/ TestHandlePlaybookFromTrace_NoFallbackForNonPlrPrefix:\n   \n[…]\nlls when nothing is an orphan\n\n7/ TestPurgeOrphanDrafts_SendsAuth:\n   Bearer token forwarded on DELETE\n\n8/ TestPurgeOrphanDrafts_SkipsOnServerError:\n   500 from server → counted as 0 deleted, no panic",
          "is_bot": false,
          "headline": "chore: add additional test coverage for from-trace and orhans-delete.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-06-30T01:06:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2c6eb10b7600037dd1ab2d9806a48b5d266d6840",
          "body": "[boris@ ~/helpdesk]$ go run ./testing/cmd/faulttest vault active --gateway $HELPDESK_GATEWAY_URL --api-key $HELPDESK_CLIENT_API_KEY\nGateway: http://localhost:8080  ·  version: dev  ·  host: cassiopeia\n\nSERIES                              VERSION  SOURCE     UPDATED     NAME\n─────────────────────────\n[…]\n\n   Caller's series_id/version win over whatever the LLM wrote\n\n7/ TestHandlePlaybookFromTrace_NoPinUsesGeneratedSeries:\n   Omitting series_id still produces a pbs_generated_* series (backward compat)",
          "is_bot": false,
          "headline": "feat: add `vault activate` + test coverage.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-06-30T00:52:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8082f6180ef19e4bb864084829b5ce7f187e40a9",
          "body": null,
          "is_bot": false,
          "headline": "feat: add `vault drafts` + auto-select a trace id for `suggest-udpate`.",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-06-30T00:28:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "09d6916159f42caed64fd3f1174647d8c28c2fcc",
          "body": "…he error up the stack.\n\n1/ Formatting issue with `vault list`:\n   Columns need to grow:\n        DIAG maxes out at 30 (pbs_checkpoint_bgwriter_triage),\n        REMED at 31 (pbs_k8s_scale_to_zero_remediate).\n   Setting them to 31/32 gives one character of padding.\n\n2/ Add the hostname/version line at\n[…]\no pipefail`. bash uses the rightmost non-zero\n   exit code in any pipeline. When go test exits 1, the\n   go test ... | tee pipeline now exits 1, failing the step\n   before even reaching the grep line.",
          "is_bot": false,
          "headline": "feat: cosmetic issues with `vault list` + CI bug of not propagating t…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-06-29T21:22:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "75047c3f4585c75d8f070924d666ab1a7fdab996",
          "body": "… recertify.",
          "is_bot": false,
          "headline": "chore: update the main testing doc to include faultest-gateway + make…",
          "author_name": "Boris Dali",
          "author_login": "borisdali",
          "committed_at": "2026-06-29T17:30:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 44,
      "commits_last_year": 712,
      "latest_release_at": "2026-07-17T03:49:12Z",
      "latest_release_tag": "v0.21.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 27,
      "days_since_latest_release": 9,
      "mean_days_between_releases": 6.6
    },
    "community": {
      "has_readme": true,
      "has_license": false,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 28,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": []
    },
    "popularity": {
      "forks": 0,
      "stars": 7,
      "watchers": 1,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "samples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 189197,
      "source_files_sampled": 288,
      "oversized_source_files": 11,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/a2aproject/a2a-go",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.3.3"
        },
        {
          "name": "github.com/anthropics/anthropic-sdk-go",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.19.0"
        },
        {
          "name": "github.com/google/uuid",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/jackc/pgx/v5",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v5.8.0"
        },
        {
          "name": "google.golang.org/adk",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.6.0"
        },
        {
          "name": "google.golang.org/genai",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.40.0"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        },
        {
          "name": "k8s.io/api",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.35.0"
        },
        {
          "name": "k8s.io/apimachinery",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.35.0"
        },
        {
          "name": "k8s.io/client-go",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.35.0"
        },
        {
          "name": "modernc.org/sqlite",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.45.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 21,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "borisdali",
          "commits": 712,
          "avatar_url": "https://avatars.githubusercontent.com/u/25356173?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "golangci-lint.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": 10,
            "reason": "1 out of 1 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/14 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": 0,
            "reason": "license file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "33 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "819497cab148818ca1f002b9195a0c9332b46cd5",
        "ran_at": "2026-07-26T05:57:31Z",
        "aggregate_score": 2.8,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-24T22:49:52Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-17T03:35:25Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/borisdali/helpdesk",
    "host": "github.com",
    "name": "helpdesk",
    "owner": "borisdali"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 54,
      "inputs": {
        "security": 28,
        "vitality": 86,
        "community": 19,
        "governance": 40,
        "engineering": 86
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 86,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 83,
            "inputs": {
              "commits_last_year": 712,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 27
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "27/52 weeks with commits",
                "points": 18.7,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 27
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "712 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 712
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 44,
              "latest_release_tag": "v0.21.0",
              "releases_from_tags": false,
              "days_since_latest_release": 9,
              "mean_days_between_releases": 6.6
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "44 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 44
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 9 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~6.6 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 6.6
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 4,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 4 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 19,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "forks": 0,
              "stars": 7,
              "watchers": 1,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "7 stars",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "1 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "critical",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "has_readme": true,
              "has_license": false,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "no license file detected",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "license_absent",
                    "params": {}
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 40,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 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": 21,
              "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": "21/21 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 21,
                      "decided": 21
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/14 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "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": 43,
            "inputs": {
              "followers": 3,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "borisdali",
              "public_repos": 11,
              "account_age_days": 3468
            },
            "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": "3 followers of borisdali",
                "points": 4.3,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 3,
                      "login": "borisdali"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "11 public repos, account ~9 yr old",
                "points": 19.9,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 11
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 9
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "excellent",
        "name": "Engineering Quality",
        "value": 86,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 84,
            "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": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": ".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": "1 out of 1 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [
                "ai",
                "database",
                "generative-ai",
                "kubernetes",
                "postgres",
                "support",
                "dba",
                "sre",
                "agentic-ai",
                "agents",
                "multi-agent"
              ],
              "has_wiki": false,
              "homepage": "https://aiHelpDesk.biz",
              "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://aiHelpDesk.biz",
                "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": "11 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 11
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "critical",
        "name": "Security",
        "value": 28,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 28,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 2.8
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "1 out of 1 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/14 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 not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "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": "moderate",
        "name": "AI Readiness",
        "value": 62,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "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": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 98,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 189197,
              "source_files_sampled": 288,
              "oversized_source_files": 11
            },
            "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": "11/288 source files over 60KB",
                "points": 52.9,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 288,
                      "oversized": 11
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "samples"
              ],
              "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": "samples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "samples"
                    }
                  }
                ],
                "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",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-26T05:57:41.051967Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/b/borisdali/helpdesk.svg",
  "full_name": "borisdali/helpdesk",
  "license_state": "absent",
  "license_spdx": null
}

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.