Public record
Software health reportschema 0.23.0 · metrics 1.13.0 · 2026-07-21 15:50 UTC

invergent-ai / surogate

Training/Fine-tuning at the speed of light

C++ · Python · CudaApache-2.0★ 806 stars⑂ 6 forksgrowth anomalysince Jan 2026View on GitHub ↗

invergent-ai/surogate holds a health index of 60 out of 100, placing it in the Moderate band. It scores highest on Vitality (85/100) and lowest on Community & Adoption (31/100). It was last updated today. A single contributor accounts for most of its recent work.

60
overall / 100
Moderate

Software health index

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

60
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

InvergentOrganization
15 followers20 public repossince Sep 2025

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

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publish
npmjackalope00

Metrics by category

Vitality

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

85Excellent · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
18/36Commit cadence — 26/52 weeks with commits
18/18Commit volume — 1,303 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year1,303
human_commit_share1
days_since_last_push0
active_weeks_last_year26
How it's scored
27/27Ships releases — 47 releases published
36/36Release recency — latest release 0 days ago
27/27Release cadence — a release every ~9.3 days
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Inputs used
releases_count47
latest_release_tagv1.2.8
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases9.3

Community & Adoption

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

31At risk · 18% of overall
How it's scored
28.3/60Stars — 806 stars, discounted for inorganic growth: 617 stars over 2 day(s) from 2026-06-03 → 2026-06-04, 322× the repository's own daily baseline
3.5/25Forks — 6 forks, discounted for inorganic growth: 617 stars over 2 day(s) from 2026-06-03 → 2026-06-04, 322× the repository's own daily baseline
1.7/15Watchers — 3 watchers
Inputs used
forks6
stars806
watchers3
growth_stateanomalous
growth_signalsacquisition_burst, star_concentration, missing_decay
growth_windows2026-06-03/2026-06-04
growth_peak_days2
growth_factor_pct60
growth_peak_stars617
growth_peak_window2026-06-03 → 2026-06-04
growth_peak_multiple322
growth_top_days_share0.825
growth_baseline_per_day1
growth_history_completeyes
Inorganic Growth Policy discounts the stars and forks components by 40%. The finding describes the timing of public star and fork events; it does not establish that attention was purchased, or that the maintainers were involved.
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (Apache-2.0)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
How it's scored
0/80Monthly downloads — 0 downloads/month across npm
0/20Registry dependents — not reported by this ecosystem
Inputs used
packagesjackalope
dependents
ecosystemsnpm
total_downloads
monthly_downloads0
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

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

52Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
0.6/22.5Commit distribution — top contributor authored 97% of commits
4.1/13.5Contributor breadth — 3 contributors
10/10OpenSSF Scorecard: Contributors — project has 3 contributing companies or organizations -- score normalized to 10
Inputs used
bus_factor1
contributors_sampled3
top_contributor_share0.974
How it's scored
36.4/46.8Issue resolution — 78% of issues closed
34.9/38.3PR acceptance — 31/34 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 1/11 approved changesets -- score normalized to 0
Inputs used
merged_prs31
open_issues6
closed_issues21
issue_closed_ratio0.778
closed_unmerged_prs3
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
8.7/25Owner reach — 15 followers of invergent-ai
11.3/25Track record — 20 public repos, account ~0 yr old
Inputs used
followers15
owner_typeOrganization
is_verified
owner_logininvergent-ai
public_repos20
account_age_days306
How it's scored
25/25Published & resolvable — 1 package(s) on npm
0/35Publish recency — no data
4/20Version history — 0 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesjackalope
ecosystemsnpm
any_deprecatedno
min_days_since_publish
Excluded from scoring (no data or not applicable): Publish recency. Remaining weights renormalized.

Engineering Quality

Are baseline engineering and documentation practices in place?

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

Documentation

100Excellent
How it's scored
30/30README
25/25Documentation directory
15/15Documentation / homepage site — https://surogate.ai
10/10Repository description
10/10Topics — 10 topics
10/10Wiki
Inputs used
topicscuda, deep-learning, fine-tuning, generative-ai, llama, llm, llms, nvidia-gpu, qwen, sft
has_wikiyes
homepagehttps://surogate.ai
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

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

40At risk · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — 0 out of 8 merged PRs checked by a CI test -- score normalized to 0
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 1/11 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 3 contributing companies or organizations -- score normalized to 10
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
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
6.8/7.5Vulnerabilities — 1 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate4

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.

65Moderate · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 92 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.92
agent_instruction_files
agent_instruction_max_bytes
How it's scored
18/18One-command bootstrap — Makefile
22/22Automated tests
11/11Lint / format config
11/11Static type checking — jackalope/tsconfig.json
10/10Reproducible environment — Dockerfile, lockfile
10/10Demonstrated agent practice — 61 of the last 100 commits agent-authored or agent-credited
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfilespackage-lock.json
has_dockerfileyes
typed_languageyes
bootstrap_filesMakefile
has_devcontainerno
has_linter_configyes
typecheck_configsjackalope/tsconfig.json
agent_commit_share0.61
toolchain_manifests
dependency_bot_commit_share0
How it's scored
45/45Type-checkable code — C++ (statically typed)
52.4/55Manageable file sizes — 34/723 source files over 60KB
Inputs used
primary_languageC++
largest_source_bytes324,304
source_files_sampled723
oversized_source_files34
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — examples, recipes
Inputs used
example_dirsexamples, recipes
has_mcp_signalno
api_schema_files

Key facts

806GitHub stars
3contributors
1,303commits, last 12 months
0days since last push
47releases
1bus factor
6open issues
npm, PyPIpackage ecosystems

Data collection warnings

  • Could not fetch pypi package 'surogate' from its registry
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

More detail

Star and fork history 806 ★ / 6 ⇿
806Stars
6Forks
44Releases

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.

The shaded band marks the burst the Inorganic Growth Policy confirmed. How growth authenticity is assessed

02004006008001,00080463222026-012026-042026-07
Major 0Minor 5Patch 39
OpenSSF Scorecard 4.0 / 10
4.0aggregate

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-21 15:50 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
0CI-Tests0 out of 8 merged PRs checked by a CI test -- score normalized to 0
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 1/11 approved changesets -- score normalized to 0
10Contributorsproject has 3 contributing companies or organizations -- score normalized to 10
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
9Vulnerabilities1 existing vulnerabilities detected
Direct dependencies 29
RegistryPackageVersion constraintManifest
npm@inkjs/ui^2.0.0jackalope/package.json
npm@logdna/tail-file^4.0.2jackalope/package.json
npm@resvg/resvg-js^2.6.2jackalope/package.json
npmecharts^6.1.0jackalope/package.json
npmink^7.0.6jackalope/package.json
npmreact^19.2.0jackalope/package.json
npmsixel^0.16.0jackalope/package.json
npmterminal-image^4.3.0jackalope/package.json
npmyaml^2.9.0jackalope/package.json
PyPItransformers>=5.5.0pyproject.toml
PyPIhuggingface-hub>=1.4.1pyproject.toml
PyPIhf-transfer>=0.1.9pyproject.toml
PyPIdatasets>=4.3.0pyproject.toml
PyPIaddictpyproject.toml
PyPIpeftpyproject.toml
PyPIjson_repairpyproject.toml
PyPIunique-namerpyproject.toml
PyPInanobindpyproject.toml
PyPIbinpackingpyproject.toml
PyPIrich>=13.0.0pyproject.toml
PyPIpsutilpyproject.toml
PyPImatplotlibpyproject.toml
PyPIqwen-vl-utils==0.0.14pyproject.toml
PyPIray>=2.5.0pyproject.toml
PyPIverifiers==0.1.11pyproject.toml
PyPIwandb==0.25.1pyproject.toml
PyPIjaxtypingpyproject.toml
PyPIaiolimiterpyproject.toml
PyPIopenai==2.32.0pyproject.toml
All dependencies not collected

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

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [
        "cuda",
        "deep-learning",
        "fine-tuning",
        "generative-ai",
        "llama",
        "llm",
        "llms",
        "nvidia-gpu",
        "qwen",
        "sft"
      ],
      "is_fork": false,
      "size_kb": 73036,
      "has_wiki": true,
      "homepage": "https://surogate.ai",
      "languages": {
        "C": 992,
        "C++": 6743539,
        "Cuda": 1817229,
        "CMake": 29813,
        "Shell": 17052,
        "Python": 2873433,
        "Makefile": 9472,
        "JavaScript": 5651,
        "TypeScript": 421984
      },
      "pushed_at": "2026-07-21T13:05:10Z",
      "created_at": "2026-01-02T06:32:04Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-21T15:40:48Z",
      "description": "Training/Fine-tuning at the speed of light",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "C++",
      "significant_languages": [
        "C++",
        "Python",
        "Cuda"
      ]
    },
    "owner": {
      "blog": "https://invergent.ai",
      "name": "Invergent",
      "type": "Organization",
      "login": "invergent-ai",
      "company": null,
      "location": "Romania",
      "followers": 15,
      "avatar_url": "https://avatars.githubusercontent.com/u/233052289?v=4",
      "created_at": "2025-09-18T10:04:34Z",
      "is_verified": null,
      "public_repos": 20,
      "account_age_days": 306
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.2.8",
          "kind": "patch",
          "published_at": "2026-07-21T08:55:53Z"
        },
        {
          "tag": "v1.2.6",
          "kind": "patch",
          "published_at": "2026-05-20T06:10:08Z"
        },
        {
          "tag": "v1.2.5",
          "kind": "patch",
          "published_at": "2026-05-19T14:16:31Z"
        },
        {
          "tag": "v1.2.4",
          "kind": "patch",
          "published_at": "2026-05-10T11:33:31Z"
        },
        {
          "tag": "v1.2.3",
          "kind": "patch",
          "published_at": "2026-05-06T06:15:39Z"
        },
        {
          "tag": "v1.2.2",
          "kind": "patch",
          "published_at": "2026-05-04T17:19:53Z"
        },
        {
          "tag": "v1.2.1",
          "kind": "patch",
          "published_at": "2026-04-30T16:45:44Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2026-04-30T05:00:53Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2026-04-29T13:10:12Z"
        },
        {
          "tag": "v1.0.9",
          "kind": "patch",
          "published_at": "2026-04-28T14:59:27Z"
        },
        {
          "tag": "v1.0.8",
          "kind": "patch",
          "published_at": "2026-04-28T11:09:59Z"
        },
        {
          "tag": "v1.0.7",
          "kind": "patch",
          "published_at": "2026-04-28T10:40:52Z"
        },
        {
          "tag": "v1.0.6",
          "kind": "patch",
          "published_at": "2026-04-28T09:20:57Z"
        },
        {
          "tag": "v1.0.5",
          "kind": "patch",
          "published_at": "2026-04-28T07:41:35Z"
        },
        {
          "tag": "v1.0.4",
          "kind": "patch",
          "published_at": "2026-04-26T19:51:02Z"
        },
        {
          "tag": "v1.0.3",
          "kind": "patch",
          "published_at": "2026-04-26T18:51:44Z"
        },
        {
          "tag": "v1.0.2",
          "kind": "patch",
          "published_at": "2026-04-25T04:23:08Z"
        },
        {
          "tag": "v1.0.1",
          "kind": "patch",
          "published_at": "2026-04-24T12:07:06Z"
        },
        {
          "tag": "v0.2.8",
          "kind": "patch",
          "published_at": "2026-04-03T17:14:50Z"
        },
        {
          "tag": "v0.2.7",
          "kind": "patch",
          "published_at": "2026-04-03T14:49:05Z"
        },
        {
          "tag": "v0.2.6",
          "kind": "patch",
          "published_at": "2026-04-03T13:45:11Z"
        },
        {
          "tag": "v0.2.5",
          "kind": "patch",
          "published_at": "2026-04-03T10:57:56Z"
        },
        {
          "tag": "v0.2.4",
          "kind": "patch",
          "published_at": "2026-04-03T04:43:06Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2026-03-26T16:24:59Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-03-26T14:00:39Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-05-10T11:38:54Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-02-26T04:22:53Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-02-25T10:20:06Z"
        },
        {
          "tag": "v0.1.10",
          "kind": "patch",
          "published_at": "2026-02-25T06:47:26Z"
        },
        {
          "tag": "v0.1.9",
          "kind": "patch",
          "published_at": "2026-02-23T20:16:28Z"
        },
        {
          "tag": "v0.1.8",
          "kind": "patch",
          "published_at": "2026-02-19T16:01:57Z"
        },
        {
          "tag": "v0.1.7",
          "kind": "patch",
          "published_at": "2026-02-19T09:46:15Z"
        },
        {
          "tag": "v0.1.6",
          "kind": "patch",
          "published_at": "2026-02-18T15:59:36Z"
        },
        {
          "tag": "v0.1.5",
          "kind": "patch",
          "published_at": "2026-02-18T14:13:23Z"
        },
        {
          "tag": "v0.1.4",
          "kind": "patch",
          "published_at": "2026-02-18T13:14:18Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2026-02-18T05:15:11Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2026-02-16T08:09:07Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-02-15T04:57:25Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-02-14T09:52:10Z"
        },
        {
          "tag": "v0.0.9",
          "kind": "patch",
          "published_at": "2026-02-13T09:32:44Z"
        },
        {
          "tag": "v0.0.7",
          "kind": "patch",
          "published_at": "2026-01-27T15:12:58Z"
        },
        {
          "tag": "v0.0.6",
          "kind": "patch",
          "published_at": "2026-01-16T14:17:50Z"
        },
        {
          "tag": "v0.0.5",
          "kind": "patch",
          "published_at": "2026-01-16T09:50:46Z"
        },
        {
          "tag": "v0.0.4",
          "kind": "patch",
          "published_at": "2026-01-10T10:51:07Z"
        },
        {
          "tag": "v0.0.3",
          "kind": "patch",
          "published_at": "2026-01-09T07:32:47Z"
        },
        {
          "tag": "v0.0.2",
          "kind": "patch",
          "published_at": "2026-01-04T18:05:51Z"
        },
        {
          "tag": "v0.0.1",
          "kind": "patch",
          "published_at": "2026-01-03T08:08:31Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "d1bfe628b488cefad5d8328873db2f50110363d4",
          "body": "* feat(dpo): dpo_dloss CUDA kernel + parity test\n\nOne block per (chosen, rejected) pair: reduce per-sample response-token logprob\nsums (policy & reference), compute -log sigmoid(beta*margin), scatter per-token\ncustom_dloss in GRPO's shifted layout. Knobs: beta, length_norm. metrics[4] =\n{loss_sum, c\n[…]\n: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n* feat(dpo): harden trainer workflows and adapter compatibility\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dpo): add native offline DPO trainer (#61)",
          "author_name": "Flavius Burca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-21T13:03:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "04ca6a779fd8a2c4eba36355d344e62f5012cd01",
          "body": null,
          "is_bot": false,
          "headline": "clarify tokenizer transplant",
          "author_name": "flaviusburca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-21T10:03:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f47abcfaa3d8ebf4b2c83686e00dcf9ad84f51fb",
          "body": "fix(grpo): reap orphaned vLLM subprocesses on split-mode shutdown",
          "is_bot": false,
          "headline": "Merge pull request #59 from invergent-ai/fix/grpo-vllm-subprocess-reap",
          "author_name": "Flavius Burca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-21T07:59:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "286c00af27df385fad0c0efe5ba54431d1b09bcc",
          "body": null,
          "is_bot": false,
          "headline": "fix installer",
          "author_name": "flaviusburca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-21T07:56:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "845f84aa76391bf289849159cd5f9ab7231949f3",
          "body": "feat: knowledge distillation (offline top-K logit KD + cross-tokenizer transplant)",
          "is_bot": false,
          "headline": "Merge pull request #60 from invergent-ai/feat/knowledge-distillation",
          "author_name": "Flavius Burca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-21T07:54:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7a425fc8b99b22af4ea1a612fbae67fcc511f468",
          "body": "…r transplant)\n\nNative KD training path: fused top-K teacher KL inside the LM-head CE backward\n(fused + chunked CUDA kernels), step_with_kd/get_kd_loss, .kd sidecar format\nwith native DataLoader support, distillation: config block, kd_loss metrics.\n\nTeacher capture (surogate distill-capture): local \n[…]\nfling on restore.\n\nValidated by 75 CPU tests, GPU identity/parity/descent tests, and an\nadversarial multi-agent review (12 findings, all fixed).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: knowledge distillation (offline top-K logit KD + cross-tokenize…",
          "author_name": "flaviusburca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-21T07:54:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a295c6935d2c0aa347ceb0b16f53a0d746a53844",
          "body": null,
          "is_bot": false,
          "headline": "remove obsolete files",
          "author_name": "flaviusburca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-21T04:11:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a286fe8b97bf163a863bb5f8bef3ebbfa78cfb17",
          "body": "- restrict PR_SET_CHILD_SUBREAPER to linux (ctypes.CDLL(None) raises on\n  Windows) and declare prctl argtypes/restype so ctypes doesn't pass 32-bit\n  c_int where an unsigned long is expected (undefined on LP64 arches).\n- fall back to os.kill(pid) when killpg raises ProcessLookupError, in case\n  teardown races the child's setsid() before its process group exists.\n- skip the linux-only reap tests on non-linux platforms.",
          "is_bot": false,
          "headline": "fix(grpo): guard subreaper to linux and harden vLLM signaling",
          "author_name": "Monica Girbea",
          "author_login": null,
          "committed_at": "2026-07-07T08:54:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "776985a3e86bf2c3ff93c908de5ac2e24ee556d7",
          "body": "A split-mode GRPO run could finish training successfully yet leave vLLM\nmultiprocessing/EngineCore workers alive: a spawn worker reparents to PID 1\nwhen its parent exits mid-run and sits outside the vLLM session group, so\nneither killpg on that group nor a teardown-time child-tree walk reaches it.\nT\n[…]\nurvivor and reaps it by\nPID. killpg stays as the graceful first pass so each vLLM session releases its\nGPU cleanly; the reap is the safety net. Best-effort prctl: logs and continues\nwhere unavailable.",
          "is_bot": false,
          "headline": "fix(grpo): reap orphaned vLLM subprocesses on split-mode shutdown",
          "author_name": "Monica Girbea",
          "author_login": null,
          "committed_at": "2026-07-07T08:12:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "382b7850bde5e50ce914dadca5a7c05b8c11e44c",
          "body": null,
          "is_bot": false,
          "headline": "docs(grpo): spec for reaping orphaned vLLM subprocesses on shutdown",
          "author_name": "Monica Girbea",
          "author_login": null,
          "committed_at": "2026-07-07T07:21:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b97f08f7558a771f6befc548c2fe4b6ce117d154",
          "body": "fix(framework): GDR autotuned-grid corruption + 4 training fixes",
          "is_bot": false,
          "headline": "Merge pull request #58 from invergent-ai/fix/framework-fixes",
          "author_name": "Flavius Burca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-02T05:06:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b451e238f9d1e8921e459f7fee8d432657ae333",
          "body": "fix(qwen3.5-moe): train under fp8-hybrid + stop debuginfod trace hangs",
          "is_bot": false,
          "headline": "Merge pull request #57 from invergent-ai/fix/qwen35-moe-fp8-hybrid",
          "author_name": "Flavius Burca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-02T05:05:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc60b3bcb5bd331f09cd82ce9c0c661612c2b52a",
          "body": "…hardcoded tiles\n\nThe gated-delta-rule dispatch hardcoded tile sizes for grid math (fwd_o BV=64,\nfwd_h/bwd_dhu BV=32, bwd_dqkwg BK=64) while the AOT autotuner bakes whichever\ntiling wins benchmarking into the cubin. At H=32 (Qwen3.5-4B, ratio-2 GQA\nlinear attention) fwd_o autotunes to BV=32: the ker\n[…]\nanged\n(4 pass + 1 pre-existing marginal tolerance miss on lin_norm_weight).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n(cherry picked from commit 63d4c164ef91762b3ee8077043dba7d91f193490)",
          "is_bot": false,
          "headline": "fix(gdr): derive launch grids from autotuned manifest constants, not …",
          "author_name": "flaviusburca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-02T04:52:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8c11722e389e2f017cf214c2309364fd0ca60f8f",
          "body": "(cherry picked from commit 87b784ef8c717e78cd376e5fd24caa7b29cce3f4)",
          "is_bot": false,
          "headline": "surogate: fix fused mlp growth mask",
          "author_name": "flaviusburca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-02T04:52:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7502e2f1a05ac37025f0f0dc2e398bbf182a760e",
          "body": "(cherry picked from commit 55ff4e83f86dd8b60e92b93a36f71f40ce881d63)",
          "is_bot": false,
          "headline": "surogate: add runtime gradient mask guard",
          "author_name": "flaviusburca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-02T04:52:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "81c71faf9b630febe60ecd9b1ae45e4b47a6c4f3",
          "body": "CMAKE_ARGS is forwarded to scikit-build-core's CMake *configure* step,\nwhich rejects '--parallel N'. Move build parallelism to the standard\nCMAKE_BUILD_PARALLEL_LEVEL env var so 'make wheel-cuXXX' configures and\nbuilds cleanly. 'make build' was unaffected (uses cmake --build directly).\n\n(cherry picked from commit 2fe1c2bfef64dd87ae8e2475f7f5457a42efa360)",
          "is_bot": false,
          "headline": "fix(build): wheel target passed --parallel to cmake configure",
          "author_name": "flaviusburca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-02T04:52:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cfd60620fa81d7b03c5bc6ea4f5e347d6bf8873f",
          "body": "(cherry picked from commit f1a62366b5db0a2e2e7ce71d81276a7c79f73faf)",
          "is_bot": false,
          "headline": "fix: thinking mode tokenization",
          "author_name": "flaviusburca",
          "author_login": "flaviusburca",
          "committed_at": "2026-07-02T04:52:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e650444ef94d05a19ef5a96500f1f5a15252983f",
          "body": "libdw — used by the backward stack-trace printer (capture_stacktrace/\nprint_stacktrace) and our dwfl resolver — blocks on network fetches from\nDEBUGINFOD_URLS while resolving each frame. On a slow/unreachable server this\nturns *any* C++ exception's stack-trace capture into a multi-minute hang\n(~1s p\n[…]\ns at module import,\nbefore any trace) so traces resolve from local symbols instantly. Opt back in\nwith SUROGATE_KEEP_DEBUGINFOD=1.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(crash-handler): disable debuginfod to stop multi-minute trace hangs",
          "author_name": "flaviusburca",
          "author_login": "flaviusburca",
          "committed_at": "2026-06-29T09:42:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "15606ded45058b8542b7c35d8d4e607f88f2e50a",
          "body": "…erts)\n\nFirst model combining a shared expert with FP8; a chain of never-exercised-path\nbugs blocked training under recipe=fp8-hybrid.\n\n- weight load: Qwen3.6 ships experts pre-stacked & gate/up-fused\n  (experts.gate_up_proj [E,2M,C], experts.down_proj [E,C,M]); the mapping used\n  per-expert stack_e\n[…]\nmple: offload_residual=true so activation memory is depth-independent\n  (the 35B-A3B OOM'd on a late-layer backward saved-tensor).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(qwen3.5-moe): train under fp8-hybrid (shared expert + batched exp…",
          "author_name": "flaviusburca",
          "author_login": "flaviusburca",
          "committed_at": "2026-06-29T09:42:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2b21eb009510a850f8b9faf55ec1a68a328a6780",
          "body": "…phase0\n\nMerge pull request #55 from invergent-ai/main",
          "is_bot": false,
          "headline": "Merge pull request #56 from invergent-ai/feature/dispatch-pp-planner-…",
          "author_name": "Flavius Burca",
          "author_login": "flaviusburca",
          "committed_at": "2026-06-27T05:00:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ede38433c05a0865976876cd269c3c13a9c2a6f4",
          "body": "Merge pull request #54 from invergent-ai/feature/dispatch-pp-planner-…",
          "is_bot": false,
          "headline": "Merge pull request #55 from invergent-ai/main",
          "author_name": "Flavius Burca",
          "author_login": "flaviusburca",
          "committed_at": "2026-06-27T05:00:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a04e61e36791b170c61b5cacc7575cf3dd72f5d1",
          "body": "…phase0\n\nDispatch Pipeline Parallelism (dispatch-PP): train models too large for one GPU on PCIe-only boxes",
          "is_bot": false,
          "headline": "Merge pull request #54 from invergent-ai/feature/dispatch-pp-planner-…",
          "author_name": "Flavius Burca",
          "author_login": "flaviusburca",
          "committed_at": "2026-06-22T13:26:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7b1164c91785deb3c2afc402387172058b3c0e8e",
          "body": "New guide docs/guides/dispatch-pp.md documenting the model-parallel mode for training models whose\nbase weights do not fit on a single GPU, on PCIe-only boxes (no NVLink/P2P): round-robin stages,\nper-stage weight streaming from pinned CPU (offload_master), host-staged boundaries, the FP8 weight\nstre\n[…]\n-PP) Options\"\nsection to the config reference (parallelism / offload_master / recipe + the microbatch math and\nSUROGATE_DISPATCH_STAGE_BLOCKS).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add Dispatch Pipeline Parallelism (dispatch-PP) guide",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T13:23:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1c2d4d38b60feb9ee2b146087c628d0613d62638",
          "body": "…udaMalloc/cudaFree)\n\napply_named_inject cudaMalloc-ed a device buffer per injected boundary tensor and\nclear_inject_named cudaFree-d it, once per dispatch stage -> ~hundreds of cudaMalloc/cudaFree\nper step, each a device-wide sync that serialized the pipeline. Boundary tensors are all\n[B,T,H] bf16 \n[…]\n~3380 -> ~3270 ms (~3-4%), loss parity (4.72->3.57).\nFirst of the boundary-handoff optimizations; pinned host buffers + async overlap are next.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(dispatch-pp): pool the cross-stage inject buffers (no per-call c…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T11:42:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e1be37dbfa6641b11c7f94c43fffc5e08045f647",
          "body": "The cost-based planner (train/dispatch_pp: planner.py / profile.py / types.py) was never wired\ninto the live path -- _dispatch_pp_plan emits uniform aligned stages sized by\nSUROGATE_DISPATCH_STAGE_BLOCKS, and nothing imports the package except its own unit tests.\n\nMeasured whether wiring it would pa\n[…]\ntep) are untouched -- they exercise the C++ binding\ndirectly, not this package. (If a cost planner is ever wanted, it is recoverable from git.)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(dispatch-pp): remove the unused cost-based stage planner",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T11:00:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2de705cee56ec82c50c8ebeb4c81a64155547d75",
          "body": "min_stages / upper_threshold / vram_budget_gb / recompute_grain were inputs for the cost-based\nstage planner (train/dispatch_pp/planner.py), which is not wired: the live planner emits uniform\naligned stages sized by SUROGATE_DISPATCH_STAGE_BLOCKS. The validator only setdefaulted these\ninto a dict th\n[…]\nig) for\nwhen it is wired (roadmap). Verified: clean config trains with loss parity; a config still\ncarrying the sub-block warns and ignores it.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(dispatch-pp): drop the vestigial dispatch_pp sub-block params",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T10:42:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e51bf084061c405d0a0ba2fc516cf5cd2f1fcd76",
          "body": "…gradient_accumulation_steps)\n\nThe chunks env predated grad-accum folding: back when dispatch ignored GA, it was the only way\nto raise the microbatch count M. Now that GA folds in, chunks and GA are identical multipliers\n(M = gpus*chunks*GA), so keeping both is redundant and a footgun (setting both \n[…]\nGA only.\n\nVerified: 0.8B dispatch + fp8, GA=4 with the old env set -> warns, ignores the env, M = gpus*GA\n= 8 (unchanged training vs the fold).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(dispatch-pp): drop SUROGATE_DISPATCH_MICROBATCH_CHUNKS (use …",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T10:31:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6d61d9ff887a70f2de356f2b98a1416ddf91e462",
          "body": "…icrobatch count)\n\ndispatch-PP ignored gradient_accumulation_steps: the fused step ran M = gpus*chunks\nmicrobatches into one optimizer step and GA only mis-sized the epoch guard. Fold GA into the\nmicrobatch count for LoRA: M = gpus * SUROGATE_DISPATCH_MICROBATCH_CHUNKS * GA, all accumulated\ninto one\n[…]\nks*GA = 8, effective batch 8\";\ntrains smoothly (lower-variance loss/norm), tps up vs M=2 as the weight stream amortizes over\nmore microbatches.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): honor gradient_accumulation_steps (fold into the m…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T10:26:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f7a44508832984b20da5edfa9cc877ac3f22810b",
          "body": "The 27B dispatch-PP step is transfer-bound: each stage streams its frozen base weights from\npinned host over PCIe. Store + stream the frozen matmul block weights as FP8-E4M3 instead of\nBF16 -> half the bytes on the wire (and half the pin RAM), fed straight to the FP8 GEMM.\n\nHow:\n- At load (finalize_\n[…]\n8 noise.\n- 27B 4-GPU gated-delta LoRA: ~3.33s/step vs ~4.8s BF16 dispatch (~1.45x), loss parity\n  (4.72->3.57), sensible norms, no OOM, no NaN.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): FP8 weight streaming (half the PCIe bytes per stage)",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T10:05:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0faf63d365c1cd0ebb026375967a501549d151da",
          "body": "Lift the BF16-only guard for dispatch_pp to also accept recipe=fp8_hybrid (NVFP4 stays\ndeferred). With this, the streamed (still BF16) stage weights are quantized to FP8 on the\ndevice per call and fed to the FP8 GEMM -- FP8 compute, but the PCIe transfer is still BF16.\nThis is the foundation for FP8\n[…]\nmpute-bound shapes.\n\nVerified: 0.8B dispatch LoRA + fp8_hybrid runs with loss/norm parity vs the BF16 recipe\n(1.36/1.09/1.50/2.12, norm ~4-10).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): allow the fp8_hybrid recipe under dispatch-PP",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T08:18:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7f946cba915655ccf7ec3597d4146002882e6dd7",
          "body": "The multi-GPU dispatch backward skips reduce_loss (the DP all-reduce would deadlock waiting\non idle GPUs), so ValidTokenCount was never populated and both the displayed loss and the\noptimizer grad-norm fell back to total-token (B*T*GradAccumSteps*world_size, incl padding)\nnormalization. On padded da\n[…]\neference (~1.0-2.0 / ~5-10); 27B 4-GPU gated-delta LoRA converges (loss 4.7->3.6) with sensible\nnorms (~5-16), no OOM, no step-time regression.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(dispatch-pp): valid-token normalization for the loss + grad norm",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T08:03:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a1b06b581ce05a5d5023c863af16dc6d23e69603",
          "body": "This reverts commit 4b749c8fd89a1c133fa3800c20bdd04e009e463e.",
          "is_bot": false,
          "headline": "Revert \"feat(dispatch-pp): show the real grad norm in the loss display\"",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T07:43:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b749c8fd89a1c133fa3800c20bdd04e009e463e",
          "body": "The dispatch-PP step hardcoded norm=0.0 in the display, even though the optimizer already\ncomputes the gradient norm for clipping. Surface it: dispatch_pp_apply_optimizer now returns\nget_norm() (the same value the non-dispatch path shows), the multi-GPU trainer stashes it\n(mDispatchPpLastGradNorm) d\n[…]\ncolumn now reports real values (~1.5e3), loss parity unchanged.\nThe extra cost is one device->host read of an already-computed scalar per step.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): show the real grad norm in the loss display",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T07:36:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8654218149fd64f9c34eaf92b8609f72fae308ea",
          "body": "…uire (+ pool foundation)\n\nMigrate every get-or-create of a persistent saved tensor (make_persistent_tensor chokepoint\nused by ~12 ops, the executor SaveForBwd persist paths, mamba, moe_permute) to\nSavedTensorCache::acquire(). allocate_moe_saved now returns null-on-arena-miss so the cache\nowns the f\n[…]\nupts the backward), and the win is marginal on the\ntransfer-bound 27B anyway. Documented in reset_saved_cache + the design doc for future work.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(executor): route saved tensors through SavedTensorCache::acq…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T07:30:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "08680dce145cdcfa46a50981ad58096290a02d73",
          "body": "…FwdStack + SaveForBwd)\n\nrecompute:false sizes the per-layer activation arenas for the WHOLE model (FwdStack ~19GB,\nSaveForBwd ~16GB at seq 1024 on the 27B) -> OOM. But dispatch runs the backward one stage at\na time per GPU (sequential on a GPU; concurrent stages are on separate GPUs/arenas), so onl\n[…]\ncache, now\nSavedTensorCache) made dispatch-aware -- see 2026-06-22-dispatch-pp-recompute-false.md; the\nexample stays recompute:true until then.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): cyclic activation sectioning for recompute:false (…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T06:44:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1afe4cee3531f4e8eda91a33a4b4d6f27af1b8bd",
          "body": "…d tensors\n\nThe persistent saved-tensor buffers (gated-delta recurrent states, rope/qk-norm caches,\nMoE expert bookkeeping, and the SaveForBwd persist fallback) lived as three loose maps\n(mMoeSavedBuffers/Sizes/ArenaBacked) + a bump offset, mutated directly by ~18 call sites\neach with its own cudaMa\n[…]\n Qwen3.5-0.8B (recompute on/off) and Qwen3.6-27B (recompute\non), dispatch-PP. Sets up the recompute:false per-stage cache reset as a one-liner.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(executor): SavedTensorCache -- one owner for persistent save…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T06:43:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8988d574bcb505469dfa52c84bf307d945b21ccc",
          "body": "…> ~3x faster load\n\nStartup was ~130-156s because each of the N per-GPU weight managers pins its OWN copy of\nthe frozen base in host memory: N x cudaHostAlloc of the full 52GB model (~208GB pinned at\nN=4, serialized on the kernel page-lock path). The base is read-only (LoRA), so all GPUs\ncan DMA-str\n[…]\n\nhost RAM 208GB+ -> 93GB. Loss parity preserved (0.8B and 27B). Only active for\noffload_master + frozen base (LoRA); all other paths unchanged.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(dispatch-pp): share frozen base across GPUs + register-on-anon -…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-22T05:17:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e71dfcf012fb8ed1e95359bca23416143b6017c1",
          "body": "…ions fit)\n\nStop force-enabling recompute for dispatch-PP. With it off, each stage backward saves its\nactivations during the re-forward instead of recomputing per block -- ~30% faster on\nmodels that fit (verified on 0.8B LoRA, loss parity). It still OOMs the 27B today because\nthe phase-arena sizer s\n[…]\nloc pinning+zeroing the 52GB host region (CPU/kernel-bound,\ndisk idle then a 1.4GB/s burst), not the mapped flag. Left the allocator unchanged.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): allow recompute:false (honored where stage activat…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T22:36:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "91d04471058fb94ee2fbf25440f349a7844e4afd",
          "body": "…stream\n\nThe per-step weight stream is fixed (each small stage streams once and all microbatches\nreuse it), so running more microbatches per step amortizes that fixed cost over more\ntokens and keeps the cross-stage pipeline fuller (fewer bubbles) -- at no extra peak\nmemory, since microbatches run se\n[…]\n, seq 1024: chunks=1 -> 4096 tok / 5.3s = 773 tok/s;\nchunks=2 -> 8192 tok / 8.6s = 952 tok/s (~+23 percent). Loss parity preserved at chunks=1.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): microbatches-per-step knob to amortize the weight …",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T21:35:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9075e2c667fe831010eedee7b249ff266ef453b9",
          "body": "…oss-stage pipeline\n\nReplace the microbatch-diagonal wavefront with RoundPipe's actual schedule. Each layer\nrange is now a SMALL stage (~4 blocks, _dispatch_pp_plan: num_stages > gpus) dispatched\nround-robin to GPU s%N, where its weights are held resident across all M microbatches\n(enlarged streamin\n[…]\n on 4x32 GB -- 16 stages of 4 blocks, ~5 GB resident\nbase/GPU. The earlier '27B doesn't fit' was the big-stage (num_stages=gpus) bug, now gone.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): stage-level dispatch -- small resident stages + cr…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T21:13:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "576511e9a0638849df6cde44a1df18f16230cb37",
          "body": "…oundation)\n\nMake the streaming prefetch slot count a runtime value (mNumPrefetchBuffers, arrays ->\nvectors) instead of a fixed 2. Default stays 2 (per-block double-buffer, byte-identical);\ndispatch-PP raises it via env SUROGATE_DISPATCH_PREFETCH_BLOCKS so a whole small stage's\nblocks stay cached ac\n[…]\ns (stream a stage once/step, reuse for all M microbatches). Foundation for\nthe stage-level-dispatch rewrite; no behavior change at the default.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): configurable prefetch-slot count (stage-resident f…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T20:27:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3799c47c348f52b1f57b50de583952ab9ef29321",
          "body": "…vel rewrite plan\n\nUnder offload_master, embedding/lm_head masters previously stayed resident on the GPU\n(~13 GB for a large-vocab 27B), since offload_master only offloaded block weights. For\nLoRA the non-block base is FROZEN -- its master is read once to populate the bf16 work\ncopy, then never agai\n[…]\n correction:\nthe 27B fits on 4x32 GB (235B fits on one 24 GB 4090); my earlier 'doesn't fit' was a\nbig-stage (num_stages=gpus) bug, not a wall.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): offload frozen non-block masters (LoRA) + stage-le…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T20:17:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "deffd4cb314e50da34d5b8eb6cd208ae8e937821",
          "body": "…(~2.2x on 27B)\n\nReplace the sequential stage walk with a diagonal wavefront over (stage, microbatch)\ntasks, dispatched async (dispatch_async) with a per-wave barrier. Stage s runs on GPU\ns%N; in wave w, microbatch m runs stage s=w-m (forward) / the mirror (backward), so a\nwave's tasks land on disti\n[…]\ntage-resident weights every task re-streams its stage. Stage-resident weight\ngathering (next) removes that M-fold re-stream for the larger win.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): wavefront scheduler -- overlap stages across GPUs …",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T19:21:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b249fae3803da1732773dd0b419904891d9beaba",
          "body": "…ulated)\n\ndispatch_pp_train_step_multigpu now processes M microbatches per step: each stage runs\nall M microbatches before the next stage, re-forwarding each (stage, microbatch) from a\nper-microbatch input boundary and grad-accumulating across them (start_micro_step(m, M),\nGradAccumSteps=M for the o\n[…]\n\ngathering lands -- the next piece. The machinery (and the async primitive from fb3879be)\nare the foundation the wavefront scheduler builds on.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): microbatch machinery in the stage step (grad-accum…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T18:58:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fb3879be015128fcb90e67a853458833594212d6",
          "body": "…tion)\n\nAdd dispatch_async(work, gpu) / wait_gpu(gpu): launch work on one GPU without the\nglobal barrier of run_work, and wait per-GPU later. This is the foundation for the\npipelined stage scheduler, which must run different stages/microbatches on different\nGPUs concurrently (the current synchronous\n[…]\n yet (the primitive is not wired into the step). Verified the\nresident LoRA dispatch path is byte-identical (loss 0.3945/0.2835/0.5158/0.2920).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): async per-GPU dispatch primitive (scheduler founda…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T18:24:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b703b3dcf99282ad4f906a835e0d267d9914aa53",
          "body": "Run the round-robin stage scheduler with offload_master too, instead of falling back\nto the normal streaming loop. With offload_master the base weights live in pinned CPU\nand the force-linear stage execution streams each block to the GPU on demand\n(gather_block / release_block via handle_layer_start\n[…]\nsible to hold resident --\n4 stages over 64 layers, loss descending, adapter saved. Also unchanged: resident\n0.8B LoRA/FFT (offload_master off).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): per-stage weight streaming -- 27B LoRA on 32GB GPUs",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T17:32:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5dd28f6fbdb410b42ecb00bd7fb1d7d1c948b8ec",
          "body": "The dispatch step previously rejected LoRA (BF16 full-FT only). Wire it through:\n\n- forward_stage / backward_stage no longer reject LoRA; they call\n  ensure_lora_run_state and (backward) lora_grads().start_micro_step so the per-block\n  adapters train on this GPU. The cross-GPU grad reduce stays skip\n[…]\n2 GPU) trains to completion at\nseq 512 and seq 2048, ~20x faster per step than FFT (only the small adapters are\ncollected/optimized/broadcast).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): LoRA support in the resident stage scheduler",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T17:15:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e68c6e29c7467f403b92a0bae743fc39e1f3306d",
          "body": "…leak)\n\nThe dispatch sub-range forwards/backwards run with skip_finalize so boundary tensors\nand saves survive the cross-GPU reads, but that leaves them resident on the\nbump-allocated compute stack. Nothing reset the stack between steps, so saves piled up\nstep over step (observed: ~1947 live allocat\n[…]\n\nVerified: surogate sft on Qwen3.5-0.8B (2 GPU) now runs 30 steps at seq 512 (FFT and\nLoRA) and 15 steps at seq 2048 without the stack growing.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(dispatch-pp): reset the compute stack each step (stop cross-step …",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T17:15:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4c2a6b1320128bfd8c567540574750e4173f7904",
          "body": "Two bugs made multi-stage dispatch converge worse than single-stage and, worse,\nnon-deterministically (same seed/data -> final loss varied 0.65..3.9 run to run):\n\n1. offload_residual raced the cross-stage forward handoff. The pipelined forward\n   reads block hi's residual by name to hand it to the n\n[…]\n the 64-token overfit, vs 0.77 before) and is deterministic across runs.\nsurogate sft on Qwen3.5-0.8B trains to completion at seq 512 and 2048.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(dispatch-pp): correct + deterministic multi-stage convergence",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T16:17:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "348fb8c74fca6694905e35ae87711ef1bccbac4a",
          "body": "… stage)\n\nThe dispatch step previously re-ran a WHOLE forward per stage to provide the\nbackward's activations, holding every block's saved input on the compute stack on\ntop of the per-block gated-delta backward temps -- which overflowed the stack at\nlonger sequence lengths (cannot save / std::bad_al\n[…]\nns to\ncompletion at seq 512 (both packing modes) AND seq 2048 -- previously OOMed at\nseq 512. Single-stage memory now scales to long sequences.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): pipelined per-stage forward (memory bounded to one…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T16:05:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e9b591804f8d871f9cbae3dcedc999e699a712e6",
          "body": "…-end)\n\nrun_training_loop now routes parallelism=dispatch_pp (weights resident) through\ndispatch_pp_train_step_multigpu: builds a contiguous block->stage partition over the\nGPU pool, loads one micro-batch, and runs the round-robin fused step. With\noffload_master set (large models that can't fit resi\n[…]\nerflows the compute\nstack in the gated-delta backward (whole-forward-per-stage design) -- next: pipelined\nforward + per-stage weight streaming.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): wire the stage scheduler into surogate sft (end-to…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T15:19:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b40893a6292adcd9a5eef838a4c2e73f3ac03178",
          "body": "After weight streaming fixed the weight OOM, the next OOM was the save-for-backward\nactivation arena (per-layer residuals across all blocks). Dispatch-PP now forces\nrecompute + offload_residual so activation memory is independent of network depth\n(design 1.1) -- both weights and activations are bounded, so deep models (e.g.\nQwen3.6-27B / 64 layers) fit. LoRA keeps grads/optimizer on-GPU; FFT also offloads grads.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(dispatch-pp): bound activation memory (recompute + offload_residual)",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T14:15:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ca369d3d1287e4b2dd87289f401ee592f4a405ea",
          "body": "…s load\n\nparallelism=dispatch_pp validated the config but never enabled the offload path it is\nbuilt on, so import_weights loaded every weight onto the GPU and OOM'd on any model big\nenough to need dispatch-PP (e.g. Qwen3.6-27B: 30 GB of weights resident). Mirror\ncpu_training's mapping: set offload_master (weights stream from pinned CPU per block)\nand, for full fine-tune, offload_grads. LoRA keeps its small grads/optimizer on-GPU.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(dispatch-pp): enable CPU-resident weight streaming so large model…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T13:59:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6e1f0bb40356186bd110b544ceeb1e54a256941e",
          "body": null,
          "is_bot": false,
          "headline": "fix banner",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T13:57:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0f1b56240dd86063d0b15a20be9cb2f4cac2b957",
          "body": "dispatch_pp_train_step_multigpu(..., stale=True) defers each step's optimizer update\nby one: this step's grads are collected and stashed while the *previous* step's grads\nare applied, so every step trains on weights one update behind -- the RoundPipe v1\nstaleness. dispatch_pp_flush_pending applies t\n[…]\ned update with compute needs the CPU-master + streaming\nintegration (documented). Test: test_phase3_train_step_multigpu.py::...stale_converges.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): one-step-stale optimizer mode for the multi-GPU step",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T13:57:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "682d1194de028e51b06db02573cf89b1f6977123",
          "body": "The -pp example was a plain LoRA config missing the parallelism setting. Add\nparallelism: dispatch_pp + the dispatch_pp planner block (min_stages, upper_threshold,\nvram_budget_gb, recompute_grain) with explanatory comments. Validates through\nSFTConfig._validate_dispatch_pp_config (bf16+LoRA, CUDA graphs auto-disabled).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(dispatch-pp): make qwen36 pp example actually use dispatch-PP",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T13:42:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1de5051b1d2880b442881ca547de39aa0694e97b",
          "body": "…n hooks\n\nThese executor controls (op-range / layer-range selection, named cross-GPU inject,\npreserve-layer, skip-grad-reduce, stage-base restore, grad-norm / hidden readback)\nstarted as Phase-0 parity instrumentation but are now the load-bearing dispatch-PP\nexecution mechanism -- so the debug_/mDbg\n[…]\nose debug hooks (set_debug_dump_fn, debug_print_backward,\ndebug_tensors, mDebugDump*). No behavior change; full suite green (50 + 7 multi-GPU).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(dispatch-pp): drop debug_/mDbg from the dispatch-PP executio…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T13:37:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b16e6be01f5869cf8cec181563d0c26f53b7ae2a",
          "body": "Route the backward's trailing embedding op (layer<0, after all blocks) to the lowest\nstage and the leading loss/lm-head ops to the loss-owning stage, by op-index position\nrelative to the block-op span. Grad collection routes embedding from the lowest stage\nand lm_head/final_norm from the loss stage, so every parameter now trains (previously\nthe embedding was frozen). 2-GPU convergence unchanged (17.99 -> ... -> 0.95).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): unfreeze embedding in the multi-GPU dispatch step",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T13:28:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "483ced29c314127e1974fd228697fa1218717f58",
          "body": "…p debug from names\n\nMulti-GPU fused step (dispatch_pp_train_step_multigpu): backward dispatch round-robin\nacross the pool (stages on different GPUs, boundary grads handed GPU->host->GPU) ->\ncollect every stage's grads onto the master GPU by name -> optimizer there ->\nbroadcast updated weights to ev\n[…]\n-PP entry points, not throwaway debug probes.\n\nTests: test_phase3_train_step_multigpu (2-GPU convergence); full suite green\n(50 + 7 multi-GPU).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): multi-GPU fused training step that converges + dro…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T13:18:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "528b21ea12310d65e2db450d1362b70180f3a864",
          "body": "…rges\n\ndispatch_pp_debug_train_step chains the sub-range executor's forward (loss) ->\nbackward (grad store) -> optimizer update into one real training step. Repeated on a\nfixed batch it drives the loss down monotonically (19.19 -> ... -> 1.03 over 15 steps)\nand matches the stream-driven trainer step\n[…]\nsize==1 keeps reduce_loss (populates ValidTokenCount for get_loss)\na safe local no-op. Test: tests/train/dispatch_pp/test_phase3_train_step.py.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): fused single-GPU dispatch training step that conve…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T12:48:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e0019c0308071c868268e12dcc336e2a72dabee4",
          "body": "…+ AsyncStaleAdamW)\n\nAsyncOptimizer is a worker thread draining a depth-1 queue of update closures:\nsubmit(u_N) fences on u_{N-1} completing, enqueues u_N, and returns immediately --\nso u_N overlaps the caller and at most one update is ever in flight, which is exactly\nthe one-step staleness RoundPip\n[…]\n\nRemaining: wire the worker into a fused multi-GPU dispatch step() (per-layer\nparam/grad release) + the converges-on-a-real-run staleness test.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): async 1-step-stale optimizer core (AsyncOptimizer …",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T12:26:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cabf2040c9bbbbb81d551f3ce31b46cb4ce8ce8c",
          "body": "…g test\n\nExpose DslWeightManager::gpu_prefetch_buffer_bytes / prefetch_slot_count and the\nMultiGPUPyTrainer::dispatch_pp_debug_weight_residency snapshot (total device-resident\nweight bytes, streaming block double-buffer footprint, slot count).\n\nQuantitatively pins the dispatch-PP memory invariant: w\n[…]\nger) report no slots. Test: tests/train/dispatch_pp/\ntest_phase2_memory.py (resident => 0 slots; streaming => slot_count blocks, < NUM_LAYERS).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): GPU weight-residency introspection + memory-scalin…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T12:13:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d729f18645adba78403d9102bb35498cf9826c2b",
          "body": "…rad handoff\n\nBackward stages run in reverse order (loss-owning stage first), one GPU per stage\non the full batch, handing boundary gradients GPU->host->GPU with no NCCL.\n\nStage ops are selected by their owning block layer [lo..hi], not an op-index range:\nboundary view ops (d_blocks[L].mlp_down -> .\n[…]\ng), and\nreduce_loss_on_completion on the request. The debug forward/backward also force the\neager (non-stream-driven) path for the same reason.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): multi-GPU backward dispatch parity via cross-GPU g…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T12:01:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "df83a9130eecff5cd2a80364ad1a9bc99720fb42",
          "body": "…ry handoff\n\nComplete the cross-GPU activation handoff: the fused-residual block carries two\ntensors across a stage boundary -- blocks[hi].res_att (residual after attention)\nand blocks[hi].mlp_down (x). Read both by name on the sending GPU (kept live by a\npreserve-last-block hook) and bind them by n\n[…]\nnce for 2-stage and round-robin-wrap; parity test no longer xfail.\n\nRemoves the superseded get_residual/BlockHOut inject hooks (wrong buffers).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): multi-GPU forward dispatch parity via named bounda…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T10:56:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b307f0cf6bd44e3edaad6c6faeac740b5f993406",
          "body": "…erve hook)\n\nAdd set_debug_preserve_layer to keep a stage's last block's stack live past its\nlayer-end, so the carried x (prev block's MLP output, BlockMLPDown) survives for\nthe cross-GPU boundary read; align the x read/inject to the BlockHOut->MLPDown->\nResidualAtt fallback chain. Residual accumula\n[…]\nvia a StackedBlocks\ncarried tid not materialized on a fresh executor, so full parity stays xfail with\nthe precise remaining blocker documented.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): sender-side x capture for multi-GPU boundary (pres…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T10:29:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7bc5b705287930347cdf478be616f9224409ec6c",
          "body": "…andoff)\n\nAdd the C++ runtime that dispatches contiguous block stages round-robin across the\nstateless GPU pool (stage i -> GPU i%ngpu) via run_work, handing the boundary state\nGPU->host->GPU: MultiGPUPyTrainer::dispatch_pp_debug_forward_hidden_multigpu, plus\nCompiledExecutor residual/block-output i\n[…]\nous block's output) is a transient slot not resident on a fresh executor,\nso it needs a boundary-materialization hook. Test gated on free GPUs.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): multi-GPU round-robin forward dispatch (residual h…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T10:16:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9c994978ecf6287df4f4fcc7bbfd77a93b405af7",
          "body": "…model)\n\nDerive real BlockProfiles from a checkpoint: per-block work-weight bytes from the\nsafetensors header, activation working-set from model dims + runtime shape,\nsize-proportional fwd/bwd times. plan_for_model() produces a NUMA-placed StagePlan\nwith operating-envelope warnings; resolve_vram_budget_bytes() handles the\nvram_budget_gb/auto resolution. Validated end-to-end vs Qwen3-0.6B (28 blocks).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): planner->model integration (profile.py + plan_for_…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T09:43:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "808e1eba0cd27992782d8536c06183f5e40943c1",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(dispatch-pp): record Phase-1 single-GPU streaming verdict (PASS)",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T09:37:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d4fa7156e7550bba68cdfdad85dfad58e757e9fa",
          "body": "Weights streamed per block from pinned CPU (offload_master) produce bit-identical\nforward hidden states and per-block grad norms vs resident, through the dispatch-PP\nexecutor path. Reuses the existing DslWeightManager gather/release machinery; no new\nC++. Authors the Phase-1 plan.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): Phase-1 single-GPU weight-streaming parity test",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T09:34:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2ae819730df4098141cf6747041b4ff5b62502eb",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(dispatch-pp): record Phase-0 sub-range feasibility verdict (PASS)",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T09:24:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5a0b0ec5b7f460dc7ab68c664fff67d1a1f59820",
          "body": "… gate\n\nAdd debug-only bounded op-range execution to the compiled executor (guarded,\ndefault-off) and GraphExecutor/DslModel/MultiGPUPyTrainer debug entry points.\nForward: two contiguous block sub-ranges share one executor state with the\nboundary residual round-tripped through host memory, matching \n[…]\nthe bounded forced-eager executor matches whole-graph per-block\ngrad norms (rtol 2e-2). Validated on Qwen3-0.6B/4-layer single GPU. Gate: PASS.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): Phase-0 GraphExecutor sub-range execution + parity…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T09:23:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7b77a39e57a922f6feb4dbde2dccf64dce73b1f1",
          "body": "Decision gate passes: transformer-block boundaries are cleanly separable;\nops[layer_start_indices[i], layer_end_indices[j]) is a contiguous sub-graph with\nonly the residual hidden state crossing boundaries. Documents the bounded\nop-range execution design for the sub-range parity spike.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): Phase-0 Step-1 findings header (gate verdict: PASS)",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T08:42:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b73151f6652cd284e5d2f277ae734fae98a23b26",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): add parallelism=dispatch_pp config + v1 validations",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T08:23:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "18af1197bf36f2f321968219e86212a0b6ed799d",
          "body": "…ation\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): NUMA placement assignment + LoRA needs_grad propag…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T08:16:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3f1e8f5d303920d89d29daa3fe34e96efbe4f209",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): PCIe token-threshold operating-envelope warning",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T08:15:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "045cd951737e2e906dd632e74e8670a902718818",
          "body": "…M ceiling\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): warn when a single block exceeds the per-stage VRA…",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T08:14:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d04dc5fa517eee7c0e052665ddb6bfc919f2123c",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): cost-search plan assembly (fwd/fused-tail/bwd)",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T08:13:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "01b37b48e8e97c2cd01d2361b683aba80d5ec602",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): candidate stage-budget enumeration",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T08:11:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "be5077b9c7764d711803923eade0f8470d719240",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): greedy stage packing under workload+memory ceilings",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T08:09:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6dca81906a5146b7ab3688967e269312bdfb5320",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dispatch-pp): scaffold planner package + StagePlan data types",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T08:06:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4ffa8d6f108986813b6b939e228b2207d7d11595",
          "body": null,
          "is_bot": false,
          "headline": "remove obsolete docs",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T07:47:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "40185a63ab03c41287acde5c8181a6b29b97f6c3",
          "body": null,
          "is_bot": false,
          "headline": "nccl download link",
          "author_name": "flaviusburca",
          "author_login": null,
          "committed_at": "2026-06-21T07:13:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "253a3e9da362b80cb7ded596f63fe5effe91c179",
          "body": "Feature/watch ink",
          "is_bot": false,
          "headline": "Merge pull request #53 from invergent-ai/feature/watch-ink",
          "author_name": "Madalin Tatarciuc",
          "author_login": "madalintat",
          "committed_at": "2026-06-20T21:14:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "054eb9a73b9dd9e2ef07f8a07bfb9cb41e236057",
          "body": "Review fixes:\n- dstack: refuse to overwrite an existing config we can't parse, or one whose\n  projects/backends aren't lists, instead of silently discarding it (.bak kept).\n- ssh: validate the tmux session name charset before interpolating it into the\n  remote kill command.\n\nSimplify:\n- credsBackend builds the backend object directly and lets yaml handle quoting\n  and block scalars, removing the credsYaml string-build + parse round-trip and\n  the block()/q() helpers.",
          "is_bot": false,
          "headline": "fix(jackalope): dstack config safety + build backend objects directly",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-17T14:35:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f9f64774e4d5c71674333598f4b7754828c0bdee",
          "body": "Parse ~/.dstack/server/config.yml and merge the chosen backend into the\n'main' project (replacing a same-type backend, preserving other backends\nand projects) rather than replacing the whole file. Adds the 'yaml' dep;\nkeeps the one-time .bak of the original as a safety net.",
          "is_bot": false,
          "headline": "fix(jackalope): merge into dstack config instead of overwriting it",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-17T14:25:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d75f0cf8f9ff77b138f0ec26b951c0eaf16075dc",
          "body": "…etch catch, dstack backup safety, output_dir trailing slash, unicode escapes, gitignore",
          "is_bot": false,
          "headline": "fix(jackalope): address PR review — non-blocking SSH stop, artifact-f…",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-17T14:21:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "93cef5830a843119dea5b1f883bbb546ad85c441",
          "body": "…intercept + startup banner)",
          "is_bot": false,
          "headline": "Merge origin/main into feature/watch-ink (resolve main.py: jackalope …",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-17T14:16:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bfa934370072a2efcd53959b69e6a23180d3dec0",
          "body": "…F auth, binary CI\n\nRename the dashboard jackrabbit -> jackalope across the package, the\n`surogate jackalope` subcommand, Dockerfiles, and install.sh.\n\nCloud launch:\n- Modal: stream the trainer log back (failures were silent), terminate the\n  sandbox by persisted id, clear the image ENTRYPOINT, fix \n[…]\n  in-UI ^T token entry; per-row detail is shallow, deep arch resolve on pick.\n\nMonitor: drop the right insights rail (content is full-width).\nDistribution: standalone per-OS Bun binary build workflow.",
          "is_bot": false,
          "headline": "feat(jackalope): rename from jackrabbit + cloud launch, GRPO/RULER, H…",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-17T14:11:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fa30fb64ea12ee6cee80db7e90f89674afd73350",
          "body": "Add gold rabbit ASCII banner to CLI startup",
          "is_bot": false,
          "headline": "Merge pull request #52 from invergent-ai/feature/startup-banner",
          "author_name": "Flavius Burca",
          "author_login": "flaviusburca",
          "committed_at": "2026-06-16T16:09:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "93d52b7a2977a932146c9ff0f6dd961e41ff3afa",
          "body": "Launch mode now offers SFT / GRPO / RULER. RULER adds a 4th step (judge\nGPUs, disjoint from trainer + vLLM) and runs\n  surogate grpo --train/--infer/--orch examples/ruler/*     --trainer-gpus … --vllm-gpus … --judge-infer examples/ruler/judge.yaml --judge-gpus …\nbuildGrpoCommand/spawnGrpo/grpoConfigsExist now handle the optional judge.\nVerified end-to-end from the UI for SFT, GRPO, and RULER; 43 tests pass.",
          "is_bot": false,
          "headline": "feat(jackrabbit): RULER launch mode (GRPO + LLM judge, 3-way GPU split)",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-15T16:28:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9bf7b1420a3d19ec874efce069968f814660aab2",
          "body": "- Models / Datasets nav pages: search-as-you-type over the HF Hub API\n  (debounced + AbortController), results with downloads/likes, and a model\n  detail pane showing \"✓ trainable by surogate\" (matched via supported.ts),\n  architecture, ~params, applicable recipes, and gated flag.\n- Pick a model → j\n[…]\nrt/stop are now non-blocking so a missing feed file\n  (before any run writes it) shows a waiting state instead of crashing.\n\nTests: 40 pass (HF client, supported matrix, feed, + Browse render driver).",
          "is_bot": false,
          "headline": "feat(jackrabbit): HuggingFace model/dataset browser + trainable badge",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-15T16:19:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ce56fd14afe44f097c297d28599a1774f6831bea",
          "body": null,
          "is_bot": false,
          "headline": "chore(jackrabbit): update lockfile (sixel dep)",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-15T14:21:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b71fa6e9856e12ac49307c7bf183241d5bc88c0",
          "body": "- supported.ts: surogate's 14 trainable model families (llama, qwen3,\n  qwen3_moe, qwen3_5*, qwen3_vl, gemma4*, gpt_oss, lfm2, nemotron_h) with\n  MoE/vision flags + applicable recipes. checkTrainable() matches a model's\n  architectures/model_type like vLLM does.\n- hf.ts: HuggingFace Hub API client v\n[…]\ndelDetail (expand config+safetensors;\n  param count without weight download); HF_TOKEN auth; 429-aware.\n- Tests: 38 pass; verified live against the real HF API (Qwen3 trainable,\n  Mixtral not).\n\nEOF\n)",
          "is_bot": false,
          "headline": "feat(jackrabbit): HF search client + surogate trainability matrix",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-15T14:19:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b4cdc2c81551ebdd5c9e63e4bca1767935bdb04a",
          "body": "- Pause/resume: z suspends (SIGSTOP) / resumes (SIGCONT) the current\n  launched run's process group; top bar shows ⏸ suspended; footer hint\n  toggles suspend/resume. controls.ts: signalRun/pauseRun/resumeRun.\n  (Best-effort — freezing multi-GPU jobs can upset NCCL; noted.)\n- Flicker-safe: sync-outpu\n[…]\no inline Kitty/Sixel images present\n  atomically (no tearing). Auto-on for TTYs; --no-sync to disable.\n  Unsupported terminals ignore the private mode safely.\n\nBuild + 31 tests green; typecheck clean.",
          "is_bot": false,
          "headline": "feat(jackrabbit): pause/resume runs + flicker-safe synchronized output",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-15T14:15:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0b51108bf546df454b76da9e43cefa619de83d81",
          "body": "Four capability additions beyond monitor+launch:\n\n- Control: launched runs write a <feed>.pid sidecar; press x (two-press\n  confirm) to SIGTERM the run's process group from Monitor/Runs. controls.ts\n  reads/probes/stops; footer shows the hint only when controllable.\n- Compare: pin a second run on th\n[…]\ned (fires once\n  per run) → terminal bell + on-screen banner + best-effort desktop notify\n  (notify-send/osascript, error-safe).\n\nTests: 31 pass (alerts, controls, + prior); typecheck clean; build ok.",
          "is_bot": false,
          "headline": "feat(jackrabbit): control runs, compare, Sixel, alerts",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-15T14:06:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4db8ba5f18c9b7ffa719423189cdc32083e9150e",
          "body": "- src/tips.ts: 72 tips distilled from the surogate guides (precision/\n  recipes, qlora, offloading, memory, optimizers, performance, moe,\n  rl/grpo, long-context, multi-gpu, metrics), each context-tagged.\n- insights.ts: activeTags(state) derives live context (recipe, lora,\n  qlora, moe, grpo, hot/lo\n[…]\nd ROTATES over time → live feed.\n- Splash tips now pull grounded general tips (rotated per launch); removed\n  the terminal-specific tip.\n- Tests: 25 pass (tag filter + rotation + nvfp4/moe relevance).",
          "is_bot": false,
          "headline": "feat(jackrabbit): real-time grounded tips feed (surogate docs)",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-15T13:53:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "068d5d04b6693cf99a19646ecd0405db4c617657",
          "body": null,
          "is_bot": false,
          "headline": "fix(jackrabbit): rename non-TTY guard message",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-15T13:45:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "95ae643e208637b4d34711a15e426e7c91ddfafc",
          "body": "The dashboard is now `jackrabbit` (leans into the gold-rabbit brand):\n- package name + bin → jackrabbit (run: `jackrabbit`)\n- splash subtitle, CLI help, README updated\n- dir surogate-watch/ → jackrabbit/\n\nBuild + 23 tests green.",
          "is_bot": false,
          "headline": "feat(jackrabbit): rename package/command to jackrabbit 🐇",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-15T13:44:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38d13a189f2f3c3fb203496aaaf0d4c640479136",
          "body": "Fixes the multi-training collision and adds RL + smarter GPU choice:\n\n- Run isolation: every launched run writes its OWN feed under\n  ~/.surogate-watch/runs/<ts>-<label>.jsonl (no more interleaving into\n  one file). App owns the feed and switches/resets state when you launch\n  or pick another run. N\n[…]\n + fits/tight/risk hints help\n  co-locate a run on a GPU that still has room.\n- Tests: 23 pass; edge-case driver verifies multi-run switching resets\n  state, Runs listing, GRPO mode + estimate render.",
          "is_bot": false,
          "headline": "feat(watch-ink): run isolation, Runs picker, GRPO mode, GPU headroom",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-15T13:38:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "63b48680f3c75e66313b68111732ed1b1682a6a8",
          "body": "- Brand: Surogate gold palette (#ffd15c→#e4961c) across UI + chart\n  (gold loss line/area, blue eval diamonds, warm-dark bg).\n- Splash/menu: full leaping-rabbit mascot + SUROGATE wordmark in gold,\n  detected GPUs (nvidia-smi), tips, feed status, \"press ⏎ to open\".\n  Mascot shows ONLY on the launch s\n[…]\napped.\n- Chart sharpness: render at panel aspect with 2× supersample and\n  resolution-scaled line/markers/fonts (fixes pixelation).\n- Tests: 17 pass (+ splash→dashboard transition), --test-force-exit.",
          "is_bot": false,
          "headline": "feat(watch-ink): gold brand, rabbit splash menu, nav fix, sharper chart",
          "author_name": "MadalinTat",
          "author_login": "madalintat",
          "committed_at": "2026-06-15T13:26:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 47,
      "commits_last_year": 1303,
      "latest_release_at": "2026-07-21T08:55:53Z",
      "latest_release_tag": "v1.2.8",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 26,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 9.3
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 50,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "jackalope",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": null,
          "registry_url": "https://www.npmjs.com/package/jackalope",
          "is_deprecated": false,
          "latest_version": null,
          "repository_url": null,
          "versions_count": 0,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 0,
          "first_published_at": "2013-02-25T21:10:09.793000Z",
          "latest_published_at": null,
          "latest_version_yanked": null,
          "days_since_latest_publish": null
        }
      ]
    },
    "popularity": {
      "forks": 6,
      "stars": 806,
      "watchers": 3,
      "fork_history": {
        "days": [
          {
            "date": "2026-01-15",
            "count": 1
          },
          {
            "date": "2026-01-16",
            "count": 1
          },
          {
            "date": "2026-03-09",
            "count": 1
          },
          {
            "date": "2026-04-26",
            "count": 1
          },
          {
            "date": "2026-06-04",
            "count": 1
          },
          {
            "date": "2026-07-08",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 6,
        "total_forks": 6
      },
      "star_history": {
        "days": [
          {
            "date": "2026-01-06",
            "count": 7
          },
          {
            "date": "2026-01-07",
            "count": 1
          },
          {
            "date": "2026-01-14",
            "count": 7
          },
          {
            "date": "2026-01-15",
            "count": 1
          },
          {
            "date": "2026-01-16",
            "count": 1
          },
          {
            "date": "2026-01-19",
            "count": 1
          },
          {
            "date": "2026-01-20",
            "count": 1
          },
          {
            "date": "2026-02-02",
            "count": 4
          },
          {
            "date": "2026-02-03",
            "count": 4
          },
          {
            "date": "2026-02-04",
            "count": 2
          },
          {
            "date": "2026-02-05",
            "count": 3
          },
          {
            "date": "2026-02-06",
            "count": 7
          },
          {
            "date": "2026-02-08",
            "count": 1
          },
          {
            "date": "2026-02-09",
            "count": 1
          },
          {
            "date": "2026-02-15",
            "count": 1
          },
          {
            "date": "2026-02-16",
            "count": 13
          },
          {
            "date": "2026-02-17",
            "count": 9
          },
          {
            "date": "2026-02-18",
            "count": 9
          },
          {
            "date": "2026-02-19",
            "count": 15
          },
          {
            "date": "2026-02-20",
            "count": 2
          },
          {
            "date": "2026-02-21",
            "count": 1
          },
          {
            "date": "2026-02-22",
            "count": 1
          },
          {
            "date": "2026-02-23",
            "count": 1
          },
          {
            "date": "2026-02-24",
            "count": 3
          },
          {
            "date": "2026-02-25",
            "count": 2
          },
          {
            "date": "2026-02-27",
            "count": 2
          },
          {
            "date": "2026-03-02",
            "count": 1
          },
          {
            "date": "2026-03-04",
            "count": 2
          },
          {
            "date": "2026-03-05",
            "count": 3
          },
          {
            "date": "2026-03-06",
            "count": 1
          },
          {
            "date": "2026-03-08",
            "count": 1
          },
          {
            "date": "2026-03-15",
            "count": 1
          },
          {
            "date": "2026-03-23",
            "count": 2
          },
          {
            "date": "2026-03-24",
            "count": 18
          },
          {
            "date": "2026-03-25",
            "count": 10
          },
          {
            "date": "2026-03-26",
            "count": 9
          },
          {
            "date": "2026-03-27",
            "count": 1
          },
          {
            "date": "2026-03-29",
            "count": 1
          },
          {
            "date": "2026-03-31",
            "count": 3
          },
          {
            "date": "2026-04-01",
            "count": 2
          },
          {
            "date": "2026-04-04",
            "count": 5
          },
          {
            "date": "2026-04-07",
            "count": 1
          },
          {
            "date": "2026-04-10",
            "count": 1
          },
          {
            "date": "2026-04-11",
            "count": 1
          },
          {
            "date": "2026-04-19",
            "count": 1
          },
          {
            "date": "2026-04-21",
            "count": 2
          },
          {
            "date": "2026-04-28",
            "count": 1
          },
          {
            "date": "2026-05-07",
            "count": 1
          },
          {
            "date": "2026-05-14",
            "count": 2
          },
          {
            "date": "2026-05-21",
            "count": 1
          },
          {
            "date": "2026-06-01",
            "count": 1
          },
          {
            "date": "2026-06-03",
            "count": 295
          },
          {
            "date": "2026-06-04",
            "count": 322
          },
          {
            "date": "2026-06-19",
            "count": 3
          },
          {
            "date": "2026-06-20",
            "count": 1
          },
          {
            "date": "2026-06-21",
            "count": 3
          },
          {
            "date": "2026-06-22",
            "count": 1
          },
          {
            "date": "2026-06-25",
            "count": 1
          },
          {
            "date": "2026-07-02",
            "count": 1
          },
          {
            "date": "2026-07-06",
            "count": 1
          },
          {
            "date": "2026-07-07",
            "count": 2
          },
          {
            "date": "2026-07-08",
            "count": 1
          },
          {
            "date": "2026-07-18",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 804,
        "total_stars": 806
      },
      "open_issues_and_prs": 6
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples",
        "recipes"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "jackalope/tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 324304,
      "source_files_sampled": 723,
      "oversized_source_files": 34,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "jackalope/package.json",
        "pyproject.toml"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm",
        "pypi"
      ],
      "dependencies": [
        {
          "name": "@inkjs/ui",
          "manifest": "jackalope/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.0.0"
        },
        {
          "name": "@logdna/tail-file",
          "manifest": "jackalope/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.2"
        },
        {
          "name": "@resvg/resvg-js",
          "manifest": "jackalope/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.6.2"
        },
        {
          "name": "echarts",
          "manifest": "jackalope/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.1.0"
        },
        {
          "name": "ink",
          "manifest": "jackalope/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.0.6"
        },
        {
          "name": "react",
          "manifest": "jackalope/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.2.0"
        },
        {
          "name": "sixel",
          "manifest": "jackalope/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.16.0"
        },
        {
          "name": "terminal-image",
          "manifest": "jackalope/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.3.0"
        },
        {
          "name": "yaml",
          "manifest": "jackalope/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.9.0"
        },
        {
          "name": "transformers",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=5.5.0"
        },
        {
          "name": "huggingface-hub",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.4.1"
        },
        {
          "name": "hf-transfer",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.1.9"
        },
        {
          "name": "datasets",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=4.3.0"
        },
        {
          "name": "addict",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "peft",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "json_repair",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "unique-namer",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "nanobind",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "binpacking",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "rich",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=13.0.0"
        },
        {
          "name": "psutil",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "matplotlib",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "qwen-vl-utils",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "==0.0.14"
        },
        {
          "name": "ray",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.5.0"
        },
        {
          "name": "verifiers",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "==0.1.11"
        },
        {
          "name": "wandb",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "==0.25.1"
        },
        {
          "name": "jaxtyping",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "aiolimiter",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "openai",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "==2.32.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": 31,
        "open_issues": 6,
        "closed_ratio": 0.778,
        "closed_issues": 21,
        "closed_unmerged_prs": 3
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "flaviusburca",
          "commits": 1214,
          "avatar_url": "https://avatars.githubusercontent.com/u/30172978?v=4"
        },
        {
          "type": "User",
          "login": "madalintat",
          "commits": 23,
          "avatar_url": "https://avatars.githubusercontent.com/u/73785144?v=4"
        },
        {
          "type": "User",
          "login": "1danchirila",
          "commits": 9,
          "avatar_url": "https://avatars.githubusercontent.com/u/33685954?v=4"
        }
      ],
      "contributors_sampled": 3,
      "top_contributor_share": 0.974
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "build.yml",
        "docker.yml",
        "jackalope.yml",
        "wheel.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": true
    },
    "security_signals": {
      "lockfiles": [
        "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": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 0,
            "reason": "0 out of 8 merged PRs checked by a CI test -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 1/11 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 3 contributing companies or organizations -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 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": 9,
            "reason": "1 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "d1bfe628b488cefad5d8328873db2f50110363d4",
        "ran_at": "2026-07-21T15:50:07Z",
        "aggregate_score": 4,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/invergent-ai/surogate",
    "host": "github.com",
    "name": "surogate",
    "owner": "invergent-ai"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 60,
      "inputs": {
        "security": 40,
        "vitality": 85,
        "community": 31,
        "governance": 52,
        "engineering": 84
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 85,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "commits_last_year": 1303,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 26
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "26/52 weeks with commits",
                "points": 18,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 26
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "1303 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 1303
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 47,
              "latest_release_tag": "v1.2.8",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 9.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "47 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 47
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~9.3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 9.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": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 0,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 0 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 31,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": "Inorganic Growth Policy discounts the stars and forks components by 40%. The finding describes the timing of public star and fork events; it does not establish that attention was purchased, or that the maintainers were involved.",
            "notes": [
              {
                "code": "growth_policy_discount",
                "params": {
                  "pct": 40
                }
              }
            ],
            "value": 34,
            "inputs": {
              "forks": 6,
              "stars": 806,
              "watchers": 3,
              "growth_state": "anomalous",
              "growth_signals": [
                "acquisition_burst",
                "star_concentration",
                "missing_decay"
              ],
              "growth_windows": [
                "2026-06-03/2026-06-04"
              ],
              "growth_peak_days": 2,
              "growth_factor_pct": 60,
              "growth_peak_stars": 617,
              "growth_peak_window": "2026-06-03 → 2026-06-04",
              "growth_peak_multiple": 322,
              "growth_top_days_share": 0.825,
              "growth_baseline_per_day": 1,
              "growth_history_complete": true
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "806 stars, discounted for inorganic growth: 617 stars over 2 day(s) from 2026-06-03 → 2026-06-04, 322× the repository's own daily baseline",
                "points": 28.3,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 806
                    }
                  },
                  {
                    "code": "discounted_for_inorganic_growth",
                    "params": {
                      "days": 2,
                      "stars": 617,
                      "window": "2026-06-03 → 2026-06-04",
                      "multiple": 322
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "6 forks, discounted for inorganic growth: 617 stars over 2 day(s) from 2026-06-03 → 2026-06-04, 322× the repository's own daily baseline",
                "points": 3.5,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 6
                    }
                  },
                  {
                    "code": "discounted_for_inorganic_growth",
                    "params": {
                      "days": 2,
                      "stars": 617,
                      "window": "2026-06-03 → 2026-06-04",
                      "multiple": 322
                    }
                  }
                ],
                "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": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "critical",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "packages": [
                "jackalope"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 0
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "0 downloads/month across npm",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 0,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 52,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 24,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 3,
              "top_contributor_share": 0.974
            },
            "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 97% of commits",
                "points": 0.6,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 97
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "3 contributors",
                "points": 4.1,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "merged_prs": 31,
              "open_issues": 6,
              "closed_issues": 21,
              "issue_closed_ratio": 0.778,
              "closed_unmerged_prs": 3
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "78% of issues closed",
                "points": 36.4,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 78
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "31/34 decided PRs merged",
                "points": 34.9,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 31,
                      "decided": 34
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 1/11 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "followers": 15,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "invergent-ai",
              "public_repos": 20,
              "account_age_days": 306
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "15 followers of invergent-ai",
                "points": 8.7,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 15,
                      "login": "invergent-ai"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "20 public repos, account ~0 yr old",
                "points": 11.3,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 20
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "good",
            "name": "Package maintenance",
            "note": "Excluded from scoring (no data or not applicable): Publish recency. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "publish_recency"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 75,
            "inputs": {
              "packages": [
                "jackalope"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": null
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "0 published versions",
                "points": 4,
                "status": "partial",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 84,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 74,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": true
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "4 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 16,
                "status": "met",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 9.6,
                "status": "met",
                "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": "0 out of 8 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "cuda",
                "deep-learning",
                "fine-tuning",
                "generative-ai",
                "llama",
                "llm",
                "llms",
                "nvidia-gpu",
                "qwen",
                "sft"
              ],
              "has_wiki": true,
              "homepage": "https://surogate.ai",
              "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://surogate.ai",
                "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": "10 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 40,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 4
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "0 out of 8 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 1/11 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "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": "1 existing vulnerabilities detected",
                "points": 6.8,
                "status": "partial",
                "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": 3
            },
            "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": "moderate",
        "name": "AI Readiness",
        "value": 65,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.92,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "92 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 92,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "jackalope/tsconfig.json"
              ],
              "agent_commit_share": 0.61,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 11,
                "status": "met",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "jackalope/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "jackalope/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "61 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 61,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 97,
            "inputs": {
              "primary_language": "C++",
              "largest_source_bytes": 324304,
              "source_files_sampled": 723,
              "oversized_source_files": 34
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "C++ (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "C++"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "34/723 source files over 60KB",
                "points": 52.4,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 723,
                      "oversized": 34
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples",
                "recipes"
              ],
              "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, recipes",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples, recipes"
                    }
                  }
                ],
                "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": [
    "Could not fetch pypi package 'surogate' from its registry",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-21T15:50:26.018639Z",
  "schema_version": "0.23.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/i/invergent-ai/surogate.svg",
  "full_name": "invergent-ai/surogate",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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.23.0 — full methodology · metrics wiki.

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