Public record
Software health reportschema 0.26.0 · metrics 1.13.0 · 2026-07-22 03:14 UTC

tomasz-tomczyk / crit

Your feedback loop with the agent

Go · JavaScript · TypeScriptMIT★ 810 stars⑂ 57 forkssince Feb 2026View on GitHub ↗

tomasz-tomczyk/crit holds a health index of 70 out of 100, placing it in the Good band. It scores highest on Engineering Quality (85/100) and lowest on Security (47/100). It was last updated 1 day ago. A single contributor accounts for most of its recent work.

70
overall / 100
Good

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.

70
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

Tomasz TomczykPersonal account
66 followers29 public repossince Jan 2010@Vetspire

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

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publish
Gogithub.com/tomasz-tomczyk/critv0.18.1-654 days ago

Metrics by category

Vitality

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

84Good · 22% of overall
How it's scored
36/36Push recency — last push 1 days ago
15.9/36Commit cadence — 23/52 weeks with commits
18/18Commit volume — 748 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year748
human_commit_share0.87
days_since_last_push1
active_weeks_last_year23
How it's scored
27/27Ships releases — 65 releases published
36/36Release recency — latest release 4 days ago
27/27Release cadence — a release every ~5.3 days
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Inputs used
releases_count65
latest_release_tagv0.18.1
releases_from_tagsno
days_since_latest_release4
mean_days_between_releases5.3

Community & Adoption

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

67Moderate · 18% of overall
How it's scored
47.2/60Stars — 810 stars
14.6/25Forks — 57 forks
1.7/15Watchers — 3 watchers
Inputs used
forks57
stars810
watchers3
growth_stateorganic
growth_factor_pct100
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
18/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingyes
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sustainability & Governance

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

64Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
1.1/22.5Commit distribution — top contributor authored 95% of commits
13.5/13.5Contributor breadth — 27 contributors
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Inputs used
bus_factor1
contributors_sampled27
top_contributor_share0.953
How it's scored
45.5/46.8Issue resolution — 97% of issues closed
37/38.3PR acceptance — 577/596 decided PRs merged
1.5/15OpenSSF Scorecard: Code-Review — Found 4/28 approved changesets -- score normalized to 1
Inputs used
merged_prs577
open_issues4
closed_issues149
issue_closed_ratio0.974
closed_unmerged_prs19
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
13.1/25Owner reach — 66 followers of tomasz-tomczyk
22.8/25Track record — 29 public repos, account ~16 yr old
Inputs used
followers66
owner_typeUser
is_verified
owner_logintomasz-tomczyk
public_repos29
account_age_days6,032
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.
How it's scored
25/25Published & resolvable — 1 package(s) on go
35/35Publish recency — latest publish 4 days ago
20/20Version history — 65 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesgithub.com/tomasz-tomczyk/crit
ecosystemsgo
any_deprecatedno
min_days_since_publish4

Engineering Quality

Are baseline engineering and documentation practices in place?

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

Documentation

90Excellent
How it's scored
30/30README
25/25Documentation directory
15/15Documentation / homepage site — https://crit.md
10/10Repository description
10/10Topics — 8 topics
0/10Wiki
Inputs used
topicsagentic-coding, ai-tools, cli, llm, markdown, code-review, ai-agents, developer-tools
has_wikino
homepagehttps://crit.md
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

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

47At risk · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
2.2/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.2/2.5CI-Tests — 26 out of 27 merged PRs checked by a CI test -- score normalized to 9
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0.8/7.5Code-Review — Found 4/28 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
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
7.5/7.5Maintained — 30 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — no data
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
5/5Security-Policy — security policy file 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 — 23 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4.7
Excluded from scoring (no data or not applicable): packaging. Remaining weights renormalized.

AI Readiness

How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score.

82Good · 0% of overall
How it's scored
45/45Agent instructions — .cursor/rules/frontend-architecture.mdc, .cursor/rules/frontend-css.mdc, .cursor/rules/frontend-js.mdc, .cursor/rules/go.mdc, .cursor/rules/proxy-auth-transport.mdc, AGENTS.md, CLAUDE.md, scripts/AGENTS.md, scripts/CLAUDE.md
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 87 of 87 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share1
agent_instruction_files.cursor/rules/frontend-architecture.mdc, .cursor/rules/frontend-css.mdc, .cursor/rules/frontend-js.mdc, .cursor/rules/go.mdc, .cursor/rules/proxy-auth-transport.mdc, AGENTS.md, CLAUDE.md, scripts/AGENTS.md, scripts/CLAUDE.md
agent_instruction_max_bytes30,857
How it's scored
18/18One-command bootstrap — Makefile, mise.toml
22/22Automated tests
11/11Lint / format config — .golangci.yml, eslint.config.mjs
11/11Static type checking — test/e2e/tsconfig.json
10/10Reproducible environment — Dockerfile, Nix, lockfile
10/10Demonstrated agent practice — 59 of the last 100 commits agent-authored or agent-credited
8/8Automated maintenance — 13 of the last 100 commits are automated dependency updates
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixyes
has_testsyes
lockfilesgo.sum, package-lock.json
has_dockerfileyes
typed_languageyes
bootstrap_filesMakefile, mise.toml
has_devcontainerno
has_linter_configyes
typecheck_configstest/e2e/tsconfig.json
agent_commit_share0.59
toolchain_manifestsgo.mod, test/e2e/fixtures/livemode-upstream/go.mod
dependency_bot_commit_share0.13
How it's scored
45/45Type-checkable code — Go (statically typed)
53.9/55Manageable file sizes — 12/609 source files over 60KB
Inputs used
primary_languageGo
largest_source_bytes3,565,102
source_files_sampled609
oversized_source_files12
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

810GitHub stars
27contributors
748commits, last 12 months
1days since last push
65releases
1bus factor
4open issues
Go, npmpackage ecosystems

Data collection warnings

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

More detail

Star and fork history 810 ★ / 57 ⇿
810Stars
57Forks
65Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

02004006008001,00081057352026-022026-052026-07
Major 0Minor 18Patch 44
OpenSSF Scorecard 4.7 / 10
4.7aggregate

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-22 03:14 UTC

10Binary-Artifactsno binaries found in the repo
3Branch-Protectionbranch protection is not maximal on development and all release branches
9CI-Tests26 out of 27 merged PRs checked by a CI test -- score normalized to 9
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
1Code-ReviewFound 4/28 approved changesets -- score normalized to 1
6Contributorsproject has 2 contributing companies or organizations -- score normalized to 6
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10
n/aPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
10Security-Policysecurity policy file detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities23 existing vulnerabilities detected
Direct dependencies 12
RegistryPackageVersion constraintManifest
Gogithub.com/mdp/qrterminal/v3v3.2.1go.mod
Gogolang.org/x/sysv0.45.0go.mod
Gogolang.org/x/termv0.43.0go.mod
Gogopkg.in/yaml.v3v3.0.1go.mod
Gorsc.io/qrv0.2.0go.mod
Gogolang.org/x/netv0.55.0go.mod
Gogithub.com/gorilla/websocketv1.5.3go.mod
npm@highlightjs/cdn-assets^11.11.1package.json
npm@sanity/diff-match-patch^3.2.0package.json
npmhighlightjs-heex^1.0.1package.json
npmmarkdown-it^14.3.0package.json
npmmermaid^11.16.0package.json
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": [
        "agentic-coding",
        "ai-tools",
        "cli",
        "llm",
        "markdown",
        "code-review",
        "ai-agents",
        "developer-tools"
      ],
      "is_fork": false,
      "size_kb": 19328,
      "has_wiki": false,
      "homepage": "https://crit.md",
      "languages": {
        "Go": 3028777,
        "CSS": 244981,
        "Nix": 1824,
        "HTML": 42073,
        "Shell": 127311,
        "Makefile": 2439,
        "Dockerfile": 1116,
        "JavaScript": 1222100,
        "TypeScript": 809529
      },
      "pushed_at": "2026-07-20T13:36:46Z",
      "created_at": "2026-02-16T15:39:33Z",
      "owner_type": "User",
      "updated_at": "2026-07-22T00:51:42Z",
      "description": "Your feedback loop with the agent",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go",
        "JavaScript",
        "TypeScript"
      ]
    },
    "owner": {
      "blog": "http://tomasztomczyk.com/",
      "name": "Tomasz Tomczyk",
      "type": "User",
      "login": "tomasz-tomczyk",
      "company": "@Vetspire",
      "location": "Croydon, UK",
      "followers": 66,
      "avatar_url": "https://avatars.githubusercontent.com/u/182303?v=4",
      "created_at": "2010-01-14T16:34:18Z",
      "is_verified": null,
      "public_repos": 29,
      "account_age_days": 6032
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.18.1",
          "kind": "patch",
          "published_at": "2026-07-17T13:57:34Z"
        },
        {
          "tag": "v0.18.0",
          "kind": "minor",
          "published_at": "2026-07-10T13:23:44Z"
        },
        {
          "tag": "v0.17.1",
          "kind": "patch",
          "published_at": "2026-07-03T10:18:51Z"
        },
        {
          "tag": "v0.17.0",
          "kind": "minor",
          "published_at": "2026-07-01T10:53:02Z"
        },
        {
          "tag": "v0.16.5",
          "kind": "patch",
          "published_at": "2026-06-22T22:37:40Z"
        },
        {
          "tag": "v0.16.4",
          "kind": "patch",
          "published_at": "2026-06-22T14:42:15Z"
        },
        {
          "tag": "v0.16.3",
          "kind": "patch",
          "published_at": "2026-06-17T17:29:01Z"
        },
        {
          "tag": "v0.16.2",
          "kind": "patch",
          "published_at": "2026-06-09T20:53:44Z"
        },
        {
          "tag": "v0.16.1",
          "kind": "patch",
          "published_at": "2026-06-04T18:33:33Z"
        },
        {
          "tag": "v0.16.0",
          "kind": "minor",
          "published_at": "2026-05-30T18:15:55Z"
        },
        {
          "tag": "v0.15.4",
          "kind": "patch",
          "published_at": "2026-05-27T10:04:35Z"
        },
        {
          "tag": "v0.15.3",
          "kind": "patch",
          "published_at": "2026-05-20T12:06:54Z"
        },
        {
          "tag": "v0.15.2",
          "kind": "patch",
          "published_at": "2026-05-19T00:21:32Z"
        },
        {
          "tag": "v0.15.1",
          "kind": "patch",
          "published_at": "2026-05-18T10:56:34Z"
        },
        {
          "tag": "v0.15.0",
          "kind": "minor",
          "published_at": "2026-05-17T20:24:00Z"
        },
        {
          "tag": "v0.14.0",
          "kind": "minor",
          "published_at": "2026-05-16T11:34:30Z"
        },
        {
          "tag": "v0.13.1",
          "kind": "patch",
          "published_at": "2026-05-14T23:06:10Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-05-12T18:39:17Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-05-09T18:28:12Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-05-07T14:50:47Z"
        },
        {
          "tag": "spotify-preview",
          "kind": "other",
          "published_at": "2026-05-08T07:16:07Z"
        },
        {
          "tag": "v0.10.5",
          "kind": "patch",
          "published_at": "2026-05-06T09:55:17Z"
        },
        {
          "tag": "windows-pre-1",
          "kind": "other",
          "published_at": "2026-05-05T08:26:33Z"
        },
        {
          "tag": "v0.10.4",
          "kind": "patch",
          "published_at": "2026-05-02T10:43:54Z"
        },
        {
          "tag": "v0.10.3",
          "kind": "patch",
          "published_at": "2026-05-01T11:32:51Z"
        },
        {
          "tag": "v0.10.2",
          "kind": "patch",
          "published_at": "2026-04-29T21:09:34Z"
        },
        {
          "tag": "v0.10.1",
          "kind": "patch",
          "published_at": "2026-04-27T07:23:35Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-04-24T10:14:46Z"
        },
        {
          "tag": "v0.9.3",
          "kind": "patch",
          "published_at": "2026-04-20T07:56:11Z"
        },
        {
          "tag": "v0.0.0-sapling-rc3",
          "kind": "prerelease",
          "published_at": "2026-04-18T14:04:40Z"
        },
        {
          "tag": "v0.9.2",
          "kind": "patch",
          "published_at": "2026-04-17T14:12:09Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-04-15T09:48:48Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-04-11T09:38:41Z"
        },
        {
          "tag": "v0.8.3",
          "kind": "patch",
          "published_at": "2026-04-08T16:02:48Z"
        },
        {
          "tag": "v0.8.2",
          "kind": "patch",
          "published_at": "2026-04-02T16:14:01Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2026-03-30T11:53:45Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-03-28T09:48:35Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-03-23T00:11:25Z"
        },
        {
          "tag": "v0.6.2",
          "kind": "patch",
          "published_at": "2026-03-22T10:23:14Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2026-03-21T15:24:47Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-03-20T00:28:38Z"
        },
        {
          "tag": "v0.5.2",
          "kind": "patch",
          "published_at": "2026-03-18T09:44:54Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2026-03-16T09:40:42Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-03-14T10:29:59Z"
        },
        {
          "tag": "v0.4.9",
          "kind": "patch",
          "published_at": "2026-03-06T16:50:37Z"
        },
        {
          "tag": "v0.4.8",
          "kind": "patch",
          "published_at": "2026-03-05T21:22:03Z"
        },
        {
          "tag": "v0.4.7",
          "kind": "patch",
          "published_at": "2026-03-05T09:56:35Z"
        },
        {
          "tag": "v0.4.6",
          "kind": "patch",
          "published_at": "2026-03-04T09:35:32Z"
        },
        {
          "tag": "v0.4.5",
          "kind": "patch",
          "published_at": "2026-03-03T21:22:25Z"
        },
        {
          "tag": "v0.4.4",
          "kind": "patch",
          "published_at": "2026-03-02T22:21:51Z"
        },
        {
          "tag": "v0.4.3",
          "kind": "patch",
          "published_at": "2026-03-02T19:40:17Z"
        },
        {
          "tag": "v0.4.2",
          "kind": "patch",
          "published_at": "2026-03-02T13:47:11Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-03-02T13:15:24Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-03-02T01:33:05Z"
        },
        {
          "tag": "v0.3.5",
          "kind": "patch",
          "published_at": "2026-02-24T16:48:13Z"
        },
        {
          "tag": "v0.3.4",
          "kind": "patch",
          "published_at": "2026-02-22T19:41:01Z"
        },
        {
          "tag": "v0.3.3",
          "kind": "patch",
          "published_at": "2026-02-21T08:40:37Z"
        },
        {
          "tag": "v0.3.2",
          "kind": "patch",
          "published_at": "2026-02-20T23:28:36Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2026-02-20T22:17:33Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-02-20T20:21:06Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-02-20T19:25:58Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-02-19T16:54:02Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2026-02-18T23:30:16Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-02-17T08:29:12Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-02-16T16:19:37Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "162981c16ed2df6c458c2a551ce8ba591b101316",
          "body": "* feat: configure Claude plan approval mode\n\n* fix: resolve Claude mode at approval time",
          "is_bot": false,
          "headline": "feat: configure Claude plan approval mode (#759)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-20T13:36:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53a83edcea2cbb2f19bc37d540d275817c6961ee",
          "body": "* fix: require explicit Crit invocation across agent integrations\n\nStop model auto-selection of the interactive Crit loop from generic\n\"review\" language. Prefer platform manual-only switches, split\ncrit-cli where needed, and keep only plan-exit hooks automatic.\n\nCloses #729\n\nCo-authored-by: Cursor <\n[…]\nse patch coverage for #729 install cleanup and Cline/Windsurf\nmanual workflow destinations.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix: require explicit Crit invocation across agent integrations (#756)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-20T13:13:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bce589d80c41294071579ad46c406f2a7856d667",
          "body": "* feat: opt-in round-ready desktop notify and OpenCode wait toast\n\nNotify when a review round becomes ready for the human (notify_on_round_ready,\ndefault off), badge/Notification in the browser when the tab is hidden, and\ntoast in OpenCode when a blocking crit wait starts — so AFK reviewers get a\nsi\n[…]\nrsor <cursoragent@cursor.com>\n\n* style: mark tabReady noop so eslint accepts empty fallback\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat: opt-in round-ready notify and OpenCode wait toast (#755)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-19T14:06:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9dee4756ed98c5c05515ae8422db3223d9e9fc7c",
          "body": null,
          "is_bot": false,
          "headline": "fix: correct opencode sub-command from 'ask' to 'run' (#754)",
          "author_name": "blyoa",
          "author_login": "blyoa",
          "committed_at": "2026-07-19T07:51:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "95c50d51b0a76b66a5063658d99de591cfad712c",
          "body": "* feat: auto-close review tab after approval (close_on_approve_after_ms)\n\nAdds a global-only close_on_approve_after_ms config key (crit#752). When\nset, the waiting dialog counts down and calls window.close() N ms after\nan Approve with no unresolved comments; a Cancel button skips the close\nfor that \n[…]\nCursor <cursoragent@cursor.com>\n\n* fix: only show close fallback when the tab is still open\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat: auto-close review tab after approval (#753)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-18T21:20:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0b23b87d928151045ae44ee34af55daa3fe52c96",
          "body": "Bumps [eslint](https://github.com/eslint/eslint) from 10.6.0 to 10.7.0.\n- [Release notes](https://github.com/eslint/eslint/releases)\n- [Commits](https://github.com/eslint/eslint/compare/v10.6.0...v10.7.0)\n\n---\nupdated-dependencies:\n- dependency-name: eslint\n  dependency-version: 10.7.0\n  dependency-\n[…]\nrect:development\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps-dev): bump eslint from 10.6.0 to 10.7.0 (#751)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-18T20:50:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "837d1d778601632ce411174314dd4bd5932e2a04",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "chore(deps): bump actions/setup-go from 6 to 7 (#749)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-18T20:48:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2768d0886701895cdf78f390cea8b18c2475e4ae",
          "body": "Bumps [actions/setup-node](https://github.com/actions/setup-node) from 6 to 7.\n- [Release notes](https://github.com/actions/setup-node/releases)\n- [Commits](https://github.com/actions/setup-node/compare/v6...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-node\n  dependency-version: '\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/setup-node from 6 to 7 (#750)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-18T20:36:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ffa3b822fe6a1f6e5a38664765fbe472b4b4f861",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump Nix flake version to v0.18.1",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-17T13:46:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b63f9725fb25fe88ee7c155f027c1d6806d0859a",
          "body": "* fix: align story review paths and daemon errors\n\n* test: cover review path failures",
          "is_bot": false,
          "headline": "fix: align story review paths and daemon errors (#747)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-17T13:15:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "61133a895fe70621154a84c5bc8f5bafe2fde5c6",
          "body": null,
          "is_bot": false,
          "headline": "fix: harden story navigation and embedded renderers (#748)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-17T13:01:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b64673acb2d3db65dfc5cc2f988454bfd46000c",
          "body": null,
          "is_bot": false,
          "headline": "chore: remove Go Report Card badge (#746)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-17T11:05:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "719cd7baec6907923704c7a84c48d7a1bc0c0774",
          "body": "* fix(plan): echo Claude tool input on approval\n\n* test(plan): cover Claude approval hook end to end\n\n* test(plan): harden hook output contracts",
          "is_bot": false,
          "headline": "fix: restore Claude Code plan approval hooks (#745)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-17T10:10:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9a1250175e74c65fac8e2f28bdca5d6e9778bc9c",
          "body": "* fix: preserve daemon init errors for clients\n\n* fix: retain daemon errors across stale cleanup\n\n* fix: scope retained daemon errors by generation\n\n* fix: use full daemon failure generation digest",
          "is_bot": false,
          "headline": "fix: preserve daemon initialization errors for clients (#744)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-17T10:08:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc89214c3841cca05625bd81d02ec13bb08b1fa8",
          "body": null,
          "is_bot": false,
          "headline": "fix: unblock project prompt trust dialog (#743)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-17T09:51:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "646ab73eb52cb8ebb25be2e95ad0085658eb7e19",
          "body": "* fix: sync codex crit skill wait-loop wording\n\n* fix: regenerate integration hashes for Codex skills",
          "is_bot": false,
          "headline": "fix: sync Codex crit skill wait-loop wording (#733)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-17T09:20:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ef5bdae4c3f95e8d177c7f7ef9a70f662bcb5f46",
          "body": "…d (#742)",
          "is_bot": false,
          "headline": "chore(readme): update top level readme with correct go install comman…",
          "author_name": "jacob-winkler",
          "author_login": "jacob-winkler",
          "committed_at": "2026-07-13T20:35:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb74dd76cdb813d1d78967c76268ae2c0d1e6abb",
          "body": "* fix: harden story review lifecycle\n\n* test: cover story daemon failure paths",
          "is_bot": false,
          "headline": "fix: harden story review lifecycle (#739)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-10T20:50:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd4c4bac9d7d9de491985835f9e76976924fbe51",
          "body": null,
          "is_bot": false,
          "headline": "fix: polish story mode rendering (#738)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-10T19:28:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f3a584a5211e05d0b3ebfe749e4776450af88a92",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump Nix flake version to v0.18.0",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-10T13:11:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "405e39f7f95cf409f24e33047d9d9c61a5551fb9",
          "body": "Add opt-in \"story\" review mode: a chaptered narrative over a diff.\n\n- crit story CLI: generate/ingest chaptered story-mode review JSON\n  (--story-file, --prep, --skip-llm, --clear, --guide; LLM producer via agent_cmd).\n- Persist story on review.json, expose GET/POST/DELETE /api/story, broadcast\n  st\n[…]\nide; crit-story SKILL.md for Claude Code.\n- Thread GitHub PR title/body into story generation.\n- Docs, fixtures, and E2E coverage.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add story review mode (#735)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-10T12:38:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "482f56e44d8ebbcd60827000b95a8b475d4cf2b7",
          "body": "* fix: preserve unstaged changes in branch-added files\n\n* fix: also preserve staged changes in branch-added files\n\nThe unstaged fix guarded on `scope != \"unstaged\"`, which left the\nidentical twin bug in \"staged\" scope: a branch-added file (committed on\nthe branch, new vs merge-base) that was further\n[…]\nAuthored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Tomasz Tomczyk <me@tomasztomczyk.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: preserve unstaged changes in branch-added files (#736)",
          "author_name": "Makoto Dejima",
          "author_login": "makotodejima",
          "committed_at": "2026-07-10T12:08:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c098b4d790aa930675ebec99332d9dbe9526d016",
          "body": "* feat: honor instance share policy in share modal\n\n* fix: route share policy through proxy auth relay",
          "is_bot": false,
          "headline": "feat: honor instance share policy in share modal (#734)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-09T10:13:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "de41150bcfa6e1a062bd7e4cf934999a9c759d7e",
          "body": "hljs's Ruby lexer registers aliases rb, gemspec, podspec, thor, irb —\nbut not rake. EXT_OVERRIDES already covers other extensions hljs\ndoesn't resolve via built-in aliases; add rake there so *.rake files\n(e.g. lib/tasks/foo.rake) get highlighted like the extensionless\nRakefile already does via BASENAME_LANG.",
          "is_bot": false,
          "headline": "fix: highlight .rake files as Ruby (#732)",
          "author_name": "Kizashi Nagata",
          "author_login": "kizashi1122",
          "committed_at": "2026-07-09T06:31:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe0554d7cb9199dd22436f48231daba518a5f844",
          "body": null,
          "is_bot": false,
          "headline": "fix: stop all repo sessions (#731)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-08T21:16:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "71ba065146278535a3b45fc0a5d593425cd81d3b",
          "body": "* fix: reshare when remote review was deleted\n\n* test: cover deleted remote reshare fallback\n\n* test: cover existing share validation errors",
          "is_bot": false,
          "headline": "fix: reshare when remote review was deleted (#730)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-08T16:38:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9f66749ca6ef40c55eb753ea5e66a94eedd2078f",
          "body": "Add pragmatic tests for hook trust hashing, LoadHookMaps, resolution edge\ncases, session stats env payload, and finish/config HTTP contracts.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "test: improve command hooks coverage (#727)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-07T10:11:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "624002f7278795ab7aa1d92350487d85b1643e95",
          "body": "Run user-defined shell scripts on finish/approve with CRIT_* env vars and\nstdin JSON, gated by the same project trust flow as prompt templates.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat: add command hooks for finish lifecycle side effects (#726)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-07T09:38:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7f532eac297b546d4aa21044e0d1fb1a037d6c6b",
          "body": null,
          "is_bot": false,
          "headline": "fix: remove confusing opencode sharing plugin install hint (#725)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-05T20:03:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c2de339fd7da92ab85aa707945677f0ee7b43724",
          "body": "…ration (#724)",
          "is_bot": false,
          "headline": "fix: tolerate trailing commas in opencode config during plugin regist…",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-05T18:36:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7158c97673db58813d1ffb624db59fdf8ace9a72",
          "body": "Bumps [eslint](https://github.com/eslint/eslint) from 10.5.0 to 10.6.0.\n- [Release notes](https://github.com/eslint/eslint/releases)\n- [Commits](https://github.com/eslint/eslint/compare/v10.5.0...v10.6.0)\n\n---\nupdated-dependencies:\n- dependency-name: eslint\n  dependency-version: 10.6.0\n  dependency-\n[…]\nrect:development\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps-dev): bump eslint from 10.5.0 to 10.6.0 (#722)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-05T07:04:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "70754fdaa47e483d8445f8c4bca341e2367f0f64",
          "body": "Bumps [mermaid](https://github.com/mermaid-js/mermaid) from 11.15.0 to 11.16.0.\n- [Release notes](https://github.com/mermaid-js/mermaid/releases)\n- [Commits](https://github.com/mermaid-js/mermaid/compare/mermaid@11.15.0...mermaid@11.16.0)\n\n---\nupdated-dependencies:\n- dependency-name: mermaid\n  depen\n[…]\nirect:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump mermaid from 11.15.0 to 11.16.0 (#721)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-05T07:04:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1b837374af9377367f87ea1a5ec889fc6e6bb1d8",
          "body": "Bumps [markdown-it](https://github.com/markdown-it/markdown-it) from 14.2.0 to 14.3.0.\n- [Changelog](https://github.com/markdown-it/markdown-it/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/markdown-it/markdown-it/compare/14.2.0...14.3.0)\n\n---\nupdated-dependencies:\n- dependency-name: mark\n[…]\nirect:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump markdown-it from 14.2.0 to 14.3.0 (#720)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-05T06:38:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e4c74ad2a9cf33c4ef9e18d0a54faabad582b067",
          "body": "Bumps [stylelint](https://github.com/stylelint/stylelint) from 17.13.0 to 17.14.0.\n- [Release notes](https://github.com/stylelint/stylelint/releases)\n- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/stylelint/stylelint/compare/17.13.0...17.1\n[…]\nrect:development\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps-dev): bump stylelint from 17.13.0 to 17.14.0 (#719)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-05T06:38:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bfcc57466ba9fd1f08fed27c577363dc9b72096e",
          "body": "Bumps [browser-actions/setup-chrome](https://github.com/browser-actions/setup-chrome) from 1 to 2.\n- [Release notes](https://github.com/browser-actions/setup-chrome/releases)\n- [Changelog](https://github.com/browser-actions/setup-chrome/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/browse\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump browser-actions/setup-chrome from 1 to 2 (#718)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-05T06:37:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "07403bdfeb5fe9b4704d58a2c58c3d9ac641522c",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "chore: bump Nix flake version to v0.17.1",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-03T10:07:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d43df1c47a82735809a6df8e94db044891c412c7",
          "body": "…n (#716)\n\n* fix: ship audit-release-fixes cleanup\n\nApply validated release-audit fixes by filtering the virtual commit from compare-target selection,\ncleaning up minor Go nits, and bumping the Claude Code plugin version so prompt updates propagate.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n\n[…]\nde\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n* chore: regenerate integration hashes\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix: filter virtual compare target and bump claude-code plugin versio…",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-03T09:57:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "78e27bc0bdaef615ee361bb667d4fdf4ac4c5f55",
          "body": "Review-level comment edits rendered multiple forms when the same comment ID appeared twice in session state after disk merge.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix: dedupe review comments to prevent duplicate edit forms (#717)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-03T09:55:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "af8c37e281a86e6de619307ce68f91a754d1570a",
          "body": "…es (#715)\n\nAdd golangci-lint to mise.toml so pre-commit always runs lint via run_tool,\nand run make setup-hooks on wt post-start so new worktrees get hooks without\nmanual setup.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "chore: pin golangci-lint in mise and auto-enable git hooks in worktre…",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-03T08:58:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "53b5ec25c2a43753dc0889dfa23264f3c97e7fae",
          "body": "* fix: address v0.17.0 post-release audit findings\n\nReconnect dead sessions using stale review_path for --output reviews,\nshow discovered prompt previews in the trust dialog, serialize crit fetch\nwith the share lock, and fix range-focus scope/chrome regressions.\n\nCo-authored-by: Cursor <cursoragent@\n[…]\n fetch locking,\nreconnect host/default layout flags, and config/discovered prompt previews.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix: address v0.17.0 post-release audit findings (#714)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-03T08:39:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9a134516a1e38c6f9b45473145035e5e597a7027",
          "body": "* fix: sync session memory after UI comment pull merge\n\nPulled comments were written to review.json but the in-memory session\nwas not updated, so the UI refresh showed stale data. Flush pending\ndebounced writes before merge and reload comments from disk immediately.\n\nCo-authored-by: Cursor <cursorag\n[…]\n-by: Cursor <cursoragent@cursor.com>\n\n* test: cover SyncCommentsFromDisk in session package\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix: sync session memory after UI comment pull (#713)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-03T08:13:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c53212abccb4caf1910f462c811e4696898b54bd",
          "body": "* fix: block share/fetch/unpublish CLI when proxy_auth is enabled\n\nTerminal commands cannot authenticate to crit-web behind SSO. Fail fast\nwith a clear message to use Crit's browser interface instead of hitting\nthe network and getting an HTML login page.\n\nCo-authored-by: Cursor <cursoragent@cursor.c\n[…]\nmportant block\ncovering checkProxyAuthCLIAllowed, browser relay parity, and test isolation.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix: block share/fetch/unpublish CLI when proxy_auth is enabled (#712)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-03T07:53:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "784252a75a8edadeec26e3059d9609cf5143e6ad",
          "body": "…711)",
          "is_bot": false,
          "headline": "fix(claude-code): restore trigger clause in crit skill description (#…",
          "author_name": "Prateek Rungta",
          "author_login": "prateek",
          "committed_at": "2026-07-03T07:14:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea3e089eaf188be2d4c1c5d25dc42a18072b9560",
          "body": "* feat: add virtual working changes entry in commit picker\n\nShow a synthetic top commit for working-tree changes and wire it to a dedicated uncommitted-only diff mode.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n* test: update commit picker e2e for virtual row\n\nCo-authored-by: Cursor <cursorag\n[…]\nt leave every repo\ndirty, and skip the virtual working-tree row when clicking real commits.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat: add virtual working changes entry in commit picker (#708)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-02T14:42:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0b35e5a0643eeb713b009f10508b7ba3c9943a4d",
          "body": "Show TARGET/PARENT badges, stack root label, and subtle in-range row\nhighlighting so users can map the active compare range in stacked reviews.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat: add stack popover orientation cues for issue 537 (#710)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-02T11:05:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "64adb2ead2fc8ca3014b5a14e6b6c4e7f843d761",
          "body": "* docs: clarify cleanup_on_approve default and /crit command usage\n\nDocument that approved reviews are auto-cleaned by default in the finish-hook example, and note that agents can invoke /crit with optional arguments.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n* chore: regenerate integration hash for finish hook example\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "docs: clarify cleanup_on_approve default and /crit usage (#709)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-02T10:49:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d279107ef931b7464d7c67f17808d13b8aaf2e03",
          "body": null,
          "is_bot": false,
          "headline": "chore: align printHelp output (#707)",
          "author_name": "pqppq",
          "author_login": "pqppq",
          "committed_at": "2026-07-02T08:05:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9bc5d52bb6bf5482a259f0ba590df2d9e8ee957c",
          "body": "* feat: reuse Chrome DevTools cookies in crit live\n\nAdd --cdp-url / live_cdp_url to fetch upstream session cookies from a\nlocal Chrome debugging endpoint, with unit tests, Chrome integration\ntests, and a CI job. Manual --cookie values still override CDP cookies.\n\nCo-authored-by: Cursor <cursoragent@\n[…]\nby: Cursor <cursoragent@cursor.com>\n\n* fix: satisfy lint and improve CDP unit test coverage\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat: reuse Chrome DevTools cookies in crit live (#706)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-01T22:48:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6947a5cf245273de3dba31eb25361ec20f27499b",
          "body": "* fix: route bare GitHub PR URLs to range mode\n\nBare https://github.com/.../pull/N positional args were classified as\nlive-mode URLs. Detect PR URLs in CLI routing and rewrite to --pr so\nagents and users get range mode without skill-specific handling.\n\nCloses #702\n\nCo-authored-by: Cursor <cursoragen\n[…]\nhe new dispatch code.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n* ci: re-run checks\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix: route bare GitHub PR URLs to range mode (#705)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-01T21:46:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "663640359a41f721179da30290e4c2809f13e938",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "chore: bump Nix flake version to v0.17.0",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-01T10:41:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "59e8bd583ac03bc3513266c750d21b9c9bb39a11",
          "body": "Range focus diffs are pinned to BaseSHA..HeadSHA, but the UI defaulted\ndiffScope to branch and passed it to /api/file/diff, which queried the\nworking tree and returned empty hunks. Force scope=all in range focus on\nboth frontend and backend.\n\nCloses #701\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix: render PR diff hunks when default scope is branch (#704)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-07-01T08:56:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0628924774b09c2f4a57046f2a0b2386d82e24f3",
          "body": "* fix: serialize crit share with per-review flock\n\nConcurrent `crit share` invocations for the same review identity could\nboth POST to crit-web before either persisted share_url, orphaning the\nfirst delete_token. Acquire share.lock inside the review folder for the\nfull share decision + network + per\n[…]\nt exercises the\nlocked CLI path directly instead of via exec, which patch coverage ignores.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix: serialize crit share with per-review flock (#703)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-30T21:30:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d8ae47a83ccfd2bcb67550537b72e86227639c90",
          "body": "* feat: scroll anchored element into view when a comment is tapped\n\nTapping a comment card or opening a pin now scrolls its anchored\nelement into view in the live/preview iframe. Done via an optional\n`scroll` boolean on the keep-highlight message, so the compose path\n(element already on screen) keep\n[…]\nly@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nCo-authored-by: Tomasz Tomczyk <me@tomasztomczyk.com>\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat: scroll anchored element into view when a comment is tapped (#699)",
          "author_name": "Takara Yamaguchi",
          "author_login": "csharp-neet",
          "committed_at": "2026-06-28T11:10:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "063b968daa398865d08aae3c8c62fe1adfe21f95",
          "body": "Bumps [actions/cache](https://github.com/actions/cache) from 5 to 6.\n- [Release notes](https://github.com/actions/cache/releases)\n- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)\n- [Commits](https://github.com/actions/cache/compare/v5...v6)\n\n---\nupdated-dependencies:\n- dependenc\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/cache from 5 to 6 (#694)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-27T12:56:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "88e50eb78364255e6d6ba82eba6e760669ce648e",
          "body": null,
          "is_bot": false,
          "headline": "fix: resolve relative markdown image paths in file mode (#698)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-27T10:41:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "903a5576b72690302d6ff6614e50d40f127a5e56",
          "body": "Agents combining these flags hit a silent stdin hang because --json\nroutes to bulk JSON input mode and ignores --reply-to. Fail fast with\na message pointing to the single-reply command instead.\n\nCloses #693\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix: reject --json with --reply-to on crit comment (#697)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-27T10:15:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fa544ec7bae846526352867bae802cbb238b3469",
          "body": "When /api/commits returns JSON null, commitList stayed null and\nclearCommitPins() crashed in normalizeCommitPins during round-complete\nSSE, leaving the Waiting overlay stuck.\n\nCoalesce null in fetchCommits and normalizeCommitPins; add regression\ntests. Closes #692.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix: guard null commitList in file-changed handler (#696)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-27T09:40:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0090a36b2a88bcf6eb78f2b61a8e354a61370121",
          "body": "* feat: user-defined finish prompt hooks with project trust flow\n\nAdd configurable on_finish_* prompt templates (global and per-project),\nstock templates via crit install prompts, trust gating for repo hooks,\nand a unified prompt field for finish modal and agent stdout.\n\nCo-authored-by: Cursor <curs\n[…]\neload, then fulfill the\nmocked route directly — route.fetch during reload races on Windows.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat: user-defined finish prompt hooks with project trust flow (#695)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-26T22:25:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5f9c5be16ef4d3006cdcad5c82512f927765c7de",
          "body": "Closes #689",
          "is_bot": false,
          "headline": "feat: configurable advertised URL for reverse-proxy access (#690)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-25T14:15:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "68cd2b351e5661b8593e8bbd35a112405f1ba505",
          "body": "* feat: add compare-against picker and commit from/through controls\n\nExpose grouped compare targets (git branches, JJ bookmarks) and let users\nnarrow diffs to a single commit or a from..through range in the sidebar.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n* test: cover CompareTargetsFor git and jj paths\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat: compare-against picker and commit from/through controls (#688)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-24T20:24:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ea229e56bd3efe45710811b04e08ab147f3afb6d",
          "body": "Document crit install codex-plugin vs skills-only install, the proposed-plan\nStop hook, and add a dedicated integrations/codex/README.md.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "docs: expand Codex plugin installation guide (#687)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-24T15:48:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d1769f8d101d6354475cdd1ec8ff7cd4d1d5377b",
          "body": "* feat: add crit --session for cwd-independent review reconnect\n\nAgents can reconnect to an existing review from any directory using the\n12-char session ID printed on start. Plan mode next-round uses crit plan\n--name; other modes use crit --session. Bump integration plugin to 1.7.4.\n\nCo-authored-by:\n[…]\nnd tests for the default\nsession-key start path, connectOrStartDaemon start, and help text.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat: add crit --session for cwd-independent review reconnect (#686)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-24T14:46:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "91bcc6100e0eb8313fcff178f9e329755b04f5bf",
          "body": "Preview pins shared to crit-web are stored under index.html while the UI\nsends the iframe route as ?path=. Look up comments by ID across all file\nentries when the hint path misses, round-trip dom_anchor on share import,\nand send the session file key from live-mode mutation handlers.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix: resolve/delete preview comments imported from crit-web (#684)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-23T13:18:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f5b8c23224532b81ef0d20113c15fd9d5689880c",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "chore: bump Nix flake version to v0.16.5",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-22T22:25:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "08cabc044267c8cb96c307f35ed247a5b2124381",
          "body": "…ompt (#683)\n\nEmbed Comment in ListedComment so finish/crit comments JSON carries all\nreview.json fields (including dom_anchor). Add copy_prompt for the finish\nmodal with agent-directed wording, explicit review.json path, and a single\nnext-command instruction when changes are requested.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix: include full comment fields in finish output and improve copy pr…",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-22T21:56:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "011b42456e9016c6c1a2926d29d6f50d463a2544",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "chore: bump Nix flake version to v0.16.4 (#682)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-22T14:30:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7cff123e5febf48539c920df10885e7e68ee41e4",
          "body": "* fix: keep default-branch review visible after agent commits\n\nPin BaseRef to HEAD at session start on main so round-complete\nrefreshes diff from the session baseline instead of only the working tree.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n* fix: recompute merge-base when switching to wor\n[…]\nForWorkingTree on\nfeature branches; only default-branch sessions use the pinned start HEAD.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix: keep default-branch review visible after agent commits (#681)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-22T14:02:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0e8b7213f06754acc8e95c8afcaff308041b3c77",
          "body": "…h (#679)\n\nWhen filtering to a single commit, out-of-scope comments are counted in\nhidden_unresolved by the API but updateCommentCount() only looked at loaded\nfiles — the button incorrectly showed Approve.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix: finish button ignores hidden unresolved comments on commit switc…",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-22T13:35:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c3c196df5e7c42e9af6252befe75ba8c3120867d",
          "body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v6...v7)\n\n---\nupdated-dependenc\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/checkout from 6 to 7 (#672)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-22T12:04:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "72d2cdc6c4f8320d4e7f11a6e28c93ff1ad86b78",
          "body": "* feat: structured comments in finish stdout and update agent skills\n\nReturn a comments array (crit comments --json schema) from finish and\nreview-cycle; keep prompt as instructions only and drop review_file from\nthe agent payload. Update all integration skills and bump plugin to 1.7.3.\n\nCloses #673\n[…]\nidentity folder\n\n/api/config review_path is the review identity directory, not review.json.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat: structured comments in crit finish stdout (#678)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-22T11:54:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bc72a3e840462159f9877c1f7b3634dee46cea46",
          "body": "…677)\n\nAgents need a stable way to read unresolved comments without hand-rolling\njq scripts. Mirrors crit comment review resolution (--output, --plan, daemon)\nand lists review-level comments first, then per-file file/line comments.\n\nCloses #674\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat: add crit comments command to list unresolved review comments (#…",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-22T10:38:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5d747d79423f7bca35a5e4ab9ab6b82d100ea470",
          "body": "* feat: add configurable open command\n\n* docs: explain when to use open_cmd\n\nAdd the remote/SSH motivation and the single-executable constraint to\nthe open_cmd config row so the \"why\" is clear at a glance.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Tomasz Tomczyk <me@tomasztomczyk.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add configurable open command (#671)",
          "author_name": "Ramon Dantas",
          "author_login": "ekisu",
          "committed_at": "2026-06-18T20:10:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "87166d06c81fb99f3575e5ec89065288ec5f2342",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump Nix flake version to v0.16.3 (#669)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-17T17:12:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f5e79f70e810363f2aa36c4af58c6539f435a80",
          "body": "… (#668)\n\nPost-release-audit cleanup (v0.16.2..main), all validated:\n\n- Delete dead exported alias DeleteResultDeleted (internal/session) —\n  referenced nowhere; left over from the #655 layout refactor.\n- Wrap git MergeBaseOf error for consistency with the sapling/jj impls\n  and the adjacent MergeBa\n[…]\n- Fix stale handleDiffDragEnd comment wording (web/app.js) — the mousedown\n  listener is now delegated on the container, not the button (#665).\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: remove dead alias and fix stale comments from release audit…",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-17T16:39:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "98bb3ad71eace5c16f9b18fffea72bc9bc5342d2",
          "body": "Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 6 to 7.\n- [Release notes](https://github.com/codecov/codecov-action/releases)\n- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/codecov/codecov-action/compare/v\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump codecov/codecov-action from 6 to 7 (#660)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-15T00:15:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c1527f8999970cda7649521fc0fc9940e2947f66",
          "body": null,
          "is_bot": true,
          "headline": "chore(deps-dev): bump eslint from 10.4.1 to 10.5.0 (#663)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-14T11:32:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "831a0244404aac9130cbc7123700cb88745face5",
          "body": "`crit --pr <n>` used the base branch's tip (info.BaseRefOid) as the diff\nbase, producing a two-dot base..head diff. When the PR branch isn't\nrebased onto its base, that folds in commits landed on the base branch\nsince the fork point - surfacing files that aren't part of the PR. GitHub\nrenders a PR a\n[…]\ns)\nand internal/focus (the resolveFocusFromPR call site). Adds jj and\nsapling regression coverage alongside the original git test.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(pr): diff PRs from the merge-base, not the base-branch tip (#659)",
          "author_name": "Jonas Keinholz",
          "author_login": "inyono",
          "committed_at": "2026-06-13T21:53:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e3e159b9fb99e3061c702a1225bbe534f4094ad1",
          "body": "Bumps [esbuild](https://github.com/evanw/esbuild) from 0.28.0 to 0.28.1.\n- [Release notes](https://github.com/evanw/esbuild/releases)\n- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/evanw/esbuild/compare/v0.28.0...v0.28.1)\n\n---\nupdated-dependenci\n[…]\nrect:development\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps-dev): bump esbuild from 0.28.0 to 0.28.1 (#662)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-13T21:52:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7c3fb9f34f39c2e9a423b93edf78b954678c66ea",
          "body": "Bumps [stylelint](https://github.com/stylelint/stylelint) from 17.12.0 to 17.13.0.\n- [Release notes](https://github.com/stylelint/stylelint/releases)\n- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/stylelint/stylelint/compare/17.12.0...17.1\n[…]\nrect:development\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps-dev): bump stylelint from 17.12.0 to 17.13.0 (#661)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-13T21:52:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f2f150566ae488a6ded465e1908fca25f83ea658",
          "body": "…stener (#665)\n\nA large diff (e.g. picking a base branch that diverged months ago) can\nrender thousands of `+` comment buttons, each previously getting its own\n`mousedown` listener. Wiring up ~9,900 listeners stalled the main thread\nfor several seconds, freezing the tab (#657).\n\nReplace the per-butt\n[…]\nfor the touch path. One\nlistener per container instead of one per line — O(1) regardless of diff\nsize. Drag behavior is unchanged.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf: delegate diff comment-button mousedown instead of per-button li…",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-13T21:47:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6ed18b1c0fb2fd9e2491583d992b722e3743b620",
          "body": "* feat(config): add auto_viewed_patterns config key, expose via /api/config\n\nPlumb a new auto_viewed_patterns []string config key through the\nconfig loader and /api/config response so the frontend can auto-mark\nmatching files viewed (collapsed) once per launch. Mirrors\nignore_patterns: presence-trac\n[…]\nreadme): document auto_viewed_patterns config key\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: configurable globs auto-marked as viewed on launch (#666)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-13T21:46:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9c9fbf522993257eafc0f85dabb068603415b18f",
          "body": "Claude Code's \"@\" file-picker autocomplete inserts `crit @myfile.md`, but\nthe literal \"@myfile.md\" is not a real file. The daemon spawned, failed\nsession init on the bogus path, and the client could not connect\n(\"connection reset by peer\") — while `crit myfile.md` worked fine.\n\nNormalize args in the\n[…]\ning at the entry\npoint also unifies daemon keying so a \"@file\" round and a \"file\" round\nreconnect to the same daemon.\n\nCloses #656\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: accept @-prefixed file paths from agent file pickers (#664)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-13T21:17:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9dc81e7d54f8ff67e3350fd3dc9d4305ca83d47a",
          "body": "* refactor: align repo layout with Go project standard\n\nExtract domain packages under internal/, move embedded frontend to web/,\nintegrations to repo root, and test harnesses under test/. Thin main.go\nto CLI wiring; fix macOS path canonicalization for file-mode sessions.\n\nCo-authored-by: Cursor <cur\n[…]\nlure instead of a silent 404.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: align repo layout with Go project standard (#655)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-13T20:20:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "490673c570ea3a73f2e6c4494609516d1824ee0a",
          "body": "Co-authored-by: ValeriaVG <mail@valeriavg.dev>",
          "is_bot": false,
          "headline": "docs: update readme (#645)",
          "author_name": "Valeria",
          "author_login": "ValeriaVG",
          "committed_at": "2026-06-10T08:30:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c600bea3bbd15640681d0c22fe97ee3296eb49a4",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "chore: bump Nix flake version to v0.16.2 (#654)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-09T20:42:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dd3987d03caed2832964d28210a206e181ab5343",
          "body": "Store diff line attrs on split side elements instead of stale row\ndatasets. Restore j/k focus via findNavElementForFocusTarget and fix\nnavFocusTargetFromElement for split rows.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix: preserve split-row keyboard focus across re-renders (#652)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-09T20:15:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c48fd01beb9e7f2c4945df1736bfea28c000928a",
          "body": "* fix: thread oldPath through scoped commit-range rename diffs\n\nGetFileDiffSnapshotScoped dropped OldPath for rename-only commits in\ncommit ranges, showing spurious full-file adds. Thread oldPath through\nloadScopedFileState and delegate VCS diff work to scopedHunks.\n\nCo-authored-by: Cursor <cursorag\n[…]\nhe file was already\nin the session without OldPath, showing spurious add hunks for renames.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix: thread oldPath through scoped commit-range rename diffs (#651)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-09T20:02:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dbe2cf20cb52295556ea59f179c0e51b4bc814d0",
          "body": "* feat(live): forward upstream cookies for authenticated apps\n\nAdd --cookie, --cookie-file, and live_cookie/live_cookie_file config so\ncrit live can proxy session cookies to server-rendered apps that require\nlogin. Project config can point at a gitignored cookie jar for local dev.\n\nCloses #644\n\nCo-a\n[…]\nie file test\n\nFixes unit-windows failure where /etc/cookies.txt is not absolute on Windows.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat(live): forward upstream cookies for authenticated apps (#649)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-09T16:16:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c4e1bfd68962aa0b11b9d950c2d50eb10edaedd2",
          "body": "…#650)\n\nMoveFileEx replace can briefly surface ERROR_FILE_NOT_FOUND on the\ndestination. readFileShared only retried sharing violations, so\nTestConcurrentSaveCritJSON_NoCorruption failed under concurrent writers.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix(windows): retry transient ENOENT during concurrent review reads (…",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-09T15:53:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9caa64f04f394c2b40ceee6a2dfb5525f412f460",
          "body": "… (#647)\n\nSimilarity-based del/add pairing reordered split-view rows so gutter\nnumbers could appear out of file order (reported in #646). Pair lines\nby index like GitHub and keep word-diff pairing for highlights only.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix: align split diff rows positionally to preserve line number order…",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-09T15:11:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fbe6fcdc309432166a75a2abee31767bf0630799",
          "body": "Hold the API port listener until bindProxyServer succeeds and retry\nwhen apiPort+1 is still in TIME_WAIT from earlier httptest servers.\n\nCloses #642\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix(test): stabilize TestBindProxyServer_PortIsAPIPlusOne (#643)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-08T11:45:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d93238afe68ff94fab761656f3d65545936021fd",
          "body": "Multi-page static previews only injected the agent bundle on the root\n/preview-content/ page, so navigating to sibling .html files left Pin mode\nenabled but clicks did nothing. Also remove invalid allow=\"*\" on the\npreview iframe (harmless browser warning only).\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix: inject crit-agent into all preview HTML pages (#641)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-08T10:38:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "081253f0dab6983f5b7d5327d032c3451fc79164",
          "body": "Pair old and new paths when computing git diffs so pure renames no longer\nrender as full-file adds, and surface old_path in the review UI.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat: show file renames without content changes like GitHub (#640)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-08T10:38:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "de8462443fd13d99109a088dac1361b23ed459fd",
          "body": "Relocate package main, embedded frontend/, and integrations/ under\ncmd/crit/ so the repo root stays navigable on GitHub. Update build\npaths (Makefile, CI, e2e scripts, marketplace manifests, docs) and\nmove preview test fixtures to test/fixtures/. Move codecov config to\n.github/codecov.yml. No behavior changes.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "refactor: move Go sources to cmd/crit and slim repo root (#639)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-08T09:59:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7a1d0e403de3c5347e61fbcf7dcbe1e701a7ed01",
          "body": "* fix: preserve j/k focus across hover and comment form re-renders\n\nRemove mouseenter-driven focus sync so stationary cursor no longer steals\nkeyboard navigation at scroll boundaries. Persist focus through comment\ncancel/submit re-renders and add CSS hover highlight matching crit-web.\n\nFixes #636.\n\n\n[…]\na j/k in tests.\nAfter submit/cancel, selection clears but keyboard focus stays on the line.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix: preserve j/k focus across hover and comment form re-renders (#638)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-07T20:08:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ec0b75bc2f53ec916407258c51047f485f6e4477",
          "body": "localeCompare puts '_' before '.', so foo_test.go appeared before foo.go.\nUse ASCII pathCompare (matching Go sort.Strings) in the file list and tree.\n\nCloses #635\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "fix: sort files with GitHub byte order instead of localeCompare (#637)",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-07T19:25:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a3f3e93786771edca776c0e2cfe41af37dd47644",
          "body": "On systems where Go 1.26+ resolves localhost to [::1] (e.g. WSL2 with IPv6\nenabled), internal daemon HTTP calls failed because the server binds to\n127.0.0.1 but clients dialled localhost → ::1.\n\n- Add connURL() using the raw bind address for internal connectivity\n- Keep baseURL() for user-facing output (logs, browser open)\n- Add TestSessionEntry_ConnURL to lock the display vs connectivity split\n\nCo-authored-by: Tomas Aschan <tomasl@spotify.com>",
          "is_bot": false,
          "headline": "fix: use raw bind address for internal HTTP calls to avoid IPv6 mismatch",
          "author_name": "Tomas Aschan",
          "author_login": "tomasaschan",
          "committed_at": "2026-06-05T13:22:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03e8a7c0cc9d246e6ecc4cdb00317df439c32945",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump Nix flake version to v0.16.1",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-04T18:21:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4af6e20bd9c4a73d5abe210d238691722ff21b97",
          "body": "…633)\n\nPre-release audit polish for the multi-commit picker (v0.16.0 window):\n\n- Add a 13px spacer to the static \"All commits\" row so its text aligns\n  with the SHA column of the checkboxed commit rows (was offset 21px).\n- Make the \"All commits\" row keyboard-operable (role=button, tabindex,\n  Enter/\n[…]\n a detached doc comment in session.go: the GetFileDiffSnapshot\n  summary had been left above whitespaceIgnoredHunks; move it back.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: align and keyboard-enable the commit picker \"All commits\" row (#…",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-04T16:34:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "39eac5b75fa72401c77cc2aa63b60a46c3be3d43",
          "body": "…ance.\n\nCursor does not read .claude/rules; these .mdc files apply Go and frontend conventions when matching files are in context.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Add Cursor rules synced from .claude/rules for file-scoped agent guid…",
          "author_name": "Tomasz Tomczyk",
          "author_login": "tomasz-tomczyk",
          "committed_at": "2026-06-03T20:07:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 65,
      "commits_last_year": 748,
      "latest_release_at": "2026-07-17T13:57:34Z",
      "latest_release_tag": "v0.18.1",
      "releases_from_tags": false,
      "days_since_last_push": 1,
      "active_weeks_last_year": 23,
      "days_since_latest_release": 4,
      "mean_days_between_releases": 5.3
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 71,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/tomasz-tomczyk/crit",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/tomasz-tomczyk/crit",
          "is_deprecated": false,
          "latest_version": "v0.18.1",
          "repository_url": "https://github.com/tomasz-tomczyk/crit",
          "versions_count": 65,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-17T13:46:23Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 4
        }
      ]
    },
    "popularity": {
      "forks": 57,
      "stars": 810,
      "watchers": 3,
      "fork_history": {
        "days": [
          {
            "date": "2026-02-18",
            "count": 1
          },
          {
            "date": "2026-02-24",
            "count": 1
          },
          {
            "date": "2026-03-02",
            "count": 1
          },
          {
            "date": "2026-03-05",
            "count": 1
          },
          {
            "date": "2026-03-07",
            "count": 1
          },
          {
            "date": "2026-03-10",
            "count": 1
          },
          {
            "date": "2026-03-17",
            "count": 1
          },
          {
            "date": "2026-03-18",
            "count": 1
          },
          {
            "date": "2026-03-27",
            "count": 2
          },
          {
            "date": "2026-04-02",
            "count": 1
          },
          {
            "date": "2026-04-06",
            "count": 1
          },
          {
            "date": "2026-04-13",
            "count": 1
          },
          {
            "date": "2026-04-17",
            "count": 1
          },
          {
            "date": "2026-04-20",
            "count": 1
          },
          {
            "date": "2026-04-25",
            "count": 1
          },
          {
            "date": "2026-04-29",
            "count": 1
          },
          {
            "date": "2026-05-02",
            "count": 1
          },
          {
            "date": "2026-05-04",
            "count": 1
          },
          {
            "date": "2026-05-07",
            "count": 1
          },
          {
            "date": "2026-05-09",
            "count": 2
          },
          {
            "date": "2026-05-11",
            "count": 1
          },
          {
            "date": "2026-05-14",
            "count": 1
          },
          {
            "date": "2026-05-15",
            "count": 1
          },
          {
            "date": "2026-05-18",
            "count": 1
          },
          {
            "date": "2026-05-20",
            "count": 1
          },
          {
            "date": "2026-05-23",
            "count": 1
          },
          {
            "date": "2026-05-24",
            "count": 1
          },
          {
            "date": "2026-06-05",
            "count": 1
          },
          {
            "date": "2026-06-06",
            "count": 1
          },
          {
            "date": "2026-06-07",
            "count": 3
          },
          {
            "date": "2026-06-09",
            "count": 1
          },
          {
            "date": "2026-06-12",
            "count": 1
          },
          {
            "date": "2026-06-15",
            "count": 2
          },
          {
            "date": "2026-06-16",
            "count": 1
          },
          {
            "date": "2026-06-18",
            "count": 1
          },
          {
            "date": "2026-06-21",
            "count": 1
          },
          {
            "date": "2026-06-22",
            "count": 1
          },
          {
            "date": "2026-06-23",
            "count": 1
          },
          {
            "date": "2026-06-25",
            "count": 1
          },
          {
            "date": "2026-06-27",
            "count": 1
          },
          {
            "date": "2026-06-29",
            "count": 1
          },
          {
            "date": "2026-07-02",
            "count": 2
          },
          {
            "date": "2026-07-03",
            "count": 1
          },
          {
            "date": "2026-07-09",
            "count": 1
          },
          {
            "date": "2026-07-10",
            "count": 1
          },
          {
            "date": "2026-07-13",
            "count": 2
          },
          {
            "date": "2026-07-15",
            "count": 1
          },
          {
            "date": "2026-07-17",
            "count": 1
          },
          {
            "date": "2026-07-19",
            "count": 2
          }
        ],
        "complete": true,
        "collected": 57,
        "total_forks": 57
      },
      "star_history": {
        "days": [
          {
            "date": "2026-02-16",
            "count": 7
          },
          {
            "date": "2026-02-17",
            "count": 3
          },
          {
            "date": "2026-02-18",
            "count": 1
          },
          {
            "date": "2026-02-19",
            "count": 3
          },
          {
            "date": "2026-02-20",
            "count": 5
          },
          {
            "date": "2026-02-23",
            "count": 1
          },
          {
            "date": "2026-02-24",
            "count": 3
          },
          {
            "date": "2026-03-02",
            "count": 2
          },
          {
            "date": "2026-03-03",
            "count": 1
          },
          {
            "date": "2026-03-04",
            "count": 3
          },
          {
            "date": "2026-03-05",
            "count": 1
          },
          {
            "date": "2026-03-06",
            "count": 2
          },
          {
            "date": "2026-03-07",
            "count": 4
          },
          {
            "date": "2026-03-09",
            "count": 3
          },
          {
            "date": "2026-03-10",
            "count": 1
          },
          {
            "date": "2026-03-12",
            "count": 3
          },
          {
            "date": "2026-03-13",
            "count": 2
          },
          {
            "date": "2026-03-14",
            "count": 1
          },
          {
            "date": "2026-03-15",
            "count": 1
          },
          {
            "date": "2026-03-16",
            "count": 2
          },
          {
            "date": "2026-03-17",
            "count": 5
          },
          {
            "date": "2026-03-18",
            "count": 2
          },
          {
            "date": "2026-03-20",
            "count": 1
          },
          {
            "date": "2026-03-21",
            "count": 35
          },
          {
            "date": "2026-03-22",
            "count": 3
          },
          {
            "date": "2026-03-23",
            "count": 2
          },
          {
            "date": "2026-03-24",
            "count": 3
          },
          {
            "date": "2026-03-25",
            "count": 1
          },
          {
            "date": "2026-03-26",
            "count": 2
          },
          {
            "date": "2026-03-27",
            "count": 1
          },
          {
            "date": "2026-03-29",
            "count": 2
          },
          {
            "date": "2026-03-30",
            "count": 2
          },
          {
            "date": "2026-03-31",
            "count": 1
          },
          {
            "date": "2026-04-01",
            "count": 4
          },
          {
            "date": "2026-04-02",
            "count": 3
          },
          {
            "date": "2026-04-04",
            "count": 1
          },
          {
            "date": "2026-04-06",
            "count": 2
          },
          {
            "date": "2026-04-07",
            "count": 2
          },
          {
            "date": "2026-04-08",
            "count": 3
          },
          {
            "date": "2026-04-10",
            "count": 5
          },
          {
            "date": "2026-04-13",
            "count": 11
          },
          {
            "date": "2026-04-14",
            "count": 1
          },
          {
            "date": "2026-04-15",
            "count": 15
          },
          {
            "date": "2026-04-16",
            "count": 12
          },
          {
            "date": "2026-04-17",
            "count": 5
          },
          {
            "date": "2026-04-18",
            "count": 2
          },
          {
            "date": "2026-04-19",
            "count": 1
          },
          {
            "date": "2026-04-20",
            "count": 3
          },
          {
            "date": "2026-04-21",
            "count": 1
          },
          {
            "date": "2026-04-23",
            "count": 4
          },
          {
            "date": "2026-04-24",
            "count": 6
          },
          {
            "date": "2026-04-25",
            "count": 3
          },
          {
            "date": "2026-04-27",
            "count": 11
          },
          {
            "date": "2026-04-28",
            "count": 4
          },
          {
            "date": "2026-04-29",
            "count": 1
          },
          {
            "date": "2026-04-30",
            "count": 3
          },
          {
            "date": "2026-05-01",
            "count": 3
          },
          {
            "date": "2026-05-02",
            "count": 10
          },
          {
            "date": "2026-05-03",
            "count": 10
          },
          {
            "date": "2026-05-04",
            "count": 7
          },
          {
            "date": "2026-05-05",
            "count": 4
          },
          {
            "date": "2026-05-06",
            "count": 4
          },
          {
            "date": "2026-05-07",
            "count": 18
          },
          {
            "date": "2026-05-08",
            "count": 17
          },
          {
            "date": "2026-05-09",
            "count": 8
          },
          {
            "date": "2026-05-10",
            "count": 7
          },
          {
            "date": "2026-05-11",
            "count": 8
          },
          {
            "date": "2026-05-12",
            "count": 9
          },
          {
            "date": "2026-05-13",
            "count": 4
          },
          {
            "date": "2026-05-14",
            "count": 2
          },
          {
            "date": "2026-05-15",
            "count": 8
          },
          {
            "date": "2026-05-16",
            "count": 4
          },
          {
            "date": "2026-05-17",
            "count": 2
          },
          {
            "date": "2026-05-19",
            "count": 2
          },
          {
            "date": "2026-05-20",
            "count": 1
          },
          {
            "date": "2026-05-21",
            "count": 1
          },
          {
            "date": "2026-05-22",
            "count": 2
          },
          {
            "date": "2026-05-24",
            "count": 1
          },
          {
            "date": "2026-05-25",
            "count": 2
          },
          {
            "date": "2026-05-26",
            "count": 2
          },
          {
            "date": "2026-05-27",
            "count": 2
          },
          {
            "date": "2026-05-28",
            "count": 6
          },
          {
            "date": "2026-05-29",
            "count": 4
          },
          {
            "date": "2026-05-30",
            "count": 2
          },
          {
            "date": "2026-05-31",
            "count": 1
          },
          {
            "date": "2026-06-01",
            "count": 4
          },
          {
            "date": "2026-06-02",
            "count": 5
          },
          {
            "date": "2026-06-03",
            "count": 4
          },
          {
            "date": "2026-06-04",
            "count": 5
          },
          {
            "date": "2026-06-05",
            "count": 28
          },
          {
            "date": "2026-06-06",
            "count": 18
          },
          {
            "date": "2026-06-07",
            "count": 23
          },
          {
            "date": "2026-06-08",
            "count": 13
          },
          {
            "date": "2026-06-09",
            "count": 5
          },
          {
            "date": "2026-06-10",
            "count": 10
          },
          {
            "date": "2026-06-11",
            "count": 5
          },
          {
            "date": "2026-06-12",
            "count": 4
          },
          {
            "date": "2026-06-13",
            "count": 1
          },
          {
            "date": "2026-06-14",
            "count": 2
          },
          {
            "date": "2026-06-15",
            "count": 5
          },
          {
            "date": "2026-06-16",
            "count": 1
          },
          {
            "date": "2026-06-17",
            "count": 4
          },
          {
            "date": "2026-06-18",
            "count": 5
          },
          {
            "date": "2026-06-19",
            "count": 5
          },
          {
            "date": "2026-06-20",
            "count": 3
          },
          {
            "date": "2026-06-21",
            "count": 2
          },
          {
            "date": "2026-06-22",
            "count": 7
          },
          {
            "date": "2026-06-23",
            "count": 7
          },
          {
            "date": "2026-06-24",
            "count": 4
          },
          {
            "date": "2026-06-25",
            "count": 24
          },
          {
            "date": "2026-06-26",
            "count": 26
          },
          {
            "date": "2026-06-27",
            "count": 9
          },
          {
            "date": "2026-06-28",
            "count": 8
          },
          {
            "date": "2026-06-29",
            "count": 10
          },
          {
            "date": "2026-06-30",
            "count": 17
          },
          {
            "date": "2026-07-01",
            "count": 14
          },
          {
            "date": "2026-07-02",
            "count": 11
          },
          {
            "date": "2026-07-03",
            "count": 16
          },
          {
            "date": "2026-07-04",
            "count": 6
          },
          {
            "date": "2026-07-05",
            "count": 6
          },
          {
            "date": "2026-07-06",
            "count": 16
          },
          {
            "date": "2026-07-07",
            "count": 10
          },
          {
            "date": "2026-07-08",
            "count": 3
          },
          {
            "date": "2026-07-09",
            "count": 11
          },
          {
            "date": "2026-07-10",
            "count": 4
          },
          {
            "date": "2026-07-11",
            "count": 8
          },
          {
            "date": "2026-07-12",
            "count": 6
          },
          {
            "date": "2026-07-13",
            "count": 8
          },
          {
            "date": "2026-07-14",
            "count": 6
          },
          {
            "date": "2026-07-15",
            "count": 12
          },
          {
            "date": "2026-07-16",
            "count": 7
          },
          {
            "date": "2026-07-17",
            "count": 9
          },
          {
            "date": "2026-07-18",
            "count": 7
          },
          {
            "date": "2026-07-19",
            "count": 6
          },
          {
            "date": "2026-07-20",
            "count": 5
          },
          {
            "date": "2026-07-21",
            "count": 11
          },
          {
            "date": "2026-07-22",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 810,
        "total_stars": 810
      },
      "open_issues_and_prs": 4
    },
    "ai_readiness": {
      "has_nix": true,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile",
        "mise.toml"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "test/e2e/tsconfig.json"
      ],
      "toolchain_manifests": [
        "go.mod",
        "test/e2e/fixtures/livemode-upstream/go.mod"
      ],
      "largest_source_bytes": 3565102,
      "source_files_sampled": 609,
      "oversized_source_files": 12,
      "agent_instruction_files": [
        ".cursor/rules/frontend-architecture.mdc",
        ".cursor/rules/frontend-css.mdc",
        ".cursor/rules/frontend-js.mdc",
        ".cursor/rules/go.mdc",
        ".cursor/rules/proxy-auth-transport.mdc",
        "AGENTS.md",
        "CLAUDE.md",
        "scripts/AGENTS.md",
        "scripts/CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 30857
    },
    "dependencies": {
      "manifests": [
        "go.mod",
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go",
        "npm"
      ],
      "dependencies": [
        {
          "name": "github.com/mdp/qrterminal/v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.2.1"
        },
        {
          "name": "golang.org/x/sys",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.45.0"
        },
        {
          "name": "golang.org/x/term",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.43.0"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        },
        {
          "name": "rsc.io/qr",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.2.0"
        },
        {
          "name": "golang.org/x/net",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.55.0"
        },
        {
          "name": "github.com/gorilla/websocket",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.5.3"
        },
        {
          "name": "@highlightjs/cdn-assets",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.11.1"
        },
        {
          "name": "@sanity/diff-match-patch",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.2.0"
        },
        {
          "name": "highlightjs-heex",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.0.1"
        },
        {
          "name": "markdown-it",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^14.3.0"
        },
        {
          "name": "mermaid",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.16.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 577,
        "open_issues": 4,
        "closed_ratio": 0.974,
        "closed_issues": 149,
        "closed_unmerged_prs": 19
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "tomasz-tomczyk",
          "commits": 689,
          "avatar_url": "https://avatars.githubusercontent.com/u/182303?v=4"
        },
        {
          "type": "User",
          "login": "vereis",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/15597865?v=4"
        },
        {
          "type": "User",
          "login": "Amwam",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/879073?v=4"
        },
        {
          "type": "User",
          "login": "justin-guan",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/6827708?v=4"
        },
        {
          "type": "User",
          "login": "omry",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/376455?v=4"
        },
        {
          "type": "User",
          "login": "prateek",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/199982?v=4"
        },
        {
          "type": "User",
          "login": "danlindow",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/9800912?v=4"
        },
        {
          "type": "User",
          "login": "dankilman",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/1008577?v=4"
        },
        {
          "type": "User",
          "login": "ericsullivan",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/698585?v=4"
        },
        {
          "type": "User",
          "login": "inyono",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/1508477?v=4"
        }
      ],
      "contributors_sampled": 27,
      "top_contributor_share": 0.953
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "release.yml",
        "test.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".golangci.yml",
        "eslint.config.mjs"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum",
        "package-lock.json"
      ],
      "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": 3,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 9,
            "reason": "26 out of 27 merged PRs checked by a CI test -- score normalized to 9",
            "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 4/28 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": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 10,
            "reason": "security policy file 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": "23 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "162981c16ed2df6c458c2a551ce8ba591b101316",
        "ran_at": "2026-07-22T03:14:23Z",
        "aggregate_score": 4.7,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-20T13:50:16Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-20T13:36:44Z",
      "ci_last_conclusion": "FAILURE",
      "oldest_open_issues": [
        {
          "number": 557,
          "created_at": "2026-05-17T08:37:17Z",
          "last_comment_at": "2026-07-08T00:20:42Z",
          "last_comment_author": "technicalpickles"
        },
        {
          "number": 728,
          "created_at": "2026-07-08T00:42:53Z",
          "last_comment_at": "2026-07-20T08:27:16Z",
          "last_comment_author": "tomasz-tomczyk"
        },
        {
          "number": 758,
          "created_at": "2026-07-20T11:54:42Z",
          "last_comment_at": "2026-07-20T13:03:18Z",
          "last_comment_author": "tomasz-tomczyk"
        },
        {
          "number": 760,
          "created_at": "2026-07-21T22:55:11Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/tomasz-tomczyk/crit",
    "host": "github.com",
    "name": "crit",
    "owner": "tomasz-tomczyk"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 70,
      "inputs": {
        "security": 47,
        "vitality": 84,
        "community": 67,
        "governance": 64,
        "engineering": 85
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 84,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 80,
            "inputs": {
              "commits_last_year": 748,
              "human_commit_share": 0.87,
              "days_since_last_push": 1,
              "active_weeks_last_year": 23
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 1 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 1
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "23/52 weeks with commits",
                "points": 15.9,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 23
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "748 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 748
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 28 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": 65,
              "latest_release_tag": "v0.18.1",
              "releases_from_tags": false,
              "days_since_latest_release": 4,
              "mean_days_between_releases": 5.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "65 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 65
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 4 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~5.3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 5.3
                    }
                  }
                ],
                "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": "moderate",
        "name": "Community & Adoption",
        "value": 67,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "forks": 57,
              "stars": 810,
              "watchers": 3,
              "growth_state": "organic",
              "growth_factor_pct": 100
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "810 stars",
                "points": 47.2,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 810
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "57 forks",
                "points": 14.6,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 57
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "3 watchers",
                "points": 1.7,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 64,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 30,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 27,
              "top_contributor_share": 0.953
            },
            "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 95% of commits",
                "points": 1.1,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 95
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "27 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 27
                    }
                  }
                ],
                "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": 84,
            "inputs": {
              "merged_prs": 577,
              "open_issues": 4,
              "closed_issues": 149,
              "issue_closed_ratio": 0.974,
              "closed_unmerged_prs": 19
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "97% of issues closed",
                "points": 45.5,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 97
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "577/596 decided PRs merged",
                "points": 37,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 577,
                      "decided": 596
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 4/28 approved changesets -- score normalized to 1",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 57,
            "inputs": {
              "followers": 66,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "tomasz-tomczyk",
              "public_repos": 29,
              "account_age_days": 6032
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "66 followers of tomasz-tomczyk",
                "points": 13.1,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 66,
                      "login": "tomasz-tomczyk"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "29 public repos, account ~16 yr old",
                "points": 22.8,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 29
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 16
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/tomasz-tomczyk/crit"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 4
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 4 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "65 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 65
                    }
                  }
                ],
                "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": "excellent",
        "name": "Engineering Quality",
        "value": 85,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": ".golangci.yml, eslint.config.mjs",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml, eslint.config.mjs"
                    }
                  }
                ],
                "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": "26 out of 27 merged PRs checked by a CI test -- score normalized to 9",
                "points": 18,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [
                "agentic-coding",
                "ai-tools",
                "cli",
                "llm",
                "markdown",
                "code-review",
                "ai-agents",
                "developer-tools"
              ],
              "has_wiki": false,
              "homepage": "https://crit.md",
              "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://crit.md",
                "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": "8 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 47,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 47,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 4.7
            },
            "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 is not maximal on development and all release branches",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "26 out of 27 merged PRs checked by a CI test -- score normalized to 9",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 4/28 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": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 5,
                "status": "met",
                "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": "23 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": 12
            },
            "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": 82,
        "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": 1,
              "agent_instruction_files": [
                ".cursor/rules/frontend-architecture.mdc",
                ".cursor/rules/frontend-css.mdc",
                ".cursor/rules/frontend-js.mdc",
                ".cursor/rules/go.mdc",
                ".cursor/rules/proxy-auth-transport.mdc",
                "AGENTS.md",
                "CLAUDE.md",
                "scripts/AGENTS.md",
                "scripts/CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 30857
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": ".cursor/rules/frontend-architecture.mdc, .cursor/rules/frontend-css.mdc, .cursor/rules/frontend-js.mdc, .cursor/rules/go.mdc, .cursor/rules/proxy-auth-transport.mdc, AGENTS.md, CLAUDE.md, scripts/AGENTS.md, scripts/CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".cursor/rules/frontend-architecture.mdc, .cursor/rules/frontend-css.mdc, .cursor/rules/frontend-js.mdc, .cursor/rules/go.mdc, .cursor/rules/proxy-auth-transport.mdc, AGENTS.md, CLAUDE.md, scripts/AGENTS.md, scripts/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": "87 of 87 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 87,
                      "sampled": 87
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "excellent",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "has_nix": true,
              "has_tests": true,
              "lockfiles": [
                "go.sum",
                "package-lock.json"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile",
                "mise.toml"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "test/e2e/tsconfig.json"
              ],
              "agent_commit_share": 0.59,
              "toolchain_manifests": [
                "go.mod",
                "test/e2e/fixtures/livemode-upstream/go.mod"
              ],
              "dependency_bot_commit_share": 0.13
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile, mise.toml",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile, mise.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": ".golangci.yml, eslint.config.mjs",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml, eslint.config.mjs"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "test/e2e/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "test/e2e/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, Nix, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, Nix, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "59 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 59,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "13 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 13,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 3565102,
              "source_files_sampled": 609,
              "oversized_source_files": 12
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "12/609 source files over 60KB",
                "points": 53.9,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 609,
                      "oversized": 12
                    }
                  }
                ],
                "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": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T03:14:48.625627Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/t/tomasz-tomczyk/crit.svg",
  "full_name": "tomasz-tomczyk/crit",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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