Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-23 00:21 UTC

getsigit / sigit

A local-Llm-first coding agent. Runs Qwen 2.5 and Qwen 3

RustCustom license★ 20 stars⑂ 1 forksince Mar 2026View on GitHub ↗

getsigit/sigit holds a health index of 59 out of 100, placing it in the Moderate band. It scores highest on Engineering Quality (81/100) and lowest on Community & Adoption (32/100). It was last updated today. A single contributor accounts for most of its recent work.

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

59
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

1 follower4 public repossince Apr 2026

This repository is backed by an organization — shared, accountable stewardship that can outlive any single maintainer.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
crates.iosigit1.5.081140 days agoaiclillmcoding-agentsigitcommand-line-utilities
PyPIsigit-code1.5.0-160 days agosigitcliaicoding-agentllmon-device

Metrics by category

Vitality

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

79Good · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
6.9/36Commit cadence — 10/52 weeks with commits
18/18Commit volume — 297 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 10 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year297
human_commit_share1
days_since_last_push0
active_weeks_last_year10
How it's scored
27/27Ships releases — 17 releases published
36/36Release recency — latest release 0 days ago
27/27Release cadence — a release every ~4.8 days
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Inputs used
releases_count17
latest_release_tagv1.5.0
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases4.8

Community & Adoption

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

32At risk · 18% of overall
How it's scored
20.7/60Stars — 20 stars
0/25Forks — 1 forks
0/15Watchers — 0 watchers
Inputs used
forks1
stars20
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
16.9/22.5License — license file present, not a recognized license
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
How it's scored
25.5/80Monthly downloads — 81 downloads/month across crates, pypi
0/20Registry dependents — not reported by this ecosystem
Inputs used
packagessigit, sigit-code
dependents
ecosystemscrates, pypi
total_downloads266
monthly_downloads81
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

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

56Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
10.6/22.5Commit distribution — top contributor authored 53% of commits
5.4/13.5Contributor breadth — 4 contributors
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Inputs used
bus_factor1
contributors_sampled4
top_contributor_share0.529
How it's scored
32.7/46.8Issue resolution — 70% of issues closed
35.8/38.3PR acceptance — 29/31 decided PRs merged
1.5/15OpenSSF Scorecard: Code-Review — Found 2/20 approved changesets -- score normalized to 1
Inputs used
merged_prs29
open_issues3
closed_issues7
issue_closed_ratio0.7
closed_unmerged_prs2
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
2.2/25Owner reach — 1 followers of getsigit
5.6/25Track record — 4 public repos, account ~0 yr old
Inputs used
followers1
owner_typeOrganization
is_verified
owner_logingetsigit
public_repos4
account_age_days102
How it's scored
25/25Published & resolvable — 2 package(s) on crates, pypi
35/35Publish recency — latest publish 0 days ago
20/20Version history — 16 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagessigit, sigit-code
ecosystemscrates, pypi
any_deprecatedno
min_days_since_publish0

Engineering Quality

Are baseline engineering and documentation practices in place?

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

Documentation

100Excellent
How it's scored
30/30README
25/25Documentation directory
15/15Documentation / homepage site — https://zed.dev/acp/agent/sigit
10/10Repository description
10/10Topics — 9 topics
10/10Wiki
Inputs used
topicsagent-client-protocol, code-editor, coding-agent, cargo, crates-io, inference-engine, rust-lang, qwen2-5, qwen3
has_wikiyes
homepagehttps://zed.dev/acp/agent/sigit
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

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

36At risk · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 3 out of 3 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.8/7.5Code-Review — Found 2/20 approved changesets -- score normalized to 1
1.5/2.5Contributors — project has 2 contributing companies or organizations -- score normalized to 6
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.2/2.5License — license file detected
7.5/7.5Maintained — 30 commit(s) and 10 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
1/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
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 — 13 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate3.6

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.

73Good · 0% of overall
How it's scored
45/45Agent instructions — .agents/AGENTS.md, AGENTS.md, CLAUDE.md
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 75 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.75
agent_instruction_files.agents/AGENTS.md, AGENTS.md, CLAUDE.md
agent_instruction_max_bytes17,808
How it's scored
12.6/18One-command bootstrap — Cargo.toml (toolchain convention, no task runner)
22/22Automated tests
0/11Lint / format config
11/11Static type checking — npm/sigit/tsconfig.json
10/10Reproducible environment — lockfile
10/10Demonstrated agent practice — 19 of the last 100 commits agent-authored or agent-credited
0/8Automated maintenance — no automated dependency updates observed
2/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
Inputs used
has_nixno
has_testsyes
lockfilesCargo.lock
has_dockerfileno
typed_languageyes
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configsnpm/sigit/tsconfig.json
agent_commit_share0.19
toolchain_manifestsCargo.toml
dependency_bot_commit_share0
How it's scored
45/45Type-checkable code — Rust (statically typed)
49.1/55Manageable file sizes — 3/28 source files over 60KB
Inputs used
primary_languageRust
largest_source_bytes181,610
source_files_sampled28
oversized_source_files3
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — examples
Inputs used
example_dirsexamples
has_mcp_signalno
api_schema_files

Key facts

20GitHub stars
4contributors
297commits, last 12 months
0days since last push
17releases
1bus factor
3open issues
crates.io, PyPIpackage 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
  • deps.dev does not index crates:sigit@1.5.0; advisories assessed against the repository dependency graph instead

More detail

OpenSSF Scorecard 3.6 / 10
3.6aggregate

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-23 00:21 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests3 out of 3 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
1Code-ReviewFound 2/20 approved changesets -- score normalized to 1
6Contributorsproject has 2 contributing companies or organizations -- score normalized to 6
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
9Licenselicense file detected
10Maintained30 commit(s) and 10 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
2Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 2
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
0Vulnerabilities13 existing vulnerabilities detected
Direct dependencies 19
RegistryPackageVersion constraintManifest
crates.ioagent-client-protocol1.0Cargo.toml
crates.ioonde1.1.2Cargo.toml
crates.iotokio1Cargo.toml
crates.iotokio-util0.7Cargo.toml
crates.iofutures0.3Cargo.toml
crates.ioratatui0.29Cargo.toml
crates.iocrossterm0.29Cargo.toml
crates.ioanyhow1Cargo.toml
crates.iolibc0.2Cargo.toml
crates.iolog0.4Cargo.toml
crates.iotracing-subscriber0.3Cargo.toml
crates.ioserde1Cargo.toml
crates.ioserde_json1Cargo.toml
crates.iotoml0.8Cargo.toml
crates.ioasync-trait0.1Cargo.toml
crates.ioregex1Cargo.toml
crates.ioreqwest0.12Cargo.toml
crates.iouuid1Cargo.toml
crates.iorpassword7Cargo.toml
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": [
        "agent-client-protocol",
        "code-editor",
        "coding-agent",
        "cargo",
        "crates-io",
        "inference-engine",
        "rust-lang",
        "qwen2-5",
        "qwen3"
      ],
      "is_fork": false,
      "size_kb": 1085,
      "has_wiki": true,
      "homepage": "https://zed.dev/acp/agent/sigit",
      "languages": {
        "Rust": 834040,
        "Shell": 1463,
        "JavaScript": 7728,
        "Go Template": 1569
      },
      "pushed_at": "2026-07-22T21:49:55Z",
      "created_at": "2026-03-19T11:51:12Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-22T21:33:11Z",
      "description": "A local-Llm-first coding agent. Runs Qwen 2.5 and Qwen 3",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "main",
      "license_spdx_raw": "NOASSERTION",
      "primary_language": "Rust",
      "significant_languages": [
        "Rust"
      ]
    },
    "owner": {
      "blog": "https://sigit.si",
      "name": "siGit Code & Deploy",
      "type": "Organization",
      "login": "getsigit",
      "company": null,
      "location": "Indonesia",
      "followers": 1,
      "avatar_url": "https://avatars.githubusercontent.com/u/275235537?v=4",
      "created_at": "2026-04-11T05:52:53Z",
      "is_verified": null,
      "public_repos": 4,
      "account_age_days": 102
    },
    "license": {
      "state": "custom",
      "spdx_id": null,
      "raw_spdx": "NOASSERTION",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.5.0",
          "kind": "minor",
          "published_at": "2026-07-22T22:11:59Z"
        },
        {
          "tag": "v1.4.1",
          "kind": "patch",
          "published_at": "2026-07-10T06:20:20Z"
        },
        {
          "tag": "v1.4.0",
          "kind": "minor",
          "published_at": "2026-07-07T15:23:14Z"
        },
        {
          "tag": "v1.3.2",
          "kind": "patch",
          "published_at": "2026-07-04T23:42:11Z"
        },
        {
          "tag": "v1.3.1",
          "kind": "patch",
          "published_at": "2026-07-02T06:49:37Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2026-06-30T08:34:21Z"
        },
        {
          "tag": "v1.2.2",
          "kind": "patch",
          "published_at": "2026-06-28T13:12:03Z"
        },
        {
          "tag": "v1.2.1",
          "kind": "patch",
          "published_at": "2026-06-25T06:39:53Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2026-06-23T19:35:29Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2026-06-10T00:52:12Z"
        },
        {
          "tag": "v1.0.4",
          "kind": "patch",
          "published_at": "2026-05-29T16:13:32Z"
        },
        {
          "tag": "v1.0.3",
          "kind": "patch",
          "published_at": "2026-04-30T11:10:01Z"
        },
        {
          "tag": "v1.0.2",
          "kind": "patch",
          "published_at": "2026-04-29T22:00:21Z"
        },
        {
          "tag": "v1.0.1",
          "kind": "patch",
          "published_at": "2026-04-28T06:15:09Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2026-04-26T12:55:51Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2026-04-25T10:05:03Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-04-24T11:58:13Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "431bc0d8aa3ffa39d48002480cbe33a6a79eb4df",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'development'",
          "author_name": "Seto Elkahfi",
          "author_login": "setoelkahfi",
          "committed_at": "2026-07-22T21:27:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a7fed6d96adbea4c94863013a1e30baaafe0345b",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'release/v1.5.0' into development",
          "author_name": "Seto Elkahfi",
          "author_login": "setoelkahfi",
          "committed_at": "2026-07-22T21:25:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d4b8b0f338cc88be848840e57acdf788625e8ad0",
          "body": null,
          "is_bot": false,
          "headline": "v1.5.0",
          "author_name": "Seto Elkahfi",
          "author_login": "setoelkahfi",
          "committed_at": "2026-07-22T21:19:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c6a4eac20aa43206bf5f663b4050e2895ae54f2",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'feature/mcp-registry-listing' into development",
          "author_name": "Seto Elkahfi",
          "author_login": "setoelkahfi",
          "committed_at": "2026-07-22T20:59:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "674b836af43db766b20c04deeec634dcace31825",
          "body": null,
          "is_bot": false,
          "headline": "Add MCP registry",
          "author_name": "Seto Elkahfi",
          "author_login": "setoelkahfi",
          "committed_at": "2026-07-22T20:59:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d43d986f62613c6fedab8094381ca312762747eb",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #41 from getsigit/feature/smbcloud-mcp-builtin",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-20T18:02:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e928a35a8e009696986ae82ba1d109d1a7e13fc0",
          "body": "The official server's query tools already run without prompting; give the\nbaked-in smbCloud CLI server the same treatment for its read-only tools\n(me, deployments, project_list, project_show).\n\nUnlike the official server's list_/get_ name-shape check, this is an\nexplicit allow-list, since smb's tool\n[…]\nention. A\nname the list doesn't know (say, from a newer smb release) fails safe to\nmutating, and the exemption only applies when smbcloud is the whole\nserver name, so a foreign server can't borrow it.",
          "is_bot": false,
          "headline": "feat: exempt smbCloud read tools from permission prompts",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-19T12:00:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7742455ea7656a17b6543c02983cf6edb9b34d9a",
          "body": "sigit already bakes in its official HTTP MCP server. This adds a second\nbuilt-in entry: the smbCloud CLI's stdio server (smb --mcp), so smbCloud\nproject and deployment tools are available without any mcp.toml setup.\n\nThe entry is only added when the smb binary is actually on PATH, so users\nwithout s\n[…]\n/mcp. A user-defined server named smbcloud overrides the baked-in one, and\nit can be switched off with smbcloud = false in mcp.toml or\nSIGIT_MCP_SMBCLOUD=off, mirroring the official server's opt-outs.",
          "is_bot": false,
          "headline": "feat: bake in the smbCloud CLI's stdio MCP server",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-19T11:55:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "656a4bf5ef9d2df93d9d30c0045b0fb9eb1de982",
          "body": "Fix post-v1.4.1 review findings",
          "is_bot": false,
          "headline": "Merge pull request #39 from getsigit/fix/post-v1.4.1-review-findings",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-12T14:33:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f98cc9ff34d7b49190d382b5169fef3471178528",
          "body": "Serialize cwd-mutating tests on ENV_TEST_LOCK",
          "is_bot": false,
          "headline": "Merge pull request #38 from getsigit/fix/discovery-test-cwd-race",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-12T14:32:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14228086412565adf6a141bd13513580911e6339",
          "body": "The Linux CI runner exposed a hole in the hook timeout: sh -c on dash forks\nthe command instead of exec'ing it, so killing the shell at the deadline\nleft the grandchild alive. It kept the stdout/stderr pipes open, and the\ndrain threads' read_to_end blocked the caller until the grandchild exited\non i\n[…]\nd straggler that escaped the group and still holds a pipe\ncan only delay the caller briefly instead of hanging it. The test now uses\na two-command hook to force the fork on every shell, not just dash.",
          "is_bot": false,
          "headline": "fix: kill the hook's whole process group on timeout",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T14:03:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2b547a984017eba79a51b20d30b872123ce068fe",
          "body": "decision_for returned Allow for any read-only tool at its first line, before\nconsulting the settings.toml deny rules or per-tool overrides. Once the\nweb-search and repo-tabs work reclassified mcp__sigit__{list_*,get_*,\nsearch_code,web_search} as read-only, a user's explicit deny of one of those\ntool\n[…]\nt override rather than the effective mode, so the default ask or\ndeny mode never starts prompting on ordinary read_file calls. Read-only\ntools that aren't explicitly denied still run without a prompt.",
          "is_bot": false,
          "headline": "fix: keep explicit denies working for read-only first-party tools",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T13:10:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cecfb9379225cda7d1f1b379ef50674f6bd946ab",
          "body": "Two bugs in the Repo tab detail view. First, RepoUpdate::Detail carried no\nidentity for which issue or PR it was fetched for, so a slow reply filled\nwhatever detail happened to be open: open issue #12, press Esc, open PR #7,\nand #12's body could render under the #7 title. Detail fetches now carry a\n\n[…]\ntised \"r refresh\" but pressing r in the detail view\ncalled refresh_repo, which reloads the lists and clears repo_detail, so the\nview the user was reading vanished. r now re-fetches the item on screen.",
          "is_bot": false,
          "headline": "fix: correct the Repo tab detail view's stale-fetch and refresh handling",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T13:10:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "16655e188dc0c48d107b15ebb13cd8b61b9626af",
          "body": "A .sigit/agents/*.md type with a tools: field naming only tools outside the\nsubagent read-only set (for instance grep or bash carried over from a Claude\nCode config) resolved to an empty allow-list. The task ran anyway: the\nsubagent was offered zero tools, so it answered from the model's priors with\n[…]\ne caller instead of running a toolless subagent. A\ntype that lists a mix of valid and invalid tools still narrows to the valid\nsubset, and one with no tools: field still inherits the full default set.",
          "is_bot": false,
          "headline": "fix: reject a subagent type whose tools list resolves to nothing",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T13:10:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "358ac78dffae036bffa3993ef26a366f5fc7997a",
          "body": "render substituted $ARGUMENTS first and then re-scanned the whole result\nfor positional $1..$9. When a user's arguments themselves contained a\nliteral $1 (say, asking what $1 means in a shell script), that text got\nre-expanded with the first argument word, quietly corrupting the prompt.\n\nThe substitution is now one left-to-right walk over the template, so\ninserted argument text is never re-examined for further placeholders. An\nunsupplied positional like $2 is still left untouched, as before.",
          "is_bot": false,
          "headline": "fix: render command templates in a single substitution pass",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T13:10:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ebfb3ad7bdeacfe526d07679e5120bb131f94f30",
          "body": "run_hook called std::process::Command::output() with no timeout, straight\nfrom the async execute_tool path and from the ACP session start handlers.\nA hook that never returns (waits on input, a stalled network mount, a\ndeadlocked build) blocked every tool call or session creation forever, with\nno err\n[…]\nkilled if it exceeds it. stdout and stderr are\ndrained on their own threads so a hook that writes a lot, like a build,\nkeeps making progress instead of blocking on a full pipe and looking like a\nhang.",
          "is_bot": false,
          "headline": "fix: bound hook execution with a timeout",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T13:10:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "07fd7e5a63dc003db17a946b3fe281d1b1896b57",
          "body": "extract_frontmatter tolerates CRLF line endings, a leading UTF-8 BOM, and\nblank lines before the opening ---, but strip_frontmatter required the\nopener to be exactly \"---\\n\" at byte 0. So a command or agent-type file\nsaved with CRLF (common on Windows, or any core.autocrlf checkout) parsed\nits name \n[…]\n as if it were content.\n\nstrip_frontmatter now scans line by line and compares trimmed lines, the\nsame way extract_frontmatter does, so whenever one finds a block the other\nremoves exactly that block.",
          "is_bot": false,
          "headline": "fix: strip frontmatter with the same leniency it is parsed with",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T13:10:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f8ef46addc5f24813bb771871ee93e1d9eba04a9",
          "body": "The discovery tests in skills.rs, commands.rs and subagents.rs, plus the\nsubagent end-to-end test in tools.rs, all change the process-wide current\ndirectory. cargo runs tests in parallel, so one test could move the cwd\nwhile another was mid-discovery. That is what broke CI on macOS x86_64:\nsubagents\n[…]\nts now take the same lock. The async\ntest in tools.rs holds the guard across an await on purpose; each\ntokio::test runs its own single-threaded runtime, so nothing on that\nexecutor can contend for it.",
          "is_bot": false,
          "headline": "fix: serialize cwd-mutating tests on ENV_TEST_LOCK",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T07:58:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "83de66ec0baa42a5f2a9a5d40eee597eed4d2d7c",
          "body": "# Conflicts:\n#\t.agents/AGENTS.md\n#\tsrc/permissions.rs",
          "is_bot": false,
          "headline": "Merge branch 'feature/web-search' into development",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T06:26:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c5016d049198816ca74e936560c79f105e13b9e1",
          "body": "# Conflicts:\n#\t.agents/AGENTS.md\n#\tsrc/chat.rs\n#\tsrc/main.rs\n#\tsrc/skills.rs",
          "is_bot": false,
          "headline": "Merge branch 'feature/configurable-sub-agents' into development",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T06:22:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b5937d1656fe2701ddb3ab4ba449b2d04ec8ba9b",
          "body": "# Conflicts:\n#\tsrc/chat.rs\n#\tsrc/main.rs\n#\tsrc/mcp.rs",
          "is_bot": false,
          "headline": "Merge branch 'feature/tui-repo-tabs' into development",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T06:14:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f594ce1c8675d8de992274bac92fedf009952ec6",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'feature/user-defined-slash-commands' into development",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T06:09:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5e97c2ffb28e5b9a4db9c276d3860f187f80f39b",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'feature/hooks' into development",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T06:09:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9d2bb52e015d18cb2fe6602d75ce9c67ee6beba3",
          "body": "sigit-si already runs a Brave-Search-backed web_search tool on its official\nMCP server (WebSearchService + Mcp::Tools::WebSearch, api/v1/mcp), and\nmcp.rs's existing generic MCP client already discovers and can forward to\nit as mcp__sigit__web_search whenever the user is signed in. That path\nalone is\n[…]\nntributes no tools) for an unauthenticated request — which is\nwhat web_search_available() relies on instead of adding a separate\nsign-in check.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add web_search tool backed by siGit Code Cloud's Brave Search API",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-10T21:59:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "347a11bd49ec9278746c9616a22328bcb9be12cd",
          "body": "A subagent type is a Markdown file with YAML frontmatter (name,\ndescription, and an optional comma-separated tools: allow-list) whose body\nbecomes the task tool's system prompt for that run. Discovered from\n.sigit/agents/ and .claude/agents/ in the project, then\n$SIGIT_CONFIG_DIR/agents/ and ~/.clau\n[…]\nregistered factory\ncan serve the default prompt or any resolved type's prompt.\n\nAlso adds /agents to list what's discovered, mirroring /skills.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add configurable subagent types (.sigit/agents/*.md)",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-10T21:13:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a7deedaac316f6a29d93913d1f15230e44dcfd5b",
          "body": null,
          "is_bot": false,
          "headline": "WIp",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-10T18:54:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51039d77ab55f412921238b258bcc8b632462e72",
          "body": "Custom slash commands are Markdown files with optional YAML frontmatter\n(description, argument-hint) and a prompt-template body. Discovered from\n.sigit/commands/ and .claude/commands/ in the project, then\n$SIGIT_CONFIG_DIR/commands/ and ~/.claude/commands/ (personal). A\nsubdirectory namespaces the c\n[…]\nout of skills.rs into a new\nfrontmatter.rs shared by both formats, since commands.rs needs the same\n\"YAML frontmatter + Markdown body\" parsing.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add user-defined slash commands (.sigit/commands/*.md)",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-10T17:25:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7c2f52f7023636a1c632b3423de707a183da05b8",
          "body": "Self-review of the initial hooks commit turned up four real bugs:\n\n- Hook commands always shelled out via `sh -c`, which doesn't exist by\n  default on Windows. `spawn_shell` in tools.rs already handles this with a\n  sh/cmd platform split; run_hook now follows the same pattern.\n- `{cwd}` and `{tool_n\n[…]\nthat runs a real `sh -c` with a crafted tool_name\nto confirm injected shell syntax never executes, plus unit tests for both\nquoting functions.\n\nCo-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: harden hooks against shell injection and Windows breakage",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-10T17:04:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "730381aada62dd7cb7a43b903e666e204cded4c6",
          "body": "Implement SessionStart, PreToolUse, and PostToolUse hooks that allow users to\nrun custom shell commands at key moments in the agent lifecycle. Hooks support\nvariable substitution for context information and run in the session working\ndirectory.\n\nConfiguration example in ~/.config/sigit/settings.toml\n[…]\nution in\n  src/tools.rs\n- Added documentation and example configuration files\n\nAll existing tests pass (178 unit tests + 5 integration tests).\n\nCo-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add extensibility hooks for agent lifecycle and tool execution",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-10T16:56:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dd4e49e71dc9c48877a9d56fc51d609c77d9f018",
          "body": null,
          "is_bot": false,
          "headline": "Merge development into main for v1.4.1 release",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-10T06:12:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "89dc4834911b9a8a70fb0d810c65979e5c60c9e4",
          "body": "Release v1.4.1",
          "is_bot": false,
          "headline": "Merge pull request #37 from getsigit/claude/v1-4-1-release-8c1ws0",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-10T06:11:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "32c486a40883f4d771449f82159daa69fa31fdf0",
          "body": null,
          "is_bot": false,
          "headline": "Release v1.4.1",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-10T05:48:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b12ae1db89b4cd8fe4287c933483628e2ed4af1",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #36 from getsigit/fix/co-author-noreply-email",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-10T04:56:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a4ca936b5f218bc40e3cdf905d5206c76d614dc3",
          "body": "fix(docs): trust the Homebrew tap with brew trust",
          "is_bot": false,
          "headline": "Merge pull request #35 from getsigit/feature/homebrew-tap-trust",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-08T20:03:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "153400ab38033c50ea2598e7699c737b30dd5b68",
          "body": "Switch the Co-Authored-By trailer email from sigit@sigit.si to the\nGitHub noreply address 297239231+sigitc@users.noreply.github.com for\nthe sigitc account, so GitHub reliably attributes co-authored commits\nto the siGit Code profile.\n\nCo-Authored-By: siGit Code <sigit@sigit.si>",
          "is_bot": false,
          "headline": "fix: use noreply address for siGit Code co-author trailer",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-08T20:01:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c9eea02d13891b07a2b1373485ecf2649a0b2f8",
          "body": "The untrusted-tap error (Homebrew 6.x UntrustedTapError) is cleared by\ntrusting the tap, which writes it into Homebrew's trust.json. `brew tap\n--force` only forces core taps under API mode and does not affect trust,\nso the install command still failed with the same error.\n\nUse `brew trust --tap gets\n[…]\nthe tap and install steps, and\napply it to npm/README.md.tmpl too so the generated npm README does not\nrevert on the next release.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(docs): trust the tap with brew trust, not brew tap --force",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-08T19:49:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3ec8f2c6eac360539b468878136b74be0367bc0f",
          "body": "--force-auto-update doesn't exist; --force is the correct flag to\ntrust and install a third-party tap.\n\nCo-Authored-By: siGit Code <sigit@sigit.si>",
          "is_bot": false,
          "headline": "Fix brew tap flag: use --force instead of --force-auto-update",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-08T14:53:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3fd392798a6f225dbba2e4336452f314e4218c48",
          "body": "Adds the --force-auto-update flag to the brew tap command so Homebrew\nmarks the tap as trusted, fixing the 'Refusing to load formula from\nuntrusted tap' error users hit on fresh installs.\n\nCo-Authored-By: siGit Code <sigit@sigit.si>",
          "is_bot": false,
          "headline": "Use --force-auto-update in brew tap to trust the tap",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-08T14:49:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "acec30c0d3d2e885485522e12e7d780d58a045d3",
          "body": null,
          "is_bot": false,
          "headline": "Merge development into main for v1.4.0 release",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-07T11:05:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "29c30ae74b800931f887019c2441b0b3b1085307",
          "body": null,
          "is_bot": false,
          "headline": "Merge release/v1.4.0 into development",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-07T11:05:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7ea06acee91f89fdd0854bde2a1aae5ac6e8df83",
          "body": "Headless -p mode, permission rule patterns, MCP stdio transport, the\n/init command, and TUI tabs, thinking display, and collapsible tool\ncalls. Details in CHANGELOG.md.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_017vyPTyfUMzM2hd8DzzLf2E",
          "is_bot": false,
          "headline": "Release v1.4.0",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-07T07:16:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f3058f61f1b638e605adb75dfa6cbf2a4b389fd0",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #31 from getsigit/feature/init-command",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-07T02:39:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8334d86a66a592f01f90bb7590fbeb365ca3975b",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #26 from getsigit/feature/tui-thinking-blocks",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T21:18:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2aa2db58217c5a69cf2b92ad22b2e232e7219b37",
          "body": "Development moved the instruction files to .agents/AGENTS.md with\nsymlinks at the root, so this branch's CLAUDE.md edit (the /init\nparagraph) is ported into .agents/AGENTS.md and the symlink layout is\nkept. The headless.rs conflict was only a comment both sides' identical\nsignature fix; the comment stays.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Merge origin/development into feature/init-command",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T20:57:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8cc111a3add7508fdff9fb64220895fcde3a7783",
          "body": "Both sides made the same grant_for_session signature fix; the conflict\nwas only the explanatory comment added on this branch, which is kept.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Merge origin/development into feature/tui-thinking-blocks",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T20:52:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ec9c84a634e2fed54662eb45a5ebcc3a6190dbd0",
          "body": "Make .agents/ the single home for agent assets",
          "is_bot": false,
          "headline": "Merge pull request #33 from getsigit/feature/agents-dir-unification",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T20:48:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53ffdafdf9cc86b4f0ecf7ed38c3b86d3671617b",
          "body": "Move the run-sigit skill into .agents/skills so all six project skills\nlive in one place, and point .claude/skills there with a symlink. Make\n.agents/AGENTS.md the canonical project instructions file: the root\nAGENTS.md and CLAUDE.md are now symlinks to it, so agents.md tools,\nClaude Code, and sigit's own instructions loader all read the same\nfile. The instructions loader prefers AGENTS.md over CLAUDE.md in the\nsame directory, so the content is injected once.",
          "is_bot": false,
          "headline": "Unify agent assets under .agents/",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T19:57:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "84ec0580d47c6836fc43b229dee2d20454854e01",
          "body": "Fix headless build after permission rules signature change",
          "is_bot": false,
          "headline": "Merge pull request #32 from getsigit/fix/headless-permission-call-args",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T18:52:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "43cd3513b05bbd3716449e46a4e1e162d3cef3ba",
          "body": "PR #27 (headless mode) and PR #28 (permission rule patterns) were\ndeveloped in parallel. #28 added an arguments parameter to decision_for\nand grant_for_session, and merging it after #27 left the two call sites\nin headless.rs on the old signatures, so cargo clippy --tests no longer\ncompiles on development.\n\nPass the tool call's raw arguments to decision_for, and an empty string\nfor --allow-tool grants, which records the bare tool name and keeps the\nwhole-tool grant the flag intends.",
          "is_bot": false,
          "headline": "Fix headless build after permission rules signature change",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T18:52:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d12b0b806da613bb3fcf29786b1d25833b9a68bf",
          "body": "/init is not a status command: both surfaces substitute a canned\nprompt (instructions::INIT_PROMPT, next to the loader that consumes\nthe file it produces) and run a normal agent turn, so exploration and\nthe file write go through the ordinary tools and permission checks.\nThe TUI transcript shows the \n[…]\nifests, CI config, and the top of the tree before\nwriting, and to improve an existing AGENTS.md or CLAUDE.md in place\nrather than replacing it.\n\nSpec: sigit-si docs/product/sigit-code-init-command.md.",
          "is_bot": false,
          "headline": "Add /init to generate AGENTS.md from the repo",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T18:51:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e6d3cc5485e8cc83c41ceea8595947b230f10659",
          "body": "PR #27 (headless mode) and PR #28 (permission rule patterns) merged\ninto development independently: #28 added an arguments parameter to\ndecision_for and grant_for_session, and #27's call sites predate it,\nso development does not compile. Pass the tool call's arguments to\ndecision_for; grants from --allow-tool pass the empty string, which\nrecords the bare tool name and keeps the grant-the-whole-tool\nbehavior. Same fix as the one inside the PR #26 merge commit.",
          "is_bot": false,
          "headline": "Fix headless permissions calls after the rule-pattern API change",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T18:44:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "786be894d7ee18074ae99d9b205c9c9cd887d54d",
          "body": "Resolves the src/chat.rs conflicts (the /thinking toggle and the\n/tools collapse feature landed in the same spots) and updates the two\npermissions call sites in headless.rs to the three-argument API from\nPR #28, which PR #27 was written before. development itself does not\ncompile without that fix since the two merged independently.",
          "is_bot": false,
          "headline": "Merge origin/development into feature/tui-thinking-blocks",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T18:27:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "85dff795350ecfa15f3feba502a12561423943f8",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #28 from getsigit/feature/permission-rules",
          "author_name": "keypair34",
          "author_login": "keypair34",
          "committed_at": "2026-07-06T17:53:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b248e0de3ef1091d2afc57c70a95a02b67bd597c",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #27 from getsigit/feature/headless-mode",
          "author_name": "keypair34",
          "author_login": "keypair34",
          "committed_at": "2026-07-06T17:50:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "43d1943f1a7a7055c92f53818785a44665973dc7",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #29 from getsigit/feature/mcp-stdio-transport",
          "author_name": "keypair34",
          "author_login": "keypair34",
          "committed_at": "2026-07-06T17:42:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3434b25f432109d1e0dc4b69908cb940d271f9a",
          "body": "Collapse tool calls in the TUI to title lines with /tools",
          "is_bot": false,
          "headline": "Merge pull request #30 from getsigit/feature/tui-collapsible-tool-calls",
          "author_name": "keypair34",
          "author_login": "keypair34",
          "committed_at": "2026-07-06T16:28:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce46b78af082f602f4d4cafe058f50a9a93a3a68",
          "body": "…llapsible-tool-calls\n\n# Conflicts:\n#\tsrc/chat.rs",
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/development' into feature/tui-co…",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T06:15:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c6cdf83f5b2a15f33fc14d65c81b988af83204d8",
          "body": "Add tabbed TUI: session, history, and cloud tabs",
          "is_bot": false,
          "headline": "Merge pull request #25 from getsigit/feature/tui-tabs",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-05T09:21:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "769241839a8eb50a792e6bc713789acf9381014f",
          "body": "Every tool call used to land in the transcript as a plain system line,\nand argument previews stayed there forever, burying the conversation\nunder command dumps. Each call is now a single collapsed dim line with\na derived title: the command for run_command, the path for file tools,\nthe pattern for se\n[…]\nidden.\n\nDisplay only. The model still receives full outputs, ACP and the\nsession store are untouched, and the result preview rides a separate\ndisplay update so nothing changes in the tool loop itself.",
          "is_bot": false,
          "headline": "Collapse tool calls in the TUI to title lines with /tools",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-05T07:45:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0fcb6cbf28f0e0ae1faa50b4633e5c9e35d773c4",
          "body": "When the session's origin remote points at the sigit.si host, the TUI\ngrows a Repo tab between History and Cloud with Issues and Pull\nrequests sections, fetched through the official MCP server's repo\nworkflow tools. Up and Down select, Enter opens a scrollable detail,\ni, p, or Left and Right switch \n[…]\n prompt names the issue and PR tools verbatim\nthrough the new official_tool_name helper, and a test fails if the\ntwo drift. Stacked on the tabbed-TUI branch; rebases onto development\nonce that merges.",
          "is_bot": false,
          "headline": "Add Repo tab: issues and pull requests for sigit.si repos",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-05T07:25:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e9a445c3d39c723ff2b57ca3768f7672b3b241b5",
          "body": "Nearly every published MCP server is stdio-first, and sigit spoke\nonly Streamable HTTP, so most of the ecosystem could not plug in.\n\nmcp.toml server entries now take command, args, and an env map,\nmutually exclusive with url; both or neither is a config error that\nis logged and skipped. The transpor\n[…]\nhed crate (verified with cargo package\n--list), since cargo install would otherwise ship every bin in the\ncrate. Config changes still need a restart; /reload does not re-run\ndiscovery, now documented.",
          "is_bot": false,
          "headline": "Add stdio transport to the MCP client",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-05T07:18:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "96152868c99b9e36933267d365c5f6cc1233b545",
          "body": "The permission system knew three modes and per-tool overrides, which\nmade autonomy all-or-nothing: allowing run_command waved through\nrm -rf along with cargo test. Rules close that gap.\n\n[permissions.rules] in settings.toml holds ordered allow and deny\nlists of tool_name(pattern) entries, e.g. run_c\n[…]\nal prompts gain the same granularity: always-allow on\nrun_command now grants the command family (its first two tokens),\nnot the whole shell. /permissions prints the rule lists and the\ngranular grants.",
          "is_bot": false,
          "headline": "Add permission rule patterns: per-argument allow and deny lists",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-05T06:51:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "98ed89ac08e6b9dc8420b717d2be52f4faa851da",
          "body": "CI, scripts, and the Cloud Agent sandbox runner all want the same\nthing: hand sigit a prompt, let it run one agent turn with tools, and\nexit with a meaningful code. Until now that required an ACP client or\na TTY.\n\nsigit -p \"prompt\" dispatches before the TTY/ACP split, streams the\nassistant text to s\n[…]\nven over a settings allow, and\nSIGIT_PERMISSIONS=allow stays the blunt instrument. The conversation\nis saved to the session store either way, since a partial transcript\nbeats none for a future resume.",
          "is_bot": false,
          "headline": "Add headless -p mode: run one prompt and exit",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-05T06:50:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0ed52292e1e1c29c20c597764c6e9d82dfeac9ae",
          "body": "Reasoning models emit their thought process in think tags, and the TUI\neither hid it behind the spinner while streaming or dumped it as a\nbox on every finished message. Both extremes are wrong: watching the\nmodel reason is useful, reading every past thought is noise.\n\nWhile a streamed turn is still \n[…]\nsplay only: nothing changes in what is sent\nto the model, saved to sessions, or streamed over ACP, where editors\nrender reasoning themselves. /thinking stays TUI-only, matching how\n/resume is handled.",
          "is_bot": false,
          "headline": "Show model thinking in the TUI with a /thinking toggle",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-05T06:39:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "71e2f71e203f498b3d7653a2377f3f9522d7d5c2",
          "body": "The interactive TUI gets a tab bar in the Copilot CLI style, cycled\nwith the Tab key (only when the input is empty) and left with Esc.\n\nThe Session tab is the chat, unchanged. The History tab lists the\nsaved sessions from the session store with age and message count:\nEnter restores one into the live\n[…]\nk to Session so the y/a/n prompt\nis never invisible. Pure helpers (tab cycling, age and row formatting,\nsession listing) live outside the unix-only module so all four CI\ntargets compile and test them.",
          "is_bot": false,
          "headline": "Add tabbed TUI: session, history, and cloud tabs",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T23:32:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6b8b6946d17cf0a5795f13a7054e61b2dc1ac7f1",
          "body": null,
          "is_bot": false,
          "headline": "Merge development into main for v1.3.2 release",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T23:04:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a64853fb175ea0af47a547275fb84c6f9c5c770",
          "body": null,
          "is_bot": false,
          "headline": "Merge release/v1.3.2 into development",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T23:04:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc025da20d7d53d81859c2eaa8b24b0b5da57614",
          "body": "Tool permission system with plan mode, durable sessions with context\ncompaction, background command execution, the task subagent tool, and\ncommit co-author attribution. Details in CHANGELOG.md.",
          "is_bot": false,
          "headline": "Release v1.3.2",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T23:04:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "49937a358223e232cc8a18c81ec3744699c3d4fd",
          "body": "Add background command execution to run_command",
          "is_bot": false,
          "headline": "Merge pull request #22 from getsigit/feature/background-commands",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T22:43:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b1465ab754308ea9ca33cea327065616605658b",
          "body": "Brings in the merged #21, #23, and #24. Resolutions worth noting:\n\nThe co-author attribution gate and the background path now share\nexec_run_command: a foreground command keeps the HEAD check and the\namend, while a background task skips the gate, since its commits\nfinish after the tool has already r\n[…]\n#21 did: the capping test\ndrove PowerShell through cmd /C with a quoted one-liner, which cmd\nmangles. It now uses a quote-free cmd-native for /L loop, with\nper-platform line markers in the assertions.",
          "is_bot": false,
          "headline": "Merge development: co-author gate, task tool, sessions",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T21:52:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "43e718fe148ae8c3f0b5aa76ba58ae5cc986245d",
          "body": "Add task tool: delegate research to a read-only subagent",
          "is_bot": false,
          "headline": "Merge pull request #23 from getsigit/feature/subagent-tool",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T21:47:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3aee1f9c163b424ad36e6387d577b991b99be0ec",
          "body": "…action\n\nAdd durable sessions and context compaction",
          "is_bot": false,
          "headline": "Merge pull request #24 from getsigit/feature/session-persistence-comp…",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T21:46:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c104d7c0b4bc6f87196c580e92fe456ecf8134c8",
          "body": "Enforce siGit Code co-author attribution on new commits",
          "is_bot": false,
          "headline": "Merge pull request #21 from getsigit/feature/commit-coauthor-attribution",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T21:31:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "395f555f68a1fc623278d1a0f3e9b1bdde88d258",
          "body": "The two new tests drove git through run_command with quoted messages\nand, in one case, the trailer itself on the command line. sh -c strips\nthe quotes; cmd /C does not, and it treats the angle brackets in the\ntrailer's email as redirection, so both tests failed on the Windows\nrunner. The commit comm\n[…]\nnds now use single-word messages, and the\ntrailer-carrying commit is created with direct git args, with\nrun_command exercising the gate through an amend that changes HEAD\nwithout touching the message.",
          "is_bot": false,
          "headline": "Fix Windows CI: keep co-author test commands quote-free",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T20:58:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "51d281add943a0c545c8a74af87c0cf0fbd9db17",
          "body": "Conversation history lived in RAM, so a restart lost everything and\nthe hard cap of 10 tool rounds was the only defense against blowing\nthe context window. Both problems hurt most on-device, where context\nis smallest.\n\nThe InferenceBackend trait gains history_snapshot, restore_history,\nand compact_h\n[…]\nack\nuntouched, and the rebuilt tail drops tool results whose assistant\nmessage was summarized away, since strict endpoints reject orphans.\nWith compaction in place MAX_TOOL_ROUNDS rises from 10 to 24.",
          "is_bot": false,
          "headline": "Add durable sessions and context compaction",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T20:32:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "96c0879965f27d99c05e88f4504402438e9698a8",
          "body": "Every file the model reads stays in the main conversation forever,\nwhich fills small context windows fast. The new task tool hands a\nresearch prompt to a fresh conversation that only gets the read-only\ntools (read_file, list_directory, search_files, glob, read_website)\nand returns its final answer, \n[…]\nissions: the nested loop\nhard-gates execution to the read-only set, so a hallucinated call to\nanything else returns an error instead of running. That also keeps\ndelegated research usable in plan mode.",
          "is_bot": false,
          "headline": "Add task tool: delegate research to a read-only subagent",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T20:27:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5c23b5d4fd95d39ac073556b53af46b8ec348a70",
          "body": "Every command used to be killed at the 120 second timeout, so builds,\ntest suites, and dev servers could not run at all. run_command now\ntakes run_in_background: the child goes into a process-global task\ntable and the tool returns its task id right away, while reader\nthreads collect stdout and stder\n[…]\nits output. Foreground commands\nbehave exactly as before, background children die with the sigit\nprocess, and polling is classified read-only so checking on a build\nnever triggers a permission prompt.",
          "is_bot": false,
          "headline": "Add background command execution to run_command",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T20:22:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9cd8eb1b468e3e44d2399e66e8114ceaf2763c6f",
          "body": "Add tool permission system: approval prompts, policy, plan mode",
          "is_bot": false,
          "headline": "Merge pull request #20 from getsigit/feature/tool-permission-system",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T19:48:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72c91b1d13f2a8f4fbd535d80ed459576a37d77d",
          "body": "The system prompt already asked models to end commit messages with the\nCo-Authored-By trailer, but that only works when the model listens.\nSmall local models often don't, and the trailer baked in the crate\nversion, so the co-author identity changed every release.\n\nAttribution is now deterministic. A\n[…]\ngit.si, the email of the sigitc GitHub account, so GitHub\nrenders the co-author with that account's avatar. The system prompt\nquotes the constant verbatim and a unit test fails if the two drift\napart.",
          "is_bot": false,
          "headline": "Enforce siGit Code co-author attribution on new commits",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T19:41:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1a99015f03d8944c95eca7645c2e1e84fb7d588c",
          "body": "Three follow-ups from the permission-system review:\n\nThe TUI's inference task used to keep running after Ctrl+C — dropping\nthe update channel only silenced it, so it kept burning model rounds\nand could still execute granted tools in the background. The tool loop\nnow notices the closed channel at eac\n[…]\nssible, ACP mode\nnow honors the OPENAI_BASE_URL/OPENAI_API_KEY provider override at\nstartup like the interactive client does; previously the override was\nsilently ignored there. Docs updated to match.",
          "is_bot": false,
          "headline": "Address review follow-ups: TUI cancel, state pruning, ACP test",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T17:49:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a64cd344294e4a6a2e659793c3b07cea10d46c54",
          "body": "Three fixes from review of the permission system:\n\nCancelling at the ACP permission gate used to return early and leave\nthe assistant's tool calls unanswered in the backend history, so strict\nOpenAI-compatible endpoints rejected every later request in the session.\nThe prompt loop now closes out the \n[…]\nf a long command from the person approving\nit. A shared approval_preview helper caps at 500 chars and flags any\nhidden remainder explicitly; the ACP dialog also carries the full\narguments as rawInput.",
          "is_bot": false,
          "headline": "Fix review findings: cancelled turns, approval visibility",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T17:25:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a4759839b3ee96b39fbe4e819f5db0d65a14c834",
          "body": "`TUI_SESSION` is only referenced by the `#[cfg(unix)]` TUI (chat.rs), so\nthe Windows target sees it as unused and `-D dead-code` fails the Clippy\njob. Suppress the lint on non-Unix targets only — the same mechanism\nbackend.rs/provider.rs use — rather than module-wide, since the rest of\npermissions.rs is live on every platform (main.rs/ACP uses it on Windows).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014f6zfWDT1v5TeSpA29rEyx",
          "is_bot": false,
          "headline": "Fix Windows dead-code: gate TUI_SESSION on cfg(unix)",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-02T12:08:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4eeda0f36fd0de5a09fd59200ef85f5973e11c88",
          "body": "Working branches start from the latest origin/development. Exception:\nwork that depends on an unmerged feature branch may stack on it — merge\nthe base PR first, then rebase the stacked branch onto development\nbefore opening its pull request.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014f6zfWDT1v5TeSpA29rEyx",
          "is_bot": false,
          "headline": "docs: branch off development, with a stacking exception",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-02T09:27:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0c485955006d788b1fe8ff6b41ea1b62e84950d1",
          "body": "Branch names use feature/ (new functionality) or fix/ (bug fixes) with a\ndescriptive kebab-case slug — no tool- or agent-name prefixes.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014f6zfWDT1v5TeSpA29rEyx",
          "is_bot": false,
          "headline": "docs: require feature/ or fix/ branch prefixes",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-02T09:27:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7244898f9f0a2bc4e678c0e7c4fb39b8b98bdc2f",
          "body": "Every tool call now passes a permission gate before executing. Read-only\ntools (read_file, list_directory, search_files, glob, read_website,\nwrite_todos, skill) always run; mutating tools — including all mcp__* and\nunknown tools, the safe default for external side effects — are governed\nby layered p\n[…]\ning the\nspawned-handler restructure does not deadlock the dispatch loop.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014f6zfWDT1v5TeSpA29rEyx",
          "is_bot": false,
          "headline": "Add tool permission system: approval prompts, policy, plan mode",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-02T09:27:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "86e00d5d6be7489f8d8ce4ca6ea351f80ee92710",
          "body": null,
          "is_bot": false,
          "headline": "Merge development into main for v1.3.1 release",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-02T05:54:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "30aae0b1be161a32ff46743af207954cc2570792",
          "body": null,
          "is_bot": false,
          "headline": "Merge release/v1.3.1 into development",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-02T05:54:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d4757fd31d5b0e570ed7206166344430313b7b8",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01LsGodCvtg3Pdes1SUdxYSw",
          "is_bot": false,
          "headline": "Release v1.3.1",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-02T05:53:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0b6ab1c46bba77a89ebecd0a520b8b8b0645d3b3",
          "body": "…b-todos-remember",
          "is_bot": false,
          "headline": "Merge pull request #19 from getsigit/claude/agent-tools-multiedit-glo…",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-02T03:46:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39d085ebc90bbb844896b2333a9813383b506f3e",
          "body": "- glob: use sort_by_key(Reverse(mtime)) instead of sort_by; this trips\n  clippy::unnecessary_sort_by on Rust 1.96 (CI), which an older local\n  toolchain did not flag.\n- CLAUDE.md: list the new agent tools (glob, multi_edit, write_todos,\n  remember) in the tools.rs architecture note.\n\nRebased onto de\n[…]\nthe CI toolchain (1.96.1): fmt + clippy\n(-D warnings) + test all green.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014f6zfWDT1v5TeSpA29rEyx",
          "is_bot": false,
          "headline": "Fix clippy unnecessary_sort_by in glob; sync docs",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-01T21:19:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "609c035bc18baf86fa11bdf0af8aac426cf6fdc6",
          "body": "- Describe the file's audience as \"AI coding agents\" rather than naming a\n  specific third-party tool.\n- Require pull requests to target the development branch (main is\n  release-only).\n- Require the full CI gate (fmt + clippy + test) to pass locally before\n  pushing a branch or opening a pull request.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014f6zfWDT1v5TeSpA29rEyx",
          "is_bot": false,
          "headline": "docs: neutral agent wording, PR target, and pre-push CI rule",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-01T21:11:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7231c31e001806a08045d269ccc45ca38b98ad53",
          "body": "Add an important rule to CLAUDE.md: name branches after the changes they\ncontain (short kebab-case slug), not after a task/ticket/session id.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014f6zfWDT1v5TeSpA29rEyx",
          "is_bot": false,
          "headline": "docs: require descriptive, change-based branch names",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-01T21:11:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2d9a2dde51366557761bb02adc1a94893fc32975",
          "body": "Closes several high-leverage gaps with Claude Code in the agent tool layer:\n\n- edit_file: add `replace_all` and return actionable failure context\n  (names the line whose trimmed text matches when only whitespace differs),\n  so the model self-corrects in one round instead of guessing.\n- multi_edit: a\n[…]\n_tools(). Adds unit tests; fmt + clippy (-D warnings) + test all green.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014f6zfWDT1v5TeSpA29rEyx",
          "is_bot": false,
          "headline": "Add Tier-0 parity tools: multi_edit, glob, write_todos, remember",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-01T21:11:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dcabc8de8232453a4cc8cfcf7d4525fe6e128658",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #18 from getsigit/claude/mcp-integration-sigit-hbnh3e",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-01T21:09:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "80fcc79e2e23bd33103bc5bae132858434b7d4c7",
          "body": null,
          "is_bot": false,
          "headline": "Update license file branding and legal",
          "author_name": "Seto Elkahfi",
          "author_login": "setoelkahfi",
          "committed_at": "2026-07-01T20:46:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "71e198539f22a793496de194f023f2633982eb5c",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'feature/branding-and-legal' into development",
          "author_name": "Seto Elkahfi",
          "author_login": "setoelkahfi",
          "committed_at": "2026-07-01T19:58:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d3de4ab06a3dd7eeaabe34fb96a4804672a20263",
          "body": null,
          "is_bot": false,
          "headline": "Update branding and legal",
          "author_name": "Seto Elkahfi",
          "author_login": "setoelkahfi",
          "committed_at": "2026-07-01T19:56:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "005429b80a4afb1d314e49323c725e8afac7b001",
          "body": "Implement the client half of the Model Context Protocol so siGit Code can\nconnect to MCP servers, discover the tools they expose, and offer them to the\nmodel alongside its built-in tools. Tool calls are forwarded to the owning\nserver and the results fed back into the agent loop.\n\n- New src/mcp.rs: S\n[…]\n-in\n  server.\n\nUpdates CLAUDE.md and CHANGELOG.md (Unreleased section).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01LsGodCvtg3Pdes1SUdxYSw",
          "is_bot": false,
          "headline": "Add MCP client support and bake in the official siGit Code MCP server",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-30T21:24:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f9abace7945f03c6466022b5dc3ed82175493793",
          "body": null,
          "is_bot": false,
          "headline": "Merge development into main for v1.3.0 release",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-30T07:21:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "82d6fa75e4dc28e79b0d2ee90791a152a88cdb63",
          "body": null,
          "is_bot": false,
          "headline": "Merge release/v1.3.0 into development",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-30T07:21:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 17,
      "commits_last_year": 297,
      "latest_release_at": "2026-07-22T22:11:59Z",
      "latest_release_tag": "v1.5.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 10,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 4.8
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 37,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "sigit",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [
            "ai",
            "cli",
            "llm",
            "coding-agent",
            "sigit",
            "command-line-utilities"
          ],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/sigit",
          "is_deprecated": false,
          "latest_version": "1.5.0",
          "repository_url": "https://github.com/getsigit/sigit",
          "versions_count": 14,
          "total_downloads": 266,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 81,
          "first_published_at": "2026-04-12T09:39:32.838363Z",
          "latest_published_at": "2026-07-22T21:53:52.628207Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 0
        },
        {
          "name": "sigit-code",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [
            "sigit",
            "cli",
            "ai",
            "coding-agent",
            "llm",
            "on-device",
            "Development Status :: 4 - Beta",
            "Environment :: Console",
            "Intended Audience :: Developers",
            "License :: OSI Approved :: Apache Software License",
            "Operating System :: MacOS",
            "Operating System :: Microsoft :: Windows",
            "Operating System :: POSIX :: Linux",
            "Programming Language :: Python :: 3",
            "Programming Language :: Rust",
            "Topic :: Scientific/Engineering :: Artificial Intelligence",
            "Topic :: Software Development",
            "Topic :: Utilities"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/sigit-code/",
          "is_deprecated": false,
          "latest_version": "1.5.0",
          "repository_url": "https://github.com/getsigit/sigit",
          "versions_count": 16,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2026-04-24T12:03:07.901987Z",
          "latest_published_at": "2026-07-22T22:11:10.515164Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 1,
      "stars": 20,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-06-13",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_forks": 1
      },
      "star_history": null,
      "open_issues_and_prs": 3
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "npm/sigit/tsconfig.json"
      ],
      "toolchain_manifests": [
        "Cargo.toml"
      ],
      "largest_source_bytes": 181610,
      "source_files_sampled": 28,
      "oversized_source_files": 3,
      "agent_instruction_files": [
        ".agents/AGENTS.md",
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 17808
    },
    "dependencies": {
      "manifests": [
        "Cargo.toml",
        "pypi/pyproject.toml"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "crates",
        "pypi"
      ],
      "dependencies": [
        {
          "name": "agent-client-protocol",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0"
        },
        {
          "name": "onde",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.1.2"
        },
        {
          "name": "tokio",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "tokio-util",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.7"
        },
        {
          "name": "futures",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "ratatui",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.29"
        },
        {
          "name": "crossterm",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.29"
        },
        {
          "name": "anyhow",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "libc",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2"
        },
        {
          "name": "log",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.4"
        },
        {
          "name": "tracing-subscriber",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "serde",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "serde_json",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "toml",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "async-trait",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        },
        {
          "name": "regex",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "reqwest",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.12"
        },
        {
          "name": "uuid",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "rpassword",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "7"
        }
      ],
      "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": 29,
        "open_issues": 3,
        "closed_ratio": 0.7,
        "closed_issues": 7,
        "closed_unmerged_prs": 2
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "paydii",
          "commits": 157,
          "avatar_url": "https://avatars.githubusercontent.com/u/193906237?v=4"
        },
        {
          "type": "User",
          "login": "setoelkahfi",
          "commits": 104,
          "avatar_url": "https://avatars.githubusercontent.com/u/1797197?v=4"
        },
        {
          "type": "User",
          "login": "claude",
          "commits": 25,
          "avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
        },
        {
          "type": "User",
          "login": "keypair34",
          "commits": 11,
          "avatar_url": "https://avatars.githubusercontent.com/u/216233964?v=4"
        }
      ],
      "contributors_sampled": 4,
      "top_contributor_share": 0.529
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "release-crates.yml",
        "release-github.yml",
        "release-homebrew.yml",
        "release-mcp-registry.yml",
        "release-npm.yml",
        "release-pypi.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "Cargo.lock"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "3 out of 3 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": 1,
            "reason": "Found 2/20 approved changesets -- score normalized to 1",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 6,
            "reason": "project has 2 contributing companies or organizations -- score normalized to 6",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 9,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 10 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 2,
            "reason": "dependency not pinned by hash detected -- score normalized to 2",
            "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": "13 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "431bc0d8aa3ffa39d48002480cbe33a6a79eb4df",
        "ran_at": "2026-07-23T00:21:19Z",
        "aggregate_score": 3.6,
        "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-22T22:12:13Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-20T18:02:28Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 5,
          "created_at": "2026-04-30T11:07:24Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 34,
          "created_at": "2026-07-06T20:35:34Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 40,
          "created_at": "2026-07-15T16:00:31Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/getsigit/sigit",
    "host": "github.com",
    "name": "sigit",
    "owner": "getsigit"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 59,
      "inputs": {
        "security": 36,
        "vitality": 79,
        "community": 32,
        "governance": 56,
        "engineering": 81
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 79,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "commits_last_year": 297,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 10
            },
            "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": "10/52 weeks with commits",
                "points": 6.9,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 10
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "297 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 297
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 10 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": 17,
              "latest_release_tag": "v1.5.0",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 4.8
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "17 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 17
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~4.8 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 4.8
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 32,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 21,
            "inputs": {
              "forks": 1,
              "stars": 20,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "20 stars",
                "points": 20.7,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "1 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "at_risk",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 44,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file present, not a recognized license",
                "points": 16.9,
                "status": "partial",
                "details": [
                  {
                    "code": "license_custom",
                    "params": {}
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 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
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "at_risk",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 32,
            "inputs": {
              "packages": [
                "sigit",
                "sigit-code"
              ],
              "dependents": null,
              "ecosystems": "crates, pypi",
              "total_downloads": 266,
              "monthly_downloads": 81
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "81 downloads/month across crates, pypi",
                "points": 25.5,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 81,
                      "ecosystems": "crates, pypi"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 56,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 31,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 4,
              "top_contributor_share": 0.529
            },
            "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 53% of commits",
                "points": 10.6,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 53
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "4 contributors",
                "points": 5.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "merged_prs": 29,
              "open_issues": 3,
              "closed_issues": 7,
              "issue_closed_ratio": 0.7,
              "closed_unmerged_prs": 2
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "70% of issues closed",
                "points": 32.7,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 70
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "29/31 decided PRs merged",
                "points": 35.8,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 29,
                      "decided": 31
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 2/20 approved changesets -- score normalized to 1",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 38,
            "inputs": {
              "followers": 1,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "getsigit",
              "public_repos": 4,
              "account_age_days": 102
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "1 followers of getsigit",
                "points": 2.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 1,
                      "login": "getsigit"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "4 public repos, account ~0 yr old",
                "points": 5.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 4
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "sigit",
                "sigit-code"
              ],
              "ecosystems": "crates, pypi",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "2 package(s) on crates, pypi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 2,
                      "ecosystems": "crates, pypi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "16 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 16
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 81,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "7 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "3 out of 3 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": 100,
            "inputs": {
              "topics": [
                "agent-client-protocol",
                "code-editor",
                "coding-agent",
                "cargo",
                "crates-io",
                "inference-engine",
                "rust-lang",
                "qwen2-5",
                "qwen3"
              ],
              "has_wiki": true,
              "homepage": "https://zed.dev/acp/agent/sigit",
              "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://zed.dev/acp/agent/sigit",
                "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": "9 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 36,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 36,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 3.6
            },
            "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": "3 out of 3 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 2/20 approved changesets -- score normalized to 1",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 10 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 2",
                "points": 1,
                "status": "partial",
                "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": "13 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 4
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 73,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.75,
              "agent_instruction_files": [
                ".agents/AGENTS.md",
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 17808
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": ".agents/AGENTS.md, AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".agents/AGENTS.md, AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "75 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 75,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "Cargo.lock"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "npm/sigit/tsconfig.json"
              ],
              "agent_commit_share": 0.19,
              "toolchain_manifests": [
                "Cargo.toml"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Cargo.toml (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "Cargo.toml"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "npm/sigit/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "npm/sigit/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "19 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 19,
                      "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 2",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 94,
            "inputs": {
              "primary_language": "Rust",
              "largest_source_bytes": 181610,
              "source_files_sampled": 28,
              "oversized_source_files": 3
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Rust (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Rust"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "3/28 source files over 60KB",
                "points": 49.1,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 28,
                      "oversized": 3
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index crates:sigit@1.5.0; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T00:21:30.349593Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/g/getsigit/sigit.svg",
  "full_name": "getsigit/sigit",
  "license_state": "custom",
  "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 statisticscrates.io, PyPI.