{"uuid": "e5fdbc3a-c69f-4b0b-9274-756ae2d46960", "vulnerability_lookup_origin": "1a89b78e-f703-45f3-bb86-59eb712668bd", "author": "9f56dd64-161d-43a6-b9c3-555944290a09", "vulnerability": "GHSA-g6x2-hccm-hh4m", "type": "seen", "source": "https://gist.github.com/meanaverage/f30a89fc759ee309268b2a41c31073e4", "content": "# SparkOps Python-to-Go conversion metrics\n\nRepository: [meanaverage/sparkops](https://github.com/meanaverage/sparkops). Scope: PR #330 through #418 inclusive. Snapshot: October 6, 2026 (America/Los_Angeles).\n\n## Summary\n\n**82 pull requests** fall within the range: 78 merged, 2 open, and 2 closed without merging. Numbers #333\u2013#339 are issues, so they have no PR rows.\n\n| Scope | Python added | Python deleted | Python net | Go added | Go deleted | Go net |\n| --- | ---: | ---: | ---: | ---: | ---: | ---: |\n| All 82 PRs | 28,840 | 33,147 | -4,307 | 54,114 | 1,667 | +52,447 |\n| 78 merged PRs | 28,736 | 33,129 | -4,393 | 53,774 | 1,666 | +52,108 |\n\nAcross all listed PR diffs, Python deletions exceed additions by **4,307 lines**, and Go additions exceed deletions by **52,447 lines**.\n\n## Methodology\n\n- The inclusive cutoff, PR #330, establishes the staged native-language conversion program in ADR 0047. All per-PR counts match the established SparkOps Migration Metrics table and were independently checked against GitHub.\n- Retrieve all PRs in the inclusive numeric range, regardless of state, then retrieve every page of each PR\u2019s files endpoint: `GET /repos/meanaverage/sparkops/pulls/{number}/files?per_page=100&amp;page={page}`.\n- Sum GitHub\u2019s per-file `additions` and `deletions` for filenames ending exactly in `.py` and `.go`. Include production code, tests, tools, and support files without directory exclusions. Classify renamed files by the filename returned by GitHub.\n- Additions and deletions are positive counts. Net = additions \u2212 deletions. Zero means the PR has no counted changes for that language.\n- Totals are sums of PR diff counts. They include tests, rewrites, and unrelated changes, and may count lines modified across multiple PRs more than once. They measure change volume during the conversion work; they do not establish a one-to-one conversion ratio or the repository\u2019s final line count. Open and closed-unmerged PRs do not represent landed changes.\n- Each PR number links to its GitHub source. The companion CSV contains the same 82 rows, unformatted integers, status, net columns, and source URLs. Summary totals appear here rather than as an extra CSV data row.\n\n## Full per-PR table\n\n| PR | Title | Status | .py added | .py deleted | .py net | .go added | .go deleted | .go net |\n| --- | --- | --- | ---: | ---: | ---: | ---: | ---: | ---: |\n| [#330](https://github.com/meanaverage/sparkops/pull/330) | ADR 0047: Go daemons, Rust privileged broker, Python product plane (native stage 0) | merged | 18 | 0 | +18 | 0 | 0 | 0 |\n| [#331](https://github.com/meanaverage/sparkops/pull/331) | rc.35 rollout follow-ups: model+recipe naming, fleet upgrade --all with on-demand workers | open | 77 | 6 | +71 | 0 | 0 | 0 |\n| [#332](https://github.com/meanaverage/sparkops/pull/332) | Golden vectors and a shared contract-bytes module for the inference routing table (native stage 1, tracer) | merged | 676 | 3 | +673 | 0 | 0 | 0 |\n| [#340](https://github.com/meanaverage/sparkops/pull/340) | Node agent contract vectors and shared readers, part 1 (native stage 1) | merged | 928 | 134 | +794 | 0 | 0 | 0 |\n| [#341](https://github.com/meanaverage/sparkops/pull/341) | SPIRE helper contract vectors and shared DSSE encoding, node agent part 2 (native stage 1) | merged | 764 | 163 | +601 | 0 | 0 | 0 |\n| [#342](https://github.com/meanaverage/sparkops/pull/342) | Privileged broker modules onto the shared contract-bytes module, node agent part 3 (native stage 1) | merged | 190 | 361 | -171 | 0 | 0 | 0 |\n| [#343](https://github.com/meanaverage/sparkops/pull/343) | Cloud connector contract vectors and shared module copy (native stage 1) | merged | 327 | 64 | +263 | 0 | 0 | 0 |\n| [#344](https://github.com/meanaverage/sparkops/pull/344) | Runner supervisor contract vectors and shared module copy (native stage 1) | merged | 213 | 14 | +199 | 0 | 0 | 0 |\n| [#345](https://github.com/meanaverage/sparkops/pull/345) | Installer contract vectors and shared module copy (native stage 1) | merged | 477 | 121 | +356 | 0 | 0 | 0 |\n| [#346](https://github.com/meanaverage/sparkops/pull/346) | Release tools contract vectors and shared module copy (native stage 1) | merged | 483 | 237 | +246 | 0 | 0 | 0 |\n| [#347](https://github.com/meanaverage/sparkops/pull/347) | Controller backend contract vectors and shared module copy (native stage 1) | merged | 394 | 386 | +8 | 0 | 0 | 0 |\n| [#348](https://github.com/meanaverage/sparkops/pull/348) | Product plane contract vectors and shared module copy (native stage 1) | merged | 471 | 371 | +100 | 0 | 0 | 0 |\n| [#349](https://github.com/meanaverage/sparkops/pull/349) | Stage 1 follow-up: close the registry-to-vector loop, fixed-order writers, dsse_pae bytes | merged | 805 | 157 | +648 | 0 | 0 | 0 |\n| [#350](https://github.com/meanaverage/sparkops/pull/350) | Stage 2: Go foundation \u2014 native module, contract package, Go CI lane | merged | 534 | 90 | +444 | 1,932 | 0 | +1,932 |\n| [#351](https://github.com/meanaverage/sparkops/pull/351) | Lifecycle plan payload through the shared encoder (stage 1 hand-off) | merged | 18 | 3 | +15 | 0 | 0 | 0 |\n| [#352](https://github.com/meanaverage/sparkops/pull/352) | Stage 3: ship the Go inference router in the node work release | merged | 183 | 10 | +173 | 1,894 | 0 | +1,894 |\n| [#353](https://github.com/meanaverage/sparkops/pull/353) | Stage 4: delete the broker v1 request contract and freeze the v2 request vectors | merged | 396 | 5,143 | -4,747 | 0 | 0 | 0 |\n| [#354](https://github.com/meanaverage/sparkops/pull/354) | Stage 3: retire the Python inference server after TP4 cutover | merged | 115 | 916 | -801 | 240 | 321 | -81 |\n| [#355](https://github.com/meanaverage/sparkops/pull/355) | Stage 3: pin UTF-32 decoder refusals | merged | 0 | 0 | 0 | 32 | 6 | +26 |\n| [#356](https://github.com/meanaverage/sparkops/pull/356) | Freeze broker policy, resource and effect-fence contracts | merged | 184 | 83 | +101 | 0 | 0 | 0 |\n| [#357](https://github.com/meanaverage/sparkops/pull/357) | Remove timing and port-reuse races from router retry test | merged | 0 | 0 | 0 | 28 | 3 | +25 |\n| [#358](https://github.com/meanaverage/sparkops/pull/358) | Freeze broker receipt and trust contracts (stage 4, PR 3) | merged | 154 | 0 | +154 | 0 | 0 | 0 |\n| [#359](https://github.com/meanaverage/sparkops/pull/359) | Freeze helper broker documents and close stage 4 | merged | 205 | 0 | +205 | 0 | 0 | 0 |\n| [#360](https://github.com/meanaverage/sparkops/pull/360) | test(agent): freeze state and heartbeat contracts before the Go port | merged | 203 | 23 | +180 | 0 | 0 | 0 |\n| [#361](https://github.com/meanaverage/sparkops/pull/361) | Move release pruning planning to the native installer | merged | 777 | 156 | +621 | 879 | 0 | +879 |\n| [#362](https://github.com/meanaverage/sparkops/pull/362) | Run the fleet node loop in Go with the existing Python actions | merged | 447 | 41 | +406 | 2,866 | 3 | +2,863 |\n| [#363](https://github.com/meanaverage/sparkops/pull/363) | Add dormant Rust broker admission and durable replay tracer | merged | 1,563 | 137 | +1,426 | 0 | 0 | 0 |\n| [#364](https://github.com/meanaverage/sparkops/pull/364) | Verify node phase receipt chains with the native installer | merged | 83 | 83 | 0 | 405 | 8 | +397 |\n| [#365](https://github.com/meanaverage/sparkops/pull/365) | Move verified VM image downloads into the native node agent | merged | 182 | 1,572 | -1,390 | 2,938 | 20 | +2,918 |\n| [#366](https://github.com/meanaverage/sparkops/pull/366) | Fold controller transport into shared Go contracts with an explicit cutover gate | merged | 614 | 65 | +549 | 109 | 104 | +5 |\n| [#367](https://github.com/meanaverage/sparkops/pull/367) | Match fleet diagnostics to canonical bootstrap credential custody | merged | 89 | 1 | +88 | 0 | 0 | 0 |\n| [#368](https://github.com/meanaverage/sparkops/pull/368) | Port path, memory and ping actions into the native node agent | merged | 208 | 385 | -177 | 878 | 32 | +846 |\n| [#369](https://github.com/meanaverage/sparkops/pull/369) | Complete native broker custody and retire the Python core | merged | 391 | 8,673 | -8,282 | 0 | 0 | 0 |\n| [#370](https://github.com/meanaverage/sparkops/pull/370) | Add an isolated zynserver profile for native Rust CI | merged | 664 | 70 | +594 | 0 | 0 | 0 |\n| [#371](https://github.com/meanaverage/sparkops/pull/371) | Move installed node rendering into the native installer | merged | 181 | 208 | -27 | 469 | 1 | +468 |\n| [#372](https://github.com/meanaverage/sparkops/pull/372) | Retire Python node orchestration and port the completed native action tranche | merged | 1,282 | 1,065 | +217 | 3,766 | 72 | +3,694 |\n| [#373](https://github.com/meanaverage/sparkops/pull/373) | Run read-only NFS inspection in the native node agent | merged | 35 | 57 | -22 | 317 | 1 | +316 |\n| [#374](https://github.com/meanaverage/sparkops/pull/374) | Run native Rust gates on the isolated zynserver fleet lane | merged | 929 | 17 | +912 | 0 | 0 | 0 |\n| [#375](https://github.com/meanaverage/sparkops/pull/375) | Accept authenticated FQDN memory observations during fleet attach | merged | 51 | 4 | +47 | 0 | 0 | 0 |\n| [#376](https://github.com/meanaverage/sparkops/pull/376) | Select the native architecture SDK in the Go CI driver | merged | 69 | 13 | +56 | 0 | 0 | 0 |\n| [#377](https://github.com/meanaverage/sparkops/pull/377) | Run read-only credential inspection in the native node agent | closed unmerged | 27 | 12 | +15 | 340 | 1 | +339 |\n| [#378](https://github.com/meanaverage/sparkops/pull/378) | Move runner policy and read-only diagnostics to packaged Go | merged | 600 | 478 | +122 | 2,474 | 0 | +2,474 |\n| [#379](https://github.com/meanaverage/sparkops/pull/379) | Isolate the Rust CI engine from host containerd | merged | 92 | 7 | +85 | 0 | 0 | 0 |\n| [#380](https://github.com/meanaverage/sparkops/pull/380) | Recover supervisor-only runner replacement and Rust image builds | merged | 158 | 7 | +151 | 0 | 0 | 0 |\n| [#381](https://github.com/meanaverage/sparkops/pull/381) | Fix native runner image inventory and containerd snapshot permissions | merged | 102 | 3 | +99 | 0 | 0 | 0 |\n| [#382](https://github.com/meanaverage/sparkops/pull/382) | Fix reenrollment after later runner admission changes | merged | 167 | 21 | +146 | 0 | 0 | 0 |\n| [#383](https://github.com/meanaverage/sparkops/pull/383) | Port installer rendering and diagnostic verification to native consumers | merged | 885 | 567 | +318 | 1,493 | 4 | +1,489 |\n| [#384](https://github.com/meanaverage/sparkops/pull/384) | fix: recover terminal helper activation across releases | merged | 622 | 23 | +599 | 0 | 0 | 0 |\n| [#385](https://github.com/meanaverage/sparkops/pull/385) | Switch runner services to the native lifecycle supervisor | merged | 368 | 18 | +350 | 3,415 | 146 | +3,269 |\n| [#386](https://github.com/meanaverage/sparkops/pull/386) | Repair native runner cutover, image supply and interrupted-job cleanup | merged | 338 | 12 | +326 | 236 | 2 | +234 |\n| [#387](https://github.com/meanaverage/sparkops/pull/387) | Retire proven Python runner lifecycle and broker clients | merged | 315 | 2,665 | -2,350 | 10 | 3 | +7 |\n| [#388](https://github.com/meanaverage/sparkops/pull/388) | Move remaining runner administration to Go and delete Python launcher | merged | 487 | 1,294 | -807 | 1,939 | 1 | +1,938 |\n| [#389](https://github.com/meanaverage/sparkops/pull/389) | Deny ARM CI containers access to host services | merged | 159 | 2 | +157 | 1,652 | 61 | +1,591 |\n| [#390](https://github.com/meanaverage/sparkops/pull/390) | Fold remaining SPIRE clients into the shared Go contract module | merged | 1,270 | 87 | +1,183 | 1,770 | 494 | +1,276 |\n| [#391](https://github.com/meanaverage/sparkops/pull/391) | Own video render status and cancel in native dispatch | merged | 67 | 94 | -27 | 1,488 | 2 | +1,486 |\n| [#392](https://github.com/meanaverage/sparkops/pull/392) | Stage 6: native heartbeat host metrics; delete the Python collector | merged | 87 | 377 | -290 | 3,032 | 13 | +3,019 |\n| [#393](https://github.com/meanaverage/sparkops/pull/393) | Render a rollback with the retained target's sealed native installer | merged | 19 | 1 | +18 | 0 | 0 | 0 |\n| [#394](https://github.com/meanaverage/sparkops/pull/394) | Show each CI runner's state in plain words and offer only the control that changes it | merged | 52 | 0 | +52 | 0 | 0 | 0 |\n| [#395](https://github.com/meanaverage/sparkops/pull/395) | Stage 6: native telemetry burst start/stop and sampler; delete the Python | merged | 85 | 1,185 | -1,100 | 1,733 | 38 | +1,695 |\n| [#396](https://github.com/meanaverage/sparkops/pull/396) | Stage 6: native provider selection; delete the Python selection operations | merged | 78 | 25 | +53 | 820 | 46 | +774 |\n| [#397](https://github.com/meanaverage/sparkops/pull/397) | Stage 6: native broker shadow observation; delete the Python shadow operation | merged | 62 | 34 | +28 | 490 | 2 | +488 |\n| [#398](https://github.com/meanaverage/sparkops/pull/398) | Stage 6: native heartbeat tail (probe-finalize), Python deleted | merged | 191 | 608 | -417 | 2,037 | 75 | +1,962 |\n| [#399](https://github.com/meanaverage/sparkops/pull/399) | Stage 6: native model runtime discovery, Python probe deleted | merged | 206 | 830 | -624 | 2,221 | 23 | +2,198 |\n| [#400](https://github.com/meanaverage/sparkops/pull/400) | Frontend: source-map-js 1.2.2 (GHSA-68fv-2mgg-jv7q) | merged | 0 | 0 | 0 | 0 | 0 | 0 |\n| [#401](https://github.com/meanaverage/sparkops/pull/401) | Bump werkzeug from 3.1.8 to 3.1.9 in /deploy/github-actions-runner | closed unmerged | 0 | 0 | 0 | 0 | 0 | 0 |\n| [#402](https://github.com/meanaverage/sparkops/pull/402) | Bump anchore/sbom-action from 0.24.2 to 0.24.3 | open | 0 | 0 | 0 | 0 | 0 | 0 |\n| [#403](https://github.com/meanaverage/sparkops/pull/403) | Stage 7: native installer node identity owner | merged | 689 | 446 | +243 | 2,250 | 2 | +2,248 |\n| [#404](https://github.com/meanaverage/sparkops/pull/404) | Pin Werkzeug 3.1.9 (GHSA-g6x2-hccm-hh4m) | merged | 0 | 0 | 0 | 0 | 0 | 0 |\n| [#405](https://github.com/meanaverage/sparkops/pull/405) | Retire the standalone controller release installer | merged | 17 | 193 | -176 | 0 | 0 | 0 |\n| [#406](https://github.com/meanaverage/sparkops/pull/406) | Stage 7: native controller identity store | merged | 654 | 1,650 | -996 | 2,785 | 3 | +2,782 |\n| [#407](https://github.com/meanaverage/sparkops/pull/407) | Hold the node installation lock for native identity changes | merged | 48 | 2 | +46 | 78 | 24 | +54 |\n| [#408](https://github.com/meanaverage/sparkops/pull/408) | Move the node phase frame codec to the native installer (Stage 7 row 1) | merged | 936 | 327 | +609 | 996 | 95 | +901 |\n| [#409](https://github.com/meanaverage/sparkops/pull/409) | Move the operator configuration reader to the native installer (Stage 7 row 2a) | merged | 433 | 226 | +207 | 1,363 | 8 | +1,355 |\n| [#410](https://github.com/meanaverage/sparkops/pull/410) | Move the node trust context and admission checks to the native installer | merged | 768 | 113 | +655 | 905 | 43 | +862 |\n| [#411](https://github.com/meanaverage/sparkops/pull/411) | Reconcile stale documentation with the current system (weekly Markdown check 2026-10-06) | merged | 0 | 0 | 0 | 0 | 0 | 0 |\n| [#412](https://github.com/meanaverage/sparkops/pull/412) | Refresh architecture maps for native components, SPIRE transfer and in-place upgrade | merged | 0 | 0 | 0 | 0 | 0 | 0 |\n| [#413](https://github.com/meanaverage/sparkops/pull/413) | Move the attachment journal's checks into the native installer (Stage 7 row 5a) | merged | 522 | 455 | +67 | 883 | 2 | +881 |\n| [#414](https://github.com/meanaverage/sparkops/pull/414) | Keep the documentation to what is current | merged | 13 | 3 | +10 | 0 | 0 | 0 |\n| [#415](https://github.com/meanaverage/sparkops/pull/415) | Balance Python shards by measured time and skip unaffected jobs for frontend-only changes | merged | 333 | 43 | +290 | 0 | 0 | 0 |\n| [#416](https://github.com/meanaverage/sparkops/pull/416) | Move the fleet capability profile checks into the native installer | merged | 1,178 | 81 | +1,097 | 716 | 2 | +714 |\n| [#417](https://github.com/meanaverage/sparkops/pull/417) | Move the fleet capability declaration chain checks into the native installer | merged | 585 | 131 | +454 | 1,057 | 5 | +1,052 |\n| [#418](https://github.com/meanaverage/sparkops/pull/418) | Run the controller upgrade validators natively (Stage 7 row 5c) | merged | 847 | 295 | +552 | 1,178 | 1 | +1,177 |\n| **Total** | **82 PRs** | | **28,840** | **33,147** | **-4,307** | **54,114** | **1,667** | **+52,447** |\n\n\npr,title,status,py_additions,py_deletions,py_net,go_additions,go_deletions,go_net,pr_url\n330,\"ADR 0047: Go daemons, Rust privileged broker, Python product plane (native stage 0)\",merged,18,0,18,0,0,0,https://github.com/meanaverage/sparkops/pull/330\n331,\"rc.35 rollout follow-ups: model+recipe naming, fleet upgrade --all with on-demand workers\",open,77,6,71,0,0,0,https://github.com/meanaverage/sparkops/pull/331\n332,\"Golden vectors and a shared contract-bytes module for the inference routing table (native stage 1, tracer)\",merged,676,3,673,0,0,0,https://github.com/meanaverage/sparkops/pull/332\n340,\"Node agent contract vectors and shared readers, part 1 (native stage 1)\",merged,928,134,794,0,0,0,https://github.com/meanaverage/sparkops/pull/340\n341,\"SPIRE helper contract vectors and shared DSSE encoding, node agent part 2 (native stage 1)\",merged,764,163,601,0,0,0,https://github.com/meanaverage/sparkops/pull/341\n342,\"Privileged broker modules onto the shared contract-bytes module, node agent part 3 (native stage 1)\",merged,190,361,-171,0,0,0,https://github.com/meanaverage/sparkops/pull/342\n343,Cloud connector contract vectors and shared module copy (native stage 1),merged,327,64,263,0,0,0,https://github.com/meanaverage/sparkops/pull/343\n344,Runner supervisor contract vectors and shared module copy (native stage 1),merged,213,14,199,0,0,0,https://github.com/meanaverage/sparkops/pull/344\n345,Installer contract vectors and shared module copy (native stage 1),merged,477,121,356,0,0,0,https://github.com/meanaverage/sparkops/pull/345\n346,Release tools contract vectors and shared module copy (native stage 1),merged,483,237,246,0,0,0,https://github.com/meanaverage/sparkops/pull/346\n347,Controller backend contract vectors and shared module copy (native stage 1),merged,394,386,8,0,0,0,https://github.com/meanaverage/sparkops/pull/347\n348,Product plane contract vectors and shared module copy (native stage 1),merged,471,371,100,0,0,0,https://github.com/meanaverage/sparkops/pull/348\n349,\"Stage 1 follow-up: close the registry-to-vector loop, fixed-order writers, dsse_pae bytes\",merged,805,157,648,0,0,0,https://github.com/meanaverage/sparkops/pull/349\n350,\"Stage 2: Go foundation \u2014 native module, contract package, Go CI lane\",merged,534,90,444,1932,0,1932,https://github.com/meanaverage/sparkops/pull/350\n351,Lifecycle plan payload through the shared encoder (stage 1 hand-off),merged,18,3,15,0,0,0,https://github.com/meanaverage/sparkops/pull/351\n352,Stage 3: ship the Go inference router in the node work release,merged,183,10,173,1894,0,1894,https://github.com/meanaverage/sparkops/pull/352\n353,Stage 4: delete the broker v1 request contract and freeze the v2 request vectors,merged,396,5143,-4747,0,0,0,https://github.com/meanaverage/sparkops/pull/353\n354,Stage 3: retire the Python inference server after TP4 cutover,merged,115,916,-801,240,321,-81,https://github.com/meanaverage/sparkops/pull/354\n355,Stage 3: pin UTF-32 decoder refusals,merged,0,0,0,32,6,26,https://github.com/meanaverage/sparkops/pull/355\n356,\"Freeze broker policy, resource and effect-fence contracts\",merged,184,83,101,0,0,0,https://github.com/meanaverage/sparkops/pull/356\n357,Remove timing and port-reuse races from router retry test,merged,0,0,0,28,3,25,https://github.com/meanaverage/sparkops/pull/357\n358,\"Freeze broker receipt and trust contracts (stage 4, PR 3)\",merged,154,0,154,0,0,0,https://github.com/meanaverage/sparkops/pull/358\n359,Freeze helper broker documents and close stage 4,merged,205,0,205,0,0,0,https://github.com/meanaverage/sparkops/pull/359\n360,test(agent): freeze state and heartbeat contracts before the Go port,merged,203,23,180,0,0,0,https://github.com/meanaverage/sparkops/pull/360\n361,Move release pruning planning to the native installer,merged,777,156,621,879,0,879,https://github.com/meanaverage/sparkops/pull/361\n362,Run the fleet node loop in Go with the existing Python actions,merged,447,41,406,2866,3,2863,https://github.com/meanaverage/sparkops/pull/362\n363,Add dormant Rust broker admission and durable replay tracer,merged,1563,137,1426,0,0,0,https://github.com/meanaverage/sparkops/pull/363\n364,Verify node phase receipt chains with the native installer,merged,83,83,0,405,8,397,https://github.com/meanaverage/sparkops/pull/364\n365,Move verified VM image downloads into the native node agent,merged,182,1572,-1390,2938,20,2918,https://github.com/meanaverage/sparkops/pull/365\n366,Fold controller transport into shared Go contracts with an explicit cutover gate,merged,614,65,549,109,104,5,https://github.com/meanaverage/sparkops/pull/366\n367,Match fleet diagnostics to canonical bootstrap credential custody,merged,89,1,88,0,0,0,https://github.com/meanaverage/sparkops/pull/367\n368,\"Port path, memory and ping actions into the native node agent\",merged,208,385,-177,878,32,846,https://github.com/meanaverage/sparkops/pull/368\n369,Complete native broker custody and retire the Python core,merged,391,8673,-8282,0,0,0,https://github.com/meanaverage/sparkops/pull/369\n370,Add an isolated zynserver profile for native Rust CI,merged,664,70,594,0,0,0,https://github.com/meanaverage/sparkops/pull/370\n371,Move installed node rendering into the native installer,merged,181,208,-27,469,1,468,https://github.com/meanaverage/sparkops/pull/371\n372,Retire Python node orchestration and port the completed native action tranche,merged,1282,1065,217,3766,72,3694,https://github.com/meanaverage/sparkops/pull/372\n373,Run read-only NFS inspection in the native node agent,merged,35,57,-22,317,1,316,https://github.com/meanaverage/sparkops/pull/373\n374,Run native Rust gates on the isolated zynserver fleet lane,merged,929,17,912,0,0,0,https://github.com/meanaverage/sparkops/pull/374\n375,Accept authenticated FQDN memory observations during fleet attach,merged,51,4,47,0,0,0,https://github.com/meanaverage/sparkops/pull/375\n376,Select the native architecture SDK in the Go CI driver,merged,69,13,56,0,0,0,https://github.com/meanaverage/sparkops/pull/376\n377,Run read-only credential inspection in the native node agent,closed_unmerged,27,12,15,340,1,339,https://github.com/meanaverage/sparkops/pull/377\n378,Move runner policy and read-only diagnostics to packaged Go,merged,600,478,122,2474,0,2474,https://github.com/meanaverage/sparkops/pull/378\n379,Isolate the Rust CI engine from host containerd,merged,92,7,85,0,0,0,https://github.com/meanaverage/sparkops/pull/379\n380,Recover supervisor-only runner replacement and Rust image builds,merged,158,7,151,0,0,0,https://github.com/meanaverage/sparkops/pull/380\n381,Fix native runner image inventory and containerd snapshot permissions,merged,102,3,99,0,0,0,https://github.com/meanaverage/sparkops/pull/381\n382,Fix reenrollment after later runner admission changes,merged,167,21,146,0,0,0,https://github.com/meanaverage/sparkops/pull/382\n383,Port installer rendering and diagnostic verification to native consumers,merged,885,567,318,1493,4,1489,https://github.com/meanaverage/sparkops/pull/383\n384,fix: recover terminal helper activation across releases,merged,622,23,599,0,0,0,https://github.com/meanaverage/sparkops/pull/384\n385,Switch runner services to the native lifecycle supervisor,merged,368,18,350,3415,146,3269,https://github.com/meanaverage/sparkops/pull/385\n386,\"Repair native runner cutover, image supply and interrupted-job cleanup\",merged,338,12,326,236,2,234,https://github.com/meanaverage/sparkops/pull/386\n387,Retire proven Python runner lifecycle and broker clients,merged,315,2665,-2350,10,3,7,https://github.com/meanaverage/sparkops/pull/387\n388,Move remaining runner administration to Go and delete Python launcher,merged,487,1294,-807,1939,1,1938,https://github.com/meanaverage/sparkops/pull/388\n389,Deny ARM CI containers access to host services,merged,159,2,157,1652,61,1591,https://github.com/meanaverage/sparkops/pull/389\n390,Fold remaining SPIRE clients into the shared Go contract module,merged,1270,87,1183,1770,494,1276,https://github.com/meanaverage/sparkops/pull/390\n391,Own video render status and cancel in native dispatch,merged,67,94,-27,1488,2,1486,https://github.com/meanaverage/sparkops/pull/391\n392,Stage 6: native heartbeat host metrics; delete the Python collector,merged,87,377,-290,3032,13,3019,https://github.com/meanaverage/sparkops/pull/392\n393,Render a rollback with the retained target's sealed native installer,merged,19,1,18,0,0,0,https://github.com/meanaverage/sparkops/pull/393\n394,Show each CI runner's state in plain words and offer only the control that changes it,merged,52,0,52,0,0,0,https://github.com/meanaverage/sparkops/pull/394\n395,Stage 6: native telemetry burst start/stop and sampler; delete the Python,merged,85,1185,-1100,1733,38,1695,https://github.com/meanaverage/sparkops/pull/395\n396,Stage 6: native provider selection; delete the Python selection operations,merged,78,25,53,820,46,774,https://github.com/meanaverage/sparkops/pull/396\n397,Stage 6: native broker shadow observation; delete the Python shadow operation,merged,62,34,28,490,2,488,https://github.com/meanaverage/sparkops/pull/397\n398,\"Stage 6: native heartbeat tail (probe-finalize), Python deleted\",merged,191,608,-417,2037,75,1962,https://github.com/meanaverage/sparkops/pull/398\n399,\"Stage 6: native model runtime discovery, Python probe deleted\",merged,206,830,-624,2221,23,2198,https://github.com/meanaverage/sparkops/pull/399\n400,Frontend: source-map-js 1.2.2 (GHSA-68fv-2mgg-jv7q),merged,0,0,0,0,0,0,https://github.com/meanaverage/sparkops/pull/400\n401,Bump werkzeug from 3.1.8 to 3.1.9 in /deploy/github-actions-runner,closed_unmerged,0,0,0,0,0,0,https://github.com/meanaverage/sparkops/pull/401\n402,Bump anchore/sbom-action from 0.24.2 to 0.24.3,open,0,0,0,0,0,0,https://github.com/meanaverage/sparkops/pull/402\n403,Stage 7: native installer node identity owner,merged,689,446,243,2250,2,2248,https://github.com/meanaverage/sparkops/pull/403\n404,Pin Werkzeug 3.1.9 (GHSA-g6x2-hccm-hh4m),merged,0,0,0,0,0,0,https://github.com/meanaverage/sparkops/pull/404\n405,Retire the standalone controller release installer,merged,17,193,-176,0,0,0,https://github.com/meanaverage/sparkops/pull/405\n406,Stage 7: native controller identity store,merged,654,1650,-996,2785,3,2782,https://github.com/meanaverage/sparkops/pull/406\n407,Hold the node installation lock for native identity changes,merged,48,2,46,78,24,54,https://github.com/meanaverage/sparkops/pull/407\n408,Move the node phase frame codec to the native installer (Stage 7 row 1),merged,936,327,609,996,95,901,https://github.com/meanaverage/sparkops/pull/408\n409,Move the operator configuration reader to the native installer (Stage 7 row 2a),merged,433,226,207,1363,8,1355,https://github.com/meanaverage/sparkops/pull/409\n410,Move the node trust context and admission checks to the native installer,merged,768,113,655,905,43,862,https://github.com/meanaverage/sparkops/pull/410\n411,Reconcile stale documentation with the current system (weekly Markdown check 2026-10-06),merged,0,0,0,0,0,0,https://github.com/meanaverage/sparkops/pull/411\n412,\"Refresh architecture maps for native components, SPIRE transfer and in-place upgrade\",merged,0,0,0,0,0,0,https://github.com/meanaverage/sparkops/pull/412\n413,Move the attachment journal's checks into the native installer (Stage 7 row 5a),merged,522,455,67,883,2,881,https://github.com/meanaverage/sparkops/pull/413\n414,Keep the documentation to what is current,merged,13,3,10,0,0,0,https://github.com/meanaverage/sparkops/pull/414\n415,Balance Python shards by measured time and skip unaffected jobs for frontend-only changes,merged,333,43,290,0,0,0,https://github.com/meanaverage/sparkops/pull/415\n416,Move the fleet capability profile checks into the native installer,merged,1178,81,1097,716,2,714,https://github.com/meanaverage/sparkops/pull/416\n417,Move the fleet capability declaration chain checks into the native installer,merged,585,131,454,1057,5,1052,https://github.com/meanaverage/sparkops/pull/417\n418,Run the controller upgrade validators natively (Stage 7 row 5c),merged,847,295,552,1178,1,1177,https://github.com/meanaverage/sparkops/pull/418\n", "creation_timestamp": "2026-10-07T06:08:43.000000Z"}