JSON-Rohbericht maschinenlesbar
{
"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"
}